Chinaunix首页 | 论坛 | 博客
  • 博客访问: 88703
  • 博文数量: 14
  • 博客积分: 1708
  • 博客等级: 上尉
  • 技术积分: 260
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-27 09:29
文章分类

全部博文(14)

文章存档

2011年(1)

2010年(13)

分类:

2010-04-14 17:35:18

简易的轮询方式实现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) |
给主人留下些什么吧!~~