现在的位置: 首页 > 综合 > 正文

更新系统固件的一种思路

2012年02月26日 ⁄ 综合 ⁄ 共 7711字 ⁄ 字号 评论关闭

    记得以前曾经做过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函数即可

 

 

 

 

抱歉!评论已关闭.