新聞中心

EEPW首頁 > 電源與新能源 > 設(shè)計應(yīng)用 > U-Boot從NAND Flash啟動的實現(xiàn)

U-Boot從NAND Flash啟動的實現(xiàn)

作者: 時間:2010-08-05 來源:網(wǎng)絡(luò) 收藏

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


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

可以看到Text段也就是程序代碼段,被編譯鏈接到OX00地址處,同時start.S編譯后的目標(biāo)文件start.O被放到text段的第一個文件處,所以start.S就是程序上電運行的第一段代碼,而/cpu/arm920t/start.S這個匯編文件正是U-Boot的程序代碼入口。因此代碼修改和添加主要在start.S中完成,以此來保證NAND啟動代碼可以在最終程序編譯鏈接所生成的文件的前4K內(nèi)。
NAND Flash讀寫操作比較復(fù)雜,匯編實現(xiàn)較為麻煩,沒有C語言簡單容易,因此用C語言實現(xiàn)對NAND的操作復(fù)制工作,最后在start.S中調(diào)用編寫的C程序即可。



關(guān)鍵詞: 實現(xiàn) 啟動 Flash NAND U-Boot

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