动手做一个键鼠套装(含linux驱动)

本文介绍了如何使用STM32开发板制作一个键鼠套装,并实现Linux驱动。通过STM32模拟键鼠设备,设置USB描述符,结合Linux内核驱动进行设备匹配和数据处理。详细讲解了设备端USB固件库的修改,以及主机端驱动的编写,最终实现了按键操作对应鼠标和键盘功能,并控制STM32板上的LED灯。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    在学习了USB理论知识以及linux USB子系统后,结合《圈圈教你玩USB》中制作USB鼠标、键盘的理念,决定自己用STM32开发板做一个键鼠套装,并实现对应的linux驱动。

    设备端采用STM32开发板,模拟为一个包含鼠标左右键和键盘W键共三个按键的键鼠套装(因自己的开发板总共只有3个按键)。主机端采用nanopi m3开发板,linux内核版本为4.4.49,可至nanopc t3维基百科中进行下载(两者CPU相同)。实现目标为:两个按键模拟为一个鼠标,一个按键模拟为键盘的W键,并在按下后由驱动控制STM32板上LED的点亮(类似多数机械键盘的RGB灯光)。


设备端:

    STM32MCU内部自带USB从控制器,可实现为16个单向端点或8个双向端点,至于USB的基础知识(设备、配置、接口、端点以及描述符)不在本文章讨论内,大家可查阅相关知识了解或是以后我再补上。

    STM32标准库中并不包含USB的固件库,需到官网下载,下载后定位到如下位置:


    原版固件库以头文件和源文件进行分类,我们对其中的文件进行重新分类,拷贝到我们的项目中,在自己的STM32项目中新建CORE和CONFIG两个文件夹,CORE中文件算是USB中的核心文件,提取了USB协议的共同点,一般很少改动其中内容,CORE中存放文件为:


    CONFIG中为需要修改的文件,因设备而异,其中的文件为:


    接下来参考官方原版固件Project中的JoyStickMouse例程,改动比较大的为usb_desc.c文件,其中主要是设备的各种描述符的填写,我们将设备描述符Joystick_DeviceDescriptor中的bDeviceClass改为0xFF,表明这是一个厂商自定义设备,idProduct的两字节可改成自己喜欢的数字,代表这是自己的第几个设备。配置描述符Joystick_ConfigDescriptor中bNumEndpoints改为2表明我们要使用两个端口,bInterfaceClass改为0xEF,表明是一个混杂设备,子类bInterfaceSubClass和协议nInterfaceProtocol都改为0,HID的描述符可以删除,端点描述符将wMaxPacketSize原来的0x04改为0x0A,因为第一个端点既作为鼠标也作为键盘的数据发送到主机端,为了减少报告描述符的修改,我们这里依然发送8个字节的键盘数据,再加上因为有两个端口,所以会多出一个字节用来代表是鼠标还是键盘的发送,共9字节,显然原来的4个字节是不够用的。增加一组端点描述符为:


表明此端点为一个最多10个字节的中断输出(主机到设备)端点,两次发送间隔至少为32ms。同时记得修改JOYSTICK_SIZ_CONFIG_DESC配置描述符的长度,这里其实推荐圈圈的sizeof做法,数组改成数字相加的形式,不然每次数都很麻烦。

    报告描述符可将鼠标

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值