999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

U-Boot從NAND Flash啟動(dòng)的實(shí)現(xiàn)

2010-03-13 08:54:38王磊
電子設(shè)計(jì)工程 2010年5期
關(guān)鍵詞:程序

王磊

(太原理工大學(xué) 信 息工程學(xué)院, 山西 太 原 0 30024)

Bootloader引導(dǎo)裝載程序是系統(tǒng)上電后運(yùn)行的第一段程序,其作用是完成基本的硬件初始化工作,所以引導(dǎo)裝載程序跟硬件有著緊密的聯(lián)系。因此必須根據(jù)開發(fā)板的硬件配置對(duì)引導(dǎo)裝載程序進(jìn)行修改才可以使其運(yùn)行起來。隨著嵌入式系統(tǒng)的復(fù)雜化,大容量數(shù)據(jù)存儲(chǔ)的NAND Flash的應(yīng)用會(huì)越來越廣泛,同時(shí)U-Boot是功能最豐富的Bootloader,但遺憾的是U-Boot不支持從NAND Flash啟動(dòng)。所以如果能實(shí)現(xiàn)U-Boot從NAND Flash啟動(dòng)的話將會(huì)給應(yīng)用帶來很大的方便。本文討論修改U-Boot使其支持從NAND Flash啟動(dòng),采用基于S3C2440的開發(fā)板。

1 U-Boot簡介及流程分析

