阅读:2668回复:10
请问如何对pci设备上得IO端口操作?
我给一pci设备写个驱动,已经能访问该设备的pci配置头空间。该设备的基地址IOBaseAddr存于配置头空间的0x10(偏移量)处。并且该设备还有几个IO端口(相对于基地址IOBaseAddr的偏移量分别为 0x0,0x2,0x4,0x8).请问如何对这些IO端口映射进行读写操作?
|
|
最新喜欢:zheng2... |
沙发#
发布于:2004-04-01 17:21
俺也想知道,我发现这样基础的东东总是没人回答呀,是不是大家都从初学的时候过来过,现在也让俺们体验一下这种痛苦呀!!
如果是ISA的,我写个数据就直接outb了,可是PCI到底要怎么做呢,比如我一个PCI卡上有3个算法芯片,每个芯片可以实现一定的算法,我如何发控制命令和数据到这些芯片的寄存器中呀,还是用outb吗,不可能吧,听说PCI都是用DMA的,但是具体怎么用呀? 看了LDD2讲DMA的部分,觉得还是不太明白,哪位给点拨一下! |
|
板凳#
发布于:2004-04-03 11:36
我给一pci设备写个驱动,已经能访问该设备的pci配置头空间。该设备的基地址IOBaseAddr存于配置头空间的0x10(偏移量)处。并且该设备还有几个IO端口(相对于基地址IOBaseAddr的偏移量分别为 0x0,0x2,0x4,0x8).请问如何对这些IO端口映射进行读写操作? 我的理解是,已经得到IOBaseAddr后,用io1=(IOBaseAddr+0x0), io2=(IOBaseAddr+0x2),然后就可以用inb(io1),outb(io2)等操作了 |
|
地板#
发布于:2004-04-04 19:47
[quote]我给一pci设备写个驱动,已经能访问该设备的pci配置头空间。该设备的基地址IOBaseAddr存于配置头空间的0x10(偏移量)处。并且该设备还有几个IO端口(相对于基地址IOBaseAddr的偏移量分别为 0x0,0x2,0x4,0x8).请问如何对这些IO端口映射进行读写操作? 我的理解是,已经得到IOBaseAddr后,用io1=(IOBaseAddr+0x0), io2=(IOBaseAddr+0x2),然后就可以用inb(io1),outb(io2)等操作了 [/quote] 理解错误。 |
|
地下室#
发布于:2004-04-05 09:01
利用地址寄存器0xCF8和数据寄存器0xCFC进行吧!!
先向地址寄存器写入目标地址(包括总线号,设备号,功能号及配置寄存器地址的综合地址),然后通过数据寄存器读写!!!! |
|
|
5楼#
发布于:2004-04-05 15:36
郁闷!!说的不对题!!只是对配置空间的读写!!!
下次得谨慎回答!!!!!!!!!! |
|
|
6楼#
发布于:2004-04-09 15:26
嘻嘻,我是经过高手指点才知道的!
maomaoxiong 的意见(得到IOBaseAddr后,用io1=(IOBaseAddr+0x0), io2=(IOBaseAddr+0x2),然后就可以用inb(io1),outb(io2)等操作了 )不完整,应当先(一般是在初始化时)先使用 request_region(...)申请端口,然后就可以向以上操作,当然使用完后还应当释放端口(一般是在卸载模块时)。 |
|
7楼#
发布于:2004-04-11 11:48
你应该到PCI.C里去找答案,其实花不了你半小时你就能搞懂,LINUX继承了UNIX的简单内核结构,没有WINDOWS那么复杂的,很容易看懂,关键是你必须对内核的工作机制有所了解.LINUX里面大量采用回调机制(就是注释里常提到的call-back).如果不对系统有一定深度的认识,编程是很困难的.读写端口的例程在pci.c里有现成的,copy过来就可以用.
|
|
8楼#
发布于:2004-04-29 10:22
[quote][quote]我给一pci设备写个驱动,已经能访问该设备的pci配置头空间。该设备的基地址IOBaseAddr存于配置头空间的0x10(偏移量)处。并且该设备还有几个IO端口(相对于基地址IOBaseAddr的偏移量分别为 0x0,0x2,0x4,0x8).请问如何对这些IO端口映射进行读写操作? 我的理解是,已经得到IOBaseAddr后,用io1=(IOBaseAddr+0x0), io2=(IOBaseAddr+0x2),然后就可以用inb(io1),outb(io2)等操作了 [/quote] 理解错误。 [/quote] to unix:你好象有点马虎:( |
|
|
9楼#
发布于:2004-04-30 10:57
IOAddressBase 0, 1 使用ioremap, 然后直接读写内存
IOAddressBase 2 使用inl, outl |
|
10楼#
发布于:2004-05-02 17:49
IOAddressBase 0, 1 使用ioremap, 然后直接读写内存 问几个弱弱的问题,还请不吝赐教,现行谢过!! 1.直接内存读写什么意识,是不是ioremap后,memcpy,就相当于操作借口芯片了,又或者,一个简单的 a=1这样的赋值语句也相当于在操作借口芯片??? 2.对于BASE 2 之所以要用outl inl,是不是因为芯片的要求必须是32位的,否则其实功能等同于outb,对吧? 3.对于BASE2 BASE3 等,是不是也要作点什么映射的工作才能outl呀,能不能给几行代码,示范一下 |
|