UART 驱动实现
学习目标
- 实现 UART 驱动
- 掌握寄存器操作
- 学习轮询方式通信
7.1 驱动接口
void uart_init(void);
void uart_putc(char c);
char uart_getc(void);
7.2 寄存器定义
#define UART_BASE 0x10000000
#define UART_RHR (*(volatile uint8_t*)(UART_BASE + 0))
#define UART_THR (*(volatile uint8_t*)(UART_BASE + 0))
#define UART_LSR (*(volatile uint8_t*)(UART_BASE + 5))
#define LSR_DR (1 << 0) // 数据就绪
#define LSR_THRE (1 << 5) // 发送保持寄存器空
7.3 完整实现
void uart_init(void) {
// QEMU virt 的 UART 已初始化
}
void uart_putc(char c) {
// 等待发送缓冲区空
while ((UART_LSR & LSR_THRE) == 0);
UART_THR = c;
}
char uart_getc(void) {
// 等待数据就绪
while ((UART_LSR & LSR_DR) == 0);
return UART_RHR;
}