1。首先在初始化进程的加载:
static struct platform_device *devices[] __initdata = {
#ifdef CONFIG_VIDEO_RK29
&rk29_device_camera, /* ddl@rock-chips.com : camera support */
#if (CONFIG_SENSOR_IIC_ADDR_0 != 0x00)
&rk29_soc_camera_pdrv_0,
#endif
#if (CONFIG_SENSOR_IIC_ADDR_1 != 0x00)
&rk29_soc_camera_pdrv_1,
#endif
#if (PMEM_CAM_SIZE > 0)
&android_pmem_cam_device,
#endif
#endif
}
1.1最大支持6个摄像头,其中前置3个,后置3个,后置分别是。00,01,02.前置为1,11,12如下所示:
#ifdef CONFIG_VIDEO_RK29
/*---------------- Camera Sensor Macro Define Begin ------------------------*/
/*---------------- Camera Sensor Configuration Macro Begin ------------------------*/
#define CONFIG_SENSOR_0 RK29_CAM_SENSOR_GC2015 /* back camera sensor */ //后置0号摄像头
#define CONFIG_SENSOR_IIC_ADDR_0 0x60
#define CONFIG_SENSOR_IIC_ADAPTER_ID_0 1
#define CONFIG_SENSOR_ORIENTATION_0 90
#define CONFIG_SENSOR_POWER_PIN_0 RK29_PIN5_PC3
#define CONFIG_SENSOR_RESET_PIN_0 RK29_PIN6_PA5
#define CONFIG_SENSOR_POWERDN_PIN_0 RK29_PIN0_PB2
#define CONFIG_SENSOR_FALSH_PIN_0 INVALID_GPIO
#define CONFIG_SENSOR_POWERACTIVE_LEVEL_0 RK29_CAM_POWERACTIVE_H
#define CONFIG_SENSOR_RESETACTIVE_LEVEL_0 RK29_CAM_RESETACTIVE_L
#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 15000
#define CONFIG_SENSOR_240X160_FPS_FIXED_0 15000
#define CONFIG_SENSOR_QVGA_FPS_FIXED_0 15000
#define CONFIG_SENSOR_CIF_FPS_FIXED_0 15000
#define CONFIG_SENSOR_VGA_FPS_FIXED_0 15000
#define CONFIG_SENSOR_480P_FPS_FIXED_0 15000
#define CONFIG_SENSOR_SVGA_FPS_FIXED_0 15000
#define CONFIG_SENSOR_720P_FPS_FIXED_0 30000
#define CONFIG_SENSOR_01 RK29_CAM_SENSOR_OV5642 /* back camera sensor 1 */ //后置1号摄像头
#define CONFIG_SENSOR_IIC_ADDR_01 0x00
#define CONFIG_SENSOR_IIC_ADAPTER_ID_01 1
#define CONFIG_SENSOR_ORIENTATION_01 90
#define CONFIG_SENSOR_POWER_PIN_01 INVALID_GPIO
#define CONFIG_SENSOR_RESET_PIN_01 INVALID_GPIO
#define CONFIG_SENSOR_POWERDN_PIN_01 RK29_PIN6_PB7
#define CONFIG_SENSOR_FALSH_PIN_01 INVALID_GPIO
#define CONFIG_SENSOR_POWERACTIVE_LEVEL_01 RK29_CAM_POWERACTIVE_L
#define CONFIG_SENSOR_RESETACTIVE_LEVEL_01 RK29_CAM_RESETACTIVE_L
#define CONFIG_SENSOR_POWERDNACTIVE_LEVEL_01 RK29_CAM_POWERDNACTIVE_H
#define CONFIG_SENSOR_FLASHACTIVE_LEVEL_01 RK29_CAM_FLASHACTIVE_L
#define CONFIG_SENSOR_QCIF_FPS_FIXED_01 15000
#define CONFIG_SENSOR_240X160_FPS_FIXED_01 15000
#define CONFIG_SENSOR_QVGA_FPS_FIXED_01 15000
#define CONFIG_SENSOR_CIF_FPS_FIXED_01 15000
#define CONFIG_SENSOR_VGA_FPS_FIXED_01 15000
#define CONFIG_SENSOR_480P_FPS_FIXED_01 15000
#define CONFIG_SENSOR_SVGA_FPS_FIXED_01 15000
#define CONFIG_SENSOR_720P_FPS_FIXED_01 30000
#define CONFIG_SENSOR_02 RK29_CAM_SENSOR_OV5640 /* back camera sensor 2 */ //后置2号摄像头
#define CONFIG_SENSOR_IIC_ADDR_02 0x00
#define CONFIG_SENSOR_IIC_ADAPTER_ID_02 1
#define CONFIG_SENSOR_ORIENTATION_02 90
#define CONFIG_SENSOR_POWER_PIN_02 INVALID_GPIO
#define CONFIG_SENSOR_RESET_PIN_02 INVALID_GPIO
#define CONFIG_SENSOR_POWERDN_PIN_02 RK29_PIN6_PB7
#define CONFIG_SENSOR_FALSH_PIN_02 INVALID_GPIO
#define CONFIG_SENSOR_POWERACTIVE_LEVEL_02 RK29_CAM_POWERACTIVE_L
#define CONFIG_SENSOR_RESETACTIVE_LEVEL_02 RK29_CAM_RESETACTIVE_L
#define CONFIG_SENSOR_POWERDNACTIVE_LEVEL_02 RK29_CAM_POWERDNACTIVE_H
#define CONFIG_SENSOR_FLASHACTIVE_LEVEL_02 RK29_CAM_FLASHACTIVE_L
#define CONFIG_SENSOR_QCIF_FPS_FIXED_02 15000
#define CONFIG_SENSOR_240X160_FPS_FIXED_02 15000
#define CONFIG_SENSOR_QVGA_FPS_FIXED_02 15000
#define CONFIG_SENSOR_CIF_FPS_FIXED_02 15000
#define CONFIG_SENSOR_VGA_FPS_FIXED_02 15000
#define CONFIG_SENSOR_480P_FPS_FIXED_02 15000
#define CONFIG_SENSOR_SVGA_FPS_FIXED_02 15000
#define CONFIG_SENSOR_720P_FPS_FIXED_02 30000
#define CONFIG_SENSOR_1 RK29_CAM_SENSOR_GC0309 /* front camera sensor */ //前置0号摄像头
#define CONFIG_SENSOR_IIC_ADDR_1 0x42
#define CONFIG_SENSOR_IIC_ADAPTER_ID_1 1
#define CONFIG_SENSOR_ORIENTATION_1 270
#define CONFIG_SENSOR_POWER_PIN_1 RK29_PIN5_PC3 //IOMUX
#define CONFIG_SENSOR_RESET_PIN_1 RK29_PIN6_PA5 //IOMUX
#define CONFIG_SENSOR_POWERDN_PIN_1 RK29_PIN0_PB4 //IOMUX
#define CONFIG_SENSOR_FALSH_PIN_1 INVALID_GPIO
#define CONFIG_SENSOR_POWERACTIVE_LEVEL_1 RK29_CAM_POWERACTIVE_H
#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 15000
#define CONFIG_SENSOR_240X160_FPS_FIXED_1 15000
#define CONFIG_SENSOR_QVGA_FPS_FIXED_1 15000
#define CONFIG_SENSOR_CIF_FPS_FIXED_1 15000
#define CONFIG_SENSOR_VGA_FPS_FIXED_1 15000
#define CONFIG_SENSOR_480P_FPS_FIXED_1 15000
#define CONFIG_SENSOR_SVGA_FPS_FIXED_1 15000
#define CONFIG_SENSOR_720P_FPS_FIXED_1 30000
#define CONFIG_SENSOR_11 RK29_CAM_SENSOR_OV2659 /* front camera sensor 1 */ //前置1号摄像头
#define CONFIG_SENSOR_IIC_ADDR_11 0x00
#define CONFIG_SENSOR_IIC_ADAPTER_ID_11 1
#define CONFIG_SENSOR_ORIENTATION_11 270
#define CONFIG_SENSOR_POWER_PIN_11 INVALID_GPIO
#define CONFIG_SENSOR_RESET_PIN_11 INVALID_GPIO
#define CONFIG_SENSOR_POWERDN_PIN_11 RK29_PIN5_PD7
#define CONFIG_SENSOR_FALSH_PIN_11 INVALID_GPIO
#define CONFIG_SENSOR_POWERACTIVE_LEVEL_11 RK29_CAM_POWERACTIVE_L
#define CONFIG_SENSOR_RESETACTIVE_LEVEL_11 RK29_CAM_RESETACTIVE_L
#define CONFIG_SENSOR_POWERDNACTIVE_LEVEL_11 RK29_CAM_POWERDNACTIVE_H
#define CONFIG_SENSOR_FLASHACTIVE_LEVEL_11 RK29_CAM_FLASHACTIVE_L
#define CONFIG_SENSOR_QCIF_FPS_FIXED_11 15000
#define CONFIG_SENSOR_240X160_FPS_FIXED_11 15000
#define CONFIG_SENSOR_QVGA_FPS_FIXED_11 15000
#define CONFIG_SENSOR_CIF_FPS_FIXED_11 15000
#define CONFIG_SENSOR_VGA_FPS_FIXED_11 15000
#define CONFIG_SENSOR_480P_FPS_FIXED_11 15000
#define CONFIG_SENSOR_SVGA_FPS_FIXED_11 15000
#define CONFIG_SENSOR_720P_FPS_FIXED_11 30000
#define CONFIG_SENSOR_12 RK29_CAM_SENSOR_OV2655 /* front camera sensor 2 */ //前置2号摄像头
#define CONFIG_SENSOR_IIC_ADDR_12 0x00
#define CONFIG_SENSOR_IIC_ADAPTER_ID_12 1
#define CONFIG_SENSOR_ORIENTATION_12 270
#define CONFIG_SENSOR_POWER_PIN_12 INVALID_GPIO
#define CONFIG_SENSOR_RESET_PIN_12 INVALID_GPIO
#define CONFIG_SENSOR_POWERDN_PIN_12 RK29_PIN5_PD7
#define CONFIG_SENSOR_FALSH_PIN_12 INVALID_GPIO
#define CONFIG_SENSOR_POWERACTIVE_LEVEL_12 RK29_CAM_POWERACTIVE_L
#define CONFIG_SENSOR_RESETACTIVE_LEVEL_12 RK29_CAM_RESETACTIVE_L
#define CONFIG_SENSOR_POWERDNACTIVE_LEVEL_12 RK29_CAM_POWERDNACTIVE_H
#define CONFIG_SENSOR_FLASHACTIVE_LEVEL_12 RK29_CAM_FLASHACTIVE_L
#define CONFIG_SENSOR_QCIF_FPS_FIXED_12 15000
#define CONFIG_SENSOR_240X160_FPS_FIXED_12 15000
#define CONFIG_SENSOR_QVGA_FPS_FIXED_12 15000
#define CONFIG_SENSOR_CIF_FPS_FIXED_12 15000
#define CONFIG_SENSOR_VGA_FPS_FIXED_12 15000
#define CONFIG_SENSOR_480P_FPS_FIXED_12 15000
#define CONFIG_SENSOR_SVGA_FPS_FIXED_12 15000
#define CONFIG_SENSOR_720P_FPS_FIXED_12 30000
#endif
2,初始化操作:
static int rk29_sensor_io_init(void);
static int rk29_sensor_io_deinit(int sensor);
static int rk29_sensor_ioctrl(struct device *dev,enum rk29camera_ioctrl_cmd cmd,int on);
static struct rk29camera_platform_data rk29_camera_platform_data = {
.io_init = rk29_sensor_io_init,
.io_deinit = rk29_sensor_io_deinit,
.sensor_ioctrl = rk29_sensor_ioctrl,
.gpio_res = {
{
.gpio_reset = CONFIG_SENSOR_RESET_PIN_0,
.gpio_power = CONFIG_SENSOR_POWER_PIN_0,
.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,
.dev_name = SENSOR_DEVICE_NAME_0,
}, {
#ifdef CONFIG_SENSOR_01
.gpio_reset = CONFIG_SENSOR_RESET_PIN_01,
.gpio_power = CONFIG_SENSOR_POWER_PIN_01,
.gpio_powerdown = CONFIG_SENSOR_POWERDN_PIN_01,
.gpio_flash = CONFIG_SENSOR_FALSH_PIN_01,
.gpio_flag = (CONFIG_SENSOR_POWERACTIVE_LEVEL_01|CONFIG_SENSOR_RESETACTIVE_LEVEL_01|CONFIG_SENSOR_POWERDNACTIVE_LEVEL_01|CONFIG_SENSOR_FLASHACTIVE_LEVEL_01),
.gpio_init = 0,
.dev_name = SENSOR_DEVICE_NAME_01,
#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_02
.gpio_reset = CONFIG_SENSOR_RESET_PIN_02,
.gpio_power = CONFIG_SENSOR_POWER_PIN_02,
.gpio_powerdown = CONFIG_SENSOR_POWERDN_PIN_02,
.gpio_flash = CONFIG_SENSOR_FALSH_PIN_02,
.gpio_flag = (CONFIG_SENSOR_POWERACTIVE_LEVEL_02|CONFIG_SENSOR_RESETACTIVE_LEVEL_02|CONFIG_SENSOR_POWERDNACTIVE_LEVEL_02|CONFIG_SENSOR_FLASHACTIVE_LEVEL_02),
.gpio_init = 0,
.dev_name = SENSOR_DEVICE_NAME_02,
#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
}, {
.gpio_reset = CONFIG_SENSOR_RESET_PIN_1,
.gpio_power = CONFIG_SENSOR_POWER_PIN_1,
.gpio_powerdown = CONFIG_SENSOR_POWERDN_PIN_1,
.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,
.dev_name = SENSOR_DEVICE_NAME_1,
},{
#ifdef CONFIG_SENSOR_11
.gpio_reset = CONFIG_SENSOR_RESET_PIN_11,
.gpio_power = CONFIG_SENSOR_POWER_PIN_11,
.gpio_powerdown = CONFIG_SENSOR_POWERDN_PIN_11,
.gpio_flash = CONFIG_SENSOR_FALSH_PIN_11,
.gpio_flag = (CONFIG_SENSOR_POWERACTIVE_LEVEL_11|CONFIG_SENSOR_RESETACTIVE_LEVEL_11|CONFIG_SENSOR_POWERDNACTIVE_LEVEL_11|CONFIG_SENSOR_FLASHACTIVE_LEVEL_11),
.gpio_init = 0,
.dev_name = SENSOR_DEVICE_NAME_11,
#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_12
.gpio_reset = CONFIG_SENSOR_RESET_PIN_12,
.gpio_power = CONFIG_SENSOR_POWER_PIN_12,
.gpio_powerdown = CONFIG_SENSOR_POWERDN_PIN_12,
.gpio_flash = CONFIG_SENSOR_FALSH_PIN_12,
.gpio_flag = (CONFIG_SENSOR_POWERACTIVE_LEVEL_12|CONFIG_SENSOR_RESETACTIVE_LEVEL_12|CONFIG_SENSOR_POWERDNACTIVE_LEVEL_12|CONFIG_SENSOR_FLASHACTIVE_LEVEL_12),
.gpio_init = 0,
.dev_name = SENSOR_DEVICE_NAME_12,
#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_VIDEO_RK29_WORK_IPP
.meminfo = {
.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,
#ifdef CONFIG_SENSOR_01
},{
.dev_name = SENSOR_DEVICE_NAME_01,
.orientation = CONFIG_SENSOR_ORIENTATION_01,
#else
},{
.dev_name = NULL,
.orientation = 0x00,
#endif
#ifdef CONFIG_SENSOR_02
},{
.dev_name = SENSOR_DEVICE_NAME_02,
.orientation = CONFIG_SENSOR_ORIENTATION_02,
#else
},{
.dev_name = NULL,
.orientation = 0x00,
#endif
},{
.dev_name = SENSOR_DEVICE_NAME_1,
.orientation = CONFIG_SENSOR_ORIENTATION_1,
#ifdef CONFIG_SENSOR_11
},{
.dev_name = SENSOR_DEVICE_NAME_11,
.orientation = CONFIG_SENSOR_ORIENTATION_11,
#else
},{
.dev_name = NULL,
.orientation = 0x00,
#endif
#ifdef CONFIG_SENSOR_12
},{
.dev_name = SENSOR_DEVICE_NAME_12,
.orientation = CONFIG_SENSOR_ORIENTATION_12,
#else
},{
.dev_name = NULL,
.orientation = 0x00,
#endif
}
}
};
static u64 rockchip_device_camera_dmamask = 0xffffffffUL;
static struct resource rk29_camera_resource[] = {
[0] = {
.start = RK29_VIP_PHYS,
.end = RK29_VIP_PHYS + RK29_VIP_SIZE - 1,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = IRQ_VIP,
.end = IRQ_VIP,
.flags = IORESOURCE_IRQ,
}
};
/*platform_device : */
static struct platform_device rk29_device_camera = {
.name = RK29_CAM_DRV_NAME,
.id = RK29_CAM_PLATFORM_DEV_ID, /* This is used to put cameras on this interface */
.num_resources = ARRAY_SIZE(rk29_camera_resource),
.resource = rk29_camera_resource,
.dev = {
.dma_mask = &rockchip_device_camera_dmamask,
.coherent_dma_mask = 0xffffffffUL,
.platform_data = &rk29_camera_platform_data,
}
};
后置摄像头加载参数:
static int rk29_sensor_powerdown(struct device *dev, int on)
{
return rk29_sensor_ioctrl(dev,Cam_PowerDown,on);
}
static int rk29_sensor_power(struct device *dev, int on)
{
if (!on) /* ddl@rock-chips.com : Ensure sensor enter standby or power off */
rk29_sensor_powerdown(dev,1);
rk29_sensor_ioctrl(dev,Cam_Power,on);
return 0;
}
static int rk29_sensor_reset(struct device *dev)
{
rk29_sensor_ioctrl(dev,Cam_Reset,1);
msleep(2);
rk29_sensor_ioctrl(dev,Cam_Reset,0);
return 0;
}
#if (CONFIG_SENSOR_IIC_ADDR_0 != 0x00)
static struct i2c_board_info rk29_i2c_cam_info_0[] = {
{
I2C_BOARD_INFO(SENSOR_NAME_0, CONFIG_SENSOR_IIC_ADDR_0>>1)
},
};
static struct soc_camera_link rk29_iclink_0 = {
.bus_id = RK29_CAM_PLATFORM_DEV_ID,
.power = rk29_sensor_power,
#if (CONFIG_SENSOR_RESET_PIN_0 != INVALID_GPIO)
.reset = rk29_sensor_reset,
#endif
.powerdown = rk29_sensor_powerdown,
.board_info = &rk29_i2c_cam_info_0[0],
.i2c_adapter_id = CONFIG_SENSOR_IIC_ADAPTER_ID_0,
.module_name = SENSOR_NAME_0,
};
/*platform_device : soc-camera need */
static struct platform_device rk29_soc_camera_pdrv_0 = {
.name = "soc-camera-pdrv",
.id = 0,
.dev = {
.init_name = SENSOR_DEVICE_NAME_0,
.platform_data = &rk29_iclink_0,
},
};
前置加载:
#if (CONFIG_SENSOR_IIC_ADDR_1 != 0x00)
static struct i2c_board_info rk29_i2c_cam_info_1[] = {
{
I2C_BOARD_INFO(SENSOR_NAME_1, CONFIG_SENSOR_IIC_ADDR_1>>1)
},
};
static struct soc_camera_link rk29_iclink_1 = {
.bus_id = RK29_CAM_PLATFORM_DEV_ID,
.power = rk29_sensor_power,
#if (CONFIG_SENSOR_RESET_PIN_1 != INVALID_GPIO)
.reset = rk29_sensor_reset,
#endif
.powerdown = rk29_sensor_powerdown,
.board_info = &rk29_i2c_cam_info_1[0],
.i2c_adapter_id = CONFIG_SENSOR_IIC_ADAPTER_ID_1,
.module_name = SENSOR_NAME_1,
};
/*platform_device : soc-camera need */
static struct platform_device rk29_soc_camera_pdrv_1 = {
.name = "soc-camera-pdrv",
.id = 1,
.dev = {
.init_name = SENSOR_DEVICE_NAME_1,
.platform_data = &rk29_iclink_1,
},
};
#endif
至于真正的引脚初始化操作,可以根据实际需求来操作引脚:
static int rk29_sensor_io_init(void);
static int rk29_sensor_io_deinit(int sensor);
static int rk29_sensor_ioctrl(struct device *dev,enum rk29camera_ioctrl_cmd cmd,int on);
3.摄像头相关的默认参数配置:
static int sensor_power_default_cb (struct rk29camera_gpio_res *res, int on)
{
int camera_power = res->gpio_power;
int camera_ioflag = res->gpio_flag;
int camera_io_init = res->gpio_init;
int ret = 0;
if (camera_power != INVALID_GPIO) {
if (camera_io_init & RK29_CAM_POWERACTIVE_MASK) {
if (on) {
gpio_set_value(camera_power, ((camera_ioflag&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));
dprintk("%s..%s..PowerPin=%d ..PinLevel = %x \n",__FUNCTION__,res->dev_name, camera_power, ((camera_ioflag&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));
msleep(10);
} else {
gpio_set_value(camera_power, (((~camera_ioflag)&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));
dprintk("%s..%s..PowerPin=%d ..PinLevel = %x \n",__FUNCTION__,res->dev_name, camera_power, (((~camera_ioflag)&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));
}
} else {
ret = RK29_CAM_EIO_REQUESTFAIL;
printk("%s..%s..PowerPin=%d request failed!\n",__FUNCTION__,res->dev_name,camera_power);
}
} else {
ret = RK29_CAM_EIO_INVALID;
}
return ret;
}
static int sensor_reset_default_cb (struct rk29camera_gpio_res *res, int on)
{
int camera_reset = res->gpio_reset;
int camera_ioflag = res->gpio_flag;
int camera_io_init = res->gpio_init;
int ret = 0;
if (camera_reset != INVALID_GPIO) {
if (camera_io_init & RK29_CAM_RESETACTIVE_MASK) {
if (on) {
gpio_set_value(camera_reset, ((camera_ioflag&RK29_CAM_RESETACTIVE_MASK)>>RK29_CAM_RESETACTIVE_BITPOS));
dprintk("%s..%s..ResetPin=%d ..PinLevel = %x \n",__FUNCTION__,res->dev_name,camera_reset, ((camera_ioflag&RK29_CAM_RESETACTIVE_MASK)>>RK29_CAM_RESETACTIVE_BITPOS));
} else {
gpio_set_value(camera_reset,(((~camera_ioflag)&RK29_CAM_RESETACTIVE_MASK)>>RK29_CAM_RESETACTIVE_BITPOS));
dprintk("%s..%s..ResetPin= %d..PinLevel = %x \n",__FUNCTION__,res->dev_name, camera_reset, (((~camera_ioflag)&RK29_CAM_RESETACTIVE_MASK)>>RK29_CAM_RESETACTIVE_BITPOS));
}
} else {
ret = RK29_CAM_EIO_REQUESTFAIL;
printk("%s..%s..ResetPin=%d request failed!\n",__FUNCTION__,res->dev_name,camera_reset);
}
} else {
ret = RK29_CAM_EIO_INVALID;
}
return ret;
}
static int sensor_powerdown_default_cb (struct rk29camera_gpio_res *res, int on)
{
int camera_powerdown = res->gpio_powerdown;
int camera_ioflag = res->gpio_flag;
int camera_io_init = res->gpio_init;
int ret = 0;
if (camera_powerdown != INVALID_GPIO) {
if (camera_io_init & RK29_CAM_POWERDNACTIVE_MASK) {
if (on) {
gpio_set_value(camera_powerdown, ((camera_ioflag&RK29_CAM_POWERDNACTIVE_MASK)>>RK29_CAM_POWERDNACTIVE_BITPOS));
dprintk("%s..%s..PowerDownPin=%d ..PinLevel = %x \n",__FUNCTION__,res->dev_name,camera_powerdown, ((camera_ioflag&RK29_CAM_POWERDNACTIVE_MASK)>>RK29_CAM_POWERDNACTIVE_BITPOS));
} else {
gpio_set_value(camera_powerdown,(((~camera_ioflag)&RK29_CAM_POWERDNACTIVE_MASK)>>RK29_CAM_POWERDNACTIVE_BITPOS));
dprintk("%s..%s..PowerDownPin= %d..PinLevel = %x \n",__FUNCTION__,res->dev_name, camera_powerdown, (((~camera_ioflag)&RK29_CAM_POWERDNACTIVE_MASK)>>RK29_CAM_POWERDNACTIVE_BITPOS));
}
} else {
ret = RK29_CAM_EIO_REQUESTFAIL;
dprintk("%s..%s..PowerDownPin=%d request failed!\n",__FUNCTION__,res->dev_name,camera_powerdown);
}
} else {
ret = RK29_CAM_EIO_INVALID;
}
return ret;
}
static int sensor_flash_default_cb (struct rk29camera_gpio_res *res, int on)
{
int camera_flash = res->gpio_flash;
int camera_ioflag = res->gpio_flag;
int camera_io_init = res->gpio_init;
int ret = 0;
if (camera_flash != INVALID_GPIO) {
if (camera_io_init & RK29_CAM_FLASHACTIVE_MASK) {
switch (on)
{
case Flash_Off:
{
gpio_set_value(camera_flash,(((~camera_ioflag)&RK29_CAM_FLASHACTIVE_MASK)>>RK29_CAM_FLASHACTIVE_BITPOS));
dprintk("\n%s..%s..FlashPin= %d..PinLevel = %x \n",__FUNCTION__,res->dev_name, camera_flash, (((~camera_ioflag)&RK29_CAM_FLASHACTIVE_MASK)>>RK29_CAM_FLASHACTIVE_BITPOS));
break;
}
case Flash_On:
{
gpio_set_value(camera_flash, ((camera_ioflag&RK29_CAM_FLASHACTIVE_MASK)>>RK29_CAM_FLASHACTIVE_BITPOS));
dprintk("%s..%s..FlashPin=%d ..PinLevel = %x \n",__FUNCTION__,res->dev_name,camera_flash, ((camera_ioflag&RK29_CAM_FLASHACTIVE_MASK)>>RK29_CAM_FLASHACTIVE_BITPOS));
break;
}
case Flash_Torch:
{
gpio_set_value(camera_flash, ((camera_ioflag&RK29_CAM_FLASHACTIVE_MASK)>>RK29_CAM_FLASHACTIVE_BITPOS));
dprintk("%s..%s..FlashPin=%d ..PinLevel = %x \n",__FUNCTION__,res->dev_name,camera_flash, ((camera_ioflag&RK29_CAM_FLASHACTIVE_MASK)>>RK29_CAM_FLASHACTIVE_BITPOS));
break;
}
default:
{
printk("%s..%s..Flash command(%d) is invalidate \n",__FUNCTION__,res->dev_name,on);
break;
}
}
} else {
ret = RK29_CAM_EIO_REQUESTFAIL;
printk("%s..%s..FlashPin=%d request failed!\n",__FUNCTION__,res->dev_name,camera_flash);
}
} else {
ret = RK29_CAM_EIO_INVALID;
}
return ret;
}
static void rk29_sensor_fps_get(int idx, unsigned int *val, int w, int h)
{
switch (idx)
{
case 0:
{
if ((w==176) && (h==144)) {
*val = CONFIG_SENSOR_QCIF_FPS_FIXED_0;
#ifdef CONFIG_SENSOR_240X160_FPS_FIXED_0
} else if ((w==240) && (h==160)) {
*val = CONFIG_SENSOR_240X160_FPS_FIXED_0;
#endif
} else if ((w==320) && (h==240)) {
*val = CONFIG_SENSOR_QVGA_FPS_FIXED_0;
} else if ((w==352) && (h==288)) {
*val = CONFIG_SENSOR_CIF_FPS_FIXED_0;
} else if ((w==640) && (h==480)) {
*val = CONFIG_SENSOR_VGA_FPS_FIXED_0;
} else if ((w==720) && (h==480)) {
*val = CONFIG_SENSOR_480P_FPS_FIXED_0;
} else if ((w==1280) && (h==720)) {
*val = CONFIG_SENSOR_720P_FPS_FIXED_0;
}
break;
}
#ifdef CONFIG_SENSOR_01
case 1:
{
if ((w==176) && (h==144)) {
*val = CONFIG_SENSOR_QCIF_FPS_FIXED_01;
#ifdef CONFIG_SENSOR_240X160_FPS_FIXED_01
} else if ((w==240) && (h==160)) {
*val = CONFIG_SENSOR_240X160_FPS_FIXED_01;
#endif
} else if ((w==320) && (h==240)) {
*val = CONFIG_SENSOR_QVGA_FPS_FIXED_01;
} else if ((w==352) && (h==288)) {
*val = CONFIG_SENSOR_CIF_FPS_FIXED_01;
} else if ((w==640) && (h==480)) {
*val = CONFIG_SENSOR_VGA_FPS_FIXED_01;
} else if ((w==720) && (h==480)) {
*val = CONFIG_SENSOR_480P_FPS_FIXED_01;
} else if ((w==1280) && (h==720)) {
*val = CONFIG_SENSOR_720P_FPS_FIXED_01;
}
break;
}
#endif
#ifdef CONFIG_SENSOR_02
case 2:
{
if ((w==176) && (h==144)) {
*val = CONFIG_SENSOR_QCIF_FPS_FIXED_02;
#ifdef CONFIG_SENSOR_240X160_FPS_FIXED_02
} else if ((w==240) && (h==160)) {
*val = CONFIG_SENSOR_240X160_FPS_FIXED_02;
#endif
} else if ((w==320) && (h==240)) {
*val = CONFIG_SENSOR_QVGA_FPS_FIXED_02;
} else if ((w==352) && (h==288)) {
*val = CONFIG_SENSOR_CIF_FPS_FIXED_02;
} else if ((w==640) && (h==480)) {
*val = CONFIG_SENSOR_VGA_FPS_FIXED_02;
} else if ((w==720) && (h==480)) {
*val = CONFIG_SENSOR_480P_FPS_FIXED_02;
} else if ((w==1280) && (h==720)) {
*val = CONFIG_SENSOR_720P_FPS_FIXED_02;
}
break;
}
#endif
case 3:
{
if ((w==176) && (h==144)) {
*val = CONFIG_SENSOR_QCIF_FPS_FIXED_1;
#ifdef CONFIG_SENSOR_240X160_FPS_FIXED_1
} else if ((w==240) && (h==160)) {
*val = CONFIG_SENSOR_240X160_FPS_FIXED_1;
#endif
} else if ((w==320) && (h==240)) {
*val = CONFIG_SENSOR_QVGA_FPS_FIXED_1;
} else if ((w==352) && (h==288)) {
*val = CONFIG_SENSOR_CIF_FPS_FIXED_1;
} else if ((w==640) && (h==480)) {
*val = CONFIG_SENSOR_VGA_FPS_FIXED_1;
} else if ((w==720) && (h==480)) {
*val = CONFIG_SENSOR_480P_FPS_FIXED_1;
} else if ((w==1280) && (h==720)) {
*val = CONFIG_SENSOR_720P_FPS_FIXED_1;
}
break;
}
#ifdef CONFIG_SENSOR_11
case 4:
{
if ((w==176) && (h==144)) {
*val = CONFIG_SENSOR_QCIF_FPS_FIXED_11;
#ifdef CONFIG_SENSOR_240X160_FPS_FIXED_11
} else if ((w==240) && (h==160)) {
*val = CONFIG_SENSOR_240X160_FPS_FIXED_11;
#endif
} else if ((w==320) && (h==240)) {
*val = CONFIG_SENSOR_QVGA_FPS_FIXED_11;
} else if ((w==352) && (h==288)) {
*val = CONFIG_SENSOR_CIF_FPS_FIXED_11;
} else if ((w==640) && (h==480)) {
*val = CONFIG_SENSOR_VGA_FPS_FIXED_11;
} else if ((w==720) && (h==480)) {
*val = CONFIG_SENSOR_480P_FPS_FIXED_11;
} else if ((w==1280) && (h==720)) {
*val = CONFIG_SENSOR_720P_FPS_FIXED_11;
}
break;
}
#endif
#ifdef CONFIG_SENSOR_12
case 5:
{
if ((w==176) && (h==144)) {
*val = CONFIG_SENSOR_QCIF_FPS_FIXED_12;
#ifdef CONFIG_SENSOR_240X160_FPS_FIXED_12
} else if ((w==240) && (h==160)) {
*val = CONFIG_SENSOR_240X160_FPS_FIXED_12;
#endif
} else if ((w==320) && (h==240)) {
*val = CONFIG_SENSOR_QVGA_FPS_FIXED_12;
} else if ((w==352) && (h==288)) {
*val = CONFIG_SENSOR_CIF_FPS_FIXED_12;
} else if ((w==640) && (h==480)) {
*val = CONFIG_SENSOR_VGA_FPS_FIXED_12;
} else if ((w==720) && (h==480)) {
*val = CONFIG_SENSOR_480P_FPS_FIXED_12;
} else if ((w==1280) && (h==720)) {
*val = CONFIG_SENSOR_720P_FPS_FIXED_12;
}
break;
}
#endif
default:
printk(KERN_ERR"rk29_cam_io: sensor-%d have not been define in board file!",idx);
}
}
这里面包括图片尺寸大小,分辨率等设置。
4.具体摄像头的寄存器配置:
首先:make menuconfig
Device Drivers------>
Multimedia support ----->
Video capture adapters ----->
选择相应的Camera驱动,比如GC0309
然后根据具体的需求到gc0309.c里面去按照手册配置寄存器。
主要是修改1.1里面前置和后置摄像头的引脚,地址,名字,以及一些参数。
及2和3里面初始化的配置