在UART(8250)驱动程序中使用pci_iomap()和ioremap_nocache()函数

时间:2015-03-11 09:55:44

标签: serial-port driver linux-device-driver uart pci

  • 我正在理解来自Linux的UART- 8250.c 8250_pci.c 的驱动程序代码。
  • 我在理解使用 pci_iomap ioremap_nocache 函数调用时遇到了问题。

    1)表示为什么在代码中使用它们?

    2)两个函数的地址返回的重要性是什么?

需要帮助。谢谢。

2 个答案:

答案 0 :(得分:3)

访问I / O内存的方式取决于所使用的计算机体系结构,总线和设备,尽管原则在各处都是相同的。根据所使用的计算机平台和总线,可以通过页表访问或不访问I / O存储器。当访问通过页表时,内核必须首先安排从驱动程序中看到物理地址,这通常意味着您必须在执行任何I / O之前调用ioremap。如果不需要页表,I / O内存位置看起来非常像I / O端口,您可以使用正确的包装函数读取和写入它们。

在访问内存之前,I / O内存的分配不是唯一必需的步骤。您还必须确保内核可以访问此I / O内存。获取I / O内存不仅仅是取消引用指针的问题;在许多系统上,I / O内存根本不能以这种方式直接访问。因此必须首先设置映射。这是ioremap功能的作用。一旦配备了ioremap(和iounmap),设备驱动程序就可以访问任何I / O内存地址,无论它是否直接映射到虚拟地址空间。但请记住,ioremap返回的地址不应直接取消引用;相反,应该使用内核提供的访问器函数。

ioremap_nocache:从其中一个内核头引用:"如果某些控制寄存器位于这样的区域中,它是有用的,并且写入组合或读取缓存是不可取的"

从I / O存储器中读取的存取器功能很少

unsigned int ioread8(void *addr);
unsigned int ioread16(void *addr);
unsigned int ioread32(void *addr);

这里,addr应该是从ioremap获得的地址(可能带有整数偏移量);返回值是从给定的I / O内存中读取的内容。

写入I / O存储器有一组类似的功能:

void iowrite8(u8 value, void *addr);
void iowrite16(u16 value, void *addr);
void iowrite32(u32 value, void *addr);

答案 1 :(得分:1)

pci_iomap()映射PCI资源,例如IORESOURCE_MEM和IORESOURCE_IO(旧版)。 ioremap()使物理IO地址空间可用于IO访问器。 ioremap()适用于任何设备,无论它连接和枚举哪个总线。

回答你的问题。 ioremap_nochache()仅用于驱动程序中的两个位置。并且每个都是为某些硬件定制的。我怀疑这是因为按时间顺序变化而发生的,因为8250是内核中最古老的驱动程序之一。