camera: support query framerate and support detect framerate, version update to v0.1.5

This commit is contained in:
ddl
2011-12-02 17:34:39 +08:00
parent b72f913211
commit 718210a8e0
5 changed files with 273 additions and 36 deletions

View File

@@ -81,6 +81,13 @@
#define CONFIG_SENSOR_POWERDNACTIVE_LEVEL_0 RK29_CAM_POWERDNACTIVE_H
#define CONFIG_SENSOR_FLASHACTIVE_LEVEL_0 RK29_CAM_FLASHACTIVE_L
#define CONFIG_SENSOR_QCIF_FPS_FIXED_0 15
#define CONFIG_SENSOR_QVGA_FPS_FIXED_0 15
#define CONFIG_SENSOR_CIF_FPS_FIXED_0 15
#define CONFIG_SENSOR_VGA_FPS_FIXED_0 15
#define CONFIG_SENSOR_SVGA_FPS_FIXED_0 15
#define CONFIG_SENSOR_720P_FPS_FIXED_0 30
#define CONFIG_SENSOR_1 RK29_CAM_SENSOR_OV2659 /* front camera sensor */
#define CONFIG_SENSOR_IIC_ADDR_1 0x60
#define CONFIG_SENSOR_IIC_ADAPTER_ID_1 1
@@ -93,6 +100,14 @@
#define CONFIG_SENSOR_RESETACTIVE_LEVEL_1 RK29_CAM_RESETACTIVE_L
#define CONFIG_SENSOR_POWERDNACTIVE_LEVEL_1 RK29_CAM_POWERDNACTIVE_H
#define CONFIG_SENSOR_FLASHACTIVE_LEVEL_1 RK29_CAM_FLASHACTIVE_L
#define CONFIG_SENSOR_QCIF_FPS_FIXED_1 15
#define CONFIG_SENSOR_QVGA_FPS_FIXED_1 15
#define CONFIG_SENSOR_CIF_FPS_FIXED_1 15
#define CONFIG_SENSOR_VGA_FPS_FIXED_1 15
#define CONFIG_SENSOR_SVGA_FPS_FIXED_1 15
#define CONFIG_SENSOR_720P_FPS_FIXED_1 30
#endif //#ifdef CONFIG_VIDEO_RK29
/*---------------- Camera Sensor Configuration Macro End------------------------*/
#include "../../../drivers/media/video/rk29_camera.c"

View File

@@ -97,6 +97,13 @@
#define CONFIG_SENSOR_POWERDNACTIVE_LEVEL_0 RK29_CAM_POWERDNACTIVE_H
#define CONFIG_SENSOR_FLASHACTIVE_LEVEL_0 RK29_CAM_FLASHACTIVE_L
#define CONFIG_SENSOR_QCIF_FPS_FIXED_0 15
#define CONFIG_SENSOR_QVGA_FPS_FIXED_0 15
#define CONFIG_SENSOR_CIF_FPS_FIXED_0 15
#define CONFIG_SENSOR_VGA_FPS_FIXED_0 15
#define CONFIG_SENSOR_SVGA_FPS_FIXED_0 15
#define CONFIG_SENSOR_720P_FPS_FIXED_0 30
#define CONFIG_SENSOR_1 RK29_CAM_SENSOR_OV2659 /* front camera sensor */
#define CONFIG_SENSOR_IIC_ADDR_1 0x60
#define CONFIG_SENSOR_IIC_ADAPTER_ID_1 1
@@ -109,6 +116,14 @@
#define CONFIG_SENSOR_RESETACTIVE_LEVEL_1 RK29_CAM_RESETACTIVE_L
#define CONFIG_SENSOR_POWERDNACTIVE_LEVEL_1 RK29_CAM_POWERDNACTIVE_H
#define CONFIG_SENSOR_FLASHACTIVE_LEVEL_1 RK29_CAM_FLASHACTIVE_L
#define CONFIG_SENSOR_QCIF_FPS_FIXED_1 15
#define CONFIG_SENSOR_QVGA_FPS_FIXED_1 15
#define CONFIG_SENSOR_CIF_FPS_FIXED_1 15
#define CONFIG_SENSOR_VGA_FPS_FIXED_1 15
#define CONFIG_SENSOR_SVGA_FPS_FIXED_1 15
#define CONFIG_SENSOR_720P_FPS_FIXED_1 30
#endif //#ifdef CONFIG_VIDEO_RK29
/*---------------- Camera Sensor Configuration Macro End------------------------*/
#include "../../../drivers/media/video/rk29_camera.c"