U-Boot,全稱universal boot loader,是遵循GPL條款的開放源代碼項(xiàng)目。可以引導(dǎo)多種操作系統(tǒng),支持多種架構(gòu)的CPU。它支持如下操作系統(tǒng):Linux、NetBSD、VxWorks等,支持如下架構(gòu)的CPU:PowerPC、MIPS、X86、ARM、NIOS、XScale等,同時(shí)支持NFS掛載,是一個(gè)功能豐富的BootLoader。它的整個(gè)程序框架清晰,易于移植,許多設(shè)計(jì)人員將自己的移植代碼上傳到網(wǎng)站(http://sourceforge.net/projects/u-boot/)上,更新速度很快。目前的版本是1.1.6,本論文正是采用此版本進(jìn)行說明,U-Boot的目錄結(jié)構(gòu)參見U-Boot源代碼。

要進(jìn)行U-Boot的修改移植必須了解U-Boot的程序運(yùn)行流程,這是必要的一步。U-Boot屬于兩階段的BootLoader,其啟動(dòng)流程如圖1所示。第一階段的文件為cpu/arm920t/start.S和board/smdk2410/lowlevel_init.S,用ARM匯編語言編寫,前者是平臺(tái)相關(guān)的,后者是開發(fā)板相關(guān)的[1]。第一階段主要是關(guān)于基本硬件的初始化,包括關(guān)閉MMU、CACHE、設(shè)置PLL時(shí)鐘比例、關(guān)閉看門狗;初始化SDRAM,為復(fù)制第二階段代碼做準(zhǔn)備,最后復(fù)制第二階段代碼到SDRAM中,然后跳到SDRAM中運(yùn)行第二階段。第二階段代碼都是用C語言編寫的,功能更加復(fù)雜,主要是進(jìn)一步初始化硬件設(shè)備、檢測(cè)內(nèi)存映射、復(fù)制內(nèi)核鏡像和根文件系統(tǒng)到SDRAM以及設(shè)置啟動(dòng)參數(shù)從而啟動(dòng)內(nèi)核。

圖1 U-Boot啟動(dòng)流程

2 支持NAND啟動(dòng)的代碼修改

2.1 添加NAND Flash的初始化函數(shù)

U-Boot中關(guān)于NAND Flash的初始化流程如下:在上電后最先運(yùn)行的匯編程序cpuarm920tstart.S中調(diào)用start_armboot函數(shù),而start_armboot該函數(shù)則調(diào)用了一系列的關(guān)于設(shè)備的初始化函數(shù)。這一系列的函數(shù)中包含一個(gè)名為nand_init的函數(shù),nand_init就是完成NAND Flash的初始化工作。

在1.1.6版 本 的U-Boot的includelinuxmtd and.h中 定義了nand_chip結(jié)構(gòu)體,該結(jié)構(gòu)體中定義了關(guān)于NAND Flash操作的所有函數(shù),包括讀、寫、ECC校驗(yàn)等,而這些函數(shù)在U-Boot中都有完整編寫,只是有些個(gè)別函數(shù)需要根據(jù)自己的要求重新編寫。而實(shí)現(xiàn)NAND Flash初始化的nand_init函數(shù)主要任務(wù)就是完成這些需要重新編寫的函數(shù)和用這些函數(shù)連同U-Boot中其他默認(rèn)函數(shù)來初始化nand_chip結(jié)構(gòu)體。NAND_init中的board_nand_init函數(shù)在U-Boot中并未實(shí)現(xiàn),顯然需要重新編寫的函數(shù)就在其內(nèi)添加[2]。

先在cpuarm920ts3c24x0中添加nand.c文件,然后在該文件中實(shí)現(xiàn)所需要的初始化函數(shù)。一般只需要重新編寫nand_chip結(jié)構(gòu)體中相對(duì)應(yīng)的hwcontrol、dev_ready和select_chip函數(shù)。這些函數(shù)的構(gòu)建可參照linux內(nèi)核2.6版本里的driversmtd ands3c2410.c文件來進(jìn)行編寫,如內(nèi)核文件中的s3c2440_nand_hwcontrol,s3c2440_nand_devready,s3c2410_nand_select_chip函數(shù),然后將其賦值給nand_chip結(jié)構(gòu)體中對(duì)應(yīng)的函數(shù)[3-4]。

接著在/include/configs/SMDK2410.h中的CONFIG_COMMANDS內(nèi)添加

同時(shí)在最后添加

初始化函數(shù)工作基本完成。最后修改Makefile,把nand.c文件添加進(jìn)工程。

2.2 實(shí)現(xiàn)NAND啟動(dòng)

由于NAND的自身特點(diǎn),對(duì)NAND Flash的操作不能像對(duì)NOR Flash那樣方便地直接對(duì)地址進(jìn)行操作,而是通過讀寫NAND Flash控制器的寄存器來完成。三星公司的S3C2440自帶NAND Flash控制器,寄存器的地址是從nGCS4的地址開始。S3C2440處理器有NOR和NAND兩種啟動(dòng)模式,當(dāng)選擇從NAND模式啟動(dòng)時(shí),S3C2440會(huì)把NAND Flash的前4 K數(shù)據(jù)搬運(yùn)到內(nèi)部稱為Steppingstone的硬件中,同時(shí)把Steppingstone映射到地址0X00處,從而啟動(dòng),啟動(dòng)完成后處理器會(huì)把Steppingstone釋放掉以作為他用。U-Boot的一般大小都上100 K,遠(yuǎn)大于4 K,所以實(shí)現(xiàn)從NAND啟動(dòng)的原理就是讓前4 K代碼完成基本初始化,重要的是把NAND Flash中的U-Boot代碼復(fù)制到SDRAM中,從而跳到SDRAM中去執(zhí)行[5]。分析可知,S3C2440的該特點(diǎn)為U-Boot從NAND Flash啟動(dòng)提供了可能。本文討論的實(shí)現(xiàn)思路就是依據(jù)此原理。

源代碼中有/board/smdk2410/u-boot/lds,該文件是U-Boot代碼的鏈接腳本,有如下代碼:

可以看到Text段也就是程序代碼段,被編譯鏈接到0X00地址處,同時(shí)start.S編譯后的目標(biāo)文件start.o被放到text段的第一個(gè)文件處,所以start.S就是程序上電運(yùn)行的第一段代碼,而/cpu/arm920t/start.S這個(gè)匯編文件正是U-Boot的程序代碼入口。因此代碼修改和添加主要在start.S中完成,以此來保證NAND啟動(dòng)代碼可以在最終程序編譯鏈接所生成的文件的前4 K內(nèi)。

NAND Flash讀寫操作比較復(fù)雜,匯編實(shí)現(xiàn)較為麻煩,沒有C語言簡單容易,因此用C語言實(shí)現(xiàn)對(duì)NAND的操作復(fù)制工作,最后在start.s中調(diào)用編寫的C程序即可。

在/board/smdk2410/中添加boot_init.c文件,在其中實(shí)現(xiàn)nand_reset(nand重置函數(shù))、wait_idle(等待即查詢?cè)O(shè)備是否讀寫就位)、nand_select_chip(片選使能)、nand_deselect_chip(取 消 片 選 )、write_cmd(寫 命 令 )、write_addr(寫地址 )、read_data(讀數(shù)據(jù))、nand_init(nand控制器初始化)這些子函數(shù)和copy2ram函數(shù),同時(shí)在copy2ram中依據(jù)NAND Flash的讀寫操作特點(diǎn)來調(diào)用這些子函數(shù)。具體操作流程如圖2所示。

