當前位置:首頁 > 嵌入式 > 嵌入式軟件
[導讀]U-Boot從NAND Flash啟動的實現

摘要:U-Boot不能從NAND Flash啟動給應用帶來些不便,因此修改U-Boot使其支持從NAND Flash啟動。分析了U-Boot啟動流程的兩個階段及實現從NAND Flash啟動的原理和思路,并根據NAND Flash的物理結構和存儲特點,增加U-Boot對NAND Flash的操作支持,從而完成把存儲在NAND Flash上的U-Boot代碼復制到SDRAM中執(zhí)行,實現從NAND Flash的啟動。修改過后的U-Boot可以直接從NAND Flash啟動,給應用帶來便利。
關鍵詞:U-Boot;NAND Flash;Boofloader;S3C2440;移植

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

1 U-Boot簡介及流程分析
    U-Boot,全稱universal boot loader,是遵循GPL條款的開放源代碼項目??梢砸龑Ф喾N操作系統,支持多種架構的CPU。它支持如下操作系統:Linux、NetBSD、VxWorks等,支持如下架構的CPU:PowerPC、MIPS、X86、ARM、NIOS、XSeale等,同時支持NFS掛載,是一個功能豐富的BootLoader。它的整個程序框架清晰,易于移植,許多設計人員將自己的移植代碼上傳到網站(http://sourceforge.net/project-s/u-boot/) 上,更新速度很快。目前的版本是1.1.6,本論文正是采用此版本進行說明,U-Boot的目錄結構參見U-Boot源代碼。

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

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


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


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


        上面第一段代碼主要是檢測程序是否已經在內存中運行,如果已經在內存中,顯然代碼就無需復制,程序就會跳過復制階段往后執(zhí)行,第二段是設定參數,把參數放入相應寄存器,最后調用copy2ram函數。
    自此關于NAND啟動的主要代碼修改和添加已經完成,但還有很重要的一處需要修改,關于環(huán)境參數的存放問題。環(huán)境參數緊隨著U-Boot在NAND Flash中存放,在其之后是內核鏡像文件。在U-Boot的第二階段中有個名為env.relocate的函數,它會把環(huán)境參數復制到RAM中,而環(huán)境參數中需要向Linux內核傳遞的參數會在內核啟動前重新構建成標記列表,同時把該標記列表放在跟內核約定好的地址處。因此必須指明環(huán)境參數的存放位置,否則無法復制到內存,從而需要傳遞到內核的參數也就無法完成傳遞。修改如下:在/include/configs/smdk241-0.h中添加:


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

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

4 結束語
    針對U-Boot不支持從NAND啟動的缺點,對其進行修改。添加了關于NAND Flash的操作函數和支持從NAND啟動的函數。本文詳細闡述了U-Boot從NAND肩動的原理和修改過程。修改過后的U-Boot可以直接從NAND Flash啟動,這樣就可以摒棄傳統依賴NOR Flash啟動的硬件設計,使用只依賴NAND Flash作為存儲器的硬件設計,從而簡化電路,給應用帶來極大方便。

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

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數字化

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

關鍵字: 汽車 人工智能 智能驅動 BSP

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

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數據產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

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

關鍵字: 華為 12nm 手機 衛(wèi)星通信

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

關鍵字: 通信 BSP 電信運營商 數字經濟

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

關鍵字: VI 傳輸協議 音頻 BSP

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

關鍵字: BSP 信息技術
關閉
關閉