news 2026/9/10 21:34:30

Zoran MJPEG 采集卡全表:DC10、DC30、LML33、Buz 与 6-Eyes 的驱动卡号与 PCI 子系统 ID 对照指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Zoran MJPEG 采集卡全表:DC10、DC30、LML33、Buz 与 6-Eyes 的驱动卡号与 PCI 子系统 ID 对照指南

Zoran MJPEG 采集卡全表:DC10、DC30、LML33、Buz 与 6-Eyes 的驱动卡号与 PCI 子系统 ID 对照指南

【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux

本文以 Linux 内核文档 Documentation/admin-guide/media/zoran-cardlist.rst 为核心,结合 drivers/media/pci/zoran/ 驱动源码,完整解读 Zoran ZR36057/36067 MJPEG 采集卡的 9 种卡型编号、PCI 子系统 ID 与驱动加载方式。读完本文,你将能根据手上的板卡型号确定正确的card=X模块参数,并理解驱动自动探测板卡背后的源码机制。

一、文档定位:一张表管住所有 Zoran 板卡

zoran-cardlist.rst是 Linux 内核 media 子系统 admin-guide 中的一份精简卡片列表,它以一张三列表格(Card number / Card name / PCI subsystem IDs)定义了zr36067驱动(Zoran MJPEG board driver)支持的全部板卡类型。这张表是整个 Zoran 驱动体系(涵盖 Pinnacle/Miro DC10、DC10+、DC30、DC30+,Iomega Buz,Linux Media Labs LML33/LML33R10,以及 AverMedia 6-Eyes)的“板卡身份对照表”,驱动加载、板卡探测、card=X参数校验都以它为基准。

该文档对应的驱动模块在 Kconfig 中登记为VIDEO_ZORAN(tristate,模块名zr36067),依赖PCI && I2C_ALGOBIT && VIDEO_DEV,并需要DEBUG_FS。更详细的板卡硬件构成与 FAQ 参见配套文档 Documentation/driver-api/media/drivers/zoran.rst。

二、Zoran 卡片全表(原文档完整内容)

原文档给出的 9 张卡型如下,编号即card=X模块参数可用的取值:

Card numberCard namePCI subsystem IDs
0DC10(old)<any>
1DC10(new)<any>
2DC10_PLUS1031:7efe
3DC30<any>
4DC30_PLUS1031:d801
5LML33<any>
6LML33R1012f8:8a02
7Buz13ca:4231
86-Eyes<any>

几点重要观察:

  • PCI subsystem IDs 为<any>的卡型无法通过 PCI 子系统号自动识别,必须依赖card=X模块参数手动指定;
  • DC10_PLUS、DC30_PLUS、LML33R10、Buz 四种卡具备明确的子系统厂商号(subvendor)与子系统设备号(subdevice),驱动可以据此自动探测;
  • 6-Eyes(编号 8)在源码注释中被明确标注为“AverMedia 选择不贴牌(unbranded),因此无法自动探测,必须使用 card=8”,这一点在 zoran_card.c 的AVS6EYES条目注释与 zoran.rst 的 note 中均有说明。

PCI 子系统 ID 的源码定义

表格中出现的厂商号与设备号均可在 include/linux/pci_ids.h 中找到权威定义:

ID定义
PCI_VENDOR_ID_MIROMiro 厂商号0x1031
PCI_DEVICE_ID_MIRO_DC10PLUSDC10+ 子系统设备号0x7efe
PCI_DEVICE_ID_MIRO_DC30PLUSDC30+ 子系统设备号0xd801
PCI_VENDOR_ID_ELECTRONICDESIGNGMBHElectronic Design GmbH(LML33R10)厂商号0x12f8
PCI_DEVICE_ID_LML_33R10LML33R10 子系统设备号0x8a02
PCI_VENDOR_ID_IOMEGAIomega 厂商号0x13ca
PCI_DEVICE_ID_IOMEGA_BUZBuz 子系统设备号0x4231
PCI_VENDOR_ID_ZORAN/PCI_DEVICE_ID_ZORAN_36057Zoran 主控制器0x11de:0x6057

