(原创)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开始的,也就是从第2048个sectors开始的,而一个sectors是512个字节,所以2048个sectors就是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.txt、script.bin放入挂载目录下
14.将文件系统放入EXT4分区即可。