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_REGISTERmatch.typematch.addrmatch.name 欄位選擇電視卡上的晶片,reg 欄位指定暫存器號,val 欄位指定要寫入暫存器的值。

要讀取暫存器,應用程式必須初始化 match.typematch.addrmatch.namereg 欄位,並使用指向此結構的指標呼叫 VIDIOC_DBG_G_REGISTER。 成功後,驅動程式將暫存器值儲存在 val 欄位中,並將值的大小(以位元組為單位)儲存在 size 中。

match.typeV4L2_CHIP_MATCH_BRIDGE 時,match.addr 選擇電視卡上的第 n 個非子裝置晶片。 數字零始終選擇主機晶片,例如連線到 PCI 或 USB 匯流排的晶片。 您可以使用 ioctl VIDIOC_DBG_G_CHIP_INFO ioctl 找出哪些晶片存在。

match.typeV4L2_CHIP_MATCH_SUBDEV 時,match.addr 選擇第 n 個子裝置。

這些 ioctl 是可選的,並非所有驅動程式都可能支援它們。 但是,當驅動程式支援這些 ioctl 時,它還必須支援 ioctl VIDIOC_DBG_G_CHIP_INFO。 相反,它可以支援 VIDIOC_DBG_G_CHIP_INFO,但不支援這些 ioctl。

VIDIOC_DBG_G_REGISTERVIDIOC_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
struct v4l2_dbg_match

__u32

type

有關可能的型別列表,請參見 晶片匹配型別

union {

(匿名)

__u32

addr

透過此數字匹配晶片,根據 type 欄位進行解釋。

char

name[32]

透過此名稱匹配晶片,根據 type 欄位進行解釋。 目前未使用。

}

型別 v4l2_dbg_register
struct v4l2_dbg_register

struct v4l2_dbg_match

match

如何匹配晶片,請參見 v4l2_dbg_match

__u32

size

暫存器大小(以位元組為單位)。

__u64

reg

暫存器號。

__u64

val

從暫存器讀取或要寫入暫存器的值。

晶片匹配型別

V4L2_CHIP_MATCH_BRIDGE

0

匹配卡上的第 n 個晶片,零表示橋晶片。 不匹配子裝置。

V4L2_CHIP_MATCH_SUBDEV

4

匹配第 n 個子裝置。

7.6.5. 返回值

成功時返回 0,出錯時返回 -1,並且 errno 變數會相應地設定。 泛型錯誤程式碼在 泛型錯誤程式碼 章節中描述。

EPERM

許可權不足。 需要 root 許可權才能執行這些 ioctl。