停在uboot或者系统起来之后,可以用mtvtool或者graffito tool读下对应register的值看是否有被改了。
如果要monitor可以参考下面的方法。
//
在 mboot 中添加监测点,为了在开机阶段就抓到异常的点。
在 mboot 中用 ac 命令添加寄存器 watchpoint,开机阶段如果寄存器被修改,就可以打印出修改的调用栈,从而定位是谁修改的。
命令格式:
ac hwwp io,,repeat
ac loglevel 7
(注:需要开 loglevel 7 才能看到 log)
reg_addr 计算公式:
计算公式
reg_addr = 0x1F000000 + (bank << 9) + (offset <<2)
#或者
reg_addr = 0x1F000000 + (bank * 512) + (offset * 4)
offset 是基于 16bit 的。
以 9629上GPIO的 bank_3229_34 为例,base address 是 0x1F000000,计算结果就是:
0x1F000000 + (0x3229 << 9) + (0x34 << 2) = 0x1f6452d0
ac hwwp io,0x1f6452d0,repeat
ac loglevel 7
设置之后,重启,在 log 中搜 mt_perf ,就可以看到每次修改该寄存器值的调用栈,方便快速定位到寄存器被谁修改了。
[ 5.134447] mt_perf: The monitored value in addr fd6452d0 is 0
[ 5.140302] mt_perf: stacktrace for swapper/0-1:
[ 5.144958] mt_perf: [c08cd57c] HalSdio_Platform_InitChiptop+0x4c/0x3a0
[ 5.151597] mt_perf: [c08cbcac] HalSdio_Init+0x38/0x78
[ 5.156756] mt_perf: [c08cb1d4] mmc_sdio_probe+0x2c/0x1d8
[ 5.162178] mt_perf: [c065546c] platform_drv_probe+0x7c/0xb4
[ 5.167858] mt_perf: [c0652f78] really_probe+0x218/0x2c0
[ 5.173190] mt_perf: [c06531f4] driver_probe_device+0x70/0x1bc
[ 5.179042] mt_perf: [c0653430] __driver_attach+0xf0/0xf4
[ 5.184459] mt_perf: [c0650d1c] bus_for_each_dev+0x78/0xc4
[ 5.189963] mt_perf: [c0652860] driver_attach+0x2c/0x30
[ 5.195207] mt_perf: [c0652284] bus_add_driver+0x1ac/0x224
[ 5.200798] mt_perf: The monitored value in addr fd6452d0 is 1
[ 5.206666] mt_perf: stacktrace for swapper/0-1:
[ 5.211320] mt_perf: [c08cd594] HalSdio_Platform_InitChiptop+0x64/0x3a0
[ 5.217959] mt_perf: [c08cbcac] HalSdio_Init+0x38/0x78
[ 5.223118] mt_perf: [c08cb1d4] mmc_sdio_probe+0x2c/0x1d8
[ 5.228537] mt_perf: [c065546c] platform_drv_probe+0x7c/0xb4
[ 5.234218] mt_perf: [c0652f78] really_probe+0x218/0x2c0
[ 5.239551] mt_perf: [c06531f4] driver_probe_device+0x70/0x1bc
[ 5.245394] mt_perf: [c0653430] __driver_attach+0xf0/0xf4
[ 5.250811] mt_perf: [c0650d1c] bus_for_each_dev+0x78/0xc4
[ 5.256316] mt_perf: [c0652860] driver_attach+0x2c/0x30
[ 5.261559] mt_perf: [c0652284] bus_add_driver+0x1ac/0x224
|