Linux USB驱动(1)---usb-skeleton.c分析

简介: 在Linux内核的源码中提供了USB设备驱动的框架代码:usb-skeleton.c我们自己的驱动程序可借助这个框架代码,做些修改就能生成我们自己的驱动程序。首先从USB设备与Linux驱动的匹配说起,当一个USB设备连接到Linux USB总线之后,USB主机控制器会使用USB设备的0号端点EPO对USB查询及设置,用以获取USB设备中提供的相关信息,然后根据这些信息,来决定加载那些驱动程序等。
在Linux内核的源码中提供了USB设备驱动的框架代码:usb-skeleton.c
我们自己的驱动程序可借助这个框架代码,做些修改就能生成我们自己的驱动程序。

首先从USB设备与Linux驱动的匹配说起,当一个USB设备连接到Linux USB总线之后,USB主机控制器会使用USB设备的0号端点EPO对USB查询及设置,用以获取USB设备中提供的相关信息,然后根据这些信息,来决定加载那些驱动程序等。其中比较关键的USB设备的信息是:

idVendor  厂商ID这个是需要统一申请的,例如Cypress为0x04B4
idProduct 产品ID这个是厂家自己给产品分配的ID,例如CY68013为0x8613

由这两个信息我们得到一个唯一的设备ID标示,这个ID标示会和驱动程序中通过MODULE_DEVICE_TABLE(usb, xxxx_table)这个宏导出的 idVendor和 idProduct进行匹配,如果匹配成功则加载相应的驱动,并调用驱动的probe函数,进行相关处理如加载固件等。

可以通过USBFS文件系统来查看连接到系统USB总线上的USB设备的各种信息,USBFS文件系统的挂载命令为:

mount -t usbfs none /proc/bus/usb 

挂载成功之后可以在/proc/bus/usb/devices文件中查看连接到USB总线上的设备的信息以及与之匹配的驱动的名称等信息


在USB设备驱动中通过USB_DEVICE(VENDOR_ID, PRODUCT_ID)这个宏将指定的 VENDOR_ID和 PRODUCT_ID赋值到struct usb_device_id结构体中的 idVendor和 idProduct元素。

然后在通过MODULE_DEVICE_TABLE这个宏将驱动名称和唯一标示的ID导出, 这个语句创建一个局部变量称为 __mod_usb_device_table, 它指向 struct usb_device_id 的列表. 稍后在内核建立过程中, depmod 程序在所有的模块中寻找 __mod_usb_device_table. 如果找到这个符号, 它将数据拉出模块并且添加到文件 /lib/modules/KERNEL_VERSION/modules.usbmap. 在 depmod 完成后, 所有的被内核中的模块支持的 USB 设备被列出, 带有它们的模块名子, 在那个文件中. 当内核告知热插拔系统有新的 USB 设备已找到, 热插拔系统使用 moudles.usbmap 文件来找到正确的驱动来加载,并把设备的usb_device_id指针作为probe函数的第二个参数传递。

例:CY68013的struct usb_device_id,该结构中的driver_info可以保存一个结构体的指针,用来保存设备的相关信息如加载什么固件,使用那个设置等等
  1.  28 /* Define these values to match your devices */
  2.  29 #define CY68013_VENDOR_ID   0x04B4
  3.  30 #define CY68013_PRODUCT_ID  0x8613
  4.  31
  5.  32 #define CY_FIX_FW   "cy_fix.hex"
  6.  33 static struct cy68013_info cy_info = {
  7.  34     .alt    =   1,
  8.  35     .fwname =   "cy_var.hex"
  9.  36 };
  10.  37
  11.  38 /* table of devices that work with this driver */
  12.  39 static const struct usb_device_id cy68013_table[] = {
  13.  40     { USB_DEVICE(CY68013_VENDOR_ID, CY68013_PRODUCT_ID),
  14.  41         .driver_info = (unsigned long)&cy_info },
  15.  42     { }                 /* Terminating entry */
  16.  43 };
  17.  44 MODULE_DEVICE_TABLE(usb, cy68013_table);
目录
相关文章
|
2月前
|
监控 Linux 开发者
理解Linux操作系统内核中物理设备驱动(phy driver)的功能。
综合来看,物理设备驱动在Linux系统中的作用是至关重要的,它通过与硬件设备的紧密配合,为上层应用提供稳定可靠的通信基础设施。开发一款优秀的物理设备驱动需要开发者具备深厚的硬件知识、熟练的编程技能以及对Linux内核架构的深入理解,以确保驱动程序能在不同的硬件平台和网络条件下都能提供最优的性能。
120 0
|
6月前
|
监控 Linux
Linux基础:文件和目录类命令分析。
总的来说,这些基础命令,像是Linux中藏匿的小矮人,每一次我们使用他们,他们就把我们的指令准确的传递给Linux,让我们的指令变为现实。所以,现在就开始你的Linux之旅,挥动你的命令之剑,探索这个充满神秘而又奇妙的世界吧!
128 19
|
7月前
|
缓存 网络协议 Linux
PCIe 以太网芯片 RTL8125B 的 spec 和 Linux driver 分析备忘
本文详细介绍了 Realtek RTL8125B PCIe 以太网芯片的规格以及在 Linux 中的驱动安装和配置方法。通过深入分析驱动源码,可以更好地理解其工作原理和优化方法。在实际应用中,合理配置和优化驱动程序可以显著提升网络性能和稳定性。希望本文能帮助您更好地使用和管理 RTL8125B,以满足各种网络应用需求。
631 33
|
7月前
|
数据管理 Linux iOS开发
Splunk Enterprise 9.4.1 (macOS, Linux, Windows) 发布 - 机器数据管理和分析
Splunk Enterprise 9.4.1 (macOS, Linux, Windows) 发布 - 机器数据管理和分析
125 0
Splunk Enterprise 9.4.1 (macOS, Linux, Windows) 发布 - 机器数据管理和分析
|
9月前
|
存储 运维 监控
Linux--深入理与解linux文件系统与日志文件分析
深入理解 Linux 文件系统和日志文件分析,对于系统管理员和运维工程师来说至关重要。文件系统管理涉及到文件的组织、存储和检索,而日志文件则记录了系统和应用的运行状态,是排查故障和维护系统的重要依据。通过掌握文件系统和日志文件的管理和分析技能,可以有效提升系统的稳定性和安全性。
209 7
|
9月前
|
监控 安全 Linux
启用Linux防火墙日志记录和分析功能
为iptables启用日志记录对于监控进出流量至关重要
277 1
|
10月前
|
缓存 算法 Linux
Linux内核中的调度策略优化分析####
本文深入探讨了Linux操作系统内核中调度策略的工作原理,分析了不同调度算法(如CFS、实时调度)在多核处理器环境下的性能表现,并提出了针对高并发场景下调度策略的优化建议。通过对比测试数据,展示了调度策略调整对于系统响应时间及吞吐量的影响,为系统管理员和开发者提供了性能调优的参考方向。 ####
|
12月前
|
存储 传感器 Linux
STM32微控制器为何不适合运行Linux系统的分析
总的来说,虽然技术上可能存在某些特殊情况下将Linux移植到高端STM32微控制器上的可能性,但从资源、性能、成本和应用场景等多个方面考虑,STM32微控制器不适合运行Linux系统。对于需要运行Linux的应用,更适合选择ARM Cortex-A系列处理器的开发平台。
540 0
|
Linux API
Linux里的高精度时间计时器(HPET)驱动 【ChatGPT】
Linux里的高精度时间计时器(HPET)驱动 【ChatGPT】