Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • soclabs/nanosoc_tech
1 result
Select Git revision
Show changes
Commits on Source (1)
......@@ -35,7 +35,7 @@
Define clocks
*----------------------------------------------------------------------------*/
#define XTAL (100000000UL) /* Oscillator frequency */
#define XTAL (240000000UL) /* Oscillator frequency 240MHz */
/*----------------------------------------------------------------------------
......
......@@ -54,23 +54,26 @@
void UartStdOutInit(void)
{
// CMSDK_UART2->BAUDDIV = 16;
// CMSDK_UART2->CTRL = 0x41; // High speed test mode, TX only
CMSDK_UART2->BAUDDIV = 2080; //(20MHz/9600)
CMSDK_UART2->CTRL = 0x01; //TX only, standard UART
CMSDK_USRT2->CTRL = 0x01; //TX only, FT1248 USRT
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 / "~"
return;
}
// Output a character
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
/// if ((CMSDK_USRT2->STATE & 1) == 0)
while ((CMSDK_USRT2->STATE & 1)); // Wait if Transmit Holding register is full
if ((CMSDK_USRT2->STATE & 1) == 0)
CMSDK_USRT2->DATA = my_ch; // write to transmit holding register
// 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
if ((CMSDK_UART2->STATE & 1)==0) CMSDK_UART2->DATA = my_ch; // write to transmit holding register
return (my_ch);
}
// Uart string output
......@@ -118,11 +121,11 @@ void FlashLoader(void)
Likely that the user is trying to run bootloader as a test,
which is not what this program is for.
*/
UartPuts("@Error: REMAP cleared\n");
UartPuts("!REMAP!\n");
UartPutc(0x4); // Terminate simulation
while (1);
}
UartPuts("** Remap->IMEM0\n"); // CMSDK boot loader\n");
UartPuts("REMAP->IMEM0\n"); // CMSDK boot loader\n");
CMSDK_SYSCON->REMAP = 0; // Clear remap
__DSB();
__ISB();
......@@ -135,7 +138,8 @@ int main (void)
// UART init
UartStdOutInit();
UartPuts("\n\n\nSoCLabs NanoSoC\n");
UartPuts("\nSoCLabs NanoSoC ARM-CM0+ADP+FT1+U38400 20240110\n");
// UartPuts("\nSoCLabs NanoSoC\n");
FlashLoader();
return 0;
}
......
......@@ -43,31 +43,64 @@
#include "CMSDK_CM4.h"
#endif
#define CLKFREQ 240000000
#define BAUDRATE 38400
#define BAUDCLKDIV (CLKFREQ / BAUDRATE)
void UartStdOutInit(void)
{
// CMSDK_UART2->BAUDDIV = 16;
// CMSDK_UART2->CTRL = 0x41; // High speed test mode, TX only
CMSDK_UART2->BAUDDIV = 2080; //(1MHz/9600)
CMSDK_UART2->CTRL = 0x01; //TX only, standard UART
CMSDK_USRT2->BAUDDIV = 2080; //(1MHz/9600)
CMSDK_USRT2->CTRL = 0x03; //RX+TX, standard UART
CMSDK_GPIO1->ALTFUNCSET = (1<<5);
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->CTRL = 0x03; // RX+TX, FT1248 USRT
CMSDK_GPIO1->ALTFUNCSET = (1<<5); // UART2 mapped to GP1[5,4]
return;
}
void Uart2StdOutInit(void)
{
// ensure full character shift before reprogramming UART2
CMSDK_DUALTIMER->Timer1Load = (11 * BAUDCLKDIV); // 10+1 x baud tick clock
CMSDK_DUALTIMER->Timer1BGLoad = (10 * BAUDCLKDIV); // 10 x baud tick clock
CMSDK_DUALTIMER->Timer1IntClr = 1;
CMSDK_DUALTIMER->Timer1Control = 0xC3; // enable, periodic, 32-bit
while ((CMSDK_DUALTIMER->Timer1RIS & 1)== 0) ; // wait until any UART character time
// reinitialize UART2
/// CMSDK_UART2->CTRL = 0x00; // disable whie reprogramming
/// CMSDK_UART2->BAUDDIV = BAUDCLKDIV; // (240MHz/BAUDRATE) in 16.4 format
/// 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->CTRL = 0x03; // RX+TX, FT1248 USRT disabled
return;
}
// Output a character
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
while ((CMSDK_USRT2->STATE & 1)); // Wait if Transmit Holding register is full
CMSDK_USRT2->DATA = my_ch; // write to transmit holding register
if ((CMSDK_USRT2->CTRL & 1)==0) {
while (CMSDK_UART2->STATE & 1); // Wait if Transmit Holding register full
CMSDK_UART2->DATA = my_ch; // write to transmit holding register
CMSDK_USRT2->DATA = my_ch; // (also write to transmit holding register)
} else {
while (CMSDK_USRT2->STATE & 1); // Wait if Transmit Holding register full
CMSDK_USRT2->DATA = my_ch; // write to transmit holding register
}
return (my_ch);
}
// Get a character
unsigned char UartGetc(void)
{
while ((CMSDK_USRT2->STATE & 2)==0); // Wait if Receive Holding register is empty
return (CMSDK_USRT2->DATA);
if ((CMSDK_USRT2->CTRL & 1)==0) {
while ((CMSDK_UART2->STATE & 2)==0);
return (CMSDK_UART2->DATA);
} else {
while ((CMSDK_USRT2->STATE & 2)==0);
return (CMSDK_USRT2->DATA);
}
}
void UartEndSimulation(void)
......
......@@ -25,6 +25,7 @@
/* The functions are implemented in shared/software/common/uart_stdout.c */
extern void UartStdOutInit(void);
extern void Uart2StdOutInit(void);
extern unsigned char UartPutc(unsigned char my_ch);
extern unsigned char UartGetc(void);
extern unsigned char UartEndSimulation(void);
......@@ -229,20 +229,20 @@ initial begin
// seem unable to use the following (due to generate instance naming?)
// wire baudx16_clk = u_cmsdk_mcu.u_cmsdk_mcu.u_cmsdk_mcu_system.u_apb_subsystem.u_apb_uart_2.BAUDTICK;
// 2000000/208 = 9615 baud (+0.16%)
// 208 / 16
`define BAUDPROG 130
// 240000000/6250 = 38400 baud
// 6250/16 = 390.625
`define BAUDPROGDIV16 389
reg [7:0] bauddiv;
wire baudclken = (bauddiv == 8'b00000000);
reg [8:0] bauddiv;
wire baudclken = (bauddiv == 9'b0);
always @(negedge NRST or posedge PCLK)
if (!NRST)
bauddiv <=0;
else
bauddiv <= (baudclken) ? (`BAUDPROG-1) : (bauddiv -1) ; // count down of BAUDPROG
bauddiv <= (baudclken) ? (`BAUDPROGDIV16-1) : (bauddiv -1) ; // count down of BAUDPROG
wire baudx16_clk = bauddiv[7]; //prefer:// !baudclken;
wire baudx16_clk = bauddiv[8]; //prefer:// !baudclken;
wire UARTXD = P1[5];
reg UARTXD_del;
......