news 2026/9/10 3:46:41

Linux IVTV 驱动卡片清单全解:CX23415/CX23416 采集卡型号与 PCI 子系统 ID 对照手册

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux IVTV 驱动卡片清单全解:CX23415/CX23416 采集卡型号与 PCI 子系统 ID 对照手册

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 设备 ID0x0803
  • CX23415 / CX23416:Conexant 的后续方案,其中 CX23415 同时支持 MPEG 编码与解码(目前唯一具备完整解码能力的是 Hauppauge PVR-350),CX23416 仅支持 MPEG 编码,两者共享 PCI 设备 ID0x0016

在 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
0Hauppauge WinTV PVR-250IVTV16 104d:813d
1Hauppauge WinTV PVR-350IVTV16 104d:813d
2Hauppauge WinTV PVR-150IVTV16 104d:813d
3AVerMedia M179IVTV15 1461:a3cf, IVTV15 1461:a3ce
4Yuan MPG600, Kuroutoshikou ITVC16-STVLPIVTV16 12ab:fff3, IVTV16 12ab:ffff
5YUAN MPG160, Kuroutoshikou ITVC15-STVLP, I/O Data GV-M2TV/PCIIVTV15 10fc:40a0
6Yuan PG600, Diamond PVR-550IVTV16 ff92:0070, IVTV16 ffab:0600
7Adaptec VideOh! AVC-2410IVTV16 9005:0093
8Adaptec VideOh! AVC-2010IVTV16 9005:0092
9Nagase Transgear 5000TVIVTV16 1461:bfff
10AOpen VA2000MAX-SNT6IVTV16 0000:ff5f
11Yuan MPG600GR, Kuroutoshikou CX23416GYC-STVLPIVTV16 12ab:0600, IVTV16 fbab:0600, IVTV16 1154:0523
12I/O Data GV-MVP/RX, GV-MVP/RX2W (dual tuner)IVTV16 10fc:d01e, IVTV16 10fc:d038, IVTV16 10fc:d039
13I/O Data GV-MVP/RX2EIVTV16 10fc:d025
14GotView PCI DVDIVTV16 12ab:0600
15GotView PCI DVD2 DeluxeIVTV16 ffac:0600
16Yuan MPC622IVTV16 ff01:d998
17Digital Cowboy DCT-MTVP1IVTV16 1461:bfff
18Yuan PG600-2, GotView PCI DVD LiteIVTV16 ffab:0600, IVTV16 ffad:0600
19Club3D ZAP-TV1x01IVTV16 ffab:0600
20AVerTV MCE 116 PlusIVTV16 1461:c439
21ASUS Falcon2IVTV16 1043:4b66, IVTV16 1043:462e, IVTV16 1043:4b2e
22AVerMedia PVR-150 Plus / AVerTV M113 Partsnic (Daewoo) TunerIVTV16 1461:c034, IVTV16 1461:c035
23AVerMedia EZMaker PCI DeluxeIVTV16 1461:c03f
24AVerMedia M104IVTV16 1461:c136
25Buffalo PC-MV5L/PCIIVTV16 1154:052b
26AVerMedia UltraTV 1500 MCE / AVerTV M113 Philips TunerIVTV16 1461:c019, IVTV16 1461:c01b
27Sony VAIO Giga Pocket (ENX Kikyou)IVTV16 104d:813d
28Hauppauge WinTV PVR-350 (V1)IVTV16 104d:813d
29Yuan MPG600GR, Kuroutoshikou CX23416GYC-STVLP (no GR)IVTV16 104d:813d
30Yuan 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 / 0x4070HauppaugePVR-250/350/150(见IVTV_PCI_ID_HAUPPAUGE系列)
0x104dSonySony VAIO Giga Pocket、Hauppauge PVR 系列(IVTV_PCI_ID_SONY
0x1461AVerMediaM179、Transgear 5000TV、MCE 116、PVR-150 Plus、M104 等(IVTV_PCI_ID_AVERMEDIA
0x12ab / 0xfbab / 0xffab / 0xff01Yuan(远)MPG600、MPG160、MPG600GR、MPC622、PG600 等(IVTV_PCI_ID_YUAN1/2/3/4
0x10fcI/O DataGV-M2TV、GV-MVP/RX 系列(IVTV_PCI_ID_IODATA
0x1154Melco(Buffalo)PC-MV5L/PCI、CX23416GYC(IVTV_PCI_ID_MELCO
0x9005AdaptecVideOh! AVC-2410 / AVC-2010(IVTV_PCI_ID_ADAPTEC
0x1043ASUSTekASUS Falcon2(IVTV_PCI_ID_ASUSTEK
0xff92Diamond MultimediaDiamond PVR-550(IVTV_PCI_ID_DIAMONDMM
0xffac / 0xffadGotViewPCI 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/2IVTV_CARD_INPUT_COMPOSITE1/2/3枚举(ivtv-cards.h);
  • gpio_*系列:无专用音频芯片的卡通过 GPIO 位操作完成音频输入切换、静音、单声道/立体声/双语模式与采样率选择(见struct ivtv_gpio_audio_modestruct ivtv_gpio_audio_freq等定义,ivtv-cards.h);
  • tuners[]:候选调谐器列表,每个条目绑定适用的电视制式(V4L2_STD_PAL_SECAMV4L2_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 开启,仅在自动探测失败时使用;
  • tunertype0= 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可选BGHDKIMNNc60secam可选BGHDKLLCntsc可选MJ(日本)、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)的卡缺少vbi8vbi16video16video48节点,也没有/dev/fbx帧缓冲;radio0是否出现取决于卡上是否有收音机调谐器。多卡环境下设备号按"基础设备号 + 卡序号"递增;如果系统里还有其他先被探测到的采集卡(如 WinTV PCI),可以用ivtv_first_minor模块参数让 IVTV 从指定序号开始分配,避免设备号错乱(ivtv-driver.c 中校验其取值范围为 0~IVTV_MAX_CARDS-1)。

使用注意事项

  1. 固件要求:IVTV 驱动必须加载最新的编码器固件(版本 2.06.039,大小 376836 字节),否则硬件 MPEG 编码无法工作(见 ivtv.rst 顶部说明);
  2. 应用层限制:普通电视应用无法直接使用 IVTV 设备,需要支持 MPEG 输入流的播放器或 PVR 软件(如 mplayer、xine、MythTV 等)才能读取/dev/video0的 MPEG 节目流;
  3. 匹配失败时的排查路径:先用lspci -nn查看卡的 vendor/device 与 subsystem ID,对照本文清单确认型号;若在清单内但驱动未识别,用cardtype=强制指定;若涉及调谐器异常,再检查tuner=tunertype=pal=/secam=/ntsc=参数;
  4. 变体卡的识别:编号 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 3:45:38

Linux驱动多设备支持:设备树匹配与私有数据隔离实战

在瑞芯微平台做Linux驱动开发,总有那么一个瞬间让你怀疑人生:驱动代码明明写得很顺,一个外设跑得好好的,但只要同类设备接到第二个,系统就开始出幺蛾子。要么第二个设备根本没被probe,要么两个设备的数据互…

作者头像 李华
网站建设 2026/9/10 3:44:39

遥控器APP自动重连实战:UDP场景下的状态博弈与鲁棒设计

1. 项目概述:为什么“遥控器APP端自动重连”不是锦上添花,而是生死线 你有没有遇到过这样的场景:正用手机APP控制家里的智能空调,刚调到26℃准备躺平,屏幕突然弹出“设备已离线”;或者在演示智能家居系统给…

作者头像 李华
网站建设 2026/9/10 3:41:40

OpenHarmony驱动核心:HDF运行时架构与HCS配置契约解析

1. 别再把HDF和HCS当成两个黑盒子了——它们其实是OpenHarmony驱动世界的“施工图”和“验收单”刚接触OpenHarmony驱动开发的朋友,十有八九会在日志里撞见这行报错:missing hcs services: hns, vmcompute, vfpext。你翻遍文档,发现HDF&#…

作者头像 李华
网站建设 2026/9/10 3:39:54

AI一站式漫剧制作:从脚本到成片的全流程工程化实践

1. 什么是“AI一站式做漫剧”?它到底能解决什么实际问题? “AI一站式做漫剧的工具推荐”——这个标题里藏着三个关键动作词:“AI”、“一站式”、“做漫剧”。它不是讲AI生成单张插画,也不是教你怎么用剪映配字幕,而是…

作者头像 李华