(原创)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分区即可。

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2013-07-16 17:21  yinsua  阅读(5122)  评论(0编辑  收藏  举报