1. 程式人生 > >全志A83平臺VIDIOC_S_CTRL和VIDIOC_G_CTRL不能設定問題

全志A83平臺VIDIOC_S_CTRL和VIDIOC_G_CTRL不能設定問題

一開始鬱悶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定義,新增類似全志平臺的使用者指標引數。