将UART寄存器地址映射到内核以写入设备驱动程序

时间:2014-03-26 10:12:37

标签: c linux-kernel linux-device-driver device-driver uart

如何将寄存器地址(尤其是UART寄存器)映射到内核以写入UART的设备驱动程序?

我已经浏览了omap-serial.c.But我没有找到其中定义的寄存器的映射。

是否与独立UART驱动程序的映射不同?

2 个答案:

答案 0 :(得分:2)

作为设备驱动程序编写者,阅读硬件文档是您的职责。串行端口文档将指定控制和状态寄存器中的位,并提供有关如何确定其地址的指导。通常该指南是系统集成商的文档。

让我们说你的研究确定UART的寄存器位于0x31080220。您的代码将具有:

struct resource *uart_res;  // resource handle
uint  *uart;                // pointer to actual control/status registers
uart_res = request_mem_region (0x31080220, 4*4, "my_uart");   // map 16 bytes
if (!uart_res)
{
     error ("unable to map memory region");
     return -ENOMEM;
}
uart = ioremap (0x31080220, 4*4);
if (!uart)
{
      release_mem_region (0x31080220, 4*4);
      error ("unable to map");
      return -ENOMEM;
}

然后你可以使用uart指针来访问寄存器。

status = ioread32 (uart + 0);   // read the status register
iowrite32 (0xf0f0, uart + 4);   // foo foo to control register

为制造商,型号和选项提供精确的目标信息 - 就像汽车一样 - 有人会帮助您找到具体信息。

答案 1 :(得分:1)

在内核中映射uart可以在某个地方定义为uart设备(不是驱动程序):kernel / arch / arm /' machine' /(设备| serial或其他)。

通常没有映射的网络。当uart驱动程序探测时,它连接到设备并创建tty字符驱动程序。要从内核操作tty,您可以将自己的行规则添加到tty。然后用户空间程序可以打开所需的ttySX端口并将其附加到您的线路规程。然后你的内核代码将运行uart端口(tty->驱动程序)。