亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? ov5640.c

?? linux下ov5640驅(qū)動源碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
static int reset_ov5640(struct i2c_client *client){	int ret = i2cc_set_reg(client, 0x3008, 0x82);	mdelay(5);	return (ret);}static int ov5640_get_params(struct i2c_client *client, unsigned int *width,     unsigned int *height, enum v4l2_mbus_pixelcode code){    struct ov5640_priv *priv = to_ov5640(client);    int ret = -EINVAL;    int i;    /* select format */    priv->cfmt = NULL;    for (i = 0; i < ARRAY_SIZE(ov5640_cfmts); i++) {        if (code == ov5640_cfmts[i].code) {            priv->cfmt = ov5640_cfmts + i;            break;        }    }    if (NULL == priv->cfmt) {        return (ret);    }    priv->win = select_win(*width, *height);    *width = priv->win->width;    *height = priv->win->height;    INFO_PURLPLE("current params: %s %dX%d\n",         priv->win->name, *width, *height);    return (0);}static inline void init_setting_values(struct ov5640_priv *priv){    priv->flip_flag = OV5640_HFLIP; }static void get_preview_params(struct i2c_client *client,     unsigned int *exposure, unsigned short *maxlines, unsigned short *gain){    unsigned char ret_h = 0;    unsigned char ret_m = 0;    unsigned char ret_l = 0;    i2cc_get_reg(client, 0x3500, &ret_h);    i2cc_get_reg(client, 0x3501, &ret_m);    i2cc_get_reg(client, 0x3502, &ret_l);    *exposure = ((ret_h << 16) + (ret_m << 8) + ret_l) >> 4;    INFO_GREEN("expl:0x%x, expm:0x%x, exph:0x%x\n",             ret_l, ret_m, ret_h);    i2cc_get_reg(client, 0x350c, &ret_h);    i2cc_get_reg(client, 0x350d, &ret_l);    *maxlines = (ret_h << 8) + ret_l;    //i2cc_get_reg(client, 0x350a, &ret_h);    i2cc_get_reg(client, 0x350b, &ret_l);    *gain = /*((ret_h & 0x1) << 8) + */ret_l;    INFO_GREEN("exposure:0x%x, maxlines:0x%x, gain:0x%x\n",        *exposure, *maxlines, *gain);}static void manual_set_exposure_and_gain(struct i2c_client *client,    unsigned int p_exposure, unsigned short p_maxlines, unsigned short p_gain){    unsigned char ret_h = 0;    unsigned char ret_l = 0;    unsigned char exp_h;    unsigned char exp_m;    unsigned char exp_l;    unsigned char lines_10ms;    unsigned short cap_maxlines;    unsigned short cap_exposure;    unsigned short cap_gain;    unsigned short gain;    unsigned int   cap_exp_gain;    i2cc_get_reg(client, 0x350c, &ret_h);    i2cc_get_reg(client, 0x350d, &ret_l);    cap_maxlines = (ret_h << 8) + ret_l;    //p_maxlines = 980;    //cap_maxlines = 1964;    INFO_GREEN("cap_maxlines: 0x%x\n", cap_maxlines);        // for 50HZ, if 60HZ, devided by 12000    lines_10ms = CAPTURE_FRAME_RATE * cap_maxlines / 10000 * 13 / 12;    if (0 == p_maxlines) {        p_maxlines = 1;    }    cap_exposure = ((p_exposure * CAPTURE_FRAME_RATE * cap_maxlines) /         (p_maxlines * PREVIEW_FRAME_RATE)) * 6 / 5;    //cap_exp_gain = 1126 * cap_exposure * cap_gain;    cap_exp_gain = cap_exposure * p_gain;  // in night mode, need multiply 2 again.    //cap_exp_gain >>= 9;    if (cap_exp_gain < (long)cap_maxlines * 16) {        cap_exposure = cap_exp_gain / 16;        if (cap_exposure > lines_10ms) {            cap_exposure /= lines_10ms;            cap_exposure *= lines_10ms;        }    } else {        cap_exposure = cap_maxlines;    }    if (0 == cap_exposure) {        cap_exposure = 1;    }    cap_gain = ((cap_exp_gain << 1) / cap_exposure + 1) >> 1;    exp_l = (cap_exposure << 4) & 0xFF;    exp_m = (cap_exposure >> 4) & 0xFF;    exp_h = (cap_exposure >> 12) & 0xFF;    INFO_GREEN("gain:0x%x, expl:0x%x, expm:0x%x, exph:0x%x, cap_maxlines:0x%x\n",         cap_gain, exp_l, exp_m, exp_h, cap_maxlines);        i2cc_set_reg(client, 0x350b, cap_gain);    i2cc_set_reg(client, 0x3502, exp_l);    i2cc_set_reg(client, 0x3501, exp_m);    i2cc_set_reg(client, 0x3500, exp_h);    /*    * add delay-time, to avoid boundary problem between dark and bright    */    mdelay(100);}static int ov5640_set_params(struct i2c_client *client, unsigned int *width,     unsigned int *height, enum v4l2_mbus_pixelcode code){    struct ov5640_priv *priv = to_ov5640(client);    int ret = -EINVAL;    int i;    const struct regval *reg_list = NULL;    int list_len = 0;    /* select format */    priv->cfmt = NULL;    for (i = 0; i < ARRAY_SIZE(ov5640_cfmts); i++) {        if (code == ov5640_cfmts[i].code) {            priv->cfmt = ov5640_cfmts + i;            break;        }    }    if (NULL == priv->cfmt) {        return (ret);    }    /* select win size, now only one, so select directly */    priv->win = select_win(*width, *height);    /* set hardware regs needed */    if (RESV_VGA == priv->win->resv) {        reset_ov5640(client);        /* set default regs */        write_regs(client, ov5640_init_regs, ARRAY_SIZE(ov5640_init_regs));        init_setting_values(priv);    }    switch (priv->win->resv) {        case RESV_XGA: {            reg_list = ov5640_qsxga_to_xga_regs;            list_len = ARRAY_SIZE(ov5640_qsxga_to_xga_regs);            break;        }        case RESV_SXGA: {            reg_list = ov5640_qsxga_to_sxga_regs;            list_len = ARRAY_SIZE(ov5640_qsxga_to_sxga_regs);            break;        }        case RESV_UXGA: {            reg_list = ov5640_qsxga_to_uxga_regs;            list_len = ARRAY_SIZE(ov5640_qsxga_to_uxga_regs);            break;        }        case RESV_QXGA: {            reg_list = ov5640_qsxga_to_qxga_regs;            list_len = ARRAY_SIZE(ov5640_qsxga_to_qxga_regs);            break;        }        case RESV_QSXGA:        default:            break;    }    if (RESV_VGA != priv->win->resv) {        unsigned int preview_exp;        unsigned short preview_maxl;        unsigned short preview_gain;        /* manually set exposure and gain */        i2cc_set_reg(client, 0x3503, 0x07);                get_preview_params(client, &preview_exp, &preview_maxl, &preview_gain);        write_regs(client, ov5640_qsxga_regs, ARRAY_SIZE(ov5640_qsxga_regs));        if (NULL != reg_list) {            write_regs(client, reg_list, list_len);        }        manual_set_exposure_and_gain(client, preview_exp, preview_maxl, preview_gain);            }    *width = priv->win->width;    *height = priv->win->height;    INFO_PURLPLE("ok, params are width:%d-height:%d\n", *width, *height);    return (0);}static int ov5640_g_fmt(struct v4l2_subdev *sd,     struct v4l2_mbus_framefmt *vmf){    struct i2c_client *client = v4l2_get_subdevdata(sd);    struct ov5640_priv *priv = to_ov5640(client);    if (NULL == priv->win || NULL == priv->cfmt) {        unsigned int width = VGA_WIDTH;        unsigned int height = VGA_HEIGHT;        int ret = 0;        ret = ov5640_get_params(client, &width, &height,            V4L2_MBUS_FMT_YUYV8_2X8_BE);        if (ret < 0) {            return (ret);        }    }    vmf->width = priv->win->width;    vmf->height = priv->win->height;    vmf->code = priv->cfmt->code;    vmf->colorspace = priv->cfmt->colorspace;    vmf->field = V4L2_FIELD_NONE;    INFO_GREEN("ok, get fmt w:%dXh:%d-code:%d-csp:%d\n",         vmf->width, vmf->height, vmf->code, vmf->colorspace);    return (0);}static int ov5640_s_fmt(struct v4l2_subdev *sd,			struct v4l2_mbus_framefmt *vmf){	struct i2c_client *client = v4l2_get_subdevdata(sd);	struct ov5640_priv *priv = to_ov5640(client);	int ret = ov5640_set_params(client, &vmf->width, &vmf->height,				    vmf->code);	if (!ret)		vmf->colorspace = priv->cfmt->colorspace;    INFO_PURLPLE("\n");	return (ret);}//  TODO..... modifystatic int ov5640_cropcap(struct v4l2_subdev *sd, struct v4l2_cropcap *vcc){	vcc->bounds.left = OV5640_COLUMN_SKIP;	vcc->bounds.top  = OV5640_ROW_SKIP;	vcc->bounds.width  = OV5640_MAX_WIDTH;	vcc->bounds.height = OV5640_MAX_HEIGHT;	vcc->defrect = vcc->bounds;  /* set default rect. */	vcc->type    = V4L2_BUF_TYPE_VIDEO_CAPTURE;	vcc->pixelaspect.numerator   = 1;	vcc->pixelaspect.denominator = 1;    INFO_PURLPLE("\n");	return (0);}//  TODO..... modifystatic int ov5640_g_crop(struct v4l2_subdev *sd, struct v4l2_crop *vc){	vc->c.left	= 0;	vc->c.top	= 0;	vc->c.width	= QSXGA_WIDTH;	vc->c.height	= QSXGA_HEIGHT;	vc->type		= V4L2_BUF_TYPE_VIDEO_CAPTURE;    INFO_BLUE("\n");	return (0);}static int ov5640_enum_fmt(struct v4l2_subdev *sd, unsigned int index,			   enum v4l2_mbus_pixelcode *code){	if (index >= ARRAY_SIZE(ov5640_cfmts))		return -EINVAL;	*code = ov5640_cfmts[index].code;    OV_INFO("fmt index:%d\n", index);	return 0;}static int ov5640_set_brightness(struct i2c_client *client, int bright){    struct ov5640_priv *priv = to_ov5640(client);    unsigned char reg5587, reg5588;    if (bright < -4 || 4 < bright) {        OV_ERR("brightness - %d is out of range[-4, 4]\n", bright);        return (-ERANGE);    }    if (bright < 0) {        reg5587 = 0x10 * (-bright);        reg5588 = 0x09; /* bit[3] is Y bright sign */    } else {        reg5587 = 0x10 * bright;        reg5588 = 0x01;    }    i2cc_set_reg(client, 0x5001, 0xff);    i2cc_set_reg(client, 0x5587, reg5587);    i2cc_set_reg(client, 0x5580, 0x04);    i2cc_set_reg(client, 0x5588, reg5588);    priv->brightness = bright;    OV_INFO("brightness:%d, reg5587:0x%x, reg5588:0x%x\n",         bright, reg5587, reg5588);    return (0);}static int ov5640_set_contrast(struct i2c_client *client, int contrast){    struct ov5640_priv *priv = to_ov5640(client);    unsigned char y_gain, reg5588;    if (contrast < -4 || 4 < contrast) {        OV_ERR("contrast - %d is out of range[-4, 4]\n", contrast);        return (-ERANGE);    }    if (0 == contrast) {        reg5588 = 0x1;    } else {        reg5588 = 0x41;    }    y_gain = 0x20 + 0x4 * contrast;    i2cc_set_reg(client, 0x5001, 0xff);    i2cc_set_reg(client, 0x5580, 0x04);    i2cc_set_reg(client, 0x5586, y_gain);    i2cc_set_reg(client, 0x5585, y_gain);    i2cc_set_reg(client, 0x5588, reg5588);    priv->contrast = contrast;    OV_INFO("contrast:%d, y_gain:0x%x, reg5588:0x%x\n", contrast, y_gain, reg5588);    return (0);}/* auto, manual seperated is ok?? */static int ov5640_set_saturation(struct i2c_client *client, int saturation){    struct ov5640_priv *priv = to_ov5640(client);    unsigned char uv_max, uv_min, reg5588;    if (saturation < -4 || 4 < saturation) {        OV_ERR("saturation - %d is out of range[-4, 4]\n", saturation);        return (-ERANGE);    }    if (0 == saturation) {  /* different from application notes */        uv_max = 0x40;   /* max value for UV adjust */        uv_min = 0x10;   /* min value for UV adjust */        reg5588 = 0x01;  /* bit[6]==0, auto saturation */    } else {        uv_max = 0x40 + 0x10 * saturation; /* U sat. */        uv_min = uv_max; /* v sat */        reg5588 = 0x41;  /* bit[6]==1, manual saturation */    }    i2cc_set_reg(client, 0x5001, 0xff);  /* init is 0xa3 */    i2cc_set_reg(client, 0x5583, uv_max);    i2cc_set_reg(client, 0x5584, uv_min);    i2cc_set_reg(client, 0x5580, 0x02);  /* bit[1], enable(1)/disabe(0) saturation */    i2cc_set_reg(client, 0x5588, reg5588);     priv->saturation = saturation;    OV_INFO("saturation:%d\n", saturation);    return (0);}/* XXX:effect is reversed to note's picture exept -180. check it */static int ov5640_set_hue(struct i2c_client *client, int hue){    struct ov5640_priv *priv = to_ov5640(client);    unsigned char reg5581, reg5582, reg5588;    switch (hue) {        case -180:            reg5581 = 0x80;            reg5582 = 0x00;            reg5588 = 0x32;            break;        case -150:            reg5581 = 0x6f;            reg5582 = 0x40;            reg5588 = 0x32;            break;        case -120:            reg5581 = 0x40;            reg5582 = 0x6f;            reg5588 = 0x32;            break;        case -90:            reg5581 = 0x00;            reg5582 = 0x80;            reg5588 = 0x02;            break;        case -60:            reg5581 = 0x40;            reg5582 = 0x6f;            reg5588 = 0x02;            break;        case -30:            reg5581 = 0x6f;            reg5582 = 0x40;            reg5588 = 0x02;            break;        case 0:            reg5581 = 0x80;            reg5582 = 0x00;            reg5588 = 0x01;            break;        case 30:            reg5581 = 0x6f;            reg5582 = 0x40;            reg5588 = 0x01;            break;        case 60:            reg5581 = 0x40;            reg5582 = 0x6f;            reg5588 = 0x01;            break;        case 90:            reg5581 = 0x00;            reg5582 = 0x80;            reg5588 = 0x31;            break;        case 120:            reg5581 = 0x40;            reg5582 = 0x6f;            reg5588 = 0x31;            break;        case 150:            reg5581 = 0x6f;            reg5582 = 0x40;            reg5588 = 0x31;            break;        default:            OV_ERR("hue - %d is out of range[-180, 150]/step-30\n", hue);            return (-ERANGE);    }    i2cc_set_reg(client, 0x5001, 0xff);    i2cc_set_reg(client, 0x5580, 0x01);  /* XXXX:diff. from defualt value */    i2cc_set_reg(client, 0x5581, reg5581);  /* hue cos coefficient */    i2cc_set_reg(client, 0x5582, reg5582);  /* hue sin coefficient */    i2cc_set_reg(client, 0x5588, reg5588);    priv->hue = hue;    OV_INFO("hue: %d, 5581:0x%x, 5582:0x%x, 5588:0x%x\n",         hue, reg5581, reg5582, reg5588);    return (0);}/* default value here is different from init one. */static int ov5640_set_exposure_level(struct i2c_client *client, int level){    struct ov5640_priv *priv = to_ov5640(client);    unsigned char reg3a0f, reg3a10;    unsigned char reg3a1b, reg3a1e;    unsigned char reg3a11, reg3a1f;    reg3a0f = 0x38 + 0x8 * level;    reg3a10 = 0x30 + 0x8 * level;    reg3a1b = reg3a0f;    reg3a1e = reg3a10;    reg3a1f = 0x10;    switch (level) {        case -5:  /* -1.7EV */            reg3a11 = 0x20;            break;        case -4:  /* -1.3EV */

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产无一区二区| 91麻豆精品国产无毒不卡在线观看| 久久久噜噜噜久久中文字幕色伊伊| 日本成人在线电影网| 欧美高清一级片在线| 麻豆久久久久久久| 精品欧美黑人一区二区三区| 国产综合色视频| 国产精品嫩草影院av蜜臀| 99精品在线观看视频| 亚洲欧美日韩系列| 在线不卡免费欧美| 黄页网站大全一区二区| 国产精品免费视频观看| 欧洲一区二区三区在线| 免费欧美日韩国产三级电影| 26uuu色噜噜精品一区二区| 成人一区二区三区中文字幕| 亚洲人成精品久久久久| 91精品国产色综合久久| 国产成人精品亚洲午夜麻豆| 亚洲精选视频免费看| 91精品一区二区三区久久久久久 | 一个色妞综合视频在线观看| 欧美人狂配大交3d怪物一区| 国产一区二区h| 一区二区久久久| 亚洲精品一区二区三区精华液| 成人午夜视频福利| 三级精品在线观看| 国产日韩精品一区二区浪潮av| 91久久精品国产91性色tv| 麻豆精品视频在线观看| 一区二区三区在线观看视频| 欧美va亚洲va在线观看蝴蝶网| 91影视在线播放| 免费在线观看视频一区| 亚洲天天做日日做天天谢日日欢 | 日本视频一区二区| 国产精品传媒在线| 日韩欧美国产精品| 91成人在线观看喷潮| 国产高清一区日本| 五月天激情小说综合| 国产精品国产三级国产三级人妇| 欧美一区二区女人| 欧美午夜在线一二页| 成人美女视频在线观看18| 日本中文字幕不卡| 亚洲福利视频一区二区| 国产精品情趣视频| 欧美va亚洲va| 制服视频三区第一页精品| 91视频.com| 成人免费黄色大片| 国产乱码精品一区二区三区av| 午夜精品久久久久久久久久| 亚洲男人的天堂在线观看| 久久久99精品久久| 日韩精品一区二区三区在线播放| 在线视频亚洲一区| 在线视频综合导航| 91免费看`日韩一区二区| 成人av在线观| 从欧美一区二区三区| 国产精品综合久久| 国产在线视频精品一区| 紧缚奴在线一区二区三区| 日韩电影在线免费看| 五月激情综合婷婷| 视频在线观看一区| 日韩精品欧美精品| 日韩不卡一区二区| 午夜欧美视频在线观看| 亚洲不卡av一区二区三区| 午夜日韩在线电影| 蜜臀av性久久久久av蜜臀妖精| 三级精品在线观看| 久久精品国产99国产| 久久99精品国产91久久来源| 久久99久久久久久久久久久| 精品一区二区三区免费观看| 狠狠色丁香久久婷婷综合_中| 精品在线你懂的| 久久99精品久久久久久| 粉嫩av一区二区三区粉嫩 | 色综合天天综合在线视频| 色哦色哦哦色天天综合| 欧美中文字幕久久| 欧美疯狂性受xxxxx喷水图片| 91精品国产一区二区三区| 日韩女优视频免费观看| 2024国产精品| 亚洲蜜臀av乱码久久精品蜜桃| 亚洲国产日日夜夜| 麻豆精品一区二区av白丝在线| 激情综合网最新| 成人a免费在线看| 在线亚洲高清视频| 欧美刺激脚交jootjob| 国产精品拍天天在线| 一区二区三区在线免费视频| 日韩精品五月天| 岛国精品一区二区| 欧美色精品在线视频| ww久久中文字幕| 亚洲男人都懂的| 老司机精品视频线观看86| 成人黄色小视频在线观看| 在线观看一区不卡| 2021中文字幕一区亚洲| 亚洲视频一区在线| 老鸭窝一区二区久久精品| 99久久精品免费观看| 91精品久久久久久久久99蜜臂| 久久人人爽爽爽人久久久| 亚洲精品欧美激情| 精品一区二区三区蜜桃| 91麻豆国产自产在线观看| 日韩欧美二区三区| 亚洲人成影院在线观看| 久久成人久久鬼色| 色综合天天综合网国产成人综合天| 欧美美女激情18p| 国产精品久久毛片a| 毛片基地黄久久久久久天堂| 国产欧美精品一区| 极品少妇xxxx精品少妇| 成人开心网精品视频| 日韩精品一区二区三区四区| 丝袜美腿亚洲综合| 国产成人午夜精品影院观看视频 | 亚洲桃色在线一区| 色综合视频在线观看| 成人一级视频在线观看| 国产精品一级在线| 在线电影院国产精品| 国产精品国产三级国产普通话蜜臀 | 热久久国产精品| 成人免费高清在线| 欧美另类变人与禽xxxxx| 国产片一区二区| 亚洲国产精品久久久久婷婷884| 美女久久久精品| 成人av网在线| 欧美精品一卡二卡| 国产精品久久午夜| 久久99精品国产麻豆婷婷洗澡| 色综合久久中文综合久久97 | 一区二区三区精品视频| 另类的小说在线视频另类成人小视频在线| 国产成人免费视频一区| 日韩欧美一级在线播放| 一区二区三区在线不卡| 国产成人超碰人人澡人人澡| 欧美日韩国产一级片| 亚洲欧美一区二区视频| 美女任你摸久久| 欧美三级电影网| 中文字幕一区二区三区四区不卡| 亚洲电影视频在线| 欧美色图免费看| 亚洲精品欧美综合四区| av电影在线不卡| 国产日韩欧美综合在线| 成人午夜精品在线| 精品国产在天天线2019| 日韩av午夜在线观看| 色综合网色综合| 亚洲一卡二卡三卡四卡无卡久久| 岛国av在线一区| 国产午夜精品美女毛片视频| 日韩精品午夜视频| 欧美xingq一区二区| 免费一级欧美片在线观看| 欧美日韩免费电影| 亚洲一区二区三区视频在线| 欧美日韩激情一区二区三区| 亚洲自拍都市欧美小说| 一本到不卡免费一区二区| 精品国产污污免费网站入口| 国产精品911| 久久这里只有精品视频网| 免费观看成人av| 精品成人在线观看| 国产精品自拍网站| 久久女同精品一区二区| 99re在线精品| 中文字幕佐山爱一区二区免费| jvid福利写真一区二区三区| 国产精品天干天干在观线| 色综合天天性综合| 伊人婷婷欧美激情| 日本韩国一区二区三区视频| 一区二区三区四区不卡在线 | 一区二区三区日韩欧美精品| aaa亚洲精品一二三区| 亚洲欧洲国产日韩| 欧美一区二区人人喊爽| 国产一区二区三区蝌蚪|