diff --git a/software/common/bootloader/bootloader.c b/software/common/bootloader/bootloader.c index 1d4f0b15fa08af1d4d7f049918ae22efd922168a..a0d402f34a7a5572b0a831489d28f3dbdd64d1be 100644 --- a/software/common/bootloader/bootloader.c +++ b/software/common/bootloader/bootloader.c @@ -52,16 +52,31 @@ #include "CMSDK_CM4.h" #endif +#define UART_CTRL_TXEN CMSDK_UART_CTRL_TXEN_Msk +#define UART_CTRL_RXEN CMSDK_UART_CTRL_RXEN_Msk +#define UART_CTRL_TXRXEN (CMSDK_UART_CTRL_TXEN_Msk + CMSDK_UART_CTRL_RXEN_Msk) +#define UART_CTRL_TXIRQEN (CMSDK_UART_CTRL_TXIRQEN_Msk + UART_CTRL_TXRXEN) +#define UART_CTRL_RXIRQEN (CMSDK_UART_CTRL_RXIRQEN_Msk + UART_CTRL_TXRXEN) + +/* Global variables */ +volatile int uart1_char; + void UartStdOutInit(void) { - CMSDK_UART2->CTRL = 0x00; // re-init - CMSDK_UART2->BAUDDIV = 6250; //(240MHz/384000) in 16.4 format - CMSDK_UART2->CTRL = 0x01; //TX, UART2 - CMSDK_USRT2->CTRL = 0x00; //re-init - CMSDK_USRT2->CTRL = 0x03; //RX+TX, FT1248 USRT - CMSDK_GPIO1->ALTFUNCSET = (1<<5); - if ((CMSDK_USRT2->STATE & 1)==0) CMSDK_USRT2->DATA = 0x23; // write 8'b01000011 / "#" - if ((CMSDK_UART2->STATE & 1)==0) CMSDK_UART2->DATA = 0x7e; // write 8'b01111110 / "~" + if (CMSDK_GPIO1->DATA & 0x80) {// high if FT1248 + CMSDK_UART2->CTRL = 0x00; // re-init + CMSDK_UART2->BAUDDIV = 6250; //(240MHz/384000) in 16.4 format + CMSDK_UART2->CTRL = UART_CTRL_TXEN; //TX, UART2 + CMSDK_GPIO1->ALTFUNCSET = (1<<5); + if ((CMSDK_UART2->STATE & 1)==0) CMSDK_UART2->DATA = 0x7e; // write 8'b01111110 / "~" + } else { // EXTIO mode - Data on UART1 + CMSDK_UART1->CTRL = 0x00; //re-init + CMSDK_UART1->CTRL = UART_CTRL_TXRXEN; //RX+TX, EXTIO + if ((CMSDK_UART1->STATE & 1)==0) CMSDK_UART1->DATA = 0x7e; // write 8'b01111110 / "~" + } + CMSDK_USRT2->CTRL = 0x00; //re-init + CMSDK_USRT2->CTRL = UART_CTRL_TXRXEN; //RX+TX, FT1248/EXTIO USRT + if ((CMSDK_USRT2->STATE & 1)==0) CMSDK_USRT2->DATA = 0x23; // write 8'b01000011 / "#" return; } @@ -71,8 +86,8 @@ unsigned char UartPutc(unsigned char my_ch) // while ((CMSDK_UART2->STATE & 1)); // Wait if Transmit Holding register is full // CMSDK_UART2->DATA = my_ch; // write to transmit holding register // return (my_ch); - while (((CMSDK_USRT2->STATE & 1)==1) && ((CMSDK_UART2->STATE & 1)==1)); // Wait if both Transmit Holding registers full - if ((CMSDK_USRT2->STATE & 1)==0) CMSDK_USRT2->DATA = my_ch; // write to transmit holding register + while (((CMSDK_USRT2->STATE & 1)==1) ); // Wait if Transmit Holding register full + CMSDK_USRT2->DATA = my_ch; // write to transmit holding register return (my_ch); } // Uart string output @@ -134,12 +149,34 @@ void FlashLoader(void) int main (void) { - // UART init + // STDOUT init UartStdOutInit(); - - UartPuts("\nSoCLabs NanoSoC ARM-CM0+ADP+FT1+U38400 20240110\n"); -// UartPuts("\nSoCLabs NanoSoC\n"); + UartPuts("\nSoCLabs NanoSoC'24 ARM-CM0+ADP+"); + if (CMSDK_GPIO1->DATA & 0x80) // high if FT1248, low if EXTIO + UartPuts("FT1+U38400"); + else + UartPuts("EXTIO8x4CD"); + UartPuts(" 20241212\n"); + NVIC_EnableIRQ(UARTRX1_IRQn); + NVIC_EnableIRQ(UARTTX1_IRQn); + CMSDK_UART1->CTRL = UART_CTRL_RXIRQEN; // Enable RX interrupt + FlashLoader(); return 0; } +void UARTRX1_Handler(void) +{ + uart1_char = CMSDK_UART1->DATA; // read and store the byte received + CMSDK_UART1->INTCLEAR = CMSDK_UART_CTRL_RXIRQ_Msk; // Clear RX interrupt req + CMSDK_UART1->CTRL = UART_CTRL_TXIRQEN; // Enable TX interrupt + return; +} + +void UARTTX1_Handler(void) +{ + CMSDK_UART1->DATA = uart1_char; // write the byte to transmit + CMSDK_UART1->INTCLEAR = CMSDK_UART_CTRL_TXIRQ_Msk; // Clear TX interrupt req + CMSDK_UART1->CTRL = UART_CTRL_RXIRQEN; // Re-Enable RX interrupt + return; +} diff --git a/testcodes/bootloader/bootloader.hex b/testcodes/bootloader/bootloader.hex index c8c4811ea1193b2ba1aa2794cdf6f68bea773754..68133be5984446712a3f0283c8244129b70cc9ca 100644 --- a/testcodes/bootloader/bootloader.hex +++ b/testcodes/bootloader/bootloader.hex @@ -2,16 +2,16 @@ 04 00 30 -95 -02 +15 +03 00 10 -9D -02 +1D +03 00 10 -9F -02 +1F +03 00 10 00 @@ -42,8 +42,8 @@ 00 00 00 -A1 -02 +21 +03 00 10 00 @@ -54,140 +54,140 @@ A1 00 00 00 -A3 -02 +23 +03 00 10 -A5 -02 +25 +03 00 10 -A7 -02 +27 +03 00 10 -A7 -02 +27 +03 00 10 -A7 +53 02 00 10 -A7 +65 02 00 10 -A7 -02 +27 +03 00 10 -A7 -02 +27 +03 00 10 -A7 -02 +27 +03 00 10 -A7 -02 +27 +03 00 10 -A7 -02 +27 +03 00 10 -A7 -02 +27 +03 00 10 -A7 -02 +27 +03 00 10 -A7 -02 +27 +03 00 10 -A7 -02 +27 +03 00 10 -A7 -02 +27 +03 00 10 -A7 -02 +27 +03 00 10 -A7 -02 +27 +03 00 10 -A7 -02 +27 +03 00 10 -A7 -02 +27 +03 00 10 -A7 -02 +27 +03 00 10 -A7 -02 +27 +03 00 10 -A7 -02 +27 +03 00 10 -A7 -02 +27 +03 00 10 -A7 -02 +27 +03 00 10 -A7 -02 +27 +03 00 10 -A7 -02 +27 +03 00 10 -A7 -02 +27 +03 00 10 -A7 -02 +27 +03 00 10 -A7 -02 +27 +03 00 10 -A7 -02 +27 +03 00 10 -A7 -02 +27 +03 00 10 -A7 -02 +27 +03 00 10 -A7 -02 +27 +03 00 10 00 @@ -250,11 +250,11 @@ AB 43 18 47 -3C +BC 02 00 00 -5C +DC 02 00 00 @@ -324,8 +324,8 @@ B5 BD 00 F0 -C5 -F8 +05 +F9 11 46 FF @@ -334,12 +334,12 @@ F7 FF 00 F0 -59 +60 F8 00 F0 -DD -F8 +1D +F9 03 B4 FF @@ -350,8 +350,8 @@ FF BC 00 F0 -E3 -F8 +23 +F9 00 00 00 @@ -366,43 +366,69 @@ F8 47 00 00 -29 -48 +30 +B4 +41 +4C +20 +68 +7E +23 +00 +06 00 +21 +03 22 -82 +00 +28 +0C +DA +3E +48 +81 60 -29 -49 -01 +3E +4D +05 61 01 -21 -81 -60 -28 -49 -8A -60 -03 -22 -8A +25 +85 60 -27 -4B 20 -22 -9A +25 +A5 61 -4A +44 68 -D2 +E4 07 -01 +08 D1 -23 -22 -0A +03 +60 +06 +E0 +39 +48 +81 +60 +82 +60 +44 +68 +E4 +07 +00 +D1 +03 +60 +37 +48 +81 +60 +82 60 41 68 @@ -410,65 +436,53 @@ C9 07 01 D1 -7E +23 21 01 60 +30 +BC 70 47 -1D -4A -1E +32 49 -4B -68 -DB -07 -02 -D0 -53 -68 -DB -07 -F9 -D1 4A 68 D2 07 -00 +FC D1 08 60 70 47 -30 +10 B5 -04 +03 46 -25 +1C 78 00 -2D +2C 02 D0 -28 +20 46 FF F7 -EB +F2 FF -64 +5B 1C 00 -2D +2C F6 D1 -30 +10 BD 10 B5 -14 +29 4C 20 68 @@ -476,7 +490,7 @@ B5 28 0B D0 -13 +28 A0 FF F7 @@ -496,11 +510,11 @@ F3 8F FF F7 -B8 +B1 FF 10 BD -11 +26 A0 FF F7 @@ -510,7 +524,7 @@ FF 20 FF F7 -D0 +D7 FF FE E7 @@ -518,22 +532,108 @@ E7 B5 FF F7 -B3 +AC FF -0F +24 A0 FF F7 D6 FF +16 +48 +00 +68 +00 +06 +03 +D5 +2A +A0 FF F7 +CF +FF +02 E0 +2B +A0 +FF +F7 +CB +FF +2C +A0 +FF +F7 +C8 +FF +2E +48 +04 +21 +01 +60 +08 +21 +01 +60 +0F +49 +0B +20 +88 +60 +FF +F7 +CA FF 00 20 10 BD +0C +48 +01 +68 +28 +4A +11 +60 +02 +21 +C1 +60 +07 +21 +81 +60 +70 +47 +24 +48 +01 +68 +06 +48 +01 +60 +01 +21 +C1 +60 +0B +21 +81 +60 +70 +47 +00 +00 +00 +10 +01 +40 00 60 00 @@ -543,12 +643,12 @@ BD 00 00 00 -E0 +50 00 40 00 -10 -01 +E0 +00 40 00 F0 @@ -598,6 +698,9 @@ F0 53 6F 43 +27 +32 +34 20 41 52 @@ -611,6 +714,10 @@ F0 44 50 2B +00 +00 +00 +00 46 54 31 @@ -621,19 +728,40 @@ F0 34 30 30 +00 +00 +45 +58 +54 +49 +4F +38 +78 +34 +43 +44 +00 +00 20 32 30 32 34 -30 31 +32 31 -30 +32 0A 00 00 00 +E1 +00 +E0 +00 +00 +00 +30 04 49 03 @@ -654,7 +782,7 @@ F0 1C 4E 0E -00 +04 00 00 30 @@ -690,8 +818,8 @@ E7 47 00 00 -85 -02 +05 +03 00 10 C1 @@ -794,15 +922,15 @@ C0 46 FF F7 -1C -FF +DC +FE 10 BD 00 48 70 47 -04 +08 00 00 30 @@ -822,7 +950,7 @@ E7 47 00 00 -58 +D8 03 00 10 @@ -830,7 +958,7 @@ E7 00 00 30 -04 +08 00 00 00 @@ -838,15 +966,15 @@ E7 01 00 10 -5C +E0 03 00 10 -04 +08 00 00 30 -64 +60 04 00 00 @@ -855,6 +983,10 @@ E7 00 10 00 +00 +00 +00 +00 1C 4E 0E