轉載前請注明出處,謝謝!
(原創):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分區即可。
