Discussion:
[nuttx] ESP32 [1 Attachment]
ggkinuthia@gmail.com [nuttx]
2016-12-12 20:26:39 UTC
Permalink
Hi,
Has anyone succeeded in running Nuttx on an esp32 board? I have flashed and the board is stuck as per the attachment.
Geoffrey
spudarnia@yahoo.com [nuttx]
2016-12-12 20:37:41 UTC
Permalink
I just completed coding of that port a couple of weeks ago, but I have not yet started debugging it. I could certainly use some help with the bring-up.


I have not tried debugging anything yet. It took me a long time to figure out how to even load code. The OpenOCD port does not yet write to FLASH. The esptool.py has just recently been merged to the master and that is what I planned to use. But haven't tried it yet.


My general plan was to:


1. Put a branch-on-self at the beginning of the NuttX start up code (after disabling the watchdog),


2. My understanding is that if you put the code at 0x1000, then you don't need a partition table. The boot-up sequence is here: General Notes About ESP-IDF Programming — ESP32 Programming Guide 1.0 documentation http://esp-idf.readthedocs.io/en/latest/general-notes.html

General Notes About ESP-IDF Programming — ESP32 Programming Guide 1.0 documentation http://esp-idf.readthedocs.io/en/latest/general-notes.html General Notes About ESP-IDF Programming Application startup flow This note explains various steps which happen before app_main function of an ESP-IDF application is called.



View on esp-idf.readthedocs.io http://esp-idf.readthedocs.io/en/latest/general-notes.html
Preview by Yahoo




2. Use esptool.py to write the code to FLASH. The esptool.py is available in the components/esptool_py/esptool/ directory of the ESP-IDF.


3. When I restart, I think it should be be stuck in the branch-on-self code. I should be able break in with OpenOCD and gdb and debug normally.


Greg
spudarnia@yahoo.com [nuttx]
2016-12-12 20:45:10 UTC
Permalink
I really don't know what I am looking at in your attachment.


It looks like you are trying to run from IRAM. I don't know if that would work given the boot up sequence that I referred to. I think that you have to use the FLASH configuration at 0x1000. That is, at least, according to an email that I got from Expressif. But I don't really know what I am doing with the hardware.


The code was difficult enough, but I am afraid I still don't really know how to debug it yet.
spudarnia@yahoo.com [nuttx]
2016-12-12 23:19:03 UTC
Permalink
Can you post the steps that you did to get to the point shown in your attachment? Thanks.
ggkinuthia@gmail.com [nuttx]
2016-12-13 08:36:32 UTC
Permalink
Hi Greg, Thanks for the reply. I followed the following steps.
After compiling using the default config esp32-core/nsh.


1. Converted nuttx elf to bin file by running: esptool.py --chip esp32 elf2image --flash_mode dio --flash_size 2MB -o ./nuttx.bin nuttx


2. Loaded the nuttx.bin at flash location 0x1000 by running: esptool.py --chip esp32 --port /dev/ttyUSB0 write_flash 0x1000 nuttx.bin


When the compiled code is loaded at 0x1000 the RTC wdt keeps on resetting the SOC while printing the following in the console.


rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0x00
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x00000000,len:65512
ets Jun 8 2016 00:22:57

If I load the code at 0x10000 and the second boot-loader (esp-idf/components/bootloader/src/main) at 0x1000 and partition table(single factory app no OTA) at 0x8000,the last line of output on the console is as follows when the verbose on 2nd boot-loader has being turned on


