新聞中心

        EEPW首頁 > 電源與新能源 > 設計應用 > U-Boot從NAND Flash啟動的實現

        U-Boot從NAND Flash啟動的實現

        作者: 時間:2010-08-05 來源:網絡 收藏

        在/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中依據 的讀寫操作特點來調用這些子函數。具體操作流程如圖2所示。

        本文引用地址:http://www.104case.com/article/180637.htm


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


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


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

        3 U-Boot其他部分修改
        由于所開發的開發板是基于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中定義了各個開發板的ID號,必須要保證所定義的開發板的ID號跟內核一致,否則內核無法啟動。

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


        上一頁 1 2 3 下一頁

        關鍵詞: 實現 啟動 Flash NAND U-Boot

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 甘肃省| 岑巩县| 肥西县| 淮南市| 凌海市| 浠水县| 平陆县| 二连浩特市| 迭部县| 威远县| 兴安县| 永州市| 逊克县| 霍州市| 城步| 日土县| 枣阳市| 遵化市| 临桂县| 固阳县| 林州市| 买车| 南平市| 淳化县| 汾阳市| 福鼎市| 安乡县| 和硕县| 鄂尔多斯市| 高州市| 夏河县| 伽师县| 务川| 灵寿县| 柳林县| 张北县| 布尔津县| 吴忠市| 砚山县| 双流县| 莱西市|