当前位置: 首页 > news >正文

linux驱动 - 5: simple usb device驱动

参考第2节, 准备好编译环境并实现hello.ko:

linux驱动 - 2: helloworld.ko_linux 驱动开发 hello world ko-CSDN博客

下面在hello模块的基础上, 添加代码, 实现一个usb设备驱动的最小骨架.

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/usb.h>
#define TAG "hello-usb: "static int hello_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
{printk(TAG "probe()\n");return 0;
}static void hello_usb_disconnect(struct usb_interface *intf)
{printk(TAG "disconnect()\n");
}static struct usb_device_id hello_usb_id_table [] = {{.match_flags= USB_DEVICE_ID_MATCH_VENDOR|USB_DEVICE_ID_MATCH_INT_CLASS|USB_DEVICE_ID_MATCH_INT_PROTOCOL,.idVendor = 0x046d,.bInterfaceClass = 0x03,.bInterfaceProtocol = 0x02,},{ }	/* Terminating entry */
};struct usb_driver hello_usb_driver = {.name		= "hello-usb",.probe		= hello_usb_probe,.disconnect	= hello_usb_disconnect,.id_table	= hello_usb_id_table,
};static int hello_init(void)
{usb_register(&hello_usb_driver);printk("hello.ko: hello :) \n");return 0;
}static void hello_exit(void)
{usb_deregister(&hello_usb_driver);printk("hello.ko: byebye! \n");
}module_init(hello_init);
module_exit(hello_exit);MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("a hello module");
  1. usb设备驱动用usb_register()注册, 只有一个参数, 即数据结构struct usb_driver.
  2. 数据结构struct usb_driver中比较关键的是3个:
    id(结构体指针), 指向的结构体用来告诉内核哪些vid/pid/class...是该驱动需要接管的设备.
    probe(函数指针), 指向的函数会在设备插入时调用一次, 一般用来创建并提交URB.
    disconnect(函数指针), 指向的函数会在设备拔除时调用一次, 一般用来取消并销毁URB.

如上代码中, id匹配列表表示匹配vid==046d(罗技)/class=03(HID设备)/protocol=02(鼠标).
probe()/disconnect()只添加了打印, 暂未加入处理代码.

make编译即可生成hello.ko.

直接在虚拟机中插入你的罗技鼠标(如果是其他品牌, 可以换成别的vid即可).

发图, 使用virtualbox时的操作. vmware类似.

# rmmod usbhid    (很重要!!! 必须要先卸载掉标准驱动, 否则鼠标会被标准驱动捕获)
# insmod hello.ko
# dmesg -c
[ 2348.440455] usbcore: deregistering interface driver usbhid
[ 2356.464285] hello-usb: probe()
[ 2356.464320] usbcore: registered new interface driver hello-usb
[ 2356.464321] hello.ko: hello :) 

很重要!!! 必须要先卸载掉标准驱动, 否则鼠标会被标准驱动捕获.
如果是自己做的设备端, 只需要将class定义为0xff(厂家自定义), 就不会跟HID有什么冲突和关联了, 也不需要这一步操作了.

http://www.lqws.cn/news/84061.html

相关文章:

  • PART 6 树莓派小车+QT (TCP控制)
  • DDP学习
  • 什么是煤矿智能掘进
  • edg浏览器打开后默认是360界面
  • 【算法设计与分析】实验——改写二分搜索算法,众数问题(算法分析:主要算法思路),有重复元素的排列问题,整数因子分解问题(算法实现:过程,分析,小结)
  • 操作系统复习
  • 分词算法BBPE详解和Qwen的应用
  • 【深度学习新浪潮】多模态模型如何处理任意分辨率输入?
  • 项目采购管理习题剖析
  • 振动力学:有阻尼单自由度系统
  • 《操作系统真相还原》——中断
  • Python训练营打卡 Day43
  • 2023年12月6级第一套第一篇
  • mybatisplus的总结
  • Linux配置DockerHub镜像源配置
  • 代码随想录算法训练营第六天| 242.有效的字母异位词 、 349. 两个数组的交集 、 202. 快乐数 、1. 两数之和
  • 【看到哪里写到哪里】C的指针-3(函数指针)
  • TC3xx学习笔记-启动过程详解(一)
  • Arch安装botw-save-state
  • deep forest安装及使用教程
  • 一步一步配置 Ubuntu Server 的 NodeJS 服务器详细实录——4. 配置服务器终端环境 zsh , oh my zsh, vim
  • 基于爬取的典籍数据重新设计前端界面
  • 前端八股之CSS
  • 推荐一款使用html开发桌面应用的工具——mixone
  • 力扣HOT100之多维动态规划:62. 不同路径
  • 力扣HOT100之多维动态规划:64. 最小路径和
  • 量子物理:深入学习量子物理的基本概念与应用
  • Python_day43
  • Linux运维笔记:服务器感染 netools 病毒案例
  • mysql专题上