zoukankan      html  css  js  c++  java
  • tiny4412学习(一)之从零搭建linux系统(烧写uboot、内核进emmc+uboot启动内核)【转】

    本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/74080109

     

    目录(?)[+]

     
    • 硬件平台:tiny4412
    • 系统:linux-3.5-20151029
    • 文件系统:busybox-1.22.1.tar.bz2
    • 编译器: arm-linux-gcc-4.5.1

    目的:

    使用uboot引导Linux系统,并挂接根文件系统,搭建起linux开发环境。

     

    由于友善支臂提供的minitools不是开源,使用起来很不舒服。本文将记录从零使用uboot在tiny4412上搭建linux系统的。由于之前只是学了2440,完成这个流程也遇到各种,现在总结如下。其中参考了多篇博客才得以实现,具体涉及的时候会给出链接。

    一、准备系统文件

    1、安装交叉编译工具链

    (1)解压编译器源码

    [cpp] view plain copy
     
     print?
    1. tar arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz –C /   

    (2)执行后将把 arm-linux-gcc 安装到/opt/FriendlyARM/toolschain/4.5.1 目录。

    (3)vi /etc/environment修改PATH为:

    [cpp] view plain copy
     
     print?
    1. PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/FriendlyARM/toolschain/4.5.1/bin"  

    (4)重启内核,执行arm-linux-gcc -v查看版本。

    2、编译内核

    (1)解压

    解压 Linux  内核源代码

    tar xvzf  linux-3.5-20151029.tgz

    cd  linux-3.5

    (2)配置

    cp  tiny4412_linux_defconfig  .config

    (3)编译

    make

    最后在 arch/arm/boot 目录下生成 zImage

    3、制作根文件系统

    本身打算使用光盘自带的文件系统,结果fastboot下载的时候,文件系统始终出问题,于是采用自制文件系统。通过网络进行挂接,后面会有具体操作说明。

     

    参考:http://blog.csdn.NET/morixinguan/article/details/50677105

    编译配置安装busybox

    下载源码:https://busybox.net/

    tar -xvf busybox-1.22.1.tar.bz2

    cd busybox-1.22.1

    makedefconfig     //默认配置

    make menuconfig

    BusyboxSettings  --->  

    [*] Build BusyBoxas a static binary (no shared libs)

    [ ] Build sharedlibbusybox(NEW)                                     
    [*] Build with Large File Support (for accessingfiles > 2 GB)         
    (arm-linux-)  Cross Compilerprefix        

    make -j4

    makeinstall   生成:  _install

    制作文件系统 

    mkdir filesystem
    cd filesystem
    cp ../busybox-1.22.1/_install/*  .-r
    mkdir   etc dev opt sys tmp mnt lib proc
    mkdir  etc/init.d
    vim  etc/init.d/rcS
    添加
    [cpp] view plain copy
     
     print?
    1. mount -t ramfs none  /dev  
    2. mount -t sysfsnone  /sys  
    3. mount -t proc  none  /proc  
    4. mount -t tmpfs none  /tmp  
    5. /sbin/mdev  -s  
    保存退出
    vim  etc/inittab
    添加
    [cpp] view plain copy
     
     print?
    1. ::sysinit:/etc/init.d/rcS  
    2. ttySAC0::askfirst:-/bin/sh  
    保存退出
    vim  etc/profile
    添加
    [cpp] view plain copy
     
     print?
    1. export  PS1="[root @ cjy W ] #"  
    保存退出
    mknod  dev/console  c  5  1
    cp /opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib/* ./lib   -r
    cd ..
    权限:chmod 777 filesystem -R
    发布文件系统
    vim   /etc/exports
    添加
    /work/nfs/filesystem      *(rw,sync,no_root_squash)

    保存退出
    检查文件系统是否已经发布
    showmount -e 192.168.1.123
    现在网络文件系统以及可以共享,后面会给单板接上网线,然后设置uboot参数、单板IP,及nfs等参数。

    4、编译uboot

    光盘自带的uboot,无法直接使用,上电后只会打印OK。但是官方论坛可以下载到1506可以使用的uboot,链接如下:http://www.arm9home.net/read.php?tid-80810.html。也可以使用这篇博客体提供的uboot:http://blog.csdn.Net/lizuobin2/article/details/52825033

    下载后配置,编译即可产生uboot。

    本人使用的uboot下载链接:http://download.csdn.net/detail/fengyuwuzu0519/9886366

    [cpp] view plain copy
     
     print?
    1. tar xzf uboot_tiny4412-20130729.tgz  
    2. cd uboot_tiny4412  
    3. make tiny4412_config  
    4. make  

    编译 用于生成bl2 的工具

    [cpp] view plain copy
     
     print?
    1. cd sd_fuse;  
    2. make  

    假设SD卡已被PC Linux识别为/dev/sdc, 以root用户运行以下命令即可:

    [cpp] view plain copy
     
     print?
    1. cd sd_fuse/tiny4412  
    2. ./sd_fusing.sh  /dev/sdc  

    到此我们准备好了

    (1) 内核

    (2) 文件系统

    (3) Uboot

    接下来就是如何下载,并启动内核,挂接文件系统了。

    二、下载系统文件,并启动内核。

    2.1、下载uboot到emmc

    参考:

    http://www.cnblogs.com/pengdonglin137/articles/4161084.html

    http://www.arm9home.net/read.php?tid-83474.html

    (1)之前我们已经将uboot下载到SD卡,现在从SD卡启动uboot,可以看到如下信息:

    (2)查看设备的分区表信息

    fdisk -p 0

    fdisk -p 1

    设备mmc1的分区信息,即eMMC分析,注意这个是superboot分区信息,我们就用这个分区。

    分区1 是FAE分区, 分区2 是给system的,分区3是user-data, 分区4 是 cache.

    (3)格式化eMMC

    u-boot模式下输入如下指令来格式化eMMC设备。
    #uboot:fdisk -c 1 320 2057 520
    执行后会返回分区信息,继续格式话分区1,2,3,4
    #uboot:fatformat mmc 1:1
    这句话意思是对mmc 1设备的第一分区格式作fat格式化。
    #uboot:ext3format mmc 1:2
    #uboot:ext3format mmc 1:3
    #uboot:ext3format mmc 1:4
    上面三个指令是分别对eMMC的分区2,3,4作ext3格式化。
    到此我们完成了对eMMC的设备的格式化。

    (4)如果提示如下错误:

    Error: No MBR is found at SD/MMC.                                            
    Hint: use fdisk command to make partitions.
    则先执行指令"fdisk -c 0",执行过程如下:
    #fdisk -c 0                                                        
    fdisk is completed

    对emmc初始化后,我们开始使用dnw来下载uboot到emmc中。现在我们就需要装一下linux的dnw工具,注意dnw是下载到内存,把固件数据缓存起来,然后烧录到eMMC中。

    (5)Linux下DNW工具安装:

    主要参考了:

    http://blog.sina.com.cn/s/blog_69dd1a09010196bf.html

    http://blog.csdn.net/u011452544/article/details/39393857

    http://blog.csdn.net/morixinguan/article/details/70478650

    1.首先解压缩文件:
    # tar xvf dnw_for_linux.tar.gz
    另:在Ubuntu下右键解压也很方便

    目录如下:
    dnw_linux/
    dnw_linux/secbulk/
    dnw_linux/secbulk/Makefile
    dnw_linux/secbulk/secbulk.c
    dnw_linux/dnw/
    dnw_linux/dnw/dnw.c
    其中secbulk.c是PC端USB驱动, dnw.c是写入工具

    2 编译并加载secbulk.c内核模块

    $cd secbulk
    $make -C /lib/modules/`uname -r`/build M=`pwd` modules
    编译成功后在当前目录下可以看到secbulk.ko

    3.编译完成后,会生成secbulk.ko文件:
    # ls
    Makefile       Module.symvers  secbulk.ko     secbulk.mod.o
    modules.order  secbulk.c       secbulk.mod.c  secbulk.o

    4.加载模块到Linux内核:
    # sudo insmod ./secbulk.ko        (注意要在root权限下)
    # dmesg        (查看是否加载成功)
    secbulk:secbulk loaded

    usbcore:registered new interface driversecbulk        (看到这样两行就说明成功了)

    开机的时候不会自动加载.ko文件,这样每次都要先加载才可以使用,此时将其加入开机脚本,
    使其得到自动加载,编辑/etc/init.d/rc.local 在最后加上 insmod /所在路径/secbulk.ko。

    5.下面开始编译dnw工具
    # cd ../dnw
    # gcc -o dnw dnw.c

    (编译完成,会看到dnw可执行文件)

    6.将文件copy到/usr/local/bin目录
    # sudo cp dnw /usr/local/bin
    这样就可以在shell下面直接使用dnw命令了

    但是问题出现了,当我使用这个dnw下载bl2.bin的时候,会出现校验错误。但是下载其他文件均没有问题,于是网上各种寻找DNW工具,看安装,最后通过和另一个版本的DNW结合,解决了这个问题,uboot也完整的下载到了emmc中。下载链接:http://download.csdn.net/detail/fengyuwuzu0519/9886362

    (6)DNW下载好了,我们可以把uboot下载到emmc了。

    #uboot:emmc open 1
    提示:eMMC OPEN Success.!!

    上面提示emmc开启成功,注意说明,emmc一旦打开,需要连续烧录,烧录完成后可以关闭emmc

    #uboot:dnw
    提示:OTG cable Connected!

    Now, Waiting forDNW to transmit data(等待DNW下载)

    打开虚拟机,进入uboot所在目录

    cd /work/uboot_tiny4412

    dnw  sd_fuse/tiny4412/E4412_N.bl1.bin

    此时u-boot中断会提示传送校验完成,此时已经把bl1.bin通过USB传送到了memeory的0xc0000000起始地址,大小8KB.

    接下来我们烧录bl1.bin到eMMC中,u-boot下继续输入:
    #uboot:mmc write 1 0xc0000000 0 0x10
    会提示写入信息,说明已经写入成功。这个是把刚才从PC端通过dnw下载下来的bl1.bin固件下载到emmc中,起始0, 16个block, 一个block是512B, 16*512=8*1024=8KB. 这个是bl1.bin的存放位置。
    以此类推,烧录bl2.bin. u-boot.bin, tzsw.bin

    #uboot:dnw

    #虚拟机:dnw sd_fuse/tiny4412/bl2.bin

    #uboot:mmc write 1 0xc0000000 0x10 0x1C

    #uboot:dnw

    #虚拟机:dnw u-boot.bin

    #uboot:mmc write 1 0xc0000000 0x30 0x21D

    #uboot:dnw

    #虚拟机:dnw sd_fuse/tiny4412/E4412_tzsw.bin

    #uboot:mmc write 1 0xc0000000 0x2c0 0xB8

    启动分区到此全部写入完成,注意一定要关闭emmc
    u-boot下继续输入:
    #uboot:emmc close 1
    提示:eMMC CLOSE Success.!!

    现在uboot已经完整的烧入到emmc,我们可以将开关波动到NAND一侧,从emmc启动,发现uboot输出已经变成了:

    2.2、下载内核到emmc

    参考:http://blog.csdn.net/lizuobin2/article/details/52825033

    内核下载我们采用fastboot下载,uboot已经支持了fastboot。

    安装windows下fastboot工具

    如果你已经安装了Android Studio,那么你已经有fastboot工具,在目录

    F:AndroidSDKplatform-tools下有fastboot.exe AdbWinApi.dll

    我也提供一下fastboot下载链接:http://download.csdn.net/detail/fengyuwuzu0519/9886552

    下载我们进入uboot,执行fastboot,并将单板的usb接到PC。提示如下:


    windows下cmd进入fastboot.exe所在目录

    fastboot flashkernel zImage(正常下载)

    fastboot flashramdisk ramdisk-u.img(正常下载)

    fastboot flash fatrootfs_qtopia_qt4.img (下载始终出错,于是放弃光盘的文件系统,使用自制的文件系统)

    fastboot reboot 

    此时,我们已经将uboot、内核下载到单板中。

    参考:http://blog.csdn.net/lizuobin2/article/details/52825033

    2.3、设置uboot启动参数,启动内核,并挂接网络文件系统

    uboot启动参数:
    set gatewayip  192.168.1.1
    set ipaddr     192.168.1.125   //板子的IP
    set serverip   192.168.1.123   //PC机IP

    set bootargs "root=/dev/nfsnfsroot=192.168.1.123:/work/nfs/filesystem ip=192.168.1.125console=ttySAC0,115200 lcd=S70 ctp=2"

    save

    set bootcmd moviread kernel 0 40008000;movi read rootfs 0 41000000 100000;bootm 4000800041000000

    reset  

    内核启动信息:

  • 相关阅读:
    概率-期望粗学
    2*2右脚相反矩阵构造 2019牛客暑期多校训练营(第八场)
    Codeforces Round #530 (Div. 2)F Cookies (树形dp+线段树)
    E. Arson In Berland Forest(思维,找二维阵列中的矩阵,二分)
    Codeforces Round #523 (Div. 2) Cdp
    凸包
    E
    G. Petya and Graph(经典项目与项目消耗问题)(网络流)
    Educational Codeforces Round 55 (Rated for Div. 2)E
    hdu 3501 Calculation 2 (欧拉函数的扩展)
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/7249538.html
Copyright © 2011-2022 走看看