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

C 将UART寄存器地址映射到内核以编写设备驱动程序,c,linux-kernel,linux-device-driver,device-driver,uart,C,Linux Kernel,Linux Device Driver,Device Driver,Uart,如何将寄存器地址映射到内核,特别是UART寄存器,以便为UART编写设备驱动程序 我已经查看了omap-serial.c,但没有找到其中定义的寄存器映射 它与独立UART驱动程序的映射不同吗?作为设备驱动程序编写器,阅读硬件文档是您的工作。串行端口文档将指定控制和状态寄存器中的位,并提供如何确定其地址的指南。通常,该指南在系统集成商的文档中 假设您的研究确定UART的寄存器位于0x31080220。然后,您的代码将具有: struct resource *uart_res; // resour

如何将寄存器地址映射到内核,特别是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

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

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

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

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

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

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

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

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

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

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

在内核中映射uart可能被定义为uart设备(而不是驱动程序),具体位置如下:内核/arch/arm/'machine'/(设备|串行或其他)


通常没有地图绘制的neet。当uart驱动程序探测时,它连接到设备并创建tty字符驱动程序。要从内核操作tty,您可以将自己的行规程添加到tty。然后用户空间progam可以打开所需的ttySX端口,并将其连接到您的线路规程。然后,内核中的代码将通过uart端口(tty->驱动程序)进行通信。

在内核中映射uart可以定义为uart设备(而不是驱动程序),具体位置如下:内核/arch/arm/'machine'/(设备|串行或其他)


通常没有地图绘制的neet。当uart驱动程序探测时,它连接到设备并创建tty字符驱动程序。要从内核操作tty,您可以将自己的行规程添加到tty。然后用户空间progam可以打开所需的ttySX端口,并将其连接到您的线路规程。然后,内核中的代码将通过uart端口(tty->驱动程序)进行通信。

在内核中映射uart可以定义为uart设备(而不是驱动程序),具体位置如下:内核/arch/arm/'machine'/(设备|串行或其他)


通常没有地图绘制的neet。当uart驱动程序探测时,它连接到设备并创建tty字符驱动程序。要从内核操作tty,您可以将自己的行规程添加到tty。然后用户空间progam可以打开所需的ttySX端口,并将其连接到您的线路规程。然后,内核中的代码将通过uart端口(tty->驱动程序)进行通信。

在内核中映射uart可以定义为uart设备(而不是驱动程序),具体位置如下:内核/arch/arm/'machine'/(设备|串行或其他)


通常没有地图绘制的neet。当uart驱动程序探测时,它连接到设备并创建tty字符驱动程序。要从内核操作tty,您可以将自己的行规程添加到tty。然后用户空间progam可以打开所需的ttySX端口,并将其连接到您的线路规程。然后内核中的代码将通过uart端口(tty->驱动程序)进行通信。

什么编译器和平台?(我猜是TI OMAP?但要具体点。)你已经试过什么了?现在还不清楚您是否一直在寻找正确的地址或语法来为编译器指定地址。是的,这是omap-4460处理器的问题。就像在独立的UART驱动程序中,我们用来将寄存器地址映射到宏,然后访问它。同样,我们在Linux内核中编写UART驱动程序时也有这种映射。“它与独立UART驱动程序的映射不同吗?”——裸机程序员倾向于将地址和间接寻址合并到一个宏符号中,
#定义端口A(*(unsigned char*)0xff00)
,这样分配看起来就像一个简单的变量:
端口A=0x12;
Linux内核编程风格(虽然wallyk不实践,但您应该了解这一点)通常希望端口地址是一个数字值,而无需解引用(以便允许地址计算)。什么编译器和平台?(我猜是TI OMAP?但请具体说明。)您已经尝试了什么?不是cle