Skip to content

Commit 1977a3e

Browse files
committed
Progress with getting XMODEM updates working.
1 parent ac07156 commit 1977a3e

4 files changed

Lines changed: 414 additions & 106 deletions

File tree

hal/s32k1xx.c

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,13 @@
2828
#include "hal.h"
2929
#include "printf.h"
3030

31+
/* Override RAMFUNCTION for test-app: when RAM_CODE is set but not __WOLFBOOT,
32+
* we still need flash functions to run from RAM for self-programming. */
33+
#if defined(RAM_CODE) && !defined(__WOLFBOOT)
34+
#undef RAMFUNCTION
35+
#define RAMFUNCTION __attribute__((used,section(".ramcode"),long_call))
36+
#endif
37+
3138
/* Assembly helpers */
3239
#define DMB() __asm__ volatile ("dmb")
3340
#define DSB() __asm__ volatile ("dsb")
@@ -280,43 +287,47 @@ void uart_init(void)
280287
LPUART_CTRL = LPUART_CTRL_TE | LPUART_CTRL_RE;
281288
}
282289

290+
/* Transmit a single byte (raw, no conversion) - RAMFUNCTION for use during flash ops */
291+
void RAMFUNCTION uart_tx(uint8_t byte)
292+
{
293+
while (!(LPUART1_STAT & LPUART_STAT_TDRE)) {}
294+
LPUART1_DATA = byte;
295+
while (!(LPUART1_STAT & LPUART_STAT_TC)) {}
296+
}
297+
298+
/* Used for sending ASCII and CRLF conversions */
283299
void uart_write(const char* buf, unsigned int sz)
284300
{
285301
unsigned int i;
286-
287302
for (i = 0; i < sz; i++) {
288303
/* Handle newline -> CRLF conversion */
289304
if (buf[i] == '\n') {
290-
/* Wait for transmit buffer empty */
291-
while (!(LPUART_STAT & LPUART_STAT_TDRE)) {}
292-
LPUART_DATA = '\r';
305+
uart_tx('\r');
293306
}
294-
295-
/* Wait for transmit buffer empty */
296-
while (!(LPUART_STAT & LPUART_STAT_TDRE)) {}
297-
LPUART_DATA = buf[i];
307+
uart_tx(buf[i]);
298308
}
299309

300310
/* Wait for transmission complete */
301311
while (!(LPUART_STAT & LPUART_STAT_TC)) {}
302312
}
303313

304-
/* Read a single character from UART (non-blocking)
305-
* Returns: 1 if character read, 0 if no data available, -1 on error
314+
315+
316+
/* Read a single character from UART (non-blocking) - RAMFUNCTION for use during flash ops
317+
* Returns: 1 if character read, 0 if no data available
306318
*/
307-
int uart_read(char* c)
319+
int RAMFUNCTION uart_read(char* c)
308320
{
309-
uint32_t stat = LPUART_STAT;
321+
uint32_t stat = LPUART1_STAT;
310322

311-
/* Clear any error flags */
323+
/* Clear any error flags first */
312324
if (stat & (LPUART_STAT_OR | LPUART_STAT_NF | LPUART_STAT_FE | LPUART_STAT_PF)) {
313-
LPUART_STAT = stat; /* Write 1 to clear flags */
314-
return -1;
325+
LPUART1_STAT = stat; /* Write 1 to clear flags */
315326
}
316327

317-
/* Check if data available */
328+
/* Check if data available - read even if there was an error */
318329
if (stat & LPUART_STAT_RDRF) {
319-
*c = (char)(LPUART_DATA & 0xFF);
330+
*c = (char)(LPUART1_DATA & 0xFF);
320331
return 1;
321332
}
322333

hal/s32k1xx.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,29 @@
7474
#define CLOCK_SPEED 48000000UL
7575
#endif
7676

77+
/* ============== NVIC - Nested Vectored Interrupt Controller ============== */
78+
#define NVIC_BASE (0xE000E100UL)
79+
#define NVIC_ISER(n) (*(volatile uint32_t *)(NVIC_BASE + 0x000UL + 4*(n))) /* Interrupt Set Enable */
80+
#define NVIC_ICER(n) (*(volatile uint32_t *)(NVIC_BASE + 0x080UL + 4*(n))) /* Interrupt Clear Enable */
81+
#define NVIC_ISPR(n) (*(volatile uint32_t *)(NVIC_BASE + 0x100UL + 4*(n))) /* Interrupt Set Pending */
82+
#define NVIC_ICPR(n) (*(volatile uint32_t *)(NVIC_BASE + 0x180UL + 4*(n))) /* Interrupt Clear Pending */
83+
#define NVIC_IPR(n) (*(volatile uint32_t *)(NVIC_BASE + 0x300UL + 4*(n))) /* Interrupt Priority */
84+
85+
/* S32K142 LPUART IRQ numbers */
86+
#define LPUART0_IRQn 31
87+
#define LPUART1_IRQn 33
88+
#define LPUART2_IRQn 35
89+
90+
/* NVIC helper macros */
91+
#define NVIC_EnableIRQ(irq) NVIC_ISER((irq) >> 5) = (1UL << ((irq) & 0x1F))
92+
#define NVIC_DisableIRQ(irq) NVIC_ICER((irq) >> 5) = (1UL << ((irq) & 0x1F))
93+
#define NVIC_SetPriority(irq, prio) \
94+
do { \
95+
uint32_t _idx = (irq) >> 2; \
96+
uint32_t _shift = (((irq) & 0x3) << 3) + 4; \
97+
NVIC_IPR(_idx) = (NVIC_IPR(_idx) & ~(0xFUL << _shift)) | (((prio) & 0xF) << _shift); \
98+
} while(0)
99+
77100
/* ============== System Control Registers ============== */
78101

79102
/* SCG - System Clock Generator */

0 commit comments

Comments
 (0)