现在遇到个非常严重的问题,那就是这个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)
离线
多谢只招,是clock gating没处理好,问题已经解决。
离线