编写USB鼠标驱动程序

这篇具有很好参考价值的文章主要介绍了编写USB鼠标驱动程序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

编写USB鼠标驱动程序



参考资料:

  • Linux内核源码:include\linux\usb.h

  • Linux内核源码:drivers\hid\usbhid\usbmouse.c

1. 目标

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

2. 编程

2.1 驱动框架

编写USB鼠标驱动程序

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

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

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

2.2 实现usb_driver

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

编写USB鼠标驱动程序
核心是:

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

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

编写USB鼠标驱动程序

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开发点起的星星之火,也愿韦老师桃李满园。聚是一团火,散是满天星!

在这样一个速食的时代,坚持做自己,慢下来,潜心琢磨,心怀敬畏,领悟知识,才能向下扎到根,向上捅破天,背着世界往前行!
仅此向嵌入行业里的每一个认真做技术的从业者致敬!文章来源地址https://www.toymoban.com/news/detail-496991.html


到了这里,关于编写USB鼠标驱动程序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 记录 无法识别USB串口设备以及由于 Windows 无法加载这个设备所需的驱动程序,导致这个设备工作异常。 (代码 31)

    今天使用串口的时候突然电脑设备器显示无法识别USB设备,在这之前都是一切没有问题,我百思不得其解,于是我百度并且试了很多方法比如说换根线连接,重启电脑,卸载设备(没有卸载芯片)等之类的但是都不起作用。 后来我想起来有虚拟串口这个东西。我这边用的是

    2024年02月12日
    浏览(57)
  • 禁止蝰蛇鼠标驱动软件自动安装;如何在插入Razer设备时停止Razer Synapse安装程序

    蝰蛇鼠标插到电脑上总是弹窗让你安装软件驱动,是不是很烦? 卸载了Razer软件还是弹窗让你安装,怎么解决? 本文将为您解答 我的方法是通过注册表来解决  Razer软件截图如下 第一步: 快捷键 Windows+R ,打开运行窗口 第二步: 输入 regedit ,打开注册表 第三步: 依次找到

    2024年02月11日
    浏览(86)
  • ghost磁盘克隆后,笔记本的键盘鼠标不可用,外接键盘也不好用,触摸板可用,提示Windows 无法加载这个硬件的设备驱动程序。驱动程序可能已损坏或不见了。 (代码 39)无法识别该外部支持提供程序。

     原来笔记本的1T m2硬盘有点不够用了,我就搞了另外一台2T的,用ghost全盘克隆了系统,但是启动后笔记本的键盘不能用了,但是触摸板还是可以正常使用。外接键盘鼠标也全部失灵,但是远程控制软个如向日葵和todesk都是可以输入的。 另外启动设备管理器时报这个错   

    2024年02月03日
    浏览(50)
  • 更新鼠标驱动和USB驱动的方法

    方法: 快捷键win+x    ——》设备管理器 鼠标右击桌面左下角的菜单   ——》设备管理器 右击“此电脑” ——》点击属性-》左边菜单栏点击关于-》右边界面下拉,找到相关设置——》设备管理器   右击,出现菜单栏——》点击 \\\"更新驱动程序\\\"——》点击自动搜索驱动程

    2024年02月13日
    浏览(23)
  • USB鼠标驱动开发流程

    USB驱动开发,针对某一个USB设备的某个功能(接口)构建的驱动程序。USB驱动并不直接和USB设备进行数据交互,而是通过USB总线驱动程序(USB Core和USB HCD)来操作USB设备的。一般构建USB设备驱动的流程为: (1) 根据期望适用的USB设备信息构建一个id_table。 (2) 根据需要的数据传

    2024年02月09日
    浏览(25)
  • Linux驱动开发(十四)---USB驱动开发学习(键盘+鼠标)

    《Linux驱动开发(一)—环境搭建与hello world》 《Linux驱动开发(二)—驱动与设备的分离设计》 《Linux驱动开发(三)—设备树》 《Linux驱动开发(四)—树莓派内核编译》 《Linux驱动开发(五)—树莓派设备树配合驱动开发》 《Linux驱动开发(六)—树莓派配合硬件进行字

    2024年02月08日
    浏览(36)
  • Android 12.0 通过驱动实现禁用usb鼠标和usb键盘功能

    在12.0的系统产品定制化开发中,在进行定制中有关于usb键盘和usb鼠标的需求中,产品要求禁止usb口挂载usb鼠标和usb键盘,所以需要要求在usb挂载类型的时候 判断如果是usb鼠标和usb键盘就不让挂载,这就需要从驱动方面入手来解决这个问题,接下来看下驱动的某些挂载usb的相

    2024年02月08日
    浏览(84)
  • Android 13.0 通过驱动实现禁用usb鼠标和usb键盘功能

    在13.0的系统产品定制化开发中,在进行定制中有关于usb键盘和usb鼠标的需求中,产品要求禁止usb口挂载usb鼠标和usb键盘,所以需要要求在usb挂载类型的时候 判断如果是usb鼠标和usb键盘就不让挂载,这就需要从驱动方面入手来解决这个问题,接下来看下驱动的某些挂载usb的相

    2024年02月08日
    浏览(45)
  • Linux驱动开发—最详细应用程序调用驱动程序解析

    Linux下进行驱动开发,完全将驱动程序与应用程序隔开,中间通过 C标准库函数 以及 系统调用 完成驱动层和应用层的数据交换。 驱动加载成功以后会在“/dev”目录下生成一个相应的文件,应用程序通过 对“/dev/xxx” (xxx 是具体的驱动文件名字) 的文件进行相应的操作 即可实

    2024年02月16日
    浏览(34)
  • windows驱动开发7:应用程序和驱动程序的通信

    一、基础介绍 1.1 设备与驱动的关系 设备由驱动去创建,访问一个设备,是首先得访问驱动。如果驱动在卸载的时候没有删除符号,r3下也是不能去访问设备的。 驱动程序和系统其他组件之间的交互是通过给设备发送或者接受发给设备的请求来交互的。换句话说,一个没有任

    2023年04月08日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包