wince+s3c6410 SD卡啓動

歡迎加入Wince技術討論羣QQ#326444254

1.  基於IROM SD/MMC啓動方式的原理

我們知道S3C6410支持IROM啓動(internal ROM Booting),IROM啓動是指從OneNAND、SD/MMC卡和NAND Flash存儲設備啓動的方式,見下圖:

WINCE6.0+S3C6410基於SD卡啓動 - 男兒當自強 - 男兒當自強的博客

圖1 IROM啓動流程

上圖是系統基於IROM方式啓動的工作流程圖,下面簡要描述此流程主要的工作:

1)  處理器上電後,當OM[4:1]=1111時,執行IROM中的啓動代碼(boot codes),這個啓動代碼稱爲BL0,它具體會做一些初始化的工作。

2)  根據GPN[15:13]管腳的設置來選擇啓動的設備,根據圖2,如果是要從SD/MMC的通道0中的SD卡啓動,那麼GPN[15:13]=000,這樣BL0就會通過SD控制器從SD卡中讀出BL1中的前4KB的程序到Stepping Stone中,然後再Stepping Stone中執行BL1的代碼。

3)  BL1可以初始化系統時鐘,UART,SDRAM等設備,然後拷貝Bootloader2(BL2)到SDRAM的地址內存處。

4)  然後跳轉到SDRAM中的BL2繼續運行,BL2支持更強大的功能,並且進一步初始化硬件和把WINCE內核鏡像拷貝到SDRAM的(0x80100000)地址內存處。

5)  最後再SDRAM種開始執行NK。

WINCE6.0+S3C6410基於SD卡啓動 - 男兒當自強 - 男兒當自強的博客

圖2  S3C6410支持的啓動方式

 

這裏有個不太確定的問題, IROM_ApplicationNote文檔中提到說IROM boot code(BL0)可以裝載4KB的bootloader code到stepping stone(8KB)中,但是實際是BL0可以裝載8KB的stepldr_IROM_SD.nb0到stepping stone,不知道大家如何理解這個矛盾,還望知道的朋友告知。

 

2.  基於SD卡啓動的實現概述

S3C6410支持從SD卡啓動,可通過IROM_Fusing_Tool.exe應用軟件將IROM_SD_EBOOT.nb0燒錄到SD卡中,然後從SD卡啓動的時候,通過啓動的IROM_SD_EBOOT.nb0來燒錄新的stepldr、eboot和OS到NANDFLASH中,這樣後面就可以從NANDFLASH啓動了。

 

通過IROM Fusing tool燒錄IROM_SD_EBOOT.nb0文件到SD card後,在SD卡中是看不到文件的,因爲它不是通過FAT寫文件的方式,而是直接寫入SD card扇區,這樣S3C6410從SD card啓動時,直接通過SDIO控制器讀扇區,其中IROM_SD_EBOOT.nb0由stepldr_IROM_SD.nb0(相當於BL2)和eboot_sdfuser.nb0(相當於BL1)組成,BL1和BL2的意思是引導加載的第一階段和第二階段,下圖是SD/MMC設備引導塊的分配。

  WINCE6.0+S3C6410基於SD卡啓動 - 男兒當自強 - 男兒當自強的博客

圖3 SD/MMC設備啓動塊分配圖

由上圖可知SD卡的最後一個塊(block,這裏也就是sector,每個sector爲512Bytes)因爲預留下來,所以我們不能使用,倒數第二個block指定用於SD卡的標籤(signature),從[LAST-18]到[LAST-3]這16塊用於保存BL1,根據上圖並結合BL2的大小可以判斷BL2在SD卡中的位置。

 

3.  燒到IROM_SD_EBOOT.nb0燒錄到SD卡

根據上面的描述,我們知道要把IROM_SD_EBOOT.nb0燒錄到SD卡中的具體位置,下面先來看IROM Fusing tool.exe的應用界面

  WINCE6.0+S3C6410基於SD卡啓動 - 男兒當自強 - 男兒當自強的博客

圖4  IROM_Fusing_tool.exe的界面

在上圖選擇START的時候,我們來看IROM_Fusing_tool.exe源代碼的主要實現部分,下面看第一部分:

  WINCE6.0+S3C6410基於SD卡啓動 - 男兒當自強 - 男兒當自強的博客

圖5  IROM_Fusing_tool.exe寫動作主要實現部分

爲什麼從第0x52到0x56這5字節的內容是文件系統的標識符呢?我們通過winhex工具來查看SD卡的啓動區的內容,這些內容是對SD卡進行格式化的時候寫進SD卡中的,如下:

  WINCE6.0+S3C6410基於SD卡啓動 - 男兒當自強 - 男兒當自強的博客

圖6  winhex打開1GB的SD卡

下面繼續來看第二部分:

  WINCE6.0+S3C6410基於SD卡啓動 - 男兒當自強 - 男兒當自強的博客

圖7  IROM_Fusing_tool.exe寫動作主要實現部分

SDHC設備引導塊的分配如下:

  WINCE6.0+S3C6410基於SD卡啓動 - 男兒當自強 - 男兒當自強的博客

圖8  SDHC設備引導塊的分配

 

4.  啓動時從SD卡中讀取IROM_SD_EBOOT.nb0並

S3C6410啓動後,基於IROM+SD的啓動方式,CPU先執行BL0的啓動代碼,其中BL0在啓動過程中會通過SD卡控制器把BL1(也就是stepldr_IROM_SD.nb0,大小爲8KB)的內容拷貝到stepping stone中),然後在stepping stone中執行BL1的代碼,BL1在執行過程中會調用main函數,如下:

  WINCE6.0+S3C6410基於SD卡啓動 - 男兒當自強 - 男兒當自強的博客

圖9 BL1的main函數

到此BL2的內容已經複製到SDRAM指定的內存地址處,並且開始執行了,然後可以通過IROM_SD_EBOOT.nb0的下載功能手動或者自動下載block0、eboot.bin或是NK.bin到NANDFLASH中了。

 

4.1 保存SD/MMC卡信息的全局變量

在使用SD/MMC卡作爲啓動設備的時候,SD/MMC卡的信息必須要保存在指定的區域,見下圖:

  WINCE6.0+S3C6410基於SD卡啓動 - 男兒當自強 - 男兒當自強的博客

圖10 保存SD/MMC卡的信息的地址及用途定義

 

4.2 設備複製函數(Device Copy Function)

S3C6410內部包含了引導設備的塊賦值函數的ROM代碼,所以開發者不需要實現設備複製函數,這些內部的函數可以複製任何設備的數據到SDRAM中,使用者在內部的ROM代碼執行之後可以使用這些函數,因爲這些函數是在BL0階段初始化的。下面是這些設備複製函數的描述表

WINCE6.0+S3C6410基於SD卡啓動 - 男兒當自強 - 男兒當自強的博客

圖11 設備賦值函數說明

 

4.3 IROM_SD_EBOOT.nb0文件的組成及大小

下圖是IROM_SD_EBOOT.nb0文件的組成文件及各個文件的大小,有助於大家的理解

  WINCE6.0+S3C6410基於SD卡啓動 - 男兒當自強 - 男兒當自強的博客

圖12 IROM_SD_EBOOT.nb0文件組成

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章