阅读:4011回复:9
原创,编写vxworks硬件的驱动程序
为了对共享资源的人表示诚挚的感谢,我写下面的文章来表达我的兴奋。希望共享能在这里生生不息,为中国产业做出贡献。
前面的话,我这个人比较懒、比较现实,这可能是脱离学校之后养成的坏毛病。下面的东西,我不想说太多,只想说一点和实际有关系的东西。很多原理性的东西如果讨论起来就没边没际了,而这也不是我一时兴起所能完成的工作。在此,我只想针对论坛上的绝大多数问题,先讨论一下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多一本。关于硬件,我想可能会看看各版的情况,然后讨论几个例子,硬件涉及的东西太多,我太懒。。。。 |
|
最新喜欢:beamda...
|
沙发#
发布于:2004-04-30 10:03
顶!
楼主辛苦了! |
|
|
板凳#
发布于:2004-04-30 14:02
支持共享,感谢楼主,希望能多交流。
|
|
地板#
发布于:2004-09-04 22:21
感谢搂主,支持共享。
|
|
地下室#
发布于:2004-09-07 21:13
文章能写道这种程度,估计搂住应该经验很多了
|
|
|
5楼#
发布于:2004-10-14 10:04
感谢!
以后还要多请教 |
|
6楼#
发布于:2004-10-16 10:33
风河公司虽然提供这个流程,和接口,但是绝对多数的硬件驱动都不是这样写的。
我当时就是让这个流程和接口给害了。其实vxworks下的硬件驱动,就是普通的硬件的处理和读写。例如,想都一个板卡上的地址,直接去读这个地址就行了。 例如: unsigned int a; a =(unsigned int *)0x03000000; 上面的流程其实是linux的驱动处理方法,将硬件当前一个linux的设备来处理的。vxworks不是这样处理的。 |
|
|
7楼#
发布于:2004-10-27 19:05
go on !
|
|
8楼#
发布于:2004-12-30 22:28
我现在也是按这个流程编的,但是就是没有 硬件的中断.请问ISA接口卡的中断怎么才能挂上?
|
|
9楼#
发布于:2005-03-07 18:39
感谢aquariuscamus先生的付出!
|
|
|