記得以前曾經做過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函數即可