新手求教:我想做 USBVxWorks驱动开发发,但不知从何

《VXWORKS设备VxWorks驱动开发发详解》 作者:華清远见 第4 章 设备驱动 RAM BUG BUG 专业始于专注 卓识源于远见 VxWorks BSP BSP VxWorks VxWorks 3 设备驱动的功能 作为一个驱动程序员你在驱动编写时间和驱动所提供的灵活性之间有佷大的决定权进行选择。一个 驱动可以设计为只提供基本的功能或者实现一种非常灵活的底层机制供用户使用完全由驱动程序员自己 决萣。值得提出的是驱动仅仅提供了一种机制,如何使用这个驱动则是用户的策略驱动程序中包括主 动和被动两个方面的因素,其主动性体现在对所驱动的硬件上一个典型的例子就是网卡驱动,其平时不 间断地从网卡主动接收数据包而不需要用户的任何干预;被动性則体现

原创转载请注明出处。

USB的应用層是指各种各样USB设备的驱动这些设备通过USBD层的接口来实现与USB设备的通信,实现了USB设备驱动本节将以USB键盘为例来说明USB应用层的实现。

USB键盤驱动主要包括两部分:USB键盘驱动核心、USB键盘初始化其中USB键盘驱动核心是由函数库usbKeyboardLib来完成,USB键盘初始化是由函数库usrUsbKbdInit来完成

函数库usbKeyboardLib提供叻一些API函数,这些API函数在实现标准SIO驱动接口之外还针对USB的热插拔特性做了一些扩展作为一个USB设备,USB键盘驱动主要是由系统向键盘发送IRP来唍成按键的获取以及状态指示灯的控制同时和标准SIO驱动一样,这个模块的驱动也可以通过调用usbKeyboardDevInit()函数完成初始化usbKeyboardDevInit()函数初始化了与USBD的连接忣其他一些内部资源。与其他SIO驱动不同的是在调用usbKeyboardDevInit()函数进行初始化之前,不需要对模块内部的任何变量进行初始化

将扫描码转换成键碼。扫描码在不同状态下对应的键码是不同的如大小写等等。

设定键盘的LED指示

处理CAPNUMSCR扫描码。如果当前扫描码已经激活(存在于pSioChan->activeScanCodes数組中)说明已经处理过则直接退出;否则如果扫描码为CAPNUMSCR需要调用changeKbdState函数修改键盘的状态。

存放一个字符到接收队列中

注意:存入數据时函数putInChar已经确保缓冲区还有空间可存放,如果没有空间则自动丢掉当前的字符

注意:该函数在取出前对缓冲区中是否有数据不做判斷,因此在调用函数nextInChar之前必须确保取出函数调用前缓冲区是有数据的

首先要调用函数检查是不是有SCRNUMCAP键按下,如果有这些键那么就需要改变键盘指示灯。

l 如果扫描码不在pSioChan->activeScanCodes中则直接将该键码放入缓冲区中。如果是扩展键要首先存放0,再存放键码的低8

第三步就是洳果缓冲区有接收数据且处于中断模式下,则调用pSioChan->putRxCharCallback函数取出缓冲区的数值交给上层。

注意:pSioChan->typematicChar的作用主要是记录上次函数interpKbdReport执行时检测到的鍵码用于判断是否持续按下该按键(连续500ms都按下同一个按键才能够最终确认)。

通过该函数可以设定键盘的工作模式:中断/轮询(mode)、RAW/ASCIIscanMode)以及LED的控制

因为USB键盘不支持向外部输出字符,因此直接返回EIO

因为USB键盘不支持向外部输出字符,因此直接返回EIO

这个函数正是利用USB接口实现键盘的中断处理功能的一个核心,就是首先向USB键盘发送一个按键状态查询的IRP这个IRPtimeout时间为无穷大,因此只要USB按键按下就立刻通過USB向系统报告状态并调用回调函数usbKeyboardIrpCallback将其发送给计算机系统。

配置USB键盘配置过程如下:

这个函数在发现插入的新的USB键盘设备的时候通过函数usbKeyboardAttachCallback来调用,也就是说当USBD发现了USB键盘设备插入,则自动发送消息给clientclientThread的任务就是不断读消息队列,当发现新的设备插入后就会调用函数usbKeyboardAttachCallback该函数则是调用createSioChan创建USB_KBD_SIO_CHAN结构并完成结构的初始化,同时还要完成对USB设备的配置

增加或删除USB键盘设备的时候调用的回调函数。

初始化usbKeyBoardLib整个初始化过程主要完成了如下工作:

l 建立线程typematicThread,该线程的主要作用是:当持续按下某个按键的时候要进行特殊处理比如当持续按下字苻按键时等同于重复输入等等;

l 调用usbdDynamicAttachRegister新创建的USBD_CLIENT结构变量中注册一个USBD_NOTIFY_REQ结构变量,当USB系统中出现了符合USBD_NOTIFY_REQ结构变量的设备(USB键盘)插拔时通過回调函数通知client。同时也要立刻对现有的USB设备仅进行检查如果发现有符合USBD_NOTIFY_REQ变量的设备,马上通知client这样既保证了当有USB键盘插拔时通知client又保证了即使在该函数被invoke之前插入的USB设备也能正确处理。

vxWorks操作系统可以支持多个USB键盘在函数库usbKeyboardLib中的sioList中记录了所有的USB键盘结构。由于USB设备昰支持热插拔的因此当新插入一个设备时就需要对其进行初步识别并调用相应的管理程序以完成初始化等操作,因此需要在系统中首先進行注册告诉系统“如果发现了某USB键盘设备,调用这个函数通知我”正如生活中的“我是xxx,这是我的名片我的职责是XXX,如果有什么問题打这个电话通知我”如果多个程序都对USB键盘的插入感兴趣,则可以向reqList中存放多个ATTACH_REQUEST结构函数usbKeyboardDynamicAttachRegister的作用正是在reqList链中增加一个ATTACH_REQUEST结构

在調用这个函数之前可能就有匹配的设备存在了,因此需要注册reqList后检查sioList如果有USB键盘设备则调用回调函数。

reqLIst链中的回调函数为callbackargATTACH_REQUEST结构釋放注意,reqLIst链中可能保存着两个具有相同回调函数及参数的ATTACH_REQUEST结构变量因此在删除一个匹配的ATTACH_REQUEST结构变量之后并不马上返回,而是要继续查找

结构pUSB_KBD_SIO_CHAN中保留了一个元素lockCount,当一个任务需要使用该USB键盘的时候它需要调用函数usbKeyboardSioChanLock()将变量lockCount加1,表明当前有设备在使用;当它不再使用时將该变量减1当所有的任务都不使用时,该USB键盘就可以从软件中删除了

参见函数usbKeyboardSioChanLock。需要注意的时如果系统检测到USB键盘被拔掉那么该函數会自动将该键盘的数据结构从系统中删除。

我要回帖

更多关于 驱动开发 的文章

 

随机推荐