使用JTAG接口调试和恢复华为ONT的准备工作

本文作为之前华为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串口执行命令进行操作 (一般用于救砖) 。

《使用JTAG接口调试和恢复华为ONT的准备工作》有7条评论

  1. 仔细拜读了你的大作“华为光猫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的初始值和方向,默认即可。
      官方介绍如下:

      Config命令:ftdi_layout_init data direction
      指定FTDI GPIO数据和方向寄存器的初始值。 每个值是一个16位数字,对应于高和低FTDI GPIO寄存器的串联。 应根据适配器的示意图选择值,以便将所有信号设置为安全级别,并且对目标系统的影响最小。 避免浮动输入,冲突输出和初始置位的复位信号。

      ftdi_layout_signal nSRST -oe 0x0040
      ftdi_layout_signal ntRST -oe 0x0010
      这两个用不到,用于指定nSRST和nTRST引脚的参数。
      详细的可以参考OpenOCD用户手册。

      回复
    • 这个是配置采样TDO数据在TCK的上升沿还是下降沿。
      主要是提高设备在高TCK频率下的稳定性的。
      见官方介绍:

      Configure TCK edge at which the adapter samples the value of the TDO signal

      Due to signal propagation delays, sampling TDO on rising TCK can become quite peculiar at high JTAG clock speeds. However, FTDI chips offer a possibility to sample TDO on falling edge of TCK. With some board/adapter configurations, this may increase stability at higher JTAG clocks.

      – rising, sample TDO on rising edge of TCK – this is the default
      – falling, sample TDO on falling edge of TCK

      翻译如下:
      配置适配器采样TDO信号值的TCK边沿

      由于信号传播的延迟,在高JTAG时钟速度下,在上升的TCK上采样TDO可能会变得很特殊。 但是,FTDI芯片提供了在TCK下降沿采样TDO的可能性。 对于某些板/适配器配置,这可以提高较高JTAG时钟的稳定性。

      – rising,在TCK的上升沿采样TDO,这是默认设置
      – falling,在TCK的下降沿采样TDO

      回复
  2. 谢谢回复。
    1、这个值是不是在高速时钟情况下使用?
    adapter_khz 30000
    2、问下多少才算高速?
    3、低速 adapter_khz 1000 情况下使用
    “ftdi_tdo_sample_edge falling”
    会不会有问题。
    4、有没有对这个值的建议

    回复
    • 高速时钟没有一个具体的定义,FT2232H芯片最大输出的JTAG时钟速度为30MHz,即30000KHz。
      低速使用,没有长时间测试过,要分析这个估计还得挂逻辑分析仪来测试。
      TCK的时钟速度,没有建议,取决于目标CPU能接受的最大JTAG速度,全靠猜和试。

      回复

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据