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

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

我如何将专门针对 UART 寄存器的寄存器地址映射到内核,以便为 UART 编写设备驱动程序?

我翻遍了omap-serial.c,但是没有找到里面定义的寄存器的映射。

它与独立UART驱动程序的映射有区别吗?

最佳答案

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

假设您的研究确定 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

为制造商、型号和选项提供精确的目标信息——就像汽车一样——有人会帮你找到细节。

关于c - 将 UART 寄存器地址映射到内核以编写设备驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22657700/

相关文章:

比较两个 char[32]

c - 64 位整数按位运算的成本与 8 位整数相同吗?

c - 多线程和 CPU 缓存

c++ - Linux VM(重型多线程应用程序)的性能改进

linux-kernel - 为什么不共享 MSI 中断?

c - 如何从十六进制转为十进制

linux - tty 子系统有什么用?

linux - 了解内核消息 'nobody cared (try booting with the "irqpoll"option)'

linux - 以低延迟访问 PCI 内存条 (Linux)

c - 关于linux中container_of宏的疑问