ARM開發板燒寫uboot (很多還不懂,收藏着先)


2012-01-14 16:52

s3c6410 ARM開發板燒寫uboot新手入門筆記

s3c6410 ARM開發板燒寫uboot新手入門筆記

ARM開發板是依賴 bootloader啟動的,是1段小程序,等同x86系統的BIOS,作用是檢測硬件並讀取內核到內存
bootloader通常需要開發人員手動燒寫到ARM板上,而BIOS通常固化在某個硬件里;
通常bootloader是不用自己寫的,別人已寫好,最多自己改一下,有時候直接就用了;
嵌入式Linux的bootloader最常用的是U-Boot,版本經常更新;
WinCE的bootloader當然是微軟自己寫的EBoot
向開發板燒寫U-Boot之前,開發板的Nand Flash是空的,沒有操作系統,更沒有文件系統
向沒有文件系統的目標板copy文件的過程也就是"燒寫"
為了解決這個問題,三星公司在硬件上提供了一種燒寫機制,叫dnw,
就是通過USB線把PC機的U-Boot文件上傳到目標板上;dnw是基於libusb標准庫做的
同時燒寫也需要兩端都有軟件支持,一端是u-boot(u-boot里有dnw),另一端是一個專門的dnw小軟件;

燒寫的過程:
①usb線連接pc機和目標板;
②此時目標板是空的,需要設置sd卡啟動,事先制做的sd卡有個uboot,這樣目標板的uboot就起來了
③在PC端通過超級終端等串口軟件操作目標板的uboot,輸入命令 # dnw 50008000
    這句話意思是啟動目標板的usb連接並設置目標板接收USB數據的內存起始地址為0x50008000
④在PC端啟動那個dnw軟件,有windows版也有linux版的,道理相同,都需要libusb庫支持
⑤PC端dnw軟件:與目標板的USB線路連通后,再發送u-boot.bin文件到目標板
    這里發送文件是指發到目標板的內存中,起始地址是0x50008000,注意,這時並沒有寫到目標板的rand flash
⑥在PC端通過超級終端等串口軟件操作目標板的uboot,把目標板內存中的u-boot.bin文件寫到rand flash
⑦把目標板內存數據寫到rand flash也是uboot命令提供的,其實這時也只有uboot能用;
⑧這里目標板的rand flash里已經燒寫好u-boot.bin了,關掉目標板,再設置rand啟動就可以了;

在windows下有個dnw軟件,是超級終端和dnw和合集用起來很方便,

在Linux下分別用到 minicom 和 dnw 這兩個軟件
安裝minicom # rpm -ivh minicom-2.00-12.i386.rpm
進入minicom # minicom
設置minicom ctrl+A O(選擇serial port setup)
 A - /dev/ttyUSB0
 E - 115200 8N1
 F - No
 G - No
 Save setup as dfl (/etc/minirc.dfl) 
 ctrl + a x 退出minicom

dnw,包括usb驅動和寫入工具

安裝secbulk驅動
加載模塊到Linux內核: # insmod ./secbulk.ko (注意要在root權限下)
# dmesg (查看是否加載成功)   
secbulk:secbulk loaded   
usbcore: registered new interface driver secbulk (看到這樣兩行就說明成功了)

感覺不安裝這個驅動也沒有事,usb通常都是免驅動的啊,可能是在開發板上安的;

SD卡啟動

SMDK6410 # dnw 50008000

DNW # ./dnw3 ./u-boot.bin

OTG cable Connected!
Now, wating for DNW to transmit data
Down Done!! Down Address: 0x50008000, Download Filesize:0x30000
Checksum is being calculated.
Checksum O.K.

SMDK6410 # nand erase 0 100000
SMDK6410 # nand write.uboot 50008000 0 100000 //write(.uboot是參數不能改,且只在sd-boot中實現)

nand啟動

// 寫內核
SMDK6410 # dnw 50008000
DNW # ./dnw3 ./zImage
SMDK6410 # nand erase 100000 500000
SMDK6410 # nand write.e 50008000 100000 500000 //write(.e是參數不能改)


// 寫文件系統cramfse,也就是Qtopia2.2.0
SMDK6410 # dnw 50008000
DNW # ./dnw3 ./FORLINX_6410_touch.cramfse
SMDK6410 # nand erase 600000 8000000
SMDK6410 # nand write.e 50008000 600000 8000000


