在2。6。24 上编写CAM IF 接口驱动,初始话camif接口后,用万用表测试CAMRESET 引脚怎么都没有变化,总是在低电平,所以OV初始化不起来,郁闷了很久。检查了很久都没有查出来问题。
我初始化camif的过程是:
1。先设这GPIOJ
2。初始化时钟
3。设置Camera interface software reset
4。设置External camera processor reset or power down
但是设置External camera processor reset or power down 这位后,从开发版的引脚测试没有电平变化,不知道我是什么地方错误,请各位大大帮我分析一下。
初始化代码如下:
void camif_setup_sensor(void)
{
camif_gpio_init(); //设置GPIO
camif_clock_init(NULL);//设置时钟
//bit 29 must be 1 根据文档把camif 的CIGCTRL bit 29 设置为1
writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) |BIT29, camregs + S3C2440_CAM_REG_CIGCTRL);
camif_reset(CAMIF_RESET, 0); //设置Camera interface software reset
//CAMIF_EX_RESET_AL for OV7670 设置External camera processor reset or power down
camif_reset(CAMIF_EX_RESET_AL,1000);
}
static int camif_gpio_init(void)
{
s3c2410_gpio_cfgpin(S3C2440_GPJ0, S3C2440_GPJ0_CAMDATA0);
s3c2410_gpio_cfgpin(S3C2440_GPJ1, S3C2440_GPJ1_CAMDATA1);
s3c2410_gpio_cfgpin(S3C2440_GPJ2, S3C2440_GPJ2_CAMDATA2);
s3c2410_gpio_cfgpin(S3C2440_GPJ3, S3C2440_GPJ3_CAMDATA3);
s3c2410_gpio_cfgpin(S3C2440_GPJ4, S3C2440_GPJ4_CAMDATA4);
s3c2410_gpio_cfgpin(S3C2440_GPJ5, S3C2440_GPJ5_CAMDATA5);
s3c2410_gpio_cfgpin(S3C2440_GPJ6, S3C2440_GPJ6_CAMDATA6);
s3c2410_gpio_cfgpin(S3C2440_GPJ7, S3C2440_GPJ7_CAMDATA7);
s3c2410_gpio_cfgpin(S3C2440_GPJ8, S3C2440_GPJ8_CAMPCLK);
s3c2410_gpio_cfgpin(S3C2440_GPJ9, S3C2440_GPJ9_CAMVSYNC);
s3c2410_gpio_cfgpin(S3C2440_GPJ10, S3C2440_GPJ10_CAMHREF);
s3c2410_gpio_cfgpin(S3C2440_GPJ11, S3C2440_GPJ11_CAMCLKOUT);
s3c2410_gpio_cfgpin(S3C2440_GPJ12, S3C2440_GPJ12_CAMRESET);
printk(" camif_gpio_init 0x:%x ", __raw_readl(S3C24XX_GPIO_BASE(S3C2440_GPJ0))); //设置完毕后把GPJ 的设置打出来
return 0;
}
int camif_clock_init(camif_gc_t *gc)
{
unsigned int camclk;
struct clk *clk_camif = clk_get(NULL, "camif");
struct clk *clk_camif_upll = clk_get(NULL, "camif-upll");
if (!gc)
camclk = 24000000;
else {
camclk = gc->camclk;
if (camclk > 48000000)
printk(KERN_ERR "Wrong Camera Clock\n");
}
printk("clk_enable \n");
clk_enable(clk_camif);
clk_set_rate(clk_camif_upll, camclk);
clk_enable(clk_camif_upll);
return 0;
}
void camif_reset(int is, int delay)
{
cam_dbg("camif_reset \n");
switch (is) {
case CAMIF_RESET: //设置Camera interface software reset
writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) | GC_SWRST, camregs + S3C2440_CAM_REG_CIGCTRL);
mdelay(100);
writel((readl(camregs + S3C2440_CAM_REG_CIGCTRL) & ~GC_SWRST),camregs + S3C2440_CAM_REG_CIGCTRL);
case CAMIF_EX_RESET_AH: /*Active High */ 设置External camera processor reset or power down
writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) & ~GC_CAMRST,camregs + S3C2440_CAM_REG_CIGCTRL);
udelay(200);
writel((readl(camregs + S3C2440_CAM_REG_CIGCTRL) | GC_CAMRST),camregs + S3C2440_CAM_REG_CIGCTRL);
udelay(delay);
writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) & ~GC_CAMRST,camregs + S3C2440_CAM_REG_CIGCTRL);
break;
case CAMIF_EX_RESET_AL: /*Active Low */ 设置External camera processor reset or power down
writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) | GC_CAMRST, camregs + S3C2440_CAM_REG_CIGCTRL);
udelay(200);
writel((readl(camregs + S3C2440_CAM_REG_CIGCTRL) & ~GC_CAMRST), camregs + S3C2440_CAM_REG_CIGCTRL);
udelay(delay);
writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) | GC_CAMRST, camregs + S3C2440_CAM_REG_CIGCTRL);
break;
default:
break;
}
cam_dbg("camif_reset CAMIF_EX_RESET_AL :0x%x\n", readl(camregs + S3C2440_CAM_REG_CIGCTRL) );
}
[ 此帖被qwetiop在2009-02-17 15:39重新编辑 ]