我从LDD3第14章读到了有关热插拔驱动程序的信息。我需要编写一个USB鼠标驱动程序,在插入硬件时会加载该驱动程序。现在,通过做一些实验,我知道有一个名为“
hid-generic”的驱动程序,在插拔时会被调用。
[ 6654.232046] usb 3-1: new low-speed USB device number 3 using uhci_hcd
[ 6654.462061] usb 3-1: New USB device found, idVendor=093a, idProduct=2510
[ 6654.462067] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 6654.462071] usb 3-1: Product: USB OPTICAL MOUSE
[ 6654.462074] usb 3-1: Manufacturer: PIXART
[ 6654.489316] input: PIXART USB OPTICAL MOUSE as /devices/pci0000:00/0000:00:1d.1/usb3/3-1/3-1:1.0/input/input12
[ 6654.489445] hid-generic 0003:093A:2510.0004: input,hidraw0: USB HID v1.10 Mouse [PIXART USB OPTICAL MOUSE] on usb-0000:00:1d.1-1/input0
另外,lsmod显示
Module Size Used by
hid_generic 12541 0
usbhid 47259 0
hid 105241 2 hid_generic,usbhid
psmouse 102541 0
我的疑问如下
1)为了在插入此鼠标时加载模块(hotplug),我必须在内核中禁用这3个驱动程序,并使用id_table中具有供应商和设备ID的驱动程序来构建整个内核。对?
2)我还阅读了有关USB核心驱动程序和USB设备驱动程序的信息。那么这些HID驱动程序是核心驱动程序还是设备驱动程序?
3)如果使用USB鼠标,核心驱动程序和设备驱动程序是哪些?在哪里可以找到它们?
谢谢,Sunil。
我会尽力回答您的问题:
1)为了在插入此鼠标时加载模块(hotplug),我必须在内核中禁用这3个驱动程序,并使用id_table中具有供应商和设备ID的驱动程序来构建整个内核。
对?
是的,但是您还需要注意一些其他事项。首先了解如何加载特定的模块(驱动程序)。这里的关键是MODULE_DEVICE_TABLE(usb, &my_id_table);
,当特定模块“已安装”(使用make modules_install
),一个条目,根据传入的id表MODULE_DEVICE_TABLE
中被创建/lib/modules/<your_kernel>/modules.usbmap
和/lib/modules/<your_kernel>/modules.dep
文件(搜索这些文件中的字符串“USBHID”)。每当检测到新的USB设备时,内核就会读取这些文件以查找匹配的参数。如果找到,则从找到/lib/modules/<your_kernel>/modules.dep
信息的对应路径中加载以下模块。有关驱动程序所在路径及其相关性的信息。
因此,现在即使您usbhid
从内核中卸载(rmmod),当您重新插入鼠标时也将再次加载它。为了避免这种情况的发生,您需要修改这些文件,即从文件中删除条目。为此,请将usbhid
驱动程序从其原始路径“移动”
(通常位于/lib/modules/<your_kernel>/kernel/drivers/hid/usbhid/usbhid.ko
安全位置。现在重新构建依赖性),以便从依赖性文件中删除条目。
现在,您需要创建驱动程序条目。只需安装驱动程序,您就可以开始了!
因此,总结一下:
$ sudo rmmod usbhid # Unload the usb mouse driver
$ cd /lib/modules/$(uname -r)/ # Move to your current kernel
$ vim modules.usbmap # Check for the "usbhid" string
$ vim modules.dep # Check for "usbhid.ko:" string
$ sudo mv kernel/drivers/hid/usbhid/usbhid.ko ~/Desktop # Take backup of your current
usb mouse driver
$ sudo depmod -a # Rebuild the dependency files
现在,再次检查依赖项文件中的字符串“ usbhid”。它不应该在那里!
$ cd /path/to/your/driver
$ sudo make modules_install # Install your driver into /lib/modules/$(uname -r)/extra
$ sudo depmod -a # Rebuild the dependency files
完成此步骤后,在依赖文件中搜索与您的模块相对应的字符串,它应该在该字符串中!从现在开始,无论何时插入鼠标(或从引导本身),都将加载驱动程序,而不是原始驱动程序。
使用完驱动程序后,您可以将原始usbhid
文件复制回其原始目的地,并重建依赖文件(sudo depmod -a
)
现在,我还看到您正在尝试使用供应商和设备ID来匹配您的设备,在这种情况下,驱动程序仅对 您的
鼠标有效。推荐的方法是使用类ID,这使您的驱动程序可用于 任何 USB鼠标。
2)我还阅读了有关USB核心驱动程序和USB设备驱动程序的信息。 那么这些HID驱动程序是核心驱动程序还是设备驱动程序?
usbhid
基本上是“设备驱动程序”。驱动程序的分类可以简述为:核心驱动程序,主机控制器驱动程序和设备驱动程序:
设备驱动程序: 这是用于控制设备的软件。例如USB鼠标,基于PCI的以太网卡,USB PenDrive,基于I2C的加速度计。
主机控制器驱动程序:
这是编写用于控制总线控制器的软件。例如USB主机控制器(EHCI,UHCI,OHCI等),PCI主机控制器,I2C主设备等。
核心驱动程序:
这些实际上使上述驱动程序更加紧密。示例包括USB内核,PCI内核等。内核驱动程序提供帮助程序(API),以便设备和主机控制器驱动程序可以使用它们(模块堆栈的概念!)。这些是将正确的设备绑定到其驱动程序的驱动程序。核心驱动程序还提供许多其他服务。
USB设备驱动程序的示例代码:
http://lxr.free-
electrons.com/source/drivers/hid/usbhid/usbmouse.c
您可以在以下位置找到USB主机控制器驱动程序:
http://lxr.free-electrons.com/source/drivers/usb/host/
USB Core驻留在这里:http :
//lxr.free-electrons.com/source/drivers/usb/core/
我认为这也回答了您的第三个问题!
希望这会有所帮助。
之前看到一个说法,linux 的源代码基本都是驱动代码 我想知道的是,这些驱动是作为编译后的内核的一部分吗?还是像 glibc 一样,只是一个内核外的软件包 如果我安装了 nv 的 GPU 驱动,那么这些 GPU 驱动也会进去内核吗?
问题内容: 有什么方法可以确定使用C ++的linux中USB驱动器的s / n吗? 如果不是的话,C ++是否与and 有任何其他区别? 问题答案: 我将尝试总结有关在Linux上进行存储驱动器序列号检索的经验。 我假设您要 存储设备 标识的序列号(按照SCSI规范)而不是 USB设备 的序列号(按照Device Descriptor 下的USB规范),这两个是不同的实体。 注意! 大多数设备倾
本文向大家介绍arm linux利用alsa驱动并使用usb音频设备,包括了arm linux利用alsa驱动并使用usb音频设备的使用技巧和注意事项,需要的朋友参考一下 一.背景: arm linux的内核版本是3.13.0 二.准备工作 添加alsa驱动到内核中,也就是在编译内核的时候加入以下选项: 接下来就重新编译内核即可 三.交叉编译alsa-lib和alsa-utils (alsa-ut
我对硒还不熟悉。我使用Gridrastic作为测试环境。 我已经学习了selenium的Actions类,它有移动鼠标的方法,还通过调用getMouse()通过web驱动程序获得了鼠标实例,并尝试移动鼠标,但没有成功。 还尝试了使用actions类 仍然没有成功,鼠标指针始终保持在位置(0,0)。有人能帮忙吗? 我也尝试过使用javascript执行器,但这是不可能的,因为鼠标光标是由操作系统控制
问题内容: 按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 除了node-mysql以外,是否还有用于MySQL的Node.JS驱动程序? (似乎Node.js数据库驱动程序没有太多活动。这是有原因还是仅仅是因为Node
问题内容: 我想将数据从启用DMA的PCIe硬件设备尽快移入用户空间。 问:如何将“直接I / O通过DMA传输和/或通过DMA传输结合到用户空间” 通读LDD3,看来我需要执行几种不同类型的IO操作! 给我可以传递给硬件设备的物理地址。但是将需要设置并在传输完成后执行类型调用。这似乎很浪费,要求设备将DMA DMA到内核内存(充当缓冲区),然后将其再次传输到用户空间。LDD3 p453: 我理想