// 寫yaffs文件系統,也就是Qtopia4.4.3
copy文件MY6410_yaffs2_v3.0.tar.gz至SD卡
完全啟動開發板Linux
SMDK6410 # tar zxvf /sdcard/MY6410_yaffs2_v3.0.tar.gz -C /mnt/disk   或
SMDK6410 # tar zxvf /udisk/MY6410_yaffs2_v3.0.tar.gz -C /mnt/disk
重啟進入uboot

SMDK6410 # setenv bootargs root=/dev/mtdblock3 rootfstype=yaffs2 console=ttySAC0,115200
SMDK6410 # saveenvsd
SMDK6410 # reset

//原來的env
SMDK6410 # printenv
bootargs=root=/dev/mtdblock2 rootfstype=cramfs console=ttySAC0,115200
bootcmd=nand read 0xc0008000 0x100000 0x500000;bootm 0xc0008000
bootdelay=1
baudrate=115200
ethaddr=00:40:5c:26:0a:5b
ipaddr=192.168.1.20
serverip=192.168.1.10
gatewayip=192.168.1.1
netmask=255.255.255.0
stdin=serial
stdout=serial
stderr=serial

 

燒寫uboot、內核及文件系統的方法  

2011-04-22 17:10:36|  分類: 嵌入式系統 |  標簽:uboot  文件系統  nand  內核  掛載   |字號 訂閱

 
 

下面總結的是做這個項目使用過的方法,不一定全面,僅供參考。

1、uboot的燒寫

下載Uboot分為兩個步驟,第一步將uboot下載到系統的擴展RAM並運行,第二步通過內存中運行的uboot把整個uboot下載到內存再燒寫到nandflash

第一步下載uboot到擴展RAM

首先使用短路塊選擇系統從內部啟動,復位或者上電就會在串口軟件(115200 8 n 1)看到打印的信息LPC31xx READY FOR PLAIN IMAGE>,此時使用串口軟件的發送文件選擇發送u-boot-init.bin,再發送u-boot.bin,之后就會在RAM中啟動uboot,打印輸出啟動信息,並進行倒計時,此時發送任意字符給系統,停止計時,關閉串口軟件,使用超級終端連接系統。

第二步燒寫ubootnandflash

       在超級終端中輸入loady命令,再使用傳送/發送文件,選擇Ymodem協議,發送u-boot.bin,接收完成后,先擦除nand erase,可以全擦掉(不用給參數),也可以使用使用參數指定區域,一般第一次要全擦,而后使用nand_paramsflash的信息寫入其中,最后使用nand write 0x30001000 0x4000 0x100000

 其中,0x30001000 uboot在內存中的地址;

0x4000 ubootflash中存放的起始地址,需要根據實際的分區情況而定;

0x100000 uboot的大小,不小於實際大小;

至此,將uboot寫入到nandflash中,可以將短路跳線去掉,使其從nandflash啟動。

2、內核的燒寫

uboot啟動倒計時,擊任意鍵停止,輸入loady,與uboot燒寫相似,使用的命令主要有:nand erase 0x200000(地址) 0x200000(大小)

        nand write 0x30001000 0x200000 0x200000

3、文件系統的燒寫

文件系統的燒寫,可以通過與內核相似的方法使用串口燒寫,也可以通過掛載nfs使用mtd_debug 工具燒寫,由於文件系統較大,使用第一種方式會慢一些。

串口燒寫使用到的命令

loady

nand erase 0x600000 0x3a00000(目前的分區情況)

nand write 0x30001000 0x600000 0x800000(實際大小)

使用nfs燒寫用到的命令

       mtd_debug erase /dev/mtd2 0 0x3a00000

       mtd_debug write /dev/mtd2 0 0x800000 ubi.img

       各項的含義可以參考mtd_debug 的幫助,直接mtd_debug 即可獲取說明,其中的len可以使用十進制數,但是在uboot中是不可以的,不加0x也會認為是十六進制。

4、啟動掛載文件系統的選項

       uboot中可以通過環境變量設置啟動的選項,一般只需要配置掛載的文件系統是nfs還是ubi,及內核啟動選項。

掛載nanflash中的ubifs

setenv bootargs console=ttyS0,115200n8 ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs;

掛載129.1.4.199/rfs/rootfs,並且本機的ip設為129.1.31.33等:

setenv bootargs noinitrd root=/dev/nfs console=ttyS0,115200n8 nfsroot=129.1.4.199:/rfs/rootfs,proto=tcp,nfsvers=3,nolock ip=129.1.31.33:129.1.4.199:129.1.88.1:255.255.0.0::eth0:off

啟動內核的選項:

setenv bootcmd nand read 0x30001000 0x200000 0x200000\; bootm 0x30001000\;

修改過uboot的環境變量都需要saveenv命令保存修改


免責聲明!

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



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