Preparing Raspberry PI for JTAG Debugging

This tutorial shows how to prepare your Raspberry PI board for debugging with JTAG (we have tested this with Raspberry Pi 1, 2, 3 and 4). Using JTAG will allow debugging the Linux kernel using hardware like Segger J-Link. As Raspberry PI board does not have a connector with a normal JTAG layout, preparing the board for JTAG debugging involves finding the correct pins and wiring them in the correct order. Follow the steps below for a complete walkthrough:

  1. Determine the revision of your Raspberry PI board. Connect to it using SSH and run the following command:
    cat /proc/cpuinfo

  2. Use the revision table to look up the board revision. In this tutorial we will use Model B v2.0 (revision 0xe), however the same schematics also works for Raspberry Pi 3 and Raspberry Pi 4.
  3. In order to find which pins on the board are JTAG pins we need to first find the GPIO numbers that correspond to them. JTAG requires 4 pins: TDI, TDO, TMS and TCK plus TRST and RTCK pins. You can find the GPIO pins corresponding to these in the datasheet for BCM2835 (Raspberry Pi 1-3) or BCM2711 (Raspberry Pi 4). Search for “_TCK” to find the GPIO number table:
  4. Here are the GPIO numbers for the current revision:
    JTAG pin “ALT4” mode “ALT5” mode
    (Raspberry Pi 1-3 only)
    TDI GPIO26 GPIO4
    TDO GPIO24 GPIO5
    TMS GPIO27 GPIO12
    TCK GPIO25 GPIO13
    RTCK GPIO23 GPIO6
    TRST GPIO22 N/A
  5. Download Raspberry PI schematics PDF for the board revision you found out in step 2. Each JTAG pin (except TRST) can be routed to one of 2 GPIO pins. Use the schematics to find GPIO pins that are connected to the GPIO connector:
  6. We will now need to wire the selected pins from the P1 connector to a 20-pin JTAG connector. Use the JTAG-20 pinout to map the P1 pins to the JTAG-20 pins:
    JTAG-20 pin JTAG signal GPIO pin ALT mode P1 pin
    1 VREF N/A N/A 1
    3 nTRST GPIO22 ALT4 15
    4 GND N/A N/A 9
    5 TDI GPIO4 (Rpi 1-3)
    GPIO26 (Rpi Pi 4)
    ALT5 (Rpi Pi 1-3)
    ALT4 (Rpi Pi 4)
    7 (Rpi 1-3)
    37 (Rpi 4)
    7 TMS GPIO27 ALT4 13
    9 TCK GPIO25 ALT4 22
    11 RTCK GPIO23 ALT4 16
    13 TDO GPIO24 ALT4 18
  7. Now we can make an adapter cable that will connect the pins from the 26-pin P1 connector on Raspberry PI to the 20-pin JTAG connector. This can be done by carefully opening and detaching the 26-pin connector from a 26-pin cable and attaching the wires from the 14-pin cable to it ordered according to the table above:
  8. Each wire can be carefully pushed into the correct position using a pincette:
  9. Double-triple check your wiring. Wrong wiring/cable orientation can permanently damage your Raspberry PI, your JTAG programmer and even your PC connected to it! Test the correctness of each pin. E.g. we can test JTAG pin 3 (nTRST = GPIO22) by connecting a LED between pins 3 and 4 (4 is GND) and running the following commands in your Raspberry PI terminal over SSH:
    cd /sys/class/gpio
    echo 22 > export
    cd gpio22
    echo out > direction
    echo 1 > value

    This will turn on the LED until we run ‘echo 0 > value’:

  10. The easiest way to test out the JTAG connection is to create a kernel module project with VisualKernel that can configure and verify the JTAG setup automatically: