當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]U-Boot從NAND Flash啟動(dòng)的實(shí)現(xiàn)

摘要:U-Boot不能從NAND Flash啟動(dòng)給應(yīng)用帶來(lái)些不便,因此修改U-Boot使其支持從NAND Flash啟動(dòng)。分析了U-Boot啟動(dòng)流程的兩個(gè)階段及實(shí)現(xiàn)從NAND Flash啟動(dòng)的原理和思路,并根據(jù)NAND Flash的物理結(jié)構(gòu)和存儲(chǔ)特點(diǎn),增加U-Boot對(duì)NAND Flash的操作支持,從而完成把存儲(chǔ)在NAND Flash上的U-Boot代碼復(fù)制到SDRAM中執(zhí)行,實(shí)現(xiàn)從NAND Flash的啟動(dòng)。修改過(guò)后的U-Boot可以直接從NAND Flash啟動(dòng),給應(yīng)用帶來(lái)便利。
關(guān)鍵詞:U-Boot;NAND Flash;Boofloader;S3C2440;移植

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

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

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

2 支持NAND啟動(dòng)的代碼修改
2.1 添加NAND Hash的初始化函數(shù)
    U-Boot中關(guān)于NAND Hash的初始化流程如下:在上電后最先運(yùn)行的匯編程序cpu\arm920t\start.S中調(diào)用start_armboot函數(shù),而star-t_armboot該函數(shù)則調(diào)用了一系列的關(guān)于設(shè)備的初始化函數(shù)。這一系列的函數(shù)中包含一個(gè)名為nand_init的函數(shù),nand_init就是完成NAND Ha-sh的初始化工作。
    在1.1.6版本的U-Boot的include\linux\mtd\nand.h中定義了nand_chip結(jié)構(gòu)體,該結(jié)構(gòu)體中定義了關(guān)于NAND Hash操作的所有函數(shù),包括讀、寫(xiě)、ECC校驗(yàn)等,而這些函數(shù)在U-Boot中都有完整編寫(xiě),只是有些個(gè)別函數(shù)需要根據(jù)自己的要求重新編寫(xiě)。而實(shí)現(xiàn)NAND Flash初始化的nand_init函數(shù)主要任務(wù)就是完成這些需要重新編寫(xiě)的函數(shù)和用這些函數(shù)連同U-Boot中其他默認(rèn)函數(shù)來(lái)初始化nand_chip結(jié)構(gòu)體。NAND-_init中的board_nand_init函數(shù)在U-Boot中并未實(shí)現(xiàn),顯然需要重新編寫(xiě)的函數(shù)就在其內(nèi)添加。
    先在cpu\arm920t\s3c24x0中添加nand.c文件,然后在該文件中實(shí)現(xiàn)所需要的初始化函數(shù)。一般只需要重新編寫(xiě)nand_ehip結(jié)構(gòu)體中相對(duì)應(yīng)的hweontrol、dev_ready和select_chip函數(shù)。這些函數(shù)的構(gòu)建可參照l(shuí)inux內(nèi)核2.6版本里的drivers\mtd\nand\s3e2410.e文件來(lái)進(jìn)行編寫(xiě),如內(nèi)核文件中的s3c2440_nand_hwcontrol,s3c2440_nand_devready,s3c2410nand_select_chip函數(shù),然后將其賦值給nand_chip結(jié)構(gòu)體中對(duì)應(yīng)的函數(shù)。


