关闭

让uboot按下指定键停止autoboot

标签: u-bootbootloader
1776人阅读 评论(0) 收藏 举报
分类:

本博客转载于:http://blog.chinaunix.net/uid-13889805-id-1641961.html


默认uboot是按下任意键停止autoboot,有人觉得不爽,害怕终端操作用户误操作,要指定特殊按键

这个功能很简单,例如要按下ESC键,停止自动boot
只需要添加
  1. #define CONFIG_AUTOBOOT_KEYED 1
  2. #define CONFIG_AUTOBOOT_PROMPT "Press ESC to abort autoboot in %d seconds"
  3. #define CONFIG_AUTOBOOT_DELAY_STR "linux"
  4. #define CONFIG_AUTOBOOT_STOP_STR "\x1b"
即可,0x1B就是ESC的ascii码

在2008.10等高版本uboot上这样做就可以了,低版本的倒计时有些问题,以下是我在uboot1.3.4上的修改
  1. #if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)
  2. if defined(CONFIG_AUTOBOOT_KEYED)
  3. static __inline__ int abortboot(int bootdelay)
  4. {
  5.     int abort = 0;
  6.     unsigned int start_tick = get_ticks();
  7.     uint64_t t1=endtick(1);

  8.     uint64_t etime = endtick(bootdelay);
  9.     struct {
  10.         char* str;
  11.         u_int len;
  12.         int retry;
  13.     }
  14.     delaykey [] = {
  15.         { str: getenv ("bootdelaykey"), retry: 1 },
  16.         { str: getenv ("bootdelaykey2"), retry: 1 },
  17.         { str: getenv ("bootstopkey"), retry: 0 },
  18.         { str: getenv ("bootstopkey2"), retry: 0 },
  19.     };

  20.     char presskey [MAX_DELAY_STOP_STR];
  21.     u_int presskey_len = 0;
  22.     u_int presskey_max = 0;
  23.     u_int i;

  24. # ifdef CONFIG_AUTOBOOT_PROMPT
  25.     printf(CONFIG_AUTOBOOT_PROMPT,bootdelay);
  26.     printf("\b\b\b\b\b\b\b\b\b");
  27. # endif

  28. # ifdef CONFIG_AUTOBOOT_DELAY_STR
  29.     if (delaykey[0].str == NULL)
  30.         delaykey[0].str = CONFIG_AUTOBOOT_DELAY_STR;
  31. # endif
  32. # ifdef CONFIG_AUTOBOOT_DELAY_STR2
  33.     if (delaykey[1].str == NULL)
  34.         delaykey[1].str = CONFIG_AUTOBOOT_DELAY_STR2;
  35. # endif
  36. # ifdef CONFIG_AUTOBOOT_STOP_STR
  37.     if (delaykey[2].str == NULL)
  38.         delaykey[2].str = CONFIG_AUTOBOOT_STOP_STR;
  39. # endif
  40. # ifdef CONFIG_AUTOBOOT_STOP_STR2
  41.     if (delaykey[3].str == NULL)
  42.         delaykey[3].str = CONFIG_AUTOBOOT_STOP_STR2;
  43. # endif

  44.     for (= 0; i < sizeof(delaykey) / sizeof(delaykey[0]); i ++) {
  45.         delaykey[i].len = delaykey[i].str == NULL ?
  46.                  0 : strlen (delaykey[i].str);
  47.         delaykey[i].len = delaykey[i].len > MAX_DELAY_STOP_STR ?
  48.                  MAX_DELAY_STOP_STR : delaykey[i].len;

  49.         presskey_max = presskey_max > delaykey[i].len ?
  50.                  presskey_max : delaykey[i].len;

  51. if DEBUG_BOOTKEYS
  52.         printf("%s key:<%s>\n",
  53.          delaykey[i].retry ? "delay" : "stop",
  54.          delaykey[i].str ? delaykey[i].str : "NULL");
  55. # endif
  56.     }

  57.     /* In order to keep up with incoming data, check timeout only
  58.      * when catch up.
  59.      */

  60.     while (!abort && get_ticks() <= etime) {
  61.         for (= 0; i < sizeof(delaykey) / sizeof(delaykey[0]); i ++) {
  62.             if (delaykey[i].len > 0 &&
  63.              presskey_len >= delaykey[i].len &&
  64.              memcmp (presskey + presskey_len - delaykey[i].len,
  65.                  delaykey[i].str,
  66.                  delaykey[i].len) == 0) {
  67. if DEBUG_BOOTKEYS
  68.                 printf("got %skey\n",
  69.                  delaykey[i].retry ? "delay" : "stop");
  70. # endif

  71. # ifdef CONFIG_BOOT_RETRY_TIME
  72.                 /* don't retry auto boot */
  73.                 if (! delaykey[i].retry)
  74.                     retry_time = -1;
  75. # endif
  76.                 abort = 1;
  77.                 printf("\n");
  78.             }
  79.         }
  80.         
  81.         if(get_ticks() > t1)
  82.         {
  83.             bootdelay--;
  84.             printf("%d\b",bootdelay);
  85.               
  86.              t1=endtick(1);
  87.         }
  88.         
  89.         if (tstc()) {            
  90.             if (presskey_len < presskey_max) {
  91.                 
  92.                 presskey [presskey_len ++] = getc();
  93.             }
  94.             else {
  95.                 for (= 0; i < presskey_max - 1; i ++)
  96.                     presskey [i] = presskey [+ 1];
  97.                 
  98.                 presskey [i] = getc();
  99.             }
  100.         }
  101.     }
  102. if DEBUG_BOOTKEYS
  103.     if (!abort)
  104.         puts("key timeout\n");
  105. # endif

  106. #ifdef CONFIG_SILENT_CONSOLE
  107.     if (abort)
  108.         gd->flags &= ~GD_FLG_SILENT;
  109. #endif

  110.     return abort;
  111. }

  112. else    /* !defined(CONFIG_AUTOBOOT_KEYED) */
