From b0c18a617869b07e89338b6309f333af0cf15ba7 Mon Sep 17 00:00:00 2001
From: dwf1m12 <d.w.flynn@soton.ac.uk>
Date: Tue, 8 Apr 2025 19:33:10 +0100
Subject: [PATCH] add programmable prescalar to FT1248 interface and
 boot/stdout init code for div 16 (resets to div 256)

---
 .../nanosoc_system/verilog/nanosoc_system.v   |  4 +--
 nanosoc/socdebug_tech                         |  2 +-
 software/common/bootloader/bootloader.c       | 26 ++-----------------
 software/common/retarget/uart_stdout.c        |  4 +--
 4 files changed, 7 insertions(+), 29 deletions(-)

diff --git a/nanosoc/nanosoc_system/verilog/nanosoc_system.v b/nanosoc/nanosoc_system/verilog/nanosoc_system.v
index 4e4b3c1..53b8a66 100644
--- a/nanosoc/nanosoc_system/verilog/nanosoc_system.v
+++ b/nanosoc/nanosoc_system/verilog/nanosoc_system.v
@@ -696,7 +696,7 @@ module nanosoc_system #(
     //--------------------------
     
     wire [7:0] FT_CLKDIV;
-    assign FT_CLKDIV = FT1248_CLKDIV;
+   // assign FT_CLKDIV = FT1248_CLKDIV; // now from socdebug_usrt_control
 
     assign CPU_0_RXEV = DMAC_ANY_DONE;
     
@@ -776,7 +776,7 @@ module nanosoc_system #(
         .RX_VALID_i        (STD_RXD_TVALID),
         .RX_DATA8_i        (STD_RXD_TDATA ),
         .RX_READY_o        (STD_RXD_TREADY),
-
+        .INVBAUDDIV8_o     (FT_CLKDIV),
         // Interrupt Interfaces
         .TXINT             ( ),       // Transmit Interrupt
         .RXINT             ( ),       // Receive  Interrupt
diff --git a/nanosoc/socdebug_tech b/nanosoc/socdebug_tech
index 9ef8d84..247a0af 160000
--- a/nanosoc/socdebug_tech
+++ b/nanosoc/socdebug_tech
@@ -1 +1 @@
-Subproject commit 9ef8d848da72e57f806b24eed5c2f6bbdce66668
+Subproject commit 247a0afe2a4317369af893a5b5454487c20ab90e
diff --git a/software/common/bootloader/bootloader.c b/software/common/bootloader/bootloader.c
index 9a9996a..2f7f9b5 100644
--- a/software/common/bootloader/bootloader.c
+++ b/software/common/bootloader/bootloader.c
@@ -76,6 +76,7 @@ void UartStdOutInit(void)
     }
     CMSDK_USRT2->CTRL    = 0x00; //re-init
     CMSDK_USRT2->CTRL    = UART_CTRL_TXRXEN; //RX+TX, FT1248/EXTIO USRT
+    CMSDK_USRT2->BAUDDIV = 0xf0; // inv(15) mod 256
     if ((CMSDK_USRT2->STATE & 1)==0) CMSDK_USRT2->DATA    = 0x23; // write 8'b01000011 / "#"
   return;
 }
@@ -151,35 +152,12 @@ int main (void)
 {
   // STDOUT init
   UartStdOutInit();
-  UartPuts("\nSoCLabs NanoSoC'24 ARM-CM0+ADP+");
+  UartPuts("\nSoCLabs NanoSoC'25 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/software/common/retarget/uart_stdout.c b/software/common/retarget/uart_stdout.c
index c7145f8..bc038f3 100644
--- a/software/common/retarget/uart_stdout.c
+++ b/software/common/retarget/uart_stdout.c
@@ -53,7 +53,7 @@ void UartStdOutInit(void)
   CMSDK_UART2->CTRL    = 0x00;       // disable whie reprogramming
   CMSDK_UART2->BAUDDIV = BAUDCLKDIV; // (240MHz/BAUDRATE) in 16.4 format
   CMSDK_UART2->CTRL    = 0x01;       // TX, standard UART2
-  CMSDK_USRT2->BAUDDIV =    3;       // (prescaler value)
+  CMSDK_USRT2->BAUDDIV = 0xf0;       // (prescaler value = ~((div+1)[7:0))
   CMSDK_USRT2->CTRL    = 0x03;       // RX+TX, FT1248 USRT
   CMSDK_GPIO1->ALTFUNCSET = (1<<5);  // UART2 mapped to GP1[5,4]
   return;
@@ -73,7 +73,7 @@ void Uart2StdOutInit(void)
 ///  CMSDK_UART2->CTRL    = 0x01;       // RX+TX, standard UART2
   CMSDK_GPIO1->ALTFUNCSET = (1<<5);  // UART2 mapped to GP1[5,4]
   CMSDK_USRT2->CTRL    = 0x00;       // RX+TX, FT1248 USRT disabled
-  CMSDK_USRT2->BAUDDIV = 0x30;       // (prescaler low value)
+  CMSDK_USRT2->BAUDDIV = 0xf0;       // (prescaler value = ~((div+1)[7:0))
   CMSDK_USRT2->CTRL    = 0x03;       // RX+TX, FT1248 USRT disabled
   return;
 }
-- 
GitLab