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,打印輸出啟動信息,並進行倒計時,此時發送任意字符給系統,停止計時,關閉串口軟件,使用超級終端連接系統。
第二步燒寫uboot到nandflash
在超級終端中輸入loady命令,再使用傳送/發送文件,選擇Ymodem協議,發送u-boot.bin,接收完成后,先擦除nand erase,可以全擦掉(不用給參數),也可以使用使用參數指定區域,一般第一次要全擦,而后使用nand_params將flash的信息寫入其中,最后使用nand write 0x30001000 0x4000 0x100000
其中,0x30001000 是uboot在內存中的地址;
0x4000 uboot在flash中存放的起始地址,需要根據實際的分區情況而定;
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命令保存修改