更新系統固件的一種思路

    記得以前曾經做過WINCE下面利用EBOOT從SD卡讀取文件系統更新NAND種的文件,已實現在文件系統被破壞的情況下,用戶可以自己還原,那麼如果是LINUX系統呢?

    思路是一樣:UBOOT啓動至第2階段(沒有自啓動系統)-----------判斷是否更新內核和文件系統--------------如果接收到了用戶命令則從SD卡拷貝文件寫入NAND指定位置;反之,則啓動系統

    重點是怎麼接收到用戶指令和從SD卡種拷貝文件;

   

    在UBOOT運行至第2階段的時候:lib_arm/board.c中調用common/main.c下的main_loop函數

這裏會做兩個判斷,調用static __inline__ int abortboot(int bootdelay)
函數,判斷是否有用戶中斷,如果有則進入死循環,接收用戶命令,並根據命令,調用相應的函數處理

 

如果你下載過android系統文件,你肯定知道會有類似nand write c0008000 600000 300000等命令,來寫入文件;上面run_command函數 這個函數就是處理類似這樣的命令,具體實現可以查看代碼各函數功能,

既然是讓客戶自更新,我們也不能讓客戶按照我們測試人員一樣,打開串口信息,一行行敲命令吧,那就完蛋了。。。。

所以我們可以在這裏加入我們的更新系統的提示!-------------(1)用戶觸發更新系統中斷;(2)接收中斷,調用run_command函數處理事件(將SD卡種文件寫入NAND指定位置)

 

對於步驟1;我們可以採用讀取某個I/O口狀態來判斷是否更新系統;

 

對於步驟2:關鍵是加入我們的處理函數,告訴系統“要從SD卡讀取文件寫入NAND”

這裏就需要了解下run_command函數了

 

流程:處理宏定義,分析命令和參數 , 查找是否有命令 ,執行命令

 

我們可以通過nand write c0008000 600000 300000這個命令來了解整個過程

 

common/cmd_nand.c下 U_BOOT_CMD(nand, CONFIG_SYS_MAXARGS, 1, do_nand..............................下有命令的說明

相應的NAND驅動中就有具體的實現;

 

重要函數:

/* Look up command in command table */
  if ((cmdtp = find_cmd(argv[0])) == NULL)

cmd_tbl_t *find_cmd (const char *cmd)
這裏會遍歷所有結構體集合

find_cmd 函數原型

 

 

所以我們可以定義我們自己的U_BOOT_CMD

類似

U_BOOT_CMD(
 SD, 2, 1, DO_SD,
 "xxxxxxxx/n",
 "xxxxxxxxxxx /n"
 "     -xxxxxxxxxx/n"
);

然後定義DO_SD函數即可

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章