背景:項目進行到最後階段,所有的啟動都需要放到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:
- 首先需要擦寫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 size
InAddr:從nand flash中讀取,然後存放的目的記憶體位址
FIAddr:nand flash讀取起始位址
size:讀取的内容大小
一句話解釋上面指令:從Nand Flash晶片的FIAddr位址讀取size大小内容存放到位址為InAddr的記憶體中。
nand write InAddr FIAddr size
InAddr:寫到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 = 131072bytes
20 * 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燒寫。