修改uboot使之能保存環境變量
思路與步驟:
1.想要保存環境變量,就要使用saveenv命令
2.由uboot的命令體系可推測saveenv命令對應的函數是do_saveenv,可以在sourceinsight工程直接搜索此函數
3.找到函數int do_saveenv (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]),發現真正做事的函數是saveenv()函數
4.繼續找saveenv()函數,發現有很多個,真正的在env_auto.c中
5.分析uboot,可知INF_REG3_REG的值,如果沒記錯INF_REG3_REG = 7的,所以走的是else這條路
6.你會發現這里什么都沒有做,只有 printf("Unknown boot device\n");
7.那我們就添加保存的函數,函數哪里來,就在前面,saveenv_movinand(),這個就是我們需要的函數
8.你以為這就完了,不存在的,進去看看它做了什么
9. mmc_init(find_mmc_device(0));檢查mmc設備是否存在
movi_write_env(virt_to_phys((ulong)env_ptr));把要保存的環境變量寫進去,沒毛病,這是我們想要的,可是這函數里面有個致命的錯誤
10.movi_write(raw_area_control.image[2].start_blk,
raw_area_control.image[2].used_blk, addr);我們源碼中把要保存的環境變量保存到raw_area_control.image[2]中,但實際上uboot的分區是
raw_area_control.image[3]保存的才是環境變量
11.在哪看分區信息?init_raw_area_table()函數中,可以直接由raw_area_control的定義間接找到
12.把raw_area_control.image[2]改成raw_area_control.image[3],大功告成。
2018年5月23
DGY(編)
|