如何将寄存器地址(尤其是UART寄存器)映射到内核以写入UART的设备驱动程序?
我已经浏览了omap-serial.c.But我没有找到其中定义的寄存器的映射。
是否与独立UART驱动程序的映射不同?
答案 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->驱动程序)。