camera rk3066b: add support rk3066b cif, version update to v0.2.15

This commit is contained in:
ddl
2012-09-05 17:33:48 +08:00
parent 7d31697362
commit e97edeeee4
6 changed files with 104 additions and 33 deletions

View File

@@ -21,7 +21,7 @@
#ifndef __ASM_ARCH_CAMERA_RK29_H_
#define __ASM_ARCH_CAMERA_RK29_H_
#define RK29_CAM_DRV_NAME "rk-camera-rk29"
#define RK29_CAM_DRV_NAME "rk29-camera"
#include <plat/rk_camera.h>

View File

@@ -22,17 +22,18 @@
#define __ASM_ARCH_CAMERA_RK30_H_
#if defined(CONFIG_ARCH_RK3066B)
#define RK29_CAM_DRV_NAME "rk-camera-rk3066b"
#define RK29_CAM_DRV_NAME "rk3066b-camera"
#define RK_SUPPORT_CIF0 1
#define RK_SUPPORT_CIF1 0
#elif defined(CONFIG_ARCH_RK30)
#define RK29_CAM_DRV_NAME "rk-camera-rk30"
#define RK29_CAM_DRV_NAME "rk30-camera"
#define RK_SUPPORT_CIF0 1
#define RK_SUPPORT_CIF1 1
#endif
#include <plat/rk_camera.h>
#define CONFIG_CAMERA_INPUT_FMT_SUPPORT (RK_CAM_INPUT_FMT_YUV422)
#define CONFIG_CAMERA_SCALE_CROP_MACHINE RK_CAM_SCALE_CROP_IPP
#if (CONFIG_CAMERA_SCALE_CROP_MACHINE==RK_CAM_SCALE_CROP_ARM)

View File

@@ -160,6 +160,10 @@
#define RK_CAM_SCALE_CROP_RGA 2
#define RK_CAM_SCALE_CROP_PP 3
#define RK_CAM_INPUT_FMT_YUV422 (1<<0)
#define RK_CAM_INPUT_FMT_RAW10 (1<<1)
#define RK_CAM_INPUT_FMT_RAW12 (1<<2)
/* v4l2_subdev_core_ops.ioctl ioctl_cmd macro */
#define RK29_CAM_SUBDEV_ACTIVATE 0x00
#define RK29_CAM_SUBDEV_DEACTIVATE 0x01

View File

