WhyCan Forum(哇酷开发者社区)

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn

您尚未登录。

#1 2020-09-23 06:32:43

david
会员
注册时间: 2018-03-05
累计积分: 76

RTT下的CSI调试

现在遇到个非常严重的问题,那就是这个CSI好像还是彻底不工作,清大佬们给帮忙看下啥问题,

#include <rtthread.h>
#include <rtdevice.h>
#include <rthw.h>

#include "iomem.h"

#include "reg-ccu.h"
#include "drv_clock.h"
#include "drv_gpio.h"
#include "interrupt.h"

#include "drv_csi.h"

#ifdef CSI_DEBUG
#define CSI_DBG(...)     rt_kprintf("[CSI]"),rt_kprintf(__VA_ARGS__)
#else
#define CSI_DBG(...)
#endif

#define CSI_BASE_ADDR (0x01CB0000)
#define CSI_CCU_BUS_SOFT_RST_BASE (F1C100S_CCU_BASE | CCU_BUS_SOFT_RST1)
#define CSI_CCU_BUS_CSI_CLK_BASE (F1C100S_CCU_BASE | CCU_CSI_CLK)
#define CSI_CCU_BUS_SOFT_RST_BIT (1 << 8)

#define RAW_STREAM      0
#define PASS_THROUGH    0
#define VREF_POL        1
#define HREF_POL        1
#define CLK_POL         1

#define VS_INT       0x80
#define FD_INT       0x02
#define CD_INT       0x01

#define HOR_START       2
#define VER_START       2

#define CSI ((struct csi_reg_struct *) CSI_BASE_ADDR)

#define CSI_BUF_SIZE (1280+4)*720
uint8_t pix_buf[CSI_BUF_SIZE];

void csi_set_size(int x, int y)
{
    CSI -> hsize = ((x&0x1fff) << 16) | HOR_START;
    CSI -> vsize = ((y&0x1fff) << 16) | VER_START;
    CSI -> buf_len = (x&0x1fff);
}

void csi_setup()
{
//    if (!CSI) return -RT_ENOSYS;
    
    
//    return 0;
}

#define DBUF_EN     0 // disable double buffering for the momen

void csi_dump(void)
{
    int i;
    rt_kprintf("CSI Regs\n");
    for(i=0; i<=0x48; i+=4)
    {
        volatile uint32_t *ptr;
        ptr = (volatile uint32_t *)(CSI_BASE_ADDR + i);
        rt_kprintf("0x%02X 0x%08X\n", i, *ptr);
    }
}

int csi_test(void)
{
    int i;
    uint32_t sum;
    
    for(i=0; i<CSI_BUF_SIZE; i++) pix_buf[i] = 0;
    
    csi_set_size(1280, 720);
    
    CSI -> fifo0_bufa = (uint32_t)pix_buf;
    CSI -> fifo0_bufb = (uint32_t)pix_buf;
    
    CSI -> buf_ctl = DBUF_EN; // FIXME

    //CSI -> int_en = 1; // enable CD_INT_EN
    CSI -> int_en = 0; // not using INT
    
    CSI -> cap = 0x01; // start single capture
    
    rt_thread_delay(RT_TICK_PER_SECOND);
    
    rt_kprintf("CSI capture ");
    if (CSI -> int_sta & 0x01)
    {
        rt_kprintf("OK\n");
    }
    else
    {
        rt_kprintf("FAILED\n");
        csi_dump();
    }
    
    sum = 0;
    for(i=0; i<CSI_BUF_SIZE; i++) sum += pix_buf[i];
    rt_kprintf("SUM: 0x%08X\n", sum);
    
    return 0;
}
MSH_CMD_EXPORT(csi_test, csi_test);

void csi_irq_handle(int irqno, void *param)
{
    CSI -> int_sta = 0;
}

