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.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

V4L2_CID_LINK_FREQ integer64 選單項的值。

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 狀態設定的接收器驅動程式可以免於呼叫這兩個回撥。