Ports/riscv64/OpenOCD
OpenOCD (docs) это инструмент для отладки, внутрисхемного программирования и периферийного сканирования встраиваемых систем. В частности, этот инструмент полезен для низкоуровневой отладки загрузчиков, ядра Linux, и т.д., при помощи (GDB).
Чтобы выполнить отладку HiFive Unleashed через OpenOCD и GDB, необходимо выполнить следующие шаги:
- Подключить HiFive Unleashed к ПК через USB и включить её. USB интерфейс предоставляет UART0 (/dev/ttyUSB1) и JTAG интерфейсы через FTDI FT2232H (ссылка).
- Запустить (см. простейший конфигурационный файл ниже, а так же не забыть добавить пользователя в группу plugdev): OpenOCD будет слушать порт 3333 в ожидании подключения GDB.
$ openocd -s <путь к директории с hifive-u.cfg> -f hifive-u.cfg
- Запустить GDB собранный с поддержкой цели (target) riscv64.
- Подключить GDB к OpenOCD:
gdb$ target extended-remote localhost:3333
- Теперь можно устанавливать точки останова (breakpoints), исследовать память, дизассемблировать области памяти, и т.д. Для удобства возможно подгружать ELF файлы с отладочной информацией для импорта символов, что даёт возможность устанавливать точки останова на эти символы.
Пример простейшего конфигурационного файла hifive-u.cfg:
adapter_khz 1000
interface ftdi
ftdi_device_desc "Dual RS232-HS"
ftdi_vid_pid 0x0403 0x6010
ftdi_layout_init 0x0018 0x001b
ftdi_layout_signal nSRST -oe 0x0020
ftdi_layout_signal LED -data 0x0020
set _CHIPNAME riscv
jtag newtap $_CHIPNAME cpu -irlen 5
set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME.0 riscv -chain-position $_TARGETNAME -rtos hwthread
target create $_TARGETNAME.1 riscv -chain-position $_CHIPNAME.cpu -coreid 1
target create $_TARGETNAME.2 riscv -chain-position $_CHIPNAME.cpu -coreid 2
target create $_TARGETNAME.3 riscv -chain-position $_CHIPNAME.cpu -coreid 3
target create $_TARGETNAME.4 riscv -chain-position $_CHIPNAME.cpu -coreid 4
target smp $_TARGETNAME.0 $_TARGETNAME.1 $_TARGETNAME.2 $_TARGETNAME.3 $_TARGETNAME.4
$_TARGETNAME.0 configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1
flash bank spi0 fespi 0x20000000 0 0 0 $_TARGETNAME.0 0x10040000
init
if {[ info exists pulse_srst]} {
ftdi_set_signal nSRST 0
ftdi_set_signal nSRST z
sleep 1500
}
halt
flash protect 0 64 last off
echo "Ready for Remote Connections"