iRisc / Demo / riscy.c
riscy.c
Raw

#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');
}