全志A83平臺VIDIOC_S_CTRL和VIDIOC_G_CTRL不能設定問題
阿新 • • 發佈:2019-01-27
一開始鬱悶v4l2的應用程式呼叫VIDIOC_S_CTRL設定camera的曝光和增益引數時一直返回失敗,跟蹤發現並沒有呼叫到sensor驅動的s_ctrl,最後跟蹤發現,連v4l2驅動的ioctl裡面的VIDIOC_S_CTRLswitch也沒有進去,最後在ioctl介面中列印cmd數值發現,應用傳下來的VIDIOC_S_CTRL和驅動裡面的VIDIOC_S_CTRL值都不相同,如下圖:
最後跟蹤發現是全志自己在核心的v4l2_control結構體中添加了自己的引數,如下圖:
而標準的v4l2_control定義如下:
而VIDIOC_S_CTRL定義如下:
#define VIDIOC_G_CTRL _IOWR('V', 27, struct v4l2_control) #define VIDIOC_S_CTRL _IOWR('V', 28, struct v4l2_control)
#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size))) #define _IOC(dir,type,nr,size) \ (((dir) << _IOC_DIRSHIFT) | \ ((type) << _IOC_TYPESHIFT) | \ ((nr) << _IOC_NRSHIFT) | \ ((size) << _IOC_SIZESHIFT)) #define _IOC_TYPECHECK(t) \ ((sizeof(t) == sizeof(t[1]) && \ sizeof(t) < (1 << _IOC_SIZEBITS)) ? \ sizeof(t) : __invalid_size_argument_for_IOC) #define _IOC_NRBITS 8 #define _IOC_TYPEBITS 8 /* * Let any architecture override either of the following before * including this file. */ #ifndef _IOC_SIZEBITS # define _IOC_SIZEBITS 14 #endif #ifndef _IOC_DIRBITS # define _IOC_DIRBITS 2 #endif #define _IOC_NRMASK ((1 << _IOC_NRBITS)-1) #define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1) #define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1) #define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1) #define _IOC_NRSHIFT 0 #define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS) #define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS) #define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS)
其中發現cmd的第16~19位資料不同,根據cmd的構造原理髮現是sizeof(v4l2_control)的結果導致,全志核心的v4l2_control算出來的結果是12即C,而標準的v4l2_control計算的結果是8,而應用層使用的是標準的v4l2_control,導致應用程式傳遞下來的VIDIOC_S_CTRL和VIDIOC_G_CTRL和核心計算出來的結果不一致,所以設定camera引數失敗導致。
解決辦法,修改標準的v4l2_control定義,新增類似全志平臺的使用者指標引數。