0
0
查看评论

让uboot按下指定键停止autoboot

默认uboot是按下任意键停止autoboot,有人觉得不爽,害怕终端操作用户误操作,要指定特殊按键 这个功能很简单,例如要按下ESC键,停止自动boot 只需要添加 #define CONFIG_AUTOBOOT_KEYED 1 #define CONFIG_AUTOBOOT_PR...
  • mirkerson
  • mirkerson
  • 2013-01-04 12:01
  • 3782

设定按键将uboot启动时停止autouboot

以下是通过按空格键停止autoboot: #define CONFIG_AUTOBOOT_KEYED 1 #define CONFIG_AUTOBOOT_PROMPT  \         "Pres...
  • qq_29729577
  • qq_29729577
  • 2017-01-17 19:47
  • 464

uboot中main_loop下bootdelay_process实现

common/autoboot.c CONFIG_AUTOBOOT   const char *bootdelay_process(void) {  char *s;  int bootdelay; #ifdef CONFIG_BOOTCOUNT_LIMIT ...
  • sunlei0625
  • sunlei0625
  • 2017-03-16 08:32
  • 257

自定义组合按键进入Uboot

uboot源码中提供的进入uboot命令行的方式为输入任意键。这样有一个隐患,当串口信号有干扰时,系统会将干扰信号识别为任意键而进入uboot,从而无法正常引导操作系统,这样对产品将是灾难性的影响。 解决或者规避该问题的方法之一是将任意键改为组合键减小异常几率,当然归根结底还是要从硬件的角度避免干...
  • messidona11
  • messidona11
  • 2017-03-23 12:02
  • 7096

(4.2)uboot详解——外部中断(GPIO)

看ARM 处理器的芯片原理图,除了一些特殊的外接功能引脚外,GPIO引脚占了绝大部分。GPIO是General Purpose Input Output (通用输入/输出),外设都是连接到这些引脚上面的,所以可以简单的说,我们想让一个处理器实现什么样的功能,直接依赖于对GPIO寄存器的操作。
  • lee244868149
  • lee244868149
  • 2015-11-13 09:01
  • 1785

UBOOT中断功能初步分析之----按键中断

以前一直有个疑问,在U-boot下到底能不能使用中断,为了验证这个问题,于是乎,昨天晚上我在自己的 TQ2440开发板上进行了uboot环境下的按键中断实验,这次使用的我刚移植的最新版Uboot,版本是 u-boot-2014-04,验证的结论是: U-boot完全能够支持中断 下面就以...
  • luoguoxian12
  • luoguoxian12
  • 2017-12-09 09:16
  • 30

Linux内核移植 part2:uboot bootdelay参数

uboot启动时会进入倒计时,如果倒计时时间内没有受到按键信息,那么自动执行启动命令。这个等待时间(启动延迟)称作:bootdelay。以环境变量的形式存在于uboot,通过配置CONFIG_BOOTDELAY可以设置这个变量。在移植exynos4412 uboot的时候,找了好一会儿才发现这个默认...
  • abcamus
  • abcamus
  • 2016-12-23 17:59
  • 1491

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

今天干了一件糗事,设置uboot的启动延时参数bootdelay,忘了怎么写了,于是就写了set bootdelay = 5,然后save了一下,然后,然后就悲剧了。。。。。。bootdelay参数直接设置成了0。。。。于是板子一上电就直接启动,疯狂敲空格也没用。。。进入不了uboot界面,也就没法...
  • yanbixing123
  • yanbixing123
  • 2016-08-24 15:28
  • 1005

uboot 启动流程分析(二) — 第二阶段

在 uboot 第一阶段启动完成后将会调用 start_armboot 开始第二阶段的启动流程,这个阶段的代码由 c 语言编写,分析如下: 一、基础数据结构 第二阶段主要用到了两个数据结构即 gd_t 和 bd_t,其定义如下: /* 全局数据结构 */ typedef struct...
  • g_salamander
  • g_salamander
  • 2013-01-04 17:51
  • 8365

嵌入式学习-uboot-lesson11-按键中断

一、中断处理流程分析1.中断概念CPU在工作的过程中,经常需要与外设进行交互,交互的方式包括”轮询方式”,”中断方式”。 轮询方式: CPU不断地查询设备的状态。该方式实现比较简单,但CPU利用率很低,不适合多任务的系统。 中断方式: CPU在告知硬件开始一项工作后,就去做别的事去了,当硬件...
  • u011003120
  • u011003120
  • 2016-07-05 19:36
  • 1921
    个人资料
    • 访问:277301次
    • 积分:5341
    • 等级:
    • 排名:第6034名
    • 原创:111篇
    • 转载:127篇
    • 译文:148篇
    • 评论:14条
    最新评论