對(duì)NAND Flash中的代碼復(fù)制操作函數(shù)已經(jīng)完成,接下來只要在start.S中調(diào)用copy2ram函數(shù)就完成工作。匯編文件start.S中 ,relocate、copy_loop段代碼為U-Boot中原先的復(fù)制代碼過程,去掉這2段代碼,添加自己的代碼。由于編寫的是C代碼,所以在start.S中調(diào)用copy2ram函數(shù)前必須先設(shè)定好指針、堆棧,另外copy2ram要用到的參數(shù)是通過r0、r1、r2寄存器傳遞的。

圖2 NAND Flash操作流程

在stack_setup設(shè)置堆棧代碼后面添加如下代碼:

上面第一段代碼主要是檢測(cè)程序是否已經(jīng)在內(nèi)存中運(yùn)行,如果已經(jīng)在內(nèi)存中,顯然代碼就無需復(fù)制,程序就會(huì)跳過復(fù)制階段往后執(zhí)行,第二段是設(shè)定參數(shù),把參數(shù)放入相應(yīng)寄存器,最后調(diào)用copy2ram函數(shù)。

自此關(guān)于NAND啟動(dòng)的主要代碼修改和添加已經(jīng)完成,但還有很重要的一處需要修改,關(guān)于環(huán)境參數(shù)的存放問題。環(huán)境參數(shù)緊隨著U-Boot在NAND Flash中存放,在其之后是內(nèi)核鏡像文件。在U-Boot的第二階段中有個(gè)名為env_relocate的函數(shù),它會(huì)把環(huán)境參數(shù)復(fù)制到RAM中,而環(huán)境參數(shù)中需要向Linux內(nèi)核傳遞的參數(shù)會(huì)在內(nèi)核啟動(dòng)前重新構(gòu)建成標(biāo)記列表,同時(shí)把該標(biāo)記列表放在跟內(nèi)核約定好的地址處。因此必須指明環(huán)境參數(shù)的存放位置,否則無法復(fù)制到內(nèi)存,從而需要傳遞到內(nèi)核的參數(shù)也就無法完成傳遞[6]。修改如下:在/include/configs/smdk2410.h中添加:

第一行指定環(huán)境變量在NAND Flash中,后面2行分別指定其在NAND Flash中的大小和偏移量。關(guān)于NAND啟動(dòng)的部分全部完成。

3 U-Boot其他部分修改

由于所開發(fā)的開發(fā)板是基于S3C2440的,U-Boot中沒有S3C2440的配置文件,只能仍用SMDK2410模板來進(jìn)行修改。主要修改有兩處:1)在/include/s3c24x0.h中添加S3C2440_NAND結(jié)構(gòu)體;2)由于S3C2410和S3C2440的時(shí)鐘寄存器有些不一樣,所以需要修改時(shí)鐘獲得函數(shù),在/cpu/arm920t/s3c24x0/speed.c修改。特別要注意的是機(jī)器ID的問題,在/include/asm-arm/mach-types.h中定義了各個(gè)開發(fā)板的ID號(hào),必須要保證所定義的開發(fā)板的ID號(hào)跟內(nèi)核一致,否則內(nèi)核無法啟動(dòng)。

4 結(jié)束語

針對(duì)U-Boot不支持從NAND啟動(dòng)的缺點(diǎn),對(duì)其進(jìn)行修改。添加了關(guān)于NAND Flash的操作函數(shù)和支持從NAND啟動(dòng)的函數(shù)。本文詳細(xì)闡述了U-Boot從NAND啟動(dòng)的原理和修改過程。修改過后的U-Boot可以直接從NAND Flash啟動(dòng),這樣就可以摒棄傳統(tǒng)依賴NOR Flash啟動(dòng)的硬件設(shè)計(jì),使用只依賴NAND Flash作為存儲(chǔ)器的硬件設(shè)計(jì),從而簡化電路,給應(yīng)用帶來極大方便。

