(原創)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分區即可。

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM