Angelic47 / MT7688-OpenOCD

OpenOCD configuration for MT7688AN/MT7688KN/MT7628x
38 stars 26 forks source link

数码之家原帖地址在哪 #1

Closed QGB closed 1 year ago

QGB commented 1 year ago
故事背景:

MT76x8系列soc已经出现了很长时间了, 这是一个面向物联网、路由器、智能硬件等市场提供的一颗MIPS soc, 最大的亮点是外设丰富(spi、i2c、i2s、usb、sdio、emmc等等几乎齐了), 而且已经有大量现成的固件可以使用.

虽然这颗soc已经如此流行, 但网上关于这颗芯片的相关资料却寥寥无几, 一旦刷成砖将是一个非常头疼的问题, 就算可以将flash焊下来, 也不容易找到有效的编程器固件. 何况, 有时候flash还不是那么容易就拆下来……弄掉个焊盘就更好玩了……

[本帖由Angelic47发表于数码之家, 恶意转载将视为侵权行为]

而刷砖在所难免, 半年前我的一个MT7688AN核心板就惨遭刷错固件而变砖, 想将flash拆下却发现flash在屏蔽罩下方……无奈只好作罢.

就在即将放弃的那天晚上, 我突然想起这是一颗mtk的soc, 按照mtk的习惯, 芯片应该会存在一个JTAG调试接口, 那么, 这个接口会在哪呢? 又该如何使用呢?

Our story begin.

什么是JTAG:

先介绍下什么是JTAG, 各位dalao、julao们请直接跳过本段.

撇开复杂的定义不谈, 通俗的说, JTAG是一种调试接口, 与我们平常所说的ttl接口有一定相似之处. 相同点是, 这些接口都是厂商所预留的, 如果这些接口被引出, 则我们可以很轻松的连线并使用这些接口对设备进行控制.[本帖由Angelic47发表于数码之家, 恶意转载将视为侵权行为]

而不同点是, ttl的接口是路由器作为主机, 而PC机作为从机. 而JTAG接口则刚好反过来, 路由器作为从机, PC作为主机.

这分别是意味着什么? 如果flash未焊接, 或者flash内的数据完全错误, 此时设备将不存在任何可执行代码, 这时, 由于ttl接口只是bootloader提供的一种交互方式, 而此时bootloader根本不存在, ttl接口将不会有任何输出, 也就是我们的硬砖.

而JTAG则不然, JTAG是集成在芯片内部的一组调试电路, 即使芯片完全没有任何程序, JTAG仍然可以一步步控制芯片, 从而逐步恢复一台硬砖的设备.

如果说的再明白点, 那就是——ttl是一台电脑, 你的PC机充当显示器; 而JTAG是调试机, 你PC机下发的命令, 芯片将无条件予以执行.

JTAG在哪? 上哪去找JTAG?

这正是这个文章所要说的.

JTAG和ttl接口有些不同, 一般来说, 厂商为了返修和调试方便, 均会将ttl接口引出, 这样一来, 拆开设备外壳细心观察电路板, 总能发现预留的vcc、gnd、txd、rxd. 用万用表打个表一测, 基本上接口定义就出来了.

而JTAG却大不相同, 由于芯片的引脚数量有限, JTAG一般都被复用做了其他功能, 这使得不参考专业资料的情况下, 很难利用观察和测量的方式找到JTAG接口.[本帖由Angelic47发表于数码之家, 恶意转载将视为侵权行为]

而MTK比较厚道, 该soc的datasheet有对外公开版本, 我们可以直接去阅读datasheet来找到JTAG接口的所在位置.

可以看得出, JTAG居然是网线接口的5个led……

而这个芯片的138脚即是复位信号 —— 138 PORST_N.

如何使用JTAG?

即使找到了JTAG接口, 距离正确使用JTAG下载uboot到内存依然是非常遥远.

由于每个芯片都有不一样的内部寄存器结构, 而JTAG只是一种接口标准, 因此我们即使接通了JTAG, 也必须找到正确的方式将uboot下载到内存中并执行.

话不多说, 先按照上面的方式接好JTAG线缆. 说了那么多, 你一定想问的是: ttl可以用usb转ttl小板来接,那JTAG到底应该使用什么东西来接线?

一种方式是我们可以使用J-LINK等正规调试器来连接JTAG接口, 而J-LINK一个可不便宜, 也并不是人人都有(没错, 我也没有).

而另一种更为有效的办法是, 使用一台正常的路由器或开发板, 安装OpenOCD, 利用GPIO来软件模拟JTAG协议……好吧, 只要你的路由器是openwrt的, 那理论上都能通过自带的软件包管理器下载到openocd, 而io口……还记得那几个led灯么? 那可是天然的io口哦~~

因为我们从来不缺各种路由器或者开发板, 可以发现, 使用路由器或者开发板来充当JTAG调试器将是一个非常好的选择, 当然, J-LINK的用户也可以安装OpenOCD, 只是需要修改下通讯方式罢了.[本帖发表于数码之家由Angelic47原创, 恶意转载将视为侵权行为]

于是乎, 我这里随手摸了一台OrangePi作为调试平台(非广告, 实话说这个板子非常不好用, wifi做的不好, 信号很差), 用于调试目标板. 实战贴将过几天后放出, 这里主要分享调试思路.

线已接好, 如何使用:

OpenOCD需要一个相应的配置文件来适配对应的CPU, 关于MT76x8的soc, 我已将配置文件、内存uboot、使用方式全部写好并提交至github:

接下来的内容请直接前往github查看, 不需要再复制一遍. 顺便, 求个star~

其他话:

这些步骤看似简单, 实际上研究这些花费了我接近3个月的时间 —— 很多人可能说这样调试还不如将flash直接焊下刷机简单, 但JTAG才是最正宗的ISP编程, 正确操作是不会对硬件有任何损害的, 甚至在一些情况下, 这将是拯救某些设备的唯一办法.[本帖发表于数码之家由Angelic47原创, 恶意转载将视为侵权行为]

之所以浪费那么多的时间, 是因为这颗芯片在此贴发表之前从未出现过相关调试资料, 包括编程手册和寄存器参考pdf. 就连启动流程也是暴力拆了一片flash, 从程序入口点开始, 一点点逆向分析下去的. 打开debug.conf, 看一下ram_init函数的内容, 你应该能够猜到逆向一颗soc是有多么的不容易.

最终, 我成功了, 但是资料却不敢私藏, 哪怕JTAG这东西没人用得上, 作为开源精神也要分享出来. 资料烂在硬盘里, 不如共享给所有人.

过段时间将会发布一篇实战贴, 分享jtag接线到调试下载全过程.

- END -
Angelic47 commented 1 year ago

Sorry, this project does not have technical support due to its too old, now become an end of life project. Thanks for your use!