73 lines
1.4 KiB
C
73 lines
1.4 KiB
C
#ifndef UART_IO_H
|
|
#define UART_IO_H
|
|
|
|
#include <stdint.h>
|
|
|
|
#define UART0_BASE 0x3F201000
|
|
#define UART0_DR (*((volatile uint32_t *)(UART0_BASE + 0x00)))
|
|
#define UART0_FR (*((volatile uint32_t *)(UART0_BASE + 0x18)))
|
|
|
|
typedef struct UART_IO {
|
|
void (*putc)(char c);
|
|
void (*puts)(const char* str);
|
|
char (*getc)(void);
|
|
void (*print_int)(unsigned int value);
|
|
} UART_IO;
|
|
|
|
// Function implementations
|
|
|
|
static void uart_putc(char c)
|
|
{
|
|
while (UART0_FR & (1 << 5)) { } // Wait while TXFF is set
|
|
UART0_DR = c;
|
|
}
|
|
|
|
static void uart_puts(const char* str)
|
|
{
|
|
while (*str)
|
|
uart_putc(*str++);
|
|
}
|
|
|
|
static char uart_getc(void)
|
|
{
|
|
while (UART0_FR & (1 << 4)) { } // Wait while RXFE is set
|
|
return (char)(UART0_DR & 0xFF);
|
|
}
|
|
|
|
static void uart_print_int(unsigned int value)
|
|
{
|
|
char buffer[10];
|
|
int i = 0;
|
|
|
|
if (value == 0) {
|
|
uart_putc('0');
|
|
return;
|
|
}
|
|
|
|
while (value > 0 && i < 10) {
|
|
buffer[i++] = (value % 10) + '0';
|
|
value /= 10;
|
|
}
|
|
|
|
while (i--)
|
|
uart_putc(buffer[i]);
|
|
}
|
|
|
|
static char uart_getc_nonblocking(void)
|
|
{
|
|
if (UART0_FR & (1 << 4)) // RXFE = receive FIFO empty
|
|
return 0; // indicate no data
|
|
return (char)(UART0_DR & 0xFF);
|
|
}
|
|
|
|
|
|
// UART_IO instance with function pointers assigned
|
|
static const UART_IO uart_io = {
|
|
.putc = uart_putc,
|
|
.puts = uart_puts,
|
|
.getc = uart_getc,
|
|
.print_int = uart_print_int,
|
|
};
|
|
|
|
#endif // UART_IO_H
|