我是靠谱客的博主 炙热眼神,最近开发中收集的这篇文章主要介绍编写USB鼠标驱动程序编写USB鼠标驱动程序致谢,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

编写USB鼠标驱动程序


文章目录

  • 编写USB鼠标驱动程序
    • 参考资料:
    • 1. 目标
    • 2. 编程
      • 2.1 驱动框架
      • 2.2 实现usb_driver
        • 2.2.1 id_table
        • 2.2.2 probe函数
      • 2.3 实现输入设备
      • 2.4 实现数据传输
    • 3. 上机实验
  • 致谢


参考资料:

  • Linux内核源码:includelinuxusb.h

  • Linux内核源码:drivershidusbhidusbmouse.c

1. 目标

使用鼠标模拟按键:左键相当于"L"、右键相当于"S"、"中键"相当于 “回车”。

2. 编程

2.1 驱动框架

在这里插入图片描述

对于GPIO按键,是直接构造、注册一个input_dev结构体,在GPIO中断函数里获得数据。

现在数据来源发生了变化,数据来自USB设备,需要做的事情是:

  • 构造、注意usb_driver
  • usb_driver发现能支持是设备后,它的probe函数被调用:
    • 构造、注册input_dev结构体
  • 获得数据:
    • 构造、提交URB
    • 在URB的回调函数里,向Input系统上报数据

2.2 实现usb_driver

仿照usbmouse.c如下代码构造一个usb_driver结构体:

在这里插入图片描述
核心是:

  • id_table:这个驱动能支持哪些设备
  • probe函数:发现能支持的设备后,probe函数记录设备信息、注册输入设备等等

2.2.1 id_table

id_table是一个usb_device_id数组,示例如下:

在这里插入图片描述

usb_device_id结构体定义如下:

  • match_flags:表示要比较哪些信息,可以比较设备ID、DeviceClass、InterfaceClass等等
  • 根据match_flags提供其他信息:比如设备ID、DeviceClass、InterfaceClass等等
  • driver_info:驱动程序可能用到的一些信息
struct usb_device_id {
	/* which fields to match against? */
	__u16		match_flags;

	/* Used for product specific matches; range is inclusive */
	__u16		idVendor;
	__u16		idProduct;
	__u16		bcdDevice_lo;
	__u16		bcdDevice_hi;

	/* Used for device class matches */
	__u8		bDeviceClass;
	__u8		bDeviceSubClass;
	__u8		bDeviceProtocol;

	/* Used for interface class matches */
	__u8		bInterfaceClass;
	__u8		bInterfaceSubClass;
	__u8		bInterfaceProtocol;

	/* Used for vendor-specific interface matches */
	__u8		bInterfaceNumber;

	/* not matched against */
	kernel_ulong_t	driver_info
		__attribute__((aligned(sizeof(kernel_ulong_t))));
};

2.2.2 probe函数

probe函数原型如下:

int (*probe) (struct usb_interface *intf,
              const struct usb_device_id *id);

第1个参数是"struct usb_interface *“类型,表示匹配到的"USB逻辑设备”。

第2个参数是"struct usb_device_id
*"类型,它是usb_driver的id_table中的某项,表示第1个参数就是跟这个usb_device_id匹配的。有必要的话,probe函数里可以从id->driver_info得到驱动相关的一些信息。

在probe函数,一般要记录intf信息,以后发起USB传输时会用到intf信息。

2.3 实现输入设备

核心是:分配、设置、注册一个input_device结构体。

2.4 实现数据传输

分配、填充、提交URB,在URB的回调函数里上报"input_event"。

3. 上机实验

需要重新配置内核,去掉内核自带的驱动程序。在内核目录下执行"make menuconfig":

Device Drivers  --->
    HID support  --->
        USB HID support  --->
            < > USB HID transport layer  // 不要选中

然后重新编译内核、给开发板替换内核。

测试:

# 把USB鼠标查到开发板上
# 先看看原来有哪些设备节点
ls /dev/input/event*

# 安装驱动程序
insmod usbmouse_as_key.ko

# 再看看新得到了哪个设备节点
ls /dev/input/event*

# 执行命令, 假设event4是新节点
hexdump /dev/input/event4

# 点击鼠标按键即可观察输出信息

# 第2种测试方法: 执行以下命令,按鼠标左键、右键,再按中键就有输出"ls"
cat /dev/tty0

# 第3种测试方法: 执行以下命令(注意"<"号前后没有空格),就可以使用鼠标按键在控制台输入字符
exec 0</dev/tty0

致谢

以上笔记源自韦东山老师的视频课程,感谢韦老师,韦老师是嵌入式培训界一股清流,为嵌入式linux开发点起的星星之火,也愿韦老师桃李满园。聚是一团火,散是满天星!

在这样一个速食的时代,坚持做自己,慢下来,潜心琢磨,心怀敬畏,领悟知识,才能向下扎到根,向上捅破天,背着世界往前行!
仅此向嵌入行业里的每一个认真做技术的从业者致敬!


最后

以上就是炙热眼神为你收集整理的编写USB鼠标驱动程序编写USB鼠标驱动程序致谢的全部内容,希望文章能够帮你解决编写USB鼠标驱动程序编写USB鼠标驱动程序致谢所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部