190 lines
6.6 KiB
C
190 lines
6.6 KiB
C
#ifndef _IMD_H_
|
||
#define _IMD_H_
|
||
|
||
#include "typedef.h"
|
||
#include "asm/cpu.h"
|
||
#include "os/os_api.h"
|
||
#include "device/device.h"
|
||
|
||
#define IOCTL_IMD_SET_CB_FUNC _IOW('M', 1, 4)//注册帧回调函数
|
||
#define IOCTL_IMD_SET_CB_PRIV _IOW('M', 2, 4)//注册帧回调函数参数
|
||
#define IOCTL_IMD_GET_FRAME_BUFF _IOW('M', 3, 4)//获取IMD的可用缓存帧buff
|
||
#define IOCTL_IMD_GET_FRAME_BUFF_SIZE _IOW('M', 4, 4)//获取IMD的可用缓存帧buff大小
|
||
#define IOCTL_IMD_UPDATE_BUFF _IOW('M', 5, 4)//更新缓冲区数据
|
||
|
||
|
||
#define IMD_LD_PND BIT(31)
|
||
#define IMD_LD_PND_CLR BIT(30)
|
||
#define IMD_LD_PND_IE BIT(29)
|
||
#define IMD_MCH_PND BIT(28)
|
||
#define IMD_MCH_PND_CLR BIT(27)
|
||
#define IMD_MCH_PND_IE BIT(26)
|
||
#define IMD_EMPY_PND BIT(25)
|
||
#define IMD_EMPY_PND_CLR BIT(24)
|
||
#define IMD_EMPY_IE BIT(23)
|
||
#define IMD_RESET_PND BIT(22)
|
||
#define IMD_RESET_PND_CLR BIT(21)
|
||
#define IMD_RESET_IE BIT(20)
|
||
#define IMD_RGB_PND BIT(31)
|
||
#define IMD_RGB_PND_CLR BIT(30)
|
||
#define IMD_RGB_PND_IE BIT(29)
|
||
|
||
#define IMD_LD_KSTART BIT(1)
|
||
#define IMD_RGB_KSTART BIT(1)
|
||
|
||
enum imd_port {
|
||
IMD_IO_GROUPA = 0,
|
||
IMD_IO_GROUPC,
|
||
};
|
||
|
||
//IMD_PLL_DIV28 一帧数据28ms
|
||
//IMD_PLL_DIV24 一帧数据24ms
|
||
//IMD_PLL_DIV20 一帧数据20ms
|
||
//依次类推 DIV后面数值就是一帧数据的时间 帧数为 1000ms/28ms = 35帧
|
||
enum imd_pll_clk_div {
|
||
IMD_PLL_DIV1 = 0,
|
||
IMD_PLL_DIV2,
|
||
IMD_PLL_DIV3,
|
||
IMD_PLL_DIV4,
|
||
IMD_PLL_DIV5,
|
||
IMD_PLL_DIV6,
|
||
IMD_PLL_DIV7,
|
||
IMD_PLL_DIV8,
|
||
IMD_PLL_DIV10,
|
||
IMD_PLL_DIV12,
|
||
IMD_PLL_DIV14,
|
||
IMD_PLL_DIV20,
|
||
IMD_PLL_DIV24,
|
||
IMD_PLL_DIV28,
|
||
IMD_PLL_DIV40,
|
||
IMD_PLL_DIV56,
|
||
};
|
||
enum imd_rgb_format {
|
||
IMD_RGB_888 = 0,
|
||
IMD_RGB_666,
|
||
IMD_RGB_565,
|
||
};
|
||
enum imd_sync {
|
||
IMD_SYNC_DIS = 0,//关闭sync输出
|
||
IMD_SYNC_EN = BIT(2),//使能SYN输出
|
||
IMD_HSYN_EN = BIT(2),//使能HSYN输出
|
||
IMD_VSYN_EN = BIT(2) | BIT(0), //使能VSYN输出
|
||
IMD_DE_EN = BIT(2) | BIT(1), //使能DE输出
|
||
IMD_SYN_EDGE_H = BIT(3),//SYNC(HSYNC/VSYNC/DE)有效电平
|
||
IMD_SYN_EDGE_L = BIT(4),//SYNC(HSYNC/VSYNC/DE)有效电平
|
||
};
|
||
enum imd_data_out_mode {//输出输出大小端
|
||
IMD_DATA_MSB = 0,
|
||
IMD_DATA_LSB,
|
||
};
|
||
enum imd_clk_edge {
|
||
IMD_CLK_UPDATE_L = 0,
|
||
IMD_CLK_UPDATE_H = 1,
|
||
};
|
||
/*
|
||
1、vsync_forward(vf),vsync_behind(vb),vsync_time(vt)帧同步场时间配置(单位:行时间个数):
|
||
例如下面时序:vsync_forward = 2,vsync_behind = 3,vsync_time = 2;
|
||
帧VSYNC:
|
||
________________________________________ ____________________________________
|
||
_____| |_________| |_____
|
||
|
||
行HSYNC:
|
||
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
||
_| |_| |_| |_| |_| |_| |_......_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_......_| |_| |_| |_| |_| |_
|
||
|
||
行有效DE:
|
||
_ _ _ _ _ _ _
|
||
_________________| |_| |_......_| |_| |_____________________________| |_......_| |_| |______________
|
||
|
||
| | | | |
|
||
|--> height <--|-> vf<-|-> vt <-|-> vb <-|
|
||
| | | | |
|
||
|
||
|
||
2、hsync_forward(hf),hsync_behind(hb),hsync_time(ht)行同步场时间配置(单位:时钟个数):
|
||
例如下面时序:hsync_forward = 2,hsync_behind = 3,hsync_time = 2;
|
||
像素点时钟PCLK:
|
||
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
||
_| |_| |_| |_| |_| |_| |_......_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_......_| |_| |_| |_| |_| |_
|
||
|
||
行HSYNC:
|
||
________________________________________ ____________________________________
|
||
_____| |_________| |_____
|
||
|
||
行有效DE:
|
||
____________________ _________________
|
||
_________________| |_____________________________| |____________
|
||
|
||
| | | | |
|
||
|--> width*3byte <--|-> hf<-|-> ht <-|-> hb <-|
|
||
| | | | |
|
||
|
||
|
||
*/
|
||
struct imd_rgb_platform_data {
|
||
u8 test_mode;//IMD打开显示test_color颜色_
|
||
u8 group_port;//IMD_IO_GROUPA/IMD_IO_GROUPC
|
||
u8 irq_en;//true/false
|
||
u8 req_buf_waite;//底层buff更新是否需要等待在中断更新:小分辨率等待,大分辨率不等带
|
||
u8 data_out_mode;//enum imd_data_out_mode 输出输出大小端
|
||
u8 data_in_format;//enum imd_rgb_format
|
||
u8 data_out_format;//enum imd_rgb_format
|
||
u8 pll_clk_div;//enum imd_pll_clk_div
|
||
u8 clk_edge;//IMD_CLK_UPDATE_H/IMD_CLK_UPDATE_L
|
||
u8 de_edge;//IMD_DE_H/IMD_DE_L
|
||
u8 hsync_edge;//IMD_HSYN_H/IMD_HSYN_L
|
||
u8 vsync_edge;//IMD_VSYN_H/IMD_VSYN_L
|
||
u8 data_shift_en;//RGB666数据右移位2位(先右移在按照MSB/LSB输出)
|
||
u8 double_buffer;//应用层一个buffer,底层一个buffer 双buffer切换
|
||
u8 new_double_buffer;//应用层使用双buffer切换
|
||
u16 hsync_forward;//行前沿宽度周期个数
|
||
u16 hsync_behind;//行后沿宽度周期个数
|
||
u16 hsync_time;//行同步脉冲宽度周期
|
||
u16 vsync_forward;//帧前沿宽度周期个数
|
||
u16 vsync_behind;//帧后沿宽度周期个数
|
||
u16 vsync_time;//帧同步脉冲宽度周期
|
||
u16 width;
|
||
u16 height;
|
||
u16 load_height;
|
||
u32 test_color;//初始化颜色
|
||
u32 sync0;//enum imd_sync
|
||
u32 sync1;//enum imd_sync
|
||
u32 sync2;//enum imd_sync
|
||
};
|
||
typedef struct imd_rgb {
|
||
struct imd_rgb_platform_data info;
|
||
struct device dev;
|
||
u8 init;
|
||
u8 in_irq;
|
||
u8 start;
|
||
u8 data_shift_en;//rgb666移位
|
||
u8 soft_kst;
|
||
u8 double_buffer;//应用层一个buffer,底层一个buffer 双buffer切换
|
||
u8 req_buf_waite;//是否需要等待imd中断更新数据,小分辨率需要等待,大分辨率不需要
|
||
volatile u8 req_upate;
|
||
volatile u8 new_upate;
|
||
volatile u8 send_ok;
|
||
volatile u8 upating;
|
||
OS_SEM sem;
|
||
OS_MUTEX mtx;
|
||
u16 load_height;//IMD每次load数据行个数
|
||
u8 *frame_addr;
|
||
u8 *frame_buf;
|
||
u32 fps_cnt;
|
||
u32 frame_size;
|
||
u32 one_line_bytes;
|
||
void *irq_cb_priv;
|
||
void (*irq_cb)(void *priv);
|
||
} IMD_RGB;
|
||
|
||
#define IMD_RGB_PLATFORM_DATA_BEGIN(rgb) \
|
||
static const struct imd_rgb_platform_data rgb = {
|
||
|
||
|
||
#define IMD_RGB_PLATFORM_DATA_END() \
|
||
};
|
||
|
||
extern const struct device_operations imd_dev_ops;
|
||
|
||
#endif
|