手里有两块板子,第一块CPU的型号为OMAPL138A,第二块为OMAPL138B,其他都是一样的,很奇怪的是同一个Linux内核在第一批的板子上启动正常,但是在第二批板子上启动却停在booting kernel这里不动了,即使用最新版本的内核编译后同样不能启动。
然后再Uboot里通过查看__log_buf里面的启动信息,并且在内核里增加调试信息,经过一番周折发现,L138A与L138B的jtag_id不同。L138A的JTAG ID :0x0b7d102f,L138B的JTAG ID:0x1b7d102f。导致Linux启动的时候验证JTAG ID不能通过。而最新的手册里面也没有提到相关内容。不知道新出的芯片为什么要这样设计,不知道是不是BUG。
找到了问题所在,这样只要修改一行代码即可解决问题,打开内核源码包下的arch/arm/mach-davinci/common.c文件。在davinci_common_init函数中,找到:
84 davinci_soc_info.jtag_id = __raw_readl(davinci_soc_info.jtag_id_base);
这句代码就是从CPU的寄存器中读取JTAG ID,只需要将它改成:
84 davinci_soc_info.jtag_id = 0xb7d102f;
然后保存退出,重新编译内核,即可启动成功。