我如何将专门针对 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/