136 lines
5.2 KiB
C
136 lines
5.2 KiB
C
#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
|
||
|
||
|