@@ -311,6 +311,7 @@ static struct rk29camera_platform_data rk_camera_platform_data = {
.gpio_res = {
{
#if CONFIG_SENSOR_IIC_ADDR_0
.gpio_reset = CONFIG_SENSOR_RESET_PIN_0,
.gpio_power = CONFIG_SENSOR_POWER_PIN_0,
.gpio_powerdown = CONFIG_SENSOR_POWERDN_PIN_0,
@@ -318,7 +319,17 @@ static struct rk29camera_platform_data rk_camera_platform_data = {
.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,
.dev_name = SENSOR_DEVICE_NAME_0,
#else
.gpio_reset = INVALID_GPIO,
.gpio_power = INVALID_GPIO,
.gpio_powerdown = INVALID_GPIO,
.gpio_flash = INVALID_GPIO,
.gpio_flag = 0,
.gpio_init = 0,
.dev_name = NULL,
#endif
}, {
#if CONFIG_SENSOR_IIC_ADDR_1
.gpio_reset = CONFIG_SENSOR_RESET_PIN_1,
.gpio_power = CONFIG_SENSOR_POWER_PIN_1,
.gpio_powerdown = CONFIG_SENSOR_POWERDN_PIN_1,
@@ -326,6 +337,15 @@ static struct rk29camera_platform_data rk_camera_platform_data = {
.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,
.dev_name = SENSOR_DEVICE_NAME_1,
#else
.gpio_reset = INVALID_GPIO,
.gpio_power = INVALID_GPIO,
.gpio_powerdown = INVALID_GPIO,
.gpio_flash = INVALID_GPIO,
.gpio_flag = 0,
.gpio_init = 0,
.dev_name = NULL,
#endif
},
#ifdef CONFIG_SENSOR_01
{

View File

@@ -147,6 +147,16 @@ module_param(debug, int, S_IRUGO|S_IWUSR);
#define ENABLE_32BIT_BYPASS (0x01<<6)
#define DISABLE_32BIT_BYPASS (0x00<<6)
#define MIN(x,y) ((x<y) ? x: y)
#define MAX(x,y) ((x>y) ? x: y)
#define RK_SENSOR_24MHZ 24*1000*1000 /* MHz */
#define RK_SENSOR_48MHZ 48
#define write_cif_reg(base,addr, val) __raw_writel(val, addr+(base))
#define read_cif_reg(base,addr) __raw_readl(addr+(base))
#define mask_cif_reg(addr, msk, val) write_cif_reg(addr, (val)|((~(msk))&read_cif_reg(addr)))
#if defined(CONFIG_ARCH_RK30)
//CRU,PIXCLOCK
#define CRU_PCLK_REG30 0xbc
@@ -160,23 +170,34 @@ module_param(debug, int, S_IRUGO|S_IWUSR);
#define MASK_RST_CIF1 (0x01 << 31)
#define RQUEST_RST_CIF0 (0x01 << 14)
#define RQUEST_RST_CIF1 (0x01 << 15)
#endif
#define MIN(x,y) ((x<y) ? x: y)
#define MAX(x,y) ((x>y) ? x: y)
#define RK_SENSOR_24MHZ 24*1000*1000 /* MHz */
#define RK_SENSOR_48MHZ 48
#define write_cif_reg(base,addr, val) __raw_writel(val, addr+(base))
#define read_cif_reg(base,addr) __raw_readl(addr+(base))
#define mask_cif_reg(addr, msk, val) write_cif_reg(addr, (val)|((~(msk))&read_cif_reg(addr)))
#if defined(CONFIG_ARCH_RK30)
#define write_cru_reg(addr, val) __raw_writel(val, addr+RK30_CRU_BASE)
#define read_cru_reg(addr) __raw_readl(addr+RK30_CRU_BASE)
#define mask_cru_reg(addr, msk, val) write_cru_reg(addr,(val)|((~(msk))&read_cru_reg(addr)))
#endif
#if defined(CONFIG_ARCH_RK3066B)
//GRF_IO_CON3 0x100
#define CIF_DRIVER_STRENGTH_2MA (0x00 << 12)
#define CIF_DRIVER_STRENGTH_4MA (0x01 << 12)
#define CIF_DRIVER_STRENGTH_8MA (0x02 << 12)
#define CIF_DRIVER_STRENGTH_12MA (0x03 << 12)
#define CIF_DRIVER_STRENGTH_MASK (0x03 << 28)
//GRF_IO_CON4 0x104
#define CIF_CLKOUT_AMP_3V3 (0x00 << 10)
#define CIF_CLKOUT_AMP_1V8 (0x01 << 10)
#define CIF_CLKOUT_AMP_MASK (0x01 << 26)
#define write_grf_reg(addr, val) __raw_writel(val, addr+RK30_GRF_BASE)
#define read_grf_reg(addr) __raw_readl(addr+RK30_GRF_BASE)
#define mask_grf_reg(addr, msk, val) write_grf_reg(addr,(val)|((~(msk))&read_grf_reg(addr)))
#else
#define write_grf_reg(addr, val)
#define read_grf_reg(addr) 0
#define mask_grf_reg(addr, msk, val)
#endif
#if defined(CONFIG_ARCH_RK2928)
#define write_cru_reg(addr, val)
#define read_cru_reg(addr) 0
@@ -248,9 +269,11 @@ module_param(debug, int, S_IRUGO|S_IWUSR);
3.fix bug in prob func:request mem twice.
4.video_vq may be null when reinit work,fix it
5.arm scale algorithm has something wrong(may exceed the bound of width or height) ,fix it.
*v0.x.15:
* 1. support rk3066b;
*/
#define RK_CAM_VERSION_CODE KERNEL_VERSION(0, 2, 0x13)
#define RK_CAM_VERSION_CODE KERNEL_VERSION(0, 2, 0x15)
/* limit to rk29 hardware capabilities */
#define RK_CAM_BUS_PARAM (SOCAM_MASTER |\
@@ -626,7 +649,9 @@ static void rk_videobuf_queue(struct videobuf_queue *vq,
struct soc_camera_device *icd = vq->priv_data;
struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
struct rk_camera_dev *pcdev = ici->priv;
#if CAMERA_VIDEOBUF_ARM_ACCESS
struct rk29_camera_vbinfo *vb_info;
#endif
dev_dbg(&icd->dev, "%s (vb=0x%p) 0x%08lx %zd\n", __func__,
vb, vb->baddr, vb->bsize);
@@ -1240,7 +1265,10 @@ static void rk_videobuf_release(struct videobuf_queue *vq,
struct soc_camera_device *icd = vq->priv_data;
struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
struct rk_camera_dev *pcdev = ici->priv;
#if CAMERA_VIDEOBUF_ARM_ACCESS
struct rk29_camera_vbinfo *vb_info =NULL;
#endif
#ifdef DEBUG
dev_dbg(&icd->dev, "%s (vb=0x%p) 0x%08lx %d\n", __func__,
vb, vb->baddr, vb->bsize);
@@ -1385,6 +1413,7 @@ static void rk_camera_deactivate(struct rk_camera_dev *pcdev)
clk_disable(pcdev->cif_clk_out);
clk_disable(pcdev->pd_cif);
return;
}
@@ -1406,8 +1435,7 @@ static int rk_camera_add_device(struct soc_camera_device *icd)
goto ebusy;
}
dev_info(&icd->dev, "RK Camera driver attached to camera%d(%s)\n",
icd->devnum,dev_name(icd->pdev));
RKCAMERA_DG("%s driver attached to %s\n",RK29_CAM_DRV_NAME,dev_name(icd->pdev));
pcdev->frame_inval = RK_CAM_FRAME_INVAL_INIT;
pcdev->active = NULL;
@@ -1468,14 +1496,15 @@ static void rk_camera_remove_device(struct soc_camera_device *icd)
struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
struct rk_camera_dev *pcdev = ici->priv;
struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
#if CAMERA_VIDEOBUF_ARM_ACCESS
struct rk29_camera_vbinfo *vb_info;
unsigned int i;
#endif
mutex_lock(&camera_lock);
BUG_ON(icd != pcdev->icd);
dev_info(&icd->dev, "RK Camera driver detached from camera%d(%s)\n",
icd->devnum,dev_name(icd->pdev));
RKCAMERA_DG("%s driver detached from %s\n",RK29_CAM_DRV_NAME,dev_name(icd->pdev));
/* ddl@rock-chips.com: Application will call VIDIOC_STREAMOFF before close device, but
stream may be turn on again before close device, if suspend and resume happened. */
@@ -2683,8 +2712,9 @@ static int rk_camera_set_digit_zoom(struct soc_camera_device *icd,
struct v4l2_crop a;
struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
struct rk_camera_dev *pcdev = ici->priv;
#if CIF_DO_CROP
unsigned long tmp_cifctrl;
int flags;
#endif
//change the crop and scale parameters
@@ -2830,18 +2860,35 @@ static void rk_camera_cif_iomux(int cif_index)
switch(cif_index){
case 0:
rk30_mux_api_set(GPIO3B3_CIFCLKOUT_NAME, GPIO3B_CIFCLKOUT);
rk30_mux_api_set(GPIO3B4_CIFDATA0_HSADCDATA8_NAME, GPIO3B_CIFDATA0);
rk30_mux_api_set(GPIO3B5_CIFDATA1_HSADCDATA9_NAME, GPIO3B_CIFDATA1);
rk30_mux_api_set(GPIO3B6_CIFDATA10_I2C3SDA_NAME, GPIO3B_CIFDATA10);
rk30_mux_api_set(GPIO3B7_CIFDATA11_I2C3SCL_NAME, GPIO3B_CIFDATA11);
write_grf_reg(GRF_IO_CON3, (CIF_DRIVER_STRENGTH_MASK|CIF_DRIVER_STRENGTH_8MA));
write_grf_reg(GRF_IO_CON4, (CIF_CLKOUT_AMP_MASK|CIF_CLKOUT_AMP_1V8));
#if (CONFIG_CAMERA_INPUT_FMT_SUPPORT & (RK_CAM_INPUT_FMT_RAW10|RK_CAM_INPUT_FMT_RAW12))
rk30_mux_api_set(GPIO3B4_CIFDATA0_HSADCDATA8_NAME, GPIO3B_CIFDATA0);
rk30_mux_api_set(GPIO3B5_CIFDATA1_HSADCDATA9_NAME, GPIO3B_CIFDATA1);
#endif
#if (CONFIG_CAMERA_INPUT_FMT_SUPPORT & RK_CAM_INPUT_FMT_RAW12)
rk30_mux_api_set(GPIO3B6_CIFDATA10_I2C3SDA_NAME, GPIO3B_CIFDATA10);
rk30_mux_api_set(GPIO3B7_CIFDATA11_I2C3SCL_NAME, GPIO3B_CIFDATA11);
RKCAMERA_TR("%s(%d): WARNING: Cif 0 is configurated that support RAW 12bit, so I2C3 is invalidate!!\n",__FUNCTION__,__LINE__);
#endif
break;
default:
printk("cif index is erro!!!\n");
}
RKCAMERA_TR("%s(%d): Cif index(%d) is invalidate!!!\n",__FUNCTION__,__LINE__, cif_index);
break;
}
#elif defined(CONFIG_ARCH_RK30)
switch(cif_index){
case 0:
rk30_mux_api_set(GPIO1B3_CIF0CLKOUT_NAME, GPIO1B_CIF0_CLKOUT);
#if (CONFIG_CAMERA_INPUT_FMT_SUPPORT & (RK_CAM_INPUT_FMT_RAW10|RK_CAM_INPUT_FMT_RAW12))
rk30_mux_api_set(GPIO1B4_CIF0DATA0_NAME, GPIO1B_CIF0_DATA0);
rk30_mux_api_set(GPIO1B5_CIF0DATA1_NAME, GPIO1B_CIF0_DATA1);
#endif
#if (CONFIG_CAMERA_INPUT_FMT_SUPPORT & RK_CAM_INPUT_FMT_RAW12)
rk30_mux_api_set(GPIO1B6_CIFDATA10_NAME, GPIO1B_CIF_DATA10);
rk30_mux_api_set(GPIO1B7_CIFDATA11_NAME, GPIO1B_CIF_DATA11);
#endif
break;
case 1:
rk30_mux_api_set(GPIO1C0_CIF1DATA2_RMIICLKOUT_RMIICLKIN_NAME,GPIO1C_CIF1_DATA2);
@@ -2863,9 +2910,9 @@ static void rk_camera_cif_iomux(int cif_index)
rk30_mux_api_set(GPIO1D7_CIF1CLKOUT_NAME,GPIO1D_CIF1_CLKOUT);
break;
default:
printk("cif index is erro!!!\n");
RKCAMERA_TR("%s(%d): Cif index(%d) is invalidate!!!\n",__FUNCTION__,__LINE__, cif_index);
break;
}
#else
#endif
@@ -2878,9 +2925,9 @@ static int rk_camera_probe(struct platform_device *pdev)
struct rk29camera_mem_res *meminfo_ptr,*meminfo_ptrr;
int irq,i;
int err = 0;
static int ipp_mem = 0;
RKCAMERA_DG("%s(%d) Enter..\n",__FUNCTION__,__LINE__);
printk("%s version: v%d.%d.%d Zoom by %s\n",RK29_CAM_DRV_NAME,(RK_CAM_VERSION_CODE&0xff0000)>>16,
(RK_CAM_VERSION_CODE&0xff00)>>8,RK_CAM_VERSION_CODE&0xff,CAMERA_SCALE_CROP_MACHINE);
if ((pdev->id == RK_CAM_PLATFORM_DEV_ID_1) && (RK_SUPPORT_CIF1 == 0)) {
RKCAMERA_TR("%s(%d): This chip is not support CIF1!!\n",__FUNCTION__,__LINE__);
@@ -2957,7 +3004,7 @@ static int rk_camera_probe(struct platform_device *pdev)
}
meminfo_ptr->vbase = pcdev->vipmem_virbase = ioremap_cached(meminfo_ptr->start,meminfo_ptr->size);
if (pcdev->vipmem_virbase == NULL) {
dev_err(pcdev->dev, "ioremap() of vip internal memory(Ex:IPP process/raw process) failed\n");
RKCAMERA_TR("%s(%d): ioremap of CIF internal memory(Ex:IPP process/raw process) failed\n",__FUNCTION__,__LINE__);
err = -ENXIO;
goto exit_ioremap_vipmem;
}
@@ -3156,7 +3203,6 @@ static struct platform_driver rk_camera_driver =
static int rk_camera_init_async(void *unused)
{
RKCAMERA_DG("%s..%s..%d \n",__FUNCTION__,__FILE__,__LINE__);
platform_driver_register(&rk_camera_driver);
return 0;
}

View File

@@ -1276,7 +1276,7 @@ static int soc_camera_probe(struct device *dev)
soc_camera_power_set(icd, icl, 0);
mutex_unlock(&icd->video_lock);
dev_info(dev, "Probe %s success\n", dev_name(icd->pdev));
printk("Probe %s success\n", dev_name(icd->pdev));
return 0;
evidstart: