從NAND快閃儲存器中啟動U BOOT的設計

2021-04-22 18:00:20 字數 4791 閱讀 4853

引言隨著嵌入式系統的日趨複雜,它對大容量資料儲存的需求越來越緊迫。而嵌入式裝置低功耗、小體積以及低成本的要求,使硬碟無法得到廣泛的應用。nand快閃儲存器裝置就是為了滿足這種需求而迅速發展起來的。目前關於u-boot的移植解決方案主要面向的是微處理器中的nor 快閃儲存器,如果能在微處理器上的nand 快閃儲存器中實現u-boot的啟動,則會給實際應用帶來極大的方便。

u-boot簡介

u-boot 支援arm、 powerpc等多種架構的處理器,也支援linux、netbsd和vxworks等多種作業系統,主要用來開發嵌入式系統初始化**bootloader。bootloader是晶元復位後進入作業系統之前執行的一段**,完成由硬體啟動到作業系統啟動的過渡,為執行作業系統提供基本的執行環境,如初始化cpu、堆疊、初始化儲存器系統等,其功能類似於pc機的bios。u-boot執行流程圖如圖1所示。

圖1 u-boot啟動流程圖

nand快閃儲存器工作原理

s3c2410開發板的nand快閃儲存器由nand快閃儲存器控制器(整合在s3c2410 cpu中)和nand快閃儲存器晶元(k9f1208u0a)兩大部分組成。當要訪問nand快閃儲存器晶元中的資料時,必須通過nand快閃儲存器控制器傳送命令才能完成。所以, nand快閃儲存器相當於s3c2410的乙個外設,而不位於它的記憶體位址區。

nand快閃儲存器(k9f1208u0a)的資料儲存結構分層為:1裝置(device) = 4096 塊(block);1塊= 32頁/行(page/row);1頁= 528b = 資料塊 (512b) + oob塊 (16b)在每一頁中,最後16個位元組(又稱oob)在nand快閃儲存器命令執行完畢後設定狀態,剩餘512個位元組又分為前半部分和後半部分。可以通過nand快閃儲存器命令00h/01h/50h分別對前半部、後半部、oob進行定位,通過nand快閃儲存器內建的指標指向各自的首位址。

nand快閃儲存器的操作特點為:擦除操作的最小單位是塊;nand快閃儲存器晶元每一位只能從1變為0,而不能從0變為1,所以在對其進行寫入操作之前一定要將相應塊擦除;oob部分的第6位元組為壞快標誌,即如果不是壞塊該值為ff,否則為壞塊;除oob第6位元組外,通常用oob的前3個位元組存放nand快閃儲存器的硬體ecc(校驗暫存器)碼;

從nand快閃儲存器啟動u-boot的設計思路

如果s3c2410被配置成從nand快閃儲存器啟動,上電後,s3c2410的nand快閃儲存器控制器會自動把nand快閃儲存器中的前4k資料搬移到內部ram中, 並把0x00000000設定為內部ram的起始位址, cpu從內部ram的0x00000000位置開始啟動。因此要把最核心的啟動程式放在nand快閃儲存器的前4k中。

由於nand快閃儲存器控制器從nand快閃儲存器中搬移到內部ram的**是有限的,所以, 在啟動**的前4k裡,必須完成s3c2410的核心配置,並把啟動**的剩餘部分搬到ram中執行。在u-boot中, 前4k完成的主要工作就是u-boot啟動的第乙個階段(stage1)。

根據u-boot的執行流程圖,可知要實現從nand快閃儲存器中啟動u-boot,首先需要初始化nand快閃儲存器,並從nand快閃儲存器中把u-boot搬移到ram中,最後需要讓u-boot支援nand快閃儲存器的命令操作。

開發環境

本設計中目標板硬體環境如下:cpu為s3c2410,sdram為hy57v561620,nand快閃儲存器為64mb的k9f1208u0a。

主機軟體環境為redhat9.0、 u-boot-1.1.3、gcc 2.95.3。修改u-boot的makefile,加入:

wch2410_config : unconfig

@./mkconfig $(@:_config=) arm arm920t wch2410 null s3c24x0

即將開發板起名為wch2410,接下來依次進行如下操作:

mkdir board/wch2410

cp board/smdk2410 board/wch2410

mv smdk2410.c wch2410.c

cp include/configs/smdk2410.h include/configs/wch2410.h

export path="/usr/local/arm/2".95.3/bin:$path

最後執行:

make wch2410_config

make all arch="arm"

生成u-boot.bin,即通過了測試編譯。

具體設計

支援nand快閃儲存器的啟動程式設計

因為u-boot的入口程式是/cpu/arm920t/start.s,故需在該程式中新增nand快閃儲存器的復位程式,以及實現從nand快閃儲存器中把u-boot搬移到ram中的功能程式。

首先在/include/configs/wch2410.h中加入config_s3c2410_nand_boot, 如下:

#define config_s3c2410_nand_boot 1 @支援從nand 快閃儲存器中啟動

然後在/cpu/arm920t/start.s中新增

#ifdef config_s3c2410_nand_boot

