• Programming a SAMD bootloader using JLink & Linux

    03/13/2019 at 09:14 4 comments

    I have a custom board using a SAMD21 microcontroller (as used in Arduino Zero and other dev boards).

    After soldering, the chip is blank and a bootloader is useful to upload code via the USB connection. 

    I found an excellent (as always) tutorial by Adafruit using a JLink probe to upload their custom bootloader here : https://learn.adafruit.com/how-to-program-samd-bootloaders/overview

    Unfortunately, directions are only provided for a Windows computer, using Atmel Studio.

    Here is how to do it using the JLink command line software under Linux (and it should work with Mac as well).

    To enable/disable the bootloader protection, I found very useful information here : https://roamingthings.de/posts/use-j-link-to-change-the-boot-loader-protection-of-a-sam-d21/

    You should create two files with the info from the above post :

    File SAMD_set_bootloader_protection_8k.mot :


    File SAMD_clear_bootloader_protection.mot :


    In the same directory, download the Adafruit bootloader from https://learn.adafruit.com/how-to-program-samd-bootloaders/setup

    So here is the complete process to burn a bootloader to a blank SAMD21 chip :

    • Go to the directory where you put the two files above and the bootloader binary
    cd ATSAMD21_Bootloader
    • Start JLinkExe
    $ JLinkExe
    SEGGER J-Link Commander V6.32h (Compiled Jul  5 2018 18:15:02)
    DLL version V6.32h, compiled Jul  5 2018 18:14:58
    Connecting to J-Link via USB...O.K.
    Firmware: J-Link Lite-Cortex-M V8 compiled Sep 15 2016 12:05:01
    Hardware version: V8.00
    S/N: 518006749
    License(s): GDB
    Type "connect" to establish a target connection, '?' for help
    •  Connect to the microcontroller. You have to specify the device type, SWD interface and you can use the default interface speed.
    Please specify device / core. : ATSAMD21G18
    Type '?' for selection dialog
    Please specify target interface:
      J) JTAG (Default)
      S) SWD
    Specify target interface speed [kHz]. : 4000 kHz
    Device "ATSAMD21G18" selected.
    Connecting to target via SWD
    Found SW-DP with ID 0x0BC11477
    Scanning AP map to find all available APs
    AP[1]: Stopped AP scan as end of AP map has been reached
    AP[0]: AHB-AP (IDR: 0x04770031)
    Iterating through AP map to find AHB-AP to use
    AP[0]: Core found
    AP[0]: AHB-AP ROM base: 0x41003000
    CPUID register: 0x410CC601. Implementer code: 0x41 (ARM)
    Found Cortex-M0 r0p1, Little endian.
    FPUnit: 4 code (BP) slots and 0 literal slots
    CoreSight components:
    ROMTbl[0] @ 41003000
    ROMTbl[0][0]: E00FF000, CID: B105100D, PID: 000BB4C0 ROM Table
    ROMTbl[1] @ E00FF000
    ROMTbl[1][0]: E000E000, CID: B105E00D, PID: 000BB008 SCS
    ROMTbl[1][1]: E0001000, CID: B105E00D, PID: 000BB00A DWT
    ROMTbl[1][2]: E0002000, CID: B105E00D, PID: 000BB00B FPB
    ROMTbl[0][1]: 41006000, CID: B105900D, PID: 001BB932 MTB-M0+
    Cortex-M0 identified.
    • Clear bootloader protection fuse
    J-Link>loadfile SAMD_clear_bootloader_protection.mot
    Downloading file [SAMD_clear_bootloader_protection.mot]...
    Comparing flash   [100%] Done.
    Erasing flash     [100%] Done.
    Programming flash [100%] Done.
    Verifying flash   [100%] Done.
    J-Link: Flash download: Bank 1 @ 0x00804000: 1 range affected (16 bytes)
    J-Link: Flash download: Total time needed: 0.050s (Prepare: 0.037s, Compare: 0.002s, Erase: 0.000s, Program: 0.003s, Verify: 0.000s, Restore: 0.006s)
    • Reset the target
    Reset delay: 0 ms
    Reset type NORMAL: Resets core & peripherals via SYSRESETREQ & VECTRESET bit. 
    • Upload the bootloader (you may have to change the bin file name).
    J-Link>loadbin bootloader-feather_m0-v2.0.0-adafruit.9.bin,0
    Downloading file [bootloader-feather_m0-v2.0.0-adafruit.9.bin]...
    Comparing flash [100%] Done.
    Read more »