从头开始在内核中写入串口COM1

时间:2015-10-27 02:25:00

标签: c serial-port kernel i386

我从头开始编写i386 ELF内核。我需要能够写入串口COM1。

我写了两个函数,每次调用serial_init()时调用printk(char* str),调用每个字符serial_putc(char c)的每次迭代。

#define SERIAL_COM1 (0x03f8)

void serial_putc(char c)
{
    char* serial = (char*)SERIAL_COM1;

    while ((serial[5] & 0x20) == 0);
    serial[0] = c;
}

void serial_init()
{
    char* serial = (char*)SERIAL_COM1;

    serial[1] = 0x00;
    serial[3] = 0x80;
    serial[0] = 0x03;
    serial[1] = 0x00;
    serial[3] = 0x03;
    serial[2] = 0xc7;
    serial[4] = 0x0b;
}

行协议是:

  • 38400 bauds
  • 每个字8位
  • 无奇偶校验
  • 1站位

我使用qemu-system-i386 -serial stdio -kernel ./kernel来测试我的内核,但它不会在串口上的输出上打印任何内容。

由于我需要编写outbinb,因此代码为:

inline void outb(unsigned int port, unsigned char val)
{
    asm volatile ("outb %%al,%%dx": :"d" (port), "a" (val));
}

inline unsigned char inb(unsigned int port)
{
    unsigned char ret;

    asm volatile ("inb %%dx,%%al":"=a" (ret):"d" (port));
    return (ret);
}

我仍然无法获得ouput 我做错了什么?

1 个答案:

答案 0 :(得分:0)

你应该看看outb()和inb(),你不能像这样写在你的COM1地址上。