注意:表格中的1031:7efe等写法为“子系统厂商号:子系统设备号”,与主设备号(ZR36057,0x11de:0x6057)相区分——驱动匹配的是**子系统(subsystem)**层面的 ID。

三、编号与源码enum card_type的严格对应

zoran-cardlist.rst的卡号顺序并非随意编排,它与驱动源码中的枚举类型card_type完全一一对应。见 zoran.h:

enum card_type { UNKNOWN = -1, /* Pinnacle/Miro */ DC10_OLD, /* DC30 like */ DC10_NEW, /* DC10_PLUS like */ DC10_PLUS, DC30, DC30_PLUS, /* Linux Media Labs */ LML33, LML33R10, /* Iomega */ BUZ, /* AverMedia */ AVS6EYES, /* total number of cards */ NUM_CARDS };

枚举从 0 开始递增,因此:

  • 0 =DC10_OLD(DC10 旧版,DC30 风格);
  • 1 =DC10_NEW(DC10 新版,DC10_PLUS 风格,采用 ZR36060 编解码器);
  • 2 =DC10_PLUS;3 =DC30;4 =DC30_PLUS
  • 5 =LML33;6 =LML33R10
  • 7 =BUZ;8 =AVS6EYESNUM_CARDS为卡型总数(9)。

驱动在 zoran_card.c 中定义了一个与枚举同序的静态数组zoran_cards[NUM_CARDS],每个struct card_info条目记录了该卡型的完整硬件配置:I2C 视频解码器/编码器型号及其 I2C 地址、JPEG 编解码器类型(ZR36050/ZR36060)、ZR36016 VFE(Video Front End)、输入通道数、支持的视频制式(V4L2_STD_*)、时序(tvnorm)以及板卡初始化函数指针等。表格中每个卡名都可以在数组里找到同名条目。

四、每种卡的硬件构成(源码与配套文档交叉印证)

结合 zoran.rst 与zoran_cards[]数组,各卡型的核心硬件构成如下:

卡号卡型PCI 控制器MJPEG 编解码器视频解码器视频编码器
0DC10(old)ZR36057ZR36050Micronas vpx3220amse3000 或 adv7176
1DC10(new)ZR36057ZR36060Philips saa7110aAnalog Devices adv7176
2DC10+ZR36067ZR36060Philips saa7110aadv7176
3DC30ZR36057ZR36050(+ZR36016 VFE)vpx3220a/vpx3225dadv7176
4DC30+ZR36067ZR36050(+ZR36016 VFE)vpx3220a/vpx3225dadv7176
5LML33ZR36067ZR36060Brooktree bt819bt856
6LML33R10ZR36067ZR36060Philips saa7114adv7170
7BuzZR36067ZR36060Philips saa7111saa7185
86-EyesZR36067ZR36060Samsung ks0127Conexant bt866

在源码中,解码器/编码器通过 I2C 总线挂载,对应关系记录在zoran_cards[]条目的i2c_decoder/i2c_encoder字段,以及 I2C 探测地址数组(如saa7110_addrs = { 0x4e, 0x4f, I2C_CLIENT_END }bt819_addrs = { 0x45, I2C_CLIENT_END }等,见 zoran_card.c)。驱动初始化时由zoran_i2c_init()通过软件 I2C 位操作(i2c-algo-bit)逐个探测这些地址并注册子设备。

各卡型的输入通道与制式差异也值得注意:

  • DC10 系列(0/1/2)与 DC30 系列(3/4):3 路输入(Composite、S-Video、Internal/comp),支持 NTSC/PAL/SECAM;
  • LML33 / LML33R10(5/6):2 路输入(Composite、S-Video),仅支持 NTSC/PAL;
  • Buz(7):2 路输入(Composite、S-Video),支持 NTSC/PAL/SECAM;
  • 6-Eyes(8):多达 10 路输入(6 路 Composite、3 路 S-Video、1 路 YCbCr),仅支持 NTSC/PAL,且默认输入选择通过default_mux模块参数控制(avs6eyes_init()mux = default_mux,1=Bt866,7=VID1,见 zoran_card.c)。

