天天看點

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晶片大小配置設定的圖檔:

DM36x使用序列槽和NAND啟動完成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燒寫。