doubao_chat/apps/demo/demo_DevKitBoard/include/spi_video.h

136 lines
5.2 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef __SPI_VIDEO_H__
#define __SPI_VIDEO_H__
/*+++++++使用例子只能使能一个+++++++*/
#if 1
#define USE_TEST_ONLY_Y_OUT DISABLE
#define USE_TEST_YUV_OUT ENABLE
#else
#define USE_TEST_ONLY_Y_OUT ENABLE
#define USE_TEST_YUV_OUT DISABLE
#endif
/**********************************说明****************************************************
使用镜头开源版SPI摄像头gc0310
提供演示如下
提供单线双线spi的以下使用例子
Y数据输出 60fps 大小128*128 场景用于扫描笔 并显示到屏
yuv数据输出 15fps 大小VGA pclk 80M xclk40M 并显示到屏 13fps
说明:spi极限速度80M dvp硬件同样支持bt656单线双线以及4线spi bt656时序 参考dvp使用例子
如果需要YUV422数据使用硬件DVP接口
bt656时序介绍:
单线摄像头PCLK输出同步时钟该时钟需要有以下特征 有数据的时候才有时钟空闲时候时钟无
pclk时钟频率:100k-96M 时钟均能正确接收数据
数据d0:数据输出是按一行一行的数据输出例如下图
Pclk: 640*480
-- -- -- -- -- -- -- -- -- --
| | | | | | | | | | | | | | | | | |
-- -- -- -- -- -- -- -- --
包特征:
frist_line_data: ff0000ab+ff000080+data(yuv422)+ff00009d
line_data: ff000080+data(yuv422)+ff00009d
end_line_data: ff000080+data(yuv422)+ff00009d+ff0000b6
d0: all
frist_line_data (480-2) x line_data end_line_data
大概的时间特征 行于行之间间隔很小 170us 需要很快的响应不能有别的中断打断 一般需要使用不可屏蔽中断规避
如果是按整包接收就可以不要不可屏蔽 包与包之间间隔比较长一般 看数据帧率 如果14帧 14ms
*******************************************************************************************/
/**********定义spi使用接口***********/
//iic使用通用摄像头流程初始化摄像头
#define JL_SPI JL_SPI2 //与spi设备对应:JL_SPI0 JL_SPI1 JL_SPI2
#define JL_SPI_NAME "spi2" //与spi设备对应:"spi1", "spi2"
//摄像头的XCLK_PORT,使用SPI接收时,board_xxx.c板级配置就不能配置xclk(配置在本文件有益于动态更改时钟IO)
//改例子硬件接口在此文件定义
#define CAM_XCLK_PORT IO_PORTH_02
/**********定义摄像头长宽************/
#define CAMERA_W 640
#define CAMERA_H 480
/***********定义一帧YUV422数据长度***/
#define YUV422_PACK_LEN (CAMERA_W*CAMERA_H*2)
#define LBUF_NUMB 5
#define YUV422_LBUF_LEN (YUV422_PACK_LEN*LBUF_NUMB)
/***********定义一帧Y数据长度***/
#define Y_PACK_LEN (CAMERA_W*CAMERA_H)
/**********定义bt6565摄像头时序******/
#define CAM_LSTART_VALUE ntohl(0xff000080) //行头
#define CAM_FHEAD_SIZE 4 //帧头长
#define CAM_FEND_SIZE 4 //帧尾长
#define CAM_LHEAD_SIZE 4 //行头长
#define CAM_LEND_SIZE 4 //行尾长
#if USE_TEST_ONLY_Y_OUT //纯Y
#define CAM_LINE_SIZE CAMERA_W //定义有效数据长度
#else if(USE_TEST_YUV_OUT) //yuv422
#define CAM_LINE_SIZE (CAMERA_W * 2) //定义有效数据长度
#endif
//frist_line_data 1292
#define DATA_FIRST_PACK_SIZE (CAM_FHEAD_SIZE + CAM_LHEAD_SIZE + CAM_LINE_SIZE + CAM_LEND_SIZE)
//(480-2) x line_data 1288
#define DATA_LINE_PACK_SIZE (CAM_LHEAD_SIZE + CAM_LINE_SIZE + CAM_LEND_SIZE)
//end_line_data 1292
#define DATA_END_PACK_SIZE (CAM_LHEAD_SIZE + CAM_LINE_SIZE + CAM_LEND_SIZE + CAM_FEND_SIZE)
//all_data_size 618248
#define DATA_ALL_PACK_SIZE (DATA_FIRST_PACK_SIZE + DATA_LINE_PACK_SIZE * (CAMERA_H-2) + DATA_END_PACK_SIZE)
#define ENABLE 1
#define DISABLE 0
/**********定义数据接收缓冲行数**********/
#define RECV_DATA_LINE_PACK_TIME 32 //按16行数据接收 需要单独接收一行包头 一行包尾
/* #define RECV_ALL_DATA //一次性接收完所有包注意数据包尽量不要太大 收存Y数据使用 */
/**********定义数据缓存**************/
#ifdef RECV_DATA_LINE_PACK_TIME
#define LINE_LBUF_SIZE ((RECV_DATA_LINE_PACK_TIME * DATA_FIRST_PACK_SIZE)) //按最长的行包为基准
#endif
#ifdef RECV_ALL_DATA
#define LINE_LBUF_SIZE (DATA_ALL_PACK_SIZE) //定义3个整帧包
#endif
/* #define SPI_IO_DBG */
#ifdef SPI_IO_DBG
#define DBG_PORT_BIT BIT(1)
#define DBG_PORT JL_PORTA
#endif
/**********spi_video数据结构体*******/
struct spi_video {
OS_SEM sem;
OS_SEM rgb1;
OS_SEM rgb2;
OS_SEM rgb1_ok;
OS_SEM rgb2_ok;
u8 camera_reinit;
u8 kill;
u16 recv_move_cnt;
u8 *frame_addr_move_cnt;
u8 *video;
u8 *spi;
u8 *buf;
u8 *yuv422_buf;
u8 *cpy_addr;
u8 *y_buf;
u8 *irq_recv_buf;
u8 *irq_last_recv_buf;
u8 *real_data_addr;
u8 *get_frame;
u8 frame_addr_use_flag;
u8 *next_frame_addr;
};
#endif