aquariuscamus
驱动小牛
驱动小牛
  • 注册日期2004-02-18
  • 最后登录2005-03-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3911回复:9

原创,编写vxworks硬件的驱动程序

楼主#
更多 发布于:2004-04-29 22:49
为了对共享资源的人表示诚挚的感谢,我写下面的文章来表达我的兴奋。希望共享能在这里生生不息,为中国产业做出贡献。

前面的话,我这个人比较懒、比较现实,这可能是脱离学校之后养成的坏毛病。下面的东西,我不想说太多,只想说一点和实际有关系的东西。很多原理性的东西如果讨论起来就没边没际了,而这也不是我一时兴起所能完成的工作。在此,我只想针对论坛上的绝大多数问题,先讨论一下vxworks下字符型设备驱动的编写方法。当然我希望图文并茂、原理和实际并重但我很懒。嘿嘿。如果有什么错误或不足还请大家指出。希望能抛砖引玉,令这里的气氛活跃起来。欢迎引用和转载,但希望可以署上我的名字。

vxworks系统的设计遵循了大多数为内核系统的设计思路,在设备上使用了与设备无关的接口方案,这是一个进步,也是一个牺牲(牺牲了实时性),具体的原理暂时就不描述了,接触过操作系统的人都会有点印象。作驱动只要知道两表一链一描述符。所谓两表指驱动描述表和文件描述符表,一链之设备链表,一描述符指设备描述符。这几个东西的关系将在下面的描述中提及。

好了,那就开始吧,自顶向下可能有人会不解,但是反过来看就明白了。
0。必要的数据结构。我在开始学习的时候并不知道为什么要使用这样的数据结构:
structdef{
DEV_HDR xxxdevhdr;
.../*设备相关的数据*/
}
现在,读者也可以不深究,但一定要知道,DEV_HDR的作用是为了系统可以在设备链表上安装设备,并在执行打开操作时可以找到设备。

1。制作好的驱动必须安装到系统之上。vxworks系统不会自动查找驱动程序,或者为新设备安装驱动。那么制作驱动的第一步工作就是安装驱动,这里要使用的函数是iosDrvInstall,这个工作的目的是把驱动挂接在驱动描述表中。之后,系统就可以为设备使用驱动了。为了遵循标准请使用xxxDrv(xxx代表设备的名称)
在调用的时候使用xxxDrv()。调用之后可以使用iosDrvShow来查看系统的驱动描述表。

2。必须在设备实体上使用驱动。安装完驱动,vxworks系统并不会先知先觉的在某个设备上使用驱动程序,而需要用户创建一个设备,并为将来的打开作准备。这里将会使用iosDevAdd函数添加一个设备到系统中去,同时会通知系统该设备所要使用的驱动程序。用户应在这个函数调用之前创建设备数据结构,就是0节里提到的那个,但后将DEV_HDR通过iosDevAdd传给系统。为了遵循标准请使用xxxDevCreate(xxx代表设备的名称)
在调用的时候使用xxxDevCreate()。调用之后可以使用devs来查看系统的设备链表。

3。打开函数。打开函数的实现是非常丰富多彩的。可以初始化硬件、初始化软件、可以什么都不做、甚至可以什么都做了,但是返回的时候要如下操作:
return(xxxpDev);这里,xxxpDev是指向设备数据结构的指针。便于系统在文件描述符中操作。系统会根据文件描述符中的内容返回一个文件描述符。当然,用户也可以返回写其他的东西,但是在这里的返回要和下面的其它接口函数所获取的参数相对应,否则将会蹈我的覆辙,浪费掉很多宝贵的时间。open的第一个参数是char *的字符串,但是在驱动中,实际传来的是一个指针,嘿嘿,这可是关键的变化,这是系统在设备列表中查找的结果。就是0节里提到的数据结构。

4。读写函数和ioctl函数。这几个寒暑可没什么说的,根据硬件进行数据的传输即可。对应的接口是read\\write\\ioctl。这三个函数的第一个参数是fd,但到了驱动里面,就变成了上面提到的xxxpDev,这一点是需要注意的。

4。1不得不说的中断处理函数。虽然不得不说,但是也只想说就是一段中断来了要执行的代码!这段代码的限制有很多,但是一般的实现中还是不会出问题。只要知道,就是一段代码而已。

5。最后就是那些可实现或可不实现的东西。设备的关闭、删除、卸载等等,这些可以参见iosDevDelete、iosDrvRemove等函数,由于实时系统是个不死系统,所以不会有哪个牛人去不断的创建、删除设备,打开关闭设备(如果有,我服了他)。所以我也不多说。

看到这里,一定有大多数人云山雾绕,那是因为硬件知识缺乏(猜测),不知从何下手,但是按照上面一步一步写出来一个模板,在通读一下全文,我想就会抛弃硬件知识而理解软件内容。推荐看的一本书是封河的bsp开发教程,网上有下载,可恨当年某公司卖到100多一本。关于硬件,我想可能会看看各版的情况,然后讨论几个例子,硬件涉及的东西太多,我太懒。。。。

最新喜欢:

beamdavebeamda...
我的邮件地址:hwybird@sohu。com,两三天看一次
Ymd1023
驱动中牛
驱动中牛
  • 注册日期2002-11-22
  • 最后登录2008-05-07
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-04-30 10:03
顶!
楼主辛苦了!





YMD
dohard
驱动牛犊
驱动牛犊
  • 注册日期2004-03-25
  • 最后登录2004-08-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-04-30 14:02
支持共享,感谢楼主,希望能多交流。
chengtao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-30
  • 最后登录2020-03-25
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望78点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2004-09-04 22:21
感谢搂主,支持共享。
wywwwl
驱动大牛
驱动大牛
  • 注册日期2002-08-16
  • 最后登录2018-04-07
  • 粉丝1
  • 关注0
  • 积分-10分
  • 威望135点
  • 贡献值6点
  • 好评度76点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2004-09-07 21:13
文章能写道这种程度,估计搂住应该经验很多了
琢磨悟真知
xuguanglei
驱动牛犊
驱动牛犊
  • 注册日期2002-12-11
  • 最后登录2009-04-23
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-10-14 10:04
感谢!
以后还要多请教
fwzfwz1
驱动中牛
驱动中牛
  • 注册日期2002-11-01
  • 最后登录2007-06-01
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-10-16 10:33
风河公司虽然提供这个流程,和接口,但是绝对多数的硬件驱动都不是这样写的。
我当时就是让这个流程和接口给害了。其实vxworks下的硬件驱动,就是普通的硬件的处理和读写。例如,想都一个板卡上的地址,直接去读这个地址就行了。
例如:
 unsigned int a;
 a =(unsigned int *)0x03000000;
上面的流程其实是linux的驱动处理方法,将硬件当前一个linux的设备来处理的。vxworks不是这样处理的。
有了驱动,人才有了力量。
chengtao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-30
  • 最后登录2020-03-25
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望78点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2004-10-27 19:05
go on !
bapela
驱动牛犊
驱动牛犊
  • 注册日期2004-05-12
  • 最后登录2005-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-12-30 22:28
我现在也是按这个流程编的,但是就是没有 硬件的中断.请问ISA接口卡的中断怎么才能挂上?
seven
驱动小牛
驱动小牛
  • 注册日期2001-04-03
  • 最后登录2007-03-28
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-03-07 18:39
感谢aquariuscamus先生的付出!
我爱中医:http://www.ngotcm.com/forum/index.php
游客

返回顶部