当bootdelay误设置为0时的解决办法

今天干了一件糗事,设置uboot的启动延时参数bootdelay,忘了怎么写了,于是就写了set bootdelay = 5,然后save了一下,然后,然后就悲剧了。。。。。。bootdelay参数直接设置成了0。。。。于是板子一上电就直接启动,疯狂敲空格也没用。。。进入不了uboot界面,也就没法使用nand erase params来擦除保存的环境参数了,very 悲剧,于是乎就学习了关于这一块的知识:

下面转自:http://blog.chinaunix.net/uid-23474571-id-195487.html

在开发板上配置UBOOT环境变量时,不小心误把BOOTDELAY设置为0,这样就不能在开发板启动后进入配置环境,也就无法将BOOTDELAY修改回来。
   首先想利用AXD在线下载原始UBOOT镜像到SDRAM,在线运行后来进入配置环境修改参数,但是实际进行后发现,虽然AXD在线在SDRAM中跑正常 UBOOT,但是UBOOT启动的时候还是读取了存取在FLASH中的BOOTARGS参数信息,依然时BOOTDELAY为0,所以这样子也行不通。
   这时候我想到去UBOOT源代码中修改关于BOOTDELAY的相关代码功能,以让其在启动过程中不读取FLASH中的BOOTARGS参数。
   PS:在请教师兄后,师兄也提出了和我想的一样的方法,同时还有一个方法就是在AXD中对FLASH进行擦除操作,但是这里就要涉及到FLASH操作的很多内容,也比修改代码要复杂,如果以后要研究FLASH的操作的话,可以考虑尝试下。

   BOOTDELAY参数的功能函数位置在 /common/main.c 中,找到:

static __inline__ int abortboot(int bootdelay)

   注意:在main.c中有两段同名的abortboot函数,通过预处理来进行选择,分析函数内容可以知道是第二个函数。
   首先修改了判断是否自启动的信号变量abort,修改如下:

int abort = 1;        /* wuwei have changed this : the old is "abort = 0" ! */
                      /* The value of abort define autoboot by 0 and unautoboot by 1 */

   然后通过预处理去掉接在后面的bootdelay判断处理函数:

#if 0        /*wuwei closed blow code , let uboot not to juge bootdelay*/

#ifdef CONFIG_MENUPROMPT

……

printf ("\b\b\b%2d ", bootdelay);

#endif

   这样修改后UBOOT就在启动后停着等待用户输入命令,不进行BOOTDELAY的倒计时过程了。

*******************************   更新   *******************************************

   根据师兄的指导,了解到参数的位置在 0x20000 ~ 0x3ffff 之间,也就是接在uboot程序所在的 0x0 ~ 0x1ffff 区间的后面,uboot启动时先读取该区间段的参数,如果没有,就按照源码中 config 文档中的默认配置。
阅读(180) | 评论(0) | 转发(0) |
0

上一篇:GNU的编译器和调试工具

下一篇:ARM的启动和中断向量表

相关热门文章
  • SHTML是什么_SSI有什么用...
  • 卡尔曼滤波的原理说明...
  • shell中字符串操作
  • 关于java中的“错误:找不到或...
  • linux设备驱动归纳总结...
  • linux dhcp peizhi roc
  • 关于Unix文件的软链接
  • 求教这个命令什么意思,我是新...
  • sed -e "/grep/d" 是什么意思...
  • 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议

你可能感兴趣的:(嵌入式)