《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 微波|射頻 > 設(shè)計(jì)應(yīng)用 > 從NAND閃存中啟動(dòng)U-BOOT的設(shè)計(jì)
從NAND閃存中啟動(dòng)U-BOOT的設(shè)計(jì)
摘要: U-BOOT 支持ARM、 PowerPC等多種架構(gòu)的處理器,也支持Linux、NetBSD和VxWorks等多種操作系統(tǒng),主要用來(lái)開(kāi)發(fā)嵌入式系統(tǒng)初始化代碼bootloader。bootloader是芯片復(fù)位后進(jìn)入操作系統(tǒng)之前執(zhí)行的一段代碼,完成由硬件啟動(dòng)到操作系統(tǒng)啟動(dòng)的過(guò)渡,為運(yùn)行操作系統(tǒng)提供基本的運(yùn)行環(huán)境,如初始化CPU、堆棧、初始化存儲(chǔ)器系統(tǒng)等,其功能類(lèi)似于PC機(jī)的BIOS.
關(guān)鍵詞: 存儲(chǔ)器 NAND 閃存 U-boot
Abstract:
Key words :

      U-BOOT" title="U-BOOT">U-BOOT 支持ARM、 PowerPC等多種架構(gòu)的處理器,也支持Linux、NetBSD和VxWorks等多種操作系統(tǒng),主要用來(lái)開(kāi)發(fā)嵌入式系統(tǒng)初始化代碼bootloader。bootloader是芯片復(fù)位后進(jìn)入操作系統(tǒng)之前執(zhí)行的一段代碼,完成由硬件啟動(dòng)到操作系統(tǒng)啟動(dòng)的過(guò)渡,為運(yùn)行操作系統(tǒng)提供基本的運(yùn)行環(huán)境,如初始化CPU、堆棧、初始化存儲(chǔ)器系統(tǒng)等,其功能類(lèi)似于PC機(jī)的BIOS.

NAND" title="NAND">NAND閃存" title="閃存">閃存工作原理
    S3C2410開(kāi)發(fā)板的NAND閃存由NAND閃存控制器(集成在S3C2410 CPU中)和NAND閃存芯片(K9F1208U0A)兩大部分組成。當(dāng)要訪問(wèn)NAND閃存芯片中的數(shù)據(jù)時(shí),必須通過(guò)NAND閃存控制器發(fā)送命令才能完成。所以, NAND閃存相當(dāng)于S3C2410的一個(gè)外設(shè),而不位于它的內(nèi)存地址區(qū)。

    NAND閃存(K9F1208U0A)的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)分層為:1設(shè)備(Device) = 4096 塊(Block);1塊= 32頁(yè)/行(Page/row);1頁(yè)= 528B = 數(shù)據(jù)塊 (512B) + OOB塊 (16B)
在每一頁(yè)中,最后16個(gè)字節(jié)(又稱OOB)在NAND閃存命令執(zhí)行完畢后設(shè)置狀態(tài),剩余512個(gè)字節(jié)又分為前半部分和后半部分。可以通過(guò)NAND閃存命令00h/01h/50h分別對(duì)前半部、后半部、OOB進(jìn)行定位,通過(guò)NAND閃存內(nèi)置的指針指向各自的首地址。
NAND閃存的操作特點(diǎn)為:擦除操作的最小單位是塊;NAND閃存芯片每一位只能從1變?yōu)?,而不能從0變?yōu)?,所以在對(duì)其進(jìn)行寫(xiě)入操作之前一定要將相應(yīng)塊擦除;OOB部分的第6字節(jié)為壞快標(biāo)志,即如果不是壞塊該值為FF,否則為壞塊;除OOB第6字節(jié)外,通常用OOB的前3個(gè)字節(jié)存放NAND閃存的硬件ECC(校驗(yàn)寄存器)碼;
  
從NAND閃存啟動(dòng)U-BOOT的設(shè)計(jì)思路
    如果S3C2410被配置成從NAND閃存啟動(dòng),上電后,S3C2410的NAND閃存控制器會(huì)自動(dòng)把NAND閃存中的前4K數(shù)據(jù)搬移到內(nèi)部RAM中, 并把0x00000000設(shè)置為內(nèi)部RAM的起始地址, CPU從內(nèi)部RAM的0x00000000位置開(kāi)始啟動(dòng)。因此要把最核心的啟動(dòng)程序放在NAND閃存的前4K中。

    由于NAND閃存控制器從NAND閃存中搬移到內(nèi)部RAM的代碼是有限的,所以, 在啟動(dòng)代碼的前4K里,必須完成S3C2410的核心配置,并把啟動(dòng)代碼的剩余部分搬到RAM中運(yùn)行。在U-BOOT中, 前4K完成的主要工作就是U-BOOT啟動(dòng)的第一個(gè)階段(stage1)。
