UVC系列4-定制Android kernel UVC部分支持相对和绝对参数

在熟悉了android uvc控制参数和UVC协议之后,现在可以着手定制android UVC协议了,添加相对控制参数。

  • 第一步,添加相对控制pan和tilt修改的文件是:drivers\media\usb\uvc\uvc_ctrl.c
    uvc_control_info uvc_ctrls[]结构体中添加:
{
    .entity               = UVC_GUID_UVC_CAMERA,
    .selector  = UVC_CT_PANTILT_RELATIVE_CONTROL,
    .index               = 12,
    .size          = 4,
    .flags     = UVC_CTRL_FLAG_SET_CUR
                 |UVC_CTRL_FLAG_GET_RANGE
                 |UVC_CTRL_FLAG_AUTO_UPDATE,
}

在结构体uvc_control_mapping uvc_ctrl_mappings[]中添加:

{
    .id = V4L2_CID_PAN_RELATIVE,
    .name = "Pan (Relative)",
    .entity = UVC_GUID_UVC_CAMERA,
    .selector = UVC_CT_PANTILT_RELATIVE_CONTROL,
    .size = 16,
    .offset = 0,
    .v4l2_type = V4L2_CTRL_TYPE_INTEGER,
    .data_type = UVC_CTRL_DATA_TYPE_SIGNED,
    .get = uvc_ctrl_get_rel_speed,
    .set = uvc_ctrl_set_rel_speed,
},
{
    .id = V4L2_CID_TILT_RELATIVE,
    .name= "Tilt (Relative)",
    .entity= UVC_GUID_UVC_CAMERA,
    .selector= UVC_CT_PANTILT_RELATIVE_CONTROL,
    .size= 16,
    .offset= 16,
    .v4l2_type= V4L2_CTRL_TYPE_INTEGER,
    .data_type= UVC_CTRL_DATA_TYPE_SIGNED,
    .get= uvc_ctrl_get_rel_speed,
    .set= uvc_ctrl_set_rel_speed,
}

其中uvc_ctrl_get_rel_speeduvc_ctrl_set_rel_speed映射到的方法对应UVC协议里面的速度控制,在uvc_ctrl.c文件中也要添加这两个方法的实现,与zoom对应的控制方法类似,具体实现方法是:

static __s32 uvc_ctrl_get_rel_speed(structuvc_control_mapping *mapping,__u8query, const __u8 *data)
{
    intfirst = mapping->offset / 8;
    __s8rel = (__s8)data[first];
    switch (query) {
    case UVC_GET_CUR:
        return (rel == 0) ? 0 : (rel > 0 ?data[first+1]:-data[first+1]);
    case UVC_GET_MIN:
        return -data[first+1];
    case UVC_GET_MAX:
    case UVC_GET_RES:
    case UVC_GET_DEF:
    default:
        return data[first+1];
}
}
static void uvc_ctrl_set_rel_speed(structuvc_control_mapping *mapping,__s32 value, __u8 *data)
{
    intfirst = mapping->offset / 8;
    data[first] = value == 0 ? 0 : (value > 0)? 1 : 0xff;
    data[first+1] = min_t(int, abs(value), 0xff);
}

可以看到这里的赋值也是与UVC协议对应的。另外针对绝对控制,目前在结构体uvc_control_mappinguvc_ctrl_mappings[]中的定义是:

{
    .id             = V4L2_CID_PAN_ABSOLUTE,
    .name               = "Pan (Absolute)",
    .entity               = UVC_GUID_UVC_CAMERA,
    .selector  = UVC_CT_PANTILT_ABSOLUTE_CONTROL,
    .size          = 32,
    .offset              = 0,
    .v4l2_type        = V4L2_CTRL_TYPE_INTEGER,
    .data_type       = UVC_CTRL_DATA_TYPE_UNSIGNED,
},
{
    .id             = V4L2_CID_TILT_ABSOLUTE,
    .name               = "Tilt (Absolute)",
    .entity               = UVC_GUID_UVC_CAMERA,
    .selector  = UVC_CT_PANTILT_ABSOLUTE_CONTROL,
    .size          = 32,
    .offset              = 32,
    .v4l2_type        = V4L2_CTRL_TYPE_INTEGER,
    .data_type       = UVC_CTRL_DATA_TYPE_UNSIGNED,
}

