• (原创)cubieboard 全志A10 Cortex-A8开发板TF卡启动简析


    转载前请注明出处,谢谢!

    (原创):http://www.cnblogs.com/yinsua/p/3193786.html

    首先有必要看一下一下几个网站的内容,对下面的内容的理解有很大帮助。

    blog.chinaunix.net/uid-25120309-id-3501821.html

    https://github.com/linux-sunxi/u-boot-sunxi/wiki

    cn.cubieboard.org/forum.php?mod=viewthread&tid=52&extra=page%3D5%26orderby%3Dlastpost

    blog.csdn.net/sara4321/article/details/8844715

    linux-sunxi.org/Bootable_SD_card

    我的环境与配置:

    1.PC --WIN7家庭旗舰版

    2.虚拟机--ubuntu11.04

    3.全志A10cubieboard开发板(原装TTL串口线)

    4.TF卡--金士顿--2G

    5.SecureCRT

    重要字体皆用粗体表示。

      一:准备工作

        1.将开发板上电,插入你的TF卡,显示如下信息:

        图中的p1,p2是两个主分区,这是后面要做的,可以不用理会,这时查看/dev目录下是否有mmcblk0(使用命令:ls /dev/mmcblk0),如果存在,则表示你的TF卡能够被系统识别,如果没有,你可以洗洗睡了。

        然后应该先执行:dd if=/dev/zero of=/dev/mmcblk0 bs=1M count=1

        这个命令是用来腾出1M的空间来放置bootloader和uboot的。

        接下来对TF卡进行分区:执行:sfdisk --in-order -uM /dev/mmcblk0

        之后会出现:

      大概是这个画面就OK了,不必理会那些参数。但是那个OK是一定要有的,如果出现失败或者其他信息的话你就断电重启插卡试试。

      接着输入如下内容:

      你需要输入的顺序是:

      1,16,c

      ,,L

       然后是两个回车,看到ynq就输入y就OK了。

      这里的1,16,c表示的是从这第一个主分区(mmcblk0p1)的第1-16M之间的文件系统类型为FAT32,这个c是FAT32的类型代码。而下面一行的就表示默认了两个值的大小和这么大(这个主分区1-16M后面的空间)的剩余空间的文件系统类型为LINUX。接着的两个回车则代表不分第三、第四主分区。输入y则代表你确认这样的操作,然后系统就这样按照你的安排分区。这样就会看到图中那样的信息了。

      输入: fdisk -l /dev/mmcblk0

     

      现在应该对你的两个主分区p1、p2进行格式化了,把第一第二分区分别格式化成vfat和ext4的类型,可是遇到了一个问题,这块开发板的原装系统里面没有mkfs.vfat这条命令!该怎么办呢,这时应该把它放到虚拟机上面格式化。SO,拔卡吧。。

      用读卡器或者SD卡套把TF卡插到电脑上面后,虚拟机会自动挂载,如果没有挂载你就在VM菜单栏选择:

      

      反正就是找到你的卡的那一项,然后点击connect就OK了。如果你的虚拟机识别不了,可能是你的虚拟机USB服务没有启动,那么如何启动呢:

       好,现在你的TF卡自动挂载到了你的虚拟机上,接下来你应该把它卸载,使用umount。

      然后就是在/dev目录下找到你的卡的对应文件了,我的是sdc,通常的话是sdb但是因为我挂载了一个虚拟的磁盘所以sdb被提前分配给了我的虚拟磁盘了。好了,你会发现你的sdc(下面我都以sdc概述)是这样的,你有sdc sdc1 sdc2,这很正常,因为你的TF卡有两个分区,OK,我不在赘述。接下来格式化他们,sdc1格成vfat,sdc2格成ext4。

      二:源码编译:

      1.  uboot

        网址: https://github.com/linux-sunxi/u-boot-sunxi.git

        解压,进入。

        执行: make distclean CROSS_COMPILE=arm-linux-gnueabihf-

           make cubieboard CROSS_COMPILE=arm-linux-gnueabihf-

        这里的交叉编译器你用什么版本的都行,只要你编译这一套东西都只用相同的编译器就行了。

        接着执行:dd if=spl/sunxi-spl.bin of=/dev/sdc bs=1024 seek=8

              dd if=u-boot.bin of=/dev/sdc bs=1024 seek=32

        这是将这两个文件以块的方式写入sdc。

       2.  内核uImage

        网址:github.com/linux-sunxi/linux-sunxi.git

        解压,进入,执行:  make ARCH=arm mrproper    

                 make ARCH=arm sun4i_defconfig

                 make ARCH=arm menuconfig

                 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImage

                 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules

                 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules_install

       3.  script.bin

        网址:https://github.com/linux-sunxi/sunxi-tools

        解压,进入,执行: make

        如果出现了找不到libusb库等类似的错误,就下载一个库并安装就可以了。

        ubuntu下安装:libusb-1.0.0-dev 或类似的库即可

        这个tools是用来生成一个可以将*.fex文件格式转换成.bin格式的文件。

        将此目录下的fex2bin放置到/bin下并给予权限777

        cp fex2bin /bin;chmod 777 /bin/fex2bin

        然后进入:https://github.com/linux-sunxi/sunxi-boards.git 下载。

        使用刚刚得到的工具fex2bin: fex2bin cubieboard.fex script.bin 

       4.建立引导:

        建立两个目录,例如/mnt/1和 /mnt/2,然后将两个分区分别挂载上去。将script.bin和uImage放到/mnt/1下面。进入/mnt/1/,建立并编辑boot.cmd,写入如下内容:

        setenv bootargs console=ttyS0,115200 noinitrd init=/init root=/dev/mmcblk0p2 rootfstype=ext4 rootwait panic=10 ${extra}
           fatload mmc 0 0x43000000 boot/script.bin
           fatload mmc 0 0x48000000 boot/uImage
           bootm 0x48000000

        接着执行:mkimage -C none -A arm -T script -d boot.cmd boot.scr

        如果没有mkimage这个命令的话在网上找包然后安装即可。

        把生成的boot.scr放到/mnt/1/下面。

        建立并编辑uEnv.txt,内容如下:

        bootenv=boot.scr
            loaduimage=fatload mmc ${mmcdev} ${loadaddr} ${bootenv}
            mmcboot=echo Running boot.scr script from mmc ...; source ${loadaddr}

        把uEnv.txt也放到/mnt/1/下面。

      5.  文件系统

        使用busybox制作一个即可,然后在/mnt/2/下面建立你需要的目录,把你用busybox建立的bin和sbin放到/mnt/2/下面即可。

        当然,你也可以使用这样一个脚本来建立你的目录(在/mnt/2下面执行):mkrootfsdir.sh

    #------------------------------------------------------------
    #!/bin/sh
    echo ">>>>>> Create rootfs directons <<<<<<"
    mkdir /home/xt/rootfs
    cd /home/xt/rootfs
    echo "--------- Create root,dev ......"
    mkdir bin dev etc lib mnt opt proc sbin srv sys tmp usr var workspace
    mkdir usr/sbin usr/bin usr/lib usr/modules
    mkdir etc/sysconfig etc/init.d etc/network
    mkdir etc/network/if-down.d etc/network/if-post-down.d etc/network/if-pre-up.d etc/network/if-up.d
    mkdir lib/modules
    chmod 1777 tmp
    cd ..
    echo "------- make direction done ---------"
    #------------------------------------------------------------

      至此,你就可以卸载/mnt/1和/mnt/2并将你的TF卡插入开发板然后重启了(开发板是如果有TF则自动从TF卡寻找相应信息启动)

     2014-02-28 16:06:45 

     更新:

    1.下载uboot及相关工具源码与说明:

    uboot: https://github.com/linux-sunxi/u-boot-sunxi.git

    tools : https://github.com/linux-sunxi/sunxi-tools

    step : https://github.com/linux-sunxi/u-boot-sunxi/wiki

    2.将上述两个文件解压到任意目录,本文使用的是arm-none-linux-gnueabi 4.5.1 ,配置COMPILE_CROSS环境变量

    (例如:export COMPILE_CROSS=/usr/local/arm/4.5.1/bin/arm-none-linux-gnueabi-)。

    3.进入uboot目录,执行make distclean&&make cubieboard

     

    4.进入tools目录,执行make clean&&make

     

    5.此处的tools主要是用来编译生成fex2bin这个工具的,也就是把fex转换成bin文件的工具,然后把它加到全局PATH中: export PATH=${PATH}:<your tools path>  例如我在我的虚拟机下执行:export PATH=${PATH}:/home/ysh/Desktop/sunxi-tools-master/

    6.下载cubieboard.fex : https://github.com/linux-sunxi/sunxi-boards.git  解压并进入,执行:

    fex2bin cubieboard.fex script.bin 得到二进制文件script.bin

     

    7.进入uboot目录,执行:dd   if=/dev/zero  of=/dev/sdb   bs=1M   count=1 SD卡前1M空间清零。

     

    分区时第一个分区是从2048开始的,也就是从第2048sectors开始的,而一个sectors512个字节,所以2048sectors就是1M

    8.进入uboot目录执行

    dd if=spl/sunxi-spl.bin of=/dev/sdX bs=1024 seek=8

    dd if=u-boot.img of=/dev/sdX bs=1024 seek=40

    !如果你的uboot源码版本是2013.07之前的则执行:

    dd if=spl/sunxi-spl.bin of=/dev/sdX bs=1024 seek=8

    dd if=u-boot.bin of=/dev/sdX bs=1024 seek=32

    9.执行完成后将SD卡拔出并插入cubieboard并上电,串口输出:

     

    10.对SD卡进行分区:

     

    注:此处使用的是4G的SD卡,每个cylinders(磁柱)所包含7564个sector(扇区),每个扇区大小是512bytes,因此从第2个磁柱开始,也就是从3872768bytes(约为3.8M)开始。因此此分区的大小应该是(16-2)*3.8M=53.2M。剩余的空间分配给文件系统。SD卡开始的3.8M空白未分区的地址则给SPL、UBOOT等。

    11.对分区进行格式化:mkfs.vfat -n boot /dev/sdX1 ; mkfs.ext4 -L rootfs /dev/sdX2   (注:此处的X为简化,按具体情况而定)

    12.新建文件uEnv.txt : 

    baudrate=115200
    scriptaddr=0x44000000
    bootscr=boot.scr
    bootenv=uEnv.txt
    loadbootscr=fatload mmc 0 ${scriptaddr} ${bootscr} || ext2load mmc 0 ${scriptaddr} ${bootscr} || ext2load mmc 0 ${scriptaddr} boot/${bootscr}
    
    loadbootenv=fatload mmc 0 ${scriptaddr} ${bootenv} || ext2load mmc 0 ${scriptaddr} ${bootenv} || ext2load mmc 0 ${scriptaddr} boot/${bootenv}
    
    boot_mmc=fatload mmc 0 0x43000000 script.bin && fatload mmc 0 0x48000000 ${kernel} && watchdog 0 && bootm 0x48000000
    
    bootcmd=if run loadbootenv; then 
                    echo Loaded environment from ${bootenv}; 
                    env import -t ${scriptaddr} ${filesize}; 
            fi; 
            if test -n ${uenvcmd}; then 
                    echo Running uenvcmd ...; 
                    run uenvcmd; 
            fi; 
            if run loadbootscr; then 
                    echo Jumping to ${bootscr}; 
                    source ${scriptaddr}; 
            fi; 
            run setargs boot_mmc;"
    bootdelay=3                                                                           
    console=ttyS0,115200                                                                  
    kernel=uImage                                                                         
    loglevel=8                                                                            
    panicarg=panic=10                                                                     
    root=/dev/mmcblk0p2
    setargs=setenv bootargs console=${console} root=${root} loglevel=${loglevel} ${panicarg} ${extraargs}
    stderr=serial                                                                         
    stdin=serial                                                                          
    stdout=serial

    13.将SD卡的FAT分区挂载并将内核、uEnv.txtscript.bin放入挂载目录下

    14.将文件系统放入EXT4分区即可。

     

     

     

  • 相关阅读:
    ubuntu18.04 安装 jdk
    MySQL集群(PXC)入门
    Synchronized 详解
    Java多线程之内存可见性
    MySQL8.0新特性
    vue配置域名访问
    debain8 安装mysql8
    idea 激活步骤
    spring boot 设置tomcat post参数限制
    人脸识别技术全面总结:从传统方法到深度学习[转载自机器之心]
  • 原文地址:https://www.cnblogs.com/yinsua/p/3193786.html
Copyright © 2020-2023  润新知