u-boot不接串列埠不能啟動kernel問題

Love Lenka發表於2017-10-17

你好!這裡是風箏的部落格,

歡迎和我一起交流。

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了

相關文章