V (1461) esp_image: loading segment header 0 at offset 0x10018
V (1470) esp_image: segment data length 0xffe8 data starts 0x10020
V (1480) esp_image: loading segment header 1 at offset 0x20008
V (1489) esp_image: segment data length 0x1838 data starts 0x20010
V (1498) esp_image: loading segment header 2 at offset 0x21848
V (1507) esp_image: segment data length 0x54 data starts 0x21850
V (1517) esp_image: loading segment header 3 at offset 0x218a4
V (1526) esp_image: segment data length 0x80 data starts 0x218ac
V (1535) esp_image: loading segment header 4 at offset 0x2192c
V (1544) esp_image: segment data length 0x0 data starts 0x21934
V (1553) esp_image: loading segment header 5 at offset 0x21934
V (1562) esp_image: segment data length 0xe6d4 data starts 0x2193c
V (1571) esp_image: loading segment header 6 at offset 0x30010
V (1580) esp_image: segment data length 0xc610 data starts 0x30018
D (1590) boot: found irom segment, map from 00030018 to 400d0018
I (1599) boot: segment 6: paddr=0x00030010 vaddr=0x400d0018 size=0x0c610 ( 50704) map
D (1612) boot: configure drom and irom and start
V (1619) boot: d mmu set paddr=00020000 vaddr=3f400000 size=6208 n=1
V (1629) boot: rc=0
V (1632) boot: rc=0
V (1635) boot: i mmu set paddr=00030000




Geoffrey


---In ***@yahoogroups.com, <***@...> wrote :

Can you post the steps that you did to get to the point shown in your attachment? Thanks.
ggkinuthia@gmail.com [nuttx]
2016-12-13 09:59:32 UTC
Permalink
If I compile with CONFIG_ESP32CORE_RUN_IRAM=y the RTC wdt does not reset and the console is stuck at

ets Jun 8 2016 00:22:57


rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
ets Jun 8 2016 00:22:57


rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0x00
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3ffb08c0,len:6296
load:0x40080400,len:50832
load:0



Geoffrey
spudarnia@yahoo.com [nuttx]
2016-12-13 13:34:02 UTC
Permalink
Looking at configs/esp32-cores/scripts/ esp32_flash.ld I see two problems that would probably prevent you from running at address 0x1000:


1. It links into several different FLASH and IRAM segments. There is no logic in place to copy the initialized data into IRAM so without a boot loader and a partition table entry, I don't think it would possible to get the code into the write sections without some additional logic to copy the data.


2. The FLASH execution address is iram0_2_seg which is really FLASH at address at address 0x400D0018. It can't really run at any other address.


I think the ESP32 would need a new linker script if it is written to FLASH at address 0x1000. But I don't really have a clue what is going on.


In the IRAM case, my guess is that the IRAM image overwrites some bootloader code and prevents execution. It seems like you should be able to use OpenOCD+gdb to break in, load the code into IRAM, and force the PC to the NuttX entry point. But there are also a lot of uncertainties in that.


The safest thing to do would be to build a partition table for NuttX but I would have to learn how to do that.


I have something else I need to finish up this morning, but I can look at the ESP32 more later today. Your work is inspiring me to try more things.


Greg
ggkinuthia@gmail.com [nuttx]
2016-12-13 16:41:11 UTC
Permalink
I will try and dig more as am new to this chip.In the meantime I am ordering a JTAG adapter as it will be handy to figure our what is going on.


Thank you.
Geoffrey
Angus Gratton angus@espressif.com [nuttx]
2016-12-14 05:13:28 UTC
Permalink
Hi Geoffrey & Greg,

I apologise I don't have time to provide more in-depth help, but I
pulled down nuttx git master and worked through the steps required to
flash & run code. At the moment my nuttx esp32 doesn't start up fully
(something goes wrong configuring serial output), but I thought I'd post
the little bit that I had.

I've attached 3 small patches:

- Patch 1 temporarily moves all data from flash to IRAM, which allows
nuttx to run without needing to set up flash cache mappings.

... At this stage the nuttx image is small enough to be entirely
memory-resident, once board support is more mature you can add flash
cache mapping code to run from SPI flash after initial boot. There are
at least two possible approaches you could take: You can add the flash
cache mapping code into nuttx directly, so it is self-contained - early
nuttx initialisation runs from IRAM and enables flash cache, and then
off you go. Or you can use the esp-idf software bootloader & partition
table scheme, and have nuttx be an esp-idf "app" - which allows
interoperability with the esp-idf system but makes you reliant on the
esp-idf design for these parts. Both are possible.

- Patch 2 flushes the UART TX buffer in the esp32 serial shutdown
routine. The ROM bootloader does not flush the FIFO before handing over
to user code, so some of this output is not currently seen when the UART
is reconfigured in early stages of startup.