可以看看这两个控制参数的data_type是UVC_CTRL_DATA_TYPE_UNSIGNED,而UVC协议里面定义的是:

image

Value的类型是signed number,此时我们需要将UNSIGNED改为signed,将这个data_type统一改成signed,即UVC_CTRL_DATA_TYPE_SIGNED
下一步uvc_control_mapping uvc_ctrl_mappings[]中添加速度控制的参数,如下:

{
    .id             = V4L2_CID_PAN_SPEED,
    .name               = "Pan (Speed)",
    .entity               = UVC_GUID_UVC_CAMERA,
    .selector  = UVC_CT_PANTILT_RELATIVE_CONTROL,
    .size          = 16,
    .offset              = 0,
    .v4l2_type        = V4L2_CTRL_TYPE_INTEGER,
    .data_type       = UVC_CTRL_DATA_TYPE_SIGNED,
    .get          = uvc_ctrl_get_rel_speed,
    .set           = uvc_ctrl_set_rel_speed,
},
{
    .id             = V4L2_CID_TILT_SPEED,
    .name               = "Tilt (Speed)",
    .entity               = UVC_GUID_UVC_CAMERA,
    .selector  = UVC_CT_PANTILT_RELATIVE_CONTROL,
    .size          =16,
    .offset              = 16,
    .v4l2_type        = V4L2_CTRL_TYPE_INTEGER,
    .data_type       = UVC_CTRL_DATA_TYPE_SIGNED,
    .get          = uvc_ctrl_get_rel_speed,
    .set           = uvc_ctrl_set_rel_speed,
}

针对相对控制的两个参数id V4L2_CID_PAN_RELATIVEV4L2_CID_PAN_RELATIVE,两个控制速度的参数V4L2_CID_PAN_SPEEDV4L2_CID_TILT_SPEED需要定义,修改两个文件,第一个文件位置位于drivers\media\v4l2-core\v4l2-ctrls.c文件中,const char *v4l2_ctrl_get_name中添加:

caseV4L2_CID_PAN_RELATIVE:      return"Pan, Relative";
caseV4L2_CID_TILT_RELATIVE:     return"Tilt, Relative";
caseV4L2_CID_PAN_SPEED:         return"Pan, Speed";
caseV4L2_CID_TILT_SPEED:        return"Tilt, Speed";

第二个文件位于include/uapi/linux/v4l2-controls.h,添加定义:

#define V4L2_CID_PAN_RELATIVE                   (V4L2_CID_CAMERA_CLASS_BASE+4)
#define V4L2_CID_TILT_RELATIVE                  (V4L2_CID_CAMERA_CLASS_BASE+5)
#define V4L2_CID_PAN_SPEED                      (V4L2_CID_CAMERA_CLASS_BASE+32)
#define V4L2_CID_TILT_SPEED                     (V4L2_CID_CAMERA_CLASS_BASE+33)

另外还有两个xml说明文件,需要添加这两个控制的说明,分别是:

Documentation/DocBook/media/v4l/controls.xml
Documentation/DocBook/media/v4l/compat.xml
具体修改网址可以参考:
https://patchwork.kernel.org/patch/4836491/

至此,android UVC kernel部分定制完毕,下一步就是打通app到底层kernel的通道,将这些代码合入完毕之后,开始编译kernel代码,并刷机重启。
微信公众号:Android部落格

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容

  • 文章选取android下linux-3.10作为分析对象,具体的UVC初始化过程可以参考csdn大神写的博客,地址...
    cg1991阅读 1,822评论 0 0
  • 本文开启 linux 内核 V4L2 框架部分的学习之旅,本文仅先对 V4L2 的框架做一个综述性的概括介绍,然后...
    yellowmax阅读 7,574评论 0 13
  • 在Android kernel层完成定制之后,需要写app实现对摄像头的控制,主要通过jni代码实现。在jni代码...
    cg1991阅读 826评论 3 2
  • 上一篇文章主要讲述了在android kernel层的控制参数,并没有讲这些参数的具体含义,为什么是这些参数。这里...
    cg1991阅读 2,014评论 2 0
  • 你,害怕孤独吗?我想大部分人都会毫不犹豫地说“是的”,如果将此问题作个市场调查的话,我想会有80%的人不喜欢、...
    悠游四海阅读 823评论 19 24