1*61c4878aSAndroid Build Coastguard Worker.. _target-apollo4: 2*61c4878aSAndroid Build Coastguard Worker 3*61c4878aSAndroid Build Coastguard Worker=========================== 4*61c4878aSAndroid Build Coastguard WorkerAmbiq Apollo4 5*61c4878aSAndroid Build Coastguard Worker=========================== 6*61c4878aSAndroid Build Coastguard Worker----- 7*61c4878aSAndroid Build Coastguard WorkerSetup 8*61c4878aSAndroid Build Coastguard Worker----- 9*61c4878aSAndroid Build Coastguard WorkerTo use this target, Pigweed must be set up to use the `AmbiqSuite SDK`_ HAL 10*61c4878aSAndroid Build Coastguard Workerfor the Apollo4 series which can be downloaded from the Ambiq website. 11*61c4878aSAndroid Build Coastguard Worker 12*61c4878aSAndroid Build Coastguard Worker.. _AmbiqSuite SDK: https://ambiq.com/apollo4-blue-plus 13*61c4878aSAndroid Build Coastguard Worker 14*61c4878aSAndroid Build Coastguard WorkerOnce the AmbiqSuite SDK package has been downloaded and extracted, the user 15*61c4878aSAndroid Build Coastguard Workerneeds to set ``dir_pw_third_party_ambiq_SDK`` build arg to the location of 16*61c4878aSAndroid Build Coastguard Workerextracted directory: 17*61c4878aSAndroid Build Coastguard Worker 18*61c4878aSAndroid Build Coastguard Worker.. code-block:: sh 19*61c4878aSAndroid Build Coastguard Worker 20*61c4878aSAndroid Build Coastguard Worker $ gn args out 21*61c4878aSAndroid Build Coastguard Worker 22*61c4878aSAndroid Build Coastguard WorkerThen add the following lines to that text file: 23*61c4878aSAndroid Build Coastguard Worker 24*61c4878aSAndroid Build Coastguard Worker.. code-block:: 25*61c4878aSAndroid Build Coastguard Worker 26*61c4878aSAndroid Build Coastguard Worker # Path to the extracted AmbiqSuite SDK package. 27*61c4878aSAndroid Build Coastguard Worker dir_pw_third_party_ambiq_SDK = "/path/to/AmbiqSuite_R4.3.0" 28*61c4878aSAndroid Build Coastguard Worker 29*61c4878aSAndroid Build Coastguard WorkerUsage 30*61c4878aSAndroid Build Coastguard Worker===== 31*61c4878aSAndroid Build Coastguard WorkerThe Apollo4 is configured to output logs and test results over the UART to an 32*61c4878aSAndroid Build Coastguard Workeron-board J-Link Debug Probe (Virtual COM Port) at a baud rate of 115200. 33*61c4878aSAndroid Build Coastguard Worker 34*61c4878aSAndroid Build Coastguard WorkerOnce the AmbiqSuite SDK is configured, the unit tests for the Apollo4 board 35*61c4878aSAndroid Build Coastguard Workercan be build with a command: 36*61c4878aSAndroid Build Coastguard Worker 37*61c4878aSAndroid Build Coastguard Worker.. code-block:: sh 38*61c4878aSAndroid Build Coastguard Worker 39*61c4878aSAndroid Build Coastguard Worker ninja -C out apollo4 40*61c4878aSAndroid Build Coastguard Worker 41*61c4878aSAndroid Build Coastguard WorkerIf using out as a build directory, tests will be located in out/apollo4/obj/[module name]/[test_name].elf. 42*61c4878aSAndroid Build Coastguard Worker 43*61c4878aSAndroid Build Coastguard WorkerFlashing using SEGGER's J-Link 44*61c4878aSAndroid Build Coastguard Worker============================== 45*61c4878aSAndroid Build Coastguard WorkerFlashing the Apollo4 board can be done using the J-Flash Lite GUI program or from 46*61c4878aSAndroid Build Coastguard Workera command line using ``JLinkExe`` program. The latter requires a script which 47*61c4878aSAndroid Build Coastguard Workerdescribes the steps of programming. Here is an example bash script to flash 48*61c4878aSAndroid Build Coastguard Workeran Apollo4 board using ``JLinkExe`` program: 49*61c4878aSAndroid Build Coastguard Worker 50*61c4878aSAndroid Build Coastguard Worker.. code-block:: sh 51*61c4878aSAndroid Build Coastguard Worker 52*61c4878aSAndroid Build Coastguard Worker #!/bin/bash 53*61c4878aSAndroid Build Coastguard Worker function flash_jlink() 54*61c4878aSAndroid Build Coastguard Worker { 55*61c4878aSAndroid Build Coastguard Worker local TMP_FLASH_SCRIPT=/tmp/gdb-flash.txt 56*61c4878aSAndroid Build Coastguard Worker 57*61c4878aSAndroid Build Coastguard Worker cat > $TMP_FLASH_SCRIPT <<- EOF 58*61c4878aSAndroid Build Coastguard Worker r 59*61c4878aSAndroid Build Coastguard Worker h 60*61c4878aSAndroid Build Coastguard Worker loadfile $1 61*61c4878aSAndroid Build Coastguard Worker r 62*61c4878aSAndroid Build Coastguard Worker q 63*61c4878aSAndroid Build Coastguard Worker EOF 64*61c4878aSAndroid Build Coastguard Worker 65*61c4878aSAndroid Build Coastguard Worker JLinkExe -NoGui 1 -device AMAP42KK-KBR -if SWD -speed 4000 -autoconnect 1 -CommanderScript $TMP_FLASH_SCRIPT 66*61c4878aSAndroid Build Coastguard Worker 67*61c4878aSAndroid Build Coastguard Worker rm "$TMP_FLASH_SCRIPT" 68*61c4878aSAndroid Build Coastguard Worker } 69*61c4878aSAndroid Build Coastguard Worker 70*61c4878aSAndroid Build Coastguard Worker flash_jlink $@ 71*61c4878aSAndroid Build Coastguard Worker 72*61c4878aSAndroid Build Coastguard WorkerThen call this script: 73*61c4878aSAndroid Build Coastguard Worker 74*61c4878aSAndroid Build Coastguard Worker.. code-block:: sh 75*61c4878aSAndroid Build Coastguard Worker 76*61c4878aSAndroid Build Coastguard Worker bash ./flash_amap4.sh ./out/apollo4_debug/obj/pw_log/test/basic_log_test.elf 77*61c4878aSAndroid Build Coastguard Worker 78*61c4878aSAndroid Build Coastguard WorkerIn this case the basic log test is debugged, but substitute your own ELF file. 79*61c4878aSAndroid Build Coastguard Worker 80*61c4878aSAndroid Build Coastguard WorkerDebugging 81*61c4878aSAndroid Build Coastguard Worker========= 82*61c4878aSAndroid Build Coastguard WorkerDebugging can be done using the on-board J-Link Debug Probe. First you need to 83*61c4878aSAndroid Build Coastguard Workerstart ``JLinkGDBServer`` and connect to the on-board J-Link Debug Probe. 84*61c4878aSAndroid Build Coastguard Worker 85*61c4878aSAndroid Build Coastguard Worker.. code-block:: sh 86*61c4878aSAndroid Build Coastguard Worker 87*61c4878aSAndroid Build Coastguard Worker JLinkGDBServer -select USB \ 88*61c4878aSAndroid Build Coastguard Worker -device AMAP42KK-KBR \ 89*61c4878aSAndroid Build Coastguard Worker -endian little \ 90*61c4878aSAndroid Build Coastguard Worker -if SWD \ 91*61c4878aSAndroid Build Coastguard Worker -speed 4000 \ 92*61c4878aSAndroid Build Coastguard Worker -noir -LocalhostOnly \ 93*61c4878aSAndroid Build Coastguard Worker -singlerun \ 94*61c4878aSAndroid Build Coastguard Worker -nogui \ 95*61c4878aSAndroid Build Coastguard Worker -excdbg \ 96*61c4878aSAndroid Build Coastguard Worker -rtos GDBServer/RTOSPlugin_FreeRTOS.dylib 97*61c4878aSAndroid Build Coastguard Worker 98*61c4878aSAndroid Build Coastguard WorkerThe ``-rtos`` option is for `Thread Aware Debugging`_. 99*61c4878aSAndroid Build Coastguard Worker 100*61c4878aSAndroid Build Coastguard Worker.. _Thread Aware Debugging: https://www.segger.com/products/debug-probes/j-link/tools/j-link-gdb-server/thread-aware-debugging/ 101*61c4878aSAndroid Build Coastguard Worker 102*61c4878aSAndroid Build Coastguard WorkerThen on the second terminal window use ``arm-none-eabi-gdb`` to load an executable 103*61c4878aSAndroid Build Coastguard Workerinto the target, debug, and run it. 104*61c4878aSAndroid Build Coastguard Worker 105*61c4878aSAndroid Build Coastguard Worker.. code-block:: sh 106*61c4878aSAndroid Build Coastguard Worker 107*61c4878aSAndroid Build Coastguard Worker arm-none-eabi-gdb -q out/apollo4_debug/obj/pw_log/test/basic_log_test.elf 108*61c4878aSAndroid Build Coastguard Worker 109*61c4878aSAndroid Build Coastguard WorkerThis can be combined with a simple bash script. Here is an example of one: 110*61c4878aSAndroid Build Coastguard Worker 111*61c4878aSAndroid Build Coastguard Worker.. code-block:: sh 112*61c4878aSAndroid Build Coastguard Worker 113*61c4878aSAndroid Build Coastguard Worker #!/bin/bash 114*61c4878aSAndroid Build Coastguard Worker 115*61c4878aSAndroid Build Coastguard Worker function debug_jlink() 116*61c4878aSAndroid Build Coastguard Worker { 117*61c4878aSAndroid Build Coastguard Worker local TMP_GDB_SCRIPT=/tmp/gdb-debug.txt 118*61c4878aSAndroid Build Coastguard Worker 119*61c4878aSAndroid Build Coastguard Worker # Create GDB script. 120*61c4878aSAndroid Build Coastguard Worker 121*61c4878aSAndroid Build Coastguard Worker cat > $TMP_GDB_SCRIPT <<- EOF 122*61c4878aSAndroid Build Coastguard Worker 123*61c4878aSAndroid Build Coastguard Worker # Backtrace all threads. 124*61c4878aSAndroid Build Coastguard Worker 125*61c4878aSAndroid Build Coastguard Worker define btall 126*61c4878aSAndroid Build Coastguard Worker thread apply all backtrace 127*61c4878aSAndroid Build Coastguard Worker end 128*61c4878aSAndroid Build Coastguard Worker 129*61c4878aSAndroid Build Coastguard Worker target remote localhost:2331 130*61c4878aSAndroid Build Coastguard Worker load 131*61c4878aSAndroid Build Coastguard Worker monitor reset 132*61c4878aSAndroid Build Coastguard Worker monitor halt 133*61c4878aSAndroid Build Coastguard Worker b pw_boot_Entry 134*61c4878aSAndroid Build Coastguard Worker 135*61c4878aSAndroid Build Coastguard Worker EOF 136*61c4878aSAndroid Build Coastguard Worker 137*61c4878aSAndroid Build Coastguard Worker # Start GDB server. 138*61c4878aSAndroid Build Coastguard Worker 139*61c4878aSAndroid Build Coastguard Worker set -m 140*61c4878aSAndroid Build Coastguard Worker JLinkGDBServer -select USB \ 141*61c4878aSAndroid Build Coastguard Worker -device AMAP42KK-KBR \ 142*61c4878aSAndroid Build Coastguard Worker -endian little \ 143*61c4878aSAndroid Build Coastguard Worker -if SWD \ 144*61c4878aSAndroid Build Coastguard Worker -speed 4000 \ 145*61c4878aSAndroid Build Coastguard Worker -noir -LocalhostOnly \ 146*61c4878aSAndroid Build Coastguard Worker -singlerun \ 147*61c4878aSAndroid Build Coastguard Worker -nogui \ 148*61c4878aSAndroid Build Coastguard Worker -excdbg \ 149*61c4878aSAndroid Build Coastguard Worker -rtos GDBServer/RTOSPlugin_FreeRTOS.dylib & 150*61c4878aSAndroid Build Coastguard Worker set +m 151*61c4878aSAndroid Build Coastguard Worker 152*61c4878aSAndroid Build Coastguard Worker # Debug program. 153*61c4878aSAndroid Build Coastguard Worker 154*61c4878aSAndroid Build Coastguard Worker arm-none-eabi-gdb -q $1 -x $TMP_GDB_SCRIPT 155*61c4878aSAndroid Build Coastguard Worker 156*61c4878aSAndroid Build Coastguard Worker rm "$TMP_GDB_SCRIPT" 157*61c4878aSAndroid Build Coastguard Worker } 158*61c4878aSAndroid Build Coastguard Worker 159*61c4878aSAndroid Build Coastguard Worker debug_jlink $@ 160*61c4878aSAndroid Build Coastguard Worker 161*61c4878aSAndroid Build Coastguard WorkerThen call this script: 162*61c4878aSAndroid Build Coastguard Worker 163*61c4878aSAndroid Build Coastguard Worker.. code-block:: sh 164*61c4878aSAndroid Build Coastguard Worker 165*61c4878aSAndroid Build Coastguard Worker bash ./debug_amap4.sh ./out/apollo4_debug/obj/pw_log/test/basic_log_test.elf 166