View File

@@ -22,6 +22,8 @@
#ifndef __ASM_ARCH_CAMERA_H_
#define __ASM_ARCH_CAMERA_H_
#include <linux/videodev2.h>
#define RK29_CAM_DRV_NAME "rk29xx-camera"
#define RK29_CAM_PLATFORM_DEV_ID 33
@@ -160,7 +162,7 @@ struct rk29camera_gpio_res {
unsigned int gpio_flash;
unsigned int gpio_flag;
unsigned int gpio_init;
unsigned int orientation;
const char *dev_name;
};
@@ -169,12 +171,18 @@ struct rk29camera_mem_res {
unsigned int start;
unsigned int size;
};
struct rk29camera_info {
const char *dev_name;
unsigned int orientation;
struct v4l2_frmivalenum fival[10];
};
struct rk29camera_platform_data {
int (*io_init)(void);
int (*io_deinit)(int sensor);
int (*sensor_ioctrl)(struct device *dev,enum rk29camera_ioctrl_cmd cmd,int on);
struct rk29camera_gpio_res gpio_res[2];
struct rk29camera_mem_res meminfo;
struct rk29camera_info info[2];
};
struct rk29camera_platform_ioctl_cb {

View File

@@ -96,8 +96,7 @@ static struct rk29camera_platform_data rk29_camera_platform_data = {
.gpio_powerdown = CONFIG_SENSOR_POWERDN_PIN_0,
.gpio_flash = CONFIG_SENSOR_FALSH_PIN_0,
.gpio_flag = (CONFIG_SENSOR_POWERACTIVE_LEVEL_0|CONFIG_SENSOR_RESETACTIVE_LEVEL_0|CONFIG_SENSOR_POWERDNACTIVE_LEVEL_0|CONFIG_SENSOR_FLASHACTIVE_LEVEL_0),
.gpio_init = 0,
.orientation = CONFIG_SENSOR_ORIENTATION_0,
.gpio_init = 0,
.dev_name = SENSOR_DEVICE_NAME_0,
}, {
.gpio_reset = CONFIG_SENSOR_RESET_PIN_1,
@@ -106,7 +105,6 @@ static struct rk29camera_platform_data rk29_camera_platform_data = {
.gpio_flash = CONFIG_SENSOR_FALSH_PIN_1,
.gpio_flag = (CONFIG_SENSOR_POWERACTIVE_LEVEL_1|CONFIG_SENSOR_RESETACTIVE_LEVEL_1|CONFIG_SENSOR_POWERDNACTIVE_LEVEL_1|CONFIG_SENSOR_FLASHACTIVE_LEVEL_1),
.gpio_init = 0,
.orientation = CONFIG_SENSOR_ORIENTATION_1,
.dev_name = SENSOR_DEVICE_NAME_1,
}
},
@@ -115,8 +113,17 @@ static struct rk29camera_platform_data rk29_camera_platform_data = {
.name = "camera_ipp_mem",
.start = MEM_CAMIPP_BASE,
.size = MEM_CAMIPP_SIZE,
}
},
#endif
.info = {
{
.dev_name = SENSOR_DEVICE_NAME_0,
.orientation = CONFIG_SENSOR_ORIENTATION_0,
},{
.dev_name = SENSOR_DEVICE_NAME_1,
.orientation = CONFIG_SENSOR_ORIENTATION_1,
}
}
};
static int rk29_sensor_iomux(int pin)
@@ -1216,7 +1223,7 @@ static int sensor_flash_default_cb (struct rk29camera_gpio_res *res, int on)
static int rk29_sensor_io_init(void)
{
int ret = 0, i;
int ret = 0, i,j;
unsigned int camera_reset = INVALID_GPIO, camera_power = INVALID_GPIO;
unsigned int camera_powerdown = INVALID_GPIO, camera_flash = INVALID_GPIO;
unsigned int camera_ioflag;
@@ -1322,7 +1329,149 @@ static int rk29_sensor_io_init(void)
dprintk("%s....flash pin(%d) init success(0x%x) \n",__FUNCTION__,camera_flash,((camera_ioflag&RK29_CAM_FLASHACTIVE_MASK)>>RK29_CAM_FLASHACTIVE_BITPOS));
}
for (j=0; j<10; j++) {
memset(&rk29_camera_platform_data.info[i].fival[j],0x00,sizeof(struct v4l2_frmivalenum));
}
j=0;
if (strstr(rk29_camera_platform_data.info[i].dev_name,"_back")) {
#if CONFIG_SENSOR_QCIF_FPS_FIXED_0
rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_QCIF_FPS_FIXED_0;
rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1;
rk29_camera_platform_data.info[i].fival[j].index = 0;
rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;
rk29_camera_platform_data.info[i].fival[j].width = 176;
rk29_camera_platform_data.info[i].fival[j].height = 144;
rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;
j++;
#endif
#if CONFIG_SENSOR_QVGA_FPS_FIXED_0
rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_QVGA_FPS_FIXED_0;
rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1;
rk29_camera_platform_data.info[i].fival[j].index = 0;
rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;
rk29_camera_platform_data.info[i].fival[j].width = 320;
rk29_camera_platform_data.info[i].fival[j].height = 240;
rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;
j++;
#endif
#if CONFIG_SENSOR_CIF_FPS_FIXED_0
rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_CIF_FPS_FIXED_0;
rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1;
rk29_camera_platform_data.info[i].fival[j].index = 0;
rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;
rk29_camera_platform_data.info[i].fival[j].width = 352;
rk29_camera_platform_data.info[i].fival[j].height = 288;
rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;
j++;
#endif
#if CONFIG_SENSOR_VGA_FPS_FIXED_0
rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_VGA_FPS_FIXED_0;
rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1;
rk29_camera_platform_data.info[i].fival[j].index = 0;
rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;
rk29_camera_platform_data.info[i].fival[j].width = 640;
rk29_camera_platform_data.info[i].fival[j].height = 480;
rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;
j++;
#endif
#if CONFIG_SENSOR_SVGA_FPS_FIXED_0
rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_SVGA_FPS_FIXED_0;
rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1;
rk29_camera_platform_data.info[i].fival[j].index = 0;
rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;
rk29_camera_platform_data.info[i].fival[j].width = 800;
rk29_camera_platform_data.info[i].fival[j].height = 600;
rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;
j++;
#endif
#if CONFIG_SENSOR_720P_FPS_FIXED_0
rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_720P_FPS_FIXED_0;
rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1;
rk29_camera_platform_data.info[i].fival[j].index = 0;
rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;
rk29_camera_platform_data.info[i].fival[j].width = 1280;
rk29_camera_platform_data.info[i].fival[j].height = 720;
rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;
j++;
#endif
} else {
#if CONFIG_SENSOR_QCIF_FPS_FIXED_1
rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_QCIF_FPS_FIXED_1;
rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1;
rk29_camera_platform_data.info[i].fival[j].index = 0;
rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;
rk29_camera_platform_data.info[i].fival[j].width = 176;
rk29_camera_platform_data.info[i].fival[j].height = 144;
rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;
j++;
#endif
#if CONFIG_SENSOR_QVGA_FPS_FIXED_1
rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_QVGA_FPS_FIXED_1;
rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1;
rk29_camera_platform_data.info[i].fival[j].index = 0;
rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;
rk29_camera_platform_data.info[i].fival[j].width = 320;
rk29_camera_platform_data.info[i].fival[j].height = 240;
rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;
j++;
#endif
#if CONFIG_SENSOR_CIF_FPS_FIXED_1
rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_CIF_FPS_FIXED_1;
rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1;
rk29_camera_platform_data.info[i].fival[j].index = 0;
rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;
rk29_camera_platform_data.info[i].fival[j].width = 352;
rk29_camera_platform_data.info[i].fival[j].height = 288;
rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;
j++;
#endif
#if CONFIG_SENSOR_VGA_FPS_FIXED_1
rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_VGA_FPS_FIXED_1;
rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1;
rk29_camera_platform_data.info[i].fival[j].index = 0;
rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;
rk29_camera_platform_data.info[i].fival[j].width = 640;
rk29_camera_platform_data.info[i].fival[j].height = 480;
rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;
j++;
#endif
#if CONFIG_SENSOR_SVGA_FPS_FIXED_1
rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_SVGA_FPS_FIXED_1;
rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1;
rk29_camera_platform_data.info[i].fival[j].index = 0;
rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;
rk29_camera_platform_data.info[i].fival[j].width = 800;
rk29_camera_platform_data.info[i].fival[j].height = 600;
rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;
j++;
#endif
#if CONFIG_SENSOR_720P_FPS_FIXED_1
rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_720P_FPS_FIXED_1;
rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1;
rk29_camera_platform_data.info[i].fival[j].index = 0;
rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;
rk29_camera_platform_data.info[i].fival[j].width = 1280;
rk29_camera_platform_data.info[i].fival[j].height = 720;
rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;
j++;
#endif
}
continue;
sensor_io_int_loop_end:
rk29_sensor_io_deinit(i);

