目前在移植android下面的camera 现在大部分工作已经做完,想写一下自己的移植心得。。。。
首先要把一个型号的camera的移植到android的4.0上面,我认为应该要了解以下几点:
gpio_direction_output(S5PV210_GPH2(2), 1); msleep(20); gpio_direction_output(S5PV210_GPH2(2), 0); msleep(500);
void s3c_fimc0_cfg_gpio(struct platform_device *pdev) { int i = 0; /* CAM A port(b0010) : PCLK, VSYNC, HREF, DATA[0-4] */ for (i = 0; i < 8; i++) { s3c_gpio_cfgpin(S5PV210_GPE0(i), S3C_GPIO_SFN(2)); s3c_gpio_setpull(S5PV210_GPE0(i), S3C_GPIO_PULL_NONE); } /* CAM A port(b0010) : DATA[5-7], CLKOUT(MIPI CAM also), FIELD */ for (i = 0; i < 5; i++) { //主要是这个 s3c_gpio_cfgpin(S5PV210_GPE1(i), S3C_GPIO_SFN(2));//把GPIO_E1配置为clk的输出模式 s3c_gpio_setpull(S5PV210_GPE1(i), S3C_GPIO_PULL_NONE); } 。。。。。
4:有关camera的架构和流程我这里就不多说了 有兴趣的朋友可以看看我的另两篇博文
S5PC100平台上Linux Camera驱动开发详解(一)
这两篇博文对camera的架构有详细的讲解
开始说说对kenel里面的camera的配置吧
arch/arm/mach-s5pv210 里面的 mach-smdkv210.c有一段关于camera的配置 是这样的
static struct ut2055_platform_data ut2055_plat = { .default_width = 640, .default_height = 480, .pixelformat = V4L2_PIX_FMT_YUYV, .freq = 24000000, //48000000, // what1 .is_mipi = 0, }; static struct i2c_board_info ut2055_i2c_info = { I2C_BOARD_INFO("UT2055", 0x22 >> 1), .platform_data = &ut2055_plat, }; static struct s3c_platform_camera ut2055 = { .id = CAMERA_PAR_A, .type = CAM_TYPE_ITU, .fmt = ITU_601_YCBCR422_8BIT, .order422 = CAM_ORDER422_8BIT_YCBYCR,// hi253,hi704 // .order422 = CAM_ORDER422_8BIT_CBYCRY,// hm2055,gc0308 .i2c_busnum = 1, .info = &ut2055_i2c_info, .pixelformat = V4L2_PIX_FMT_YUYV, .srclk_name = "mout_mpll", .clk_name = "sclk_cam1", .clk_rate = 24000000, //48000000, /* 24MHz */ .line_length = 1600, /* 640*480 */ /* default resol for preview kind of thing */ .width = 640, .height = 480, .window = { .left = 0, .top = 0, .width = 640, .height = 480, }, /* Polarity */ .inv_pclk = 0, .inv_vsync = 1, .inv_href = 0, .inv_hsync = 0, .initialized = 0, .cam_power = ut_cam0_power, };
static struct s3c_platform_fimc fimc_plat_lsi = { .srclk_name = "mout_mpll", .clk_name = "sclk_fimc", .lclk_name = "fimc", .clk_rate = 166750000, .default_cam = CAMERA_PAR_A, .camera = { &ut2055, &ut2055, }, .hw_ver = 0x43, };
5::主要的核心代码:drivers/media/video 里面需要添加 ut2055.c 和 ut2055.h
由于代码量比较大 这里我就不贴出来了
6:drivers/media/video/samsung/fimc 这个路径的两个文件也是很重要的
比如:
fimc_capture.c 这个文件 的一个函数 比如:
int fimc_enum_input(struct file *file, void *fh, struct v4l2_input *inp) { struct fimc_global *fimc = get_fimc_dev(); struct fimc_control *ctrl = ((struct fimc_prv_data *)fh)->ctrl; fimc_dbg("%s: index %d\n", __func__, inp->index); if (inp->index < 0 || inp->index >= FIMC_MAXCAMS) { return -EINVAL; } gCameraId = inp->index;//这句话得目的是获取camera的id 也就是上层传先来的是camear 0 或是 camera 1 这样就知道你打开的是前置或是后置了,在ut2055.c里面就好区分了。 if (!fimc->camera_isvalid[inp->index]) { printk(" ::::fimc_enum_input erro:\n"); //如果你的camera是双的话 没有在第4歩的fimc_plat_lsi 里面的camera 的数组有两个&ut2055,的话打开camera 1 的时候 通常是前置camera 会进入这个错误的。 return -EINVAL; } strcpy(inp->name, fimc->camera[inp->index].info->type); inp->type = V4L2_INPUT_TYPE_CAMERA; return 0; }fimc_regs.c这个文件 的一个函数 比如:
extern int camera_Ycbcr_type; //这个变量是在ut2055.c文件里面又定义 和赋值 比如我检测到的camera是hi253,hi704 哪就是给camera_Ycbcr_type = 1;hm2055 gc0308 的是0 ,不同的camera的配置不一样的,在前面我说过了。 int fimc_hwset_camera_source(struct fimc_control *ctrl) { struct s3c_platform_camera *cam = ctrl->cam; u32 cfg = 0; /* for now, we support only ITU601 8 bit mode */ if (camera_Ycbcr_type) cam->order422 = CAM_ORDER422_8BIT_YCBYCR; else cam->order422 = CAM_ORDER422_8BIT_CBYCRY; /* for now, we support only ITU601 8 bit mode */ cfg |= S3C_CISRCFMT_ITU601_8BIT; cfg |= cam->order422; if (cam->type == CAM_TYPE_ITU) cfg |= cam->fmt; cfg |= S3C_CISRCFMT_SOURCEHSIZE(cam->width); cfg |= S3C_CISRCFMT_SOURCEVSIZE(cam->height); writel(cfg, ctrl->regs + S3C_CISRCFMT); return 0; }7:还有一个文件是不可少的:
/* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. */ struct ut2055_platform_data { unsigned int default_width; unsigned int default_height; unsigned int pixelformat; int freq; /* MCLK in KHz */ /* This SoC supports Parallel & CSI-2 */ int is_mipi; };这个文件要在