|
|
修改uboot使之能保存环境变量
) u4 W4 H! c/ ^* q8 V思路与步骤:% i' g5 p7 b: E+ n
) Q2 s y3 ]1 k& }/ {( u. k4 b- o9 E
1.想要保存环境变量,就要使用saveenv命令1 N& X3 f x9 \: F* n
% ]* R# A8 d# j5 l 2.由uboot的命令体系可推测saveenv命令对应的函数是do_saveenv,可以在sourceinsight工程直接搜索此函数
5 X& ]$ I7 Y+ L1 S* y
' E! K% x& o% H0 z% R; L3 A 3.找到函数int do_saveenv (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]),发现真正做事的函数是saveenv()函数" t8 Z" i: m3 M) ^
# m5 K* \. }7 b$ t" ~
4.继续找saveenv()函数,发现有很多个,真正的在env_auto.c中0 m5 N, M$ `" o- j" a5 a$ O
/ _0 x% e) [, T7 Z+ v7 e7 B
5.分析uboot,可知INF_REG3_REG的值,如果没记错INF_REG3_REG = 7的,所以走的是else这条路
9 W) r6 p# c( j4 V
% \, ~7 g, N+ C 6.你会发现这里什么都没有做,只有 printf("Unknown boot device\n");( K! o. k: U, q9 e
) l* R! h6 J+ C) g% b/ ~4 u
7.那我们就添加保存的函数,函数哪里来,就在前面,saveenv_movinand(),这个就是我们需要的函数" h0 f' _3 r( P3 a8 O
) T( X! X) c! F0 M 8.你以为这就完了,不存在的,进去看看它做了什么3 N$ y4 y7 d2 U3 ?5 B
$ }9 l! T( Z( ~2 k6 H* ~8 T
9. mmc_init(find_mmc_device(0));检查mmc设备是否存在 k$ p/ o( O- V2 ~% \- y; X# ?
movi_write_env(virt_to_phys((ulong)env_ptr));把要保存的环境变量写进去,没毛病,这是我们想要的,可是这函数里面有个致命的错误
3 r6 T7 }% S0 f, g8 i; R
* H# W7 m! \, O4 N# @ 10.movi_write(raw_area_control.image[2].start_blk,3 Q' E3 J/ x# W
raw_area_control.image[2].used_blk, addr);我们源码中把要保存的环境变量保存到raw_area_control.image[2]中,但实际上uboot的分区是
# R0 Y- O% j9 S# v- A' E raw_area_control.image[3]保存的才是环境变量
3 V V6 q+ Q1 Y* j4 t0 U - S) m8 f( c1 e; P7 v6 V! J
11.在哪看分区信息?init_raw_area_table()函数中,可以直接由raw_area_control的定义间接找到
@. C2 x3 y& |3 p5 J( { R0 K: y. f& P$ Z: e
12.把raw_area_control.image[2]改成raw_area_control.image[3],大功告成。 |
|