View File

@@ -137,13 +137,18 @@ module_param(debug, int, S_IRUGO|S_IWUSR);
//Configure Macro
/*
* Driver Version Note
*v0.0.1 : this driver first support rk2918;
*v0.0.2 : fix this driver support v4l2 format is V4L2_PIX_FMT_NV12 and V4L2_PIX_FMT_NV16,is not V4L2_PIX_FMT_YUV420
*
*v0.0.x : this driver is 2.6.32 kernel driver;
*v0.1.x : this driver is 3.0.8 kernel driver;
*
*v0.x.1 : this driver first support rk2918;
*v0.x.2 : fix this driver support v4l2 format is V4L2_PIX_FMT_NV12 and V4L2_PIX_FMT_NV16,is not V4L2_PIX_FMT_YUV420
* and V4L2_PIX_FMT_YUV422P;
*v0.0.3 : this driver support VIDIOC_ENUM_FRAMEINTERVALS;
*v0.0.4 : this driver support digital zoom;
*v0.x.3 : this driver support VIDIOC_ENUM_FRAMEINTERVALS;
*v0.x.4 : this driver support digital zoom;
*v0.x.5 : this driver support test framerate and query framerate from board file configuration;
*/
#define RK29_CAM_VERSION_CODE KERNEL_VERSION(0, 1, 3)
#define RK29_CAM_VERSION_CODE KERNEL_VERSION(0, 1, 5)
/* limit to rk29 hardware capabilities */
#define RK29_CAM_BUS_PARAM (SOCAM_MASTER |\
@@ -1532,10 +1537,10 @@ static int rk29_camera_querycap(struct soc_camera_host *ici,
char orientation[5];
strlcpy(cap->card, dev_name(pcdev->icd->pdev), sizeof(cap->card));
if (strcmp(dev_name(pcdev->icd->pdev), pcdev->pdata->gpio_res[0].dev_name) == 0) {
sprintf(orientation,"-%d",pcdev->pdata->gpio_res[0].orientation);
if (strcmp(dev_name(pcdev->icd->pdev), pcdev->pdata->info[0].dev_name) == 0) {
sprintf(orientation,"-%d",pcdev->pdata->info[0].orientation);
} else {
sprintf(orientation,"-%d",pcdev->pdata->gpio_res[1].orientation);
sprintf(orientation,"-%d",pcdev->pdata->info[1].orientation);
}
strcat(cap->card,orientation);
cap->version = RK29_CAM_VERSION_CODE;
@@ -1749,35 +1754,80 @@ int rk29_camera_enum_frameintervals(struct soc_camera_device *icd, struct v4l2_f
struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
struct rk29_camera_dev *pcdev = ici->priv;
struct rk29_camera_frmivalenum *fival_list = NULL;
int i,ret = 0;
struct v4l2_frmivalenum *fival_head;
int i,ret = 0,index;
for (i=0; i<2; i++) {
if (pcdev->icd_frmival[i].icd == icd) {
fival_list = pcdev->icd_frmival[i].fival_list;
}
}
if (fival_list != NULL) {
i = 0;
while (fival_list != NULL) {
if ((fival->pixel_format == fival_list->fival.pixel_format)
&& (fival->height == fival_list->fival.height)
&& (fival->width == fival_list->fival.width)) {
if (i == fival->index)
break;
i++;
}
fival_list = fival_list->nxt;
index = fival->index & 0x00ffffff;
if ((fival->index & 0xff000000) == 0xff000000) { /* ddl@rock-chips.com: detect framerate */
for (i=0; i<2; i++) {
if (pcdev->icd_frmival[i].icd == icd) {
fival_list = pcdev->icd_frmival[i].fival_list;
}
}
if ((i==fival->index) && (fival_list != NULL)) {
memcpy(fival, &fival_list->fival, sizeof(struct v4l2_frmivalenum));
if (fival_list != NULL) {
i = 0;
while (fival_list != NULL) {
if ((fival->pixel_format == fival_list->fival.pixel_format)
&& (fival->height == fival_list->fival.height)
&& (fival->width == fival_list->fival.width)) {
if (i == index)
break;
i++;
}
fival_list = fival_list->nxt;
}
if ((i==index) && (fival_list != NULL)) {
memcpy(fival, &fival_list->fival, sizeof(struct v4l2_frmivalenum));
} else {
ret = -EINVAL;
}
} else {
RK29CAMERA_TR("%s: fival_list is NULL\n",__FUNCTION__);
ret = -EINVAL;
}
} else {
RK29CAMERA_TR("%s: fival_list is NULL\n",__FUNCTION__);
ret = -EINVAL;
if (strcmp(dev_name(pcdev->icd->pdev),pcdev->pdata->info[0].dev_name) == 0) {
fival_head = pcdev->pdata->info[0].fival;
} else {
fival_head = pcdev->pdata->info[1].fival;
}
i = 0;
while (fival_head->width && fival_head->height) {
if ((fival->pixel_format == fival_head->pixel_format)
&& (fival->height == fival_head->height)
&& (fival->width == fival_head->width)) {
if (i == index) {
break;
}
i++;
}
fival_head++;
}
if ((i == index) && (fival->height == fival_head->height) && (fival->width == fival_head->width)) {
memcpy(fival, fival_head, sizeof(struct v4l2_frmivalenum));
RK29CAMERA_DG("%s %dx%d@%c%c%c%c framerate : %d/%d\n", dev_name(&rk29_camdev_info_ptr->icd->dev),
fival->width, fival->height,
fival->pixel_format & 0xFF, (fival->pixel_format >> 8) & 0xFF,
(fival->pixel_format >> 16) & 0xFF, (fival->pixel_format >> 24),
fival->discrete.denominator,fival->discrete.numerator);
} else {
if (index == 0)
RK29CAMERA_TR("%s have not catch %d%d@%c%c%c%c index(%d) framerate\n",dev_name(&rk29_camdev_info_ptr->icd->dev),
fival->width,fival->height,
fival->pixel_format & 0xFF, (fival->pixel_format >> 8) & 0xFF,
(fival->pixel_format >> 16) & 0xFF, (fival->pixel_format >> 24),
index);
else
RK29CAMERA_DG("%s have not catch %d%d@%c%c%c%c index(%d) framerate\n",dev_name(&rk29_camdev_info_ptr->icd->dev),
fival->width,fival->height,
fival->pixel_format & 0xFF, (fival->pixel_format >> 8) & 0xFF,
(fival->pixel_format >> 16) & 0xFF, (fival->pixel_format >> 24),
index);
ret = -EINVAL;
}
}
return ret;