copy_myself:

mov r10, lr

ldr sp, dw_stack_start @安裝棧的起始位址

mov fp, #0 @初始化幀指標暫存器

bl nand_reset @跳到復位c函式去執行,執行nand快閃儲存器復位

.......

/*從nand快閃儲存器中把u-boot拷貝到ram*/

ldr r0, =uboot_ram_base@ 設定第1個引數: uboot在ram中的起始位址

mov r1, #0x0 @ 設定第2個引數:nand快閃儲存器的起始位址

mov r2, #0x20000 @ 設定第3個引數: u-boot的長度(128kb)

bl nand_read_whole @ 呼叫nand_read_whole(),把nand快閃儲存器中的資料讀入到ram中

tst r0, #0x0 @ 如果函式的返回值為0,表示執行成功

beq ok_nand_read @ 執行記憶體比較,把ram中的前4k內容與nand快閃儲存器中的前4k內容進行比較, 如果完全相同, 則表示搬移成功

其中,nand_reset (),nand_read_whole()被加在/board/wch2410/wch2410.c中。

支援u-boot命令設計

在u-boot下對nand快閃儲存器的支援主要是在命令列下實現對nand快閃儲存器的操作。對nand快閃儲存器實現的命令為:nand info(列印nand flash資訊)、nand device(顯示某個nand快閃儲存器裝置)、nand read(讀取nand快閃儲存器)、nand write(寫nand快閃儲存器)、nand erease(擦除nand快閃儲存器)、nand bad(顯示壞塊)等。

用到的主要資料結構有:struct nand_flash_dev、struct nand_chip。前者包括主要的晶元型號、儲存容量、裝置id、i/o匯流排寬度等資訊;後者是具體對nand快閃儲存器進行操作時用到的資訊。

a. 設定配置選項

修改/include/configs/wch2410.h,主要是在config_commands中開啟cfg_cmd_nand選項。定義nand快閃儲存器控制器在sfr區中的起始暫存器位址、頁面大小,定義nand快閃儲存器命令層的底層介面函式等。

b. 加入nand快閃儲存器晶元型號

在/include/linux/mtd/ nand_ids.h中對如下結構體賦值進行修改:

static struct nand_flash_dev nand_flash_ids = ,

.......

}這樣對於該款nand快閃儲存器晶元的操作才能正確執行。

c. 編寫nand快閃儲存器初始化函式

在/board/wch2410/wch2410.c中加入nand_init()函式。

void nand_init(void)

該函式在啟動時被start_armboot()呼叫。

最後重新編譯u-boot並將生成的u-boot.bin燒入nand快閃儲存器中,目標板上電後從串列埠輸出如下資訊:

u-boot 1.1.3 (nov 14 2006 - 11:29:50)

u-boot code: 33f80000 -> 33f9c9e4 bss: -> 33fa0b28

ram configuration:

bank #0: 30000000 64 mb

## unknown flash on bank 0: id 0xffff, size = 0x00000000 = 0 mb

flash: 0 kb

nand: 64 mb

in:serial

out: serial

err: serial

hit any key to stop autoboot: 0

wch2410 #

結語

以往將u-boot移植到arm9平台中的解決方案主要針對的是arm9中的nor快閃儲存器,因為nor快閃儲存器的結構特點致使應用程式可以直接在其內部執行,不用把**讀到ram中,移植過程相對簡單。從nand快閃儲存器中啟動u-boot的設計難點在於nand快閃儲存器需要把u-boot的**搬移到ram中,並要讓u-boot支援nand快閃儲存器的命令操作。本文介紹了實現這一設計的思路及具體程式。移植後,u-boot在嵌入式系統中執行良好。

參考文獻

1 杜春雷. arm體系結構與程式設計[m]. 北京:清華大學出版社,2003

2 s3c2410 user』s mannual[z].samsung

從NAND快閃儲存器中啟動U BOOT的設計

從nand快閃儲存器中啟動u boot的設計 2007 05 12 07 48 u boot 支援arm powerpc等多種架構的處理器,也支援linux netbsd和vxworks等多種作業系統,主要用來開發嵌入式系統初始化 bootloader。bootloader是晶元復位後進入作業系統之...

從NAND快閃儲存器中啟動U BOOT的設計

bootloader是晶元復位後進入作業系統之前執行的一段 完成由硬體啟動到作業系統啟動的過渡,為執行作業系統提供基本的執行環境,如初始化cpu 堆疊 初始化儲存器系統等,其功能類似於pc機的bios。u boot執行流程圖如圖1所示。圖1 u boot啟動流程圖 nand快閃儲存器工作原理 s3c...

NOR型快閃儲存器與NAND型快閃儲存器的區別

分類 1 快閃儲存器晶元讀寫的基本單位不同 應用程式對nor晶元操作以 字 為基本單位。為了方便對大容量nor快閃儲存器的管理,通常將nor快閃儲存器分成大小為128kb或者64kb的邏輯塊,有時候塊內還分成扇區。讀寫時需要同時指定邏輯塊號和塊內偏移。應用程式對nand晶元操作是以 塊 為基本單位。...