[1]韋東山.嵌入式Linux應(yīng)用開發(fā)完全手冊(cè)[M].北京:人民郵電出版社,2008.

[2]詹榮開.嵌入式系統(tǒng)Bootloader技術(shù)內(nèi)幕[EB/OL].http://www.ibm.com/developerworks/cn/linux/l-btloader/index.html.

[3]宋寶華.Linux設(shè)備驅(qū)動(dòng)開發(fā)詳解[M].北京:人民郵電出版社,2008.

[4]杜春雷.ARM體系結(jié)構(gòu)與編程[M].北京:清華大學(xué)出版社,2003.

[5]SAMSUNG Electronics.S3C2440A 32-bit CMOS microcontrolleruser'smanual[DB/OL].http://www.datasheetarchive.com/S3C2440-datasheet.html.

[6]鄭家玲,張?jiān)品澹瑢O荷琨.嵌入式系統(tǒng)的內(nèi)核載入過程淺析[J].微型計(jì)算機(jī)應(yīng)用,2002(11):59-60.

猜你喜歡
程序
給Windows添加程序快速切換欄
電腦愛好者(2020年6期)2020-05-26 09:27:33
試論我國未決羈押程序的立法完善
失能的信仰——走向衰亡的民事訴訟程序
“程序猿”的生活什么樣
英國與歐盟正式啟動(dòng)“離婚”程序程序
基于VMM的程序行為異常檢測(cè)
偵查實(shí)驗(yàn)批準(zhǔn)程序初探
我國刑事速裁程序的構(gòu)建
創(chuàng)衛(wèi)暗訪程序有待改進(jìn)
恐怖犯罪刑事訴訟程序的完善
主站蜘蛛池模板: 欧美视频二区| 亚洲人成影视在线观看| 操美女免费网站| 尤物成AV人片在线观看| 9999在线视频| 国产福利在线观看精品| 91久久国产综合精品女同我| 国产精品爽爽va在线无码观看| 精品国产成人av免费| 久久久久久午夜精品| 国产福利小视频在线播放观看| 欧美一区二区三区香蕉视| 秘书高跟黑色丝袜国产91在线 | 国产男女XX00免费观看| 亚洲欧美日韩成人高清在线一区| 国产精品久久久精品三级| 亚洲三级影院| 先锋资源久久| 四虎国产精品永久一区| 91麻豆久久久| 国产欧美精品午夜在线播放| 男人天堂伊人网| 国产在线精彩视频二区| 视频二区中文无码| 啪啪啪亚洲无码| 最新痴汉在线无码AV| 国产手机在线小视频免费观看 | 亚洲天堂高清| 成人午夜久久| 亚洲高清中文字幕| 日韩人妻无码制服丝袜视频| 无码av免费不卡在线观看| 伊人成人在线| 91精品国产综合久久香蕉922| 在线欧美日韩| 久久人搡人人玩人妻精品一| 精品欧美日韩国产日漫一区不卡| 国产精品露脸视频| 丰满人妻被猛烈进入无码| 黄色网页在线播放| 国产精品99r8在线观看| yy6080理论大片一级久久| 色噜噜狠狠狠综合曰曰曰| 久久精品无码中文字幕| 亚洲区第一页| 丁香综合在线| 亚洲色图另类| 九色综合视频网| 久久96热在精品国产高清| 久久永久免费人妻精品| 久久夜色撩人精品国产| 女高中生自慰污污网站| 亚洲国产欧美自拍| 国产91久久久久久| 欧美性精品| 欧美成人第一页| 欧美天堂在线| 国产69囗曝护士吞精在线视频| 久久久久亚洲AV成人人电影软件| 影音先锋亚洲无码| 久久精品国产亚洲AV忘忧草18| 99九九成人免费视频精品| 女人18毛片水真多国产| 国产综合色在线视频播放线视| 亚洲综合色吧| 日韩毛片免费观看| 免费不卡在线观看av| 免费人欧美成又黄又爽的视频| 国产精品视频免费网站| 无码中字出轨中文人妻中文中| 九九热这里只有国产精品| 日韩在线第三页| 青青操视频在线| 爽爽影院十八禁在线观看| 在线观看热码亚洲av每日更新| 国产精品护士| 美女一级免费毛片| 欧亚日韩Av| 91系列在线观看| 99热最新在线| 少妇精品在线| 日本国产精品|