9.1.5. pvrusb2 驱动程序¶
作者:Mike Isely <isely@pobox.com>
9.1.5.1. 背景¶
此驱动程序适用于“Hauppauge WinTV PVR USB 2.0”,它是一款 USB 2.0 主机电视调谐器。此驱动程序正在开发中。它的历史始于 Björn Danielsson <pvrusb2@dax.nu> 的逆向工程工作,其网页可以在这里找到:http://pvrusb2.dax.nu/
从那里,Aurelien Alleaume <slts@free.fr> 开始努力创建与 video4linux 兼容的驱动程序。我从 Aurelien 的最后已知快照开始,并将驱动程序发展到此处的状态。
有关此驱动程序的更多信息,请访问:https://www.isely.net/pvrusb2.html
此驱动程序具有很强的层分离。它们大致为
与设备的低级线路协议实现。
I2C 适配器实现以及在 V4L 中其他地方实现的相应 I2C 客户端驱动程序。
高级硬件驱动程序实现,它协调所有活动以确保设备的正确运行。
一个“上下文”层,它管理驱动程序的实例化、设置、拆卸、仲裁以及与高级接口的适当交互,因为设备热插拔到系统中。
高级接口,将驱动程序粘合到各种已发布的 Linux API(V4L、sysfs,将来可能是 DVB)。
最重要的剪切层是顶层 2 层之间。为了确保任何可以想象的 API 都可以放在核心驱动程序之上,驱动程序中投入了大量工作。(是的,驱动程序内部利用 V4L 来完成其工作,但这与驱动程序向外界发布的 API 没有任何关系。)该架构允许不同的 API 同时访问驱动程序。我对 API 有很强的公平感,并且认为将实现和接口彼此隔离是一个很好的设计原则。因此,虽然目前 V4L 高级接口是最完整的,但 sysfs 高级接口对于类似的功能也同样有效,并且我认为现在没有任何理由不能生成可以与 V4L 并行的 DVB 高级接口。
9.1.5.2. 构建¶
要构建这些模块,实际上只需运行“Make”,但是您需要附近的内核源代码树,并且您可能还需要先设置一些控制环境变量,以便将内容与该源代码树链接起来。请参阅此处的 Makefile 以获取解释如何执行此操作的注释。
9.1.5.3. 源文件列表/功能概述¶
(注意:下面使用的术语“模块”通常指的是 pvrusb2 驱动程序中松散定义的功能单元,与 Linux 内核的可加载模块的概念无关。)
- pvrusb2-audio.[ch] - 这是驻留在此之间的粘合逻辑
驱动程序和 msp3400.ko I2C 客户端驱动程序(在 V4L 中的其他地方找到)。
- pvrusb2-context.[ch] - 此模块实现驱动程序实例的上下文。
其他一切最终都会与此处实现的数据结构绑定或以其他方式实例化。热插拔最终在这里协调。所有高级接口都通过此模块连接到驱动程序。此模块有助于仲裁每个接口对实际驱动程序核心的访问,并且旨在允许通过多个接口的多个实例进行并发访问(因此,例如,您可以通过 sysfs 更改调谐器的频率,同时通过 V4L 将视频流式传输到 mplayer 的实例)。
- pvrusb2-debug.h - 此头文件定义了一个 printk() 包装器和一个掩码
用于在驱动程序中启用的各种调试消息类型的调试位定义。
- pvrusb2-debugifc.[ch] - 此模块实现了一个粗略的命令行
面向驱动程序的调试接口。除了作为实现手动固件提取过程的一部分(请参阅前面提到的 pvrusb2 网站)之外,可能只有我一个人使用过它。它主要是一个调试辅助工具。
- pvrusb2-eeprom.[ch] - 这是驻留在此之间的粘合逻辑
驱动程序 tveeprom.ko 模块,它本身在 V4L 中的其他地方实现。
- pvrusb2-encoder.[ch] - 此模块实现与以下交互所需的所有协议
pvrusb2 设备中的 Conexant mpeg2 编码器芯片。它是 ivtv 中相应逻辑的粗略回声,但是设计目标(严格隔离)和物理层(通过 USB 而不是 PCI 的代理)有足够的差异,以至于此实现必须完全不同。
- pvrusb2-hdw-internal.h - 此头文件定义了核心数据结构
在驱动程序中用于跟踪与硬件控制相关的所有内部状态。核心硬件处理模块之外的任何人都不应该使用此头文件。对驱动程序的所有外部访问都应通过高级接口之一(例如 V4L、sysfs 等),事实上,即使是那些高级接口也仅限于 pvrusb2-hdw.h 中定义的 API,而不是此头文件。
- pvrusb2-hdw.h - 此头文件定义了完整的内部 API
控制硬件。高级接口(例如 V4L、sysfs)将通过此处工作。
- pvrusb2-hdw.c - 此模块实现逻辑的各种位
处理特定 pvrusb2 设备的整体控制。(pvrusb2 设备的策略、实例化和仲裁属于 pvrusb-context 的管辖范围,而不是此处)。
- pvrusb2-i2c-chips-*.c - 这些模块实现粘合逻辑以
将各种 I2C 模块连接并配置它们连接到 I2C 总线。此文件有两个版本。“v4l2”版本旨在与 V4L 一起在树内使用,我们在其中实现仅适用于纯 V4L 环境的逻辑。“all”版本旨在在 V4L 之外使用,我们可能会遇到来自 ivtv 或旧内核快照的其他可能“具有挑战性”的模块(甚至是独立快照中的支持模块)。
- pvrusb2-i2c-cmd-v4l1.[ch] - 此模块实现通用 V4L1
兼容的 I2C 模块命令。在此处,pvrusb2 驱动程序内部的状态更改被转换为 V4L1 命令,然后将这些命令发送到各种 I2C 模块。
- pvrusb2-i2c-cmd-v4l2.[ch] - 此模块实现通用 V4L2
兼容的 I2C 模块命令。在此处,pvrusb2 驱动程序内部的状态更改被转换为 V4L2 命令,然后将这些命令发送到各种 I2C 模块。
- pvrusb2-i2c-core.[ch] - 此模块提供了一个实现
内核友好的 I2C 适配器驱动程序,其他外部 I2C 客户端驱动程序(例如 msp3400、tuner、lirc)可以通过它连接并操作 pvrusb2 设备内的相应芯片。其他 V4L 模块可以通过这里访问此驱动程序来操作特定部件(这些模块又由胶合逻辑驱动,该逻辑由 pvrusb2-hdw 协调,由 pvrusb2-context 分发,最终通过高级接口提供给用户)。
- pvrusb2-io.[ch] - 此模块实现一个非常底层的
传输缓冲区环,用于从设备流式传输数据。此模块是非常底层的。它仅操作缓冲区,并且不尝试定义任何关于如何使用这些缓冲区的策略或机制。
- pvrusb2-ioread.[ch] - 此模块在 pvrusb2-io.[ch] 之上构建
以提供一个可用于 read() 系统调用 I/O 样式的流式 API。目前,这是 pvrusb2-io.[ch] 之上的唯一层,但此处的基础架构旨在允许使用其他模块实现其他 I/O 样式,例如 mmap() 映射的缓冲区,甚至更奇特的方式。
- pvrusb2-main.c - 这是驱动程序的顶层。模块级
和 USB 核心入口点都在这里。这是我们的“main”。
- pvrusb2-sysfs.[ch] - 这是将
pvrusb2 驱动程序连接到 sysfs 的高级接口。通过此接口,您可以对驱动程序执行所有操作,除了实际流式传输数据。
- pvrusb2-tuner.[ch] - 这是位于
此驱动程序和 tuner.ko I2C 客户端驱动程序(在 V4L 中的其他位置找到)之间的胶合逻辑。
- pvrusb2-util.h - 此头文件定义了一些常用的宏,这些宏在
整个驱动程序中使用。这些宏实际上并非特定于驱动程序,但它们必须放在某个地方。
- pvrusb2-v4l2.[ch] - 这是将
pvrusb2 驱动程序连接到 video4linux 的高级接口。V4L 应用程序可以通过这里以通常的 V4L 方式打开和操作驱动程序。请注意,所有 V4L 功能仅通过这里发布,其他任何地方都不会发布。
- pvrusb2-video-*.[ch] - 这是位于
此驱动程序和 saa711x.ko I2C 客户端驱动程序(在 V4L 中的其他位置找到)之间的胶合逻辑。请注意,saa711x.ko 以前在 ivtv 中被称为 saa7115.ko。 此驱动程序有两个版本;具体选择哪个版本取决于找到的 saa711[5x].ko。
- pvrusb2.h - 此头文件包含编译时可调参数
(目前驱动程序几乎没有需要调整的参数)。