dsp3_config.c
上传用户:poi891205
上传日期:2013-07-15
资源大小:9745k
文件大小:25k
源码类别:

DVD

开发平台:

C/C++

  1. /**************************************************************************
  2.  *                                                                        *
  3.  *         Copyright (c) 2002 by Sunplus Technology Co., Ltd.             *
  4.  *                                                                        *
  5.  *  This software is copyrighted by and is the property of Sunplus        *
  6.  *  Technology Co., Ltd. All rights are reserved by Sunplus Technology    *
  7.  *  Co., Ltd. This software may only be used in accordance with the       *
  8.  *  corresponding license agreement. Any unauthorized use, duplication,   *
  9.  *  distribution, or disclosure of this software is expressly forbidden.  *
  10.  *                                                                        *
  11.  *  This Copyright notice MUST not be removed or modified without prior   *
  12.  *  written consent of Sunplus Technology Co., Ltd.                       *
  13.  *                                                                        *
  14.  *  Sunplus Technology Co., Ltd. reserves the right to modify this        *
  15.  *  software without notice.                                              *
  16.  *                                                                        *
  17.  *  Sunplus Technology Co., Ltd.                                          *
  18.  *  19, Innovation First Road, Science-Based Industrial Park,             *
  19.  *  Hsin-Chu, Taiwan, R.O.C.                                              *
  20.  **************************************************************************/
  21. /*WMA/HDCD:
  22. * "This product is protected by certain intellectual property rights of
  23. * Microsoft and cannot be used or further
  24. * distributed without a license from Microsoft.
  25. */
  26. //
  27. // FILE
  28. // dsp3_config.c
  29. //
  30. //
  31. //  Terry,2004/2/17 04:59PM
  32. //  a.add in write24 function  b.add LmRm/DTS 9624 config.
  33. //
  34. #include "user_init.h"//nono 2003-10-21 21:04
  35. #include "config.h"
  36. #include "regmap.h"
  37. #include "global.h"
  38. #include "memmap.h"
  39. #include "lbc.h"
  40. #include "NESinit.h"
  41. #include "gpio.h"
  42. extern UINT8 power_on_mute;//terry 20030805
  43. extern UINT32 setupGetSetting(BYTE x);
  44. extern int setup_IsSet2SPDIF_Bitstream();
  45. extern void setup_SetFreqMaskConfig(void);
  46. extern int is_dts_force_spdif_bitstream(void);
  47. extern int check_chipinfo(int n);
  48. #include "dsp3rom.h"    //Jeff 20010807
  49. #include "dsp3_if.h"
  50. #include "auddrv.h" //2004AUDDRV oliver 20041004 for using audio driver purpose
  51. //#include "audif.h"
  52. #ifdef MP3_JPEG_COWORK
  53. #include "fsNav.h"
  54. #endif
  55. //
  56. // DEBUG
  57. //
  58. #ifndef DVDRELEASE
  59. //#define DSP3_DBG        1
  60. #endif
  61. #define dsp3_puts(s) ((void)0)
  62. #define dsp3_printf(s...) ((void)0)
  63. #ifdef DSP3_DBG
  64. #include "sio.h"
  65. #include "emuio.h"
  66. #undef dsp3_puts
  67. #undef dsp3_printf
  68. #define dsp3_puts    puts_nw
  69. #define dsp3_printf             printf_w
  70. //#define MONE_DSP3_LOAD
  71. //#define MONE_DSP3_ERROR
  72. //#define DBG_DSP_CMD
  73. #endif
  74. #if defined(SPHE1000) && !defined(DVB1000_NON_OS)
  75. #define MONE_LINUX_TRAP
  76. #endif
  77. #ifdef MONE_LINUX_TRAP
  78. extern BYTE mone_trap;
  79. #define LOAD_LINUX_TRAP() {if (mone_trap) load_linux_trap();}
  80. #else
  81. #define LOAD_LINUX_TRAP()
  82. #endif
  83. //
  84. // DSP buffers
  85. //
  86. #define get_dsp3_im_ptr() get_dsp_im_ptr(0,0)
  87. #define get_dsp3_pm_ptr() get_dsp_pcm_ptr(0,0)
  88. #define get_dsp3_dm_ptr() get_dsp_aud_ptr(0,0)
  89. #define AUDIO_BITSTREAM_START   0               // in 24-b word
  90. //ycwen 2005/1/21 : 
  91. //When mp3_jpeg_cowork, we allocate 48k bytes PM for mp3
  92. //But must adjust back to 9k bytes when WMA or AC3 decoder is using
  93. #ifdef MP3_JPEG_COWORK 
  94. #define MP3_AUDIO_BITSTREAM_LEN         16*1024          // in 24-b word     
  95. #define NON_DTS_AUDIO_BITSTREAM_LEN     3*1024          // in 24-b word
  96. #else
  97. //Use the common dsp code file "dsp3rom.d16.mp3".
  98. #define NON_DTS_AUDIO_BITSTREAM_LEN     3*1024          // in 24-b word
  99. #endif
  100. #ifdef SDRAM_16Mb_Mode//nono 3-12-2 14:09
  101. #define DTS_AUDIO_BITSTREAM_LEN         3*1024          // in 24-b word
  102. #else//SDRAM_16Mb_Mode
  103. #define DTS_AUDIO_BITSTREAM_LEN         4*1024          // in 24-b word
  104. #endif//SDRAM_16Mb_Mode
  105. #define LPCM_AUDIO_BITSTREAM_LEN        (5*1024)        //terry,2004/3/26 11:14AM
  106. #define AUDIO_BITSTREAM_LEN             NON_DTS_AUDIO_BITSTREAM_LEN
  107. UINT16 dsp24ya, audya, pcmya;
  108. UINT8   force_set_cd_md;
  109. /**************************************************************************
  110.  *  Function Name: set_aud_buf
  111.  *  Purposes:
  112.  *    Set audio buffer address
  113.  *  Descriptions:
  114.  *    Set start buffer address of IM,PM and DM for DSP
  115.  *  Arguments:
  116.  *    a in : IM start address
  117.  *    b in : PM start address
  118.  *    c in : DM start address
  119.  *  Returns:
  120.  *
  121.  *  See also:
  122.  *
  123.  **************************************************************************/
  124. void
  125. set_aud_buf(unsigned a, unsigned b, unsigned c)
  126. {
  127.   printf("nn --->set audio buffer address a:%x b:%x c:%xn",a,b,c);
  128.   regs0->dsp24ya = dsp24ya = a;
  129.   regs0->audya = audya = b;
  130.   regs0->pcmya = pcmya = c;
  131.   bpcm_ya_ptr = (BYTE *)(SDRAM_BASE_UNCACHED+MEM_PCMYA*1024);//terry,2004/1/14 02:23PM
  132. }
  133. /**************************************************************************
  134.  *  Function Name: write_24
  135.  *  Purposes:
  136.  *    write data to DSP PM
  137.  *  Descriptions:
  138.  *
  139.  *  Arguments:
  140.  *    q in/out : Start address for writing data
  141.  *    offset in : Offset for writing data
  142.  *    x in : Data for writing
  143.  *  Returns:
  144.  *    Address after writing data
  145.  *  See also:
  146.  *
  147.  **************************************************************************/
  148. //
  149. // FUNCTION
  150. // write_24()
  151. //
  152. #if 0
  153. BYTE *write_24(BYTE *q, int offset, UINT32 x)
  154. {
  155. #ifdef DBG_DSP_CMD
  156.   printf("q:%x offset:%x x:%xn",q,offset,x);
  157. #endif
  158.   q     += offset*3;
  159.   q[0]  = (x>>16) & 0x00ff; // MSB first
  160.   q[1]  = (x>> 8) & 0x00ff; //
  161.   q[2]  = (x>> 0) & 0x00ff; // LSB last
  162.   return q;
  163. }
  164. #else
  165. void write24(int offset, UINT32 x)
  166. {
  167. #ifdef DBG_DSP_CMD
  168.   printf("offset:%x x:%xn",offset,x);
  169. #endif
  170.   BYTE *q = (BYTE*)get_dsp3_pm_ptr();
  171.   //q = get_dsp3_pm_ptr();
  172.   q     += offset*3;
  173.   q[0]  = (x>>16) & 0x00ff; // MSB first
  174.   q[1]  = (x>> 8) & 0x00ff; //
  175.   q[2]  = (x>> 0) & 0x00ff; // LSB last
  176. }
  177. #endif
  178. /**************************************************************************
  179.  *  Function Name: set_dsp3_pcm_value
  180.  *  Purposes:
  181.  *    Write data to DSP PCM buffer
  182.  *  Descriptions:
  183.  *
  184.  *  Arguments:
  185.  *    off in : Offset for writing data
  186.  *    value in : Data for writing
  187.  *  Returns:
  188.  *
  189.  *  See also:
  190.  *
  191.  **************************************************************************/
  192. //
  193. // void set_dsp3_pcm_value(unsigned x_off, unsigned value)
  194. //
  195. void set_dsp3_pcm_value(unsigned x_off, unsigned value)
  196. {
  197.   #ifdef MESSAGE_QUEUE
  198.     DSP_AudioIOControl(WRITE2PCM ,x_off,value);
  199.   #else
  200. BYTE *pcm_ptr=get_dsp_pcm_ptr(x_off*3, 0);
  201. // dsp3_printf(" set PCM @ %x %x : %xn", x_off, pcm_ptr, value);
  202. *(pcm_ptr) = (value>>16) & 0xff;
  203. *(pcm_ptr+1) = (value>>8) & 0xff;
  204. *(pcm_ptr+2) = (value>>0) & 0xff;
  205.   #endif  
  206. }
  207. /**************************************************************************
  208.  *  Function Name: get_dsp3_pcm_value
  209.  *  Purposes:
  210.  *    Read data from DSP PCM buffer
  211.  *  Descriptions:
  212.  *
  213.  *  Arguments:
  214.  *    off in : Offset for reading data
  215.  *  Returns:
  216.  *    Data read
  217.  *  See also:
  218.  *
  219.  **************************************************************************/
  220. #if defined( SUPPORT_REP_READ)||defined (SUPPORT_TESTSPK)
  221. UINT32 get_dsp3_pcm_value(unsigned x_off)
  222. {
  223. UINT32 value;
  224. BYTE *pcm_ptr=get_dsp_pcm_ptr(x_off*3, 0);
  225. value = (*pcm_ptr << 16) | (*(pcm_ptr+1) << 8) | *(pcm_ptr+2);
  226. dsp3_printf(" get PCM @ %x %x : %xn", x_off, pcm_ptr, value);
  227. return value;
  228. }
  229. #endif  //#ifdef SUPPORT_REP_READ
  230. /**************************************************************************
  231.  *  Function Name: dsp3_get_rest_buf_size
  232.  *  Purposes:
  233.  *    Get rest space of audio buffer
  234.  *  Descriptions:
  235.  *    Distance between Dump pointer and Barrier pointer in bytes.
  236.  *  Arguments:
  237.  *
  238.  *  Returns:
  239.  *    Rest buffer size in bytes.
  240.  *  See also:
  241.  *
  242.  **************************************************************************/
  243. inline int dsp3_get_rest_buf_size()
  244. {
  245. int barN = (int)AudioGetBarrier()*3;
  246. int apb  = (int)AudioGetBytePtr();
  247. int free;
  248. free = barN - apb;
  249. if (free <= 0)
  250.     free += abv_size;
  251. return free;
  252. }
  253. /**************************************************************************
  254.  *  Function Name: set_aud_buf_size
  255.  *  Purposes:
  256.  *    Set audio bitstream size
  257.  *  Descriptions:
  258.  *    Set buffer size to AUDIO_BITSTREAM_LEN*3, *3 because the unit in DSP is WORD (3 bytes)
  259.  *  Arguments:
  260.  *
  261.  *  Returns:
  262.  *
  263.  *  See also:
  264.  *
  265.  **************************************************************************/
  266. void set_aud_buf_size(void)
  267. {
  268. //terry,2002/7/2 05:32PM
  269.         extern UINT32 coding_mode_now;
  270. //extern BYTE isSPDIFBitstream;
  271. //BYTE *q;
  272.   //if( (coding_mode_now==AUDIF_CODING_MODE_DTS)&&(isSPDIFBitstream==0) )
  273.   if(coding_mode_now==AUDIF_CODING_MODE_DTS)//terry,2004/3/26 11:13AM
  274.      abv_size      = DTS_AUDIO_BITSTREAM_LEN*3;
  275. #ifdef LPCM_EXTEND_BUF
  276.   else if(coding_mode_now==AUDIF_CODING_MODE_LPCM)
  277.      abv_size      = LPCM_AUDIO_BITSTREAM_LEN*3;
  278. #endif
  279. #ifdef MP3_JPEG_COWORK
  280.   else if(coding_mode_now==AUDIF_CODING_MODE_MP3) //ycwen 2005/1/21 allocate 48K bytes for mp3 when mp3_jpeg_cowork
  281.      abv_size      = MP3_AUDIO_BITSTREAM_LEN*3;  
  282. #endif
  283.   else
  284.      abv_size      = AUDIO_BITSTREAM_LEN*3;
  285.   if(coding_mode_now!=AUDIF_CODING_MODE_JPG)
  286.   {
  287.      //q = get_dsp3_pm_ptr();
  288.      write24(1,abv_size/3);
  289.   }
  290. }
  291. /**************************************************************************
  292.  *  Function Name: reset_audio_buf
  293.  *  Purposes:
  294.  *    Reset audio buffer size, and set Dump/Barrier pointer to 0
  295.  *  Descriptions:
  296.  *
  297.  *  Arguments:
  298.  *
  299.  *  Returns:
  300.  *
  301.  *  See also:
  302.  *
  303.  **************************************************************************/
  304. //
  305. // FUNCTION
  306. // reset_audio_buf
  307. //
  308. void
  309. reset_audio_buf(void)
  310. {
  311. #ifdef MP3_JPEG_COWORK//screen the operation when in JPEG side
  312.     if(pFsJpeg->gifsFuncBtn!=FS_FUNC_JPEG)//mark the action of reseting buffer
  313. #endif
  314.     {
  315.         abv_start     = get_dsp3_dm_ptr() + AUDIO_BITSTREAM_START*3;
  316.         set_aud_buf_size();
  317.         AudioSetBytePtr(0);
  318.         AudioSetDumpPointer(0);
  319.     }
  320. }
  321. /**************************************************************************
  322.  *  Function Name: setup_eq_display
  323.  *  Purposes:
  324.  *    Turn on or turn off EQ display
  325.  *  Descriptions:
  326.  *
  327.  *  Arguments:
  328.  *    val in : 0 - off, 1 - on
  329.  *  Returns:
  330.  *
  331.  *  See also:
  332.  *
  333.  **************************************************************************/
  334. void setup_eq_display(UINT8 val)
  335. {//terry,2003/9/26 04:42PM
  336.   bEqDisplay = val;
  337. //wanghaoying add 2003-12-11 9:56
  338. //Problem: when change sound page or close sound menu, the effect shut off.
  339. #if 1//!defined(YUXING_SOUND)&&!defined(REMB_3DSOUND)//yanlb add REMB_3DSOUND 2004-07-11 16:00
  340.   AUDIF_Set_EQType(bEqDisplay);//2004AUDDRV AudioSetEQType(bEqDisplay);
  341. #endif
  342. }
  343. /**************************************************************************
  344.  *  Function Name: dsp3_config
  345.  *  Purposes:
  346.  *    Set dsp3 memory space, memory based arguments. (through DM)
  347.  *  Descriptions:
  348.  *
  349.  *  Arguments:
  350.  *
  351.  *  Returns:
  352.  *
  353.  *  See also:
  354.  *    Documents such as DSPProtocol.doc in /doc
  355.  **************************************************************************/
  356. //
  357. // FUNCTION
  358. // dsp3_config
  359. //
  360. // DESCRIPTION
  361. // setup dsp3 memory space, memory based arguments.
  362. //
  363. extern  const short DTSrom[];
  364. #ifdef CHANGE_DSP_SPDIF_OFF//nono 2003-10-21 21:06
  365. extern BYTE audioNotContinuous;
  366. #endif
  367. void    dsp3_config(void)
  368. {
  369.   int i, v;
  370.   //BYTE *q;
  371.   // reset all DSP24 mailbox ports
  372.   //for (i=0;i<16;i++) regs0->dsp24_port[i] = 0; //Jeff 20011029
  373. // reset risc32 audio buffer pointers
  374.   reset_audio_buf();
  375. #if !defined(NO_DTS_OUTPUT)||defined(FORCE_NO_DTS_OUTPUT)//nono 4-5-5 13:50
  376.   DTSSetRomLocation((UINT32)DTSrom);
  377. #endif
  378.   //q = get_dsp3_pm_ptr();
  379.   // clear configs
  380.   for (i=0;i<64;i++) write24(i,0);
  381.   // write configs
  382.   write24(0,AUDIO_BITSTREAM_START);
  383.   write24(1,abv_size/3);
  384.   //write24(2,0);
  385.   // write configs
  386.   write24(3, setupGetSetting(3) );     //Time of Mic auto on after sound detect on
  387.   write24(4, setupGetSetting(4) );     //Time of Mic auto off after sound detect off
  388.   write24(5, setupGetSetting(5) );     //Mic sound detect gain threshold
  389.   write24(6, setupGetSetting(6) );     //Mic switch
  390.   write24(7, setupGetSetting(7) );     //Aduio gain
  391.   write24(8, setupGetSetting(8) );     //MIC gain
  392.   write24(9, setupGetSetting(9) );     //Key shift
  393.   write24(10,setupGetSetting(10));     //Echo delay
  394.   write24(11,setupGetSetting(11));     //Echo gain
  395.   write24(12,setupGetSetting(12));     //3D surround
  396.   write24(13,setupGetSetting(13));     //subwoof
  397.     // 14
  398.     v = setupGetSetting(14);
  399. #ifdef CHANGE_DSP_SPDIF_OFF
  400.     if( (power_on_mute==0)&&(audioNotContinuous==0) ) {//2003-8-15 20:56 for avoid SPDIF noise when power on.
  401. #else//#ifdef CHANGE_DSP_SPDIF_OFF
  402.     if(power_on_mute==0) {//2003-8-15 20:56 for avoid SPDIF noise when power on.
  403. #endif//#ifdef CHANGE_DSP_SPDIF_OFF
  404. #if !defined(DTS_CD_OUT_RAW_A)&&!defined(NO_DTS_OUTPUT)//NONO 20040117
  405.         if ( (cd_type_loaded==CDDA) && (setup_IsSet2SPDIF_Bitstream()) )
  406.         {
  407.             if (force_set_cd_md==0)
  408.                 v = 2;
  409.             else
  410.                 v = 1;
  411.         }
  412. #endif
  413.         if (v==1 && is_dts_force_spdif_bitstream()) v=2;
  414.         write24(14,v);   //PCM mode
  415.     }
  416.   write24(15,setupGetSetting(15));     //EQ
  417.   write24(16,setupGetSetting(16));     //SPDIF
  418.   //Jeff 20020521
  419.   write24(17,DACFORMAT);               //audio DAC format
  420.   write24(18,DAC_INVERT);              //dac polarity
  421.   //DAC output mapping
  422.   write24(19,DACOUTLm);
  423.   write24(20,DACOUTRm);
  424.   write24(21,DACOUT0L);
  425.   write24(22,DACOUT0R);
  426.   write24(23,DACOUT1L);
  427.   write24(24,DACOUT1R);
  428.   write24(25,DACOUT2L);
  429.   write24(26,DACOUT2R);
  430.   // Bass Management
  431.   // 0: Out 1, No Bass Management for 5 full-range spks and subwoofer output
  432.   // 1: Out 2, Configuration 1 for 5 satellites spks
  433.   // 2: Out 3, Simplified Bass Management for multi-channel source products
  434.   //           with fixed to L/R
  435.     #ifdef AC3_BASS_MANAGEMENT
  436. write24(27,setupGetSetting(27));     //Bass Management
  437.     #else
  438. //write24(27,0);
  439.     #endif
  440.     #if 1//def SPDIF_PLUS_ANALOG
  441. write24(28,1);
  442.     #else
  443. //write24(28,0);
  444.     #endif
  445.     if (cd_type_loaded==CDDA) { //Jeff update 20031223
  446. #ifdef DTS_CD_OUT_RAW_A
  447.          if ( (force_set_cd_md==0) && (cd_subtype==CD_DTS))
  448. #else
  449.         if ( (force_set_cd_md==0) &&
  450.              ( (setup_IsSet2SPDIF_Bitstream()) || (cd_subtype==CD_DTS) )
  451.            )
  452. #endif
  453.         {
  454.             UINT32  dtscdbstmidx=0;
  455.             if (smp_rate_now==FS_44K)
  456.                 dtscdbstmidx=1;
  457.             else if (smp_rate_now==FS_48K)
  458.                 dtscdbstmidx=2;
  459.             else if (smp_rate_now==FS_32K)
  460.                 dtscdbstmidx=3;
  461.             write24(29,dtscdbstmidx);
  462.         } //else {
  463.             //write24(29,0);
  464.         //}
  465.     } //else {
  466.         //write24(29,0);
  467.     //}
  468. /*
  469. #ifdef USE_FREQ_MASK
  470.     setup_SetFreqMaskConfig();//terry,2003/12/15 11:07AM
  471. #else
  472.     AUDIF_Set_FrqMsk(FREQ_MASK_DEFAULT);//2004AUDDRV audif_set_frequency_mask(FREQ_MASK_DEFAULT);
  473. #endif
  474. */
  475. //20041222 JSLin // always goest to setup_SetFreqMaskConfig()
  476. setup_SetFreqMaskConfig();
  477.     //write24(31,0);
  478.     //set_dsp3_pcm_value(32, frequency_multiple);
  479.     write24(32,frequency_multiple);
  480.     write24(33,setupGetSetting(33));
  481. #ifdef SUPPORT_PROLOGIC_II
  482.     write24(35,setupGetSetting(35));
  483. #endif
  484.     // ADC config ( default: 0)
  485.     // 0: Select Line_in L/R capability,but only mix right channel
  486.     // 1: Select Mic_Amp capability (only left channel capability)
  487.     // 2: Select Line_in L/R capability,mix left channel
  488.     // 3: Select Line_in L/R capability, Stereo ADC mic function
  489.     //write24(36,0);
  490.     write24(36,ADC_CONFIG_MODE);//nono 20030730
  491.     //CD pcm content under DTSCD and HDCD (default: 0)
  492.     // bit0: 1: If DTSCD is not allowable for customer,do not mute PCM output.
  493.     //       0: mute
  494.     // bit1: 1: Force CD type to do HDCD filter.
  495.     //       0: CD PCM output do not any modify.
  496.     // bit2: 1: HDCD function disable.
  497.     //       0: HDCD function enable.
  498.     //write24(37,0);
  499. #if defined(PLAY_HDCD_AS_CD)
  500.         write24(37,4);   //heqiang add for Ngailik, output with CD format when HDCD is loaded 4-2-23 17:38
  501. #endif
  502.     //RISC set ADC gain for custumer request (default:2)
  503.     // DSP will range it between 1~5
  504.     #ifdef ENHANCE_MIC_VOL_4   //axel add to enhancing MIC VOL 2003/11/26 11:46am
  505.     write24(38,4);
  506.     #else
  507.     write24(38,2);
  508.     #endif
  509.     write24(39, setupGetSetting(39) ); //Left channel gain , Jeff 20030901
  510.     write24(40, setupGetSetting(40) ); //Right channel gain
  511.     write24(41, setupGetSetting(41) ); //Left surround channel gain
  512.     write24(42, setupGetSetting(42) ); //Right surround channel gain
  513.     write24(43, setupGetSetting(43) ); //Center channel gain
  514.     write24(44, setupGetSetting(44) ); //MIC-2 gain
  515.     write24(46, setupGetSetting(46) ); //Sub-woofer channel gain, Jeff 20031028
  516.     //write24(47, setupGetSetting(46) ); //DTS/DVD-Audio Enable
  517.     #ifdef DTS_94_24_CFG
  518.     write24(48, DTS_94_24_CFG ); //DTS 96/24 function (0: disable, 1:enable, default 0)
  519.     #endif
  520.     #ifdef LmRm_CFG
  521.     write24(49, LmRm_CFG ); //Lm/Rm channel mapping to the same with L/R (0: disable, 1:enable, default 0)
  522.     #endif
  523.     #ifdef SPHE8202//terry,2004/4/9 10:39AM
  524.     write24(50,SPHE8202);
  525.     #endif
  526.     #ifdef SPHE1000 //MIKEY 2004.07.15 for SPDIF
  527.     write24(50,1);
  528.     #endif
  529. #ifdef SUPPORT_RECEIVER
  530.     write24(52,1); /*for tuner ADC gain,range 1--5*/
  531. #endif
  532.      #ifdef SUPPORT_TESTSPK   // benson     2004/7/2 04:37