EDA365电子论坛网

标题: 如何itop修改uboot使之能保存环境变量 [打印本页]

作者: cscscwwwrte    时间: 2021-11-4 13:21
标题: 如何itop修改uboot使之能保存环境变量
如何itop修改uboot使之能保存环境变量,希望各位能指点指点,谢谢!!
作者: Houseefe    时间: 2021-11-4 13:34
                               修改uboot使之能保存环境变量
& E5 s8 ]3 e- L思路与步骤:
0 ?( j6 Q3 J, T. u: q. l2 u! r3 M# H; x# c" n- c# P
        1.想要保存环境变量,就要使用saveenv命令
1 K; K: e* H3 U4 j, F
0 Z( L; f' B+ Z: P! D% K$ K5 r        2.由uboot的命令体系可推测saveenv命令对应的函数是do_saveenv,可以在sourceinsight工程直接搜索此函数
/ u6 d2 z9 M1 H4 x       - O( c: R! `! ~/ I) G' X# j( B, |
        3.找到函数int do_saveenv (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]),发现真正做事的函数是saveenv()函数/ C% a6 t7 u9 T, ]
      
. e" ^; \4 j; p% v' \7 `; P        4.继续找saveenv()函数,发现有很多个,真正的在env_auto.c中& j0 n) I: l% y" U: J
      
/ [; w7 h( P8 G& E& H        5.分析uboot,可知INF_REG3_REG的值,如果没记错INF_REG3_REG = 7的,所以走的是else这条路' p) m' {) X9 ~$ a/ J
      
+ w9 ?! u* B7 f1 t4 H( E- J6 P        6.你会发现这里什么都没有做,只有 printf("Unknown boot device\n");
  \7 e, I2 w5 {1 {# i       ( u3 o: Y$ p- M3 \
        7.那我们就添加保存的函数,函数哪里来,就在前面,saveenv_movinand(),这个就是我们需要的函数
* @0 z& Z, d: S- R+ A8 g5 u      
- Y+ |6 B; s/ [5 C        8.你以为这就完了,不存在的,进去看看它做了什么0 k. B1 }7 |( R" p6 q) B
      
; J, b( {/ L# ]" M; B        9. mmc_init(find_mmc_device(0));检查mmc设备是否存在
$ C; l* ]/ ?% r. m       movi_write_env(virt_to_phys((ulong)env_ptr));把要保存的环境变量写进去,没毛病,这是我们想要的,可是这函数里面有个致命的错误: d4 C4 R) h  P4 {( ^
      
8 e& E, k8 x7 l$ f% ^9 @# h        10.movi_write(raw_area_control.image[2].start_blk,
4 U. a2 @4 t, a7 H1 A0 A4 d                raw_area_control.image[2].used_blk, addr);我们源码中把要保存的环境变量保存到raw_area_control.image[2]中,但实际上uboot的分区是! y# d5 y0 a; L+ D: ~  `
                raw_area_control.image[3]保存的才是环境变量6 w4 i9 `9 P( ?) c, u
      
. J% b; Q6 w! \1 ^        11.在哪看分区信息?init_raw_area_table()函数中,可以直接由raw_area_control的定义间接找到3 z9 S4 ^/ q) m5 Q
       / H; e: m/ U2 i& z- j% T# ]3 h  b& t
        12.把raw_area_control.image[2]改成raw_area_control.image[3],大功告成。




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2