usb驱动程序初步编写

原创 2017年03月20日 18:00:07

今天我们的目标是将USB鼠标用做按键

比如说左键按下就相当于字母L

右键按下就相当于字母S

滚轮按下就相当于回车


相当于一个输入子系统,怎么做呢??

1.分配一个input_device结构体

2.设置它能够产生按键类事件,能够产生这三个按键

3.注册

4.硬件相关的操作

使用USB总线下路的收发函数来读写数据

我们今天写的驱动程序和以前写的驱动程序有什么差别,差别就是硬件操作不一样

我们在probe函数里面做这四件事情,怎么写这个驱动程序呢,



怎么写USB设备驱动程序

1.分配和设置usb_driver结构体,还有注册

usb_driver下面有什么东西呢??

1.id_table 表示它能够支持哪些设备

2.probe函数  表示如果能够支持这个设备的话就调用这个函数

3.disconnect函数 表示把这个设备拔掉之后调用这个函数

2.注册


在写驱动程序之前,我们看一看参考的例子

usbmouse.c这是一个例子,他是一个真正的USB鼠标驱动程序。看驱动程序就要从入口函数看起


注册一个USB结构体


看我们driver结构体有什么东西呢?


有id_table表示能够支持哪一些设备,有probe函数,有disconnect函数。

看一下这个probe函数,假设有一个它能够支持的设备出现了,USB相关的操作先不管,我们看核心部分


分配一个input_dev结构体。



这里是设置,能够产生按键类事件,能够产生相对位移事件

REL_WHELL是滚轮类事件

按键类事件里面 左键,右键,中键。

相对位移呢 是x方向,y方向,还有滚轮,测键,额外的按键

然后就是注册


我们来看看id_table是什么东西


别人的id_table是这么一个宏,这个宏是什么意思,我们打开这个看一下


match_flage表示匹配设备描述符里面的哪一项

int是Interface的缩写 匹配结构的信,匹配类,子类以及协议

回到这个例子程序中,只要你的类是HID 子类是boot,协议是MOUSE  就能够支持你


来看看我们的probe函数

static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_id *id)

看这个probe函数的参数,挺有意思。

我们usb_driver是支持某种interface 是支持接口的,我们之前知道一个USB硬件,可能有多个逻辑上的设备,这个逻辑上的设备就是用usb_interface表示的



最简单的usb驱动程序代码

#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/usb/input.h>
#include <linux/hid.h>


static struct usb_device_id usbmouse_as_key_id_table[] = {
{ USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID, USB_INTERFACE_SUBCLASS_BOOT,USB_INTERFACE_PROTOCOL_MOUSE) },
{ } /* Terminating entry */
};


static int usbmouse_as_key_probe(struct usb_interface *intf, const struct usb_device_id *id)
{
printk("found usbmouse!!!\n");
return 0;
}


static void usbmouse_as_key_disconnect(struct usb_interface *intf)
{
printk("disconnect usbmouse!!!\n");
}
/*1.分配/设置usb_driver*/
static struct usb_driver usbmouse_as_key_driver = {
.name = "usbmouse_as_key",
.probe = usbmouse_as_key_probe,
.disconnect = usbmouse_as_key_disconnect,
.id_table = usbmouse_as_key_id_table,
};
static int usbmouse_as_key_init(void)
{
/*2.注册usb_driver结构体*/
usb_register(&usbmouse_as_key_driver);






return 0;


}


static void usbmouse_as_key_exit(void)
{


usb_deregister(&usbmouse_as_key_driver);
}


module_init(usbmouse_as_key_init);
module_exit(usbmouse_as_key_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("EIGHT");



测试驱动程序

1.make menuconfig 去掉原理的USB鼠标驱动

在device driver的 HID device

 把这前面的* 给去掉USB Human Interface Device (full HID) support 

2. make 用新内核启动


3.insmod usb_mouse_as_key.ko 


4.插入 拔出


现象如图











USB在WINDOWS下的驱动开发

编程架构 -------------------------------------------------------------------------------- USB可以使程序员在不了...
  • embededvc
  • embededvc
  • 2011年10月10日 18:53
  • 12833

Linux USB 驱动开发(五)—— USB驱动程序开发过程简单总结

设备驱动程序是操作系统内核和机器硬件之间的接口,由一组函数和一些私有数据组成,是应用程序和硬件设备之间的桥梁。在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作...
  • zqixiao_09
  • zqixiao_09
  • 2016年04月04日 17:00
  • 7757

Linux USB 驱动开发(一)—— USB设备基础概念

在终端用户看来,USB设备为主机提供了多种多样的附加功能,如文件传输,声音播放等,但对USB主机来说,它与所有USB设备的接口都是一致的。一个USB设备由3个功能模块组成:USB总线接口、USB逻辑设...
  • zqixiao_09
  • zqixiao_09
  • 2016年03月25日 21:42
  • 8325

Linux USB 驱动开发实例 (三)—— 基于USB总线的无线网卡浅析

一、USB设备驱动程序的构成 1、设备的探测        用于检查传递给探测函数的设备信息,确认驱动程序是否适合该设备。 2、数据的发送和接收        负责主机到设备的发送和设备到主机的数据接...
  • zqixiao_09
  • zqixiao_09
  • 2016年04月04日 12:06
  • 3105

Linux USB 驱动开发实例(一) —— USB摄像头驱动实现源码分析

转自:http://blog.csdn.net/zqixiao_09/article/details/50984412        Spac5xx的实现是按照标准的USB VIDEO设备的驱动...
  • u012719256
  • u012719256
  • 2016年10月21日 10:51
  • 520

Windows 下USB 驱动 开发

  • 2009年04月25日 16:06
  • 2.85MB
  • 下载

WDF USB驱动开发指南(中文最佳,驱网原创)

  • 2010年05月06日 09:51
  • 1.56MB
  • 下载

Window XP驱动开发(九) USB WDM驱动开发实例 bulkusb

转载请标明是引用于 http://blog.csdn.net/chenyujing1234  欢迎大家提出意见,一起讨论!  参考书籍>   需要示例源码的请独自联系我. 1、该示例介绍...
  • chenyujing1234
  • chenyujing1234
  • 2012年05月21日 11:52
  • 7911

USB驱动及其源码分析

一、USB理论部分 1.USB概述     USB1.0版本速度1.5Mbps(低速USB)、 USB1.1版本速度12Mbps(全速USB)、 USB2.0版本速度480Mbps(高速USB)、U...
  • yaoliu1100
  • yaoliu1100
  • 2016年07月19日 10:28
  • 2623

USB驱动程序之USB设备驱动程序1简单编写

1、驱动编写分析 (1)usb总线驱动程序在我们接入USB设备的时候会帮我们构造一个新的usb_device.注册到总线里面来。左边这一块已经帮我们做好了,我们要做的是右边这一块。我们要构造一个us...
  • qingkongyeyue
  • qingkongyeyue
  • 2016年11月28日 22:28
  • 1544
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:usb驱动程序初步编写
举报原因:
原因补充:

(最多只允许输入30个字)