v4l2 编程接口(一) ― ioctl(四)

2014-11-24 09:08:18 · 作者: · 浏览: 5
V4L2_CID_BASE+13) /* 白平衡调节 */
V4L2_CID_GAMMA (V4L2_CID_BASE+16) /* 伽马值调节 */
V4L2_CID_EXPOSURE (V4L2_CID_BASE+17) /* 曝光度调节 */

V4L2_CID_PRIVATE_ATXX_FLASH (V4L2_CID_PRIVATE_BASE + 2) /* 闪光灯控制 */
V4L2_CID_PRIVATE_ATXX_FRAME (V4L2_CID_PRIVATE_BASE + 12) /* 帧率调节 */
type 为命令值的类型(总共有7中类型的值),name 是命令的名称,reserved 则是命令值的位图表示,驱动会将所有的命令值都以 bit 的形式写到 64 位的域中,上层应用查询时可以根据位图判断命令支持的值。
7、struct v4l2_control 与 VIDIOC_G_CTRL、VIDIOC_S_CTRL
VIDIOC_S_CTRL 或 VIDIOC_G_CTRL 命令通过结构 v4l2_control 设置或者获取 id 命令的值:
[cpp]
struct v4l2_control {
__u32 id;
__s32 value;
};
这个结构只有 2 个域,id 是命令编号,value 则是命令的值。
8、struct v4l2_tuner 与 VIDIOC_G_TUNER、VIDIOC_S_TUNER
VIDIOC_S_TUNER 或 VIDIOC_G_TUNER 命令通过结构 v4l2_tuner 设置调谐器的信息:
[cpp]
struct v4l2_tuner {
__u32 index; /* 调谐器编号,由应用程序设置 */
__u8 name[32]; /* 调谐器名称 */
enum v4l2_tuner_type type; /* 调谐器类型 */
__u32 capability; /* 调谐器支持的操作 */
__u32 rangelow; /* 最低频率值,单位为62.5Hz或者62.5KHz */
__u32 rangehigh; /* 最高频率值 */
__u32 rxsubchans; /* 接收的音频信号类型 */
__u32 audmode; /* 当前音频播放形式 */
__s32 signal; /* 信号强度 */
__s32 afc; /* 自动频率控制 */
__u32 reserved[4]; /* 保留备用 */
};
其中
enum v4l2_tuner_type {
V4L2_TUNER_RADIO = 1, /* 调频收音机 */
V4L2_TUNER_ANALOG_TV = 2, /* 模拟电视高频头 */
V4L2_TUNER_DIGITAL_TV = 3, /* 数字电视高频头 */
};
其中域 type 有三种类型;capability 域一般为 V4L2_TUNER_CAP_LOW,表明频率调节的步长是62.5Hz,如果没有这个标志位则步长为62.5KHz;rangelow 与 rangehigh 是调谐器可以调频率的最高值和最低值,但都以步长为单位表示;rxsubchans 表示调谐器接收的音频信号类型,常见值有 V4L2_TUNER_SUB_MONO | V4L2_TUNER_SUB_STEREO 即单声道与立体声;audmode 表示以何种方式播放声音,常见值有 V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO,即以单声道还是立体声的方式播放;signal 为当前信号强度,一般取值范围为 0 - 65535。
9、struct v4l2_frequency 与 VIDIOC_G_FREQUENCY、VIDIOC_S_FREQUENCY
VIDIOC_S_FREQUENCY 或 VIDIOC_G_FREQUENCY 命令通过结构 v4l2_frequency 设置或获取当前频率值:
[cpp] view plaincopy
struct v4l2_frequency {
__u32 tuner; /* 调谐器编号 */
enum v4l2_tuner_type type; /* 调谐器类型 */
__u32 frequency; /* 调谐器频率 */
__u32 reserved[8];
};
注意:frequency 的值是以62.5Hz 或者 62.5KHZ 为单位的。
附1、_IO、_IOR、_IOW、_IOWR 宏的使用说明
驱动程序中 ioctl 函数传递的变量 cmd 是应用程序向驱动程序请求处理的命令。cmd 除了用于区别不同命令的数值,还可包含有助于处理的几种信息。cmd 的大小为 32 bit,共分 4 个域:
bit29 ~ bit31: 3bit 为 “读写” 区,作用是区分是读命令还是写命令。
bit16 ~ bit28:13bit 为 "数据大小" 区,表示 ioctl 中的 arg 变量传递的数据大小;有时候为 14bit 即将 bit29 覆盖。
bit8 ~ bit15: 8bit 为 “魔数"(也称为"幻数")区,这个值用以与其它设备驱动程序的 ioctl 命令进行区别。
bit0 ~ bit7: 8bit 为 "序号" 区,是区分命令的命令顺序序号。
魔数(magic number)
魔数范围为 0~255 。通常,用英文字符 'A' ~ 'Z' 或者 'a' ~ 'z' 来表示。设备驱动程序从传递进来的命令获取魔数,然后与自身处理的魔数想比较,如果相同则处理,不同则不处理。魔数是拒绝误使用的初步辅助参数。设备驱动程序可以通过宏 _IOC_TYPE (cmd) 来获取魔数。不同的设备驱动程序最好设置不同的魔数,但并不是要求绝对,也是可以使用其他设备驱动程序已用过的魔数。
基数(序号)
基数用于区别各种命令。通常,从 0开始递增,相同设备驱动程序上可以重复使用该值。例如,读和写命令中使用了相同的基数,设备驱动程序也能分辨出来,原因在于设备驱动程序区分命令时使用 switch ,且直接使用命令变量 cmd 值。创建命令的宏生成的值由多个域组合而成,所以即使是相同的基数,也会判断为不同的命令。设备驱动程序想