- Patch 3 changes the openocd config file's default flash voltage from
1.8V to 3.3V. This is not necessary right now, but may save some
hard-to-debug moments down the track (3.3V-only flash running at 1.8V
often half-works and does weird things...)


To build/flash without using openocd:

1) Configure nuttx for esp32-core and build as usual

2) Clone the esp32 branch of esptool.py somewhere:

git clone -b feature/esp32_v20_refactor
https://github.com/espressif/esptool.git

(ESP32 support is not in the master branch yet, although I'm working on
this!)

You will also need Python 2.x & pyserial, the esptool README on github
has more details.

3) Convert the nuttx ELF file to the esp32 ROM bootloader's image format:

esptool.py --chip esp32 elf2image --flash_mode dio --flash_size 4MB -o
./nuttx-esp32.bin ./nuttx

4) Flash to the ESP32 over serial at offset 0x1000 (this is the address
read by the ESP32 ROM bootloader):

esptool.py --port COMx --baud 921600 write_flash -z --flash_mode dio
0x1000 nuttx-esp32.bin

(The -z and the --baud are optional but improve flashing speed quite a bit.)

5) Connect to the serial port at 115200bps, press the "Reset" button on
the ESP32 board (sometimes marked "EN")

6) Output from the ROM bootloader will look something like this:

ets Jun 8 2016 00:22:57

rst:0x10 (RTCWDT_RTC_RESET),boot:0x16 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0x00
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3ffb08b8,len:84
load:0x3ffb0910,len:6200
load:0x40080400,len:132
load:0x40080484,len:50732
load:0x400c0000,len:0
entry 0x4008041c

In the above output, some helpful things:

- The"mode: DIO" indicates SPI flash access mode (matches the esptool.py
--flash_mode argument). DIO mode is necessary with the current ESP32
Core boards, their flash chip doesn't work with QIO. If QIO is set then
the next few lines will have junk addresses, and the image won't load
correctly.

- The load: lines have load addresses and lengths taken from the ELF, ie
they match the output of 'xtensa-esp32-elf-objdump -h nuttx'

- The 'entry' line shows the entry point (address of nuttx __start function)

- If you don't apply Patch 2 to flush the FIFO, output will be cut off
somewhere in the middle of the second-last line, because the FIFO isn't
empty when the UART is disabled by user code.



To build/flash using openocd:

- It should be possible to bypass esptool.py entirely, use gdb to 'load'
the RAM-only nuttx ELF file, and then execute 'set $pc=__start' to set
the PC and continue/step directly into nuttx. This causes my openocd to
become very unhappy, I'm not sure why at the moment. I've CCed Jeroen
who is our esp32 openocd guru, he may have some advice.

- Similarly, it's possible to compile in a " __asm__ __volatile__
("break 0, 0");" in the code to trip a breakpoint. This works for me,
gdb halts on the breakpoint, but I can't step for some reason.

openocd works in the esp-idf environment, so I'm guessing this is either
something peculiar to my hardware, or something else needed when setting
"ESP32_RTOS" to "none".


One last thing to note, the ROM linker script includes an "ets_printf"
function which has the same signature as printf. You can use this as an
alternative for early boot debugging, until openocd is working smoothly.


Angus
spudarnia@yahoo.com [nuttx]
2016-12-14 14:37:12 UTC
Permalink
Hi, Angus,
Post by Angus Gratton ***@espressif.com [nuttx]
I apologise I don't have time to provide more in-depth help, but I
pulled down nuttx git master and worked through the steps required to
flash & run code. At the moment my nuttx esp32 doesn't start up fully
(something goes wrong configuring serial output), but I thought I'd post
the little bit that I had.
We appreciate your time. I know you guys have been busy but we could really use the help
Post by Angus Gratton ***@espressif.com [nuttx]
- Patch 1 temporarily moves all data from flash to IRAM, which allows
nuttx to run without needing to set up flash cache mappings.
This logic is already in place. Correct me if I am mistaken. There is a configuration option CONFIG_ESP32CORE_RUN_IRAM that should support running out of IRAM. There are two main linker scripts (1) esp32_flash.ld which is basically the one from the ESP-IDF and (2) esp32_iram.ld which puts .text and .rodata into IRAM. I think that does the same thing as your patch to esp32_flash.ld.

