7.29. ioctl VIDIOC_G_EXT_CTRLS, VIDIOC_S_EXT_CTRLS, VIDIOC_TRY_EXT_CTRLS¶
7.29.1. 名稱¶
VIDIOC_G_EXT_CTRLS - VIDIOC_S_EXT_CTRLS - VIDIOC_TRY_EXT_CTRLS - 獲取或設定多個控制元件的值,嘗試控制元件值
7.29.2. 概要¶
-
VIDIOC_G_EXT_CTRLS¶
int ioctl(int fd, VIDIOC_G_EXT_CTRLS, struct v4l2_ext_controls *argp)
-
VIDIOC_S_EXT_CTRLS¶
int ioctl(int fd, VIDIOC_S_EXT_CTRLS, struct v4l2_ext_controls *argp)
-
VIDIOC_TRY_EXT_CTRLS¶
int ioctl(int fd, VIDIOC_TRY_EXT_CTRLS, struct v4l2_ext_controls *argp)
7.29.3. 引數¶
fd由
open()返回的檔案描述符。argp指向 struct
v4l2_ext_controls的指標。
7.29.4. 描述¶
這些 ioctl 允許呼叫者以原子方式獲取或設定多個控制元件。控制元件 ID 被分組到控制元件類中(參見 控制元件類),並且控制元件陣列中的所有控制元件必須屬於同一個控制元件類。
應用程式必須始終填寫 struct v4l2_ext_controls 的 count、which、controls 和 reserved 欄位,並初始化 controls 欄位指向的 struct v4l2_ext_control 陣列。
要獲取一組控制元件的當前值,應用程式需要初始化每個 struct v4l2_ext_control 的 id、size 和 reserved2 欄位,並呼叫 VIDIOC_G_EXT_CTRLS ioctl。字串控制元件還必須設定 string 欄位。複合型別的控制元件(設定了 V4L2_CTRL_FLAG_HAS_PAYLOAD)必須設定 ptr 欄位。
如果 size 太小,無法接收控制元件結果(僅與指標型別控制元件(如字串)相關),則驅動程式會將 size 設定為有效值並返回 ENOSPC 錯誤程式碼。您應該將記憶體重新分配到這個新的大小並重試。對於字串型別,如果字串在這段時間內增長了,則可能再次出現相同的問題。建議先呼叫 ioctls VIDIOC_QUERYCTRL、VIDIOC_QUERY_EXT_CTRL 和 VIDIOC_QUERYMENU,並使用 maximum+1 作為新的 size 值。這保證了足夠的記憶體。
N 維陣列是逐行設定和檢索的。您不能設定部分陣列,必須設定或檢索所有元素。總大小計算為 elems * elem_size。這些值可以透過呼叫 VIDIOC_QUERY_EXT_CTRL 來獲取。
要更改一組控制元件的值,應用程式需要初始化每個 struct v4l2_ext_control 的 id、size、reserved2 和 value/value64/string/ptr 欄位,並呼叫 VIDIOC_S_EXT_CTRLS ioctl。只有在所有控制元件值都有效時,才會設定這些控制元件。
要檢查一組控制元件是否具有正確的值,應用程式需要初始化每個 struct v4l2_ext_control 的 id、size、reserved2 和 value/value64/string/ptr 欄位,並呼叫 VIDIOC_TRY_EXT_CTRLS ioctl。驅動程式可以自動將錯誤的值調整為有效值,也可以返回錯誤,具體取決於驅動程式。
當 id 或 which 無效時,驅動程式會返回 EINVAL 錯誤程式碼。當值超出範圍時,驅動程式可以選擇採用最接近的有效值或返回 ERANGE 錯誤程式碼,無論哪種方式看起來更合適。在第一種情況下,新值將在 struct v4l2_ext_control 中設定。如果新的控制元件值不合適(例如,給定的選單索引不受選單控制元件支援),那麼這將導致 EINVAL 錯誤程式碼錯誤。
如果 request_fd 設定為尚未排隊的 請求 檔案描述符,並且 which 設定為 V4L2_CTRL_WHICH_REQUEST_VAL,那麼控制元件不會在呼叫 VIDIOC_S_EXT_CTRLS 時立即應用,而是由驅動程式為與同一請求關聯的緩衝區應用。如果裝置不支援請求,則將返回 EACCES。如果支援請求,但給出了無效的請求檔案描述符,則將返回 EINVAL。
嘗試為已排隊的請求呼叫 VIDIOC_S_EXT_CTRLS 將導致 EBUSY 錯誤。
如果在呼叫 VIDIOC_G_EXT_CTRLS 期間指定了 request_fd 並且 which 設定為 V4L2_CTRL_WHICH_REQUEST_VAL,那麼它將返回請求完成時的控制元件值。如果請求尚未完成,那麼這將導致 EACCES 錯誤。
只有在所有控制元件值都正確時,驅動程式才會設定/獲取這些控制元件。這可以防止僅設定/獲取部分控制元件的情況。只有低階錯誤(例如,i2c 命令失敗)仍然會導致這種情況。
-
型別 v4l2_ext_control¶
__u32 |
|
標識控制元件,由應用程式設定。 |
__u32 |
|
此控制元件的有效負載的總大小(以位元組為單位)。 |
注意 對於字串控制元件,不應將此 |
||
__u32 |
|
保留供將來擴充套件使用。驅動程式和應用程式必須將陣列設定為零。 |
union { |
(anonymous) |
|
__s32 |
|
新值或當前值。如果此控制元件的型別不是 |
__s64 |
|
新值或當前值。如果此控制元件的型別為 |
char * |
|
指向字串的指標。如果此控制元件的型別為 |
__u8 * |
|
指向無符號 8 位值的矩陣控制元件的指標。如果此控制元件的型別為 |
__u16 * |
|
指向無符號 16 位值的矩陣控制元件的指標。如果此控制元件的型別為 |
__u32 * |
|
指向無符號 32 位值的矩陣控制元件的指標。如果此控制元件的型別為 |
__s32 * |
|
指向有符號 32 位值的矩陣控制元件的指標。如果此控制元件的型別為 |
__s64 * |
|
指向有符號 64 位值的矩陣控制元件的指標。如果此控制元件的型別為 |
struct |
|
指向 struct |
struct |
|
指向 struct |
struct |
|
指向 struct |
struct |
|
指向 struct |
struct |
|
指向 struct |
struct |
|
指向 struct |
struct |
|
指向 struct |
struct |
|
指向 struct |
struct |
|
指向 struct |
struct |
|
指向 struct |
struct |
|
指向 struct |
struct |
|
指向 struct |
struct |
|
指向 struct |
struct |
|
指向 struct |
struct |
|
指向 struct |
struct |
|
指向 struct |
struct |
|
指向 struct |
struct |
|
指向 struct |
struct |
|
指向 struct |
struct |
|
指向 struct |
struct |
|
指向 struct |
struct |
|
指向 struct |
struct |
|
指向 struct |
struct |
|
指向 struct |
struct |
|
指向 struct |
struct |
|
指向 struct |
struct |
|
指向 struct |
struct |
|
指向 struct |
void * |
|
指向複合型別的指標,該複合型別可以是 N 維陣列和/或複合型別(控制元件的型別 >= |
} |
||
-
型別 v4l2_ext_controls¶
union { |
(anonymous) |
|
__u32 |
|
要獲取/設定/嘗試的控制元件的值。 |
使用 是否控制元件支援使用 為了向後相容,您也可以在此處使用控制元件類(參見 控制元件類)。在這種情況下,所有控制元件都必須屬於該控制元件類。此用法已棄用,請改用 |
||
__u32 |
|
為了向後相容而保留的已棄用名稱。請改用 |
} |
||
__u32 |
|
控制元件陣列中控制元件的數量。也可以為零。 |
__u32 |
|
失敗控制元件的索引。在發生錯誤時由驅動程式設定。 |
如果錯誤與特定控制元件相關聯,則 在從硬體讀取控制元件或寫入硬體之前,會進行驗證步驟:這會檢查列表中的所有控制元件是否都是有效的控制元件,是否沒有嘗試寫入只讀控制元件或從只寫控制元件讀取,以及任何其他可以在不訪問硬體的情況下進行的預先檢查。在此步驟中完成的確切驗證取決於驅動程式,因為某些檢查可能需要硬體訪問才能用於某些裝置,因此無法進行預先檢查。但是,驅動程式應盡最大努力進行儘可能多的預先檢查。 進行此檢查是為了避免由於容易避免的問題而使硬體處於不一致的狀態。但這會導致另一個問題:應用程式需要知道錯誤是來自驗證步驟(意味著未觸及硬體)還是來自實際讀取硬體或寫入硬體期間的錯誤。 為此,事後看來很糟糕的解決方案是,如果驗證失敗,則將 由於 VIDIOC_TRY_EXT_CTRLS 不訪問硬體,因此也不需要以這種特殊方式處理驗證步驟,所以 |
||
__s32 |
|
用於此操作的請求的檔案描述符。僅當 |
__u32 |
|
為將來的擴充套件保留。 驅動程式和應用程式必須將陣列設定為零。 |
struct |
|
指向 如果 |
|
0x980000 |
包含使用者控制元件的類。這些控制元件在 使用者控制元件 中描述。可以使用 VIDIOC_S_CTRL 和 VIDIOC_G_CTRL ioctl 設定的所有控制元件都屬於此類。 |
|
0x990000 |
包含有狀態編解碼器控制元件的類。這些控制元件在 編解碼器控制元件參考 中描述。 |
|
0x9a0000 |
包含相機控制元件的類。這些控制元件在 相機控制元件參考 中描述。 |
|
0x9b0000 |
包含 FM 發射器 (FM TX) 控制元件的類。這些控制元件在 FM 發射器控制元件參考 中描述。 |
|
0x9c0000 |
包含閃光燈裝置控制元件的類。這些控制元件在 閃光燈控制元件參考 中描述。 |
|
0x9d0000 |
包含 JPEG 壓縮控制元件的類。這些控制元件在 JPEG 控制元件參考 中描述。 |
|
0x9e0000 |
包含影像源控制元件的類。這些控制元件在 影像源控制元件參考 中描述。 |
|
0x9f0000 |
包含影像處理控制元件的類。這些控制元件在 影像處理控制元件參考 中描述。 |
|
0xa10000 |
包含 FM 接收器 (FM RX) 控制元件的類。這些控制元件在 FM 接收器控制元件參考 中描述。 |
|
0xa20000 |
包含 RF 調諧器控制元件的類。這些控制元件在 RF 調諧器控制元件參考 中描述。 |
|
0xa30000 |
包含運動或物體檢測控制元件的類。這些控制元件在 檢測控制元件參考 中描述。 |
|
0xa40000 |
包含無狀態編解碼器控制元件的類。這些控制元件在 無狀態編解碼器控制元件參考 中描述。 |
|
0xa50000 |
包含色彩控制元件的類。這些控制元件在 色彩控制元件參考 中描述。 |
7.29.5. 返回值¶
成功時返回 0,出錯時返回 -1,並且會適當地設定 errno 變數。通用錯誤程式碼在 通用錯誤程式碼 章節中描述。
- EINVAL
struct
v4l2_ext_controlid無效,或者 structv4l2_ext_controlswhich無效,或者 structv4l2_ext_controlvalue不合適(例如,給定的選單索引不受驅動程式支援),或者which欄位設定為V4L2_CTRL_WHICH_REQUEST_VAL,但給定的request_fd無效或核心不支援V4L2_CTRL_WHICH_REQUEST_VAL。如果兩個或多個控制元件值衝突,則 VIDIOC_S_EXT_CTRLS 和 VIDIOC_TRY_EXT_CTRLS ioctl 也會返回此錯誤程式碼。- ERANGE
struct
v4l2_ext_controlvalue超出範圍。- EBUSY
控制元件暫時無法更改,可能是因為另一個應用程式接管了此控制元件所屬的裝置功能的控制,或者(如果
which欄位設定為V4L2_CTRL_WHICH_REQUEST_VAL)請求已排隊但尚未完成。- ENOSPC
為控制元件的有效載荷保留的空間不足。欄位
size設定為足以儲存有效載荷的值,並返回此錯誤程式碼。- EACCES
嘗試嘗試或設定只讀控制元件,或獲取只寫控制元件,或從尚未完成的請求中獲取控制元件。
或者
which欄位設定為V4L2_CTRL_WHICH_REQUEST_VAL,但裝置不支援請求。或者,如果嘗試設定非活動控制元件,並且驅動程式無法快取新值,直到控制元件再次啟用。