OpenOCD has support for bitbanging the jtag or swd protocol over gpio’s. So if you have a board that can run OpenOCD and on which you have access to gpio’s, you can use that as a jtag or swd programmer. The following describes how to use a beaglebone for this purpose but any board with 3V3 gpio’s (e.g. raspberry pie) will do…
I followed these instructions to set up the beaglebone. I opted for the debian file system.
Following list of things to install before building OpenOCD will probably save you from having to iteratively install packages untill OpenOCD builds. Of coarse the exact list will change if the initial content of the debian file system changes:
apt-get install autoconf libtool make pkg-config
Get the OpenOCD sources:
git clone git://git.code.sf.net/p/openocd/code openocd-code
cd openocd-code ./bootstrap ./configure --enable-sysfsgpio make make install
openocd is now installed in /usr/local/bin and the scripts it uses are in /usr/local/share/openocd/scripts.
We need an extra config file to describe the beaglebone programmer. I added it here: /usr/local/share/openocd/scripts/interface/bb.cfg. The choice of the gpio’s is up to you, I picked gpio 38 (i.e. gpio1, pin header P8_03) and 39 (i.e. gpio1, pin header P8_04) as swd_io and swd_sck respectively, so bb.cfg looks like this:
# # Config for beaglebone interface # # This is best used with a fast enough buffer but also # is suitable for direct connection if the target voltage # matches bone's 3.3V # # Do not forget the GND connection. # interface sysfsgpio # minimal swd setup sysfsgpio_swdio_num 38 sysfsgpio_swclk_num 39 # (Did not manage to make srst work:) # sysfsgpio_srst_num 45
Store dot-cc’s bootloader (samd21_sam_ba.bin) in a directory of your choice on the beaglebone.
In that dir, create a openocd.cfg file. OpenOCD will read this file to know what it has to do, and how. In our case the file instructs OpenOCD to use the beaglebone as interface (programmer) and tells it we’re programming a samd21 chip.
source [find interface/bb.cfg] transport select swd set CHIPNAME at91samd21g18 source [find target/at91samdXX.cfg] # did not yet manage to make a working setup using srst #reset_config srst_only reset_config srst_nogate adapter_nsrst_delay 100 adapter_nsrst_assert_width 100 init targets reset halt
If you invoke openocd in this directory, you should see following output.
# openocd Open On-Chip Debugger 0.10.0-dev-00040-gd52070c (2015-10-11-18:21) Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html SysfsGPIO num: swdio = 38 SysfsGPIO num: swclk = 39 SysfsGPIO num: srst = 45 adapter speed: 500 kHz adapter_nsrst_delay: 100 cortex_m reset_config sysresetreq none separate adapter_nsrst_delay: 100 adapter_nsrst_assert_width: 100 Info : SysfsGPIO JTAG/SWD bitbang driver Info : SWD only mode enabled (specify tck, tms, tdi and tdo gpios to add JTAG mode) Info : This adapter doesn't support configurable speed Info : SWD IDCODE 0x0bc11477 Info : at91samd21g18.cpu: hardware has 4 breakpoints, 2 watchpoints TargetName Type Endian TapName State -- ------------------ ---------- ------ ------------------ ------------ 0* at91samd21g18.cpu cortex_m little at91samd21g18.cpu running target state: halted target halted due to debug-request, current mode: Thread xPSR: 0x21000000 pc: 0x000028f4 msp: 0x20002c00
OpenOCD is now constantly polling the device and it is ready to accept new instructions from us via telnet or gdb. You could log into openocd using telnet from your pc (or from the bone) and inspect memory, run code, start debugging…
If on the other hand you are just interested in burning the bootloader, you could add following line at the end of openocd.cfg and start openocd again.
at91samd bootloader 0; program samd21_sam_ba.bin verify reset; shutdown
OpenOCD should now produce following extra report about the flashing operation.
** Programming Started ** auto erase enabled Info : SAMD MCU: SAMD21G18A (256KB Flash, 32KB RAM) wrote 16384 bytes from file samd21_sam_ba.bin in 4.120137s (3.883 KiB/s) ** Programming Finished ** ** Verify Started ** verified 6328 bytes in 0.575388s (10.740 KiB/s) ** Verified OK ** ** Resetting Target ** shutdown command invoked
The M0 is now ready to receive sketches from the dot-cc IDE.
Remark: if you previously made the modification to the dot-cc lnker script from my previous post, don’t forget to undo this change.
In case you want to restore the dot-org bootloader, use this line as last line in openocd.cfg instead:
at91samd bootloader 0; program Bootloader_D21_M0_150515.hex verify reset; shutdown