此外,每张卡的 JPEG 中断与 VSYNC 中断在card_info中以jpeg_int/vsync_int区分(使用ZR36057_ISR_GIRQ0/GIRQ1),体现了不同板卡在中断路由上的差异。

五、驱动如何利用这些 ID 自动探测板卡

驱动通过zr36067_pci_tblPCI 设备表匹配 ZR36057/36067 主控制器及其子系统 ID,见 zoran_card.c:

#define ZR_DEVICE(subven, subdev, data) { \ PCI_DEVICE_SUB(PCI_VENDOR_ID_ZORAN, PCI_DEVICE_ID_ZORAN_36057, \ (subven), (subdev)), \ .driver_data = (data) } static const struct pci_device_id zr36067_pci_tbl[] = { ZR_DEVICE(PCI_VENDOR_ID_MIRO, PCI_DEVICE_ID_MIRO_DC10PLUS, DC10_PLUS), ZR_DEVICE(PCI_VENDOR_ID_MIRO, PCI_DEVICE_ID_MIRO_DC30PLUS, DC30_PLUS), ZR_DEVICE(PCI_VENDOR_ID_ELECTRONICDESIGNGMBH, PCI_DEVICE_ID_LML_33R10, LML33R10), ZR_DEVICE(PCI_VENDOR_ID_IOMEGA, PCI_DEVICE_ID_IOMEGA_BUZ, BUZ), ZR_DEVICE(PCI_ANY_ID, PCI_ANY_ID, NUM_CARDS), { } };

该表与卡片列表的对应关系一目了然:

  • 匹配1031:7efeDC10_PLUS(卡号 2);
  • 匹配1031:d801DC30_PLUS(卡号 4);
  • 匹配12f8:8a02LML33R10(卡号 6);
  • 匹配13ca:4231BUZ(卡号 7);
  • 兜底项PCI_ANY_ID:PCI_ANY_IDNUM_CARDS(等于 9,超出有效卡号范围),表示“探测到了 ZR36057 但子系统 ID 无法识别”。

zoran_probe()中(zoran_card.c)的判定逻辑为:

  1. 若用户未通过card=X指定卡型(card[nr] == -1):
    • 主芯片 revision < 2(即 ZR36057 早期版本)时,直接报错退出,提示“It is not possible to auto-detect ZR36057 based cards”——这正是 DC10(old)、DC30 等<any>卡无法自动探测的原因;
    • revision >= 2(ZR36067)时,取ent->driver_data(即上表的DC10_PLUS等枚举值)作为卡型;若等于NUM_CARDS则提示“Unknown card, try specifying card=X module parameter”。
  2. 若用户指定了card=X:校验0 <= X < NUM_CARDS,越界则报错并拒绝加载。

可见,卡片列表中的<any>条目与 PCI 设备表的兜底条目是配套设计的:能自动探测的卡(DC10+、DC30+、LML33R10、Buz)写入明确的子系统 ID,其余卡型必须手动指定。

六、实战:用card=X模块参数加载驱动

6.1 单卡加载

modprobe zr36067 card=5 # Linux Media Labs LML33 modprobe zr36067 card=8 # AverMedia 6-Eyes(必须手动指定)

不指定card=X时,ZR36067(rev>=2)会尝试自动探测,DC10+、DC30+、LML33R10、Buz 之外的卡会因无法识别而拒绝加载;而早期 ZR36057 主控的卡(如 DC10 old/DC30)则必须在加载时带上card=X

6.2 多卡加载

驱动最多支持 4 张卡(BUZ_MAX 4,见 zoran_card.h),多卡时用逗号分隔:

modprobe zr36067 card=7,5

6.3 持久化配置

参照 zoran.rst,可写入/etc/modprobe.d/zoran.conf

options zr36067 card=8 alias char-major-81-0 zr36067

