123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497 |
- /* SPDX-License-Identifier: GPL-2.0 */
- #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, unsigned int count);
- extern u32 av7110_debiread(struct av7110 *av7110, u32 config,
- int addr, unsigned int count);
- /* DEBI during interrupt */
- /* single word writes */
- static inline void iwdebi(struct av7110 *av7110, u32 config, int addr, u32 val, unsigned 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, unsigned 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, unsigned 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, unsigned 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_ */
|