av7110_hw.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  1. #ifndef _AV7110_HW_H_
  2. #define _AV7110_HW_H_
  3. #include "av7110.h"
  4. /* DEBI transfer mode defs */
  5. #define DEBINOSWAP 0x000e0000
  6. #define DEBISWAB 0x001e0000
  7. #define DEBISWAP 0x002e0000
  8. #define ARM_WAIT_FREE (HZ)
  9. #define ARM_WAIT_SHAKE (HZ/5)
  10. #define ARM_WAIT_OSD (HZ)
  11. enum av7110_bootstate
  12. {
  13. BOOTSTATE_BUFFER_EMPTY = 0,
  14. BOOTSTATE_BUFFER_FULL = 1,
  15. BOOTSTATE_BOOT_COMPLETE = 2
  16. };
  17. enum av7110_type_rec_play_format
  18. { RP_None,
  19. AudioPES,
  20. AudioMp2,
  21. AudioPCM,
  22. VideoPES,
  23. AV_PES
  24. };
  25. enum av7110_osd_palette_type
  26. {
  27. NoPalet = 0, /* No palette */
  28. Pal1Bit = 2, /* 2 colors for 1 Bit Palette */
  29. Pal2Bit = 4, /* 4 colors for 2 bit palette */
  30. Pal4Bit = 16, /* 16 colors for 4 bit palette */
  31. Pal8Bit = 256 /* 256 colors for 16 bit palette */
  32. };
  33. /* switch defines */
  34. #define SB_GPIO 3
  35. #define SB_OFF SAA7146_GPIO_OUTLO /* SlowBlank off (TV-Mode) */
  36. #define SB_ON SAA7146_GPIO_INPUT /* SlowBlank on (AV-Mode) */
  37. #define SB_WIDE SAA7146_GPIO_OUTHI /* SlowBlank 6V (16/9-Mode) (not implemented) */
  38. #define FB_GPIO 1
  39. #define FB_OFF SAA7146_GPIO_LO /* FastBlank off (CVBS-Mode) */
  40. #define FB_ON SAA7146_GPIO_OUTHI /* FastBlank on (RGB-Mode) */
  41. #define FB_LOOP SAA7146_GPIO_INPUT /* FastBlank loop-through (PC graphics ???) */
  42. enum av7110_video_output_mode
  43. {
  44. NO_OUT = 0, /* disable analog output */
  45. CVBS_RGB_OUT = 1,
  46. CVBS_YC_OUT = 2,
  47. YC_OUT = 3
  48. };
  49. /* firmware internal msg q status: */
  50. #define GPMQFull 0x0001 /* Main Message Queue Full */
  51. #define GPMQOver 0x0002 /* Main Message Queue Overflow */
  52. #define HPQFull 0x0004 /* High Priority Msg Queue Full */
  53. #define HPQOver 0x0008
  54. #define OSDQFull 0x0010 /* OSD Queue Full */
  55. #define OSDQOver 0x0020
  56. #define GPMQBusy 0x0040 /* Queue not empty, FW >= 261d */
  57. #define HPQBusy 0x0080
  58. #define OSDQBusy 0x0100
  59. /* hw section filter flags */
  60. #define SECTION_EIT 0x01
  61. #define SECTION_SINGLE 0x00
  62. #define SECTION_CYCLE 0x02
  63. #define SECTION_CONTINUOS 0x04
  64. #define SECTION_MODE 0x06
  65. #define SECTION_IPMPE 0x0C /* size up to 4k */
  66. #define SECTION_HIGH_SPEED 0x1C /* larger buffer */
  67. #define DATA_PIPING_FLAG 0x20 /* for Data Piping Filter */
  68. #define PBUFSIZE_NONE 0x0000
  69. #define PBUFSIZE_1P 0x0100
  70. #define PBUFSIZE_2P 0x0200
  71. #define PBUFSIZE_1K 0x0300
  72. #define PBUFSIZE_2K 0x0400
  73. #define PBUFSIZE_4K 0x0500
  74. #define PBUFSIZE_8K 0x0600
  75. #define PBUFSIZE_16K 0x0700
  76. #define PBUFSIZE_32K 0x0800
  77. /* firmware command codes */
  78. enum av7110_osd_command {
  79. WCreate,
  80. WDestroy,
  81. WMoveD,
  82. WMoveA,
  83. WHide,
  84. WTop,
  85. DBox,
  86. DLine,
  87. DText,
  88. Set_Font,
  89. SetColor,
  90. SetBlend,
  91. SetWBlend,
  92. SetCBlend,
  93. SetNonBlend,
  94. LoadBmp,
  95. BlitBmp,
  96. ReleaseBmp,
  97. SetWTrans,
  98. SetWNoTrans,
  99. Set_Palette
  100. };
  101. enum av7110_pid_command {
  102. MultiPID,
  103. VideoPID,
  104. AudioPID,
  105. InitFilt,
  106. FiltError,
  107. NewVersion,
  108. CacheError,
  109. AddPIDFilter,
  110. DelPIDFilter,
  111. Scan,
  112. SetDescr,
  113. SetIR,
  114. FlushTSQueue
  115. };
  116. enum av7110_mpeg_command {
  117. SelAudChannels
  118. };
  119. enum av7110_audio_command {
  120. AudioDAC,
  121. CabADAC,
  122. ON22K,
  123. OFF22K,
  124. MainSwitch,
  125. ADSwitch,
  126. SendDiSEqC,
  127. SetRegister,
  128. SpdifSwitch
  129. };
  130. enum av7110_request_command {
  131. AudioState,
  132. AudioBuffState,
  133. VideoState1,
  134. VideoState2,
  135. VideoState3,
  136. CrashCounter,
  137. ReqVersion,
  138. ReqVCXO,
  139. ReqRegister,
  140. ReqSecFilterError,
  141. ReqSTC
  142. };
  143. enum av7110_encoder_command {
  144. SetVidMode,
  145. SetTestMode,
  146. LoadVidCode,
  147. SetMonitorType,
  148. SetPanScanType,
  149. SetFreezeMode
  150. };
  151. enum av7110_rec_play_state {
  152. __Record,
  153. __Stop,
  154. __Play,
  155. __Pause,
  156. __Slow,
  157. __FF_IP,
  158. __Scan_I,
  159. __Continue
  160. };
  161. enum av7110_fw_cmd_misc {
  162. AV7110_FW_VIDEO_ZOOM = 1,
  163. AV7110_FW_VIDEO_COMMAND,
  164. AV7110_FW_AUDIO_COMMAND
  165. };
  166. enum av7110_command_type {
  167. COMTYPE_NOCOM,
  168. COMTYPE_PIDFILTER,
  169. COMTYPE_MPEGDECODER,
  170. COMTYPE_OSD,
  171. COMTYPE_BMP,
  172. COMTYPE_ENCODER,
  173. COMTYPE_AUDIODAC,
  174. COMTYPE_REQUEST,
  175. COMTYPE_SYSTEM,
  176. COMTYPE_REC_PLAY,
  177. COMTYPE_COMMON_IF,
  178. COMTYPE_PID_FILTER,
  179. COMTYPE_PES,
  180. COMTYPE_TS,
  181. COMTYPE_VIDEO,
  182. COMTYPE_AUDIO,
  183. COMTYPE_CI_LL,
  184. COMTYPE_MISC = 0x80
  185. };
  186. #define VID_NONE_PREF 0x00 /* No aspect ration processing preferred */
  187. #define VID_PAN_SCAN_PREF 0x01 /* Pan and Scan Display preferred */
  188. #define VID_VERT_COMP_PREF 0x02 /* Vertical compression display preferred */
  189. #define VID_VC_AND_PS_PREF 0x03 /* PanScan and vertical Compression if allowed */
  190. #define VID_CENTRE_CUT_PREF 0x05 /* PanScan with zero vector */
  191. /* MPEG video decoder commands */
  192. #define VIDEO_CMD_STOP 0x000e
  193. #define VIDEO_CMD_PLAY 0x000d
  194. #define VIDEO_CMD_FREEZE 0x0102
  195. #define VIDEO_CMD_FFWD 0x0016
  196. #define VIDEO_CMD_SLOW 0x0022
  197. /* MPEG audio decoder commands */
  198. #define AUDIO_CMD_MUTE 0x0001
  199. #define AUDIO_CMD_UNMUTE 0x0002
  200. #define AUDIO_CMD_PCM16 0x0010
  201. #define AUDIO_CMD_STEREO 0x0080
  202. #define AUDIO_CMD_MONO_L 0x0100
  203. #define AUDIO_CMD_MONO_R 0x0200
  204. #define AUDIO_CMD_SYNC_OFF 0x000e
  205. #define AUDIO_CMD_SYNC_ON 0x000f
  206. /* firmware data interface codes */
  207. #define DATA_NONE 0x00
  208. #define DATA_FSECTION 0x01
  209. #define DATA_IPMPE 0x02
  210. #define DATA_MPEG_RECORD 0x03
  211. #define DATA_DEBUG_MESSAGE 0x04
  212. #define DATA_COMMON_INTERFACE 0x05
  213. #define DATA_MPEG_PLAY 0x06
  214. #define DATA_BMP_LOAD 0x07
  215. #define DATA_IRCOMMAND 0x08
  216. #define DATA_PIPING 0x09
  217. #define DATA_STREAMING 0x0a
  218. #define DATA_CI_GET 0x0b
  219. #define DATA_CI_PUT 0x0c
  220. #define DATA_MPEG_VIDEO_EVENT 0x0d
  221. #define DATA_PES_RECORD 0x10
  222. #define DATA_PES_PLAY 0x11
  223. #define DATA_TS_RECORD 0x12
  224. #define DATA_TS_PLAY 0x13
  225. /* ancient CI command codes, only two are actually still used
  226. * by the link level CI firmware */
  227. #define CI_CMD_ERROR 0x00
  228. #define CI_CMD_ACK 0x01
  229. #define CI_CMD_SYSTEM_READY 0x02
  230. #define CI_CMD_KEYPRESS 0x03
  231. #define CI_CMD_ON_TUNED 0x04
  232. #define CI_CMD_ON_SWITCH_PROGRAM 0x05
  233. #define CI_CMD_SECTION_ARRIVED 0x06
  234. #define CI_CMD_SECTION_TIMEOUT 0x07
  235. #define CI_CMD_TIME 0x08
  236. #define CI_CMD_ENTER_MENU 0x09
  237. #define CI_CMD_FAST_PSI 0x0a
  238. #define CI_CMD_GET_SLOT_INFO 0x0b
  239. #define CI_MSG_NONE 0x00
  240. #define CI_MSG_CI_INFO 0x01
  241. #define CI_MSG_MENU 0x02
  242. #define CI_MSG_LIST 0x03
  243. #define CI_MSG_TEXT 0x04
  244. #define CI_MSG_REQUEST_INPUT 0x05
  245. #define CI_MSG_INPUT_COMPLETE 0x06
  246. #define CI_MSG_LIST_MORE 0x07
  247. #define CI_MSG_MENU_MORE 0x08
  248. #define CI_MSG_CLOSE_MMI_IMM 0x09
  249. #define CI_MSG_SECTION_REQUEST 0x0a
  250. #define CI_MSG_CLOSE_FILTER 0x0b
  251. #define CI_PSI_COMPLETE 0x0c
  252. #define CI_MODULE_READY 0x0d
  253. #define CI_SWITCH_PRG_REPLY 0x0e
  254. #define CI_MSG_TEXT_MORE 0x0f
  255. #define CI_MSG_CA_PMT 0xe0
  256. #define CI_MSG_ERROR 0xf0
  257. /* base address of the dual ported RAM which serves as communication
  258. * area between PCI bus and av7110,
  259. * as seen by the DEBI bus of the saa7146 */
  260. #define DPRAM_BASE 0x4000
  261. /* boot protocol area */
  262. #define BOOT_STATE (DPRAM_BASE + 0x3F8)
  263. #define BOOT_SIZE (DPRAM_BASE + 0x3FA)
  264. #define BOOT_BASE (DPRAM_BASE + 0x3FC)
  265. #define BOOT_BLOCK (DPRAM_BASE + 0x400)
  266. #define BOOT_MAX_SIZE 0xc00
  267. /* firmware command protocol area */
  268. #define IRQ_STATE (DPRAM_BASE + 0x0F4)
  269. #define IRQ_STATE_EXT (DPRAM_BASE + 0x0F6)
  270. #define MSGSTATE (DPRAM_BASE + 0x0F8)
  271. #define FILT_STATE (DPRAM_BASE + 0x0FA)
  272. #define COMMAND (DPRAM_BASE + 0x0FC)
  273. #define COM_BUFF (DPRAM_BASE + 0x100)
  274. #define COM_BUFF_SIZE 0x20
  275. /* various data buffers */
  276. #define BUFF1_BASE (DPRAM_BASE + 0x120)
  277. #define BUFF1_SIZE 0xE0
  278. #define DATA_BUFF0_BASE (DPRAM_BASE + 0x200)
  279. #define DATA_BUFF0_SIZE 0x0800
  280. #define DATA_BUFF1_BASE (DATA_BUFF0_BASE+DATA_BUFF0_SIZE)
  281. #define DATA_BUFF1_SIZE 0x0800
  282. #define DATA_BUFF2_BASE (DATA_BUFF1_BASE+DATA_BUFF1_SIZE)
  283. #define DATA_BUFF2_SIZE 0x0800
  284. #define DATA_BUFF3_BASE (DATA_BUFF2_BASE+DATA_BUFF2_SIZE)
  285. #define DATA_BUFF3_SIZE 0x0400
  286. #define Reserved (DPRAM_BASE + 0x1E00)
  287. #define Reserved_SIZE 0x1C0
  288. /* firmware status area */
  289. #define STATUS_BASE (DPRAM_BASE + 0x1FC0)
  290. #define STATUS_SCR (STATUS_BASE + 0x00)
  291. #define STATUS_MODES (STATUS_BASE + 0x04)
  292. #define STATUS_LOOPS (STATUS_BASE + 0x08)
  293. #define STATUS_MPEG_WIDTH (STATUS_BASE + 0x0C)
  294. /* ((aspect_ratio & 0xf) << 12) | (height & 0xfff) */
  295. #define STATUS_MPEG_HEIGHT_AR (STATUS_BASE + 0x0E)
  296. /* firmware data protocol area */
  297. #define RX_TYPE (DPRAM_BASE + 0x1FE8)
  298. #define RX_LEN (DPRAM_BASE + 0x1FEA)
  299. #define TX_TYPE (DPRAM_BASE + 0x1FEC)
  300. #define TX_LEN (DPRAM_BASE + 0x1FEE)
  301. #define RX_BUFF (DPRAM_BASE + 0x1FF4)
  302. #define TX_BUFF (DPRAM_BASE + 0x1FF6)
  303. #define HANDSHAKE_REG (DPRAM_BASE + 0x1FF8)
  304. #define COM_IF_LOCK (DPRAM_BASE + 0x1FFA)
  305. #define IRQ_RX (DPRAM_BASE + 0x1FFC)
  306. #define IRQ_TX (DPRAM_BASE + 0x1FFE)
  307. /* used by boot protocol to load firmware into av7110 DRAM */
  308. #define DRAM_START_CODE 0x2e000404
  309. #define DRAM_MAX_CODE_SIZE 0x00100000
  310. /* saa7146 gpio lines */
  311. #define RESET_LINE 2
  312. #define DEBI_DONE_LINE 1
  313. #define ARM_IRQ_LINE 0
  314. extern int av7110_bootarm(struct av7110 *av7110);
  315. extern int av7110_firmversion(struct av7110 *av7110);
  316. #define FW_CI_LL_SUPPORT(arm_app) ((arm_app) & 0x80000000)
  317. #define FW_4M_SDRAM(arm_app) ((arm_app) & 0x40000000)
  318. #define FW_VERSION(arm_app) ((arm_app) & 0x0000FFFF)
  319. extern int av7110_wait_msgstate(struct av7110 *av7110, u16 flags);
  320. extern int av7110_fw_cmd(struct av7110 *av7110, int type, int com, int num, ...);
  321. extern int av7110_fw_request(struct av7110 *av7110, u16 *request_buf,
  322. int request_buf_len, u16 *reply_buf, int reply_buf_len);
  323. /* DEBI (saa7146 data extension bus interface) access */
  324. extern int av7110_debiwrite(struct av7110 *av7110, u32 config,
  325. int addr, u32 val, int count);
  326. extern u32 av7110_debiread(struct av7110 *av7110, u32 config,
  327. int addr, int count);
  328. /* DEBI during interrupt */
  329. /* single word writes */
  330. static inline void iwdebi(struct av7110 *av7110, u32 config, int addr, u32 val, int count)
  331. {
  332. av7110_debiwrite(av7110, config, addr, val, count);
  333. }
  334. /* buffer writes */
  335. static inline void mwdebi(struct av7110 *av7110, u32 config, int addr, char *val, int count)
  336. {
  337. memcpy(av7110->debi_virt, val, count);
  338. av7110_debiwrite(av7110, config, addr, 0, count);
  339. }
  340. static inline u32 irdebi(struct av7110 *av7110, u32 config, int addr, u32 val, int count)
  341. {
  342. u32 res;
  343. res=av7110_debiread(av7110, config, addr, count);
  344. if (count<=4)
  345. memcpy(av7110->debi_virt, (char *) &res, count);
  346. return res;
  347. }
  348. /* DEBI outside interrupts, only for count <= 4! */
  349. static inline void wdebi(struct av7110 *av7110, u32 config, int addr, u32 val, int count)
  350. {
  351. unsigned long flags;
  352. spin_lock_irqsave(&av7110->debilock, flags);
  353. av7110_debiwrite(av7110, config, addr, val, count);
  354. spin_unlock_irqrestore(&av7110->debilock, flags);
  355. }
  356. static inline u32 rdebi(struct av7110 *av7110, u32 config, int addr, u32 val, int count)
  357. {
  358. unsigned long flags;
  359. u32 res;
  360. spin_lock_irqsave(&av7110->debilock, flags);
  361. res=av7110_debiread(av7110, config, addr, count);
  362. spin_unlock_irqrestore(&av7110->debilock, flags);
  363. return res;
  364. }
  365. /* handle mailbox registers of the dual ported RAM */
  366. static inline void ARM_ResetMailBox(struct av7110 *av7110)
  367. {
  368. unsigned long flags;
  369. spin_lock_irqsave(&av7110->debilock, flags);
  370. av7110_debiread(av7110, DEBINOSWAP, IRQ_RX, 2);
  371. av7110_debiwrite(av7110, DEBINOSWAP, IRQ_RX, 0, 2);
  372. spin_unlock_irqrestore(&av7110->debilock, flags);
  373. }
  374. static inline void ARM_ClearMailBox(struct av7110 *av7110)
  375. {
  376. iwdebi(av7110, DEBINOSWAP, IRQ_RX, 0, 2);
  377. }
  378. static inline void ARM_ClearIrq(struct av7110 *av7110)
  379. {
  380. irdebi(av7110, DEBINOSWAP, IRQ_RX, 0, 2);
  381. }
  382. /****************************************************************************
  383. * Firmware commands
  384. ****************************************************************************/
  385. static inline int SendDAC(struct av7110 *av7110, u8 addr, u8 data)
  386. {
  387. return av7110_fw_cmd(av7110, COMTYPE_AUDIODAC, AudioDAC, 2, addr, data);
  388. }
  389. static inline int av7710_set_video_mode(struct av7110 *av7110, int mode)
  390. {
  391. return av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetVidMode, 1, mode);
  392. }
  393. static inline int vidcom(struct av7110 *av7110, u32 com, u32 arg)
  394. {
  395. return av7110_fw_cmd(av7110, COMTYPE_MISC, AV7110_FW_VIDEO_COMMAND, 4,
  396. (com>>16), (com&0xffff),
  397. (arg>>16), (arg&0xffff));
  398. }
  399. static inline int audcom(struct av7110 *av7110, u32 com)
  400. {
  401. return av7110_fw_cmd(av7110, COMTYPE_MISC, AV7110_FW_AUDIO_COMMAND, 2,
  402. (com>>16), (com&0xffff));
  403. }
  404. static inline int Set22K(struct av7110 *av7110, int state)
  405. {
  406. return av7110_fw_cmd(av7110, COMTYPE_AUDIODAC, (state ? ON22K : OFF22K), 0);
  407. }
  408. extern int av7110_diseqc_send(struct av7110 *av7110, int len, u8 *msg, unsigned long burst);
  409. #ifdef CONFIG_DVB_AV7110_OSD
  410. extern int av7110_osd_cmd(struct av7110 *av7110, osd_cmd_t *dc);
  411. extern int av7110_osd_capability(struct av7110 *av7110, osd_cap_t *cap);
  412. #endif /* CONFIG_DVB_AV7110_OSD */
  413. #endif /* _AV7110_HW_H_ */