diff options
Diffstat (limited to 'linux/drivers/media/dvb/ttpci/av7110.h')
-rw-r--r-- | linux/drivers/media/dvb/ttpci/av7110.h | 695 |
1 files changed, 695 insertions, 0 deletions
diff --git a/linux/drivers/media/dvb/ttpci/av7110.h b/linux/drivers/media/dvb/ttpci/av7110.h new file mode 100644 index 000000000..d1eabe3ab --- /dev/null +++ b/linux/drivers/media/dvb/ttpci/av7110.h @@ -0,0 +1,695 @@ +#ifndef _AV7110_H_ +#define _AV7110_H_ + +#define DVB_FIRM_PATH "/lib/DVB/" + +#include <linux/interrupt.h> +#include <linux/socket.h> +#include <linux/netdevice.h> + +#ifdef CONFIG_DEVFS_FS +#include <linux/devfs_fs_kernel.h> +#endif + +#include "saa7146_vv.h" + +/* DEBI transfer mode defs */ + +#define DEBINOSWAP 0x000e0000 +#define DEBISWAB 0x001e0000 +#define DEBISWAP 0x002e0000 + +#define ARM_WAIT_FREE (HZ) +#define ARM_WAIT_SHAKE (HZ/5) +#define ARM_WAIT_OSD (HZ) + +#define WAIT_QUEUE wait_queue_head_t + +#include <linux/dvb/video.h> +#include <linux/dvb/audio.h> +#include <linux/dvb/dmx.h> +#include <linux/dvb/ca.h> +#include <linux/dvb/osd.h> +#include <linux/dvb/net.h> + +#include "dvbdev.h" +#include "demux.h" +#include "dvb_demux.h" +#include "dmxdev.h" +#include "dvb_filter.h" +#include "dvb_net.h" + +typedef enum BOOTSTATES +{ + BOOTSTATE_BUFFER_EMPTY = 0, + BOOTSTATE_BUFFER_FULL = 1, + BOOTSTATE_BOOT_COMPLETE = 2 +} BOOTSTATES; + +typedef enum +{ RP_None, + AudioPES, + AudioMp2, + AudioPCM, + VideoPES, + AV_PES +} TYPE_REC_PLAY_FORMAT; + +typedef struct PARAMSTRUCT +{ + unsigned int wCommand; + int error; + unsigned long pdwData[100]; +} PARAMSTRUCT, *PPARAMSTRUCT; + +typedef enum OSDPALTYPE +{ + NoPalet = 0, /* No palette */ + Pal1Bit = 2, /* 2 colors for 1 Bit Palette */ + Pal2Bit = 4, /* 4 colors for 2 bit palette */ + Pal4Bit = 16, /* 16 colors for 4 bit palette */ + Pal8Bit = 256 /* 256 colors for 16 bit palette */ +} OSDPALTYPE, *POSDPALTYPE; + +typedef enum { + BITMAP1, /* 1 bit bitmap */ + BITMAP2, /* 2 bit bitmap */ + BITMAP4, /* 4 bit bitmap */ + BITMAP8, /* 8 bit bitmap */ + BITMAP1HR, /* 1 Bit bitmap half resolution */ + BITMAP2HR, /* 2 bit bitmap half resolution */ + BITMAP4HR, /* 4 bit bitmap half resolution */ + BITMAP8HR, /* 8 bit bitmap half resolution */ + YCRCB422, /* 4:2:2 YCRCB Graphic Display */ + YCRCB444, /* 4:4:4 YCRCB Graphic Display */ + YCRCB444HR, /* 4:4:4 YCRCB graphic half resolution */ + VIDEOTSIZE, /* True Size Normal MPEG Video Display */ + VIDEOHSIZE, /* MPEG Video Display Half Resolution */ + VIDEOQSIZE, /* MPEG Video Display Quarter Resolution */ + VIDEODSIZE, /* MPEG Video Display Double Resolution */ + VIDEOTHSIZE, /* True Size MPEG Video Display Half Resolution */ + VIDEOTQSIZE, /* True Size MPEG Video Display Quarter Resolution*/ + VIDEOTDSIZE, /* True Size MPEG Video Display Double Resolution */ + VIDEONSIZE, /* Full Size MPEG Video Display */ + CURSOR /* Cursor */ +} DISPTYPE; /* Window display type */ + +// switch defines +#define SB_GPIO 3 +#define SB_OFF SAA7146_GPIO_OUTLO //SlowBlank aus (TV-Mode) +#define SB_ON SAA7146_GPIO_INPUT //SlowBlank an (AV-Mode) +#define SB_WIDE SAA7146_GPIO_OUTHI //SlowBlank 6V (16/9-Mode) nicht realisiert + +#define FB_GPIO 1 +#define FB_OFF SAA7146_GPIO_LO //FastBlank aus (CVBS-Mode) +#define FB_ON SAA7146_GPIO_OUTHI //FastBlank an (RGB-Mode) +#define FB_LOOP SAA7146_GPIO_INPUT //FastBlank der PC-Grafik durchschleifen + +typedef enum VIDEOOUTPUTMODE +{ + NO_OUT = 0, //disable analog Output + CVBS_RGB_OUT = 1, + CVBS_YC_OUT = 2, + YC_OUT = 3 +} VIDEOOUTPUTMODE, *PVIDEOOUTPUTMODE; + + +#define GPMQFull 0x0001 //Main Message Queue Full +#define GPMQOver 0x0002 //Main Message Queue Overflow +#define HPQFull 0x0004 //High Priority Msg Queue Full +#define HPQOver 0x0008 +#define OSDQFull 0x0010 //OSD Queue Full +#define OSDQOver 0x0020 + +#define SECTION_EIT 0x01 +#define SECTION_SINGLE 0x00 +#define SECTION_CYCLE 0x02 +#define SECTION_CONTINUOS 0x04 +#define SECTION_MODE 0x06 +#define SECTION_IPMPE 0x0C // bis zu 4k groß +#define SECTION_HIGH_SPEED 0x1C // vergrößerter Puffer für High Speed Filter +#define DATA_PIPING_FLAG 0x20 // für Data Piping Filter + +#define PBUFSIZE_NONE 0x0000 +#define PBUFSIZE_1P 0x0100 +#define PBUFSIZE_2P 0x0200 +#define PBUFSIZE_1K 0x0300 +#define PBUFSIZE_2K 0x0400 +#define PBUFSIZE_4K 0x0500 +#define PBUFSIZE_8K 0x0600 +#define PBUFSIZE_16K 0x0700 +#define PBUFSIZE_32K 0x0800 + +typedef enum { + WCreate, + WDestroy, + WMoveD, + WMoveA, + WHide, + WTop, + DBox, + DLine, + DText, + Set_Font, + SetColor, + SetBlend, + SetWBlend, + SetCBlend, + SetNonBlend, + LoadBmp, + BlitBmp, + ReleaseBmp, + SetWTrans, + SetWNoTrans +} OSDCOM; + +typedef enum { + MultiPID, + VideoPID, + AudioPID, + InitFilt, + FiltError, + NewVersion, + CacheError, + AddPIDFilter, + DelPIDFilter, + Scan, + SetDescr, + SetIR +} PIDCOM; + +typedef enum { + SelAudChannels +} MPEGCOM; + +typedef enum { + AudioDAC, + CabADAC, + ON22K, + OFF22K, + MainSwitch, + ADSwitch, + SendDiSEqC, + SetRegister +} AUDCOM; + +typedef enum { + AudioState, + AudioBuffState, + VideoState1, + VideoState2, + VideoState3, + CrashCounter, + ReqVersion, + ReqVCXO, + ReqRegister +} REQCOM; + +typedef enum { + SetVidMode, + SetTestMode, + LoadVidCode, + SetMonitorType, + SetPanScanType, + SetFreezeMode +} ENC; + +typedef enum { + __Record, + __Stop, + __Play, + __Pause, + __Slow, + __FF_IP, + __Scan_I, + __Continue +} REC_PLAY; + +typedef enum { + COMTYPE_NOCOM, + COMTYPE_PIDFILTER, + COMTYPE_MPEGDECODER, + COMTYPE_OSD, + COMTYPE_BMP, + COMTYPE_ENCODER, + COMTYPE_AUDIODAC, + COMTYPE_REQUEST, + COMTYPE_SYSTEM, + COMTYPE_REC_PLAY, + COMTYPE_COMMON_IF, + COMTYPE_PID_FILTER, + COMTYPE_PES, + COMTYPE_TS, + COMTYPE_VIDEO, + COMTYPE_AUDIO, + COMTYPE_CI_LL, +} COMTYPE; + +typedef enum { + AV7110_VIDEO_FREEZE, + AV7110_VIDEO_CONTINUE +} VIDEOCOM; + +typedef enum { + DVB_AUDIO_PAUSE, +} AUDIOCOM; + + +#define VID_NONE_PREF 0x00 /* No aspect ration processing preferred */ +#define VID_PAN_SCAN_PREF 0x01 /* Pan and Scan Display preferred */ +#define VID_VERT_COMP_PREF 0x02 /* Vertical compression display preferred */ +#define VID_VC_AND_PS_PREF 0x03 /* PanScan and vertical Compression if allowed */ +#define VID_CENTRE_CUT_PREF 0x05 /* PanScan with zero vector */ + +#define DATA_NONE 0x00 +#define DATA_FSECTION 0x01 +#define DATA_IPMPE 0x02 +#define DATA_MPEG_RECORD 0x03 +#define DATA_DEBUG_MESSAGE 0x04 +#define DATA_COMMON_INTERFACE 0x05 +#define DATA_MPEG_PLAY 0x06 +#define DATA_BMP_LOAD 0x07 +#define DATA_IRCOMMAND 0x08 +#define DATA_PIPING 0x09 +#define DATA_STREAMING 0x0a +#define DATA_CI_GET 0x0b +#define DATA_CI_PUT 0x0c + +#define DATA_PES_RECORD 0x10 +#define DATA_PES_PLAY 0x11 +#define DATA_TS_RECORD 0x12 +#define DATA_TS_PLAY 0x13 + +#define CI_CMD_ERROR 0x00 +#define CI_CMD_ACK 0x01 +#define CI_CMD_SYSTEM_READY 0x02 +#define CI_CMD_KEYPRESS 0x03 +#define CI_CMD_ON_TUNED 0x04 +#define CI_CMD_ON_SWITCH_PROGRAM 0x05 +#define CI_CMD_SECTION_ARRIVED 0x06 +#define CI_CMD_SECTION_TIMEOUT 0x07 +#define CI_CMD_TIME 0x08 +#define CI_CMD_ENTER_MENU 0x09 +#define CI_CMD_FAST_PSI 0x0a +#define CI_CMD_GET_SLOT_INFO 0x0b + +#define CI_MSG_NONE 0x00 +#define CI_MSG_CI_INFO 0x01 +#define CI_MSG_MENU 0x02 +#define CI_MSG_LIST 0x03 +#define CI_MSG_TEXT 0x04 +#define CI_MSG_REQUEST_INPUT 0x05 +#define CI_MSG_INPUT_COMPLETE 0x06 +#define CI_MSG_LIST_MORE 0x07 +#define CI_MSG_MENU_MORE 0x08 +#define CI_MSG_CLOSE_MMI_IMM 0x09 +#define CI_MSG_SECTION_REQUEST 0x0a +#define CI_MSG_CLOSE_FILTER 0x0b +#define CI_PSI_COMPLETE 0x0c +#define CI_MODULE_READY 0x0d +#define CI_SWITCH_PRG_REPLY 0x0e +#define CI_MSG_TEXT_MORE 0x0f + +#define CI_MSG_CA_PMT 0xe0 +#define CI_MSG_ERROR 0xf0 + +typedef struct ring_buffer_s { + u8 *data; + int size; + int pread; + int pwrite; + + WAIT_QUEUE queue; + spinlock_t lock; + struct semaphore sema; + + int error; +} ring_buffer_t; + + +#define PROG_STREAM_MAP 0xBC +#define PRIVATE_STREAM1 0xBD +#define PADDING_STREAM 0xBE +#define PRIVATE_STREAM2 0xBF +#define AUDIO_STREAM_S 0xC0 +#define AUDIO_STREAM_E 0xDF +#define VIDEO_STREAM_S 0xE0 +#define VIDEO_STREAM_E 0xEF +#define ECM_STREAM 0xF0 +#define EMM_STREAM 0xF1 +#define DSM_CC_STREAM 0xF2 +#define ISO13522_STREAM 0xF3 +#define PROG_STREAM_DIR 0xFF + +#define PTS_DTS_FLAGS 0xC0 + +//pts_dts flags +#define PTS_ONLY 0x80 +#define PTS_DTS 0xC0 +#define TS_SIZE 188 +#define TRANS_ERROR 0x80 +#define PAY_START 0x40 +#define TRANS_PRIO 0x20 +#define PID_MASK_HI 0x1F +//flags +#define TRANS_SCRMBL1 0x80 +#define TRANS_SCRMBL2 0x40 +#define ADAPT_FIELD 0x20 +#define PAYLOAD 0x10 +#define COUNT_MASK 0x0F + +// adaptation flags +#define DISCON_IND 0x80 +#define RAND_ACC_IND 0x40 +#define ES_PRI_IND 0x20 +#define PCR_FLAG 0x10 +#define OPCR_FLAG 0x08 +#define SPLICE_FLAG 0x04 +#define TRANS_PRIV 0x02 +#define ADAP_EXT_FLAG 0x01 + +// adaptation extension flags +#define LTW_FLAG 0x80 +#define PIECE_RATE 0x40 +#define SEAM_SPLICE 0x20 + +#define MAX_PLENGTH 0xFFFF +#define MAX_VID_PES 0x1FFF + +typedef struct section_s { + int id; + int length; + int found; + u8 payload[4096+3]; +} section_t; + + +#define MY_STATE_PES_START 1 +#define MY_STATE_PES_STARTED 2 +#define MY_STATE_FULL 4 + +#define MASKL DMX_MAX_FILTER_SIZE +#define MAXFILT 32 + +struct dvb_filter { + int state; + int flags; + int type; + u8 ts_state; + + u16 pid; + u8 value[MASKL]; + u8 mask[MASKL]; +}; + + +enum {AV_PES_STREAM, PS_STREAM, TS_STREAM, PES_STREAM}; + +typedef struct ps_packet_s{ + u8 scr[6]; + u8 mux_rate[3]; + u8 stuff_length; + u8 data[20]; + u8 sheader_llength[2]; + int sheader_length; + u8 rate_bound[3]; + u8 audio_bound; + u8 video_bound; + u8 reserved; + int npes; + int mpeg; +} ps_packet_t; + +typedef struct a2p_s{ + int type; + int found; + int length; + int headr; + u8 cid; + u8 flags; + u8 abuf[MAX_PLENGTH]; + int alength; + u8 vbuf[MAX_PLENGTH]; + int vlength; + int plength; + u8 last_av_pts[4]; + u8 av_pts[4]; + u8 scr[4]; + u16 count0; + u16 count1; + u16 pidv; + u16 pida; + u16 countv; + u16 counta; + void *dataA; + void *dataV; + void (*write_cb)(u8 const *buf, long int count, + void *data); +} a2p_t; + + +typedef struct p2t_s { + u8 pes[TS_SIZE]; + u8 counter; + long int pos; + int frags; + struct dvb_demux_feed *feed; +} p2t_t; + +/* place to store all the necessary device information */ +typedef struct av7110_s { + + /* devices */ + + struct dvb_device dvb_dev; + dvb_net_t dvb_net; + struct video_device vd; + + struct saa7146_dev *dev; + + struct dvb_i2c_bus *i2c_bus; + char *card_name; + + struct tasklet_struct debi_tasklet; + struct tasklet_struct gpio_tasklet; + + int adac_type; /* audio DAC type */ +#define DVB_ADAC_TI 0 +#define DVB_ADAC_CRYSTAL 1 +#define DVB_ADAC_NONE -1 + + + /* buffers */ + + void *iobuf; /* memory for all buffers */ + ring_buffer_t avout; /* buffer for video or A/V mux */ +#define AVOUTLEN (128*1024) + ring_buffer_t aout; /* buffer for audio */ +#define AOUTLEN (64*1024) + void *bmpbuf; +#define BMPLEN (8*32768+1024) + + /* bitmap buffers and states */ + + int bmpp; + int bmplen; + int bmp_win; + u16 bmp_x, bmp_y; + int bmp_trans; + int bmp_state; +#define BMP_NONE 0 +#define BMP_LOADING 1 +#define BMP_LOADINGS 2 +#define BMP_LOADED 3 + WAIT_QUEUE bmpq; + + + /* DEBI and polled command interface */ + + spinlock_t debilock; + struct semaphore dcomlock; + int debitype; + int debilen; + int debibuf; + + + /* Recording and playback flags */ + + int rec_mode; + int playing; +#define RP_NONE 0 +#define RP_VIDEO 1 +#define RP_AUDIO 2 +#define RP_AV 3 + + + /* OSD */ + + int osdwin; /* currently active window */ + u16 osdbpp[8]; + + + /* CA */ + + ca_slot_info_t ci_slot[2]; + + int vidmode; + dmxdev_t dmxdev; + struct dvb_demux demux; + char demux_id[16]; + + dmx_frontend_t hw_frontend; + dmx_frontend_t mem_frontend; + + int fe_synced; + struct semaphore pid_mutex; + + int video_blank; + struct video_status videostate; + int display_ar; + int trickmode; +#define TRICK_NONE 0 +#define TRICK_FAST 1 +#define TRICK_SLOW 2 +#define TRICK_FREEZE 3 + struct audio_status audiostate; + + struct dvb_demux_filter *handle2filter[32]; + p2t_t p2t_filter[MAXFILT]; + dvb_filter_pes2ts_t p2t[2]; + struct ipack_s ipack[2]; + u8 *kbuf[2]; + + int sinfo; + int feeding; + + int arm_errors; + int registered; + + + /* AV711X */ + + u32 arm_fw; + u32 arm_rtsl; + u32 arm_vid; + u32 arm_app; + u32 avtype; + int arm_ready; + struct task_struct *arm_thread; + WAIT_QUEUE arm_wait; + u16 arm_loops; + int arm_rmmod; + + void *debi_virt; + dma_addr_t debi_bus; + + u16 pids[DMX_PES_OTHER]; + + ring_buffer_t ci_rbuffer; + ring_buffer_t ci_wbuffer; + + + struct dvb_adapter *dvb_adapter; + struct dvb_device *video_dev; + struct dvb_device *audio_dev; + struct dvb_device *ca_dev; + struct dvb_device *osd_dev; + + int dsp_dev; +} av7110_t; + + +#define DPRAM_BASE 0x4000 + +#define BOOT_STATE (DPRAM_BASE + 0x3F8) +#define BOOT_SIZE (DPRAM_BASE + 0x3FA) +#define BOOT_BASE (DPRAM_BASE + 0x3FC) +#define BOOT_BLOCK (DPRAM_BASE + 0x400) +#define BOOT_MAX_SIZE 0xc00 + +#define IRQ_STATE (DPRAM_BASE + 0x0F4) +#define IRQ_STATE_EXT (DPRAM_BASE + 0x0F6) +#define MSGSTATE (DPRAM_BASE + 0x0F8) +#define FILT_STATE (DPRAM_BASE + 0x0FA) +#define COMMAND (DPRAM_BASE + 0x0FC) +#define COM_BUFF (DPRAM_BASE + 0x100) +#define COM_BUFF_SIZE 0x20 + +#define BUFF1_BASE (DPRAM_BASE + 0x120) +#define BUFF1_SIZE 0xE0 + +#define DATA_BUFF_BASE (DPRAM_BASE + 0x200) +#define DATA_BUFF_SIZE 0x1C00 + +/* new buffers */ + +#define DATA_BUFF0_BASE (DPRAM_BASE + 0x200) +#define DATA_BUFF0_SIZE 0x0800 + +#define DATA_BUFF1_BASE (DATA_BUFF0_BASE+DATA_BUFF0_SIZE) +#define DATA_BUFF1_SIZE 0x0800 + +#define DATA_BUFF2_BASE (DATA_BUFF1_BASE+DATA_BUFF1_SIZE) +#define DATA_BUFF2_SIZE 0x0800 + +#define Reserved (DPRAM_BASE + 0x1E00) +#define Reserved_SIZE 0x1C0 + +#define DEBUG_WINDOW (DPRAM_BASE + 0x1FC0) +#define DBG_LOOP_CNT (DEBUG_WINDOW + 0x00) +#define DBG_SEC_CNT (DEBUG_WINDOW + 0x02) +#define DBG_AVRP_BUFF (DEBUG_WINDOW + 0x04) +#define DBG_AVRP_PEAK (DEBUG_WINDOW + 0x06) +#define DBG_MSG_CNT (DEBUG_WINDOW + 0x08) +#define DBG_CODE_REG (DEBUG_WINDOW + 0x0a) +#define DBG_TTX_Q (DEBUG_WINDOW + 0x0c) +#define DBG_AUD_EN (DEBUG_WINDOW + 0x0e) +#define DBG_WRONG_COM (DEBUG_WINDOW + 0x10) +#define DBG_ARR_OVFL (DEBUG_WINDOW + 0x12) +#define DBG_BUFF_OVFL (DEBUG_WINDOW + 0x14) +#define DBG_OVFL_CNT (DEBUG_WINDOW + 0x16) +#define DBG_SEC_OVFL (DEBUG_WINDOW + 0x18) + +#define STATUS_BASE (DPRAM_BASE + 0x1FC0) +#define STATUS_SCR (STATUS_BASE + 0x00) +#define STATUS_MODES (STATUS_BASE + 0x04) +#define STATUS_LOOPS (STATUS_BASE + 0x08) + +#define RX_TYPE (DPRAM_BASE + 0x1FE8) +#define RX_LEN (DPRAM_BASE + 0x1FEA) +#define TX_TYPE (DPRAM_BASE + 0x1FEC) +#define TX_LEN (DPRAM_BASE + 0x1FEE) + +#define RX_BUFF (DPRAM_BASE + 0x1FF4) +#define TX_BUFF (DPRAM_BASE + 0x1FF6) + +#define HANDSHAKE_REG (DPRAM_BASE + 0x1FF8) +#define COM_IF_LOCK (DPRAM_BASE + 0x1FFA) + +#define IRQ_RX (DPRAM_BASE + 0x1FFC) +#define IRQ_TX (DPRAM_BASE + 0x1FFE) + +#define DRAM_START_CODE 0x2e000404 +#define DRAM_MAX_CODE_SIZE 0x00100000 + +#define RESET_LINE 2 +#define DEBI_DONE_LINE 1 +#define ARM_IRQ_LINE 0 + +#define DAC_CS 0x8000 +#define DAC_CDS 0x0000 + + +extern unsigned char *av7110_dpram_addr, *av7110_root_addr; +extern int av7110_dpram_len, av7110_root_len; + +extern void av7110_register_irc_handler(void (*func)(u32)); +extern void av7110_unregister_irc_handler(void (*func)(u32)); +extern void av7110_setup_irc_config (av7110_t *av7110, u32 ir_config); + +extern int av7110_ir_init (void); +extern void av7110_ir_exit (void); + + +#endif /* _AV7110_H_ */ + |