背景:項目進行到最后階段,所有的啟動都需要放到NAND Flash芯片上。但是由于硬件設計,沒有添加網絡和JTAG模塊,所以常見的NFS和JTAG燒寫方式失效。于是,我們需要尋找可行的燒錄方式。
平臺: 操作系統:Ubuntu 10.04 開發板:DM368 工具:TI旗下的某些工具(下面用到了就會具體解釋)和串口調試工具
開發板啟動模式,在這里只列出3種: BTSE[2:0] = 000:NAND啟動 BTSE[2:0] = 010:SD卡啟動 BTSE[2:0] = 011:串口啟動
BTSEL[2:0]是來控制DM368釋義何種方式啟動的,最終決定RBL的代碼如何執行。
相關知識: 總體:采用串口啟動和NAND啟動,配合完成整個系統的啟動。
通過串口啟動燒寫UBL和U-Boot。
RBL:ARM ROM Boot Loader,TI固化在ROM中的bootloader。上電后會先運行RBL,然后由RBL去引導UBL。
UBL:User Boot Loader,UBL來引導uboot的加載。一級boot loader。大小有限制。
Uboot:用來引導加載linux內核。二級boot loader。
具體操作:
首先,選擇板子啟動模式為串口啟動,以便于將UBL和U-Boot燒寫到Flash中去。這里需要注意,虛擬機連接主機的USB串口。使用: dmesg | grep ttyUSB* 查看串口信息。
其次,我們需要找到: 燒寫工具:sfh_DM36x.exe, UBL文件:UBL_DM36x_NAND_ARM432_DDR340_OSC24.bin, u-boot文件:u-boot.bin 位置: psp/board_utilities/serial_flash/dm365/ psp/u-boot-2010.12-rc2-psp03.01.01.39/u-boot.bin 最好是把這三個文件拷貝到同一個文件夾,然后再去執行命令。
下載UBL和Uboot: 1. 首先需要擦寫flash
/home/davinci/test/sfh_DM36x.exe –nanderase –v –p /dev/ttyUSB0注意:由于TI軟件問題,執行兩次才會成功。
燒寫flash:/home/davinci/test/sfh_DM36x.exe –nandflash /home/davinci/test/UBL_DM36x_NAND_ARM432_DDR340_OSC24.bin /home/davinci/test/u-boot.bin –v –p /dev/ttyUSB0注意:由于TI軟件問題,執行兩次才會成功。 以上兩個操作,都出現Operation completed successfully才算燒寫成功。
完成以上操作以后,斷開板子電源,把板子啟動模式改成NAND啟動,串口作為打印功能。進入DM36x Leopard # 命令提示符。這就是uboot模式,然后在這個模式中完成kernel和文件系統的燒寫。
接下來解釋一些U-Boot的nand命令:
nand read InAddr FIAddr sizeInAddr:從nand flash中讀取,然后存放的目的內存地址FIAddr:nand flash讀取起始地址size:讀取的內容大小一句話解釋上面命令:從Nand Flash芯片的FIAddr地址讀取size大小內容存放到地址為InAddr的內存中。
nand write InAddr FIAddr sizeInAddr:寫到nand flash中的資源在內存中的起始地址FIAddr:nand flash的起始地址size:數據的大小一句話解釋上面命令:從地址為InAddr的內存中讀取size大小的內容寫入到Nand Flash芯片的FIAddr地址處
bootm 內存地址:內核從改地址啟動一句話解釋上面命令:從指定的內存地址開始加載內核。也就是第一條中read的InAddr的值。
下面貼一張Nand Flash芯片大小分配的圖片:
可以計算出: UBL的大小是:20 * 128KB(bootloader) U-Boot大小是:20 * 128KB(params) kernel的大小:4M filesystem1: 128M + 64M filesystem2: 剩下
在這里,我需要說幾個常識: 2的10次方個byte等于1KB; 2的20次方個byte等于1MB; 2的30次方個byte等于1GB。
比如:
128KB = 131072bytes20 * 128KB = 2621440bytes然而在Nand Flash芯片里面,都是使用十六進制表示的。 于是:
2621440=0x00280000也就是說UBL在Nand Flash芯片上存儲的物理地址就是:
0x00000000--0x00280000依次可以計算得到:
0x00280000--0x00500000//U-Boot的地址范圍0x00500000--0x00900000//kernel的地址范圍注意:Nand Flash的物理地址分配了這么多空間給各個部分,但是不一定非要使用這么大的空間。但是,如果使用的空間大于這個值,則需要重新分區。
再就是,我們通過串口已經把UBL和U-Boot燒錄到Nand Flash中去了,我們現在就只需燒錄kernel就好。
—————————分割線——————————- 在U-Boot模式下,完成Nand Flash的kernel燒寫。
插入裝有uImage的sd卡;執行如下命令mmc init//初始化sd卡mmc rescan 0//把sd卡掛到U-Boot上面fatload mmc 0 0x81000000 uImage//把uImage讀到內存中如果沒有錯誤的話,會出現一個數字,單位是bytes。 假設,我現在的這個數字是:1919704bytes。一定要牢記這個數字。
這個數字代表,我們uImage(內核)的大小,它將會在內存中占據的空間,同樣當我們把它寫入到Nand Flash芯片中的時候占據的空間大小。
根據上面的計算原理: 1919704bytes占據的地址長度就是這個數字的十六進制形式:0x001D4AD8。
現在,我們需要執行:
//把內存中的uImage寫到Nand Flash芯片中nand write 0x81000000 0x00500000 0x001D4AD8如果沒有錯的話,會提示寫入成功。
此刻剩下的就是測試內核是否會被成功加載?
斷電,拔出sd卡,上電,執行下面命令:
//Nand Flash芯片地址0x05000000開始,size為0x001D4AD8的內核內容讀到內存地址0x81000000中nand read 0x81000000 0x0050000 0x001D4AD8//從內存地址0x81000000處啟動bootm 0x81000000如果沒有錯誤,會看到內核的解壓縮打印信息。
寫到這里,已經完成了Nand Flash啟動的3/4的工作量。 下一遍筆記將會完成文件系統的nand燒寫。
新聞熱點
疑難解答