修改uboot使之能保存环境变量

说明:此文也是我在别人的基础上修改的,按照这个步骤新做的uboot,但是重新烧写不但没有成功,反而将我的板子搞成了砖,不过后来把砖弄好了,有机会的话还需要进一步研究。


1、想要保存环境变量,就要使用saveenv命令。由uboot的命令体系可推测saveenv命令对应的函数是do_saveenv,可以在source insight工程直接搜索此函数。


2、找到函数int do_saveenv (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]),发现真正做事的函数是saveenv()函数。

    iTop4412_uboot\common\cmd_nvedit.c
 

         int do_saveenv (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
         {
             extern char * env_name_spec;

            printf ("Saving Environment to %s...\n", env_name_spec);

             return (saveenv() ? 1 : 0);
        }


3、继续找saveenv()函数,发现有很多个,真正的在env_auto.c中。
 

 iTop4412_uboot\common\env_auto.c

 

4、分析uboot,可知INF_REG3_REG的值,走的是else这条路。会发现这里什么都没有做,只有 printf("Unknown boot device\n");

 

5、那我们就添加保存的函数,函数哪里来,就在前面,saveenv_movinand(),这个就是我们需要的函数。

#define INF_REG3_REG        __REG(ELFIN_CLOCK_POWER_BASE + INF_REG3_OFFSET)
#define ELFIN_CLOCK_POWER_BASE    0x7e00f000
#define INF_REG3_OFFSET        0xA0C


6、mmc_init(find_mmc_device(0));检查mmc设备是否存在
  movi_write_env(virt_to_phys((ulong)env_ptr));把要保存的环境变量写进去,没毛病,这是我们想要的,可是这函数里面有个致命的错误。

 

 7、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]保存的才是环境变量。

 

8、init_raw_area_table()函数中,可以直接由raw_area_control的定义间接找到。

 

 9、把raw_area_control.image[2]改成raw_area_control.image[3],下面的movi_read_env函数中把的也要改成raw_area_control.image[3]。

 

10、要修改的是iTop4412_uboot\lib_arm下board.c文件的start_armboot函数里面的env_relocate函数里面的env_relocate_spec。env_relocate_spec这个函数也是在env_auto.c中,把else那条路的use_default();改成env_relocate_spec_movinand();
 


11、进到改成env_relocate_spec_movinand函数中,把#if !defined(CONFIG_S5P_MSHC)注释,别忘了它对应的#endif。

 

12、setup_machine_tags对cmdline的基本处理


 (1)char *from = default_command_line,default_command_line是存放command的数组,默认值由CONFIG_CMDLINE在.config定义。
(2)内核对commandline处理:
一是默认值。
 二是uboot的传参,若传参正确,default_command_line 的值由传参决定,然后复制给boot_command_line。但是看itop的内核源码,在iTop4412_Kernel_3.0\arch\arm\kernel下的atags_parse.c中parse_tag_cmdline函数调用了strlcat(default_command_line, " ", COMMAND_LINE_SIZE);
 strlcat(default_command_line, tag->u.cmdline.cmdline,
COMMAND_LINE_SIZE);  作用是把传进来的cmdline加在后面
 若使用itop提供的uboot是经过修改 ,实现了环境变量的保存的,可以删掉这些,只留下strlcpy(default_command_line, tag->u.cmdline.cmdline,COMMAND_LINE_SIZE);和return 0;就可以保证自己传过来的参数的正确性。parse_tag_cmdline被__tagtable(ATAG_CMDLINE, parse_tag_cmdline)初始化在__tagtable列表,在parse_tags(tags)被执行。

 

 


    

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值