7. 像素数据发送器和接收器驱动程序¶
V4L2 支持各种发送和接收像素数据的设备。 这些设备的示例包括摄像头传感器、电视调谐器以及 SoC 中的并行、BT.656 或 CSI-2 接收器。
7.1. 总线类型¶
以下是最常见的总线。 本节仅讨论这两种。
7.1.1. MIPI CSI-2¶
CSI-2 是一种数据总线,旨在将图像从摄像头传输到主机 SoC。 它由 MIPI 联盟定义。
7.1.2. 并行和 BT.656¶
并行和 BT.656 总线在每个时钟周期每个数据线上都传输一位数据。 并行总线使用同步和其他附加信号,而 BT.656 则嵌入同步。
7.2. 发送器驱动程序¶
发送器驱动程序通常需要向接收器驱动程序提供发送器的配置。 需要什么取决于总线的类型。 这些对于两种总线都是通用的。
7.2.1. 媒体总线像素代码¶
请参阅 媒体总线像素代码。
7.2.2. 链路频率¶
V4L2_CID_LINK_FREQ 控制用于告知接收器总线的频率(即,它与符号速率不同)。
.enable_streams()
和 .disable_streams()
回调 ^^^^^^^^^^^^^^^^^^^^^^^^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
struct v4l2_subdev_pad_ops
->enable_streams() 和 struct v4l2_subdev_pad_ops
->disable_streams() 回调由接收器驱动程序用于控制发送器驱动程序的流式传输状态。 这些回调可能不会被直接调用,而是通过使用 v4l2_subdev_enable_streams()
和 v4l2_subdev_disable_streams()
调用。
7.3. CSI-2 发送器驱动程序¶
7.3.1. 像素速率¶
总线上的像素速率计算如下
pixel_rate = link_freq * 2 * nr_of_lanes * 16 / k / bits_per_sample
其中
变量或常数 |
描述 |
---|---|
link_freq |
|
nr_of_lanes |
CSI-2 链路使用的 数据通道数。 这可以从 OF 端点配置中获得。 |
2 |
数据在信号的上升沿和下降沿传输。 |
bits_per_sample |
每个采样的位数。 |
k |
对于 D-PHY 为 16,对于 C-PHY 为 7 |
注意
以这种方式计算的像素速率与摄像头传感器的像素阵列上的像素速率不相同,摄像头传感器的像素阵列上的像素速率由 V4L2_CID_PIXEL_RATE 控制指示。
7.3.2. LP-11 和 LP-111 状态¶
作为过渡到高速模式的一部分,CSI-2 发送器通常会将总线短暂设置为 LP-11 或 LP-111 状态,具体取决于 PHY。 此期间可能短至 100 微秒,在此期间接收器会观察到此状态并继续其自身的高速模式转换部分。
大多数接收器都能够在软件将其配置为这样做后自主处理此问题,但有些接收器需要在观察 LP-11 或 LP-111 状态时软件参与。 100 微秒是一个很短的时间,尤其是在没有中断告知正在发生什么事情时。
解决此问题的一种方法是将发送器侧显式配置为 LP-11 或 LP-111 状态,这需要发送器硬件的支持。 这不是普遍可用的。 许多设备在停止流式传输后会返回到此状态,而上电后的状态为 LP-00 或 LP-000。
.pre_streamon()
回调可用于准备发送器以转换为流式传输状态,但尚未开始流式传输。 类似地,.post_streamoff()
回调用于撤消 .pre_streamon()
回调所做的事情。.pre_streamon()
的调用者因此需要为每次成功调用 .pre_streamon()
调用 .post_streamoff()
。
在 CSI-2 的上下文中,.pre_streamon()
回调用于将发送器转换为 LP-11 或 LP-111 状态。 这也需要打开设备电源,因此应仅在需要时执行此操作。
不需要显式 LP-11 或 LP-111 状态设置的接收器驱动程序可以免于调用这两个回调。
7.3.3. 停止发送器¶
调用 .disable_streams()
回调后,发送器会停止发送图像流。 一些发送器可能会在帧边界停止流,而另一些则会立即停止,从而有效地使当前帧未完成。 接收器驱动程序不应以任何方式进行假设,而应在两种情况下都正常运行。