Linux 内核 dvb-usb-ce6230 驱动设备卡列表详解:CE6230 参考设计与 AVerMedia A310 的 USB ID 识别
【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux
导读
dvb-usb-ce6230是 Linux 内核媒体子系统(Media Subsystem)中基于dvb-usb-v2框架的 DVB-T USB 接收驱动,用于支持基于 Intel CE6230 单芯片方案的 USB 2.0 地面数字电视棒。本文以 dvb-usb-ce6230-cardlist.rst 为骨架,完整解读该驱动支持的设备清单、USB ID(VID:PID)对照关系,并深入到 drivers/media/usb/dvb-usb-v2/ce6230.c 等源码验证其硬件组成、I2C 桥接与调谐流程。读完本文,你将能够通过lsusb识别此类设备、正确配置内核编译选项、并理解设备与驱动绑定背后的代码逻辑。
卡片列表(Card List)文档在做什么
在内核媒体子系统文档体系中,Documentation/admin-guide/media/下存在一批以*-cardlist.rst命名的文件,例如 em28xx-cardlist.rst 的同级文档、以及 usb-cardlist.rst。它们的功能统一且明确:为某一具体驱动的产品型号(Card Name)与 USB ID 之间建立权威对照表。
dvb-usb-ce6230-cardlist.rst 全文即为两张表格构成的「驱动支持设备名录」:左侧为产品名称,右侧为设备在 USB 总线上被枚举出来的 16 进制 ID(通常写作厂商ID(Vendor ID):产品ID(Product ID))。这张表是所有用户查询"我的 USB 电视棒能否被此驱动识别"的第一手依据,也是驱动源码中usb_device_id表的文档化镜像。
受支持设备的完整名单
依据 dvb-usb-ce6230-cardlist.rst 的flat-table,该驱动共登记两款设备:
| Card name(产品名) | USB IDs(VID:PID) |
|---|---|
| AVerMedia A310 USB 2.0 DVB-T tuner | 07ca:a310 |
| Intel CE9500 reference design | 8086:9500 |
两点值得特别注意:
- AVerMedia A310 的厂商 ID
07ca:0x07ca 是 AVerMedia(圆刚)在 USB 标准组织注册的厂商代号,产品 IDa310与其型号名 A310 直接对应; - Intel CE9500 参考设计使用
8086:9500:0x8086 是 Intel 的厂商 ID,而 0x9500 表明这是一块用于方案验证的参考设计板(reference design),厂商可以基于该方案定制贴牌产品,实际零售设备常以其他品牌出现。
事实对照:上述两行内容在驱动源码 ce6230.c 的
ce6230_id_table[]中被逐一复现(详见下文"源码印证"一节),文档与代码完全一致。
如何在真实系统上识别这两款设备
USB ID 的获取方式由 usb-cardlist.rst 给出,它同样适用于本文的设备:
$ lsusb Bus 001 Device 015: ID 046d:082d Logitech, Inc. HD Pro Webcam C920 ...当你的设备插入 USB 口后,只要lsusb输出中出现07ca:a310(AVerMedia A310)或8086:9500(Intel CE9500 参考板),即可断定该设备属于dvb-usb-ce6230驱动的管辖范围。此外还可以通过lsusb -v查看接口描述,以便在硬件制造商不确定时辅助判断。
驱动在内核中的注册与构建
内核配置项与模块名
dvb-usb-ce6230的编译入口位于 drivers/media/usb/dvb-usb-v2/Kconfig:
config DVB_USB_CE6230 tristate "Intel CE6230 DVB-T USB2.0 support" depends on DVB_USB_V2 select DVB_ZL10353 select MEDIA_TUNER_MXL5005S if MEDIA_SUBDRV_AUTOSELECTtristate说明它可以编译为内核内建(y)或可加载模块(m);当以模块方式构建时,生成的模块名为dvb-usb-ce6230.ko(由 drivers/media/usb/dvb-usb-v2/Makefile 的dvb-usb-ce6230-objs := ce6230.o规则决定);depends on DVB_USB_V2表明它运行在第二代的 USB DVB 框架之上;- 通过
select自动拉取两种核心芯片驱动:解调器 Zarlink/Intelzl10353(DVB_ZL10353)与 Maximmxl5005s硅调谐器(MEDIA_TUNER_MXL5005S)。
启用方式(任选其一):
# 方式一:menuconfig 交互式配置(Device Drivers → Multimedia support → Media USB Adapters) make menuconfig # 方式二:直接写入 .config echo 'CONFIG_DVB_USB_CE6230=m' >> .config make olddefconfig make modules驱动在 usb-cardlist.rst 主表与 toctree 中的登记
在 USB 媒体驱动总目录表中,dvb-usb-ce6230被登记为 "Intel CE6230 DVB-T USB2.0";该文档的 toctree 里同样通过dvb-usb-ce6230-cardlist条目将本文对应的 cardlist 纳入文档导航树,构成了"总表 → 分驱动 cardlist"的完整查询路径。
设备 ID 表(源码中的 Card List)
设备与驱动的绑定由内核 USB 核心的 probe 流程完成。在 ce6230.c 中:
static const struct usb_device_id ce6230_id_table[] = { { DVB_USB_DEVICE(USB_VID_INTEL, USB_PID_INTEL_CE9500, &ce6230_props, "Intel CE9500 reference design", NULL) }, { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A310, &ce6230_props, "AVerMedia A310 USB 2.0 DVB-T tuner", NULL) }, { } }; MODULE_DEVICE_TABLE(usb, ce6230_id_table);可以看到:
- 两条记录与 RST 卡片列表一一对应,连字符串名称("Intel CE9500 reference design"、"AVerMedia A310 USB 2.0 DVB-T tuner")都保持完全一致——cardlist 文档正是这张表的可读投影;
MODULE_DEVICE_TABLE(usb, ...)会将该表导出到模块的.modinfo与modalias中,因此当设备插入后,即便模块未加载,udev/modprobe也能依据usb:v8086p9500、usb:v07capA310这样的 modalias 自动装载dvb-usb-ce6230模块;- 随后 usb_driver 通过
dvb_usbv2_probe进入dvb-usb-v2框架做后续初始化。
从源码看驱动背后的硬件组成
cardlist 文档虽只给出产品清单,但要真正理解"为什么这张表里只有两款设备",需要回到芯片方案层面。从 ce6230.c 的 attach 回调可以确认其完整射频链路:
- 前端 attach(解调):
ce6230_zl10353_frontend_attach()调用zl10353_attach挂载解调器,对应配置ce6230_zl10353_config(源码行 163-171):解调器 I2C 地址0x1e、ADC 时钟450000Hz、第二中频if2 = 45700kHz、no_tuner = 1(解调器不管理 tuner)、TS 并行输出parallel_ts = 1; - tuner attach(调谐):
ce6230_mxl5003s_tuner_attach()调用mxl5005s_attach,配置ce6230_mxl5003s_config(源码行 187-202):I2C 地址0xc6、中频IF_FREQ_4570000HZ、晶振16 MHz、单 AGC、数字模式、零中频输出等。
这套 "zl10353 解调器 + mxl5005s 调谐器" 的组合,正是 Intel CE6230 单芯片参考方案的标准外围搭配;这也解释了 Kconfig 中select DVB_ZL10353与select MEDIA_TUNER_MXL5005S两个强制依赖的由来。凡采用 CE6230 方案(无论贴牌为 AVerMedia 还是 Intel 参考板)的产品,I2C 拓扑与寄存器访问方式一致,故可共用同一个ce6230_props。
USB 控制传输与 I2C 桥的底层实现
CE6230 方案本身并不直接暴露解调/调谐器的 I2C 总线,而是通过 USB Vendor Class 控制端点做 I2C 桥接。这一点在驱动头文件 ce6230.h 中体现为一张命令编码表:
| 命令宏 | 值 | 含义 |
|---|---|---|
CONFIG_READ | 0xd0 | 读配置(rd 0) |
UNKNOWN_WRITE | 0xc7 | 写配置(wr 7) |
I2C_READ | 0xd9 | I2C 读(rd 9) |
I2C_WRITE | 0xca | I2C 写(wr a) |
DEMOD_READ | 0xdb | 解调器寄存器读(rd b) |
DEMOD_WRITE | 0xcc | 解调器寄存器写(wr c) |
REG_READ | 0xde | 通用寄存器读(rd e) |
REG_WRITE | 0xcf | 通用寄存器写(wr f) |
其中usb_req结构体(ce6230.h)用cmd/value/index/data_len/data五元组描述一次控制传输。其执行逻辑在ce6230_ctrl_msg()(ce6230.c):
- 根据命令是读(
I2C_READ/DEMOD_READ/REG_READ)还是写,构造USB_TYPE_VENDOR | USB_DIR_IN/OUT的requesttype; - 调用
usb_control_msg()走 endpoint 0 完成传输,超时上限为 ce6230.h 中定义的CE6230_USB_TIMEOUT(1000 ms); - 传输前强制
msleep(1),源码注释明确写道 "avoid I2C errors",即避免连续 USB 控制传输过快导致片内 I2C 出错; - 读方向传输完成后,将返回数据拷贝回请求缓冲区。
上层 I2C 子系统通过ce6230_i2c_master_xfer()(ce6230.c)进入此桥:当访问地址等于解调器地址0x1e时使用DEMOD_READ/DEMOD_WRITE命令(index 为寄存器号),其他地址(如 tuner0xc6)则使用通用I2C_WRITE命令(value 带0x2000偏移标记)。换言之,Linux I2C 核心对 zl10353、mxl5005s 的每次读写,最终都会被翻译为若干条 vendor 类型 USB 控制请求发往 CE6230 芯片。
电源控制与 TS 流传输路径
- 电源/流控:
ce6230_power_ctrl()(ce6230.c)通过切换 USB 接口 1 的备用设置(AlternateSetting 0 为空闲、1 为 streaming)实现收发状态切换; - TS 流端点:
ce6230_props(ce6230.c)声明单适配器(num_adapters = 1)、BULK 传输、端点0x82、6 个并发 URB、每个缓冲区 16×512 字节,承载来自 zl10353 并行 TS 输出的 MPEG-TS 数据。
小结:如何对照使用这份 Card List
当手中有一台基于 Intel CE6230 方案的 DVB-T 电视棒时,可按下述三步完成驱动适配:
- 识别:插入设备执行
lsusb,若 ID 为07ca:a310或8086:9500,即命中 dvb-usb-ce6230-cardlist.rst 登记范围; - 加载:确认内核已使能
CONFIG_DVB_USB_CE6230(模块名dvb-usb-ce6230),或直接modprobe dvb-usb-ce6230(modalias 会在插入时自动匹配); - 使用:驱动成功 probe 后会在 DVB 框架下注册前端的
/dev/dvb/adapterN节点,配合dvbv5-zap、tvheadend、VLC等用户态工具即可调谐收看地面数字电视。
在此基础上,若需开发或调试基于 CE6230 方案的新型号设备,只需在 ce6230.c 的ce6230_id_table[]中新增 VID:PID 条目并同步更新本文对应的 cardlist 文档,即可复用既有的 I2C 桥、zl10353/mxl5005s attach 与 TS 传输通道,这也是"Card Name + USB ID"表驱动整个媒体子系统设备适配的典型开发模式。
【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考