您的位置:首页 > 编程语言 > C语言/C++

usb驱动程序初步编写

2017-03-20 18:00 225 查看
今天我们的目标是将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.插入 拔出

现象如图




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  arm usb 芯片 内核 c语言