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 number | Card name | PCI subsystem IDs |
|---|---|---|
| 0 | DC10(old) | <any> |
| 1 | DC10(new) | <any> |
| 2 | DC10_PLUS | 1031:7efe |
| 3 | DC30 | <any> |
| 4 | DC30_PLUS | 1031:d801 |
| 5 | LML33 | <any> |
| 6 | LML33R10 | 12f8:8a02 |
| 7 | Buz | 13ca:4231 |
| 8 | 6-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_MIRO | Miro 厂商号 | 0x1031 |
PCI_DEVICE_ID_MIRO_DC10PLUS | DC10+ 子系统设备号 | 0x7efe |
PCI_DEVICE_ID_MIRO_DC30PLUS | DC30+ 子系统设备号 | 0xd801 |
PCI_VENDOR_ID_ELECTRONICDESIGNGMBH | Electronic Design GmbH(LML33R10)厂商号 | 0x12f8 |
PCI_DEVICE_ID_LML_33R10 | LML33R10 子系统设备号 | 0x8a02 |
PCI_VENDOR_ID_IOMEGA | Iomega 厂商号 | 0x13ca |
PCI_DEVICE_ID_IOMEGA_BUZ | Buz 子系统设备号 | 0x4231 |
PCI_VENDOR_ID_ZORAN/PCI_DEVICE_ID_ZORAN_36057 | Zoran 主控制器 | 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 =AVS6EYES;NUM_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 编解码器 | 视频解码器 | 视频编码器 |
|---|---|---|---|---|---|
| 0 | DC10(old) | ZR36057 | ZR36050 | Micronas vpx3220a | mse3000 或 adv7176 |
| 1 | DC10(new) | ZR36057 | ZR36060 | Philips saa7110a | Analog Devices adv7176 |
| 2 | DC10+ | ZR36067 | ZR36060 | Philips saa7110a | adv7176 |
| 3 | DC30 | ZR36057 | ZR36050(+ZR36016 VFE) | vpx3220a/vpx3225d | adv7176 |
| 4 | DC30+ | ZR36067 | ZR36050(+ZR36016 VFE) | vpx3220a/vpx3225d | adv7176 |
| 5 | LML33 | ZR36067 | ZR36060 | Brooktree bt819 | bt856 |
| 6 | LML33R10 | ZR36067 | ZR36060 | Philips saa7114 | adv7170 |
| 7 | Buz | ZR36067 | ZR36060 | Philips saa7111 | saa7185 |
| 8 | 6-Eyes | ZR36067 | ZR36060 | Samsung ks0127 | Conexant 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:7efe→DC10_PLUS(卡号 2); - 匹配
1031:d801→DC30_PLUS(卡号 4); - 匹配
12f8:8a02→LML33R10(卡号 6); - 匹配
13ca:4231→BUZ(卡号 7); - 兜底项
PCI_ANY_ID:PCI_ANY_ID→NUM_CARDS(等于 9,超出有效卡号范围),表示“探测到了 ZR36057 但子系统 ID 无法识别”。
在zoran_probe()中(zoran_card.c)的判定逻辑为:
- 若用户未通过
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”。
- 主芯片 revision < 2(即 ZR36057 早期版本)时,直接报错退出,提示“It is not possible to auto-detect ZR36057 based cards”——这正是 DC10(old)、DC30 等
- 若用户指定了
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,56.3 持久化配置
参照 zoran.rst,可写入/etc/modprobe.d/zoran.conf:
options zr36067 card=8 alias char-major-81-0 zr360676.4 相关模块参数
card只是zr36067众多模块参数之一。源码中(zoran_card.c)还定义了以下参数,供实际使用参考:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
card | int 数组 | -1(自动探测) | 每张卡的卡型编号,对应本文卡片列表 0~8 |
default_input | uint | 0 | 默认输入:0=Composite,1=S-Video,2=Internal |
default_mux | int | 1 | 6-Eyes 输入选择(1=Bt866,7=VID1) |
default_norm | int | 0 | 默认制式:0=PAL,1=NTSC,2=SECAM |
video_nr | int 数组 | -1(自动分配) | /dev/videoN 设备号,-1 表示自动 |
pass_through | int | 0 | 空闲时是否将 TV 信号直通到 TV-out |
这些参数的边界校验同样在驱动中完成:例如default_norm超出 0~2 会被强制归 0(PAL),default_input超出该卡输入数时回退到 0,参见 zoran_card.c。若某卡不支持所选制式,驱动会回退到 PAL 并打印警告。
6.5 内核配置选项
编译内核时,VIDEO_ZORAN及各卡型的支持选项与本文卡片列表的对应关系(Kconfig):
| Kconfig 选项 | 对应卡型 |
|---|---|
VIDEO_ZORAN_DC30 | DC30(+),以及基于 zr36050+zr36016 的老 DC10 |
VIDEO_ZORAN_ZR36060 | 基于 ZR36060 的所有卡(Buz、DC10、LML33、LML33R10、6-Eyes) |
VIDEO_ZORAN_BUZ | Buz |
VIDEO_ZORAN_DC10 | DC10(+) |
VIDEO_ZORAN_LML33 | LML33 |
VIDEO_ZORAN_LML33R10 | LML33R10 |
VIDEO_ZORAN_AVS6EYES | 6-Eyes |
同时Kconfig通过select自动为各卡型拉起对应的解码器/编码器子驱动(如VIDEO_SAA711X、VIDEO_BT819、VIDEO_KS0127、VIDEO_ADV7175、VIDEO_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),仅供参考