ExtCodec.c
上传用户:hjhsjcl
上传日期:2020-09-25
资源大小:11378k
文件大小:17k
源码类别:

压缩解压

开发平台:

C++ Builder

  1. /*==========================================================================
  2. Copyright (c) 2004 ALi Corporation. All Rights Reserved
  3. File: Codec.c
  4. content: Audio Codec Functions
  5. History: Created by David Chiu 2004/4/29
  6. ==========================================================================*/
  7. #define _EXT_CODEC_H_
  8. #include <DP8051XP.H>
  9. #include "TypeDef.h"
  10. #include "Const.h"
  11. #include "Reg5661.h"
  12. #include "Common.h"
  13. #include "Idma.h"
  14. #include "ExtCodec.h"
  15. #if(!EXT_ADC | !EXT_DAC | EXT_PA)
  16. #include "IntCodec.h"
  17. #endif
  18. #if(EXT_ADC | EXT_DAC | EXT_PA)
  19. void CdcWriteCmd(BYTE bAddr, BYTE bData) large;
  20. #if(CDC_WM_8731)
  21. #define CDC_DEVICE_ADDRESS 0x34 //Wolfson WM8731
  22. #define WM_L_LINE_IN 0x00 //WM8731 Register address
  23. #define WM_LR_LINE_IN 0x01
  24. #define WM_R_LINE_IN 0x02
  25. #define WM_RL_LINE_IN 0x03
  26. #define WM_L_PHONE_OUT 0x04
  27. #define WM_LR_PHONE_OUT 0x05
  28. #define WM_R_PHONE_OUT 0x06
  29. #define WM_RL_PHONE_OUT 0x07
  30. #define WM_ANG_CTRL 0x08
  31. #define WM_DIG_CTRL 0x0A
  32. #define WM_PW_CTRL 0x0C
  33. #define WM_DIG_FORMAT 0x0E
  34. #define WM_SAMPLE_CTRL 0x10
  35. #define WM_ACTIVE_CTRL 0x12
  36. #define WM_RESET_REG 0x1E
  37. #endif
  38. #if(CDC_WM_8750)
  39. #define CDC_DEVICE_ADDRESS 0x34 //Wolfson WM8750
  40. #define WM_L_LINE_IN 0x00 //WM8750 Register address
  41. #define WM_LR_LINE_IN 0x01
  42. #define WM_R_LINE_IN 0x02
  43. #define WM_RL_LINE_IN 0x03
  44. #define WM_L_PHONE_OUT 0x04
  45. #define WM_LR_PHONE_OUT 0x05
  46. #define WM_R_PHONE_OUT 0x06
  47. #define WM_RL_PHONE_OUT 0x07
  48. #define WM_AD_DA_CTRL 0x0A
  49. #define WM_AUD_IF 0x0E
  50. #define WM_SAMPLE_RATE 0x10
  51. #define WM_L_DAC_VOL 0x14
  52. #define WM_LR_DAC_VOL 0x15
  53. #define WM_R_DAC_VOL 0x16
  54. #define WM_RL_DAC_VOL 0x17
  55. #define WM_BASS_CTRL 0x18
  56. #define WM_TREBLE_CTRL 0x1A
  57. #define WM_RESET_REG 0x1E
  58. #define WM_3D_CTRL 0x20
  59. #define WM_NOISE_GAIN 0x28
  60. #define WM_L_ADC_VOL 0x2A
  61. #define WM_LR_ADC_VOL 0x2B
  62. #define WM_R_ADC_VOL 0x2C
  63. #define WM_RL_ADC_VOL 0x2D
  64. #define WM_PW1_0 0x32
  65. #define WM_PW1_1 0x33
  66. #define WM_PW2_0 0x34
  67. #define WM_PW2_1 0x35
  68. #define WM_ADC_MODE_LINE1 0x3E
  69. #define WM_ADC_MODE_LINE2 0x3F
  70. #define WM_ADCL_PATH 0x40
  71. #define WM_ADCR_PATH 0x42
  72. #define WM_L_OUT_MIX1_0 0x44
  73. #define WM_L_OUT_MIX1_1 0x45
  74. #define WM_L_OUT_MIX2_0 0x46
  75. #define WM_L_OUT_MIX2_1 0x47
  76. #define WM_R_OUT_MIX1_0 0x48
  77. #define WM_R_OUT_MIX1_1 0x49
  78. #define WM_R_OUT_MIX2_0 0x4A
  79. #define WM_R_OUT_MIX2_1 0x4B
  80. #define WM_R_MONO_MIX1_0 0x4C
  81. #define WM_R_MONO_MIX1_1 0x4D
  82. #define WM_R_MONO_MIX2_0 0x4E
  83. #define WM_R_MONO_MIX2_1 0x4F
  84. #endif
  85. #endif
  86. #if((EXT_ADC | EXT_DAC | EXT_PA) & !_PM_INIT_)
  87. //#if(!( CDC_FOR_M5638C & _PM_DVR_ & SETTING_FOR_ICE_START)) //vicky050521#1 //CV0602
  88. API void ExtCdcCtrl(BYTE bCommand)
  89. {
  90. switch(bCommand)
  91. {
  92. case CDC_VOL_UP:
  93. case CDC_VOL_DOWN:
  94. #if(CDC_WM_8731|CDC_WM_8750)
  95. CdcWriteCmd(WM_LR_PHONE_OUT,(gxbVolume*2+47));
  96. //CdcWriteCmd(WM_L_PHONE_OUT,(gxbVolume*2+47)|0x80);
  97. CdcWriteCmd(WM_RL_PHONE_OUT,(gxbVolume*2+47));
  98. #endif
  99. break;
  100. case CDC_PLAYBACK_PAUSE:
  101. obI2S2CTRL1REG &= 0x7f; //Dis I2S IRQ
  102. break;
  103. case CDC_RETURN_PLAYBACK:
  104. obI2S2CTRL1REG |= 0x80; //En I2S IRQ
  105. break;
  106. case CDC_INIT:
  107. MCU_ACCESS_CODEC_I2S_EN(); 
  108. //obMODSEL1 |=  0x12; //Enable SD,MS ,known issue //Vicky050411#1
  109. obMODSEL2 |=  0x08; //Enable I2CM, I2S2, 
  110. obCLKI2CMCTRL=0xD0; //I2CM clock, 12MHz
  111. obREADYENL |= 0x80; //IOBUF
  112. obREADYENH |= 0x08; //I2C/I2S Ready
  113. obSYSSOFTRSTCTRL2|=0x04; //I2CM Normal
  114. obI2CCLKDIV =7; //I2C BCLK 375KHz
  115. obSYSSOFTRSTCTRL2&=0xfd; //I2S2 Reset
  116. obSYSSOFTRSTCTRL2|=0x02; //I2S2 Normal
  117. obDP8051SET|=0x48; //I2S2 to GPIOA, Reference clock output enable
  118. obCLKI2S2CTRL=0xB8; //I2S2 clock, AUD (73/67) MHz //Renshuo050310#X
  119. obCLKI2S2DIVF = 0x02; //default div by 4
  120. MCU_ACCESS_CODEC_I2S_DIS();
  121. #if(CDC_WM_8750)
  122. CdcWriteCmd(WM_RESET_REG,0x00); //reset registers
  123. #endif
  124. #if(CDC_WM_8731)          //reset registers       // Jeff_061016
  125. CdcWriteCmd(WM_RESET_REG,0x00);
  126. #endif
  127. #if(!EXT_ADC)
  128. IntCdcCtrl(CDC_INIT);
  129. #endif
  130. gfCdcAlreadyInit = TRUE; //Renshuo041203#A
  131. break;
  132. case CDC_PLAY_START:
  133. if(!gfCdcAlreadyInit) //2004.11.12 Renshuo
  134. {
  135. ExtCdcCtrl(CDC_INIT); //tne 2006/12/26 #1
  136. //gfCdcAlreadyInit = TRUE; //Renshuo041203#A
  137. }
  138. #if(CDC_WM_8750)
  139. CdcWriteCmd(WM_PW1_0,0xC0); //Power up VMID[50Kohm] and VREF
  140. CdcWriteCmd(WM_PW2_1,0x80); //Powerup DACL & DACR
  141. CdcWriteCmd(WM_PW2_1,0xE0); //Powerup Output Buffer L1 & R1(DACL & DACR still up)
  142. CdcWriteCmd(WM_AD_DA_CTRL,0x00);//dis DAV mute 
  143. CdcWriteCmd(WM_AUD_IF,0x11); //16 bits, MSB Left justified
  144. CdcWriteCmd(WM_LR_DAC_VOL,0xff); //DAC vol 0dB
  145. CdcWriteCmd(WM_L_OUT_MIX1_1,0x50);//LD2LO enable
  146. CdcWriteCmd(WM_R_OUT_MIX2_1,0x50);//RD2RO enable
  147. #endif      // Jeff_061016 start
  148. #if(CDC_WM_8731)
  149. CdcWriteCmd(WM_L_LINE_IN,0x97);  // Jeff_061016
  150. CdcWriteCmd(WM_R_LINE_IN,0x97);
  151. CdcWriteCmd(WM_L_PHONE_OUT,0x70);
  152. CdcWriteCmd(WM_R_PHONE_OUT,0x70);   // Jeff_061016
  153. //CdcWriteCmd(WM_L_LINE_IN,0x97);
  154. //CdcWriteCmd(WM_R_LINE_IN,0x97);
  155. //CdcWriteCmd(WM_L_PHONE_OUT,0x70);
  156. //CdcWriteCmd(WM_R_PHONE_OUT,0x70);
  157. CdcWriteCmd(WM_ACTIVE_CTRL,0x00);
  158. CdcWriteCmd(WM_ANG_CTRL,0x12);
  159. CdcWriteCmd(WM_DIG_CTRL,0x00);
  160. CdcWriteCmd(WM_DIG_FORMAT,0x11);
  161. CdcWriteCmd(WM_ACTIVE_CTRL,0x01);
  162. CdcWriteCmd(WM_PW_CTRL,0x67);
  163. #endif      // Jeff_061016 end
  164. CdcSetSampleRate();
  165. MCU_ACCESS_CODEC_I2S_EN();
  166. obI2S2CTRL3REG=0x08; //Audio data mode, PIO data
  167. obI2S2FIFOCTL=0x88; //Clear buffer
  168. obI2S2FIFOCTL=0x00;
  169. obI2S2CTRL1REG=0x97; //INT EN, WCLK EN, SDATA_OUT EN, 2 Channel, BCLK EN
  170. MCU_ACCESS_CODEC_I2S_DIS();
  171. CdcCtrl(CDC_VOL_DOWN); //set volume
  172. //#endif   // Jeff_061016
  173. break;
  174. #if(!_PM_PLAY_) //add by tne 2005/01/29 #1
  175. case CDC_REC_START:
  176. #if(CDC_WM_8750)
  177. CdcWriteCmd(WM_PW1_0,0xfc);
  178. CdcWriteCmd(WM_PW2_0,0x60);
  179. //CdcWriteCmd(WM_PW1_0,0xfE);
  180. //CdcWriteCmd(WM_PW2_0,0xff);
  181. CdcWriteCmd(WM_AUD_IF,0x11); //16 bits, MSB Left justified
  182. CdcSetSampleRate();
  183. MCU_ACCESS_CODEC_I2S_EN();
  184. obI2S2CTRL1REG=0x1B; //WCLK EN, SDATA_IN EN, 2 Channel, BCLK EN
  185. obI2S2CTRL3REG=0x08; //Audio data mode, PIO data
  186. obI2S2FIFOCTL=0x80; //Clear buffer
  187. obI2S2FIFOCTL=0x00;
  188. MCU_ACCESS_CODEC_I2S_DIS();
  189. CdcWriteCmd(WM_LR_LINE_IN,0x17);//Analogue vol 0dB //Renshuo050322#A
  190. CdcWriteCmd(WM_RL_LINE_IN,0x17);//Analogue vol 0dB
  191. CdcWriteCmd(WM_LR_ADC_VOL,0xc3);
  192. CdcWriteCmd(WM_RL_ADC_VOL,0xc3);
  193. #endif               // Jeff_061016 start
  194. #if(CDC_WM_8731)
  195. /* CdcWriteCmd(WM_ANG_CTRL,0xE5);
  196. CdcWriteCmd(WM_DIG_CTRL,0x09);
  197. CdcWriteCmd(WM_PW_CTRL,0x69);
  198. CdcWriteCmd(WM_ACTIVE_CTRL,0x01);
  199. CdcWriteCmd(WM_DIG_FORMAT,0x11); //16 bits, MSB Left justified*/
  200. CdcSetSampleRate();
  201. MCU_ACCESS_CODEC_I2S_EN();
  202. obI2S2CTRL1REG=0x1B; //WCLK EN, SDATA_IN EN, 2 Channel, BCLK EN
  203. obI2S2CTRL3REG=0x08; //Audio data mode, PIO data
  204. obI2S2FIFOCTL=0x80; //Clear buffer
  205. obI2S2FIFOCTL=0x00;
  206. MCU_ACCESS_CODEC_I2S_DIS();
  207. #endif            // Jeff_061016 end
  208. #if(!EXT_ADC)
  209. IntCdcCtrl(CDC_REC_START);
  210. #endif
  211. //#endif // Jeff_061016
  212. break;
  213. case CDC_FM_START:
  214. #if(CDC_WM_8750)
  215. CdcWriteCmd(WM_PW1_0,0xf0);
  216. CdcWriteCmd(WM_PW2_0,0x60);
  217. CdcCtrl(CDC_VOL_DOWN);   //set volume
  218. CdcWriteCmd(WM_L_OUT_MIX1_0,0xa1);//LINPUT2 to Lout
  219. CdcWriteCmd(WM_R_OUT_MIX1_0,0xa1);//RINPUT2 to Rout
  220. #endif
  221. #if(CDC_WM_8731)              // Jeff_061016 start
  222. obDCVARRD=0x14; //DCV power 
  223. obDCVWRDATA=0x98; //44.1K domain, Audio clock=67.7143M //D1003#9
  224. // For S-Case FM noise issue
  225. MCU_ACCESS_CODEC_I2S_EN(); 
  226. obCLKI2S2CTRL=0xB8; //I2S2 clock, AUD (73/67) MHz //Renshuo050310#X
  227. obCLKI2S2DIVF = 0x02; //default div by 4
  228. MCU_ACCESS_CODEC_I2S_DIS();
  229. CdcWriteCmd(WM_L_LINE_IN,0x1E);
  230. CdcWriteCmd(WM_R_LINE_IN,0x1E);
  231. CdcWriteCmd(WM_ANG_CTRL,0x0A);
  232. CdcWriteCmd(WM_PW_CTRL,0x6E);
  233. CdcWriteCmd(WM_DIG_CTRL,0x09);
  234. #endif                        // Jeff_061016 end
  235. #if(!EXT_ADC)  //Renshuo050322#A
  236. IntCdcCtrl(CDC_FM_START);
  237. ClkCdcEn();
  238. obALGPAREG = 0x80;
  239. ClkCdcDis();
  240. #endif
  241. break;
  242. case CDC_FM_IN_AUD_OUT:
  243. #if(CDC_WM_8750)
  244. CdcWriteCmd(WM_ADCL_PATH,0x40); //LINPUT2 to ADC, boost off //Renshuo050322#A
  245. CdcWriteCmd(WM_ADCR_PATH,0x40); //RINPUT2 to ADC, boost off
  246. CdcWriteCmd(WM_LR_LINE_IN,0x17);//Analogue vol 0dB
  247. CdcWriteCmd(WM_RL_LINE_IN,0x17);//Analogue vol 0dB
  248. CdcCtrl(CDC_VOL_DOWN);   //set volume
  249. CdcWriteCmd(WM_L_OUT_MIX1_0,0xa1);//LINPUT2 to Lout
  250. CdcWriteCmd(WM_R_OUT_MIX1_0,0xa1);//RINPUT2 to Rout
  251. #endif             // Jeff_061016 start
  252. #if(CDC_WM_8731)
  253. CdcWriteCmd(WM_ACTIVE_CTRL,0x00);
  254. CdcWriteCmd(WM_DIG_FORMAT,0x11);
  255. CdcWriteCmd(WM_L_LINE_IN,0x1E);
  256. CdcWriteCmd(WM_R_LINE_IN,0x1E);
  257. // CdcWriteCmd(WM_L_PHONE_OUT,0x79 - 12 - 6);
  258. // CdcWriteCmd(WM_R_PHONE_OUT,0x79 - 12 - 6);
  259. CdcWriteCmd(WM_ANG_CTRL,0x0A);
  260. CdcWriteCmd(WM_DIG_CTRL,0x19);
  261. CdcWriteCmd(WM_ACTIVE_CTRL,0x01);
  262. CdcWriteCmd(WM_PW_CTRL,0x62);
  263. #endif             // Jeff_061016 end
  264. #if(!EXT_ADC)
  265. IntCdcCtrl(CDC_FM_IN_AUD_OUT);
  266. #else
  267. MCU_ACCESS_CODEC_I2S_EN();
  268. obI2S2CTRL1REG |= 0x80;   //En I2S IRQ
  269. MCU_ACCESS_CODEC_I2S_DIS();
  270. #endif
  271. //#endif   // Jeff_061016
  272. break;
  273. case CDC_LINE_IN_AUD_OUT:
  274. #if(CDC_WM_8750)
  275. CdcCtrl(CDC_VOL_DOWN);    //set volume
  276. CdcWriteCmd(WM_ADCL_PATH,0x00); //LINPUT0 to ADC, boost off //Renshuo050322#A
  277. CdcWriteCmd(WM_ADCR_PATH,0x00); //RINPUT0 to ADC, boost off
  278. CdcWriteCmd(WM_LR_LINE_IN,0x17);//Analogue vol 0dB
  279. CdcWriteCmd(WM_RL_LINE_IN,0x17);//Analogue vol 0dB
  280. CdcWriteCmd(WM_L_OUT_MIX1_0,0xa0); //LINPUT1 to Lout
  281. CdcWriteCmd(WM_R_OUT_MIX1_0,0xa0); //RINPUT1 to Rout
  282. #endif          // Jeff_061016 start
  283. #if(CDC_WM_8731)
  284. /* CdcWriteCmd(WM_L_LINE_IN,0x1F);
  285. CdcWriteCmd(WM_R_LINE_IN,0x1F);
  286. CdcWriteCmd(WM_ANG_CTRL,0x0A);
  287. CdcWriteCmd(WM_PW_CTRL,0x7A);
  288. CdcWriteCmd(WM_ACTIVE_CTRL,0x01);
  289. CdcWriteCmd(WM_DIG_CTRL,0x19);*/
  290. /* CdcWriteCmd(WM_DIG_FORMAT,0x11);OK
  291. CdcWriteCmd(WM_LR_PHONE_OUT,0x00);
  292. CdcWriteCmd(WM_L_LINE_IN,0x1F);
  293. CdcWriteCmd(WM_R_LINE_IN,0x1F);
  294. CdcWriteCmd(WM_ANG_CTRL,0x0A);
  295. CdcWriteCmd(WM_PW_CTRL,0x7A);
  296. CdcWriteCmd(WM_ACTIVE_CTRL,0x01);
  297. CdcWriteCmd(WM_DIG_CTRL,0x19);*/
  298. CdcWriteCmd(WM_ACTIVE_CTRL,0x00);
  299. CdcWriteCmd(WM_DIG_FORMAT,0x11);
  300. CdcWriteCmd(WM_L_LINE_IN,0x1C);
  301. CdcWriteCmd(WM_R_LINE_IN,0x1C);
  302. CdcWriteCmd(WM_L_PHONE_OUT,0x0);
  303. CdcWriteCmd(WM_R_PHONE_OUT,0x0);
  304. CdcWriteCmd(WM_ANG_CTRL,0x02);
  305. CdcWriteCmd(WM_PW_CTRL,0x7A);
  306. CdcWriteCmd(WM_DIG_CTRL,0x19);
  307. CdcWriteCmd(WM_ACTIVE_CTRL,0x01);
  308. /* CdcWriteCmd(WM_L_LINE_IN,0x1E);
  309. CdcWriteCmd(WM_R_LINE_IN,0x1E);
  310. CdcWriteCmd(WM_L_PHONE_OUT,0x2F);
  311. CdcWriteCmd(WM_R_PHONE_OUT,0x2F);
  312. CdcWriteCmd(WM_ANG_CTRL,0x02);
  313. CdcWriteCmd(WM_DIG_CTRL,0x09);
  314. CdcWriteCmd(WM_ACTIVE_CTRL,0x01);
  315. CdcWriteCmd(WM_PW_CTRL,0x6A);*/
  316. #endif            // Jeff_061016 end
  317. #if(!EXT_ADC)
  318. IntCdcCtrl(CDC_LINE_IN_AUD_OUT);
  319. #else
  320. MCU_ACCESS_CODEC_I2S_EN();
  321. obI2S2CTRL1REG |= 0x80; //En I2S IRQ
  322. MCU_ACCESS_CODEC_I2S_DIS();
  323. #endif
  324. // #endif  // Jeff_061016
  325. break;
  326. case CDC_MIC_IN_NO_AUD_OUT:
  327. #if(CDC_WM_8750)
  328. CdcWriteCmd(WM_PW1_0,0xfe);
  329. CdcWriteCmd(WM_PW2_0,0x00);
  330. CdcWriteCmd(WM_ADCL_PATH,0xb0); //LINPUT3 to ADC, 29dB boost //Renshuo050322#A
  331. CdcWriteCmd(WM_ADCR_PATH,0xb0); //RINPUT3 to ADC, 29dB boost
  332. CdcWriteCmd(WM_LR_LINE_IN,0x3f);//Analogue vol +30dB
  333. CdcWriteCmd(WM_RL_LINE_IN,0x3f);//Analogue vol +30dB
  334. //CdcWriteCmd(WM_AD_DA_CTRL,0x01);//dis HP filter
  335. #endif          // Jeff_061016 start
  336. #if(CDC_WM_8731)
  337. CdcWriteCmd(WM_ACTIVE_CTRL,0x00);
  338. CdcWriteCmd(WM_ANG_CTRL,0xE5);
  339. CdcWriteCmd(WM_DIG_CTRL,0x08);
  340. CdcWriteCmd(WM_DIG_FORMAT,0x11); //16 bits, MSB Left justified
  341. CdcWriteCmd(WM_ACTIVE_CTRL,0x01);
  342. CdcWriteCmd(WM_PW_CTRL,0x69);
  343. #endif          // Jeff_061016 end
  344. #if(!EXT_ADC)
  345. IntCdcCtrl(CDC_MIC_IN_NO_AUD_OUT);
  346. #else
  347. MCU_ACCESS_CODEC_I2S_EN();
  348. obI2S2CTRL1REG |= 0x80; //En I2S IRQ
  349. MCU_ACCESS_CODEC_I2S_DIS();
  350. #endif
  351. //#endif  // Jeff_061016
  352. break;
  353. #endif // not _PM_PLAY_ endif
  354. }
  355. }
  356. //#endif
  357. #endif
  358. #if((EXT_ADC | EXT_DAC | EXT_PA) & !_PM_INIT_)
  359. API void ExtCdcSetSampleRate(void)
  360. {
  361. if((gxwSampleRate%1000)==0) //48K domain
  362. {
  363. obDCVARRD=0x14; //DCV power 
  364. obDCVWRDATA=0x90; //48K domain, Audio clock=73.7143M //D1003#9
  365. }
  366. else //44.1K domain
  367. {
  368. obDCVARRD=0x14; //DCV power 
  369. obDCVWRDATA=0x98; //44.1K domain, Audio clock=67.7143M //D1003#9
  370. }
  371. MCU_ACCESS_CODEC_I2S_EN();
  372. //obMODSEL1 |=  0x02; //Enable MS //Vicky050411#1
  373. //obCLKI2S2DIVF=6;
  374. //obCLKI2S2CTRL=0xB8; //I2S2 clock, Audio Clock/8=9.214M or 8.464M
  375. //obCLKI2S2CTRL=0xD0; //I2S2 clock, 12 MHz //always use AUD clk
  376. obSYSSOFTRSTCTRL2&=0xfd;//I2S2 reset
  377. obSYSSOFTRSTCTRL2|=0x02;//I2S2 Normal
  378. switch(gxwSampleRate)
  379. {
  380. #if(CDC_WM_8750)
  381. case 48000:
  382. CdcWriteCmd(WM_SAMPLE_RATE,0x02);//48k, not USB mode;
  383. obI2S2SCLKDIV=12; //I2S BCLK 18.432M/12 = (48k*32)
  384. break;
  385. case 32000:
  386. CdcWriteCmd(WM_SAMPLE_RATE,0x1A); //32k, not USB mode;
  387. obI2S2SCLKDIV=18; //I2S BCLK 18.432M/18 = (32k*32)
  388. break;
  389. case 24000: 
  390. CdcWriteCmd(WM_SAMPLE_RATE,0x3A);//24k, not USB mode;
  391. obI2S2SCLKDIV=24; //I2S BCLK 18.432M/24 = (24k*32)
  392. break;
  393. case 16000:
  394. CdcWriteCmd(WM_SAMPLE_RATE,0x16);//16k, not USB mode;
  395. obI2S2SCLKDIV=36; //I2S BCLK 18.432M/36 = (16k*32)
  396. break;
  397. case 12000:
  398. CdcWriteCmd(WM_SAMPLE_RATE,0x12);//16k, not USB mode;
  399. obI2S2SCLKDIV=48; //I2S BCLK 18.432M/48 = (12k*32)
  400. break;
  401. case 8000:
  402. CdcWriteCmd(WM_SAMPLE_RATE,0x0E); //8k, not USB mode
  403. obI2S2SCLKDIV=72; //I2S BCLK 18.432M/72 = (8k*32)
  404. break;
  405. case 11025:
  406. CdcWriteCmd(WM_SAMPLE_RATE,0x32);//11.025k, not USB mode;
  407. obI2S2SCLKDIV=48; //I2S BCLK 16.9344M/48 = (11.025k*32)
  408. break;
  409. case 22050:
  410. CdcWriteCmd(WM_SAMPLE_RATE,0x36);//22.05k, not USB mode;
  411. //obI2S2SCLKDIV=12; //I2S BCLK 705KHz
  412. obI2S2SCLKDIV=24; //I2S BCLK 16.9344M/24 = (22.05k*32)
  413. break;
  414. case 44100:
  415. default:
  416. CdcWriteCmd(WM_SAMPLE_RATE,0x22);//44.1k, not USB mode;
  417. obI2S2SCLKDIV=12; //I2S BCLK 16.9344M/12 = (44.1k*32)
  418. break;
  419. #endif       // Jeff_061016 start
  420. #if(CDC_WM_8731)//add by william lian 
  421. case 48000:
  422. CdcWriteCmd(WM_SAMPLE_CTRL,0x02);//48k, not USB mode;
  423. obI2S2SCLKDIV=12; //I2S BCLK 18.432M/12 = (48k*32)
  424. break;
  425. case 32000:
  426. CdcWriteCmd(WM_SAMPLE_CTRL,0x1A); //32k, not USB mode;
  427. obI2S2SCLKDIV=18; //I2S BCLK 18.432M/18 = (32k*32)
  428. break;
  429. case 8000:
  430. CdcWriteCmd(WM_SAMPLE_CTRL,0x0E); //8k, not USB mode
  431. obI2S2SCLKDIV=72; //I2S BCLK 18.432M/72 = (8k*32)
  432. break;
  433. case 96000:
  434. CdcWriteCmd(WM_SAMPLE_CTRL,0x1E);//96k,not USB mode
  435. obI2S2SCLKDIV=6; //I2S BCLK 18.432M/6 = (96k*32)
  436. break;
  437. case 88200:
  438. CdcWriteCmd(WM_SAMPLE_CTRL,0x3E);//88.2k,not USB mode
  439. obI2S2SCLKDIV=6; //I2S BCLK 16.9344M/6 = (88.2k*32)
  440. break;
  441. case 24000:
  442. CdcWriteCmd(WM_SAMPLE_CTRL,0x42);//24k, not USB mode;
  443. obI2S2SCLKDIV=24; //I2S BCLK 18.432M/24 = (24k*32)
  444. break;
  445. case 16000:
  446. CdcWriteCmd(WM_SAMPLE_CTRL,0x5A); //16k, not USB mode;
  447. obI2S2SCLKDIV=36; //I2S BCLK 18.432M/36 = (16k*32)
  448. break;
  449. case 12000:
  450. CdcWriteCmd(WM_SAMPLE_CTRL,0x02);//12k, not USB mode;
  451. obI2S2SCLKDIV=48; //I2S BCLK 18.432M/48 = (12k*32)
  452. break;
  453. case 11025:
  454. CdcWriteCmd(WM_SAMPLE_CTRL,0x22);//11.025k, not USB mode;
  455. obI2S2SCLKDIV=48; //I2S BCLK 16.9344M/48 = (11.025k*32)
  456. break;
  457. case 22050:
  458. CdcWriteCmd(WM_SAMPLE_CTRL,0x62);//22.050k, not USB mode;
  459. obI2S2SCLKDIV=24; //I2S BCLK 16.9344M/24 = (22.050k*32)
  460. break;
  461. case 44100:
  462. default:
  463. CdcWriteCmd(WM_SAMPLE_CTRL,0x22);//44.1k, not USB mode;
  464. obI2S2SCLKDIV=12; //I2S BCLK 16.9344M/12 = (44.1k*32)
  465. break;          // Jeff_061016 end
  466. #endif
  467. }
  468. #if(CDC_WM_8750|CDC_WM_8731) // Jeff_061016
  469. obI2S2CTRL3REG=0x08; //Audio data mode, PIO data
  470. obI2S2FIFOCTL=0x88; //Clear buffer
  471. obI2S2FIFOCTL=0x00;
  472. obI2S2CTRL1REG=0x97; //INT EN, WCLK EN, SDATA_OUT EN, 2 Channel, BCLK EN
  473. #endif
  474. MCU_ACCESS_CODEC_I2S_DIS();
  475. }
  476. #endif
  477. #if((EXT_ADC | EXT_DAC | EXT_PA) & !_PM_INIT_)
  478. void CdcWriteCmd(BYTE bAddr, BYTE bData) large
  479. {
  480. obCLKI2CMCTRL |= 0x80; //clock Enable
  481. obMODSEL2 |= 0x08; //I2CM Enable
  482. #define ReTry bAddr
  483. obI2CMAADDR=CDC_DEVICE_ADDRESS;
  484. obI2CSLADDR=bAddr;
  485. obI2CFIFO=bData;
  486. obI2CMACMD=0x11;
  487. ReTry=0xFF;
  488. while(obI2CSERSTS&0x80) //wait busy
  489. {
  490. ReTry--;
  491. if(ReTry==0)
  492. break;
  493. }
  494. obMODSEL2 &= 0xF7; //I2CM Disable
  495. obCLKI2CMCTRL &= 0x7F; //clock Disable
  496. }
  497. #endif
  498. #if(_PM_REC_)
  499. //tne 2005/08/17 //release IntCode
  500. void ClearExtCdcBuffer(void) large //This function would be called by Record Engine (ReInit)
  501. {
  502. #if(EXT_ADC) //Ren050312#1
  503. MCU_ACCESS_CODEC_I2S_EN();
  504. obI2S2FIFOCTL=0x88; //Clear buffer
  505. obI2S2FIFOCTL=0x00;
  506. MCU_ACCESS_CODEC_I2S_DIS();
  507. #else
  508. // ...do nothing
  509. #endif
  510. }
  511. #endif