ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux 内核 dvb-usb-pctv452e 驱动设备卡列表:PCTV HDTV USB 与 TT Connect S2-3600/S2-3650-CI 支持指南

Linux 内核 dvb-usb-pctv452e 驱动设备卡列表:PCTV HDTV USB 与 TT Connect S2-3600/S2-3650-CI 支持指南 Linux 内核 dvb-usb-pctv452e 驱动设备卡列表PCTV HDTV USB 与 TT Connect S2-3600/S2-3650-CI 支持指南【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux本篇技术指南聚焦 Linux 内核 DVB 子系统中的dvb-usb-pctv452e驱动完整呈现 Documentation/admin-guide/media/dvb-usb-pctv452e-cardlist.rst 所登记的三款 USB 卫星接收设备PCTV HDTV USB、Technotrend TT Connect S2-3600、S2-3650-CI及其 USB ID并结合 pctv452e.c 驱动源码深入讲解设备识别原理、内核配置方式、驱动内部硬件组成STB0899 解调器 STB6100 调谐器、USB 命令协议、I2C 桥接以及 S2-3650-CI 的 Common InterfaceCI条件接收支持。读完本文你将能够在内核配置中定位该驱动、用lsusb正确识别这些设备并理解该驱动在源码层面的工作机理。一、设备卡列表总览dvb-usb-pctv452e是 Linux 内核媒体子系统Media subsystem中负责 Pinnacle PCTV 系列与 Technotrend TT Connect 系列 USB DVB-S/S2 接收棒的内核驱动代码位于drivers/media/usb/dvb-usb/目录。内核官方文档以设备卡列表card list的形式登记了该驱动支持的所有硬件及其 USB Vendor ID/Product ID。依据 dvb-usb-pctv452e-cardlist.rst该驱动当前登记的卡片如下Card name设备名称USB IDsPCTV HDTV USB2304:021fTechnotrend TT Connect S2-36000b48:3007Technotrend TT Connect S2-3650-CI0b48:300a其中PCTV HDTV USB2304:021f由 Pinnacle 设计制造市场上以 PCTV HDTV Pro USB 品牌销售是第一款受支持的设备Technotrend TT Connect S2-36000b48:3007Technotrend 出品的 DVB-S2 USB 接收器Technotrend TT Connect S2-3650-CI0b48:300a在 S2-3600 基础上增加了 Common Interface 卡槽用于条件接收 CAM 模块的型号同时还支持 MAC 地址读取。驱动源码 pctv452e.c 中的设备枚举与 USB ID 表与之逐一对应enum { PINNACLE_PCTV_452E, TECHNOTREND_CONNECT_S2_3600, TECHNOTREND_CONNECT_S2_3650_CI, }; static const struct usb_device_id pctv452e_usb_table[] { DVB_USB_DEV(PINNACLE, PINNACLE_PCTV_452E), DVB_USB_DEV(TECHNOTREND, TECHNOTREND_CONNECT_S2_3600), DVB_USB_DEV(TECHNOTREND, TECHNOTREND_CONNECT_S2_3650_CI), { } };模块描述也印证了这一点pctv452e.c#L1112MODULE_DESCRIPTION(Pinnacle PCTV HDTV USB DVB / TT connect S2-3600 Driver);二、USB ID 的定义与设备识别原理2.1 内核中的 USB ID 常量三款设备的 VID/PID 并非散落在驱动代码中而是统一定义在 include/media/dvb-usb-ids.h供整个 DVB USB 子系统共享#define USB_VID_PINNACLE 0x2304 #define USB_VID_TECHNOTREND 0x0b48 #define USB_PID_PINNACLE_PCTV_452E 0x021f #define USB_PID_TECHNOTREND_CONNECT_S2_3600 0x3007 #define USB_PID_TECHNOTREND_CONNECT_S2_3650_CI 0x300a对照卡列表文档可见文档中2304:021f即USB_VID_PINNACLE : USB_PID_PINNACLE_PCTV_452E0x2304 2304、0x021f 021f文档中0b48:3007、0b48:300a即USB_VID_TECHNOTREND : USB_PID_TECHNOTREND_CONNECT_S2_3600与USB_PID_TECHNOTREND_CONNECT_S2_3650_CI。也就是说卡列表文档中的三行记录就是上面三组内核常量的可读呈现两者必须保持一致否则驱动将无法匹配设备。2.2 用 lsusb 识别设备USB 设备通过 USB ID 被内核识别。Linux 下可使用lsusb命令查看当前总线上的 USB 设备及其 VID:PID$ lsusb ... Bus 001 Device 074: ID 2040:b131 Hauppauge Bus 001 Device 075: ID 2013:024f PCTV Systems nanoStick T2 290e ...需要说明的是lsusb输出中的 ID 一律为小写十六进制且不带 0x 前缀。因此上述三款设备的实际lsusb显示形态为2304:021f PCTV HDTV USB 0b48:3007 Technotrend TT Connect S2-3600 0b48:300a Technotrend TT Connect S2-3650-CI文档中 PCTV HDTV USB 一行写作2304:021f正是这一形态而另两行带0x前缀的写法属于文档的十六进制记法差异与lsusb输出对照时应统一理解为十六进制数值。2.3 warm-only 设备与匹配流程从源码看三款设备都是仅热态warm-only设备即设备上电后不需要先经过固件下载cold/warm 切换流程插上即可被驱动接管。pctv452e.c#L1014-L1019 中cold_ids均为NULL.devices { { .name PCTV HDTV USB, .cold_ids { NULL, NULL }, /* this is a warm only device */ .warm_ids { pctv452e_usb_table[PINNACLE_PCTV_452E], NULL } },而tt_connect_s2_3600_properties则登记了两个 device desc分别对应 S2-3600 与 S2-3650-CIpctv452e.c#L1066-L1077.num_device_descs 2, .devices { { .name Technotrend TT Connect S2-3600, .cold_ids { NULL, NULL }, /* this is a warm only device */ .warm_ids { pctv452e_usb_table[TECHNOTREND_CONNECT_S2_3600], NULL } }, { .name Technotrend TT Connect S2-3650-CI, .cold_ids { NULL, NULL }, .warm_ids { pctv452e_usb_table[TECHNOTREND_CONNECT_S2_3650_CI], NULL } }, { NULL }, }probe回调依次尝试用两套dvb_usb_device_properties初始化设备pctv452e.c#L1088-L1098USB 核心依据pctv452e_usb_table完成 VID/PID 匹配后进入该回调。三、驱动在内核配置中的位置与编译该驱动在内核 Kconfig 中的配置项为DVB_USB_PCTV452E位于 drivers/media/usb/dvb-usb/Kconfigconfig DVB_USB_PCTV452E tristate Pinnacle PCTV HDTV Pro USB device/TT Connect S2-3600 depends on DVB_USB select TTPCI_EEPROM select DVB_ISL6423 if MEDIA_SUBDRV_AUTOSELECT select DVB_LNBP22 if MEDIA_SUBDRV_AUTOSELECT select DVB_STB0899 if MEDIA_SUBDRV_AUTOSELECT select DVB_STB6100 if MEDIA_SUBDRV_AUTOSELECT help Support for external USB adapter designed by Pinnacle, shipped under the brand name PCTV HDTV Pro USB. Also supports TT Connect S2-3600/3650 cards. Say Y if you own such a device and want to use it.解读depends on DVB_USB依赖 DVB USB 通用框架必须先启用CONFIG_DVB_USBselect TTPCI_EEPROM无条件选中 EEPROM 解码模块用于从板上 EEPROM 读取/解码 MAC 地址在开启MEDIA_SUBDRV_AUTOSELECT媒体子驱动自动选择的前提下自动选中DVB_ISL6423PCTV 型号的 LNB 供电/DiSEqC 芯片、DVB_LNBP22S2-3650-CI 的 LNB 供电芯片、DVB_STB0899解调器与DVB_STB6100调谐器编译产物为dvb-usb-pctv452e.ko对应构建规则见 drivers/media/usb/dvb-usb/Makefileobj-$(CONFIG_DVB_USB_PCTV452E) dvb-usb-pctv452e.o在内核配置界面中该选项位于 Device Drivers → Multimedia support → Media USB Adapters → Pinnacle PCTV HDTV Pro USB device/TT Connect S2-3600可配置为y内建、m模块或n禁用。也可通过内核配置工具make menuconfig/make xconfig等或直接编辑.config来启用。此外Documentation/admin-guide/media/usb-cardlist.rst 的驱动总表中将该驱动登记为dvb-usb-pctv452e描述为 Pinnacle PCTV HDTV Pro USB device/TT Connect S2-3600与 Kconfig 的提示文本一致。四、驱动的硬件组成与前端结构pctv452e驱动并非简单的 USB 搬运工它内部串起了完整的 DVB-S/S2 接收链路。从 pctv452e.c 的包含关系与配置结构可以还原出板载硬件组件芯片I2C 地址作用解调器DemodulatorSTB08990x680xd01DVB-S/DVB-S2 信道解调调谐器TunerSTB61000x600xc01射频调谐参考时钟 27 MHzLNB 供电PCTV 型号ISL64230x08LNB 电压/电流控制与 DiSEqCLNB 供电S2-3650-CILNBP220x080x101LNB 供电EEPROM24C16 / 24C640x50 / 0x51存储 MAC 地址等出厂信息I2C 地址宏见 pctv452e.c#L49-L53。4.1 前端挂载frontend_attach 与 tuner_attach在pctv452e_frontend_attachpctv452e.c#L913-L940中驱动先挂载 STB0899 解调器再按设备型号差异化初始化a-fe_adap[0].fe dvb_attach(stb0899_attach, stb0899_config, a-dev-i2c_adap); if (!a-fe_adap[0].fe) return -ENODEV; id a-dev-desc-warm_ids[0]; if (id-idVendor USB_VID_TECHNOTREND id-idProduct USB_PID_TECHNOTREND_CONNECT_S2_3650_CI) { if (dvb_attach(lnbp22_attach, ...) NULL) { err(Cannot attach lnbp22\n); } /* Error ignored. */ tt3650_ci_init(a); } else if (dvb_attach(isl6423_attach, ...) NULL) { err(Cannot attach isl6423\n); }这段代码清晰地区分了卡列表中的三款设备S2-3650-CI0b48:300a挂载 LNBP22 供电芯片并初始化 CI条件接收接口PCTV HDTV USB与S2-3600挂载 ISL6423 供电/DiSEqC 芯片不启用 CI。调谐器挂载在pctv452e_tuner_attachpctv452e.c#L942-L953中完成STB6100 的参考时钟为 27 MHz与解调器晶振一致见stb6100_config.refclock。4.2 STB0899 解调器配置stb0899_configpctv452e.c#L856-L900给出了解调器的工作参数晶振 27 MHz、IQ_SWAP_ON反转配置、TS 输出并行模式以及一整套 DVB-S2 的捕获门限常量如MISS_THRESHOLD、UWP_THRESHOLD_*、SOF_SEARCH_TIMEOUT、LDPC_MAX_ITER等。驱动还通过postproc钩子pctv45e_postproc操作 STB0899 的 GPIO01用以切换前面板 LED 的绿/橙指示pctv452e.c#L62-L64#define PCTV_LED_GPIO STB0899_GPIO01 #define PCTV_LED_GREEN 0x82 #define PCTV_LED_ORANGE 0x024.3 MPEG2 TS 流传输参数两种型号的 TS 流均以 USB 等时isochronous方式传输但 URB 参数略有差异pctv452e.c#L993-L1004 与 pctv452e.c#L1046-L1056属性PCTV HDTV USB / S2-3600S2-3650-CI传输类型USB_ISOCUSB_ISOCURB 数量count44端点endpoint0x020x02framesperurb464framesize940940interval11S2-3650-CI 将每个 URB 的帧数提高到 64以适应 CI 解扰后的 TS 吞吐需求。五、USB 命令协议与 I2C 桥接三款设备共用同一套厂商私有 USB 命令协议理解它有助于排查设备通信问题。5.1 命令帧格式驱动在 pctv452e.c#L37-L47 定义了协议关键常量#define ISOC_INTERFACE_ALTERNATIVE 3 #define SYNC_BYTE_OUT 0xaa #define SYNC_BYTE_IN 0x55 #define PCTV_CMD_RESET 0x15 /* 复位推断自 ttusb-budget */ #define PCTV_CMD_IR 0x1b /* 轮询红外遥控 */ #define PCTV_CMD_I2C 0x31 /* 透传 I2C 事务 */每次 USB 命令都以 4 字节头开始tt3650_ci_msg与pctv452e_i2c_msg均遵循该格式偏移内容说明00xaa输出同步字节SYNC_BYTE_OUT1id事务计数器每次递增state-c可回绕2cmd命令码0x15 复位 / 0x1b IR / 0x31 I2C以及 0x40~0x45 的 CI 命令3len后续负载长度部分命令为发送长度设备应答则以 0x55SYNC_BYTE_IN开头并回显事务 id 用于校验if (SYNC_BYTE_IN ! buf[0] || id ! buf[1]) goto failed; /* TT USB 协议错误 */每次命令设备最多返回 64 字节PCTV_ANSWER_LEN命令等待超时为 1000 msPCTV_TIMEOUT见 pctv452e.c#L56-L59。5.2 复位与上电初始化pctv452e_power_ctrlpctv452e.c#L516-L565在设备上电时做一次性初始化先通过usb_set_interface将接口 0 切换到备选设置 3等时传输接口然后连续发送两次PCTV_CMD_RESET复位命令完成后置位state-initializedb0[0] 0xaa; b0[1] state-c; b0[2] PCTV_CMD_RESET; b0[3] 1; b0[4] 0; /* reset board */ ret dvb_usb_generic_rw(d, b0, 5, rx, PCTV_ANSWER_LEN, 0); ... b0[4] 1; /* reset board (again?) */5.3 I2C 透传桥由于 STB0899、STB6100、ISL6423/LNBP22 与 EEPROM 全部挂在设备的 I2C 总线上驱动实现了完整的 I2C 适配器桥接pctv452e_i2c_algopctv452e.c#L908-L911。pctv452e_i2c_msg将一次 I2C 事务打包为命令 0x31buf[0] SYNC_BYTE_OUT; buf[1] id; buf[2] PCTV_CMD_I2C; buf[3] snd_len 3; buf[4] addr 1; /* 7 位地址左移为 8 位总线地址 */ buf[5] snd_len; buf[6] rcv_len;应答中若buf[5] snd_len || buf[6] rcv_len则判定为 I2C 设备未按预期响应返回-EREMOTEIO。驱动因此得以复用 Linux 标准 I2C 框架来驱动解调器、调谐器与 LNB 芯片——这也是 usb-cardlist.rst 中提到媒体驱动可能提供card参数选择设备型号的机制基础同类 VID/PID 复用场景下可通过该参数强制指定正确的板卡配置。5.4 MAC 地址读取S2-3600/S2-3650-CIpctv452e_read_mac_addresspctv452e.c#L618-L653通过 I2C 从板上 EEPROM24C16地址 0x50若返回-EREMOTEIO则回退尝试 24C64地址 0x51读取 20 字节编码 MAC再交给ttpci_eeprom_decode_mac解码为 6 字节 MAC 地址。读取失败时以零地址兜底eth_zero_addr(mac)。这一特性在tt_connect_s2_3600_properties中通过.read_mac_address钩子启用pctv452e.c#L1029PCTV HDTV USB 属性块中则未设置该钩子。六、S2-3650-CI 的 Common Interface 支持卡列表中的第三款设备 S2-3650-CI 是驱动中最复杂的部分——它完整实现了 EN 50221 标准定义的 Common InterfaceCI用于对接条件接收模块CAM即智能卡模块。6.1 CI 命令集驱动定义了 7 个 CI 专用命令pctv452e.c#L73-L81enum { TT3650_CMD_CI_TEST 0x40, /* 查询 CAM 状态 */ TT3650_CMD_CI_RD_CTRL, /* 读 CAM 控制寄存器 */ TT3650_CMD_CI_WR_CTRL, /* 写 CAM 控制寄存器 */ TT3650_CMD_CI_RD_ATTR, /* 读属性内存 */ TT3650_CMD_CI_WR_ATTR, /* 写属性内存 */ TT3650_CMD_CI_RESET, /* 复位 CAM */ TT3650_CMD_CI_SET_VIDEO_PORT /* 开启/关闭 TS 通路 */ };6.2 与 dvb_ca_en50221 框架的对接驱动通过struct dvb_ca_en50221注册回调集合pctv452e.c#L379-L413state-ca.owner THIS_MODULE; state-ca.read_attribute_mem tt3650_ci_read_attribute_mem; state-ca.write_attribute_mem tt3650_ci_write_attribute_mem; state-ca.read_cam_control tt3650_ci_read_cam_control; state-ca.write_cam_control tt3650_ci_write_cam_control; state-ca.slot_reset tt3650_ci_slot_reset; state-ca.slot_shutdown tt3650_ci_slot_shutdown; state-ca.slot_ts_enable tt3650_ci_slot_ts_enable; state-ca.poll_slot_status tt3650_ci_poll_slot_status; state-ca.data d; ret dvb_ca_en50221_init(a-dvb_adap, state-ca, /* flags */ 0, /* n_slots */ 1);关键流程槽位轮询tt3650_ci_poll_slot_status发送TT3650_CMD_CI_TEST应答字节为 1 时返回DVB_CA_EN50221_POLL_CAM_PRESENT | DVB_CA_EN50221_POLL_CAM_READY向上层通报 CAM 在位且就绪槽位复位tt3650_ci_slot_reset依次发送CI_RESET参数 0→ 等待 500 ms →CI_RESET参数 1→ 等待 500 ms →CI_SET_VIDEO_PORT参数 0FTA 状态TS 通路控制slot_ts_enable/slot_shutdown通过CI_SET_VIDEO_PORT打开/关闭解扰后的 TS 输出并发保护所有 CI 事务经由state-ca_mutex串行化tt3650_ci_msg_locked卸载时tt3650_ci_uninitpctv452e.c#L355-L377先关闭视频端口再释放 CI 资源。此外解调器 TS 输出寄存器STB0899_TSOUT在初始化表中被配置为0x69源码注释标注/* 0x0d for CAM */pctv452e.c#L802说明解调器 TS 输出模式与 CI 通路存在联动关系属于从配置表可以推断的硬件细节。七、红外遥控与调试三款设备都支持板载红外接收器驱动通过rc_query轮询方式读取遥控按键轮询命令为PCTV_CMD_IR0x1b轮询间隔 100 msrc_interval 100应答中rx[3] 9且rx[12] 0x01表示一次按下事件按键码按 RC5 协议解析为RC_SCANCODE_RC5(rx[7], rx[6])并上报pctv452e.c#L601-L612PCTV HDTV USB 使用RC_MAP_DIB0700_RC5_TABLE键位表TT Connect 系列使用RC_MAP_TT_1500键位表对应 Technotrend 遥控器松开按键时上报rc_keyup并清空last_rc_key。调试方面驱动暴露了两个模块参数pctv452e.c#L31-L35static int debug; module_param(debug, int, 0644); MODULE_PARM_DESC(debug, Turn on/off debugging (default:off).); DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);debug整型加载时可用modprobe dvb-usb-pctv452e debugN传入debug 2输出 RC 按键明细debug 3输出 IR 原始应答见 pctv452e.c#L593-L599adapter_nr由 DVB 框架宏生成的适配器编号参数用于指定 DVB 适配器的编号支持按设备列表传入多个编号。八、与其他文档的关联本文所依据的卡列表是内核 USB DVB 设备文档体系的一部分。总览文档 Documentation/admin-guide/media/usb-cardlist.rst 说明了 USB ID 的识别方法lsusb、card参数的用途并列出全部受支持的 USB 媒体驱动dvb-usb-pctv452e-cardlist.rst则通过toctree挂载于其下见 usb-cardlist.rst#L128 的dvb-usb-pctv452e-cardlist条目。结语dvb-usb-pctv452e卡列表文档虽然只有一张三行表格却是驱动与硬件之间的契约PCTV HDTV USB2304:021f、TT Connect S2-36000b48:3007与 S2-3650-CI0b48:300a三组 USB ID 分别对应源码中的设备枚举、前端挂载分支ISL6423 vs LNBP22CI与属性块配置。在 pctv452e.c 中这三款设备共用 STB0899/STB6100 前端、0xaa/0x55 同步字节的命令协议与 I2C 桥接层而 S2-3650-CI 独享完整的 EN 50221 CI 栈。当你手头有上述任一设备时启用CONFIG_DVB_USB_PCTV452E并借助lsusb核对 USB ID即可确认驱动是否已接管硬件。【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表