基于USB定制化键盘的驱动方法与流程

文档序号:14713783发布日期:2018-06-16 00:56阅读:155来源:国知局
本发明涉及键盘驱动
技术领域
:,具体地说是一种基于USB定制化键盘的驱动方法。
背景技术
::USB,是英文UniversalSerialBus(通用串行总线)的缩写,是一个外部总线标准,用于规范USB设备间的连接,通讯和供电。USB历经了从1.5Mbps至10Gbps的演变,从接口类型上来说,也历经了A,B,C的演变。自USB-IF于1996年推出USBV1.0后,USB版本经历了多年已发展为3.1版本。USB所有新版本都向下兼容,具有传输速度快(USB1.1是12Mbps,USB2.0是480Mbps,USB3.0是5Gbps,USB3.1是10Gbps),使用方便,支持热插拔,连接灵活,独立供电等优点,可以连接鼠标、键盘、打印机、扫描仪、摄像头、充电器、闪存盘、MP3机、手机、数码相机、移动硬盘、外置光软驱、USB网卡、ADSLModem、CableModem等几乎所有的外部设备。USB设备主要具有以下优点:1、可以热插拔。用户在使用外接设备时,不需要关机再开机等动作,而是在电脑工作时,直接将USB插上使用。2、携带方便。USB设备大多以“小、轻、薄”见长,对用户来说,随身携带大量数据时,很方便。3、标准统一。以前常见的是IDE接口的硬盘,串口的鼠标键盘,并口的打印机扫描仪,有了USB之后,这些应用外设统统可以用同样的标准与个人电脑连接,这时就有了USB硬盘、USB鼠标、USB打印机等等。4、可以连接多个设备。USB在个人电脑上往往具有多个接口,可以同时连接几个设备,如果接上一个有四端口的USBHUB时,就可以再连上四个USB设备,以此类推,尽可以连下去,将我们需要的设备都同时连在一台个人电脑上而不会有任何问题(注:最高可连接至127个设备)。Linux原生内核下自带的键盘驱动是usbkbd.c,这份驱动遵循设备模型编写,支持PC的标准键盘。技术实现要素:本发明实施例中提供了一种基于USB定制化键盘的驱动方法,以解决现有技术中的usbkbd.c这份驱动只支持PC上的标准键盘,对于一些需要客制化键盘按键的产品,这份驱动不适用的问题。为了解决上述技术问题,本发明实施例公开了如下技术方案:本发明提供了基于USB定制化键盘的驱动方法,该方法具体包括以下步骤:对USB设备进行探测,判断USB设备驱动是否支持USB设备;如果支持,则对输入事件进行处理。在第一种可能的实现方式中,在上述步骤之前还需要编写USB设备驱动;编写USB设备驱动的方式为:采用probe()函数和disconnect()函数编写USB驱动程序,在USB设备在被插入或拔出时进行调用,用于初始化和释放硬件资源。在第二种可能的实现方式中,对USB设备进行探测的方法具体包括:判断USB主机控制器检测到USB设备的属性与usb_device_id结构体的信息是否一致;如果一致,则表示USB设备驱动支持USB设备,调用probe()函数进行初始化USB设备。在第三种可能的实现方式中,初始化USB设备的方法具体包括:probe()函数通过USB设备端点0来获取端点描述符;判断USB设备是否有且仅有一个中断输入端点;如果是,则调用usb_rcvintpipe设置这个端点对应的pipe,同时调用usb_maxpacket获取该端点的数据包最大值;用input_allocate_device分配输入设备input_dev,同时分配USB键盘数据传输需要的内存;借助BIT_MASK宏和set_bit宏设置输入事件类型以及每个按键值;为input_dev绑定输入事件处理函数、打开或关闭输入设备的函数;USB设备驱动创建URB;调用usb_fill_int_urb初始化URB;调用input_register_device把初始化好的input_dev注册进系统。在第四种可能的实现方式中,在初始化URB时,包括以下方式:对于中断URB,使用usb_fill_int_urb()函数来初始化URB;对于批量URB,使用usb_fill_bulk_urb()函数来初始化URB。在第五种可能的实现方式中,对输入事件进行处理具体包括以下方法:把URB安排到特定USB设备的特定端点;USB设备驱动把URB提交给USB核心层;USB核心和USB主机控制器驱动URB;URB完成回调后,USB主机控制器控制USB设备驱动。在第六种可能的实现方式中,在URB完成回调后,还包括对USB的检测,用于得知USB的状态,具体包括:URB结构体的status成员得到的返回值为0,则表示URB传输成功,USB设备驱动;URB结构体的status成员得到的返回值为-ENOENT,则表示URB被usb_kill_urb()杀死,USB设备无法识别;URB结构体的status成员得到的返回值为-ENODEV,则表示USB设备已被移除。在第七种可能的实现方式中,在URB完成回调后,还包括:判断urb->status的值;如果urb->status的值为0,则表示对于一个输出URB,数据被成功发送,对于一个输入URB,请求的数据被成功收到,调用input_report_key上报输入事件到输入事件核心层并调用input_sync同步事件;再次将URB提交到USB核心层,发起下一次输入事件查询;如果不为0,则表示发送数据到设备或从设备接收数据时发生了错误,urb->status将记录错误值。由以上技术方案可见,本发明实现了对USB接口的非标准键盘的驱动支持,实现了单个文件驱动多个外设的目的,可快速支持更多的键盘外设,具备良好的可维护性和二次开发性。附图说明为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。图1为USB子系统框架图;图2为USB设备、配置、接口和端点逻辑关系图;图3为本发明基于USB定制化键盘的驱动方法流程示意图。具体实施方式为了使本
技术领域
:的人员更好地理解本发明中的技术方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。针对键盘按键需要客制化的应用场景,由于没有现成的驱动可供使用,本专利针对这一情况实现了对多种键盘的兼容适配的通用键盘驱动,同时具有良好的可扩展性,可以快速的经过二次开发实现对新键盘的支持适配。为了更好的理解本发明,图1和图2是对USB子系统及设备驱动的概述.如图1所示,USB采用树形拓扑结构,主机侧和设备侧的USB控制器分别称为主机控制器(HostController)和USB设备控制器(UDC),每条总线上只有一个主机控制器,负责协调主机和设备间的通信,而设备不能主动向主机发送任何消息。我们的通用键盘驱动实现在主机侧。从主机侧去看,在Linux驱动中,处于USB驱动最底层的是USB主机控制器硬件,在其上运行的是USB主机控制器驱动,在主机控制器上的为USB核心层,再上层为USB设备驱动层(插入主机上的U盘、鼠标、USB转串口等设备驱动)。因此,在主机侧的层次结构中,要实现的USB驱动包括两类:USB主机控制器驱动和USB设备驱动,前者控制插入其中的USB设备,后者控制USB设备如何与主机通信。Linux内核中的USB核心负责USB驱动管理和协议处理的主要工作。主机控制器驱动和设备驱动之间的USB核心非常重要,其功能包括:通过定义一些数据结构、宏和功能函数,向上为设备驱动提供编程接口,向下为USB主机控制器驱动提供编程接口;维护整个系统的USB设备信息;完成设备热拔插控制、总线数据传输控制等。在USB设备的逻辑组织中,包含设备、配置、接口和端点4个层次。每个USB设备都提供了不同级别的配置信息,可以包含一个或多个配置,不同的配置使设备表现出不同的功能组合(在探测/连接期间需从其中选定一个),配置由多个接口组成。在USB协议中,接口由多个端点组成,代表一个基本的功能,是USB设备驱动程序控制的对象,一个功能复杂的USB设备可以具有多个接口。每个配置中可以有多个接口,而设备接口是端点的汇集。例如USB扬声器可以包含一个音频接口以及对旋钮和按钮的接口。一个配置中的所有接口可以同时有效,并可被不同的驱动程序连接。每个接口可以有备用接口,以提供不同质量的服务参数。端点是USB通信的最基本形式,每一个USB设备接口在主机看来就是一个端点的集合。主机只能通过端点与设备进行通信,以使用设备的功能。在USB系统中每一个端点都有惟一的地址,这是由设备地址和端点号给出的。每个端点都有一定的属性,其中包括传输方式,总线访问频率、带宽、端点号和数据包的最大容量等。一个USB端点只能在一个方向承载数据,或者从主机到设备(称为输出端点),或者从设备到主机(称为输入端点),因此端点可看作一个单向的管道。端点0通常为控制端点,用于设备初始化参数等。只要设备连接到USB上并且上电端点0就可以被访问。端点1、2等一般用作数据端点,存放主机与设备间往来的数据。总体而言,USB设备由许多不同的逻辑单元组成,这些单元之间的关系如图2所示。如图3所示,基于USB定制化键盘的驱动方法,具体包括以下步骤:S1、对USB设备进行探测,判断USB设备驱动是否支持USB设备;S2、如果支持,则对输入事件进行处理。在上述步骤之前还需要编写USB设备驱动;编写USB设备驱动的方式为:采用probe()函数和disconnect()函数编写USB驱动程序,在USB设备在被插入或拔出时进行调用,用于初始化和释放硬件资源。module_usb_driver用于注册usb_driver,也可以调用usb_register进行注册。usb_driver结构体中的id_table成员描述了这个USB驱动所支持的USB设备列表,它指向一个usb_device_id数组,usb_device_id结构体用于包含USB设备的制造商ID、产品ID、产品版本、设备类、接口类信息及其要匹配标志成员match_flags(标明要与哪些成员匹配)。可以借助下面一组宏来生成usb_device_id结构体的实例:USB_DEVICE(vendor,product)该宏根据制造商ID和产品ID生成一个usb_device_id结构体的实例,在数组staticconststructusb_device_idusb_kb_id_table[]中增加该元素将意味着该驱动可支持匹配制造商ID、产品ID的设备。如果需要支持新的按键外设,只要添加新的设备信息到该数组并在本驱动中构建一个描述按键码的数据即可。对USB设备进行探测的方法具体包括:判断USB主机控制器检测到USB设备的属性与usb_device_id结构体的信息是否一致;如果一致,则表示USB设备驱动支持USB设备,调用probe()函数进行初始化USB设备。初始化USB设备的方法具体包括:probe()函数通过USB设备端点0来获取端点描述符;判断USB设备是否有且仅有一个中断输入端点;如果是,则调用usb_rcvintpipe设置这个端点对应的pipe,同时调用usb_maxpacket获取该端点的数据包最大值;用input_allocate_device分配输入设备input_dev,同时分配USB键盘数据传输需要的内存;借助BIT_MASK宏和set_bit宏设置输入事件类型以及每个按键值;为input_dev绑定输入事件处理函数、打开或关闭输入设备的函数;USB设备驱动创建URB;调用usb_fill_int_urb初始化URB;调用input_register_device把初始化好的input_dev注册进系统。在初始化URB时,包括以下方式:对于中断URB,使用usb_fill_int_urb()函数来初始化URB;对于批量URB,使用usb_fill_bulk_urb()函数来初始化URB。对输入事件进行处理具体包括以下方法:把URB安排到特定USB设备的特定端点;USB设备驱动把URB提交给USB核心;USB核心和USB主机控制器驱动URB;URB完成回调后,USB主机控制器控制USB设备驱动。在URB完成回调后,还包括对USB的检测,用于得知USB的状态,具体包括:URB结构体的status成员得到的返回值为0,则表示URB传输成功,USB设备驱动;URB结构体的status成员得到的返回值为-ENOENT,则表示URB被usb_kill_urb()杀死,USB设备无法识别。usb_unlink_urb()和usb_kill_urb()并不一定会发生,它们只是在URB正在被USB核心和主机控制器处理时又被驱动程序取消的情况下才发生。URB结构体的status成员得到的返回值为-ENODEV,则表示USB设备已被移除。在URB完成回调后,还包括:判断urb->status的值;如果urb->status的值为0,则表示对于一个输出URB,数据被成功发送,对于一个输入URB,请求的数据被成功收到,调用input_report_key上报输入事件到输入事件核心层并调用input_sync同步事件;再次将URB提交到USB核心,发起下一次输入事件查询;如果不为0,则表示发送数据到设备或从设备接收数据时发生了错误,urb->status将记录错误值。以上所述仅是本发明的具体实施方式,使本领域技术人员能够理解或实现本发明。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。当前第1页1 2 3 当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1