|  | #!/bin/bash | 
|  | # Copyright 2023 The Pigweed Authors | 
|  | # | 
|  | # Licensed under the Apache License, Version 2.0 (the "License"); you may not | 
|  | # use this file except in compliance with the License. You may obtain a copy of | 
|  | # the License at | 
|  | # | 
|  | #     https://www.apache.org/licenses/LICENSE-2.0 | 
|  | # | 
|  | # Unless required by applicable law or agreed to in writing, software | 
|  | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | 
|  | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | 
|  | # License for the specific language governing permissions and limitations under | 
|  | # the License. | 
|  |  | 
|  | # Launch a debug session with gdb-dashboard and miniterm in separate Tmux | 
|  | # splits. | 
|  |  | 
|  | # Linux Blackmagic Probe | 
|  | DEVBMP="/dev/ttyBmpGdb" | 
|  | FOUND_BMP=$(python -m gonk_tools.find_serial_port -p 'Black Magic Probe' -1) && DEVBMP=$FOUND_BMP | 
|  |  | 
|  | DEVGONK="/dev/ttyGonk" | 
|  | FOUND_GONK=$(python -m gonk_tools.find_serial_port -p 'GENERIC_F730R8TX' -1) && DEVGONK=$FOUND_GONK | 
|  |  | 
|  | GONK_BAUDRATE=115200 | 
|  |  | 
|  | # GDB binary | 
|  | GDB=arm-none-eabi-gdb | 
|  | which gdb-multiarch && GDB=gdb-multiarch | 
|  |  | 
|  | # List all active panes in this tab. For example: | 
|  | # | 
|  | #   0 /dev/pts/4 (active) | 
|  | #   1 /dev/pts/7 | 
|  | #   2 /dev/pts/6 | 
|  | #   3 /dev/pts/5 | 
|  | # | 
|  | tmux_list_panes () { | 
|  | tmux list-panes -F '#P #{pane_tty} #{?pane_active,(active),}' | 
|  | } | 
|  |  | 
|  | # Get the current tmux pane in focus | 
|  | tmux_get_active_pane_id () { | 
|  | tmux_list_panes | awk '/(active)/ { print $1}' | 
|  | } | 
|  |  | 
|  | # Get the pane ID for a given TTY. | 
|  | # Useful for performing an action on a pane not in focus. | 
|  | tmux_get_pane_id () { | 
|  | tmux_list_panes | awk "\$0~\"${1}\" { print \$1}" | 
|  | } | 
|  |  | 
|  | # Get the current pane TTY  for a given TTY | 
|  | tmux_get_active_pane_tty () { | 
|  | tmux_list_panes | awk '/(active)/ { print $2}' | 
|  | } | 
|  |  | 
|  |  | 
|  | split_tmux_panes () { | 
|  | ORIGINAL_PANE=$(tmux_get_active_pane_id) | 
|  |  | 
|  | # Make a split for gdb-dashboard | 
|  | tmux select-pane -t $ORIGINAL_PANE | 
|  | tmux split-window -h | 
|  | DASHBOARD_TTY=$(tmux_get_active_pane_tty) | 
|  |  | 
|  | # Make a split for serial output | 
|  | tmux select-pane -t $ORIGINAL_PANE | 
|  | tmux split-window -v "sleep 4; python -m serial.tools.miniterm --raw ${DEVGONK} ${GONK_BAUDRATE}" | 
|  | SERIAL_TTY=$(tmux_get_active_pane_tty) | 
|  |  | 
|  | # Select the original pane and run gdb | 
|  | tmux select-pane -t $ORIGINAL_PANE | 
|  | } | 
|  |  | 
|  | tmux_cleanup () { | 
|  | tmux kill-pane -t $(tmux_get_pane_id $SERIAL_TTY) | 
|  | tmux kill-pane -t $(tmux_get_pane_id $DASHBOARD_TTY) | 
|  | } | 
|  |  | 
|  | which tmux && split_tmux_panes | 
|  |  | 
|  | $GDB \ | 
|  | -ex "set confirm off" \ | 
|  | -ex "dashboard -output ${DASHBOARD_TTY}" \ | 
|  | -ex "target extended-remote ${DEVBMP}" \ | 
|  | -ex "monitor version" \ | 
|  | -ex "monitor tpwr enable" \ | 
|  | -ex "monitor swdp_scan" \ | 
|  | -ex "attach 1" \ | 
|  | -ex "load" \ | 
|  | -ex "compare-sections" \ | 
|  | -ex "run" \ | 
|  | $@ | 
|  |  | 
|  | which tmux && tmux_cleanup |