If so then just setting CONFIG_ESP32CORE_RUN_IRAM=y in the .config file should accomplish the same thing.
Post by Angus Gratton ***@espressif.com [nuttx]
... At this stage the nuttx image is small enough to be entirely
memory-resident, once board support is more mature you can add flash
cache mapping code to run from SPI flash after initial boot. There are
at least two possible approaches you could take: You can add the flash
cache mapping code into nuttx directly, so it is self-contained - early
nuttx initialisation runs from IRAM and enables flash cache, and then
off you go. Or you can use the esp-idf software bootloader & partition
table scheme, and have nuttx be an esp-idf "app" - which allows
interoperability with the esp-idf system but makes you reliant on the
esp-idf design for these parts. Both are possible.
This is the kind of stuff that I am clueless about. I know that there are a mountain of documents in the Expressif GIT repositories and if I had sufficient discipline to plough through them, I might be more knowledgable. But, sadly, I am not so disciplined.
Post by Angus Gratton ***@espressif.com [nuttx]
- Patch 2 flushes the UART TX buffer in the esp32 serial shutdown
routine. The ROM bootloader does not flush the FIFO before handing over
to user code, so some of this output is not currently seen when the UART
is reconfigured in early stages of startup.
- Patch 3 changes the openocd config file's default flash voltage from
1.8V to 3.3V. This is not necessary right now, but may save some
hard-to-debug moments down the track (3.3V-only flash running at 1.8V
often half-works and does weird things...)
I have incorporated both of these changes.
Post by Angus Gratton ***@espressif.com [nuttx]
...
Thanks for the detailed steps. There are lots of things that I did not know in there.

Is it possible to debug with OpenOCD with NuttX now. I was not sure from your last comments. You were having problems running directly out of IRAM.

If should be possible to debug out of FLASH was well, right? But I would need to put some kind of branch-on-self logic early in the start-up sequence so that I could break in with the OpenOCD.

Please let us know when you learn anything new about debugging from IRAM.
Post by Angus Gratton ***@espressif.com [nuttx]
One last thing to note, the ROM linker script includes an "ets_printf"
function which has the same signature as printf. You can use this as an
alternative for early boot debugging, until openocd is working smoothly.
That sounds like the thing to use for debugging in the meantime.

