Linux 内核 Media 子系统「其他 USB 设备卡列表」完全解读:驱动、设备与 USB ID 对照手册
【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux
本文基于 Linux 内核源码树中的 Documentation/admin-guide/media/other-usb-cardlist.rst 展开,该文档收录了 Linux media 子系统下不隶属于常规 V4L/DVB 分类的15 个 USB 驱动及其支持的约 60 个设备 USB ID,覆盖 SDR 软件无线电、DVB-T 数字电视、USB 视频采集与网络摄像头等场景。读完本文,你将掌握如何阅读内核 USB ID 表、如何用
lsusb核对设备 VID/PID、如何在 drivers/media/usb 源码中定位驱动绑定关系,以及常见设备对应的内核模块名。
一、背景:这张「卡列表」是什么
在 Linux media 子系统中,PCI、USB、平台设备驱动的支持情况以「卡片列表」(card list)的形式集中归档在 Documentation/admin-guide/media/cardlist.rst 之下,其目录入口见 Documentation/admin-guide/media/index.rst 的 toctree(usb-cardlist、pci-cardlist、platform-cardlist、radio-cardlist、i2c-cardlist、misc-cardlist)。other-usb-cardlist.rst正是其中的「杂项 USB」清单,它没有涵盖在更细分的文档里,而是以一张统一的Driver / Card name / USB IDs三列表格集中呈现。
对用户而言,这张表的核心价值在于:通过 USB 设备的 VID(Vendor ID,厂商 ID)与 PID(Product ID,产品 ID),快速判断手上的硬件是否被内核支持、对应加载哪个驱动模块。USB 总线上的每个设备都带有idVendor:idProduct标识,内核正是靠这两个 16 位编号在驱动注册的usb_device_id表中完成匹配并绑定驱动的。
从源码结构看,这些驱动全部位于 drivers/media/usb 目录下,分别属于SDR(软件无线电)、DVB(数字视频广播)与V4L2(视频采集)三大类,下文将逐类展开。
二、完整设备对照表(继承自原文档)
以下表格完整复刻原文档内容。USB ID 采用xxxx:yyyy的十六进制表示,xxxx为厂商 ID(VID),yyyy为产品 ID(PID),同一驱动支持多个 PID 时以逗号分隔:
| 驱动 (Driver) | 设备名 (Card name) | USB ID |
|---|---|---|
| airspy | Airspy | 1d50:60a1 |
| dvb-as102 | Abilis Systems DVB-Titan | 1BA6:0001 |
| dvb-as102 | PCTV Systems picoStick (74e) | 2013:0246 |
| dvb-as102 | Elgato EyeTV DTT Deluxe | 0fd9:002c |
| dvb-as102 | nBox DVB-T Dongle | 0b89:0007 |
| dvb-as102 | Sky IT Digital Key (green led) | 2137:0001 |
| b2c2-flexcop-usb | Technisat/B2C2 FlexCop II/IIb/III Digital TV | 0af7:0101 |
| go7007 | WIS GO7007 MPEG encoder | 1943:a250, 093b:a002, 093b:a004, 0eb1:6666, 0eb1:6668 |
| hackrf | HackRF Software Decoder Radio | 1d50:6089 |
| hdpvr | Hauppauge HD PVR | 2040:4900, 2040:4901, 2040:4902, 2040:4982, 2040:4903 |
| msi2500 | Mirics MSi3101 SDR Dongle | 1df7:2500, 2040:d300 |
| pvrusb2 | Hauppauge WinTV-PVR USB2 | 2040:2900, 2040:2950, 2040:2400, 1164:0622, 1164:0602, 11ba:1003, 11ba:1001, 2040:7300, 2040:7500, 2040:7501, 0ccd:0039, 2040:7502, 2040:7510 |
| pwc | Creative Webcam 5 | 041E:400C |
| pwc | Creative Webcam Pro Ex | 041E:4011 |
| pwc | Logitech QuickCam 3000 Pro | 046D:08B0 |
| pwc | Logitech QuickCam Notebook Pro | 046D:08B1 |
| pwc | Logitech QuickCam 4000 Pro | 046D:08B2 |
| pwc | Logitech QuickCam Zoom (old model) | 046D:08B3 |
| pwc | Logitech QuickCam Zoom (new model) | 046D:08B4 |
| pwc | Logitech QuickCam Orbit/Sphere | 046D:08B5 |
| pwc | Logitech/Cisco VT Camera | 046D:08B6 |
| pwc | Logitech ViewPort AV 100 | 046D:08B7 |
| pwc | Logitech QuickCam | 046D:08B8 |
| pwc | Philips PCA645VC | 0471:0302 |
| pwc | Philips PCA646VC | 0471:0303 |
| pwc | Askey VC010 type 2 | 0471:0304 |
| pwc | Philips PCVC675K (Vesta) | 0471:0307 |
| pwc | Philips PCVC680K (Vesta Pro) | 0471:0308 |
| pwc | Philips PCVC690K (Vesta Pro Scan) | 0471:030C |
| pwc | Philips PCVC730K (ToUCam Fun), PCVC830 (ToUCam II) | 0471:0310 |
| pwc | Philips PCVC740K (ToUCam Pro), PCVC840 (ToUCam II) | 0471:0311 |
| pwc | Philips PCVC750K (ToUCam Pro Scan) | 0471:0312 |
| pwc | Philips PCVC720K/40 (ToUCam XS) | 0471:0313 |
| pwc | Philips SPC 900NC | 0471:0329 |
| pwc | Philips SPC 880NC | 0471:032C |
| pwc | Sotec Afina Eye | 04CC:8116 |
| pwc | Samsung MPC-C10 | 055D:9000 |
| pwc | Samsung MPC-C30 | 055D:9001 |
| pwc | Samsung SNC-35E (Ver3.0) | 055D:9002 |
| pwc | Askey VC010 type 1 | 069A:0001 |
| pwc | AME Co. Afina Eye | 06BE:8116 |
| pwc | Visionite VCS-UC300 | 0d81:1900 |
| pwc | Visionite VCS-UM100 | 0d81:1910 |
| s2255drv | Sensoray 2255 | 1943:2255, 1943:2257 |
| stk1160 | STK1160 USB video capture dongle | 05e1:0408 |
| dvb-ttusb-budget | Technotrend/Hauppauge Nova-USB devices | 0b48:1003, 0b48:1004, 0b48:1005 |
| dvb-ttusb_dec | Technotrend/Hauppauge MPEG decoder DEC3000-s | 0b48:1006 |
| dvb-ttusb_dec | Technotrend/Hauppauge MPEG decoder | 0b48:1007 |
| dvb-ttusb_dec | Technotrend/Hauppauge MPEG decoder DEC2000-t | 0b48:1008 |
| dvb-ttusb_dec | Technotrend/Hauppauge MPEG decoder DEC2540-t | 0b48:1009 |
| usbtv | Fushicai USBTV007 Audio-Video Grabber | 1b71:3002, 1f71:3301, 1f71:3306 |
可以看到,pwc是这张表中覆盖设备最多的驱动(26 个 PID,横跨 Creative、Logitech、Philips、Samsung、Visionite 等多个品牌),pvrusb2次之(13 个 PID)。这两个驱动的设备列表在源码中同样有完整的一一对应关系,下文将结合源码验证。
三、从源码验证:USB ID 是如何绑定到驱动的
这张表并非孤立的说明文字,其中每个 ID 都能在 drivers/media/usb 的源码里找到对应的usb_device_id表项。USB 核心在设备枚举时遍历驱动注册的 ID 表,命中后调用驱动的 probe 回调完成绑定。以下按目录逐一核对:
3.1 SDR 软件无线电类
airspy(drivers/media/usb/airspy/airspy.c):
{ USB_DEVICE(0x1d50, 0x60a1) }, /* AirSpy */hackrf(drivers/media/usb/hackrf/hackrf.c):
{ USB_DEVICE(0x1d50, 0x6089) }, /* HackRF One */msi2500(drivers/media/usb/msi2500/msi2500.c):
static const struct usb_device_id msi2500_id_table[] = { {USB_DEVICE(0x1df7, 0x2500)}, /* Mirics MSi3101 SDR Dongle */ {USB_DEVICE(0x2040, 0xd300)}, /* Hauppauge WinTV 133559 LF */ { } };注意一个有趣的现象:0x1d50是 OpenMoko 社区分配的厂商 ID,Airspy 与 HackRF One 都使用该 VID;而2040:d300表明 msi2500 还以 Hauppauge 品牌(VID 0x2040)贴牌销售过。这正体现了「同一驱动支持多家品牌 OEM 贴牌设备」的常见情形——列在表中的「Card name」并非产品名与驱动一一对应的充分条件,最终判据永远是 VID:PID。
3.2 DVB-T 调谐器类
dvb-as102的 ID 表定义在 drivers/media/usb/as102/as102_usb_drv.c,其 VID/PID 常量集中在 drivers/media/usb/as102/as102_usb_drv.h:
{ USB_DEVICE(AS102_USB_DEVICE_VENDOR_ID, AS102_USB_DEVICE_PID_0001), ... }, /* 1BA6:0001 Abilis Systems DVB-Titan */ { USB_DEVICE(PCTV_74E_USB_VID, PCTV_74E_USB_PID), ... }, /* 2013:0246 PCTV picoStick 74e */ { USB_DEVICE(ELGATO_EYETV_DTT_USB_VID, ELGATO_EYETV_DTT_USB_PID), ... }, /* 0fd9:002c Elgato EyeTV DTT Deluxe */ { USB_DEVICE(NBOX_DVBT_DONGLE_USB_VID, NBOX_DVBT_DONGLE_USB_PID), ... }, /* 0b89:0007 nBox DVB-T Dongle */ { USB_DEVICE(SKY_IT_DIGITAL_KEY_USB_VID, SKY_IT_DIGITAL_KEY_USB_PID), ... }, /* 2137:0001 Sky IT Digital Key */其中常量值(见 as102_usb_drv.h)为:AS102_USB_DEVICE_VENDOR_ID=0x1BA6、AS102_USB_DEVICE_PID_0001=0x0001、PCTV_74E_USB_VID=0x2013/PID=0x0246、ELGATO_EYETV_DTT_USB_VID=0x0fd9/PID=0x002c、NBOX_DVBT_DONGLE_USB_VID=0x0b89/PID=0x0007、SKY_IT_DIGITAL_KEY_USB_VID=0x2137/PID=0x0001,与文档表格逐项吻合。该驱动不仅匹配 ID,还通过DRIVER_INFO宏为不同型号传递不同的配置参数(如 Elgato 的0xC0、nBox 与 Sky 的0xA0),说明同一驱动可依据 ID 区分型号并加载差异化配置。
b2c2-flexcop-usb(drivers/media/usb/b2c2/flexcop-usb.c):
static const struct usb_device_id flexcop_usb_table[] = { { USB_DEVICE(0x0af7, 0x0101) }, { } };该驱动支持 Technisat/B2C2 FlexCop II/IIb/III 系列 USB DVB 设备,属于 DVB-S/DVB-T 通用前端方案。
dvb-ttusb-budget(drivers/media/usb/ttusb-budget/dvb-ttusb-budget.c):
static const struct usb_device_id ttusb_table[] = { {USB_DEVICE(0xb48, 0x1003)}, {USB_DEVICE(0xb48, 0x1004)}, {USB_DEVICE(0xb48, 0x1005)}, { } };dvb-ttusb_dec(drivers/media/usb/ttusb-dec/ttusb_dec.c):
static const struct usb_device_id ttusb_dec_table[] = { {USB_DEVICE(0x0b48, 0x1006)}, /* DEC3000-s */ /*{USB_DEVICE(0x0b48, 0x1007)}, Unconfirmed */ {USB_DEVICE(0x0b48, 0x1008)}, /* DEC2000-t */ {USB_DEVICE(0x0b48, 0x1009)}, /* DEC2540-t */ { } };从源码可以推断,文档中列为0b48:1007的那一条在驱动中处于注释状态(标注Unconfirmed,未经验证),因此实际绑定仅覆盖 1006/1008/1009 三个 PID。这是一个典型的「文档与代码存在细微出入」案例,也提醒读者:内核文档的 ID 表是参考索引,驱动源码中的usb_device_id表才是设备能否被识别的最终依据。
3.3 USB 视频采集 / 编码类
go7007(drivers/media/usb/go7007/go7007-usb.c)比较特殊,其 ID 表没有全部使用简单的USB_DEVICE宏,而是通过match_flags组合USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION(同时匹配设备与 bcdDevice 版本号)与USB_DEVICE_ID_MATCH_INT_INFO(匹配接口类/子类/协议)等标志做多维度匹配,用于区分同一 PID 下固件版本不同的 WIS GO7007 MPEG 编码器设备。这解释了为何该类设备在枚举时对固件版本敏感。
hdpvr(drivers/media/usb/hdpvr/hdpvr-core.c)使用HD_PVR_VENDOR_ID(0x2040)搭配五个产品 ID 常量(HD_PVR_PRODUCT_ID~HD_PVR_PRODUCT_ID4,即 4900/4901/4902/4982/4903),对应 Hauppauge HD PVR 系列模拟/HDMI 采集盒。
pvrusb2(drivers/media/usb/pvrusb2 目录)的 ID 表位于 pvrusb2-main.c,13 个 PID 覆盖 Hauppauge WinTV-PVR USB2 全系(2040:2900/2950/2400/7300/7500/7501/7502/7510)以及 OEM 贴牌型号(1164:xxxx 为 Hauppauge 的 Conexant 体系 VID、11ba:xxxx、0ccd:0039 等)。pvrusb2 是 media 子系统中结构最复杂的复合设备驱动之一,同时提供 V4L2 视频、音频与 DVB-T 功能,其设备属性(含支持的标准、调谐器型号)集中定义在 pvrusb2-devattr.c。
stk1160(drivers/media/usb/stk1160/stk1160-core.c):
static const struct usb_device_id stk1160_id_table[] = { { USB_DEVICE(0x05e1, 0x0408) }, { } };usbtv(drivers/media/usb/usbtv/usbtv-core.c):
static const struct usb_device_id usbtv_id_table[] = { { USB_DEVICE(0x1b71, 0x3002) }, { USB_DEVICE(0x1f71, 0x3301) }, { USB_DEVICE(0x1f71, 0x3306) }, { } };Fushicai USBTV007 是经典的「免驱」模拟音视频采集棒,usbtv驱动同时注册了 V4L2 视频(usbtv-video.c)与 ALSA 音频(usbtv-audio.c)两个接口。
s2255drv(drivers/media/usb/s2255/s2255drv.c):
static const struct usb_device_id s2255_table[] = { {USB_DEVICE(USB_SENSORAY_VID, 0x2255)}, {USB_DEVICE(USB_SENSORAY_VID, 0x2257)}, /*same family as 2255*/ { } };其中USB_SENSORAY_VID为 0x1943,对应 Sensoray 2255/2257 四通道 USB 视频采集卡。
3.4 网络摄像头类(pwc)
pwc 是 Philips Webcam 系列驱动,其 26 个 PID 的 ID 表定义在 drivers/media/usb/pwc/pwc-if.c 起的pwc_device_table[]中,表项带逐行注释(如/* Creative Webcam 5 */、/* Logitech QuickCam 3000 Pro */),与文档完全一致。值得一提的是 pwc 驱动还依赖专有固件:设备初始化时需要上传从摄像头 EEPROM 读出的固件镜像(由 pwc-if.c 中的固件加载逻辑处理),这是该系列摄像头在 Linux 上曾经的主要使用门槛。驱动内部还按芯片代次拆分为 Kiara(pwc-kiara.c)、Timon(pwc-timon.c)、Nala(pwc-nala.h)等变体实现,对应不同的解码算法(pwc-dec1.c、pwc-dec23.c)。
四、实战:如何在你的系统上核对与使用这些设备
4.1 用 lsusb 读取设备的 VID:PID
任何 USB 设备插入后,都可以通过lsusb查看其真实 ID:
$ lsusb Bus 001 Device 004: ID 1d50:60a1 OpenMoko, Inc. Airspy Bus 001 Device 005: ID 2040:4902 Hauppauge第一列的1d50:60a1即为设备的 VID:PID,与本文表格对照即可判断内核是否有对应驱动支持。更精确的匹配结果可在内核日志中确认:
$ dmesg | grep -i usb usb 1-1: New USB device found, idVendor=1d50, idProduct=60a14.2 确认驱动模块并查看绑定情况
驱动加载后,/sys/bus/usb/drivers/下会出现对应驱动目录,设备会以VID:PID形式出现在其bind关系中:
$ ls /sys/bus/usb/drivers/airspy/ 1-1:1.0 bind module uevent unbind $ modinfo airspy filename: /lib/modules/.../kernel/drivers/media/usb/airspy/airspy.ko alias: usb:v1D50p60A1d*dc*dsc*dp*ic*isc*ip*in*modinfo输出的alias字段会展开该驱动注册的全部 USB ID 通配模式,可与lsusb输出互相印证。常用模块名与设备类别的对应关系如下:
| 设备类型 | 模块名(示例) | 源码位置 |
|---|---|---|
| SDR | airspy、hackrf、msi2500 | drivers/media/usb/airspy、drivers/media/usb/hackrf、drivers/media/usb/msi2500 |
| DVB-T 调谐器 | as102 | drivers/media/usb/as102 |
| DVB 前端/解码 | dvb_ttusb_budget、dvb_ttusb_dec、b2c2-flexcop-usb | drivers/media/usb/ttusb-budget、drivers/media/usb/ttusb-dec、drivers/media/usb/b2c2 |
| 视频采集 | pvrusb2、hdpvr、go7007、stk1160、usbtv、s2255 | drivers/media/usb/pvrusb2 等 |
| 网络摄像头 | pwc | drivers/media/usb/pwc |
这些驱动的 Kconfig 选项集中在 drivers/media/usb/Kconfig,如需在内核配置阶段启用,可按类别打开对应的MEDIA_USB_SUPPORT子项。
4.3 内核配置与编译前提
- SDR 类(airspy/hackrf/msi2500)依赖
CONFIG_MEDIA_SUPPORT、CONFIG_MEDIA_USB_SUPPORT与CONFIG_RC_CORE之外的 SDR 框架(CONFIG_VIDEO_V4L2及CONFIG_MEDIA_CONTROLLER视需要开启),启用后可在用户空间配合rtl-sdr生态或 GNU Radio 使用; - DVB 类(as102/ttusb/flexcop)依赖
CONFIG_DVB_CORE及对应前端(demod/tuner)驱动,配合 DVB 应用(如dvbv5-zap)扫描频道; - 视频类(pvrusb2/hdpvr/stk1160/usbtv 等)依赖
CONFIG_VIDEO_V4L2,加载后产生/dev/video0设备节点,可用 V4L2 工具(v4l2-ctl --list-devices)查看。
具体到各驱动的依赖项,以 drivers/media/usb/airspy/Kconfig、drivers/media/usb/as102/Kconfig 等文件中的depends on语句为准。
五、注意事项与限制
- 文档表 ≠ 最终支持清单:如 ttusb-dec 的
0b48:1007在驱动源码中处于注释状态(Unconfirmed),遇到类似「表中有、代码中无」的条目时,应以 drivers/media/usb 下对应驱动的usb_device_id表为最终依据。 - OEM 贴牌导致 VID 复杂:同一硬件可能以多个品牌、多个 VID/PID 出售(如 pvrusb2 覆盖 0x2040/0x1164/0x11ba/0x0ccd 四家 VID),你的设备 ID 只要命中表中任一组合即可被识别。
- 固件依赖:pwc(摄像头固件)、go7007(go7007-fw.c 固件加载)等驱动需要额外固件文件才能工作,仅匹配 USB ID 不代表开箱即用。
- 匹配精度:go7007 的 ID 表使用
match_flags同时匹配 bcdDevice 版本与接口信息,同一 PID 不同固件版本可能表现不同,升级/降级设备固件前建议先确认内核版本兼容性。 - 本表仅覆盖「其他」类 USB 设备:更多 PCI 设备见 Documentation/admin-guide/media/pci-cardlist.rst,常规 USB 设备见 Documentation/admin-guide/media/usb-cardlist.rst,平台设备、I²C 器件与收音设备分别见 Documentation/admin-guide/media 目录下的
platform-cardlist.rst、i2c-cardlist.rst与radio-cardlist.rst。
六、小结
other-usb-cardlist.rst用一张表浓缩了 Linux media 子系统对「杂项 USB 设备」的支持全貌:从 Airspy/HackRF 这类开源 SDR 硬件,到 Elgato/PCTV/nBox 等 DVB-T 电视棒,再到 Hauppauge 全家桶(HD PVR、WinTV-PVR)与 Philips 系网络摄像头。结合 drivers/media/usb 下的驱动源码,你可以把这张表当作「VID:PID → 内核模块 → 源码实现」的索引地图:先用lsusb拿到设备 ID,再查表定位驱动,最后用modinfo与dmesg确认加载状态,即可完成从硬件识别到驱动验证的完整排查流程。
<输出文章>
【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考