#define UART_BASE 0x00300000
#define UART_LCR 0x0030000C // Used for setting Divisor Latch Access Bit (DLAB); Used for setting data format (no. of bits we transmit, enabling parity, setting no. of stop bits (1 or 2 for Tx., and 1 for Rx.)
#define UART_DLL 0x00300000 // DLL and DLM are used for setting Baud divisor value to set the appropriate Baud Rate
#define UART_DLM 0x00300004
#define UART_THR 0x00300000 // THR is used for Tx.
#define UART_RBR 0x00300000 // RBR is for Rx.
#define UART_IER 0x00300004 // IER is set to interrupt the processor
#define UART_FCR 0x00300008 // FCR is used to clear the FIFO
#define UART_IIR 0x00300008
#define REG_STATUS 0x00400000 // BASEREG
#define REG_CLKDIV 0x00400010
#define REG_SPICMD 0x00400020
#define REG_SPIADR 0x00400030
#define REG_SPILEN 0x00400040
#define REG_SPIDUM 0x00400050
#define REG_TXFIFO 0x00400060
#define REG_RXFIFO 0x00400080
#define REG_INTCFG 0x00400090
#define REG_INTSTA 0x004000A0
#define DEV_WRITE(addr, val) (*((volatile uint32_t *)(addr)) = val)
#define DEV_READ(addr) (*((volatile uint32_t *)(addr)))
#define GPIO_READ (*((volatile uint32_t *)(0x00200000)))
#define GPIO_WRITE(val) (*((volatile uint32_t *)(0x00200000)) = val)
void uart_init() {
DEV_WRITE(UART_LCR, 0x00000081);
DEV_WRITE(UART_DLL, 0x000007DA); //Divider = decimal 2010 to achieve baud rate of "57600" for clock of 59.98 MHz
DEV_WRITE(UART_DLM, 0x00000003);
DEV_WRITE(UART_LCR, 0x00000003); //Trying to send just 8 bits
DEV_WRITE(UART_THR, 0x0000000A);
DEV_WRITE(UART_THR, 0x0000000A);
DEV_WRITE(UART_THR, 0x0000000A);
DEV_WRITE(UART_THR, 0x0000000A);
DEV_WRITE(UART_THR, 0x0000000A);
DEV_WRITE(UART_THR, 0x0000000A);
}
void delay(int n) {
// Simple delay loop (adjust based on your system clock)
volatile int i;
for (i = 0; i < n * 100; i++) {}
}
// void spi_write(uint32_t cmd){
// DEV_WRITE(REG_INTCFG, 0xC1000100); //Enabling the Tx. Interrupt
// DEV_WRITE(REG_SPICMD, cmd); //8 bits of CMD we want to send to LCD
// DEV_WRITE(REG_SPIADR, cmd); //8 bits of ADDR we want to send to LCD
// DEV_WRITE(REG_TXFIFO, cmd);
// DEV_WRITE(REG_STATUS, 0x00000102); //Enable the clk to peripheral (SPI clk). Bit [1] set to enable spi_wr mode, and bit [8] set to chip select LCD.
// DEV_WRITE(REG_INTCFG, 0x00000000);
// delay(10);
// }
void printUart(int num) {
// Recursively print the digits of the number
if (num / 10 != 0) {
printUart(num / 10);
}
// Print the last digit as a character
DEV_WRITE(UART_THR, ('0' + (num % 10)));
}
void printUartSpace() {
DEV_WRITE(UART_THR, 0x00000020); // add a space after the number
}
void printUartNewLine(){
DEV_WRITE(UART_THR, '\n');
}