Linux IVTV 驱动卡片清单全解:CX23415/CX23416 采集卡型号与 PCI 子系统 ID 对照手册
【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux
IVTV 是 Linux 内核中针对 iCompression iTVC15 / Conexant CX23415/CX23416 MPEG 编解码芯片的 V4L2 设备驱动,其驱动的电视卡横跨 Hauppauge、AVerMedia、Yuan、Adaptec、I/O Data、ASUS、Buffalo、Sony 等众多厂商。本文以内核文档 Documentation/admin-guide/media/ivtv-cardlist.rst 为主线,完整给出 IVTV 驱动当前支持的全部 31 种卡片型号及其 PCI 子系统 ID,并结合 drivers/media/pci/ivtv/ 目录下的源码,深入讲解卡片编号、PCI ID 匹配、硬件标志与自动检测机制,帮助你准确识别手中的采集卡、理解cardtype模块参数的使用场景,并正确对接 ivtv.rst 中描述的各 V4L2 设备节点。
IVTV 驱动与它支持的芯片平台
IVTV 驱动的核心目标,是为基于以下两款 MPEG 编解码芯片的 PCI 电视采集卡提供 Linux 开源驱动实现(见 Documentation/admin-guide/media/ivtv.rst):
- iTVC15:早期 iCompression 方案的 MPEG 编码芯片,对应 PCI 设备 ID
0x0803; - CX23415 / CX23416:Conexant 的后续方案,其中 CX23415 同时支持 MPEG 编码与解码(目前唯一具备完整解码能力的是 Hauppauge PVR-350),CX23416 仅支持 MPEG 编码,两者共享 PCI 设备 ID
0x0016。
在 drivers/media/pci/ivtv/ivtv-cards.h 中可以看到这两个设备 ID 与主 vendor ID 的定义:
/* system vendor and device IDs */ #define PCI_VENDOR_ID_ICOMP 0x4444 #define PCI_DEVICE_ID_IVTV15 0x0803 #define PCI_DEVICE_ID_IVTV16 0x0016也就是说,所有 IVTV 卡的 PCI vendor 都是0x4444(iCompression/Conexant 编码器),区分具体卡型的核心依据是子系统 vendor ID 与子系统 device ID——这正是下文卡片清单中每个条目所记录的subsystem_vendor:subsystem_device格式。
完整卡片清单(IVTV 驱动支持型号总表)
以下为 Documentation/admin-guide/media/ivtv-cardlist.rst 记录的完整清单,共 31 个条目(编号 0~30)。表中IVTV15/IVTV16表示该卡对应的主芯片设备 ID(分别对应0x0803/0x0016),后接的xxxx:xxxx即 PCI 子系统 vendor 与 subsystem device ID。
| 卡片编号 | 卡片名称 | PCI 子系统 ID |
|---|---|---|
| 0 | Hauppauge WinTV PVR-250 | IVTV16 104d:813d |
| 1 | Hauppauge WinTV PVR-350 | IVTV16 104d:813d |
| 2 | Hauppauge WinTV PVR-150 | IVTV16 104d:813d |
| 3 | AVerMedia M179 | IVTV15 1461:a3cf, IVTV15 1461:a3ce |
| 4 | Yuan MPG600, Kuroutoshikou ITVC16-STVLP | IVTV16 12ab:fff3, IVTV16 12ab:ffff |
| 5 | YUAN MPG160, Kuroutoshikou ITVC15-STVLP, I/O Data GV-M2TV/PCI | IVTV15 10fc:40a0 |
| 6 | Yuan PG600, Diamond PVR-550 | IVTV16 ff92:0070, IVTV16 ffab:0600 |
| 7 | Adaptec VideOh! AVC-2410 | IVTV16 9005:0093 |
| 8 | Adaptec VideOh! AVC-2010 | IVTV16 9005:0092 |
| 9 | Nagase Transgear 5000TV | IVTV16 1461:bfff |
| 10 | AOpen VA2000MAX-SNT6 | IVTV16 0000:ff5f |
| 11 | Yuan MPG600GR, Kuroutoshikou CX23416GYC-STVLP | IVTV16 12ab:0600, IVTV16 fbab:0600, IVTV16 1154:0523 |
| 12 | I/O Data GV-MVP/RX, GV-MVP/RX2W (dual tuner) | IVTV16 10fc:d01e, IVTV16 10fc:d038, IVTV16 10fc:d039 |
| 13 | I/O Data GV-MVP/RX2E | IVTV16 10fc:d025 |
| 14 | GotView PCI DVD | IVTV16 12ab:0600 |
| 15 | GotView PCI DVD2 Deluxe | IVTV16 ffac:0600 |
| 16 | Yuan MPC622 | IVTV16 ff01:d998 |
| 17 | Digital Cowboy DCT-MTVP1 | IVTV16 1461:bfff |
| 18 | Yuan PG600-2, GotView PCI DVD Lite | IVTV16 ffab:0600, IVTV16 ffad:0600 |
| 19 | Club3D ZAP-TV1x01 | IVTV16 ffab:0600 |
| 20 | AVerTV MCE 116 Plus | IVTV16 1461:c439 |
| 21 | ASUS Falcon2 | IVTV16 1043:4b66, IVTV16 1043:462e, IVTV16 1043:4b2e |
| 22 | AVerMedia PVR-150 Plus / AVerTV M113 Partsnic (Daewoo) Tuner | IVTV16 1461:c034, IVTV16 1461:c035 |
| 23 | AVerMedia EZMaker PCI Deluxe | IVTV16 1461:c03f |
| 24 | AVerMedia M104 | IVTV16 1461:c136 |
| 25 | Buffalo PC-MV5L/PCI | IVTV16 1154:052b |
| 26 | AVerMedia UltraTV 1500 MCE / AVerTV M113 Philips Tuner | IVTV16 1461:c019, IVTV16 1461:c01b |
| 27 | Sony VAIO Giga Pocket (ENX Kikyou) | IVTV16 104d:813d |
| 28 | Hauppauge WinTV PVR-350 (V1) | IVTV16 104d:813d |
| 29 | Yuan MPG600GR, Kuroutoshikou CX23416GYC-STVLP (no GR) | IVTV16 104d:813d |
| 30 | Yuan MPG600GR, Kuroutoshikou CX23416GYC-STVLP (no GR/YCS) | IVTV16 104d:813d |
如何解读表格中的 PCI 子系统 ID
表中的IVTV15/IVTV16前缀标明主芯片类型,而子系统 ID 则由 drivers/media/pci/ivtv/ivtv-cards.h 中定义的各厂商子系统 vendor 常量直接对应:
| 子系统 vendor | 厂商 | 典型卡型(表中出现) |
|---|---|---|
| 0x0070 / 0x0270 / 0x4070 | Hauppauge | PVR-250/350/150(见IVTV_PCI_ID_HAUPPAUGE系列) |
| 0x104d | Sony | Sony VAIO Giga Pocket、Hauppauge PVR 系列(IVTV_PCI_ID_SONY) |
| 0x1461 | AVerMedia | M179、Transgear 5000TV、MCE 116、PVR-150 Plus、M104 等(IVTV_PCI_ID_AVERMEDIA) |
| 0x12ab / 0xfbab / 0xffab / 0xff01 | Yuan(远) | MPG600、MPG160、MPG600GR、MPC622、PG600 等(IVTV_PCI_ID_YUAN1/2/3/4) |
| 0x10fc | I/O Data | GV-M2TV、GV-MVP/RX 系列(IVTV_PCI_ID_IODATA) |
| 0x1154 | Melco(Buffalo) | PC-MV5L/PCI、CX23416GYC(IVTV_PCI_ID_MELCO) |
| 0x9005 | Adaptec | VideOh! AVC-2410 / AVC-2010(IVTV_PCI_ID_ADAPTEC) |
| 0x1043 | ASUSTek | ASUS Falcon2(IVTV_PCI_ID_ASUSTEK) |
| 0xff92 | Diamond Multimedia | Diamond PVR-550(IVTV_PCI_ID_DIAMONDMM) |
| 0xffac / 0xffad | GotView | PCI DVD2 Deluxe、PCI DVD Lite(IVTV_PCI_ID_GOTVIEW1/2) |
| 0x0000 | 通用/无指定 | AOpen VA2000MAX-SNT6(仅按子系统 device0xff5f匹配) |
值得特别说明的是Hauppauge 系列(编号 0、1、2、28):在 drivers/media/pci/ivtv/ivtv-cards.c 中有明确注释——Hauppauge 卡不使用 PCI ID 进行识别,而是依靠板载tveeprom(电视 EEPROM)中的信息来判断具体型号,因此它们在清单中共享同一个子系统 ID104d:813d。这解释了为什么 PVR-250、PVR-350、PVR-150 三款完全不同定位的卡会登记为同一个 ID。
特殊变体卡:编号 28~30
drivers/media/pci/ivtv/ivtv-cards.h 的注释指出:编号 28~30 是"与现有卡共用相同 PCI ID 的变体",驱动必须借助其他设备信息(如 EEPROM、I2C 探测结果)来区分,因此它们被强制放在卡片列表的末尾:
- 28 - PVR-350 (V1):使用 SAA7114 视频解码器替代 SAA7115,且为早期预生产型号,音频输入行为特殊(ivtv-cards.c 注明其音频可能仅支持单声道);
- 29 - CX23416GYC (no GR):无 Ghost Reduction(去重影)芯片 UPD64031A 的变体;
- 30 - CX23416GYC (no GR/YCS):既无 GR 也无 Y/C 分离芯片 UPD6408X 的最简变体。
这一点在源码的卡片数组ivtv_card_list[](ivtv-cards.c)中体现得很直观:三个变体被显式注释为 "Variations of standard cards but with the same PCI IDs. These cards must come last in this list."
从源码看卡片定义:ivtv_card结构体
清单中的每一行,在源码里都对应一个const struct ivtv_card静态实例。该结构体(drivers/media/pci/ivtv/ivtv-cards.h)完整描述了一张卡片的硬件构成,主要包括:
v4l2_capabilities:编码/解码能力位,IVTV_CAP_ENCODER含视频采集、调谐器、音频、VBI 采集等 V4L2 能力;IVTV_CAP_DECODER含视频输出与 sliced VBI 输出(ivtv-cards.h)。PVR-350 是唯一同时具备两者(IVTV_CAP_ENCODER | IVTV_CAP_DECODER)的卡;hw_video/hw_audio/hw_all:位掩码,声明板载的视频/音频处理芯片与 I2C 设备,取值见enum ivtv_hw_bits(ivtv-cards.h),包括 SAA7114/7115、SAA717X、CX25840、MSP34XX、WM8775/WM8739、CS53L32A、M52790、UPD64031A(去重影)、UPD6408X(Y/C 分离)、TUNER、TVEEPROM、各类红外接收器等;video_inputs/audio_inputs/radio_input:视频/音频输入通道描述,视频输入类型由IVTV_CARD_INPUT_VID_TUNER(调谐器)、IVTV_CARD_INPUT_SVIDEO1/2、IVTV_CARD_INPUT_COMPOSITE1/2/3枚举(ivtv-cards.h);gpio_*系列:无专用音频芯片的卡通过 GPIO 位操作完成音频输入切换、静音、单声道/立体声/双语模式与采样率选择(见struct ivtv_gpio_audio_mode、struct ivtv_gpio_audio_freq等定义,ivtv-cards.h);tuners[]:候选调谐器列表,每个条目绑定适用的电视制式(V4L2_STD_PAL_SECAM、V4L2_STD_MN等)与tuner.h中的调谐器 ID;pci_list:该卡对应的{device, subsystem_vendor, subsystem_device}三元组数组,用于 PCI ID 匹配。
以清单第 4 项 "Yuan MPG600, Kuroutoshikou ITVC16-STVLP" 为例,源码 ivtv-cards.c 中的定义展示了其完整画像:
static const struct ivtv_card_pci_info ivtv_pci_mpg600[] = { { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_YUAN1, 0xfff3 }, { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_YUAN1, 0xffff }, { 0, 0, 0 } }; static const struct ivtv_card ivtv_card_mpg600 = { .type = IVTV_CARD_MPG600, .name = "Yuan MPG600, Kuroutoshikou ITVC16-STVLP", .v4l2_capabilities = IVTV_CAP_ENCODER, .hw_video = IVTV_HW_SAA7115, .hw_audio = IVTV_HW_GPIO, /* 音频通过 GPIO 控制 */ .hw_all = IVTV_HW_GPIO | IVTV_HW_SAA7115 | IVTV_HW_TUNER, /* 视频输入:调谐器 + S-Video + Composite */ .video_inputs = { { IVTV_CARD_INPUT_VID_TUNER, 0, IVTV_SAA71XX_COMPOSITE4 }, { IVTV_CARD_INPUT_SVIDEO1, 1, IVTV_SAA71XX_SVIDEO0 }, { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE3 }, }, .audio_inputs = { { IVTV_CARD_INPUT_AUD_TUNER, IVTV_GPIO_TUNER }, { IVTV_CARD_INPUT_LINE_IN1, IVTV_GPIO_LINE_IN }, }, .gpio_init = { .direction = 0x3080, .initial_value = 0x0004 }, .gpio_audio_input = { .mask = 0x3000, .tuner = 0x0000, .linein = 0x2000 }, .gpio_audio_mute = { .mask = 0x0001, .mute = 0x0001 }, .gpio_audio_mode = { .mask = 0x000e, .mono = 0x0006, .stereo = 0x0004, .lang1 = 0x0004, .lang2 = 0x0000, .both = 0x0008 }, .gpio_audio_detect = { .mask = 0x0900, .stereo = 0x0100 }, .tuners = { { .std = V4L2_STD_PAL_SECAM, .tuner = TUNER_PHILIPS_FQ1216ME }, { .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_FQ1286 }, }, .pci_list = ivtv_pci_mpg600, .i2c = &ivtv_i2c_std, };从这份定义可以看到清单背后的工程信息:MPG600 的视频处理由 SAA7115 承担,音频切换依赖 GPIO 位操作(gpio_audio_mode定义了 mono/stereo/lang1/lang2/both 各自对应的位模式),调谐器按制式给出两个候选(PAL/SECAM 用 Philips FQ1216ME,其余制式用 FQ1286)。
I2C 探测地址表
卡片定义中的i2c字段指向一张"待探测的 I2C 地址表"(ivtv-cards.c),驱动据此在 I2C 总线上逐一探测调谐器、解调器与收音机芯片:
/* usual i2c tuner addresses to probe */ static struct ivtv_card_tuner_i2c ivtv_i2c_std = { .radio = { I2C_CLIENT_END }, .demod = { 0x43, I2C_CLIENT_END }, .tv = { 0x61, 0x60, I2C_CLIENT_END }, }; /* as above, but with possible radio tuner */ static struct ivtv_card_tuner_i2c ivtv_i2c_radio = { .radio = { 0x60, I2C_CLIENT_END }, .demod = { 0x43, I2C_CLIENT_END }, .tv = { 0x61, I2C_CLIENT_END }, }; /* using the tda8290+75a combo */ static struct ivtv_card_tuner_i2c ivtv_i2c_tda8290 = { .radio = { I2C_CLIENT_END }, .demod = { I2C_CLIENT_END }, .tv = { 0x4b, I2C_CLIENT_END }, };清单中第 22 项 AVerMedia PVR-150 Plus 使用ivtv_i2c_radio(因为 0xc035 变体带 TEA5767 FM 调谐器),第 16 项 Yuan MPC622 使用ivtv_i2c_tda8290(板载 TDA8290/TDA8275 调谐芯片),其余多数卡片走标准地址表ivtv_i2c_std。
自动检测与cardtype模块参数
正常情况下,驱动通过pci_list中的子系统 ID 三元组自动匹配卡片,无需任何配置。只有当自动检测失败时才需要强制指定卡型。在 drivers/media/pci/ivtv/ivtv-driver.c 中,相关模块参数定义如下:
module_param_array(tuner, int, &tuner_c, 0644); module_param_array(radio, int, &radio_c, 0644); module_param_array(cardtype, int, &cardtype_c, 0644);其中cardtype的参数说明(ivtv-driver.c)给出了与上表编号一一对应的强制指定值(注意此处的编号从 1 开始,与清单编号相差 1):
1= WinTV PVR 250;2= WinTV PVR 350;3= WinTV PVR-150 或 PVR-500;4= AVerMedia M179;5= YUAN MPG600/Kuroutoshikou iTVC16-STVLP;6= YUAN MPG160/iTVC15-STVLP;7= YUAN PG600/DIAMONDMM PVR-550(CX Falcon 2);8= Adaptec AVC-2410;9= Adaptec AVC-2010;10= NAGASE TRANSGEAR 5000TV;11= AOpen VA2000MAX-STN6;12= YUAN MPG600GR/CX23416GYC-STVLP;13= I/O Data GV-MVP/RX;14= I/O Data GV-MVP/RX2E;15= GOTVIEW PCI DVD;16= GOTVIEW PCI DVD2 Deluxe;17= Yuan MPC622;18= Digital Cowboy DCT-MTVP1;19= Yuan PG600V2/GotView PCI DVD Lite;20= Club3D ZAP-TV1x01;21= AverTV MCE 116 Plus;22= ASUS Falcon2;23= AverMedia PVR-150 Plus;24= AverMedia EZMaker PCI Deluxe;25= AverMedia M104(尚不可用,对应源码中ivtv_card_aver_m104的"Not yet supported!"注释,见 ivtv-cards.c);26= Buffalo PC-MV5L/PCI;27= AVerMedia UltraTV 1500 MCE;28= Sony VAIO Giga Pocket (ENX Kikyou);0= 自动检测(默认);-1= 忽略该卡。
典型用法(按 PCI 槽位顺序传参,多卡用逗号分隔):
# 强制第 1 块卡为 AVerMedia M179(对应清单编号 3 → 参数值 4) sudo modprobe ivtv cardtype=4 # 第 1 块卡强制为 PVR-350,第 2 块卡忽略 sudo modprobe ivtv cardtype=2,-1配套的调谐器与制式参数
卡片清单只解决"这块卡是什么",而调谐器与电视制式的细节由另外几组参数控制(定义与说明见 ivtv-driver.c):
tuner:调谐器类型选择,取值见tuner.h,仅在自动探测失败时使用;radio:0 关闭收音机、1 开启,仅在自动探测失败时使用;tunertype:0= PAL B/G/H/D/K/I、SECAM B/G/H/D/K/L/Lc 制式调谐器;1= NTSC M/J/K、PAL M/N/Nc;-1= 自动检测(默认);pal/secam/ntsc:显式指定电视制式。例如pal可选BGH、DK、I、M、N、Nc、60;secam可选BGH、DK、L、LC;ntsc可选M、J(日本)、K(韩国)。
对清单第 26 项 AVerMedia UltraTV 1500 MCE,源码 ivtv-cards.c 还专门给出了提示性注释:非 NTSC 制式的调谐器需要通过pal=或secam=模块参数来指定,可见清单与模块参数是配合使用的整体方案。
从卡片到设备节点:识别成功后你会看到什么
驱动在正确识别卡片后,会按 Documentation/admin-guide/media/ivtv.rst 描述的布局创建设备节点。基础节点如下(设备号随卡片实例递增):
crw-rw---- 1 root video 81, 0 Jun 19 22:22 /dev/video0 # MPEG 编码采集 crw-rw---- 1 root video 81, 16 Jun 19 22:22 /dev/video16 # 解码输出(仅 CX23415) crw-rw---- 1 root video 81, 24 Jun 19 22:22 /dev/video24 # 原始 PCM 音频采集 crw-rw---- 1 root video 81, 32 Jun 19 22:22 /dev/video32 # 原始 YUV 视频采集 crw-rw---- 1 root video 81, 48 Jun 19 22:22 /dev/video48 # YUV 显示输出(仅 CX23415) crw-rw---- 1 root video 81, 64 Jun 19 22:22 /dev/radio0 # 收音机调谐(视卡而定) crw-rw---- 1 root video 81,224 Jun 19 22:22 /dev/vbi0 # VBI 采集(图文/CC) crw-rw---- 1 root video 81,228 Jun 19 22:22 /dev/vbi8 # VBI 反馈(仅 CX23415) crw-rw---- 1 root video 81,232 Jun 19 22:22 /dev/vbi16 # VBI 显示输出(仅 CX23415)无解码能力(非 PVR-350)的卡缺少vbi8、vbi16、video16、video48节点,也没有/dev/fbx帧缓冲;radio0是否出现取决于卡上是否有收音机调谐器。多卡环境下设备号按"基础设备号 + 卡序号"递增;如果系统里还有其他先被探测到的采集卡(如 WinTV PCI),可以用ivtv_first_minor模块参数让 IVTV 从指定序号开始分配,避免设备号错乱(ivtv-driver.c 中校验其取值范围为 0~IVTV_MAX_CARDS-1)。
使用注意事项
- 固件要求:IVTV 驱动必须加载最新的编码器固件(版本 2.06.039,大小 376836 字节),否则硬件 MPEG 编码无法工作(见 ivtv.rst 顶部说明);
- 应用层限制:普通电视应用无法直接使用 IVTV 设备,需要支持 MPEG 输入流的播放器或 PVR 软件(如 mplayer、xine、MythTV 等)才能读取
/dev/video0的 MPEG 节目流; - 匹配失败时的排查路径:先用
lspci -nn查看卡的 vendor/device 与 subsystem ID,对照本文清单确认型号;若在清单内但驱动未识别,用cardtype=强制指定;若涉及调谐器异常,再检查tuner=、tunertype=与pal=/secam=/ntsc=参数; - 变体卡的识别:编号 28~30 与常规卡共享 PCI ID,驱动依赖 tveeprom 与 I2C 探测等辅助信息区分,无需也无法通过 PCI ID 直接指定。
综上,ivtv-cardlist.rst本质上是 IVTV 驱动"卡型 ↔ PCI 子系统 ID"的权威对照表,而 drivers/media/pci/ivtv/ivtv-cards.c 与 drivers/media/pci/ivtv/ivtv-cards.h 则给出了每个条目的完整硬件画像。两张"表"配合使用,即可在绝大多数场景下完成采集卡的识别、验证与排障。
【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考