terrace
驱动牛犊
驱动牛犊
  • 注册日期2004-02-11
  • 最后登录2005-12-04
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2668回复:10

请问如何对pci设备上得IO端口操作?

楼主#
更多 发布于:2004-03-03 14:49
我给一pci设备写个驱动,已经能访问该设备的pci配置头空间。该设备的基地址IOBaseAddr存于配置头空间的0x10(偏移量)处。并且该设备还有几个IO端口(相对于基地址IOBaseAddr的偏移量分别为 0x0,0x2,0x4,0x8).请问如何对这些IO端口映射进行读写操作?

最新喜欢:

zheng2002zheng2...
Forest_Leo
驱动牛犊
驱动牛犊
  • 注册日期2004-02-26
  • 最后登录2004-11-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-04-01 17:21
俺也想知道,我发现这样基础的东东总是没人回答呀,是不是大家都从初学的时候过来过,现在也让俺们体验一下这种痛苦呀!!

如果是ISA的,我写个数据就直接outb了,可是PCI到底要怎么做呢,比如我一个PCI卡上有3个算法芯片,每个芯片可以实现一定的算法,我如何发控制命令和数据到这些芯片的寄存器中呀,还是用outb吗,不可能吧,听说PCI都是用DMA的,但是具体怎么用呀?

看了LDD2讲DMA的部分,觉得还是不太明白,哪位给点拨一下!
maomaoxiong
驱动牛犊
驱动牛犊
  • 注册日期2003-11-04
  • 最后登录2004-09-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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)等操作了
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于: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]
理解错误。
highwaylost
驱动小牛
驱动小牛
  • 注册日期2003-12-31
  • 最后登录2005-09-26
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-04-05 09:01
利用地址寄存器0xCF8和数据寄存器0xCFC进行吧!!
先向地址寄存器写入目标地址(包括总线号,设备号,功能号及配置寄存器地址的综合地址),然后通过数据寄存器读写!!!!
“恨怨悲苦憎怒噌 仁爱慈孝耻义廉 是故恨人所以得仁 无爱者必不怨 不慈者必无悲 孝而有苦 憎后耻来 义自怒生 廉人心噌 夹天地七大苦 破人情七大碍--”
highwaylost
驱动小牛
驱动小牛
  • 注册日期2003-12-31
  • 最后登录2005-09-26
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-04-05 15:36
郁闷!!说的不对题!!只是对配置空间的读写!!!
下次得谨慎回答!!!!!!!!!!
“恨怨悲苦憎怒噌 仁爱慈孝耻义廉 是故恨人所以得仁 无爱者必不怨 不慈者必无悲 孝而有苦 憎后耻来 义自怒生 廉人心噌 夹天地七大苦 破人情七大碍--”
terrace
驱动牛犊
驱动牛犊
  • 注册日期2004-02-11
  • 最后登录2005-12-04
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-04-09 15:26
嘻嘻,我是经过高手指点才知道的!
maomaoxiong 的意见(得到IOBaseAddr后,用io1=(IOBaseAddr+0x0),
io2=(IOBaseAddr+0x2),然后就可以用inb(io1),outb(io2)等操作了  )不完整,应当先(一般是在初始化时)先使用 request_region(...)申请端口,然后就可以向以上操作,当然使用完后还应当释放端口(一般是在卸载模块时)。



 
rainyss
驱动牛犊
驱动牛犊
  • 注册日期2004-04-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-04-11 11:48
你应该到PCI.C里去找答案,其实花不了你半小时你就能搞懂,LINUX继承了UNIX的简单内核结构,没有WINDOWS那么复杂的,很容易看懂,关键是你必须对内核的工作机制有所了解.LINUX里面大量采用回调机制(就是注释里常提到的call-back).如果不对系统有一定深度的认识,编程是很困难的.读写端口的例程在pci.c里有现成的,copy过来就可以用.
boblai
驱动牛犊
驱动牛犊
  • 注册日期2004-02-17
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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:你好象有点马虎:(
我穿着开档裤坐在石头上,石头很烫但是很舒服,地上还有一条蚯蚓。。。。。。
enLinux
驱动牛犊
驱动牛犊
  • 注册日期2003-11-27
  • 最后登录2007-10-29
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-04-30 10:57
IOAddressBase 0, 1 使用ioremap, 然后直接读写内存
IOAddressBase 2 使用inl, outl
Forest_Leo
驱动牛犊
驱动牛犊
  • 注册日期2004-02-26
  • 最后登录2004-11-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-05-02 17:49
IOAddressBase 0, 1 使用ioremap, 然后直接读写内存
IOAddressBase 2 使用inl, outl


问几个弱弱的问题,还请不吝赐教,现行谢过!!

1.直接内存读写什么意识,是不是ioremap后,memcpy,就相当于操作借口芯片了,又或者,一个简单的 a=1这样的赋值语句也相当于在操作借口芯片???

2.对于BASE 2 之所以要用outl inl,是不是因为芯片的要求必须是32位的,否则其实功能等同于outb,对吧?

3.对于BASE2 BASE3 等,是不是也要作点什么映射的工作才能outl呀,能不能给几行代码,示范一下
游客

返回顶部