amian81125
驱动牛犊
驱动牛犊
  • 注册日期2003-04-09
  • 最后登录2004-08-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1650回复:8

pci的驱动?(10分相赠)

楼主#
更多 发布于:2003-07-21 22:45
那位仁兄在做PCI的驱动或作过,能否交流一下?
小弟对PCI板卡的驱动一知半解,但还是要给老板写出来,没办法呀!!!! 我觉得在Windows下系统通过Inf文件使得硬件和驱动联系了起来,在Linux下,驱动如何知道自己对应那个设备,最近我在看一个网卡驱动的例子,好像是驱动通过pcibios_find_class()对总线进行256次搜索,难道Linux下驱动要自己做到具体硬件的映射吗?还有就是请高手指点一下 pcibios_find_class()函数的参数和用法。
  为什么郁闷的总是我,唉!!! :( :( :(
fwzfwz1
驱动中牛
驱动中牛
  • 注册日期2002-11-01
  • 最后登录2007-06-01
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-22 11:31
这个问题以前也困扰过我,其实LINUX下,驱动程序与硬件没有关联。驱动程序可以驱动任何获取的资源。例如,对于某一块pci板,通过其设备号及供应商号,使用pci_find_device可以获取其资源,
然后就可以对其读写了。
有了驱动,人才有了力量。
sam111
驱动牛犊
驱动牛犊
  • 注册日期2002-10-13
  • 最后登录2007-06-07
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-07-23 10:55
我也在写一个驱动,但现在只能找到PCI卡,然后读写里面的寄存器。我的板子上有DMA,我现在不太清除怎样去申请DMA内存,然后再去建立DMA描述苻表。摸索中,很痛苦,有机会向各位学习。我的邮箱:renfuxin@sohu.com
amian81125
驱动牛犊
驱动牛犊
  • 注册日期2003-04-09
  • 最后登录2004-08-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-07-25 17:41
fwzfwzl :
  你好!
  首先感谢你的关照,好像“I/O读写”的帖子也是你回的。希望以后多交流。我的信箱是amian81125@yahoo.com.cn
    现在我已经识别出自己的板卡了,就是用pci_find_device()函数。现在我又有两个问题要请教你,USB设备有自己的注册函数,PCI设备有自己的注册函数吗?目前我用regester_chrdev()注册成一个字符设备,还能工作,有其他方法吗?另一个问题是应用程序的系统调用read()函数可以有四个参数吗?反正在驱动的实现函数中系统提供了四个参数,其中第四个参数我不是很清楚,LDD上说是一个文件读写的偏移量,是一个64位长数据指针,我想反正是个指针,就借用来传递一个I/O相对偏移量,编译能通过,但就是传进去的值不对。我想将I/O读写的相对偏移量作为一个参数交给用户来提供,这样做行吗?还有什么更好的方法,请指教?
fwzfwz1
驱动中牛
驱动中牛
  • 注册日期2002-11-01
  • 最后登录2007-06-01
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-07-28 08:32
fwzfwzl :
  你好!
  首先感谢你的关照,好像“I/O读写”的帖子也是你回的。希望以后多交流。我的信箱是amian81125@yahoo.com.cn
    现在我已经识别出自己的板卡了,就是用pci_find_device()函数。现在我又有两个问题要请教你,USB设备有自己的注册函数,PCI设备有自己的注册函数吗?目前我用regester_chrdev()注册成一个字符设备,还能工作,有其他方法吗?另一个问题是应用程序的系统调用read()函数可以有四个参数吗?反正在驱动的实现函数中系统提供了四个参数,其中第四个参数我不是很清楚,LDD上说是一个文件读写的偏移量,是一个64位长数据指针,我想反正是个指针,就借用来传递一个I/O相对偏移量,编译能通过,但就是传进去的值不对。我想将I/O读写的相对偏移量作为一个参数交给用户来提供,这样做行吗?还有什么更好的方法,请指教?

pci设备就是字符设备,所以就是用register_chrdev()注册;
对于read()函数的第四个参数,我没有用到,目前不太清楚。
有了驱动,人才有了力量。
amian81125
驱动牛犊
驱动牛犊
  • 注册日期2003-04-09
  • 最后登录2004-08-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-07-28 10:53
谢谢fwzfwzl:
    能告诉我file结构中private_data数据项的用途吗?LDD中说它很有用,可我老觉得它用不着。很多例子都用它来传递自己的设备结构到各方法实现函数,有这必要吗?把设备结构声明成全局变量,那都能用,为什么要多此一举?
zhangyanping
驱动小牛
驱动小牛
  • 注册日期2003-02-23
  • 最后登录2004-07-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-07-29 13:25
当然有很多用处了,我愿来也是如你一样很困绕它的存在,后来才知道,就是因为定义了它为void类型,就是为了方便我们自己定义的结构给他赋值的,它就相当于是个接口函数,你可以在两个函数中通过使用自己的结构而建立两者的联系!
cheetah
驱动牛犊
驱动牛犊
  • 注册日期2003-06-25
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-07-30 14:00
我理解read中的第四个参数是这样的,
在写驱动的时候驱动的作者会在内核里面维护一个数据缓冲区,
该缓冲区开成什么形式取决于具体的实现,缓冲区的作用是暂存从设备读来的数据,然后在用户调用的时候传递到用户空间去。
在用户空间进行read调用的时候,要指定读取的字节数,因此在驱动的读实现中必须更新当前的文件指针的便宜量,驱动中要对用户空间传来的要读的数据长度和数据缓冲区的剩下的新的数据长度进行比较,如果缓冲区剩下的数据不够,则可以根据实现让读进程返回或者休眠或者回绕读开头的数据。

如果自己同时是驱动和应用程序的作者,每次都读取固定的长度,
这个指针也可以不在内核驱动中维护,当然这是非常不可取
cheetah
驱动牛犊
驱动牛犊
  • 注册日期2003-06-25
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-07-30 14:07
关于file结构中的private_data我的理解是这样的,

它提供给我们一个将自己关心的数据结构关联到file结构的办法。

我们在驱动中要维护很多数据(当中最关键就是对驱动的设备的抽象描述的那个结构),这些结构都可以在我们打开设备的时候将其关联到file结构,
以后在任何调用的实现中,只要内核给了我们file结构,我们就可以通过它来存取我们自己的数据,
这个设计是非常巧妙的。
当然,在内核的很多驱动中我们可以看到,相当多的我们自己的数据会被声明为全局变量,这个时候不管在哪个函数中我们直接引用就可以了,
用不着先atach到file上,然后再通过file来存取。

但上述机制仍然提供了很大的灵活性。
游客

返回顶部