公司近期采购了一批OMAPL138EZWTD4的板子,大部分内核无法启动,少量可以启动。
定位发现,启动到clocksource.c的
Switching to clocksource timer0_1
后,
timekeeper_setup_internals函数的
clock->cycle_last = clock->read(clock);
卡住不能继续往下走。
进一步调试,在多个地方读timer0_1的寄存器。如下:
2.990000] after serial8250_register_ports[ 2.990000] after platform_driver_register[ 2.990000] tcr=800080
[ 2.990000] time34=448645f
[ 2.990000] regulator: core version 0.5
[ 2.990000] NET: Registered protocol family 16
[ 3.040000] before serial8250_probe:serial8250_register_port
[ 3.040000] in serial8250_register_port
[ 3.040000] serial8250.0: ttyS0 at MMIO 0x1c42000 (irq = 25) is a 16550A
[ 3.040000] in tty_register_device:ttyS0
[ 3.040000] before serial8250_probe:serial8250_register_port
[ 3.040000] in serial8250_register_port
[ 3.040000] serial8250.0: ttyS1 at MMIO 0x1d0c000 (irq = 53) is a 16550A
[ 3.050000] console [ttyS1] enabled
[ 3.060000] in tty_register_device:ttyS1
[ 3.060000] before serial8250_probe:serial8250_register_port
[ 3.070000] in serial8250_register_port
[ 3.070000] serial8250.0: ttyS2 at MMIO 0x1d0d000 (irq = 61) is a 16550A
[ 3.080000] in tty_register_device:ttyS2
[ 3.210000] init_bio
在init_bio里面试图读取TCR寄存器,同样会出现卡住不动的情况。
代码为:
static int __init init_bio(void)
{
bio_slab_max = 2;
bio_slab_nr = 0;
bio_slabs = kzalloc(bio_slab_max * sizeof(struct bio_slab), GFP_KERNEL);
if (!bio_slabs)
panic("bio: can't allocate bios\n");
printk("init_bio\n");
{
u32 temp = *((u32*)(0xfec20000 + 0x20));
printk("tcr=%x\n", temp);
temp = *((u32*)(0xfec20000 + 0x14));
printk("time34=%x\n", temp);
}
请教一下可能是什么原因呢?
Tony Tang:
这是uboot吗?
这种代码本身不会有问题,所谓的卡住不动,应该是芯片挂了。所以从系统稳定性的角度去考虑,比如电源,时钟,DDR等是否稳定。
你也可以将主频降下来试试结果有变化没有。