pci驱动关于IO端口和IO内存的问题
最近学习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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
恩,对背后的机制要有充分的了解,不然像我这样,走的就比较吃力
PCI确实相当复杂,首先要考虑pci本身的驱动问题,又要考虑外设驱动