本文作为之前华为HG8245H救砖笔记系列文章的一些补充。
硬件篇
当前OpenOCD支持的JTAG适配器,性价比最高的当属FT2232H系列的模组。
本文就是基于FT2232H开发板利用OpenOCD进行JTAG调试的。
建议选择有开放电路图的模组,这样方便排查问题。
我使用FT2232H模组如下图:
相关资料托管在GitHub上:https://github.com/arm8686/FT2232HL-Board
FT2232H的芯片,有两个通道,分别是A和B。每个通道都可以当做一个JTAG适配器来使用 (FT232H只有1个通道、FT4232H有4个通道) 。
每个通道又有两条总线:分别是DBUS、CBUS。2个通道的各条总线,又分别叫做ADBUS、ACBUS、BDBUS、BCBUS。每条总线又包含8个Pin(IO引脚)。
通过FTDI官方提供的库,可以配置各个通道的工作模式,默认情况下,如果需要将某通道作为JTAG接口来使用,需要配置为MPSSE模式。在MPSSE模式下,JTAG接口的主要4个信号TCK、TDI、TDO 、TMS ,分别是该通道DBUS的0~3 Pin(OpenOCD下的JTAG通信不一定将通道配置为MPSSE模式,也有可能是Bit-Bang模式)。
关于我使用的开发板FT2232H的Pin定义(FT2232HL & FT2232HQ),可参考下图:
芯片的详细资料,可以自行查看数据手册:https://www.ftdichip.com/Support/Documents/DataSheets/ICs/DS_FT2232H.pdf
软件篇
在Windows下,如果要让OpenOCD能正常访问到FT2232H设备,还需要替换FT2232H的默认驱动 (因为OpenOCD是通过libftdi和libusb来访问设备的,Windows下FTDI的默认驱动在OpenOCD无法正常工作) 。替换驱动的工具推荐使用Zadig。
操作步骤如下:
1. 运行Zadig工具:
2. 在菜单里勾选 List All Devices :
3. 选择FT2232H开发板的2个设备通道:
4. 选择 WinUSB 驱动,并点击 Replace Driver 替换默认驱动为WinUSB(Interface 0对应通道A, Interface 1对应通道B,可以根据实际情况进行选择替换):
5. 操作成功后,界面反馈如下:
FT2232H设备的驱动替换完成之后,建议重新插拔下设备。
为了测试OpenOCD能否连接到FT2232H设备,需要编写个FT2232H的配置文件来测试下:
ft2232h.cfg :
#
# FT2232H
#
interface ftdi
ftdi_vid_pid 0x0403 0x6010
ftdi_channel 1
ftdi_tdo_sample_edge falling
ftdi_layout_init 0x0508 0x0f1b
adapter_khz 1200
transport select jtag
简单介绍下上面的配置文件,interface 这个命令用于指定JTAG适配器的接口类型,我用的是FT2232H的设备,所以参数是ftdi。ftdi_vid_pid 用于指定FT2232H设备的VID、PID。因为FTDI官方有提供工具可以更改设备的VID、PID的,这个默认即可。ftdi_channel 用于指定使用的通道,0 代表通道A,1代表通道B,我这里是使用通道B来作为JTAG适配器。ftdi_layout_init 用于配置GPIO的初始值和方向,默认即可。详细的命令说明可以参见OpenOCD官方用户手册的调试适配器配置章节:Debug Adapter Configuration。
这时试运行下,cmd输入”openocd.exe -f ft2232h.cfg“:
Open On-Chip Debugger 0.10.0
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
ftdi samples TDO on falling edge of TCK
adapter speed: 1200 kHz
Error: libusb_open() failed with LIBUSB_ERROR_NOT_SUPPORTED
Info : clock speed 1200 kHz
Warn : There are no enabled taps. AUTO PROBING MIGHT NOT WORK!!
Error: JTAG scan chain interrogation failed: all ones
Error: Check JTAG interface, timings, target power, etc.
Error: Trying to use configured scan chain anyway…
Warn : Bypassing JTAG setup events due to errors
Warn : gdb services need one or more targets defined
虽然有出现”Error: libusb_open() failed with LIBUSB_ERROR_NOT_SUPPORTED” 字样的错误提示,但其实是正常的,OpenOCD没有退出就代表连接上设备了。
上面脚本只是测试FT2232H设备能否成功连接上,要JTAG调试目标设备,还需要写一个target的配置文件,之前调试HG8245H,已经写过一个sd5115的配置文件,可以直接拿来用。
需要使用FT2232H设备作为JTAG适配器来调试华为ONT,可以用以下命令:
openocd.exe -f ft2232h.cfg -f hi_sd5115_jtag.cfg
JTAG调试华为ONT有几点注意事项:
华为部分ONT的JTAG存在一个DBGSEL(也叫JTAG_SEL)的引脚,该引脚在上电时必须上拉到3.3V,不然芯片的JTAG不会启用。
华为的UBoot和Kernel会禁用JTAG,所以一般正常的猫,JTAG连接上去没几秒钟,JTAG就会断开,OpenOCD里会输出如下错误提示:
Error: Invalid ACK (7) in DAP response
Error: JTAG-DP STICKY ERROR
要避免UBoot和Kernel和关闭JTAG,有几种办法:
1. 破解UBoot和Kernel,然后刷入ONT里(一般用于调试目的)。
2. 上电时将Flash的CE引脚上拉到3.3V,让CPU在上电时找不到可引导的设备,然后通过OpenOCD来模拟初始化硬件,并加载破解的UBoot(破解掉关闭JTAG和UBoot的命令行)到内存运行,然后用UART串口执行命令进行操作 (一般用于救砖) 。
仔细拜读了你的大作“华为光猫HG8245H救砖笔记(1)-(6)”,文章图文并茂,非常有教学意义。
我也买了你本文提到的FTDI 2232H 的板子,有个问题问下:
关于ftdi 2232 在openocd的配置文件
———————————–
# https://blog.csersoft.net/archives/596 使用JTAG接口调试和恢复华为ONT的准备工作
# FT2232H
#
interface ftdi
ftdi_vid_pid 0x0403 0x6010
ftdi_channel 1
ftdi_tdo_sample_edge falling
ftdi_layout_init 0x0508 0x0f1b
adapter_khz 1200
transport select jtag
——————————————
# https://blog.csersoft.net/archives/83 Windows下基于FT2232H的OpenOCD调试环境配置
# FT2232H
#
interface ftdi
ftdi_vid_pid 0x0403 0x6010
adapter_khz 12000
# ftdi_tdo_sample_edge falling
transport select jtag
ftdi_layout_init 0x0508 0x0f1b
# ftdi_layout_signal nTRST -data 0x0200 -noe 0x0100
# ftdi_layout_signal nSRST -data 0x0800 -noe 0x0400
—————————————————-
# https://blog.csersoft.net/archives/147 华为光猫HG8245H救砖笔记④为HG8245H配置OpenOCD调试环境
# FT2232H
#
telnet_port 14444
tcl_port 16666
interface ftdi
# ftdi_device_desc “FT2232H Board”
ftdi_vid_pid 0x0403 0x6010
adapter_khz 30000
ftdi_tdo_sample_edge falling
ftdi_layout_init 0x0508 0x0f1b
# ftdi_layout_signal nTRST -data 0x0200 -noe 0x0100
# ftdi_layout_signal nSRST -data 0x0800 -noe 0x0400
——————————————-
以上三个配置文件是你的博文中用到的3个不同的配置文件,
在我买的板卡中还有一种配置文件,如下:
————————————-
#
# FT2232HL for openOCD Device
#
# According to the sch file, it uses BDBUS.
#
interface ftdi
ftdi_vid_pid 0x0403 0x6010
# ftdi_channel 0 is port ADBUS, ftdi_channel 1 is port BDBUS.
ftdi_channel 1
transport select jtag
adapter_khz 1000
ftdi_layout_init 0x00F8 0x00fb
ftdi_layout_signal nSRST -oe 0x0040
ftdi_layout_signal ntRST -oe 0x0010
————————————————–
我想问问:
1、你用的配置
ftdi_layout_init 0x0508 0x0f1b
这句配置代表什么意思
2、配置文件
ftdi_layout_signal nSRST -oe 0x0040
ftdi_layout_signal ntRST -oe 0x0010
的意思
谢谢!
ftdi_layout_init 这个本文里就有介绍: 用于配置GPIO的初始值和方向,默认即可。
官方介绍如下:
ftdi_layout_signal nSRST -oe 0x0040
ftdi_layout_signal ntRST -oe 0x0010
这两个用不到,用于指定nSRST和nTRST引脚的参数。
详细的可以参考OpenOCD用户手册。
还有
ftdi_tdo_sample_edge falling
这句配置的意思。
谢谢
这个是配置采样TDO数据在TCK的上升沿还是下降沿。
主要是提高设备在高TCK频率下的稳定性的。
见官方介绍:
翻译如下:
配置适配器采样TDO信号值的TCK边沿
由于信号传播的延迟,在高JTAG时钟速度下,在上升的TCK上采样TDO可能会变得很特殊。 但是,FTDI芯片提供了在TCK下降沿采样TDO的可能性。 对于某些板/适配器配置,这可以提高较高JTAG时钟的稳定性。
– rising,在TCK的上升沿采样TDO,这是默认设置
– falling,在TCK的下降沿采样TDO
谢谢回复。
1、这个值是不是在高速时钟情况下使用?
adapter_khz 30000
2、问下多少才算高速?
3、低速 adapter_khz 1000 情况下使用
“ftdi_tdo_sample_edge falling”
会不会有问题。
4、有没有对这个值的建议
高速时钟没有一个具体的定义,FT2232H芯片最大输出的JTAG时钟速度为30MHz,即30000KHz。
低速使用,没有长时间测试过,要分析这个估计还得挂逻辑分析仪来测试。
TCK的时钟速度,没有建议,取决于目标CPU能接受的最大JTAG速度,全靠猜和试。
谢谢