前文回顾
《Linux驱动开发(一)—环境搭建与hello world》
《Linux驱动开发(二)—驱动与设备的分离设计》
《Linux驱动开发(三)—设备树》
《Linux驱动开发(四)—树莓派内核编译》
《Linux驱动开发(五)—树莓派设备树配合驱动开发》
《Linux驱动开发(六)—树莓派配合硬件进行字符驱动开发》
《Linux驱动开发(七)—树莓派按键驱动开发》
《Linux驱动开发(八)—树莓派SR04驱动开发》
《Linux驱动开发(九)—树莓派I2C设备驱动开发(BME280)》
《Linux驱动开发(十)—树莓派输入子系统学习(红外接收)》
《Linux驱动开发(十一)—树莓派SPI驱动学习(OLED)》
《Linux驱动开发(十二)—树莓派framebuffer学习(改造OLED)》
《Linux驱动开发(十三)—USB驱动HID开发学习(鼠标)》
继续宣传一下韦老师的视频

70天30节Linux驱动开发快速入门系列课程【实战教学、技术讨论、直播答疑】
昨天学习了一下usb鼠标的简单识别,今天来完整的写一套键盘和鼠标的驱动,起码能够支持树莓派使用的。
先来写一下键盘的驱动。
键盘驱动框架
框架部分很简单,和昨天的鼠标基本一样,但是今天这里的table_id,要用一个通用定义,保证识别出所有的usb键盘。
#include <linux/init.h>
#include <linux/module.h>
#include <linux/usb.h>
#include <linux/usb/input.h>
#include <linux/hid.h>
//通用ID
static const struct usb_device_id usb_kbd_id_table[] = {
{
USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID, USB_INTERFACE_SUBCLASS_BOOT,USB_INTERFACE_PROTOCOL_KEYBOARD) },
{
} /* Terminating entry */
};
/*
MODULE_DEVICE_TABLE 有两个功能。
一是:将设备加入到外设队列中,
二是告诉程序阅读者该设备是热插拔设备或是说该设备支持热插拔功能。
该宏定义在<linux/module.h>下
这个宏有两个参数,第一个参数设备名,第二个参数该设备加入到模块中时对应产生的设备搜索符号,这个宏生成了一个名为__mod_pci_device_table
局部变量,这个变量指向第二个参数
*/
MODULE_DEVICE_TABLE (usb,usb_kbd_id_table);
//USB设备信息与驱动端匹配成功的时候调用。
static int myusbkbd_probe(struct usb_interface *intf,const struct usb_device_id *id) //资源探索函数
{
printk("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
printk("USB驱动匹配成功! ID: 0x%X,0x%X\n",id->idVendor,id->idProduct);
return 0;
}
//USB断开的时候调用
static void myusbkbd_disconnect(struct usb_interface *intf)
{
printk("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
printk("USB 设备释放成功!\n");
}
//定义USB驱动结构体
static struct usb_driver myusbkbd_driver =
{
.name = "myusbkbd_drv",
.probe = myusbkbd_probe,
.disconnect = myusbkbd_disconnect,
.id_table = usb_kbd_id_table,
};
static int __init myusbkbd_init(void)
{
//注册USB设备驱动
printk("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);