1. 程式人生 > >向nandflash中燒寫核心和檔案系統的方法

向nandflash中燒寫核心和檔案系統的方法

在RAM開發板上往nandflash燒寫核心和檔案系統的方法:

一、           在u-boot中燒寫檔案系統:(其中這裡的地址參考具體開發板使用手冊中的地址,SBC6345)

a)       在系統啟動的時候,u-boot會提示有三秒中停留,敲擊回車中斷u-boot啟動核心的過程,可以使用u-boot的相關命令,擦除nandflash的部分空間,使用命令nand erase 0x9a0000,命令的含義是將nandflash中從0x9a0000開始的所有空間進行擦除

b)       整理nandflash空間,這個步驟可有可無,命令為nand scrub 0x9a0000在出現選擇的時候直接點選Y

c)       下載檔案系統到記憶體,使用tftp下載檔案系統到記憶體的某地址,命令為tftp0x70000000 rfs,

tftp伺服器的搭建和使用可以參考這篇文章,如果下載不成功,可能出現的錯誤有:tftp伺服器沒有搭建成功、需要修改檔案的讀寫許可權

d)       將下載到記憶體中的檔案系統寫入nandflash,命令nandflash write.yaffs 0x700000000x9a0000 filesize 命令中的引數說明,第一個是從記憶體的某個地址下載,第二個是從nandflash的某個地址開始寫,第三個是檔案系統的大小。第三個引數通過上一個步驟可以看到,嚴格按照tftp下載完成後提供的16進位制的大小。

上面是舉例說明的是從u-boot中燒寫檔案系統部分,從u-boot中燒寫核心的方法和燒寫檔案系統的方法相似。比如在u-boot中燒寫的核心檔案為uImage

a)     Tftp 0x70000000 uImage  從tftp伺服器中下載核心到記憶體中

b)     Nand erase 0x1a0000 0x200000  清除nandflash的空間從0x1a0000到0x3a0000

c)     Nand write 0x70000000 0x1a0000 0x200000 從記憶體中的地址讀取核心到nandflash的位置,讀取的大小在最後一個引數中。

如果在寫入nandflash後,上電啟動u-boot不能啟動核心,可能的原因有:核心檔案不匹配、寫入的地址不匹配(這個問題可以參考這篇文章)。遇到這個問題以後,同時還需要啟動核心,可以參考的方法就是在u-boot內將uImage下載到核心,直接使用u-boot的go命令來啟動核心,然後核心掛載檔案系統。

二、           從核心中往nandflash中燒寫核心的方法

a)       在核心裡面對存放kernel的分割槽先進行擦除(可以擦除的原因是現在核心已經在記憶體中,nandflash中的核心已經沒有作用了),然後再進行燒寫核心檔案,具體過程為,先輸入cat /proc/mtd 可以看到核心對nand flash的分割槽資訊,然後對核心分割槽部分進行擦除(例如檢視到分割槽資訊中核心的位置在mtd5中):命令flash_eraseall /dev/mtd5

b)       然後將待燒寫的核心檔案(uImage)拷貝至nfs的根目錄下(nfs的安裝和使用的方法,參考這篇文章),在終端輸入下面命令將核心檔案拷貝至nandflash對應的分割槽,cp /uImage  /dev/mtdblock5。完成即代表燒寫完畢。為啥是一個mtd5一個是mtdblock5

c)       在上面燒寫完畢核心後,需要在uboot裡面修改bootcmd來告訴uboot從nandflash啟動核心,修改命令為setenv bootcmd 'nand read0x70000000(dest addr)  0x1A0000(存放核心的nand flash偏移地址)  0x200000(要拷貝的核心大小);bootm 0x70000000'

這個是在需要對燒寫到nandflash中的核心進行更新的時候使用的方法。

、不同的啟動不同的引數設定

1、如果是掛載nfs的話,在u-boot引數設定上的命令如下:

(setenv bootargs 'mem=80M console=ttySAC6,115200n8 root=/dev/nfsnfsroot=192.168.5.122:/home/rfsip=192.168.5.12:192.168.5.122:192.168.5.1:255.255.255.0::eth0:off')

u-boot命令設定setenv bootcmd ‘tftp 0x70000000 uImage;bootm 0x70000000 ‘

2、如果是從nandflash中啟動的話,設定引數問題就有所不同,setenvbootargs ‘console=ttySAC6 115200 tft=b root=/dev/mtdblock7 rw rootfstype=yaffs2

u-boot中的命令setenvbootcmd ‘nand read  0x70000000(讀到記憶體中的位置) 0x1a0000(從nandflahs的這個地方開始讀取) 0x200000(讀取檔案的大小)’

 解析:檔案系統燒寫到nandflash中,燒寫的地址為0x9a0000,但是核心怎麼知道檔案系統的地址呢,u-boot傳送給核心的,在root/dev/mtdblock7,這個位置就是告訴了檔案系統的地址。但是這個地址是核心已經準備好的,所在的目錄在核心原始碼中/arch/arm/

在將板子的所有東西寫到nandflash中,這個時候如果在串列埠終端上進行檢視是看不到內容的(燒寫到nandflash中不像是使用nfs掛載檔案系統),特別是檔案系統,需要將檔案系統掛載到某個目錄上去。比如:mount /dev/mtdblock5 /mnt/nand 這裡假設檔案系統在nandflash中是mtdblock5,這樣就可以看到寫到板子裡的檔案系統。(但是不知道是不是這樣)

在板子上檔案系統內的某個程式需要更新,新的程式在nfs的某個目錄上。這樣就可以使用掛載nfs到板子檔案系統的某個目錄上  mount –t nfs-0 nolock 192.168.5.122:/home/rfs /mnt/temp將nfs的目錄掛載到板子上面。這樣就可以在板子上看到虛擬機器上的檔案系統了。可以從nfs上拷貝東西到板子上,進而更新板子上的程式碼。(這一點很像上面介紹的更新已將燒寫到nandflash中的核心)

其實在u-boot啟動之後,在u-boot中還是可以啟動u-boot的,比如在u-boot中進行中斷,tftp 0x70000000 u-boot-new.bin 使用tftp將u-boot下載到記憶體中,然後直接執行go 0x70000000 就可以直接執行記憶體的這個地址,其實這些命令都是u-boot內部支援的,比如展示記憶體資訊的命令 md 清除記憶體資訊的命令 mm等。