今天拿到牛人提供的仿真器了:山寨Multi-ICE,据说当年价值好几大千的神器!
神器不愧是神器:装好驱动立即就可以用,一番跟踪就发现程序在0x1424处陷入死循环了。
这就引出了一个问题:
eboot的0x1424处到底是哪里?
于是再次拉出IDA PRO,又是一番折腾:。。。。
有eboot.pdb但是ida没法使用,真是遗憾。
map文件的使用
mapsym.exe
然后IDC-》-》loadsym.idc
sym加载进来了但是还是不太正常,
一番查看,得到了一个大概的调用路径
Reset_Handler
SUB_10D4
13F4
1424
IDA->EDIT->Rebase Program,根据xxx重新定位程序,这样操作的目的是为了让IDA中的地址和AXD中的一致。
找到对应位置,问题代码块:
INITCLKS
;;;;;;;;;;;;;;;;
; Preload r4 for the workaround located just below the next section
ldr r4, =B0_STEPPING ;Preload R4 for Comparison located after the next IF section
; ... and write the core clock config register
;
ldr r1, =CCCR_BASE_PHYSICAL
str r2, [r1]
;...IF :LNOT: :DEF: B0_Cotulla
; cmp r9, r4 ; R4 should've been preloaded just before the above IF section with B0 VAL
; beq OSCC_OON_DONE ; If we're not running on B0 silicon, skip this work around
;by silentmj
b OSCC_OON_DONE
; ~~~B0 errata: 32K OSC not functional~~~
; enable the 32Khz oscillator for RTC and PowerManager
;
ldr r1, =OSCC_BASE_PHYSICAL
mov r2, #OSCC_OON
str r2, [r1]
; **
; **NOTE: Spin here until OSCC.OOK get set,
; meaning the 32KHz PLL has settled.
; **
60
ldr r2, [r1]
ands r2, r2, #1
beq %B60
;... ENDIF ; B0_COTULLA
OSCC_OON_DONE
回家后我反复阅读相关的源码和手头上的资料,发现BSP不少地方都对不同STEPING的PXA255进行了区别处理。 原来硬件也和软件一样会存在BUG,呵呵。
上网查了查供应信息,市面上的PXA255片子似乎基本都是A0 STEPING的。看来暂时不用考虑不同STEPING之间的差异了。
对比了目标板的LINUX bootloader源码之后,决定直接跳过这段代码。
重新编译EBOOT,开JFLASH准备烧写。
这才发现山寨Multi-ICE居然不能用jflash(和牛人确认之后得知确实不能)。于是我就只好仿真程序用山寨Multi-ICE,烧程序用简易JTAG这么来回折腾了,囧啊。
)GPIO初始化代码修改
XSC1BD.INC
解决了死循环的问题,顺带又对照着LINUX版的BOOTLOADER源码修改了GPIO的初始化部分。
)串口初始化功能代码的修改
XSBase255的调试信息输出到BTUART,而我们目标板
使用的FFUART,因此需要做相应修改。
忙活整整一天,快下班的时候,总算看到了EBOOT的串口输出信息。赶紧测试能否用PB下载NK.BIN,居然可以,哈哈,真把我高兴坏了!
最终卡在InitClock处了,明天根据原理图修改之。
还存在的问题:
做出修改之后需要重新编译整个系统,如何加速。