根據(jù)U-BOOT的執(zhí)行流程圖,可知要實(shí)現(xiàn)從NAND閃存中啟動(dòng)U-BOOT,首先需要初始化NAND閃存,并從NAND閃存中把U-BOOT搬移到RAM中,最后需要讓U-BOOT支持NAND閃存的命令操作。
  
開(kāi)發(fā)環(huán)境
    本設(shè)計(jì)中目標(biāo)板硬件環(huán)境如下:CPU為S3C2410,SDRAM為HY57V561620,NAND閃存為64MB的K9F1208U0A。

    主機(jī)軟件環(huán)境為Redhat9.0、 u-boot-1.1.3、gcc 2.95.3。修改U-BOOT的Makefile,加入:
wch2410_config : unconfig
@./mkconfig $(@:_config=) arm arm920t wch2410 NULL s3c24x0

    即將開(kāi)發(fā)板起名為wch2410,接下來(lái)依次進(jìn)行如下操作:
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

    最后執(zhí)行:
make wch2410_config
make all ARCH=arm
生成u-boot.bin,即通過(guò)了測(cè)試編譯。

具體設(shè)計(jì)
支持NAND閃存的啟動(dòng)程序設(shè)計(jì)
    因?yàn)閁-BOOT的入口程序是/cpu/arm920t/start.S,故需在該程序中添加NAND閃存的復(fù)位程序,以及實(shí)現(xiàn)從NAND閃存中把U-BOOT搬移到RAM中的功能程序。

    首先在/include/configs/wch2410.h中加入CONFIG_S3C2410_NAND_BOOT, 如下:
#define CONFIG_S3C2410_NAND_BOOT 1   @支持從NAND 閃存中啟動(dòng)
然后在/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               @跳到復(fù)位C函數(shù)去執(zhí)行,執(zhí)行NAND閃存復(fù)位
.......
/*從NAND閃存中把U-BOOT拷貝到RAM*/
ldr r0, =UBOOT_RAM_BASE     @ 設(shè)置第1個(gè)參數(shù): UBOOT在RAM中的起始地址
mov r1, #0x0                @ 設(shè)置第2個(gè)參數(shù):NAND閃存的起始地址
mov r2, #0x20000            @ 設(shè)置第3個(gè)參數(shù): U-BOOT的長(zhǎng)度(128KB)
bl nand_read_whole          @ 調(diào)用nand_read_whole(),把NAND閃存中的數(shù)據(jù)讀入到RAM中
tst r0, #0x0                @ 如果函數(shù)的返回值為0,表示執(zhí)行成功
beq ok_nand_read             @ 執(zhí)行內(nèi)存比較,把RAM中的前4K內(nèi)容與NAND閃存中的前4K內(nèi)容進(jìn)行比較, 如果完全相同, 則表示搬移成功

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

支持U-BOOT命令設(shè)計(jì)
    在U-BOOT下對(duì)nand閃存的支持主要是在命令行下實(shí)現(xiàn)對(duì)nand閃存的操作。對(duì)nand閃存實(shí)現(xiàn)的命令為:nand info(打印nand Flash信息)、nand device(顯示某個(gè)nand閃存設(shè)備)、nand read(讀取nand閃存)、nand write(寫(xiě)nand閃存)、nand erease(擦除nand閃存)、nand bad(顯示壞塊)等。

    用到的主要數(shù)據(jù)結(jié)構(gòu)有:struct nand_flash_dev、struct nand_chip。前者包括主要的芯片型號(hào)、存儲(chǔ)容量、設(shè)備ID、I/O總線寬度等信息;后者是具體對(duì)NAND閃存進(jìn)行操作時(shí)用到的信息。

a. 設(shè)置配置選項(xiàng)
    修改/include/configs/wch2410.h,主要是在CONFIG_COMMANDS中打開(kāi)CFG_CMD_NAND選項(xiàng)。定義NAND閃存控制器在SFR區(qū)中的起始寄存器地址、頁(yè)面大小,定義NAND閃存命令層的底層接口函數(shù)等。

