# Getting Started with nsh configuration
1. Download and install toolchain
$ curl https://static.dev.sifive.com/dev-tools/riscv64-unknown-elf-gcc-8.3.0-2019.08.0-x86_64-linux-ubuntu14.tar.gz
2. Download flash tools
There are multiple tools that can be used, but option (a) is recommended.
a. blflash -- cross platform open-source (recommended)
curl -L -o blflash https://github.com/spacemeowx2/blflash/releases/download/v0.3.0/blflash-linux-amd64
chmod +x ./blflash
b. Bouffalo Lab flash tools (official)
https://github.com/bouffalolab/flash_tools.git
3. Configure and build NuttX
$ mkdir ./nuttx; cd ./nuttx
$ git clone https://github.com/apache/incubator-nuttx.git nuttx
$ git clone https://github.com/apache/incubator-nuttx-apps.git apps
$ cd nuttx
$ make distclean
$ ./tools/configure.sh bl602evb:nsh
$ make -j
4. Connect bl602 and computer via USB
5. Flash
Use option (a) or (b) based on tool selection in section 2.
a. Using blflash
Place the board in bootloader mode
bl602evb: Jumper IO8 to HI and press reset
DT-BL10: Press and hold D8, press and release EN, release D8
$ blflash flash nuttx.bin --port /dev/ttyUSB0
[INFO blflash::flasher] Start connection...
[TRACE blflash::flasher] 5ms send count 55
[TRACE blflash::flasher] handshake sent elapsed 159.674µs
[INFO blflash::flasher] Connection Succeed
[INFO blflash] Bootrom version: 1
[TRACE blflash] Boot info: BootInfo { len: 14, bootrom_version: 1, otp_info: [0, 0, 0, 0, 3, 0, 0, 0, a4, 9b, 2, 42, e8, b4, 1d, 0] }
[INFO blflash::flasher] Sending eflash_loader...
[INFO blflash::flasher] Finished 2.563450723s 11.15KB/s
[TRACE blflash::flasher] 5ms send count 500
[TRACE blflash::flasher] handshake sent elapsed 5.065786ms
[INFO blflash::flasher] Entered eflash_loader
[INFO blflash::flasher] Skip segment addr: 0 size: 47504 sha256 matches
[INFO blflash::flasher] Skip segment addr: e000 size: 272 sha256 matches
[INFO blflash::flasher] Skip segment addr: f000 size: 272 sha256 matches
[INFO blflash::flasher] Skip segment addr: 10000 size: 351584 sha256 matches
[INFO blflash::flasher] Skip segment addr: 1f8000 size: 5671 sha256 matches
[INFO blflash] Success
b Using BL flash_tools
Run flash tools, select the nuttx.bin generated in the previous step in the
Firmware bin field, and refer to the document for the settings of the remaining fields.
6. Run connect terminal to UART (default baudrate 2000000)
$ screen /dev/ttyUSB0 2000000
7. Reset Device
bl602evb: Press reset
DT-BL10: Press and release EN
8. NSH should appear on console
# Using openocd and gdb:
This guide is focused on the bl602evb board. See the reference manual for
how to connect to the JTAG interface for other boards.
1. Make sure you are running a recently built version of openocd. The packaged
versions are very old, and will likely not work. https://github.com/ntfreak/openocd
2. Create a openocd-bl602.cfg file
##############################################################################
adapter driver ftdi
ftdi_vid_pid 0x0403 0x6010
ftdi_channel 1
transport select jtag
adapter speed 2000
ftdi_layout_init 0x00f8 0x00fb
set _CHIPNAME riscv
jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x20000c05
set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME.0 riscv -chain-position $_TARGETNAME
$_TARGETNAME.0 configure -work-area-phys 0x22020000 -work-area-size 0x10000 -work-area-backup 1
echo "Ready for Remote Connections"
$_TARGETNAME.0 configure -event reset-assert-pre {
echo "reset-assert-pre"
adapter speed 100
}
$_TARGETNAME.0 configure -event reset-deassert-post {
echo "reset-deassert-post"
adapter speed 4000
reg mstatus 0x80000000
reg pc 0x21000000
}
$_TARGETNAME.0 configure -event reset-init {
echo "reset-init"
adapter speed 4000
}
gdb_memory_map enable
gdb_flash_program disable
riscv set_prefer_sba on
riscv set_command_timeout_sec 1
init
reset init
##############################################################################
3. Create a openocd.gdb configuration
##############################################################################
target extended-remote :3333
set print asm-demangle on
set backtrace limit 32
mem 0x22008000 0x22014000 rw
mem 0x42008000 0x42014000 rw
mem 0x22014000 0x22020000 rw
mem 0x42014000 0x42020000 rw
mem 0x22020000 0x22030000 rw
mem 0x42020000 0x42030000 rw
mem 0x22030000 0x2204C000 rw
mem 0x42030000 0x4204C000 rw
mem 0x23000000 0x23400000 ro
mem 0x40000000 0x40010000 rw
break __start
stepi
##############################################################################
3. Connect openocd
$ openocd -f openocd-bl602.cfg
Open On-Chip Debugger 0.10.0+dev-01514-ga8edbd020-dirty (2020-11-19-20:11)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Ready for Remote Connections
Info : clock speed 2000 kHz
Info : JTAG tap: riscv.cpu tap/device found: 0x20000c05 (mfg: 0x602 (<unknown>), part: 0x0000, ver: 0x2)
Info : datacount=1 progbufsize=2
Info : Disabling abstract command reads from CSRs.
Info : Examined RISC-V core; found 1 harts
Info : hart 0: XLEN=32, misa=0x40801125
Info : starting gdb server for riscv.cpu.0 on 3333
Info : Listening on port 3333 for gdb connections
Info : JTAG tap: riscv.cpu tap/device found: 0x20000c05 (mfg: 0x602 (<unknown>), part: 0x0000, ver: 0x2)
reset-assert-pre
reset-deassert-post
Info : Disabling abstract command writes to CSRs.
reset-init
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
4. Connect gdb
This is a short demo placing a breakpoint at the entry to nsh.
NOTE: openocd+gdb cannot be used at this time to flash the device.
$ riscv64-unknown-elf-gdb nuttx -x openocd-bl602.gdb
Reading symbols from nuttx...
0x21000000 in ?? ()
Breakpoint 1 at 0x2300000a: file chip/bl602_entry.S, line 41.
Note: automatically using hardware breakpoints for read-only addresses.
0x21000004 in ?? ()
(gdb) b nsh_main
Breakpoint 2 at 0x23003f32: file nsh_main.c, line 123.
(gdb) mon reset halt
JTAG tap: riscv.cpu tap/device found: 0x20000c05 (mfg: 0x602 (<unknown>), part: 0x0000, ver: 0x2)
reset-assert-pre
reset-deassert-post
(gdb) c
Continuing.
Breakpoint 1, bl602_start () at chip/bl602_entry.S:41
41 li t0, MSTATUS_MIE
(gdb) c
Continuing.
Breakpoint 2, nsh_main (argc=1, argc@entry=<error reading variable: value has been optimized out>, argv=0x420134c0, argv@entry=<error reading variable: value has been optimized out>)
at nsh_main.c:123
123 sched_getparam(0, ¶m);
(gdb) bt
#0 nsh_main (argc=1, argc@entry=<error reading variable: value has been optimized out>, argv=0x420134c0, argv@entry=<error reading variable: value has been optimized out>) at nsh_main.c:123
#1 0x230030f0 in nxtask_startup (entrypt=<optimized out>, argc=<optimized out>, argv=<optimized out>) at sched/task_startup.c:165
#2 0x23001362 in nxtask_start () at task/task_start.c:144
#3 0x00000000 in ?? ()
Backtrace stopped: frame did not save the PC