If I break in using OpenOCD and execute from IRAM, what will be the state of the clocking? The is no clock configuration logic in NuttX now (there is but is it #ifdef'ed out). The assumption is that that clocking will be at the crystal frequency which, for me, is 40MHz.

Greg
spudarnia@yahoo.com [nuttx]
2016-12-14 15:26:08 UTC
Permalink
Post by Angus Gratton ***@espressif.com [nuttx]
openocd works in the esp-idf environment, so I'm guessing this is either
something peculiar to my hardware, or something else needed when setting
"ESP32_RTOS" to "none".
You might consider adding NuttX to OpenOCD at some point in the future. The changes are available here: https://github.com/sony/openocd-nuttx/wiki

Greg
spudarnia@yahoo.com [nuttx]
2016-12-14 16:42:06 UTC
Permalink
I have some minor debug progress I can report to you. Here is the configuration I am using:

configs/esp32-core/nsh with

CONFIG_DEBUG_ASSERTIONS=y
CONFIG_DEBUG_FEATURES=y
CONFIG_DEBUG_SYMBOLS=y
CONFIG_ESP32CORE_RUN_IRAM=y

I also made this change which will eliminate all attempts to re-configure serial. It will just use the serial settings as they were left by the bootloader:

diff --git a/arch/xtensa/src/common/xtensa.h b/arch/xtensa/src/common/xtensa.h
index 422ec0b..8707d7c 100644
--- a/arch/xtensa/src/common/xtensa.h
+++ b/arch/xtensa/src/common/xtensa.h
@@ -60,7 +60,7 @@
#undef CONFIG_SUPPRESS_INTERRUPTS /* DEFINED: Do not enable interrupts */
#undef CONFIG_SUPPRESS_TIMER_INTS /* DEFINED: No timer */
#undef CONFIG_SUPPRESS_SERIAL_INTS /* DEFINED: Console will poll */
-#undef CONFIG_SUPPRESS_UART_CONFIG /* DEFINED: Do not reconfigure UART */
+#define CONFIG_SUPPRESS_UART_CONFIG 1 /* DEFINED: Do not reconfigure UART */
#define CONFIG_SUPPRESS_CLOCK_CONFIG 1 /* DEFINED: Do not reconfigure clocking */
#undef CONFIG_DUMP_ON_EXIT /* DEFINED: Dump task state on exit */

Start OpenOCD:

cd ../openocde-esp32
cp ../nuttx/configs/esp32-core/scripts/esp32.cfg .
sudo ./src/openocd -s ./tcl/ -f tcl/interface/ftdi/olimex-arm-usb-ocd.cfg -f ./esp32.cfg

Start GDB and load code:

cd ../nuttx
xtensa-esp32-elf-gdb -ex 'target remote localhost:3333' nuttx
(gdb) load nuttx
(gdb) mon reg pc [value report by load for entry point]
(gdb) s

Single stepping works fine for me as do breakpoints. I get quite a way through initialization, into os_start() and into up_initialize(), and through up_irqinitialize() but it fails in xtensa_timer_initialize() immediatly upon enabling interrupts:

Breakpoint 1, xtensa_timer_initialize () at chip/esp32_timerisr.c:172
72 {
(gdb) n
esp32.cpu0: Target halted, pc=0x400835BF
187 g_tick_divisor = divisor;
(gdb)
esp32.cpu0: Target halted, pc=0x400835C2
esp32.cpu0: Target halted, pc=0x400835C5
esp32.cpu0: Target halted, pc=0x400835C8
191 count = xtensa_getcount();
(gdb)
esp32.cpu0: Target halted, pc=0x400835CB
192 xtensa_setcompare(count + divisor);
(gdb) p count
$8 = <optimized out>
(gdb) n
esp32.cpu0: Target halted, pc=0x400835CE
esp32.cpu0: Target halted, pc=0x400835D1
200 (void)irq_attach(XTENSA_IRQ_TIMER0, (xcpt_t)esp32_timerisr);
(gdb)
esp32.cpu0: Target halted, pc=0x400835D4
esp32.cpu0: Target halted, pc=0x400835D6
esp32.cpu0: Target halted, pc=0x40088A10
esp32.cpu0: Target halted, pc=0x400835D9
204 up_enable_irq(ESP32_CPUINT_TIMER0);
(gdb)
esp32.cpu0: Target halted, pc=0x400835DB
esp32.cpu0: Target halted, pc=0x400833A0
esp32.cpu0: Target halted, pc=0x400803C0

Program received signal SIGTRAP, Trace/breakpoint trap.
0x400803c0 in ?? ()
(gdb)

I take that to mean that there is a bug in my interrupt handling assembly language. That is to be expected at this point.

Thanks a lot for helping get that effort off the ground.

Greg
Angus Gratton angus@espressif.com [nuttx]
2016-12-16 06:28:32 UTC
Permalink
Hi Greg,

My apologies for not looking hard enough to see that run-from-IRAM
support was already there! Very glad to see you're up and running with a
debugger.

I've documented the issue I was seeing with compiled-in breakpoints
here, along with a workaround:
https://github.com/espressif/openocd-esp32/issues/2

Hoping to spend some time on the esp32 openocd port soon, in order to
clean up some of the rough edges (and will look at adding NuttX thread
awareness, once the NuttX scheduler is up and running!)
This is the kind of stuff that I am clueless about. I know that there
are a mountain of documents in the Expressif GIT repositories and if I
had sufficient discipline to plough through them, I might be more
knowledgable. But, sadly, I am not so disciplined.
I would suggest keeping the NuttX port standalone for now, which means
you can ignore the esp-idf partition table & software bootloader
concepts. The amount of work required in NuttX to add flash cache
mappings (for running from flash) is fairly minor, and should be easy to
add after the code runs smoothly in IRAM.

An option to integrate with the esp-idf bootloader and partition table
can also be quite easily added to the config at a later stage, if
someone wants to be able to run OTA updates between esp-idf and NuttX
apps (this seems like the only use case for integrating them, that I can
think of.)


Angus
I have some minor debug progress I can report to you. Here is the
configs/esp32-core/nsh with
CONFIG_DEBUG_ASSERTIONS=y
CONFIG_DEBUG_FEATURES=y
CONFIG_DEBUG_SYMBOLS=y
CONFIG_ESP32CORE_RUN_IRAM=y
I also made this change which will eliminate all attempts to
re-configure serial. It will just use the serial settings as they were
diff --git a/arch/xtensa/src/common/xtensa.h
b/arch/xtensa/src/common/xtensa.h
index 422ec0b..8707d7c 100644
--- a/arch/xtensa/src/common/xtensa.h
+++ b/arch/xtensa/src/common/xtensa.h
@@ -60,7 +60,7 @@
#undef CONFIG_SUPPRESS_INTERRUPTS /* DEFINED: Do not enable interrupts */
#undef CONFIG_SUPPRESS_TIMER_INTS /* DEFINED: No timer */
#undef CONFIG_SUPPRESS_SERIAL_INTS /* DEFINED: Console will poll */
-#undef CONFIG_SUPPRESS_UART_CONFIG /* DEFINED: Do not reconfigure UART */
+#define CONFIG_SUPPRESS_UART_CONFIG 1 /* DEFINED: Do not reconfigure
UART */
#define CONFIG_SUPPRESS_CLOCK_CONFIG 1 /* DEFINED: Do not reconfigure clocking */
#undef CONFIG_DUMP_ON_EXIT /* DEFINED: Dump task state on exit */
cd ../openocde-esp32
cp ../nuttx/configs/esp32-core/scripts/esp32.cfg .
sudo ./src/openocd -s ./tcl/ -f
tcl/interface/ftdi/olimex-arm-usb-ocd.cfg -f ./esp32.cfg
cd ../nuttx
xtensa-esp32-elf-gdb -ex 'target remote localhost:3333' nuttx
(gdb) load nuttx
(gdb) mon reg pc [value report by load for entry point]
(gdb) s
Single stepping works fine for me as do breakpoints. I get quite a way
through initialization, into os_start() and into up_initialize(), and
through up_irqinitialize() but it fails in xtensa_timer_initialize()
Breakpoint 1, xtensa_timer_initialize () at chip/esp32_timerisr.c:172
72 {
(gdb) n
esp32.cpu0: Target halted, pc=0x400835BF
187 g_tick_divisor = divisor;
(gdb)
esp32.cpu0: Target halted, pc=0x400835C2
esp32.cpu0: Target halted, pc=0x400835C5
esp32.cpu0: Target halted, pc=0x400835C8
191 count = xtensa_getcount();
(gdb)
esp32.cpu0: Target halted, pc=0x400835CB
192 xtensa_setcompare(count + divisor);
(gdb) p count
$8 = <optimized out>
(gdb) n
esp32.cpu0: Target halted, pc=0x400835CE
esp32.cpu0: Target halted, pc=0x400835D1
200 (void)irq_attach(XTENSA_IRQ_TIMER0, (xcpt_t)esp32_timerisr);
(gdb)
esp32.cpu0: Target halted, pc=0x400835D4
esp32.cpu0: Target halted, pc=0x400835D6
esp32.cpu0: Target halted, pc=0x40088A10
esp32.cpu0: Target halted, pc=0x400835D9
204 up_enable_irq(ESP32_CPUINT_TIMER0);
(gdb)
esp32.cpu0: Target halted, pc=0x400835DB
esp32.cpu0: Target halted, pc=0x400833A0
esp32.cpu0: Target halted, pc=0x400803C0
Program received signal SIGTRAP, Trace/breakpoint trap.
0x400803c0 in ?? ()
(gdb)
I take that to mean that there is a bug in my interrupt handling
assembly language. That is to be expected at this point.
Thanks a lot for helping get that effort off the ground.
Greg
ggkinuthia@gmail.com [nuttx]
2016-12-19 04:19:34 UTC
Permalink
Dear Greg, Thank you !!. I am also getting the nsh prompt. In my case Nuttx is flashed at 0x1000 and directly loaded by the first boot loader.
Great work!
Rgds,
Geoffrey

Continue reading on narkive:
Loading...