Using OpenOCD with BeagleBoard-xM

from http://www.jonmasters.org/blog/2010/12/13/using-openocd-with-beagleboard-xm/

Using OpenOCD with BeagleBoard-xM

NOTE: This is an extremely technical blog post intended only for very serious embedded Linux developers. It was written mostly for the benefit of Google. I wish that this posting had existed over the weekend when I was looking at this.

So I now have several Texas Instruments BeagleBoard-xM boards based upon the TI DM37x series Cortex-A8 based SoC. The “xM” is an improvement on the original BeagleBoard that features the improved DM3730 in place of the original OMAP3530. Like its predecessor, the DM37x series includes Texas Instruments’ on-chip “ICEpick” JTAG TAP controller that can be used to selectively expose various additional JTAG TAPs provided by other on-chip devices. This facilities selective exposure of these devices (which may not be present in the case of the “AM” version of the chip, or otherwise might be in a low-power or otherwise disabled state), because it is nice to be able to ignore devices we don’t want to play with today. The ICEpick itself can handle up to 16 devices, although the majority of those are “reserved” for the scarily more complex days of tomorrow. If you want some of the details, refer to chapter 27 of the DaVinci Digital Media Processor Technical Reference Manual (TRM) (under “User Guides”).

The full possible DM37x JTAG chain contains the following devices (in OpenOCD ordering, from TDO to TDI – the inverse of the physical ordering of the bus, which starts with the ICEpick at 0 and ends with the DAP at 3): DAP (Debug Access Port), Sequencer (ARM968), DSP, D2D, ICEpick. It’s the last device in the chain that we really care about because it is through the Debug Access Port that we will poke at the system memory address space and registers within the Cortex-A8 processor. At Power ON, the default JTAG chain configuration will depend upon the strapping of the EMU0 and EMU1 lines (which are exposed on the Flyswatter as jumpers adjacent to the JTAG ribbon cable). If both of these lines are high (pins 1-2 not 0-1 on the Rev-B Flyswatter, i.e. nearest to the ribbon cable) – which they had better be if you want an “out of the box experience” – then the only device to appear in the chain will be the ICEpick. OpenOCD is expecting this, because it contains special macro functions that will instruct the ICEpick through its control command registers to expose any additional TAPs after initialization (we actually only want the DAP in the default case, which is how OpenOCD will behave for you if you don’t change it). Each time a new TAP is exposed, the OpenOCD JTAG logic will do the necessary state transition for it to take effect (for the chain to lengthen or contract according to devices appearing and disappearing in the chain).

The default upstream version of OpenOCD does not work with BeagleBoard-xM at the moment (as of v0.4.0-651-gc6e0705 – last modification on December 8th) because some logic was recently added to master that attempts to handle busticated DAP ROM addresses on a Freescale (not Texas Instruments) IMX51 processor, which is very similar to the DM37x. Due to this “fixup”, the DM37x’s correctly provided ROM table information will be “fixed” to use the wrong DAP address, which won’t work. For the moment, find the following loop in src/target/arm_adi_v5.c:
/* Some CPUs are messed up, so fixup if needed. */
for (i = 0; i < sizeof(broken_cpus)/sizeof(struct broken_cpu); i++)
if (broken_cpus[i].dbgbase == dbgbase &&
broken_cpus[i].apid == apid) {
LOG_WARNING("Found broken CPU (%s), trying to fixup "
"ROM Table location from 0x%08x to 0x%08x",
broken_cpus[i].model, dbgbase,
broken_cpus[i].correct_dbgbase);
dbgbase = broken_cpus[i].correct_dbgbase;
break;
}

Wrap it with a #if 0 (and don't forget to also comment or define away the definition of "i") such that it won't take effect. Then, if you have a Rev-B xM you will also need to edit the file tcl/target/amdm37x.cfg to add a new TAPID for the undocumented revision recently made to the ICEpick on these TI parts (this is backward compatible with the Rev-A because it will now look for both):
...
switch $CHIPTYPE {
dm37x {
# Primary TAP: ICEpick-C (JTAG route controller) and boundary scan
set _JRC_TAPID 0x0b89102f
set _JRC_TAPID1 0x1b89102f
}
...
...
# Primary TAP: ICEpick - it is closest to TDI so last in the chain
jtag newtap $_CHIPNAME jrc -irlen 6 -ircapture 0x1 -irmask 0x3f /
-expected-id $_JRC_TAPID -expected-id $_JRC_TAPID1

Then make and install the OpenOCD binaries (ensure you have the free FTDI libraries installed, and configure with “configure –enable-maintainer-mode –enable-ft2232_libftdi”). You can now use OpenOCD with the xM revA or B.

Jon.

### 解决 'Can't change session's transport after the initial selection was made' 错误的办法 该错误通常是由于在初始选择会话传输方式后又尝试更改所导致的,以下是具体解决办法: - **检查配置文件**:确保在配置文件中没有多次选择传输方式。例如,不能在文件中先使用 `transport select swd`,之后又使用 `transport select hla_swd`。要保证只进行一次传输方式的选择。以稚晖君的配置文件为例: ```plaintext # choose st-link/j-link/dap-link etc. #adapter driver cmsis-dap source [find interface/stlink.cfg] transport select hla_swd source [find target/stm32f1x.cfg] # download speed = 10MHz adapter speed 10000 ``` 在这个配置文件中,只进行了一次 `transport select hla_swd` 的操作,避免了重复选择传输方式[^3]。 - **检查命令行参数**:如果在命令行中启动OpenOCD,要确保没有在命令行中重复指定传输方式。例如,不能既在配置文件中选择了一种传输方式,又在命令行中使用 `-c "transport select ..."` 来尝试更改传输方式。 - **重新编写配置文件**:如果配置文件比较复杂,存在多处可能更改传输方式的地方,可以尝试重新编写配置文件,简化结构,确保只在一处明确指定传输方式。 - **检查版本兼容性**:虽然OpenOCD 0.12.0一般不存在重大的传输方式选择的兼容性问题,但也可以检查一下使用的硬件(如stlink-V2等)与该版本的OpenOCD是否完全兼容。如果存在兼容性问题,可以尝试更新或回退OpenOCD版本。 - **检查硬件连接**:确保硬件连接正确,有时候不稳定的硬件连接可能会导致OpenOCD在运行过程中出现异常,进而引发该错误。检查连接线是否插好,硬件设备是否正常工作。 ### 配置文件的选择 配置文件既可以使用项目根目录下的,也可以使用OpenOCD中的,具体取决于实际需求: - **使用项目根目录下的配置文件**:当项目有特定的配置需求,与其他项目不同,或者需要针对该项目进行个性化配置时,建议在项目根目录下创建配置文件。这样可以将配置文件与项目代码进行版本控制,方便团队协作和项目迁移。 - **使用OpenOCD中的配置文件**:OpenOCD自带了许多常见硬件和调试器的配置文件,存放在其 `scripts` 目录下。如果项目使用的是常见的硬件和调试器,且不需要进行特殊配置,可以直接使用OpenOCD中的配置文件,通过 `-f` 参数指定相应的配置文件路径。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值