u-boot不接串口不能启动kernel问题

你好!这里是风筝的博客,

欢迎和我一起交流。

JZ2440开发板
u-boot2016.11
kernel4.8.17

我发现不接串口的情况下,不能启动kernel,重新接上串口,发现卡在uboot下,然后我直接把串口用串口线接到充电宝上,发现居然能启动了。
我当时在想,难道要给串口供电才能吗?不应该啊,没见过这种说法。
后来发现,应该是不接串口的话,在u-boot倒计时阶段受到了干扰,让u-boot误以为有按键按下,不自动启动kernel:
u-boot里倒计时的代码如下:

static int __abortboot(int bootdelay)
{
    int abort = 0;
    unsigned long ts;

#ifdef CONFIG_MENUPROMPT
    printf(CONFIG_MENUPROMPT);
#else
    printf("Hit any key to stop autoboot: %2d ", bootdelay);
#endif

    /*
     * Check if key already pressed
     */
    if (tstc()) {   /* we got a key press   */
        (void) getc();  /* consume input    */
        puts("\b\b\b 0");
        abort = 1;  /* don't auto boot  */
    }

    while ((bootdelay > 0) && (!abort)) {
        --bootdelay;
        /* delay 1000 ms */
        ts = get_timer(0);
        do {
            if (tstc()) {   /* we got a key press   */
                abort  = 1; /* don't auto boot  */
                bootdelay = 0;  /* no more delay    */
# ifdef CONFIG_MENUKEY
                menukey = getc();
# else
                (void) getc();  /* consume input    */
# endif
                break;
            }
            udelay(10000);
        } while (!abort && get_timer(ts) < 1000);

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

    putc('\n');

    return abort;
}

其中,tstc函数就是检测是否获得按键,然后getc函数取出按键。
这里我们可以改写成只有获取空格时才取消启动kernel,否则一律启动kernel:

static int __abortboot(int bootdelay)
{
    int abort = 0;
    unsigned long ts;

#ifdef CONFIG_MENUPROMPT
    printf(CONFIG_MENUPROMPT);
#else
    printf("Hit any key to stop autoboot: %2d ", bootdelay);
#endif

    /*
     * Check if key already pressed
     */
    if (tstc()) {   /* we got a key press   */
        puts("\b\b\b 0");
        if(' ' == getc())/*add 2017.10.17*///if got space
            abort = 1;  /* don't auto boot  */
    }

    while ((bootdelay > 0) && (!abort)) {
        --bootdelay;
        /* delay 1000 ms */
        ts = get_timer(0);
        do {
            if (tstc()&&(' ' == getc()) ) {//add kite 2017.10.17//if got space
                abort  = 1; /* don't auto boot  */
                bootdelay = 0;  /* no more delay    */
# ifdef CONFIG_MENUKEY
                menukey = getc();
# else
                //(void) getc();delete 2017.10.17  /* consume input */
# endif
                break;
            }
            udelay(10000);
        } while (!abort && get_timer(ts) < 1000);

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

    putc('\n');

    return abort;
}

这样,我们不接串口的情况下,也不会干扰到我们启动kernel了

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
1. JTAG(Joint Test Action Group):一种用于调试和测试电子设备的标准口。JTAG口可以让开发人员在不破坏设备硬件的情况下进行非侵入式的调试和测试。 2. BLX(Branch with Link and eXchange):ARM处理器指令之一,用于跳转到指定地址并将跳转前的地址保存到寄存器中。 3. MVN(Move Not):ARM处理器指令之一,用于对指定的寄存器进行按位取反的操作。 4. LR(Link Register):ARM处理器寄存器之一,用于存储跳转前的地址。 5. CPSR(Current Program Status Register):ARM处理器寄存器之一,用于存储当前程序的状态信息,如执行模式、中断使能状态、条件码等。 6. SPSR(Saved Program Status Register):ARM处理器寄存器之一,用于存储上一个程序的状态信息。 7. BSP(Board Support Package):嵌入式系统中的一种软件层,用于提供硬件抽象层、驱动程序、Bootloader等功能,使操作系统能够运行在特定的硬件平台上。 8. SOC(System on Chip):一种集成度很高的片上系统,包含了处理器、内存、IO等多个功能模块,用于实现嵌入式系统的功能。 9. LKM(Loadable Kernel Module):一种Linux内核模块,可以动态地加载到内核中,扩展内核功能。 10. JFFS(Journaling Flash File System):一种针对闪存设计的文件系统,通过日志技术提高了文件系统的可靠性和性能。 11. YAFFS(Yet Another Flash File System):一种针对闪存设计的文件系统,具有高效的垃圾回收机制和快速的文件系统恢复能力。 12. GPIO(General Purpose Input/Output):通用输入输出口,用于连外部设备和嵌入式系统中的处理器。 13. IIC(Inter-Integrated Circuit):一种串行通信协议,用于连多个设备,并通过两根信号线进行数据传输。 14. U-Boot:一种常用的嵌入式系统Bootloader,用于加载操作系统和应用程序。 15. Thumb状态:ARM处理器的一种指令集,用于优化代码密度。 16. Thumb-2EE状态:ARM处理器的一种指令集,扩展了Thumb指令集,并提供了更多的指令和功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值