doubao_chat/include_lib/driver/cpu/wl82/asm/isc.h

210 lines
6.6 KiB
C

#ifndef __ISC_H__
#define __ISC_H__
#include "gpio.h"
#include "fs/fs.h"
#include "spinlock.h"
#include "asm/isp_dev.h"
/****** ISC sensor group_port ********/
#define ISC_GROUPA IO_PORTA
#define ISC_GROUPC IO_PORTC
#define ISC_GROUPH IO_PORTH
/*************ie type ****************/
#define EXTERN_CONNECT_IE (BIT(3)|BIT(4))//DMA_CON
#define LDONE_IE BIT(3)//COM_CON
#define FDONE_IE BIT(4)//COM_CON
#define BDONE_IE BIT(5)//COM_CON
#define ISCERR_PROTEC_CLR BIT(12)//COM_CON
#define ISCERR_PROTEC_PND BIT(13)//COM_CON
#define BWERR_IE BIT(6)//COM_CON
#define LINERR_IE BIT(7)//COM_CON
#define OSDERR_IE BIT(8)//COM_CON
#define SET_IE(reg,ie_type) (reg |= ie_type)
#define SET_IE(reg,ie_type) (reg |= ie_type)
#define GET_IE(reg,ie_type) (reg & ie_type)
#define GET_PND(reg,pnd_type) (reg & pnd_type)
#define UNSET_IE(reg,ie_type) (reg &=~ie_type)
/********** pending and clear type *************/
#define LDONE_PND BIT(3)
#define FDONE_PND BIT(4)
#define BDONE_PND BIT(5)
#define BWERR_PND BIT(6)
#define LINERR_PND BIT(7)
#define OSDERR_PND BIT(8)
/*************read pending*************/
#define IRQ_FSTART(reg, r) ((r & FSTART_PND) && (reg & FSTART_IE))
#define IRQ_FDONE(reg, r) ((r & FDONE_PND) && (reg & FDONE_IE))
#define IRQ_LDONE(reg, r) ((r & LDONE_PND) && (reg & LDONE_IE))
#define IRQ_LINERR(reg, r) ((r & LINERR_PND) && (reg & LINERR_IE))
#define IRQ_LOUTERR(reg, r) ((r & LOUTERR_PND) && (reg & LOUTERR_IE))
#define IRQ_BDONE(reg, r) ((r & BDONE_PND) && (reg & BDONE_IE))
#define IRQ_BWERR(reg, r) ((r & BWERR_PND) && (reg & BWERR_IE))
#define IRQ_OSD_ERR(reg) (reg & BIT(3))
/****************buf mode**************/
#define FRAME_BUF_MODE 0x0
#define CYCLE_BUF_MODE 0x1
#define REGISTER_DEBUG 0x2
typedef enum {
ISC_DATAMODE_8B,
ISC_DATAMODE_8B_REVERSE,
} isc_datamode_t;
typedef enum {
ISC_INPUT_DATAMODE_YUYV = 0,
ISC_INPUT_DATAMODE_UYVY,
} isc_input_datamode_t;
typedef enum {
ISC_OUTPUT_DATAMODE_YUV422 = 2,
ISC_OUTPUT_DATAMODE_YUV420 = 4,
} isc_output_datamode_t;
typedef enum {
ISC_TIMINGMODE_DVP = 0,
ISC_TIMINGMODE_ITU656,
ISC_TIMINGMODE_ITU601,
ISC_TIMINGMODE_BT656,
ISC_TIMINGMODE_VSYNC,
} isc_timingmode_t;
typedef enum {
ISC_SCANMODE_PROGRESSIVE = 0,
ISC_SCANMODE_ODD,
ISC_SCANMODE_EVEN,
} isc_scanmode_t;
typedef enum {
ISC_DATAMUX_SENSOR0 = 0,
ISC_DATAMUX_SENSOR1,
ISC_DATAMUX_MIPI,
} isc_datamux_t;
typedef enum {
ISC_IRQ_ERR_NONE = 0,
ISC_IRQ_BANDWITH_ERR = 0x12000,
ISC_IRQ_LINE_IN_ERR,
ISC_IRQ_LINE_OUT_ERR,
} ISC_IRQ_ENC_ERR;
struct yuv_block_info {
volatile u8 *y;
volatile u8 *u;
volatile u8 *v;
volatile u32 ylen;
volatile u32 ulen;
volatile u32 vlen;
volatile u16 width;
volatile u16 height;
volatile u16 line;
volatile u8 start;
};
struct isc_cfg {
u8 id;
u8 bdone_ref;
u8 *y;
u32 y_len;
u32 u_len;
u32 v_len;
u32 yuv_len;
u32 yuv_buf_size;
u16 width;
u16 height;
JL_ISC_TypeDef *reg;
u16 line;//循环BUF模式行数
void *hdl;
int (*handler)(void *hdl, int code, int ft);
u8 *fybuf;
u8 *fubuf;
u8 *fvbuf;
volatile u8 *next_yaddr;
volatile u8 *prev_yaddr;
volatile u32 yoffset;
volatile u32 uoffset;
volatile u32 voffset;
u32 flen;
u32 next_dma_addr;
u32 read_dma_addr;
OS_SEM *sem;
u8 dma_copy_id;
u32 ppbuf_cnt;
u32 frame_cnt;
volatile u8 fstart;
volatile u8 buf_mode;
volatile u8 fps;
volatile u8 output_mode;
volatile u8 ppbuf_mode;
volatile u8 yuv_used;
volatile u8 yuv_start;
volatile u8 yuv_use_dam;
volatile u8 in_irq;
volatile u8 connjpg;
struct yuv_block_info block_info;
int (*block_done_cb)(void *info);
void *frame_done_priv;
int (*frame_done_cb)(void *priv, int id, void *blk_info);
};
extern void isc_sen_init(char id);
extern void isc_sen_reinit(void *isc);
extern void *isc_sen_open(char id);
extern void isc_sen_en(void *isc, u8 en);
extern void isc_force_en(char id, u8 en);
extern void isc_sen_start(void *isc);
extern void isc_sen_stop(void *isc);
extern void isc_sen_close(void *isc);
extern void isc_sen_discon_from_jpeg(void *isc);
extern void isc_sen_set_polarity(void *isc, u8 pclk, u8 vsync, u8 hsync);
extern void isc_sen_set_datamode(void *isc, isc_datamode_t mode, u32 config, u32 start_io);
extern void isc_sen_set_output_datamode(void *isc, isc_output_datamode_t mode);
extern void isc_sen_set_timingmode(void *isc, isc_timingmode_t mode);
extern void isc_sen_set_vact_hact(void *isc, u16 hact, u16 vact);
extern void isc_sen_set_bufamode(void *isc, char bufmode, u8 connjpg_mode);
extern void isc_sen_set_complete(void *isc, char connjpg_mode);
extern void isc_sen_set_input_datamode(void *isc, sen_in_format_t mode);
extern void isc_sen_set_yuv_addr(void *isc, u8 *y, u32 yuvbuf_size);
extern int isc_sen_get_yuv_addr(void *isc, u32 *y);
extern int isc_sen_get_cfg_line(void *isc);
extern int isc_sen_set_cfg_line(void *isc, int line);
extern void isc_sen_set_out_fps(void *isc, u8 src_fps, u8 fps);
extern void isc_sen_register_irq(void *isc, int (*handler)(void *hdl, int code, int ft));
extern void *isc_get_handler(void *isc);
extern int isc_sen_set_hdl(void *isc, void *hdl);
extern void isc_yuv_mode_set_param(void *isc, u8 *fybuf, u8 *fubuf, u8 *fvbuf, u32 len, OS_SEM *sem);
extern void isc_yuv_mode_clear(void *isc);
extern void isc_yuv_mode_close(void *isc);
extern void *isc_dma_copy_wait(void *isc, u32 *size);
extern void isc_sen_yuv_addr_lock_reset(struct isc_cfg *isc_info, char dma_buf_id);
extern void isc_sen_info_init(void *isc);
extern int isc_sen_get_fps(void *isc);
extern void isc_sen_ppbuf_mode_set(void *isc, char set);
extern void isc_sen_block_done_cb_set(void *isc, int (*block_done_cb)(void *priv));
extern void isc_sen_frame_done_cb_set(void *isc, int (*frame_done_cb)(void *priv, int id));
extern void isc_sen_frame_done_priv_set(void *isc, void *priv);
extern void isc_sen_connet_to_jpeg(void *isc, char reset_isc);
extern void isc_vhsync_exchange(void *isc, char isc_id, int sync);
extern void bt656_one_line_init(void *yuv, u32 yuv_size, int width, int height, sen_in_format_t mode);
extern void bt656_one_line_io_init(u32 pclk_gpio, u32 pclk_sample, u32 pclk_no_filter, u32 data0_gpio, u32 data_gpio_num);
extern void bt656_one_line_databits_config(u32 databit, u8 msb_lsb_rev, u8 shift);
extern void bt656_one_line_pclk(u32 pclk_sample, u32 pclk_no_filter);
extern void bt656_one_line_framedone_reg(int *fdone_cb, void *parm);
extern void bt656_one_line_en(char en);
extern void bt656_one_line_exit(void);
#endif