#ifndef _AV7110_HW_H_ #define _AV7110_HW_H_ #include "av7110.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) enum av7110_bootstate { BOOTSTATE_BUFFER_EMPTY = 0, BOOTSTATE_BUFFER_FULL = 1, BOOTSTATE_AV7110_BOOT_COMPLETE = 2 }; enum av7110_type_rec_play_format { RP_None, AudioPES, AudioMp2, AudioPCM, VideoPES, AV_PES }; enum av7110_osd_palette_type { 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 */ }; /* switch defines */ #define SB_GPIO 3 #define SB_OFF SAA7146_GPIO_OUTLO /* SlowBlank off (TV-Mode) */ #define SB_ON SAA7146_GPIO_INPUT /* SlowBlank on (AV-Mode) */ #define SB_WIDE SAA7146_GPIO_OUTHI /* SlowBlank 6V (16/9-Mode) (not implemented) */ #define FB_GPIO 1 #define FB_OFF SAA7146_GPIO_LO /* FastBlank off (CVBS-Mode) */ #define FB_ON SAA7146_GPIO_OUTHI /* FastBlank on (RGB-Mode) */ #define FB_LOOP SAA7146_GPIO_INPUT /* FastBlank loop-through (PC graphics ???) */ enum av7110_video_output_mode { NO_OUT = 0, /* disable analog output */ CVBS_RGB_OUT = 1, CVBS_YC_OUT = 2, YC_OUT = 3 }; /* firmware internal msg q status: */ #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 GPMQBusy 0x0040 /* Queue not empty, FW >= 261d */ #define HPQBusy 0x0080 #define OSDQBusy 0x0100 /* hw section filter flags */ #define SECTION_EIT 0x01 #define SECTION_SINGLE 0x00 #define SECTION_CYCLE 0x02 #define SECTION_CONTINUOS 0x04 #define SECTION_MODE 0x06 #define SECTION_IPMPE 0x0C /* size up to 4k */ #define SECTION_HIGH_SPEED 0x1C /* larger buffer */ #define DATA_PIPING_FLAG 0x20 /* for 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 /* firmware command codes */ enum av7110_osd_command { WCreate, WDestroy, WMoveD, WMoveA, WHide, WTop, DBox, DLine, DText, Set_Font, SetColor, SetBlend, SetWBlend, SetCBlend, SetNonBlend, LoadBmp, BlitBmp, ReleaseBmp, SetWTrans, SetWNoTrans, Set_Palette }; enum av7110_pid_command { MultiPID, VideoPID, AudioPID, InitFilt, FiltError, NewVersion, CacheError, AddPIDFilter, DelPIDFilter, Scan, SetDescr, SetIR, FlushTSQueue }; enum av7110_mpeg_command { SelAudChannels }; enum av7110_audio_command { AudioDAC, CabADAC, ON22K, OFF22K, MainSwitch, ADSwitch, SendDiSEqC, SetRegister, SpdifSwitch }; enum av7110_request_command { AudioState, AudioBuffState, VideoState1, VideoState2, VideoState3, CrashCounter, ReqVersion, ReqVCXO, ReqRegister, ReqSecFilterError, ReqSTC }; enum av7110_encoder_command { SetVidMode, SetTestMode, LoadVidCode, SetMonitorType, SetPanScanType, SetFreezeMode, SetWSSConfig }; enum av7110_rec_play_state { __Record, __Stop, __Play, __Pause, __Slow, __FF_IP, __Scan_I, __Continue }; enum av7110_fw_cmd_misc { AV7110_FW_VIDEO_ZOOM = 1, AV7110_FW_VIDEO_COMMAND, AV7110_FW_AUDIO_COMMAND }; enum av7110_command_type { 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_MISC = 0x80 }; #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 */ /* MPEG video decoder commands */ #define AV_VIDEO_CMD_STOP 0x000e #define AV_VIDEO_CMD_PLAY 0x000d #define AV_VIDEO_CMD_FREEZE 0x0102 #define AV_VIDEO_CMD_FFWD 0x0016 #define AV_VIDEO_CMD_SLOW 0x0022 /* MPEG audio decoder commands */ #define AUDIO_CMD_MUTE 0x0001 #define AUDIO_CMD_UNMUTE 0x0002 #define AUDIO_CMD_PCM16 0x0010 #define AUDIO_CMD_STEREO 0x0080 #define AUDIO_CMD_MONO_L 0x0100 #define AUDIO_CMD_MONO_R 0x0200 #define AUDIO_CMD_SYNC_OFF 0x000e #define AUDIO_CMD_SYNC_ON 0x000f /* firmware data interface codes */ #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_MPEG_VIDEO_EVENT 0x0d #define DATA_PES_RECORD 0x10 #define DATA_PES_PLAY 0x11 #define DATA_TS_RECORD 0x12 #define DATA_TS_PLAY 0x13 /* ancient CI command codes, only two are actually still used * by the link level CI firmware */ #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 /* base address of the dual ported RAM which serves as communication * area between PCI bus and av7110, * as seen by the DEBI bus of the saa7146 */ #define DPRAM_BASE 0x4000 /* boot protocol area */ #define AV7110_BOOT_STATE (DPRAM_BASE + 0x3F8) #define AV7110_BOOT_SIZE (DPRAM_BASE + 0x3FA) #define AV7110_BOOT_BASE (DPRAM_BASE + 0x3FC) #define AV7110_BOOT_BLOCK (DPRAM_BASE + 0x400) #define AV7110_BOOT_MAX_SIZE 0xc00 /* firmware command protocol area */ #define IRQ_STATE (DPRAM_BASE + 0x0F4) #define IRQ_STATE_EXT (DPRAM_BASE + 0x0F6) #define MSGSTATE (DPRAM_BASE + 0x0F8) #define COMMAND (DPRAM_BASE + 0x0FC) #define COM_BUFF (DPRAM_BASE + 0x100) #define COM_BUFF_SIZE 0x20 /* various data buffers */ #define BUFF1_BASE (DPRAM_BASE + 0x120) #define BUFF1_SIZE 0xE0 #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 DATA_BUFF3_BASE (DATA_BUFF2_BASE+DATA_BUFF2_SIZE) #define DATA_BUFF3_SIZE 0x0400 #define Reserved (DPRAM_BASE + 0x1E00) #define Reserved_SIZE 0x1C0 /* firmware status area */ #define STATUS_BASE (DPRAM_BASE + 0x1FC0) #define STATUS_LOOPS (STATUS_BASE + 0x08) #define STATUS_MPEG_WIDTH (STATUS_BASE + 0x0C) /* ((aspect_ratio & 0xf) << 12) | (height & 0xfff) */ #define STATUS_MPEG_HEIGHT_AR (STATUS_BASE + 0x0E) /* firmware data protocol area */ #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) /* used by boot protocol to load firmware into av7110 DRAM */ #define DRAM_START_CODE 0x2e000404 #define DRAM_MAX_CODE_SIZE 0x00100000 /* saa7146 gpio lines */ #define RESET_LINE 2 #define DEBI_DONE_LINE 1 #define ARM_IRQ_LINE 0 extern int av7110_bootarm(struct av7110 *av7110); extern int av7110_firmversion(struct av7110 *av7110); #define FW_CI_LL_SUPPORT(arm_app) ((arm_app) & 0x80000000) #define FW_4M_SDRAM(arm_app) ((arm_app) & 0x40000000) #define FW_VERSION(arm_app) ((arm_app) & 0x0000FFFF) extern int av7110_wait_msgstate(struct av7110 *av7110, u16 flags); extern int av7110_fw_cmd(struct av7110 *av7110, int type, int com, int num, ...); extern int av7110_fw_request(struct av7110 *av7110, u16 *request_buf, int request_buf_len, u16 *reply_buf, int reply_buf_len); /* DEBI (saa7146 data extension bus interface) access */ extern int av7110_debiwrite(struct av7110 *av7110, u32 config, int addr, u32 val, int count); extern u32 av7110_debiread(struct av7110 *av7110, u32 config, int addr, int count); /* DEBI during interrupt */ /* single word writes */ static inline void iwdebi(struct av7110 *av7110, u32 config, int addr, u32 val, int count) { av7110_debiwrite(av7110, config, addr, val, count); } /* buffer writes */ static inline void mwdebi(struct av7110 *av7110, u32 config, int addr, const u8 *val, int count) { memcpy(av7110->debi_virt, val, count); av7110_debiwrite(av7110, config, addr, 0, count); } static inline u32 irdebi(struct av7110 *av7110, u32 config, int addr, u32 val, int count) { u32 res; res=av7110_debiread(av7110, config, addr, count); if (count<=4) memcpy(av7110->debi_virt, (char *) &res, count); return res; } /* DEBI outside interrupts, only for count <= 4! */ static inline void wdebi(struct av7110 *av7110, u32 config, int addr, u32 val, int count) { unsigned long flags; spin_lock_irqsave(&av7110->debilock, flags); av7110_debiwrite(av7110, config, addr, val, count); spin_unlock_irqrestore(&av7110->debilock, flags); } static inline u32 rdebi(struct av7110 *av7110, u32 config, int addr, u32 val, int count) { unsigned long flags; u32 res; spin_lock_irqsave(&av7110->debilock, flags); res=av7110_debiread(av7110, config, addr, count); spin_unlock_irqrestore(&av7110->debilock, flags); return res; } /* handle mailbox registers of the dual ported RAM */ static inline void ARM_ResetMailBox(struct av7110 *av7110) { unsigned long flags; spin_lock_irqsave(&av7110->debilock, flags); av7110_debiread(av7110, DEBINOSWAP, IRQ_RX, 2); av7110_debiwrite(av7110, DEBINOSWAP, IRQ_RX, 0, 2); spin_unlock_irqrestore(&av7110->debilock, flags); } static inline void ARM_ClearMailBox(struct av7110 *av7110) { iwdebi(av7110, DEBINOSWAP, IRQ_RX, 0, 2); } static inline void ARM_ClearIrq(struct av7110 *av7110) { irdebi(av7110, DEBINOSWAP, IRQ_RX, 0, 2); } /**************************************************************************** * Firmware commands ****************************************************************************/ static inline int SendDAC(struct av7110 *av7110, u8 addr, u8 data) { return av7110_fw_cmd(av7110, COMTYPE_AUDIODAC, AudioDAC, 2, addr, data); } static inline int av7710_set_video_mode(struct av7110 *av7110, int mode) { return av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetVidMode, 1, mode); } static inline int vidcom(struct av7110 *av7110, u32 com, u32 arg) { return av7110_fw_cmd(av7110, COMTYPE_MISC, AV7110_FW_VIDEO_COMMAND, 4, (com>>16), (com&0xffff), (arg>>16), (arg&0xffff)); } static inline int audcom(struct av7110 *av7110, u32 com) { return av7110_fw_cmd(av7110, COMTYPE_MISC, AV7110_FW_AUDIO_COMMAND, 2, (com>>16), (com&0xffff)); } static inline int Set22K(struct av7110 *av7110, int state) { return av7110_fw_cmd(av7110, COMTYPE_AUDIODAC, (state ? ON22K : OFF22K), 0); } extern int av7110_diseqc_send(struct av7110 *av7110, int len, u8 *msg, unsigned long burst); #ifdef CONFIG_DVB_AV7110_OSD extern int av7110_osd_cmd(struct av7110 *av7110, osd_cmd_t *dc); extern int av7110_osd_capability(struct av7110 *av7110, osd_cap_t *cap); #endif /* CONFIG_DVB_AV7110_OSD */ #endif /* _AV7110_HW_H_ */