简易的轮询方式实现early printk。实际上它是不仅用于PowerPC,MIPS等也是可以的。这里假设bootloader已经初始化好了串口(通常bootloader也是使用轮询方式,不是复杂的中断模式)。
#include
#define UART_IO_BASE_ADDR 0xe0004500
#define UART_DATA_ADDR (UART_IO_BASE_ADDR + 0x0)
#define UART_STATUS_ADDR (UART_IO_BASE_ADDR + 0X5)
#define UART_STATUS_READY 0x20
char serial_status(void)
{
return (*(volatile unsigned char *)(UART_STATUS_ADDR));
}
void serial_put(char c)
{
while ((serial_status() & UART_STATUS_READY) == 0);
(*(volatile unsigned char *)(UART_DATA_ADDR)) = c;
if (c == '\n')
serial_put('\r');
}
很显然只能打印字符串,不能是变量。完整的实现没有必要,因为早期打印不需要打印这些,通常只是为了定位而已。如果需要打印变量,在PowerPC上,你可以让udbg_putc = serial_put去更早的是用udbg。
阅读(869) | 评论(0) | 转发(0) |