2023年5月8日 星期一

OpenOCD 反向工程練習

主要的動機是要在鍵盤上加小紅點,想直接用鍵盤上原有的 MCU。目前拆解的鍵盤是阿米洛 68鍵鍵盤 Miya68 Pro,上面的主控是 HSAK3201,只知道是 Holtek 出的 ARM CPU。

參考連結:

先在 pcstore 買了一塊 [HT32F52352 開發套件(帶排針) ESK32-30501S],想先熟悉一下相關的操作和 HT32 系列 CPU 的相關資料。售價 NT$ 657,運費 NT$ 45,總計 NT$ 702。

先用 Holtek 網站下載的軟體在 Win10 下測試,無法透過 e-Link32 lite 連上開發板。只好再上 pcstore 買一塊 [Holtek 32-bit MCU 調試適配器 e-Link32 Pro],售價 NT$ 939 ,運費 NT$ 45,總計 NT$ 984。目前的總投資成本 NT$ 1,686。開始時還是不成功,又上蝦皮買 [USB 邏輯分析儀] 和一些線材,含運費 NT$ 384。總成本 2千多一些,這是為了一支垃圾鍵盤的控制 IC 所花費的成本,就當作練功的學費吧。

下圖是把 e-Link32 lite 拆下,再用杜邦線連目標開發板,電源各自獨立。 

後來,使用排線連接 e-Link 32  和開發板,都順利成功。追查原因才發現,e-Link32 lite 上的 CN3,是它自身的 SWD port,是讓別人來連它的,CN2 才是要連目標 CPU 的接頭。我一直都用 ST-Link 的想法,認為 CN3 是用來連目標 CPU 的。只能怪我在未測試功能正常前,就把 e-Link32 lite 拆下來了。至於多買的,等整個測試 OK 之後。再用網拍賣給其他需要的人吧。

使用 e-Link32 lite 連目標板,有時可以,有時不行,實在很困擾。交叉比對測試後,確認 reset 腳不用接,但 3.3V 的 VDD 腳要接。因為 e-Link32 lite 的 level shift IC 是由目標板供應的。但我的鍵盤只和 4個 PIN,其中一個 PIN 是 reset,3.3V VDD 沒接。最後把 CN3 和 CN2 的 VDD 接起來就 OK 了。

另外,jtag 的接線不能太長,照官方說法,不能超過 6吋,大約 12CM。我在開始把鍵盤 PCB 的 SWD 線接出時,轉接了好幾段線,超過 30公分,讀取資料就變得很不穩定。後來只留下一段接線,約 17CM,超過一些,但使用 1000kHz,還是可以穩定連線。

要進行反向工程,得先學習使用 OpenOCD,[Wrongbaud's Blog] 的文章是很好的入門教材。再參考一些其他的相關資料,建立了 OpenOCD 的 docker,透過 docker 來使用比較方便。

經反覆測試,最終能成功透過 OpenOCD 讀取開發板上的 MCU 的資訊。

自己建的 dap-tst.cfg 檔,如下。

adapter driver cmsis-dap
transport select swd
source [find target/stm32f1x.cfg]

執行 openocd 指令的畫面如下。

# openocd -f dap-tst.cfg 
Open On-Chip Debugger 0.11.0
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.org/doc/doxygen/bugs.html
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : CMSIS-DAP: SWD  Supported
Info : CMSIS-DAP: FW Version = 1.0.35
Info : CMSIS-DAP: Interface Initialised (SWD)
Info : SWCLK/TCK = 0 SWDIO/TMS = 1 TDI = 0 TDO = 0 nTRST = 0 nRESET = 1
Info : CMSIS-DAP: Interface ready
Info : clock speed 1000 kHz
Info : SWD DPIDR 0x0bc11477
Info : stm32f1x.cpu: hardware has 4 breakpoints, 2 watchpoints
Info : starting gdb server for stm32f1x.cpu on 3333
Info : Listening on port 3333 for gdb connections
Info : accepting 'telnet' connection on tcp/4444 
在外部無法透過 telnet 連上,進入同一個 container,則可以順利連上。先下個 dap info 指令,把初步的資訊 dump 出來。
# telnet localhost 4444
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Open On-Chip Debugger
> init
> dap info
AP ID register 0x04770031
        Type is MEM-AP AHB3
MEM-AP BASE 0xe00ff003
        Valid ROM table present
                Component base address 0xe00ff000
                Peripheral ID 0x04000bb4c0
                Designer is 0x4bb, ARM Ltd
                Part is 0x4c0, Cortex-M0+ ROM (ROM Table)
                Component class is 0x1, ROM table
                MEMTYPE system memory present on bus
        ROMTABLE[0x0] = 0xfff0f003
                Component base address 0xe000e000
                Peripheral ID 0x04000bb008
                Designer is 0x4bb, ARM Ltd
                Part is 0x8, Cortex-M0 SCS (System Control Space)
                Component class is 0xe, Generic IP component
        ROMTABLE[0x4] = 0xfff02003
                Component base address 0xe0001000
                Peripheral ID 0x04000bb00a
                Designer is 0x4bb, ARM Ltd
                Part is 0xa, Cortex-M0 DWT (Data Watchpoint and Trace)
                Component class is 0xe, Generic IP component
        ROMTABLE[0x8] = 0xfff03003
                Component base address 0xe0002000
                Peripheral ID 0x04000bb00b
                Designer is 0x4bb, ARM Ltd
                Part is 0xb, Cortex-M0 BPU (Breakpoint Unit)
                Component class is 0xe, Generic IP component
        ROMTABLE[0xc] = 0x0
                End of ROM table

>  

假如 flash 被 lock 住的話,dap info 的指令會回報錯誤,執行 mass erase 之後,就可以取得 MCU 的資料了。

到這裡,算是成功的一小步,接下來有空再慢慢進一步的研究。


沒有留言:

張貼留言

網誌存檔