hi
recently i am porting the camera to android.i have some problems with camera(omap3530).hope somebody can give me an advice.thank you.
1:my setting:
the follows blow is the setting i made:
1.1 i use the bt656 format with 8 data lines and a pclk line connected to omap3530 camera controller(D0--D7).
1.2 the bt656 data is produced by a decoder(cx25837) similar to tvp5146.
1.3 a key configure c source code is blow:
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/i2c.h>
#include <linux/gpio.h>
#include <linux/mm.h>
/*Include V4l2 ISP_Camera driver related header file*/
#include <../drivers/media/video/omap34xxcam.h>
#include <../drivers/media/video/isp/ispreg.h>
#include "board-omap3beagle-camera.h"
#include "mux.h"
#ifndef CAMERA_DEBUG
#define CAMERA_DEBUG 1
#endif
static struct omap34xxcam_hw_config decoder_hwc = {
.dev_index = 0,
.dev_minor = 0,
.dev_type = OMAP34XXCAM_SLAVE_SENSOR,
.u.sensor.sensor_isp = 1,
.u.sensor.capture_mem = PAGE_ALIGN(720*625*2*4),//PAL
};
static struct isp_interface_config cx25837_if_config = {
.ccdc_par_ser = ISP_PARLL_YUV_BT,
.dataline_shift = 0x0,
.hsvs_syncdetect = ISPCTRL_SYNC_DETECT_VSRISE,
.strobe = 0x0,
.prestrobe = 0x0,
.shutter = 0x0,
.wait_hs_vs = 2,
.u.par.par_bridge = 0x0,
.u.par.par_clk_pol = 0x0,
};
#define CX25837_XCLK_BT656 (27000000)
#if 1
static struct v4l2_ifparm ifparm = {
.if_type = V4L2_IF_TYPE_BT656,
.u = {
.bt656 = {
.frame_start_on_rising_vs = 1,
.bt_sync_correct = 0,
.latch_clk_inv = 0,
.nobt_hs_inv = 0, /* active high */
.nobt_vs_inv = 0, /* active high */
.mode = V4L2_IF_TYPE_BT656_MODE_BT_8BIT,
.clock_min = CX25837_XCLK_BT656,
.clock_max = CX25837_XCLK_BT656,
},
},
};
#else
static struct v4l2_ifparm ifparm = {
.if_type = V4L2_IF_TYPE_YCbCr,
.u = {
.ycbcr = {
.frame_start_on_rising_vs = 1,
.bt_sync_correct = 0,
.swap = 0,
.latch_clk_inv = 0,
.nobt_hs_inv = 0, /* active high */
.nobt_vs_inv = 0, /* active high */
.clock_min = CX25837_XCLK_BT656,
.clock_max = CX25837_XCLK_BT656,
},
},
};
#endif
static int cx25837_ifparm(struct v4l2_ifparm *p)
{
if(p == NULL){
return -EINVAL;
}
*p = ifparm;
return 0;
}
static int cx25837_set_prv_data(struct v4l2_int_device *s, void *priv)
{
struct omap34xxcam_hw_config *hwc = priv;
if (priv == NULL)
return -EINVAL;
hwc->u.sensor.sensor_isp = decoder_hwc.u.sensor.sensor_isp;
hwc->u.sensor.capture_mem = decoder_hwc.u.sensor.capture_mem;
hwc->dev_index = decoder_hwc.dev_index;
hwc->dev_minor = decoder_hwc.dev_minor;
hwc->dev_type = decoder_hwc.dev_type;
return 0;
}
static int cx25837_power_set(struct v4l2_int_device *s, enum v4l2_power power)
{
struct omap34xxcam_videodev *vdev = s->u.slave->master->priv;
printk("cx25837_power_set\n");
switch (power) {
case V4L2_POWER_OFF:
/*can add some codes as you like here*/
break;
case V4L2_POWER_STANDBY:
/*can add some codes as you like here*/
break;
case V4L2_POWER_ON:
/*can add some codes as you like here*/
isp_configure_interface(vdev->cam->isp, &cx25837_if_config);
break;
default:
return -ENODEV;
break;
}
return 0;
}
static struct cx25837_platform_data cx25837_pdata = {
.master = "omap34xxcam",
.ifparm = cx25837_ifparm,
.power_set = cx25837_power_set,
.priv_data_set = cx25837_set_prv_data,
.clk_polarity = 0,
.hs_polarity =1,
.vs_polarity =1,
};
static struct i2c_board_info __initdata cx25837_i2c_board_info = {
I2C_BOARD_INFO("cx25837",0x45),//the i2c chip address(7-bits) of cx25837
.platform_data = &cx25837_pdata,
};
#define CX25837_RESET 167
#define CX25837_SLEEP 98
static int omap3beagle_pin_mux_config(void)
{
int err = 0;;
//mux the ball F18 as gpio(167)
//check wether the gpio167 has been requested?
err = gpio_request(CX25837_RESET, "cx25837_reset");
if(err){
printk("the goio %d you apply has been requested!\n",CX25837_RESET);
return -1;
}
//mux the ball F18 as gpio(gpio167)
omap_mux_init_gpio(CX25837_RESET,OMAP_PIN_OUTPUT);
//set the gpio167 as output
gpio_direction_output(CX25837_RESET,0);
#if CAMERA_DEBUG
gpio_set_value(CX25837_RESET,0);
#endif
err = gpio_request(CX25837_SLEEP, "cx25837_sleep");
if(err){
printk("the goio %d you apply has been requested!\n",CX25837_SLEEP);
return -1;
}
//mux the ball H24 as gpio(gpio98)
omap_mux_init_gpio(CX25837_SLEEP,OMAP_PIN_OUTPUT);
//set the gpio98 as output
gpio_direction_output(CX25837_SLEEP,0);
#if CAMERA_DEBUG
gpio_set_value(CX25837_SLEEP,0);
#endif
return 0;
}
static int before_init(void)
{
int err;
err = omap3beagle_pin_mux_config();
if(err == -1){
printk("omap3beagle_pin_mux_config failed\n");
return -1;
}
//here,you may add some code in the further
return 0;
}
static void after_init(void)
{
//here,you may add some code in the further
}
#define CX25837_I2C_BUSNUM 2 //the cx25837 is connected to the i2c2 controller
int __init omap3beagledc_init(void)
{
printk("omap3 beagleboard camera(a i2c_client init is beaginning\n)");
before_init();
i2c_register_board_info(CX25837_I2C_BUSNUM,&cx25837_i2c_board_info,1);
after_init();
printk("omap3 beagleboard camera (a i2c_client init is over\n)");
return 0;
}
arch_initcall(omap3beagledc_init);
1.4 the camera registers setting is blow:
----isp iomem register----
address:0x0,data:0x20
address:0x4,data:0x2000
address:0x8,data:0x1
address:0xc,data:0x80083311
address:0x10,data:0x80000000
address:0x14,data:0x0
address:0x18,data:0x80000000
address:0x1c,data:0x0
address:0x20,data:0x0
address:0x24,data:0x0
address:0x28,data:0x0
address:0x2c,data:0x0
address:0x30,data:0x0
address:0x34,data:0x0
address:0x38,data:0x0
address:0x3c,data:0x0
address:0x40,data:0x29c110
address:0x44,data:0x0
address:0x48,data:0x0
address:0x4c,data:0x0
address:0x50,data:0x0
address:0x54,data:0x0
address:0x58,data:0x0
address:0x5c,data:0x0
address:0x60,data:0x0
address:0x64,data:0x0
address:0x68,data:0x10000
address:0x6c,data:0x0
---isp ccdc register----
address:0x0,data:0x1fe01
address:0x4,data:0x1
address:0x8,data:0x32f84
address:0xc,data:0x0
address:0x10,data:0x0
address:0x14,data:0x59f
address:0x18,data:0x20002
address:0x1c,data:0x11f
address:0x20,data:0xffff00ff
address:0x24,data:0x5a0
address:0x28,data:0x249
address:0x2c,data:0x1000
address:0x30,data:0x10
address:0x34,data:0x0
address:0x38,data:0x0
address:0x3c,data:0x4
address:0x40,data:0x0
address:0x44,data:0x0
address:0x48,data:0x11f0032
address:0x4c,data:0x4
address:0x50,data:0x3
address:0x54,data:0x8800
address:0x58,data:0x4000
address:0x5c,data:0x0
address:0x60,data:0x0
address:0x64,data:0x0
address:0x68,data:0x2f840000
address:0x6c,data:0x0
address:0x70,data:0x0
address:0x74,data:0x0
address:0x78,data:0x0
address:0x7c,data:0x0
address:0x80,data:0x0
address:0x84,data:0x0
address:0x88,data:0x0
address:0x8c,data:0x0
address:0x90,data:0x0
address:0x94,data:0x0
address:0x98,data:0x6600
address:0x9c,data:0x0
address:0xa0,data:0x0
address:0xa4,data:0x0
2.my problems:
with the seting above , the camera controller can not produce interrupt.because the isr(omap34xx_isp_isr) do not be excuted.the CCDC_VD0_IRQ interrupt is what i want.
what is wrong with my seeting.I hope some body help me out.thanks! |