pci驱动关于IO端口和IO内存的问题

发布于 2022-09-18 21:32:20 字数 1701 浏览 25 评论 2

最近学习pci驱动开发,问题很多,主要有如下:
问题1:通过lspci -x找到我要的pci设备信息:
03:0a.0 Signal processing controller: Adlink Technology Device 9221 (rev 02)
00: 4a 14 21 92 07 00 00 04 02 00 80 11 00 20 00 00
10: 00 f0 bf fd 01 de 00 00 00 00 00 00 00 00 00 00
20: 00 00 00 00 00 00 00 00 00 00 00 00 4a 14 21 92
30: 00 00 00 00 00 00 00 00 00 00 00 00 0a 01 00 00
也就是说基地址寄存器0为0xfdbff000,基地址寄存器1为0xde01,其余为0。
然后我 在/proc/iomem,找到了该设备的IO内存:
fdbff000-fdbff0ff : 0000:03:0a.0
我再在/proc/ioports 找到了该设备的IO端口:
de00-deff : 0000:03:0a.0
但是在基地址寄存器1中为0xde01,是不是为了要表示该寄存器地址指向IO空间,也就是IO端口?
问题2:按上述情况来看,内存映射和端口映射不是都分配好了么?直接用pci_resource_start()得到起始地址之后使用就行了么?为什么还要有些程序还要调用request_mem_region来进行申请?
问题3:看到有如下代码:
unsigned long add1=0;
unsigned long add2=0;
void __iomem  *ioaddr;
ioaddr=pci_iomap(pdev,1,0);
add1=ioread32(ioaddr);
add2=ioread32(ioaddr+4);
printk(KERN_ALERT "the  adress IO is %lx n",ioaddr);
printk(KERN_ALERT "the  adress1 is %lx n",addr1);
printk(KERN_ALERT "the  adress2 is %lx n",addr2);
我在我的PCI程序里的probe中包含实验(我的PCI程序,只有1个框架,不包括任何实现),编译加载后得到如下输出:
the IO adress  is 1de00
  the adress1 is 14000
  the adress2 is  107e0001
从pci_iomap(pdev,1,0)来看,它应该是通过访问pdev的成员resource[1]来得到基地址寄存器1的值,进而把IO端口映射到内存的。
那么这样来看,这2个adress1 、adress2和之前的基地址寄存器0、1应该有对应关系?具体是怎么对应的呢?
还有从上述分析来看:基地址寄存器0是某段外设内存的起始地址,而基地址寄存器1是另外一段外设内存的起始地址。在我的机器上该设备通过pci_resource_len(pdev,0)、pci_resource_len(pdev,1)得到的都是256B,那是不是意味这个设备是有2个256字节的地址空间呢?
各位大哥大姐帮忙看看啊?有没有哪理解错误啊

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

清浅ˋ旧时光 2022-09-19 08:13:35

恩,对背后的机制要有充分的了解,不然像我这样,走的就比较吃力

清泪尽 2022-09-19 06:37:57

PCI确实相当复杂,首先要考虑pci本身的驱动问题,又要考虑外设驱动

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文