1. 程式人生 > >SD卡/iNand操作指令movi

SD卡/iNand操作指令movi

1、SD卡/iNand操作指令movi

(1)開發板如果用SD卡/EMMC/iNand等作為Flash,則在uboot中操作flash的指令為movi(或mmc)

(2)movi的指令都是movi read和movi write一組的,movi read用來讀取iNand到DDR上,movi write用來將DDR的內容寫入iNand中。

(3)movi read {u-boot | kernel} {addr} 這個命令使用了一種通用型的描述方法來描述:大括號中的豎線表示多選一。中括號[]表示可選引數。

(4)指令有很多用法,譬如 movi read u-boot 0x30000000,意思就是把iNand中u-boot分割槽讀出到DDR的0x30000000起始的位置處。(uboot程式碼中將iNand分成很多分割槽,每個分割槽有地址範圍和分割槽名,uboot程式操作中可以直接地址來操作iNand分割槽,也可以使用分割槽名來操作分割槽。);注意這裡的0x30000000也可以直接寫作30000000,意思是一樣子的(uboot的命令列中所有的數字都被預設當成16進位制處理,不管你加不加0x都一樣)。

2、NandFlash操作指令nand

(1)理解方法和操作方法完全類似於movi指令

3、記憶體操作指令:mm、mw、md

(1)DDR中是沒有分割槽的(只聽說過對硬碟、Flash進行分割槽,沒有聽說過對記憶體進行分割槽······),但是記憶體使用時要注意,千萬不能越界踩到別人。因為uboot是一個裸機程式,不像作業系統會由系統整體管理所以記憶體,系統負責分配和管理,系統會保證記憶體不會隨便越界。然後裸機程式中uboot並不管理所以記憶體,記憶體是散的隨便用的,如果是程式設計師(使用uboot的人)自己不注意就可能出現自己的資料給覆蓋了。(所以你思考我們為什麼把uboot放在0x23E00000地址處)

(2)md就是memory display,用來顯示記憶體中的內容。

(3)mw就是memory write,將內容寫到記憶體中

(4)mm就是memory modify,修改記憶體中的某一塊,說白了還是寫記憶體(如果需要批量的逐個單位的修改記憶體,用mm最合適)

4、環境變數如何參與程式執行

(1)環境變數有2份,一份在Flash中,另一份在DDR中。uboot開機時一次性從Flash中讀取全部環境變數到DDR中作為環境變數的初始值,然後使用過程中都是用DDR中的環境變數重新寫入Flash中更新Flash中的環境變數。下次開機時又會從Flash中再讀一次。

(2)環境變數在uboot中是用字串表示的,也就是說uboot是按照字元匹配的方式來區分各個環境變數的。因此用的時候一定要注意不能寫錯字。

5、網路設定:ipaddr servserverip

(1)ipaddr是開發板通過tftp指令去tftp伺服器下載東西是,tftp伺服器的IP地址。

(2)serverip是開發板通過tftp指令去tftp伺服器下載東西是,tftp伺服器的IP地址。

(3)gatewayip是開發板的本地閘道器地址

(4)netmask是子網掩碼

(5)ethaddr是開發板的本地網絡卡的MAC地址。

6、自動執行命令設定:bootcmd

(1)uboot啟動時實際就是在內部執行了bootcmd這個環境變數的值所對應的命令集。

(2)bootcmd=movi read kernel 3000800;bootm 30008000意思是:將iNand的kernel分割槽讀取到DDR記憶體的0x30008000地址處,然後使用bootm啟動命令從記憶體0x30008000處去啟動核心。

(3)在uboot中是沒有作業系統的,因此我們對Flash(相當於硬碟)的管理必須事先使用分割槽界定(實際上在uboot中和kernel中都有個分割槽表,分割槽表就是我們在做系統移植時對Flash的整體分配方法)。有了這個界定後,我們在部署系統時按照分割槽界定方法來部署,uboot和kernel的軟體中也是按照這個分割槽界定來工作,就不會錯。

(4)分割槽方法不是一定的,不是固定的,是可以變動的。但是在一個移植中必須事先設計好定死,一般在設計系統移植時就會定好,定的標準:

uboot:uboot必須從Flash起始地址開始存放(也許是扇區0,也許是扇區1,也許是其他,取決於Soc的啟動設計)