1. 程式人生 > >DM36x使用串列埠和NAND啟動完成NAND Flash燒寫(一)

DM36x使用串列埠和NAND啟動完成NAND Flash燒寫(一)

背景:專案進行到最後階段,所有的啟動都需要放到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軟體問題,執行兩次才會成功。

  1. 燒寫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燒寫。

  1. 插入裝有uImage的sd卡;
  2. 執行如下命令
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燒寫。