2.2 實(shí)現(xiàn)NAND啟動(dòng)
    由于NAND的自身特點(diǎn),對(duì)NAND Flash的操作不能像對(duì)NOR Flash那樣方便地直接對(duì)地址進(jìn)行操作,而是通過(guò)讀寫(xiě)NAND Flash控制器的寄存器來(lái)完成。三星公司的S3C2440自帶NAND Flash控制器,寄存器的地址是從nGCS4的地址開(kāi)始。S3C2440處理器有NOR和NAND兩種啟動(dòng)模式,當(dāng)選擇從NAND模式啟動(dòng)時(shí),S3C2440會(huì)把NAND Hash的前4K數(shù)據(jù)搬運(yùn)到內(nèi)部稱(chēng)為Steppingstone的硬件中,同時(shí)把Steppingstone映射到地址0X00處,從而啟動(dòng),啟動(dòng)完成后處理器會(huì)把Steppingstone釋放掉以作為他用。U-Boot的一般大小都上100 K,遠(yuǎn)大于4 K,所以實(shí)現(xiàn)從NAND啟動(dòng)的原理就是讓前4K代碼完成基本初始化,重要的是把NAND Flash中的U-Boot代碼復(fù)制到SDRAM中,從而跳到SDRAM中去執(zhí)行。分析可知,S3C2440的該特點(diǎn)為U-Boot從NAND Flash啟動(dòng)提供了可能。本文討論的實(shí)現(xiàn)思路就是依據(jù)此原理。
    源代碼中有/board/smdk2410/U-boot/lds,該文件是U-Boot代碼的鏈接腳本,有如下代碼:
   
    可以看到Text段也就是程序代碼段,被編譯鏈接到OX00地址處,同時(shí)start.S編譯后的目標(biāo)文件start.O被放到text段的第一個(gè)文件處,所以start.S就是程序上電運(yùn)行的第一段代碼,而/cpu/arm920t/start.S這個(gè)匯編文件正是U-Boot的程序代碼入口。因此代碼修改和添加主要在start.S中完成,以此來(lái)保證NAND啟動(dòng)代碼可以在最終程序編譯鏈接所生成的文件的前4K內(nèi)。
    NAND Flash讀寫(xiě)操作比較復(fù)雜,匯編實(shí)現(xiàn)較為麻煩,沒(méi)有C語(yǔ)言簡(jiǎn)單容易,因此用C語(yǔ)言實(shí)現(xiàn)對(duì)NAND的操作復(fù)制工作,最后在start.S中調(diào)用編寫(xiě)的C程序即可。[!--empirenews.page--]
    在/board/smdk2410/中添加boot_init.c文件,在其中實(shí)現(xiàn)nand_reset(nand重置函數(shù))、wait_idle(等待即查詢(xún)?cè)O(shè)備是否讀寫(xiě)就位)、nand_select_chip(片選使能)、nand_dleselect_chip(取消片選)、write_cmd(寫(xiě)命令)、write_addr(寫(xiě)地址)、read_data(讀數(shù)據(jù))、nand_init(nand控制器初始化)這些子函數(shù)和copy2ram函數(shù),同時(shí)在copy2ram中依據(jù)NAND Flash的讀寫(xiě)操作特點(diǎn)來(lái)調(diào)用這些子函數(shù)。具體操作流程如圖2所示。


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


        上面第一段代碼主要是檢測(cè)程序是否已經(jīng)在內(nèi)存中運(yùn)行,如果已經(jīng)在內(nèi)存中,顯然代碼就無(wú)需復(fù)制,程序就會(huì)跳過(guò)復(fù)制階段往后執(zhí)行,第二段是設(shè)定參數(shù),把參數(shù)放入相應(yīng)寄存器,最后調(diào)用copy2ram函數(shù)。
    自此關(guān)于NAND啟動(dòng)的主要代碼修改和添加已經(jīng)完成,但還有很重要的一處需要修改,關(guān)于環(huán)境參數(shù)的存放問(wèn)題。環(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ù)的存放位置,否則無(wú)法復(fù)制到內(nèi)存,從而需要傳遞到內(nèi)核的參數(shù)也就無(wú)法完成傳遞。修改如下:在/include/configs/smdk241-0.h中添加:


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

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

4 結(jié)束語(yǔ)
    針對(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)的原理和修改過(guò)程。修改過(guò)后的U-Boot可以直接從NAND Flash啟動(dòng),這樣就可以摒棄傳統(tǒng)依賴(lài)NOR Flash啟動(dòng)的硬件設(shè)計(jì),使用只依賴(lài)NAND Flash作為存儲(chǔ)器的硬件設(shè)計(jì),從而簡(jiǎn)化電路,給應(yīng)用帶來(lái)極大方便。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶(hù)希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱(chēng),數(shù)字世界的話(huà)語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱(chēng)"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