Raspberry Pi 5をデバッグする前に、まずは情報の多いRaspberry Pi 4からやってみようと思い、ネットで調べていたところ、hikaliumさんのブログと、西永さんのスライドがみつかったので、ADIv5の仕様書とともに熟読しながらARMのデバッグインタフェース仕様を勉強しております。
まず、Raspi 4はJTAGを有効にするには/boot/config.txtの末尾の[all]セクションに
[all]
enable_jtag_gpio=1
という記述をします。CPUがこの記述が読んでJTAGを有効にするタイミングは起動してから数秒後なので、リセット直後はJTAGは使えません。OSの起動がある程度進んだ段階でJTAGが見えるようになります。
OpenOCDを使ったFTDI接続ではcfgファイルがたくさんあってどれを使ってよいかわからなくなりますが、FTDIデバイスのJTAG接続はTCK=bit0,TDI=bit1,TDO=bit2,TMS=bit3と相場が決まっているので、だいたいどれを使ってもOKです。
JTAGにはTRSTというリセット信号があって、これをどこのビットに配置するかはケーブルのよってさまざまなのですが、どうやらRaspi4はTRSTをトグルしなくても正常に接続できるようです。ただし、TRSTは基板上でプルダウンされているようなので、トグルする必要はないのですがプルアップしておく必要はあります。
結論を言えばFTDIのデバイスでOpenOCDを使ってARMをデバッグする際にはMPSSEのピン配列にしておけば、だいたいどんなcfgファイルでも通るはずです。
hilaliumさんのブログにあるスクリプトを、自分のMPSSEの初期化コードに書き換えて接続してみました。
4つのコアに接続できているのがわかります
接続できたら、TELNETで4444番ポートに接続してdap info 0を行ってみました。
Open On-Chip Debugger
> dap info 0
AP # 0x0
AP ID register 0x24770002
Type is MEM-AP APB2 or APB3
MEM-AP BASE 0x80020003
Valid ROM table present
Component base address 0x80020000
Peripheral ID 0x01000bfa97
Designer is 0x0bf, Broadcom
Part is 0xa97, Unrecognized
Component class is 0x1, ROM table
MEMTYPE system memory not present: dedicated debug bus
ROMTABLE[0x0] = 0x003e0003
Component base address 0x80400000
Peripheral ID 0x04001bb4a4
Designer is 0x23b, ARM Ltd
Part is 0x4a4, Cortex-A72 ROM (ROM Table)
Component class is 0x1, ROM table
MEMTYPE system memory not present: dedicated debug bus
[L01] ROMTABLE[0x0] = 0x00010003
Component base address 0x80410000
Peripheral ID 0x04001bbd08
Designer is 0x23b, ARM Ltd
Part is 0xd08, Cortex-A72 Debug (Debug Unit)
Component class is 0x9, CoreSight component
Type is 0x15, Debug Logic, Processor
Dev Arch is 0x47706a15, ARM Ltd "Processor debug architecture (v8.0-A)" rev.0
[L01] ROMTABLE[0x4] = 0x00020003
Component base address 0x80420000
Peripheral ID 0x04004bb906
Designer is 0x23b, ARM Ltd
Part is 0x906, CoreSight CTI (Cross Trigger)
Component class is 0x9, CoreSight component
Type is 0x14, Debug Control, Trigger Matrix
[L01] ROMTABLE[0x8] = 0x00030003
Component base address 0x80430000
Peripheral ID 0x04001bb9d8
Designer is 0x23b, ARM Ltd
Part is 0x9d8, Cortex-A72 PMU (Performance Monitor Unit)
Component class is 0x9, CoreSight component
Type is 0x16, Performance Monitor, Processor
Dev Arch is 0x47702a16, ARM Ltd "Processor Performance Monitor (PMU) architecture" rev.0
[L01] ROMTABLE[0xc] = 0x00040002
Component not present
[L01] ROMTABLE[0x10] = 0x00110003
Component base address 0x80510000
Peripheral ID 0x04001bbd08
Designer is 0x23b, ARM Ltd
Part is 0xd08, Cortex-A72 Debug (Debug Unit)
Component class is 0x9, CoreSight component
Type is 0x15, Debug Logic, Processor
Dev Arch is 0x47706a15, ARM Ltd "Processor debug architecture (v8.0-A)" rev.0
[L01] ROMTABLE[0x14] = 0x00120003
Component base address 0x80520000
Peripheral ID 0x04004bb906
Designer is 0x23b, ARM Ltd
Part is 0x906, CoreSight CTI (Cross Trigger)
Component class is 0x9, CoreSight component
Type is 0x14, Debug Control, Trigger Matrix
[L01] ROMTABLE[0x18] = 0x00130003
Component base address 0x80530000
Peripheral ID 0x04001bb9d8
Designer is 0x23b, ARM Ltd
Part is 0x9d8, Cortex-A72 PMU (Performance Monitor Unit)
Component class is 0x9, CoreSight component
Type is 0x16, Performance Monitor, Processor
Dev Arch is 0x47702a16, ARM Ltd "Processor Performance Monitor (PMU) architecture" rev.0
[L01] ROMTABLE[0x1c] = 0x00140002
Component not present
[L01] ROMTABLE[0x20] = 0x00210003
Component base address 0x80610000
Peripheral ID 0x04001bbd08
Designer is 0x23b, ARM Ltd
Part is 0xd08, Cortex-A72 Debug (Debug Unit)
Component class is 0x9, CoreSight component
Type is 0x15, Debug Logic, Processor
Dev Arch is 0x47706a15, ARM Ltd "Processor debug architecture (v8.0-A)" rev.0
[L01] ROMTABLE[0x24] = 0x00220003
Component base address 0x80620000
Peripheral ID 0x04004bb906
Designer is 0x23b, ARM Ltd
Part is 0x906, CoreSight CTI (Cross Trigger)
Component class is 0x9, CoreSight component
Type is 0x14, Debug Control, Trigger Matrix
[L01] ROMTABLE[0x28] = 0x00230003
Component base address 0x80630000
Peripheral ID 0x04001bb9d8
Designer is 0x23b, ARM Ltd
Part is 0x9d8, Cortex-A72 PMU (Performance Monitor Unit)
Component class is 0x9, CoreSight component
Type is 0x16, Performance Monitor, Processor
Dev Arch is 0x47702a16, ARM Ltd "Processor Performance Monitor (PMU) architecture" rev.0
[L01] ROMTABLE[0x2c] = 0x00240002
Component not present
[L01] ROMTABLE[0x30] = 0x00310003
Component base address 0x80710000
Peripheral ID 0x04001bbd08
Designer is 0x23b, ARM Ltd
Part is 0xd08, Cortex-A72 Debug (Debug Unit)
Component class is 0x9, CoreSight component
Type is 0x15, Debug Logic, Processor
Dev Arch is 0x47706a15, ARM Ltd "Processor debug architecture (v8.0-A)" rev.0
[L01] ROMTABLE[0x34] = 0x00320003
Component base address 0x80720000
Peripheral ID 0x04004bb906
Designer is 0x23b, ARM Ltd
Part is 0x906, CoreSight CTI (Cross Trigger)
Component class is 0x9, CoreSight component
Type is 0x14, Debug Control, Trigger Matrix
[L01] ROMTABLE[0x38] = 0x00330003
Component base address 0x80730000
Peripheral ID 0x04001bb9d8
Designer is 0x23b, ARM Ltd
Part is 0x9d8, Cortex-A72 PMU (Performance Monitor Unit)
Component class is 0x9, CoreSight component
Type is 0x16, Performance Monitor, Processor
Dev Arch is 0x47702a16, ARM Ltd "Processor Performance Monitor (PMU) architecture" rev.0
[L01] ROMTABLE[0x3c] = 0x00340002
Component not present
[L01] ROMTABLE[0x40] = 0x00000000
[L01] End of ROM table
ROMTABLE[0x4] = 0x00000000
End of ROM table
重要そうだと思われる内容が出てきます。
MEM-AP BASE が0x80020003で、ROMTABLE[0]が0x003e0003だそうです。
この情報は、JTAGを使ってDPやAPにアクセスした際に正しい値が読み出されているかどうかを比較するために使えそうです。
そして、次にMITOUJTAGを使ってSVFプレイヤーでARM DAPを操作する命令を送り込んでみました。
// READ IDCODE
SIR 4 TDI (E);
SDR 32 TDI (000000007) PRINT ; // read 0x0c2
// SET CSYSPWRUPREQ and CDBGPWRUPREQ
SIR 4 TDI (A) ; // DPACC
SDR 35 TDI (280000002) ; // write 500000000 => 280000000 CSYSPWRUPREQ and CDBGPWRUPREQ
SDR 35 TDI (000000003) ; // read CTRL/STAT
// READ AP0 CSW
SIR 4 TDI (A) ; // DPACC
SDR 35 TDI (000000004) ; // write select 0x000000f0 APSEL=0 APBANKSEL=0
SIR 4 TDI (B) ; // APACC
SDR 35 TDI (000000001) ; // read 0x00
SDR 35 TDI (000000001) PRINT ; // read 0x00
// READ IDR
SIR 4 TDI (A) ; // DPACC
SDR 35 TDI (000000784) ; // write select 0x000000f0 APSEL=0 APBANKSEL=F
SIR 4 TDI (B) ; // APACC
SDR 35 TDI (000000007) ; // read 0x0c
SDR 35 TDI (000000007) PRINT ; // read 0x0c
// IDR 123B80012 => 24770002
結果は以下のよおりです。
2023/12/27 22:53:49 Line 3 : TDO(captured)='4BA00477'
2023/12/27 22:53:49 Line 15 : TDO(captured)='400000212'
2023/12/27 22:53:49 Line 23 : TDO(captured)='123B80012'
解説すると、最初にJTAGの命令0x0Eを送ってIDCODEを取得します。
次にDPACCを発行し、CTRL/STATレジスタのCSYSPWRUPREQとCDBGPWRUPREQビットを立てます。
その次に、DPACCでSELECTレジスタに0を書き込んで、APSEL=0 APBANKSEL=0とします。これで0x00~0x0cが読み書きできるようになるので、APACCを発行してレジスタ0x00(CSW)を読みます。結果は400000212と表示されているのですが、右に3bitシフトして0x80000042と読むべきです。
それからまたDPACC命令を発行し、SELECTレジスタに0x000000f0を書き込み、APBANK=Fにして0xfc(IDR)を読み出します。
結果は0x123B80012となっていますが、3bit右にシフトすれば24770002となります。これはRaspi4で使われているBCM2411のIDCODEなのでしょう。477という部分がJTAGのIDCODEと一致していますね。
SVFプレイヤーでARMのDebug Interfaceを操作するのは、3bitシフトがしんどいのですが、なんとかIDRまで読めました。
最近のコメント