int rt_hw_csi_init(void)
{
    if (video_set_pll_clk(96000000) == RT_EOK)
    {
        rt_kprintf("Video clock ok\n");
    }
    else
    {
        rt_kprintf("Video clock failed 0x%08X\n", CCU->pll_video_ctrl);
    }
    
    // Set GPIO
    gpio_set_func(GPIO_PORT_E, GPIO_PIN_0, IO_FUN_1);
    gpio_set_func(GPIO_PORT_E, GPIO_PIN_1, IO_FUN_1);
    gpio_set_func(GPIO_PORT_E, GPIO_PIN_2, IO_FUN_1);
    gpio_set_func(GPIO_PORT_E, GPIO_PIN_3, IO_FUN_1);
    gpio_set_func(GPIO_PORT_E, GPIO_PIN_4, IO_FUN_1);
    gpio_set_func(GPIO_PORT_E, GPIO_PIN_5, IO_FUN_1);
    gpio_set_func(GPIO_PORT_E, GPIO_PIN_6, IO_FUN_1);
    gpio_set_func(GPIO_PORT_E, GPIO_PIN_7, IO_FUN_1);
    gpio_set_func(GPIO_PORT_E, GPIO_PIN_8, IO_FUN_1);
    gpio_set_func(GPIO_PORT_E, GPIO_PIN_9, IO_FUN_1);
    gpio_set_func(GPIO_PORT_E, GPIO_PIN_10, IO_FUN_1);

    gpio_set_pull_mode(GPIO_PORT_E, GPIO_PIN_0, PULL_DOWN);  // HSYNC
    gpio_set_pull_mode(GPIO_PORT_E, GPIO_PIN_1, PULL_DOWN);  // VSYNC
    gpio_set_pull_mode(GPIO_PORT_E, GPIO_PIN_2, PULL_DOWN);  // PCLK

    // enable CSI clock
    bus_gate_clk_enalbe(CSI_GATING);

    // set CSI MCLK
    write32(CSI_CCU_BUS_CSI_CLK_BASE, 1<<15);
    
    // release the reset
    write32(CSI_CCU_BUS_SOFT_RST_BASE, read32(CSI_CCU_BUS_SOFT_RST_BASE)|CSI_CCU_BUS_SOFT_RST_BIT);

    //csi_dump();
    
    // setup CSI registers
    CSI -> en = 1;
        
    //csi_dump();
    
    // Raw data 
    CSI -> cfg = (RAW_STREAM << 20) | (PASS_THROUGH << 16) | (VREF_POL << 2) 
        | (HREF_POL << 1) | CLK_POL;
        
    CSI -> scale = (0xf << 24) | 0xffff;  // take all the pixels
    
    // install the ISR
    //rt_hw_interrupt_install(CSI_INTERRUPT, csi_irq_handle, NULL, "USB");
    //rt_hw_interrupt_umask(CSI_INTERRUPT);        
    
    return 0;
}


//INIT_DEVICE_EXPORT(rt_hw_csi_init);

目前运行记录是这样的

 \ | /                                                                          
- RT -     Thread Operating System                                              
 / | \     4.0.2 build Sep 22 2020                                              
 2006 - 2019 Copyright by rt-thread team                                        
[I/I2C] I2C bus [i2c0] registered                                               
periph_get_pll_clk:600000000                                                    
cpu_get_clk:408000000                                                           
ahb_get_clk:200000000                                                           
apb_get_clk:100000000                                                           
ddr_get_pll_clk:312000000                                                       
video_get_pll_clk:96000000                                                      
Video clock ok                                                                  
msh >csi_test                                                                   
CSI capture FAILED                                                              
CSI Regs                                                                        
0x00 0x00000001                                                                 
0x04 0x00000007                                                                 
0x08 0x00000000                                                                 
0x0C 0x00000000                                                                 
0x10 0x800200E4                                                                 
0x14 0x800200E4                                                                 
0x18 0x00000000                                                                 
0x1C 0x00000000                                                                 
0x20 0x00000000                                                                 
0x24 0x00000000                                                                 
0x28 0x00000000                                                                 
0x2C 0x00000000                                                                 
0x30 0x00000000                                                                 
0x34 0x00000000                                                                 
0x38 0x00000000                                                                 
0x3C 0x00000000                                                                 
0x40 0x05000002                                                                 
0x44 0x02D00002                                                                 
0x48 0x00000500                                                                 
SUM: 0x00000000                                                                 
msh >            

最近编辑记录 david (2020-09-23 06:37:41)

离线

#2 2020-09-23 18:30:08

我思故我在
会员
注册时间: 2019-09-03
累计积分: 238

Re: RTT下的CSI调试

不懂, 帮你up一下

离线

#3 2020-09-23 20:29:02

aozima
会员
所在地: 深圳
注册时间: 2019-05-25
累计积分: 124
个人网站

Re: RTT下的CSI调试

没用过CSI接口,是否传感器的配置问题?
现在调试现象是啥? 楼主是怎么判定问题的?

最近编辑记录 aozima (2020-09-23 20:29:30)

离线

#4 2020-09-25 19:01:45

david
会员
注册时间: 2018-03-05
累计积分: 76

Re: RTT下的CSI调试

多谢只招,是clock gating没处理好,问题已经解决。

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB