casaroli opened a new pull request, #19538:
URL: https://github.com/apache/nuttx/pull/19538

   ## Summary
   
   `boards/arm/mps/mps2-an521/configs/nsh/defconfig` has 
`CONFIG_CMSDK_UART0_TX_IRQ`
   and `CONFIG_CMSDK_UART0_RX_IRQ` the wrong way round.
   
   The SSE-200 subsystem the AN521 image implements lists the UART interrupts
   receive first: UART0 RX is external interrupt 32 and UART0 TX is 33, which in
   NuttX numbering are 48 and 49. The configuration had 49 for RX and 48 for 
TX, so
   the TX interrupt was dispatched to `uart_cmsdk_rx_interrupt()`.
   
   That handler acknowledges only `UART_INTSTATUS_RX`:
   
   ```c
   static int uart_cmsdk_rx_interrupt(int irq, FAR void *context, FAR void *arg)
   {
     ...
     uart_cmsdk_serialout(priv, UART_INTSTS_OFFSET, UART_INTSTATUS_RX);
     uart_recvchars(dev);
     return OK;
   }
   ```
   
   so the asserted TX status bit survived the acknowledgement and the interrupt
   re-fired immediately. The board live-locked in the interrupt handler as soon 
as
   the console emitted its first character.
   
   Two things corroborate the ordering rather than just the symptom:
   
   * the overflow interrupt in the same configuration is already at 63, external
     47, which is where the SSE-200 map puts it only if the pair below it is
     receive first;
   * `mps2-an500` already follows the same convention, RX at 16 and TX at 17.
   
   ## Impact
   
   `mps2-an521:nsh` only. No source changes, no API or build changes, and no 
other
   board is touched.
   
   Before this change the board is unusable at runtime under QEMU: the NSH 
greeting
   appears and nothing runs afterwards, console input included. After it, NSH is
   interactive. Anyone who has been building this configuration in CI would not
   have noticed, since it was never run.
   
   ## Testing
   
   Host: macOS 15 (Darwin 25.5.0, arm64), `arm-none-eabi-gcc` 14.2.Rel1,
   QEMU 10.1.0. Board: `mps2-an521:nsh`, run with
   
   ```
   qemu-system-arm -M mps2-an521 -nographic -kernel ./nuttx
   ```
   
   ### Before
   
   The greeting is printed and the console is dead. Typing `help` produces 
nothing;
   the run below sat for 30 s after the prompt:
   
   ```
   NuttShell (NSH) NuttX-12.2.1
   ```
   
   Attaching gdb shows why. The board is in an interrupt entered from the very
   first console write, and stays there:
   
   ```
   #0  exception_direct () at armv8-m/arm_doirq.c:48
   #1  <signal handler called>
   #2  setbasepri (basepri=0) at include/arch/armv8-m/irq.h:344
   #3  0x100093ba in up_irq_restore (flags=0 '\000') at 
include/arch/armv8-m/irq.h:385
   #4  0x100098b8 in uart_cmsdk_txint (dev=0x38000088 <g_uart0port>, 
enable=true)
       at serial/serial_cmsdk.c:653
   #5  0x1000aae0 in uart_writev (filep=0x38003fb0, uio=0x380074f8) at 
serial/serial.c:1639
   #6  0x1001bc5a in file_writev (filep=0x38003fb0, iov=0x38007568, iovcnt=1) 
at vfs/fs_write.c:202
   #7  0x1001bca8 in nx_writev (fd=1, iov=0x38007568, iovcnt=1) at 
vfs/fs_write.c:301
   #8  0x1001bcd0 in writev (fd=1, iov=0x38007568, iovcnt=1) at 
vfs/fs_write.c:401
   #9  0x1001bd22 in write (fd=1, buf=0x1003fdb4 <g_nshgreeting>, nbytes=30) at 
vfs/fs_write.c:466
   ```
   
   Sampling repeatedly always lands in the same place, and with the earlier 
build
   the frame below `exception_direct` is `uart_cmsdk_rx_interrupt (irq=49, 
...)`,
   which is the TX interrupt arriving at the RX handler.
   
   ### After
   
   The board reaches the idle loop and NSH is interactive. `help` was driven 
over a
   pty three times in a row and produced its output every time:
   
   ```
   nsh-fixed : help worked 3/3
   ```
   
   and a gdb sample now lands in the idle loop rather than in the handler:
   
   ```
   #0  0x10001a74 in nx_start () at init/nx_start.c:769
   769        up_idle();
   #1  0x100002e4 in __start () at chip/mps_start.c:192
   ```
   
   ### Wider run
   
   The same corrected interrupt numbers were used to run a full filesystem test
   suite on this board to completion, 90 checks including power-loss injection
   sweeps, over the NSH console:
   
   ```
   ==== 90 passed, 0 failed ====
   ```
   
   The identical suite passes on `mps2-an500` with its existing, already-correct
   interrupt numbers, which is the cross-check that the two boards now agree.
   
   `tools/checkpatch.sh -g origin/master..HEAD` passes.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to