7.6. ioctl VIDIOC_DBG_G_REGISTER, VIDIOC_DBG_S_REGISTER¶
7.6.1. 名稱¶
VIDIOC_DBG_G_REGISTER - VIDIOC_DBG_S_REGISTER - 讀取或寫入硬體暫存器
7.6.2. 概要¶
-
VIDIOC_DBG_G_REGISTER¶
int ioctl(int fd, VIDIOC_DBG_G_REGISTER, struct v4l2_dbg_register *argp)
-
VIDIOC_DBG_S_REGISTER¶
int ioctl(int fd, VIDIOC_DBG_S_REGISTER, const struct v4l2_dbg_register *argp)
7.6.3. 引數¶
fd由
open()返回的檔案描述符。argp指向 struct
v4l2_dbg_register的指標。
7.6.4. 描述¶
注意
這是一個 實驗性 API 元素 介面,將來可能會發生變化。
出於驅動程式除錯目的,這些 ioctl 允許測試應用程式直接訪問硬體暫存器。 正規應用程式不得使用它們。
由於寫入甚至讀取暫存器都可能危及系統安全性、穩定性和損壞硬體,因此這兩個 ioctl 都需要超級使用者許可權。 此外,Linux 核心必須使用 CONFIG_VIDEO_ADV_DEBUG 選項編譯才能啟用這些 ioctl。
要寫入暫存器,應用程式必須初始化 struct v4l2_dbg_register 的所有欄位,除了 size,並使用指向此結構的指標呼叫 VIDIOC_DBG_S_REGISTER。 match.type 和 match.addr 或 match.name 欄位選擇電視卡上的晶片,reg 欄位指定暫存器號,val 欄位指定要寫入暫存器的值。
要讀取暫存器,應用程式必須初始化 match.type、match.addr 或 match.name 和 reg 欄位,並使用指向此結構的指標呼叫 VIDIOC_DBG_G_REGISTER。 成功後,驅動程式將暫存器值儲存在 val 欄位中,並將值的大小(以位元組為單位)儲存在 size 中。
當 match.type 為 V4L2_CHIP_MATCH_BRIDGE 時,match.addr 選擇電視卡上的第 n 個非子裝置晶片。 數字零始終選擇主機晶片,例如連線到 PCI 或 USB 匯流排的晶片。 您可以使用 ioctl VIDIOC_DBG_G_CHIP_INFO ioctl 找出哪些晶片存在。
當 match.type 為 V4L2_CHIP_MATCH_SUBDEV 時,match.addr 選擇第 n 個子裝置。
這些 ioctl 是可選的,並非所有驅動程式都可能支援它們。 但是,當驅動程式支援這些 ioctl 時,它還必須支援 ioctl VIDIOC_DBG_G_CHIP_INFO。 相反,它可以支援 VIDIOC_DBG_G_CHIP_INFO,但不支援這些 ioctl。
VIDIOC_DBG_G_REGISTER 和 VIDIOC_DBG_S_REGISTER 在 Linux 2.6.21 中引入,但它們的 API 在核心 2.6.29 中更改為此處描述的 API。
我們建議使用 v4l2-dbg 實用程式,而不是直接呼叫這些 ioctl。 它可以從 LinuxTV v4l-dvb 儲存庫獲得; 有關訪問說明,請參見 https://linuxtv.org/repo/。
-
型別 v4l2_dbg_match¶
__u32 |
|
有關可能的型別列表,請參見 晶片匹配型別。 |
union { |
(匿名) |
|
__u32 |
|
透過此數字匹配晶片,根據 |
char |
|
透過此名稱匹配晶片,根據 |
} |
||
-
型別 v4l2_dbg_register¶
|
如何匹配晶片,請參見 |
|
__u32 |
|
暫存器大小(以位元組為單位)。 |
__u64 |
|
暫存器號。 |
__u64 |
|
從暫存器讀取或要寫入暫存器的值。 |
|
0 |
匹配卡上的第 n 個晶片,零表示橋晶片。 不匹配子裝置。 |
|
4 |
匹配第 n 個子裝置。 |
7.6.5. 返回值¶
成功時返回 0,出錯時返回 -1,並且 errno 變數會相應地設定。 泛型錯誤程式碼在 泛型錯誤程式碼 章節中描述。
- EPERM
許可權不足。 需要 root 許可權才能執行這些 ioctl。