你好!這裡是風箏的部落格,
歡迎和我一起交流。
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
if (tstc()) {
(void) getc();
puts("\b\b\b 0");
abort = 1;
}
while ((bootdelay > 0) && (!abort)) {
--bootdelay;
ts = get_timer(0);
do {
if (tstc()) {
abort = 1;
bootdelay = 0;
# ifdef CONFIG_MENUKEY
menukey = getc();
# else
(void) getc();
# 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
if (tstc()) {
puts("\b\b\b 0");
if(' ' == getc())
abort = 1;
}
while ((bootdelay > 0) && (!abort)) {
--bootdelay;
ts = get_timer(0);
do {
if (tstc()&&(' ' == getc()) ) {
abort = 1;
bootdelay = 0;
# ifdef CONFIG_MENUKEY
menukey = getc();
# else
# endif
break;
}
udelay(10000);
} while (!abort && get_timer(ts) < 1000);
printf("\b\b\b%2d ", bootdelay);
}
putc('\n');
return abort;
}
這樣,我們不接串列埠的情況下,也不會干擾到我們啟動kernel了