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 控制用于告诉接收器总线的频率(即,它与符号率不同)。
没有用户可配置的链路频率的驱动程序应通过 .get_mbus_config()
子设备 pad 操作报告它,在 struct v4l2_mbus_config
的 link_freq
字段中,而不是通过控制。
接收器驱动程序应使用 v4l2_get_link_freq()
辅助函数从发送器子设备获取链路频率。
7.2.3. .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.2.4. 停止发送器¶
调用 .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 链路上使用的数据通道数。 |
2 |
数据在信号的上升沿和下降沿上传输。 |
bits_per_sample |
每个采样的位数。 |
k |
对于 D-PHY 为 16,对于 C-PHY 为 7。 |
有关是否使用 D-PHY 或 C-PHY 的信息以及 nr_of_lanes
的值可以从 OF 端点配置中获得。
注意
以这种方式计算的像素速率与摄像头传感器像素阵列上的像素速率不相同,后者由 V4L2_CID_PIXEL_RATE 控制指示。
7.3.2. LP-11 和 LP-111 状态¶
作为过渡到高速模式的一部分,CSI-2 发送器通常会将总线短暂设置为 LP-11 或 LP-111 状态,具体取决于 PHY。 此周期可能短至 100 µs,在此期间接收器观察到此状态并进行其自身的高速模式转换部分。
大多数接收器都能够在软件配置它们这样做后自主处理,但是有些接收器需要软件参与才能观察 LP-11 或 LP-111 状态。 100 µs 是软件中要实现的一个短暂的时间段,尤其是在没有中断告诉您发生了什么的情况下。
解决此问题的一种方法是显式地将发送器侧配置为 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 状态设置的接收器驱动程序可以免于调用这两个回调。