pe_sacd.c
上传用户:super_houu
上传日期:2008-09-21
资源大小:4099k
文件大小:7k
源码类别:

DVD

开发平台:

Others

  1. /*
  2. File name: PE_SACD.C
  3. Description: Presentation engine for SACD.
  4. Author: Jerry CAI, ZORAN China.
  5. Created on: August 18, 2003
  6. */
  7. #include "config.h"
  8. #if D_SUPPORT_SACD
  9. #include "playcoresampsamp_gen.h"
  10. #include "drivedrv_api.h"
  11. #include "drivezfeplmplm_pfi.h"
  12. #include "kerneleventdef.h"
  13. #include "kernelker_api.h"
  14. #ifdef _DEBUG
  15. #include "decoderdecoder.h";
  16. #endif
  17. #include "playcorecoremaincoregdef.h"
  18. #include "playcorenav_cddape_cd.h"
  19. #include "decoderadp_api.h"
  20. #include "decoderlow_leveldec_ll_api.h"
  21. #include "drivedrv_defs.h"
  22. #include "drivezfeplmplm_pfi.h"
  23. void dec_sacd(void);
  24. static void dec_sacd_destruct(void);
  25. void PE_SACD_AbortPlayback(BOOL bRemainInStandby);
  26. #define MASTER_TOC1_SA 510
  27. #define MASTER_TOC2_SA 520
  28. #define MASTER_TOC3_SA 530
  29. #define MASTER_TOC_LEN 10
  30. void READ_ADP_BUFFER(void);
  31. /*
  32. Desc: Set up timing for XMT2.
  33. */
  34. void SACD_XMIT2_TIMING(void)
  35. {
  36. //TODO: To support both SAD and card reader, a GPIO should be allocated for chip select purpose.
  37.     asm
  38.     {
  39.     pushf
  40.     cli
  41.     mov dx, 0a18h    // ; XMIT02:Setup period for CS2
  42.     mov ax, 0000h //; (was 0002h)
  43.     out dx, ax
  44.     mov dx, 0a1ah    // ; XMITr12:Read period for CS2
  45.     mov ax, 001ch    //jerry was 13h
  46.     out dx, ax
  47.     mov dx, 0a1ch    // ; XMITw12:Write period for CS2
  48.     mov ax, 001ch   //; //jerry was 13h
  49.     out dx, ax
  50.     mov dx, 0a1eh    // ; XMITw12:Hold period for CS2
  51.     mov ax, 0000h
  52.     out dx, ax
  53.     mov dx, 0a20h    // ; XMIT32:Recovery period for CS2
  54.     mov ax, 0001h
  55.     out dx, ax
  56. //    mov dx, 0a2ch    // ; xmi_config addr
  57. //    mov ax, 012ch //; was 012ch. changed to enable DSPWAIT for CS2
  58. //    out dx, ax
  59.     popf
  60.     }
  61. }
  62. /*
  63. Desc: system initialization for SACD playback.
  64.       1.Setup bus timing
  65.       2.setup decoder.
  66. */
  67. SAMP(ErrCode) SAMP(BE_Init)(void)
  68. {
  69.   SACD_XMIT2_TIMING();
  70.   dec_sacd();
  71.   return SAMP(ERR_OK);
  72. }
  73. /*
  74. Desc: system cleanup after SACD playback
  75. */
  76. SAMP(ErrCode) SAMP(BE_Term)(void)
  77. {
  78.   PE_SACD_AbortPlayback(1);
  79.   dec_sacd_destruct();
  80.   return SAMP(ERR_OK);
  81. }
  82. /*
  83. Desc: open tray
  84.       This function is asynchronous.
  85. */
  86. SAMP(ErrCode) SAMP(BE_TrayOpen)(void)
  87. {
  88.   SAMP(BE_Term)();
  89.   ie_send(IE_CORE_CMD_EJECT);
  90.   return SAMP(ERR_OK);
  91. }
  92. /*
  93. Desc: close tray
  94.       This function is asynchronous.
  95. */
  96. SAMP(ErrCode) SAMP(BE_TrayClose)(void)
  97. {
  98.   ie_send(IE_CORE_CMD_CLOSE_TRAY);
  99.   return SAMP(ERR_OK);
  100. }
  101. SAMP(ErrCode) SAMP(BE_GetDataArea)(SAMP(UInt32)* startDataArea, SAMP(UInt32)* endDataArea, SAMP(UInt32)* endLayer0)
  102. {
  103.   //SACD disc is not recognized.
  104.   if(DEC_DISC_TYPE_SACD != g_disc_type)
  105.    return SAMP(ERR_FAILED);
  106.   drv_get_disc_data_zone(startDataArea, endDataArea, endLayer0);
  107.   return SAMP(ERR_OK);
  108. }
  109. /*
  110. Desc: Play a SACD segment.
  111. In: UInt32 dwStartAddress, physical start aaddress of the segment.
  112.     ULONG ulBlocksCnt,    number of sectors to play.
  113. Out: TRUE, succeed.
  114. */
  115. BOOL PE_SACD_PlaySegment(UINT32 dwStartAddress)
  116. {
  117.    UINT32 blockcnt;
  118.    DWORD startDataArea, endDataArea, endLayer0;
  119.    drv_abort_play();
  120. DEC_Stop_DVP_ADP_cmd(0);
  121. // DEC_PlaybackCommand(DEC_PLAYBACK_CMD_STOP, 0);
  122. // DEC_LL_SyncHostCommand(DEC_API_COMMAND_STOP, 0);
  123. /* get disc's data zone information */
  124. drv_get_disc_data_zone(&startDataArea, &endDataArea, &endLayer0);
  125. if(IS_OPPOSITE && dwStartAddress > endLayer0)
  126.    {
  127.     blockcnt = endDataArea - dwStartAddress + 1;
  128.     dwStartAddress |= 0x1000000;
  129.    }
  130.    else if(IS_OPPOSITE)
  131.    {
  132.     blockcnt = endDataArea - (~endLayer0)+ endLayer0 - dwStartAddress + 2;
  133.    }
  134.    else
  135.     blockcnt = endDataArea - dwStartAddress + 1;
  136. #ifndef CHECK_SACD_ADP_CODE_BUFFER
  137. DEC_LL_SetDVDStartEndSector( dwStartAddress, 0xfffffffful );
  138. #else
  139. DEC_LL_SetDVDStartEndSector( dwStartAddress, 20 );
  140. #endif
  141. drv_play_dvd( (unsigned long) dwStartAddress, blockcnt, DRVF_PLAY_DVD_DUMP_DATA); //DRVF_PLAY_DVD_AV_DATA); //DRVF_PLAY_DVD_DUMP_DATA );//todo: check later.
  142.    // DEC_LL_SyncHostCommand(DEC_API_COMMAND_PLAY,0);
  143. DEC_PlaybackCommand(DEC_PLAYBACK_CMD_PLAY, NULL);
  144.    return TRUE;
  145. }
  146. SAMP(ErrCode) SAMP(BE_ReadToc)(void)
  147. {
  148.    return SAMP(ERR_OK);
  149. }
  150. /*
  151. Desc: Request SACD data from FE
  152. */
  153. SAMP(ErrCode) SAMP(BE_Seek)(SAMP(UInt32) pos)
  154. {
  155. if(get_cbselect() != DEC_LL_CBSELECT_SACD)
  156.    {
  157. dec_sacd();
  158. }
  159.    if(TRUE == PE_SACD_PlaySegment(pos))
  160.    {
  161.     return SAMP(ERR_OK);
  162.    }
  163.    else
  164.    {
  165.     return SAMP(ERR_FAILED);
  166. }
  167. }
  168. /*
  169. Desc: set the minimal data transfer rate of the basic engine.
  170.       ZORAN's system will always run at the highest data transfer rate of around 17M bit/sec.
  171. */
  172. SAMP(ErrCode) SAMP(BE_SetTransferRate)(SAMP(UInt32) rate)
  173. {
  174.    return SAMP(ERR_OK);
  175. }
  176. /*
  177. Desc: abort SACD playback
  178. */
  179. void PE_SACD_AbortPlayback(BOOL bRemainInStandby)
  180. {
  181. drv_abort_play();
  182. DEC_Stop_DVP_ADP_cmd(0);
  183. // DEC_PlaybackCommand(DEC_PLAYBACK_CMD_STOP, 0);
  184. // DEC_LL_SyncHostCommand(DEC_API_COMMAND_STOP, 0);
  185. if (! bRemainInStandby)
  186. drv_spindown();
  187. return;
  188. }
  189. #ifdef _DEBUG
  190. #define AUDIO_BUFER_ADDR 360448UL  //(204 + 500)*512
  191. #define AUDIO_BUFFER_SIZE 25600UL   //50*512
  192. /*
  193. Desc: print the ADP buffer to hyper terminal.
  194. */
  195. void READ_ADP_BUFFER(void)
  196. {
  197. unsigned int buffer[32];
  198. unsigned long addr = AUDIO_BUFER_ADDR;
  199. int i;
  200. while( addr < AUDIO_BUFER_ADDR+AUDIO_BUFFER_SIZE )
  201. {
  202. DEC_ReadDRAMData(addr, buffer, 32 );
  203. addr +=32;
  204.       for(i=0; i<32;i++ )
  205.       {
  206.        printf("0x%x,n", buffer[i]);
  207. }
  208. }
  209.    printf("};n");
  210. }
  211. #endif //_DEBUG
  212. void dec_sacd(void)
  213. {
  214. //   dec_sacd_destruct(); //todo: remove later.
  215. DEC_SetDiskType(DEC_DISC_TYPE_SACD);
  216. DEC_prepare_to_decode();
  217. DEC_SetSID(DEC_SID_TYPE_AUDIO, SACD_SID);
  218.    //sacd todo: check later.
  219. #ifndef SACD_HW_EVAL
  220. // DEC_PlaybackCommand(DEC_PLAYBACK_CMD_PLAY, NULL); //to get amclk
  221. #endif
  222. #ifdef AUDIO_DAC_SUPPORT_DSD
  223. DAC_Set_DSD_Mode(1);
  224. #endif
  225. }
  226. static void dec_sacd_destruct(void)
  227. {
  228.   DEC_SetDiskType(DEC_DISC_TYPE_DVD_VIDEO);
  229.   //todo: check what to do with Dien peng.
  230.   g_disc_type = DEC_DISC_TYPE_DVD_VIDEO;
  231.   DEC_prepare_to_decode();
  232. #ifdef AUDIO_DAC_SUPPORT_DSD
  233. DAC_Set_DSD_Mode(0);
  234. #endif
  235.   g_disc_type = DEC_DISC_TYPE_VCD; //jerry cai new!
  236. {
  237. // 20040908 - added to fix DVD-R problem
  238. if(DEC_DISC_TYPE_SACD != g_disc_type)
  239. { tr_printf(("n logo display part !"));
  240. // if( !WhiteNoiseMode) //ZKR ML092304  Change if sentense.
  241. Logo_display();
  242. }
  243. DEC_UpdateAudAnalogParameters();  // Update audio analog setting
  244. }
  245.   return;
  246. }
  247. #endif