6.4 相关模块参数

card只是zr36067众多模块参数之一。源码中(zoran_card.c)还定义了以下参数,供实际使用参考:

参数类型默认值说明
cardint 数组-1(自动探测)每张卡的卡型编号,对应本文卡片列表 0~8
default_inputuint0默认输入:0=Composite,1=S-Video,2=Internal
default_muxint16-Eyes 输入选择(1=Bt866,7=VID1)
default_normint0默认制式:0=PAL,1=NTSC,2=SECAM
video_nrint 数组-1(自动分配)/dev/videoN 设备号,-1 表示自动
pass_throughint0空闲时是否将 TV 信号直通到 TV-out

这些参数的边界校验同样在驱动中完成:例如default_norm超出 0~2 会被强制归 0(PAL),default_input超出该卡输入数时回退到 0,参见 zoran_card.c。若某卡不支持所选制式,驱动会回退到 PAL 并打印警告。

6.5 内核配置选项

编译内核时,VIDEO_ZORAN及各卡型的支持选项与本文卡片列表的对应关系(Kconfig):

Kconfig 选项对应卡型
VIDEO_ZORAN_DC30DC30(+),以及基于 zr36050+zr36016 的老 DC10
VIDEO_ZORAN_ZR36060基于 ZR36060 的所有卡(Buz、DC10、LML33、LML33R10、6-Eyes)
VIDEO_ZORAN_BUZBuz
VIDEO_ZORAN_DC10DC10(+)
VIDEO_ZORAN_LML33LML33
VIDEO_ZORAN_LML33R10LML33R10
VIDEO_ZORAN_AVS6EYES6-Eyes

同时Kconfig通过select自动为各卡型拉起对应的解码器/编码器子驱动(如VIDEO_SAA711XVIDEO_BT819VIDEO_KS0127VIDEO_ADV7175VIDEO_VPX3220等),与上表“硬件构成”一一吻合。若未开启相应子驱动,codec_init()(zoran_card.c)会打印 “support is not enabled” 并返回-EINVAL

七、使用限制与注意事项

  • 6-Eyes 无法自动探测:AverMedia 未给该卡贴子系统 ID,必须card=8,这是源码注释与配套文档双重确认的硬性约束;
  • ZR36057(早期)无法自动探测:revision < 2 的主控芯片完全不支持自动识别,任何该主控的卡(如 DC10 old、DC30)都必须card=X
  • 主板兼容性:zoran.rst 中记录了老主板芯片组对 DMA 传输稳定性的影响,驱动在zoran_probe()中也会检测PCIPCI_FAIL | PCIAGP_FAIL | PCIPCI_ALIMAGIK并给出警告(zoran_card.c);
  • Natoma 芯片组限制:ZR36057 revision 1 配 Natoma 芯片组时,最大缓冲区被限制为 128K(zoran_card.c);
  • 驱动状态:该驱动在 Kconfig 中被标记为 “Deprecated”,编译为模块时名称为zr36067

八、小结

zoran-cardlist.rst虽只是一张三列表格,却是理解 Zoran MJPEG 驱动板卡体系的总索引:卡号顺序直接对应 zoran.h 的card_type枚举;<any>与具体子系统 ID 的分布决定了哪些卡可以自动探测、哪些必须手动card=X;每张卡的硬件构成(控制器、JPEG 编解码器、I2C 解码器/编码器)都能在 zoran_card.c 的zoran_cards[]数组中逐条找到依据。当你在实际硬件上遇到 “Unknown card, try specifying card=X” 的报错时,回到这张表,即可快速定位正确的卡号。

【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

Python游戏开发中的碰撞检测原理与优化实践

1. Python游戏开发中的碰撞检测核心原理 碰撞检测是游戏开发中最基础也最关键的物理交互系统。在Python游戏开发中&#xff0c;我们通常使用两种主流实现方式&#xff1a;基于矩形区域的边界检测和基于像素级的精确检测。 1.1 矩形碰撞检测&#xff08;AABB算法&#xff09; …

作者头像 李华