主题 : 求助编写CAM IF +OV7670 (2.6.24)遇到的问题. 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 2063
精华: 0
发帖: 9
金钱: 90 两
威望: 27 点
综合积分: 18 分
注册时间: 2008-10-23
最后登录: 2011-06-01
楼主  发表于: 2009-02-17 10:11

 求助编写CAM IF +OV7670 (2.6.24)遇到的问题.

在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重新编辑 ]
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2009-02-17 12:38
操作Camera I/F寄存器之前, 先确保CLKCON寄存器中Camera[19]有效
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 2063
精华: 0
发帖: 9
金钱: 90 两
威望: 27 点
综合积分: 18 分
注册时间: 2008-10-23
最后登录: 2011-06-01
2楼  发表于: 2009-02-17 15:34
camif_clock_init  中  对 CLKCON 进行了设置的。

也是在操作CAMIF 前面设置的。
下面是启动的时候的部分日志:
Starting S3C2440 Camera Driver
camif_gpio_init  0x:2aaaaaa  //初始化 GPIOJ 后GPJCON 的值
camif_gpio_init  0x:901           //初始化 GPIOJ 后GPJDAT 的值
camif_gpio_init  0x:1fff            //初始化 GPIOJ 后GPJUP 的值
clk_enable
clk_enable    clk :hclk      usage  : 0
clk_enable    clk :camif      usage  : 0
s3c2410_clkcon_enable   camif :0xf87de0  //初始话时钟后CLKCON 的值,转换为2进制后,验证bit 19 为 1
clk_enable    clk :upll      usage  : 0
clk_enable    clk :camif-upll      usage  : 0
camif_reset
camif_reset  CAMIF_EX_RESET_AL  :0x20000000   //设置Camera interface software reset 后CIGCTRL 值
camif_reset
camif_reset  CAMIF_EX_RESET_AL  :0x60000000  //设置External camera processor reset or power down后CIGCTRL 值
级别: 新手上路
UID: 16263
精华: 0
发帖: 9
金钱: 45 两
威望: 9 点
综合积分: 18 分
注册时间: 2010-03-16
最后登录: 2011-02-20
3楼  发表于: 2010-03-31 09:14
后面怎么样了啊