b. 加入NAND閃存芯片型號(hào)
    在/include/linux/mtd/ nand_ids.h中對(duì)如下結(jié)構(gòu)體賦值進(jìn)行修改:
static struct nand_flash_dev nand_flash_ids[] = {
......
{"Samsung K9F1208U0A", NAND_MFR_SAMSUNG, 0x76, 26, 0, 3, 0x4000, 0},
.......
                                              }
這樣對(duì)于該款NAND閃存芯片的操作才能正確執(zhí)行。
c. 編寫(xiě)NAND閃存初始化函數(shù)
在/board/wch2410/wch2410.c中加入nand_init()函數(shù)。
void nand_init(void)
{
/* 初始化NAND閃存控制器, 以及NAND閃存芯片 */
nand_reset();
/* 調(diào)用nand_probe()來(lái)檢測(cè)芯片類(lèi)型 */
printf ("%4lu MB\n", nand_probe(CFG_NAND_BASE) >> 20);
}

該函數(shù)在啟動(dòng)時(shí)被start_armboot()調(diào)用。
   
    最后重新編譯U-BOOT并將生成的u-boot.bin燒入NAND閃存中,目標(biāo)板上電后從串口輸出如下信息:
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 #

結(jié)語(yǔ)
    以往將U-BOOT移植到ARM9平臺(tái)中的解決方案主要針對(duì)的是ARM9中的NOR閃存,因?yàn)镹OR閃存的結(jié)構(gòu)特點(diǎn)致使應(yīng)用程序可以直接在其內(nèi)部運(yùn)行,不用把代碼讀到RAM中,移植過(guò)程相對(duì)簡(jiǎn)單。從NAND閃存中啟動(dòng)U-BOOT的設(shè)計(jì)難點(diǎn)在于NAND閃存需要把U-BOOT的代碼搬移到RAM中,并要讓U-BOOT支持NAND閃存的命令操作。本文介紹了實(shí)現(xiàn)這一設(shè)計(jì)的思路及具體程序。移植后,U-BOOT在嵌入式系統(tǒng)中運(yùn)行良好。

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
性欧美暴力猛交另类hd| 亚洲精品九九| 亚洲国产影院| 激情成人综合网| 国产网站欧美日韩免费精品在线观看| 欧美日韩一区二区三区在线 | 宅男噜噜噜66一区二区 | 欧美伊人久久久久久午夜久久久久 | 亚洲电影免费| 久久国产直播| 亚洲第一网站免费视频| 久久国产一区二区| 久久精品视频在线| 亚洲欧美在线一区| 欧美国产日韩二区| 欧美777四色影视在线| 老司机精品导航| 久久综合电影一区| 免费在线看一区| 欧美激情二区三区| 欧美三区不卡| 国产精品一区二区三区久久 | 黄色在线一区| 亚洲福利视频专区| 亚洲欧洲在线免费| 亚洲免费成人av| 亚洲视频一区二区| 欧美一二三区精品| 亚洲激情av在线| 一区二区三区www| 亚洲你懂的在线视频| 性欧美大战久久久久久久久| 久久久久久夜精品精品免费| 六月婷婷久久| 欧美日韩国产一级片| 国产精品裸体一区二区三区| 国产精品永久免费| 怡红院精品视频| 日韩亚洲精品视频| 亚洲免费综合| 亚洲精品国久久99热| 亚洲一区二区三区精品在线观看| 欧美一区二区三区在线观看视频| 久久综合亚洲社区| 欧美日韩一区二区三区四区五区| 国产精品一区二区男女羞羞无遮挡| 精品96久久久久久中文字幕无| 最近中文字幕mv在线一区二区三区四区 | 午夜视频一区二区| 亚洲国产网站| 亚洲一区精彩视频| 久久久久久久999精品视频| 欧美大片第1页| 国产精品热久久久久夜色精品三区 | 亚洲国产专区校园欧美| 在线一区二区三区四区| 久久激情网站| 亚洲天堂第二页| 久久婷婷国产综合精品青草| 欧美日韩国产页| 狠狠色狠狠色综合| 亚洲一区二区伦理| 亚洲精品黄网在线观看| 性色一区二区| 欧美极品在线播放| 国产私拍一区| 一本色道**综合亚洲精品蜜桃冫 | 美女主播一区| 国产精品视频yy9099| 亚洲丰满少妇videoshd| 亚洲尤物影院| 日韩一区二区电影网| 久久精品免费电影| 国产精品theporn88| 在线精品一区| 午夜精品一区二区三区在线| 一本久久a久久精品亚洲| 久久琪琪电影院| 国产精品视频内| 日韩亚洲不卡在线| 亚洲欧洲精品一区二区三区| 欧美一区二区黄色| 欧美日韩亚洲一区| 亚洲国产三级| 久久精品视频在线播放| 新狼窝色av性久久久久久| 欧美日本国产精品| 亚洲第一天堂无码专区| 欧美呦呦网站| 欧美亚洲视频在线看网址| 欧美日韩国产精品一区二区亚洲 | 亚洲激情第一区| 亚洲大胆视频| 久久精品国产99国产精品澳门| 欧美视频一区二区三区…| 亚洲国产欧美一区二区三区丁香婷| 欧美中文字幕不卡| 欧美一区二区三区日韩视频| 欧美午夜宅男影院在线观看| 亚洲精品视频啊美女在线直播| 亚洲国产精品一区| 久久精品夜色噜噜亚洲a∨| 国产精品wwwwww| 9色精品在线| 一区二区久久| 欧美日本三区| 亚洲精品久久久蜜桃| 亚洲日本欧美在线| 一区二区三区在线观看国产| 日韩特黄影片| 欧美精品情趣视频| 亚洲经典一区| 亚洲乱码国产乱码精品精| 免费观看在线综合| 在线观看亚洲一区| 亚洲欧洲精品一区二区三区波多野1战4 | 欧美日韩国产精品| 亚洲精品午夜| 一本大道久久a久久精品综合| 欧美日韩p片| 亚洲精选一区二区| 一本久久综合亚洲鲁鲁五月天| 欧美激情第一页xxx| 亚洲欧洲日产国产网站| 亚洲毛片在线免费观看| 欧美激情一区二区| 日韩视频中午一区| 亚洲在线观看免费| 国产精品www色诱视频| 亚洲一区二区三区777| 欧美亚洲综合网| 国产亚洲成av人片在线观看桃| 欧美一区二区三区电影在线观看| 欧美专区亚洲专区| 韩日成人在线| 亚洲欧洲一区二区在线观看 | 欧美另类女人| a4yy欧美一区二区三区| 小辣椒精品导航| 国产曰批免费观看久久久| 亚洲国产精品久久91精品| 欧美刺激午夜性久久久久久久| 亚洲精品视频在线播放| 亚洲视频在线免费观看| 国产精品美女xx| 欧美影视一区| 欧美激情一二三区| 亚洲午夜黄色| 久久久国产视频91| 亚洲国产精品va在线看黑人| 一区二区成人精品 | 久久九九99| 亚洲国产99| 亚洲综合视频一区| 国产在线不卡精品| 99精品视频免费观看视频| 国产精品sss| 久久精品导航| 久久久免费精品| 亚洲日韩成人| 一区二区三区日韩欧美| 国产精品影视天天线| 亚洲精美视频| 国产精品久久久久久久久久ktv| 性做久久久久久久免费看| 欧美.www| 亚洲一区在线免费观看| 久久这里只有| 亚洲色在线视频| 久色成人在线| 在线视频免费在线观看一区二区| 久久精品亚洲一区二区| 日韩天堂在线观看| 久久久精品一品道一区| 亚洲麻豆av| 久久噜噜噜精品国产亚洲综合| 亚洲日本欧美日韩高观看| 欧美一级免费视频| 91久久国产自产拍夜夜嗨| 欧美在线首页| 亚洲精品中文在线| 久久久久久久综合| 一区二区毛片| 蜜桃久久精品一区二区| 亚洲性色视频| 欧美日韩成人综合| 久久精品视频导航| 国产精品视频精品视频| 亚洲乱码国产乱码精品精| 国产欧美日韩视频一区二区三区| 亚洲精品在线观看免费| 国产亚洲欧美另类中文| 亚洲午夜成aⅴ人片| 在线观看亚洲a| 久久xxxx| 亚洲视频狠狠| 欧美日本国产一区| 亚洲国产一区二区三区青草影视| 国产欧美精品在线| 亚洲小说欧美另类婷婷|