ddx8000.c
上传用户:caisangzi8
上传日期:2013-10-25
资源大小:15756k
文件大小:37k
源码类别:

DVD

开发平台:

C/C++

  1. /***********************************
  2. Creater: xiongyuyue
  3. Date   : 2003/8/14 
  4. Description: Amplifier function using
  5. Reference:DDX8000 Datasheet(APOGEE CO.)
  6. ***********************************/
  7. #include "user_init.h"
  8. //#include "config.h"
  9. //#include "regmap.h"
  10. #include "global.h"
  11. #include "ircode.h"
  12. #include "osd.h"
  13. //#include "gpio.h"
  14. //#include "iop.h"
  15. #include "audctrl.h"
  16. #include "ddx8000.h"
  17. #include "cchar.h"
  18. #include "util.h"
  19. #define NOP delay_1us(10000)
  20. #ifdef SUPPORT_SAVE_AMPLIFIER_STATUS
  21. extern void save_amplifier_status_to_e2prom();
  22. extern void load_amplifier_status_from_e2prom();
  23. #endif
  24. int ddx_amp_mode = 0;
  25. extern BYTE amp_lev[9];
  26. extern BYTE vol_gain[9];
  27. #if defined(AMPVOL_ADJUST_TYPE1)
  28. extern BYTE channelNm;//xyy 2004-5-25 10:44
  29. #endif
  30. #if defined(DDX8000_BINARY_MODE)
  31. BYTE channel_addr[6] = 
  32. {
  33. 0x0f,//front left
  34. 0x0d,//front right
  35. 0x0c,//surround left
  36. 0x0a,//surround right
  37. 0x09,//center
  38. 0x0e//subwoofer
  39. };
  40. #elif defined(XINGQIU_BINARY_MODE)
  41. BYTE channel_addr[6] = 
  42. {
  43. 0x0a,//front left
  44. 0x0c,//front right
  45. 0x0f,//surround left
  46. 0x0d,//surround right
  47. 0x09,//center
  48. 0x0e//subwoofer
  49. };
  50. #else
  51. BYTE channel_addr[6] = 
  52. {
  53. 0x09,//front left
  54. 0x0a,//front right
  55. 0x0b,//surround left
  56. 0x0c,//surround right
  57. 0x0d,//center
  58. 0x0e//subwoofer
  59. };
  60. #endif
  61. //Reset DDX8000
  62. void ddx_reset_all(void)
  63. {
  64. BYTE data;
  65. //Reset Configuration Register A
  66. data = 0x83;
  67. WriteToI2c(DDX8K_ADDR,CONFIGREG_A,&data,1);
  68. //Reset Configuration Register B
  69. data = 0x42;
  70. WriteToI2c(DDX8K_ADDR,CONFIGREG_B,&data,1);
  71. //Reset Configuration Register C
  72. data = 0x7c;
  73. WriteToI2c(DDX8K_ADDR,CONFIGREG_C,&data,1);
  74. //Reset Configuration Register D
  75. data = 0x20;
  76. WriteToI2c(DDX8K_ADDR,CONFIGREG_D,&data,1);
  77. //Reset Configuration Register E
  78. data = 0x02;
  79. WriteToI2c(DDX8K_ADDR,CONFIGREG_E,&data,1);
  80. //Reset Configuration Register F
  81. data = 0x00;
  82. WriteToI2c(DDX8K_ADDR,CONFIGREG_F,&data,1);
  83. //Master Mute
  84. data = 0x00;
  85. WriteToI2c(DDX8K_ADDR,MASTER_MUTE_REG,&data,1);
  86. //Master Volume
  87. data = 0xff;
  88. WriteToI2c(DDX8K_ADDR,MASTER_VOL_REG,&data,1);
  89. //Channel 1,2,3,4,5,6,7,8 mute
  90. data = 0x00;
  91. WriteToI2c(DDX8K_ADDR,CHANEL_MUTE_REG,&data,1);
  92. //Channel 1,2,3,4,5,6,7,8 Volume
  93. data = 0x30;
  94. WriteToI2c(DDX8K_ADDR,C1V_REG,&data,8);
  95. //Channel Input Mapping
  96. data = 0x10;
  97. WriteToI2c(DDX8K_ADDR,C12MAP_REG,&data,1);
  98. data = 0x32;
  99. WriteToI2c(DDX8K_ADDR,C34MAP_REG,&data,1);
  100. data = 0x54;
  101. WriteToI2c(DDX8K_ADDR,C56MAP_REG,&data,1);
  102. data = 0x76;
  103. WriteToI2c(DDX8K_ADDR,C78MAP_REG,&data,1);
  104. //Limiter Selection
  105. data = 0x00;
  106. WriteToI2c(DDX8K_ADDR,CLIMITER_SEL0,&data,2);
  107. //Limiter 1 & 2 Rates and Thresholds
  108. data = 0xa6;
  109. WriteToI2c(DDX8K_ADDR,L1RATE_REG,&data,1);
  110. data = 0x67;
  111. WriteToI2c(DDX8K_ADDR,L1THRESHOLDS_REG,&data,1);
  112. data = 0xa6;
  113. WriteToI2c(DDX8K_ADDR,L2RATE_REG,&data,1);
  114. data = 0x67;
  115. WriteToI2c(DDX8K_ADDR,L2THRESHOLDS_REG,&data,1);
  116. //Tone control
  117. data = 0x77;
  118. WriteToI2c(DDX8K_ADDR,TONE_CTRL_REG,&data,1);
  119. }
  120. void write_reg_bit(int addr,BYTE bit,BYTE val)
  121. {
  122. BYTE tmp = 0;
  123. int res;
  124. res = ReadFromI2c(DDX8K_ADDR,addr,&tmp,1);
  125. NOP;
  126. // printf("11-----------------tmp = :%x,res :%d**********n",tmp,res);
  127. if(val)
  128. tmp |= 0x01<<bit;
  129. else
  130. tmp &= ~(0x01<<bit);
  131. NOP;
  132. res = WriteToI2c(DDX8K_ADDR,addr,&tmp,1);
  133. printf("1addr :%x,tmp = :%x,res :%dn",addr,tmp,res);
  134. NOP;
  135. res = ReadFromI2c(DDX8K_ADDR,addr,&tmp,1);
  136. printf("2addr :%x,tmp = :%x,res :%dn",addr,tmp,res);
  137. }
  138. //Enable or Disable External Amplifier Power Down
  139. void ddx_enableEPAD(void)
  140. {
  141. write_reg_bit(CONFIGREG_F,7,1);
  142. }
  143. void ddx_disableEPAD(void)
  144. {
  145. write_reg_bit(CONFIGREG_F,7,0);
  146. }
  147. /*///////////////////////////////////////////////////////////////
  148. sample_rate     ctrl        input data format
  149.    32fs         ×010        MSB First Right/Left-Justified 16-bit data
  150.    48fs         0001        MSB First Left-Justified Data
  151.                 1001        LSB First Left-Justified Data
  152.                 ×010        Right-Justified 16-bit Data
  153.                 ×011        Right-Justified 18-bit Data
  154.                 ×100        Right-Justified 20-bit Data
  155.                 ×101        Right-Justified 24-bit Data
  156.    64fs         0000        I2S 16 to 24-bit Data          default input data format
  157.     0001        MSB First Left-Justified Data
  158.                 1001        LSB First Left-Justified Data
  159.                 ×010        Right-Justified 16-bit Data
  160.                 ×011        Right-Justified 18-bit Data
  161.                 ×100        Right-Justified 20-bit Data
  162.                 ×101        Right-Justified 24-bit Data
  163. *////////////////////////////////////////////////////////////////
  164. void set_inputData_format(BYTE ctrl)
  165. {
  166.     UINT16      romSum=0;
  167.     BYTE *p = (BYTE *)(&romSum);
  168. ReadFromI2c(DDX8K_ADDR,CONFIGREG_B,p,1);
  169. *p = (ctrl<<2) | (*p & 0xc3);
  170. WriteToI2c(DDX8K_ADDR,CONFIGREG_B,p,1);
  171. }
  172. //channel mapping
  173. //par:  pch---processing channel number; ich---input channel number
  174. void ddx_channel_map(BYTE pch,BYTE ich)
  175. {
  176.     UINT16      romSum=0;
  177.     BYTE *p = (BYTE *)(&romSum);
  178. switch(pch)
  179. {
  180. case 1:
  181. *p = (*p & 0xf8) | (ich-1);
  182. WriteToI2c(DDX8K_ADDR,C12MAP_REG,p,1);
  183. break;
  184. case 2:
  185. *p = (*p & 0x8f) | ((ich-1)<<4);
  186. WriteToI2c(DDX8K_ADDR,C12MAP_REG,p,1);
  187. break;
  188. case 3:
  189. *p = (*p & 0xf8) | (ich-1);
  190. WriteToI2c(DDX8K_ADDR,C34MAP_REG,p,1);
  191. break;
  192. case 4:
  193. *p = (*p & 0x8f) | ((ich-1)<<4);
  194. WriteToI2c(DDX8K_ADDR,C34MAP_REG,p,1);
  195. break;
  196. case 5:
  197. *p = (*p & 0xf8) | (ich-1);
  198. WriteToI2c(DDX8K_ADDR,C56MAP_REG,p,1);
  199. break;
  200. case 6:
  201. *p = (*p & 0x8f) | ((ich-1)<<4);
  202. WriteToI2c(DDX8K_ADDR,C56MAP_REG,p,1);
  203. break;
  204. case 7:
  205. *p = (*p & 0xf8) | (ich-1);
  206. WriteToI2c(DDX8K_ADDR,C78MAP_REG,p,1);
  207. break;
  208. case 8:
  209. *p = (*p & 0x8f) | ((ich-1)<<4);
  210. WriteToI2c(DDX8K_ADDR,C78MAP_REG,p,1);
  211. break;
  212. }
  213. }
  214. //////////////////////////////////////////////////////////////////
  215. //Configuration Register A
  216. /*
  217. sample rate(kHz)  |  IR(D4~D3)  |            MCS(D2~D0)
  218. -----------------------------------------------------------------------
  219.                   |             |  1××   | 011   | 010   | 001   | 000
  220. -----------------------------------------------------------------------
  221. 32, 44.1, 48      |     00      |  128fs | 256fs | 384fs | 512fs | 768fs
  222. 88.2, 96          |     01      |  64fs  | 128fs | 192fs | 256fs | 384fs
  223. 176.4, 192        |     10      |  64fs  | 128fs | 192fs | 256fs | 384fs
  224. Reserved          |     NA      |    NA  |   NA  |   NA  |   NA  |   NA
  225. -----------------------------------------------------------------------
  226. */
  227. ///////////////////////////////////////////////////////////////////
  228. void set_inputClock(BYTE IR,BYTE MCS)
  229. {
  230.     UINT16      romSum=0;
  231.     BYTE *p = (BYTE *)(&romSum);
  232. *p = (*p & 0xe0) | ((IR<<3) | MCS);
  233. WriteToI2c(DDX8K_ADDR,CONFIGREG_A,p,1);
  234. }
  235. //Bass Management
  236. //set Configuration Register A bit 5 will enable or disable bass management
  237. void ddx_enable_BassManagement(void)
  238. {
  239. write_reg_bit(CONFIGREG_A,5,1);
  240. }
  241. void ddx_disable_BassManagement(void)
  242. {
  243. write_reg_bit(CONFIGREG_A,5,0);
  244. }
  245. //Reading a Coefficient Value From RAM
  246. UINT32 ddx_readCoefVal(BYTE regAddr)
  247. {
  248. UINT32 tmp;
  249.     UINT16      romSum=0;
  250.     BYTE *p = (BYTE *)(&romSum);
  251.     
  252. //    printf("**********************************************n");
  253.     //write 8-bit address to I2C register 1Ch
  254.     *p = regAddr;
  255. WriteToI2c(DDX8K_ADDR,0x1c,p,1);
  256. *p = 0;
  257. ReadFromI2c(DDX8K_ADDR,0x1c,p,1);
  258. // printf("the val of register 0x1c is:%xn",*p);
  259. //read top 8-bits of coefficient in I2C address 1Dh
  260. *p = 0;
  261. ReadFromI2c(DDX8K_ADDR,0x1d,p,1);
  262. // printf("the val of register 0x1d is:%xn",*p);
  263. tmp = (*p << 16) & 0xff0000;
  264. //read middle 8-bits of coefficient in I2C address 1Fh
  265. *p = 0;
  266. ReadFromI2c(DDX8K_ADDR,0x1e,p,1);
  267. // printf("the val of register 0x1e is:%xn",*p);
  268. tmp = tmp | ((*p << 8) & 0xff00);
  269. //read bottom 8-bits of coefficient in I2C address 1Fh
  270. *p=0;
  271. ReadFromI2c(DDX8K_ADDR,0x1f,p,1);
  272. // printf("the val of register 0x1f is:%xn",*p);
  273. tmp = tmp | *p;
  274. return tmp;
  275. }
  276. //Writing a single Coefficient Value to RAM
  277. void ddx_writeCoefVal(BYTE regAddr,UINT32 coefVal)
  278. {
  279.     UINT16      romSum=0;
  280.     BYTE *p = (BYTE *)(&romSum);
  281.     
  282.     //write 8-bit address to I2C register 1Ch
  283.     *p = regAddr;
  284. WriteToI2c(DDX8K_ADDR,0x1c,p,1);
  285. //write top 8-bits of coefficient in I2C address 1Dh
  286. *p = (coefVal & 0xff0000) >> 16;
  287. WriteToI2c(DDX8K_ADDR,0x1d,p,1);
  288. //write middle 8-bits of coefficient in I2C address 1Eh
  289. *p = (coefVal & 0x00ff00) >> 8;
  290. WriteToI2c(DDX8K_ADDR,0x1e,p,1);
  291. //write bottom 8-bits of coefficient in I2C address 1Fh
  292. *p = (coefVal & 0x0000ff);
  293. WriteToI2c(DDX8K_ADDR,0x1f,p,1);
  294. //write control
  295. write_reg_bit(0x2c,0,1);
  296. }
  297. //Writing a set of Coefficient Values to RAM
  298. void ddx_writeCoefValSets(BYTE startAddr,coef_factor factor)
  299. {
  300.     UINT16      romSum=0;
  301.     BYTE *p = (BYTE *)(&romSum);
  302.     //write 8-bit address to I2C register 1Ch
  303.     *p = startAddr;
  304. WriteToI2c(DDX8K_ADDR,0x1c,p,1);
  305. //write factor b2
  306. *p = (factor.b2 & 0xff0000) >> 16;
  307. WriteToI2c(DDX8K_ADDR,0x1d,p,1);
  308. *p = (factor.b2 & 0x00ff00) >> 8;
  309. WriteToI2c(DDX8K_ADDR,0x1e,p,1);
  310. *p = (factor.b2 & 0x0000ff);
  311. WriteToI2c(DDX8K_ADDR,0x1f,p,1);
  312. //write factor b0
  313. *p = (factor.b0 & 0xff0000) >> 16;
  314. WriteToI2c(DDX8K_ADDR,0x20,p,1);
  315. *p = (factor.b0 & 0x00ff00) >> 8;
  316. WriteToI2c(DDX8K_ADDR,0x21,p,1);
  317. *p = (factor.b0 & 0x0000ff);
  318. WriteToI2c(DDX8K_ADDR,0x22,p,1);
  319. //write factor a2
  320. *p = (factor.a2 & 0xff0000) >> 16;
  321. WriteToI2c(DDX8K_ADDR,0x23,p,1);
  322. *p = (factor.a2 & 0x00ff00) >> 8;
  323. WriteToI2c(DDX8K_ADDR,0x24,p,1);
  324. *p = (factor.a2 & 0x0000ff);
  325. WriteToI2c(DDX8K_ADDR,0x25,p,1);
  326. //write factor a1
  327. *p = (factor.a1 & 0xff0000) >> 16;
  328. WriteToI2c(DDX8K_ADDR,0x26,p,1);
  329. *p = (factor.a1 & 0x00ff00) >> 8;
  330. WriteToI2c(DDX8K_ADDR,0x27,p,1);
  331. *p = (factor.a1 & 0x0000ff);
  332. WriteToI2c(DDX8K_ADDR,0x28,p,1);
  333. //write factor b1
  334. *p = (factor.b1 & 0xff0000) >> 16;
  335. WriteToI2c(DDX8K_ADDR,0x29,p,1);
  336. *p = (factor.b1 & 0x00ff00) >> 8;
  337. WriteToI2c(DDX8K_ADDR,0x2a,p,1);
  338. *p = (factor.b1 & 0x0000ff);
  339. WriteToI2c(DDX8K_ADDR,0x2b,p,1);
  340. //write control
  341. write_reg_bit(0x2c,1,1);
  342. }
  343. //HPB register i.e. Configuation Register C-02h,Bit 7
  344. //1: disable this feature
  345. //0: enable this feature
  346. //input:1---disable,0---enable
  347. //enable High Pass Filter
  348. void enable_hpf(void)
  349. {
  350. write_reg_bit(CONFIGREG_C,7,0);
  351. }
  352. void disable_hpf(void)
  353. {
  354.   write_reg_bit(CONFIGREG_C,7,1);
  355. }
  356. #ifdef SUPPORT_BASS_TREBLE
  357. //tone control:  include treble control and bass control
  358. //input:
  359. //updown: 1---boost tone -1---cut tone
  360. BYTE ddx_trebleCtrl(int updown)   //xulf modified 2004-01-13
  361. {
  362.     BYTE romSum=0;
  363.     BYTE *p = (BYTE *)(&romSum);
  364.     
  365. ReadFromI2c(DDX8K_ADDR,TONE_CTRL_REG,p,1);
  366. if(updown==1)
  367. {
  368. if(ddx_Treble_lev < 0x0d)
  369. ddx_Treble_lev++;
  370. }
  371. else if(updown==-1)
  372. {
  373. if(ddx_Treble_lev > 0x1)
  374. ddx_Treble_lev--;
  375. }
  376. *p = (ddx_Treble_lev<<4) | (*p & 0x0f);
  377. WriteToI2c(DDX8K_ADDR,TONE_CTRL_REG,p,1);
  378. #ifdef SUPPORT_SAVE_AMPLIFIER_STATUS
  379. WriteToI2c(0xa0, TREBLE_GAIN_ADDR, &ddx_Treble_lev, 1);
  380. #endif
  381. }
  382. BYTE  ddx_bassCtrl(int updown) //xulf modified 2004-01-13
  383. {
  384.     BYTE romSum=0;
  385.     BYTE *p = (BYTE *)(&romSum);
  386.     
  387. ReadFromI2c(DDX8K_ADDR,TONE_CTRL_REG,p,1);
  388. if(updown==1)
  389. {
  390. if(ddx_Bass_lev < 0x0d)      
  391. ddx_Bass_lev++;
  392. }
  393. else if(updown==-1)
  394. {
  395. if(ddx_Bass_lev > 0x1)
  396. ddx_Bass_lev--;
  397. }
  398. *p = ddx_Bass_lev | (*p & 0xf0);
  399. WriteToI2c(DDX8K_ADDR,TONE_CTRL_REG,p,1);
  400. #ifdef SUPPORT_SAVE_AMPLIFIER_STATUS
  401. WriteToI2c(0xa0, BASS_GAIN_ADDR, &ddx_Bass_lev, 1);
  402. #endif
  403. }
  404. #endif
  405. //volume control:  include master volume control and channel volume control
  406. //input:
  407. /*
  408. updown:  1---boost,  -1---cut
  409. mute:    1---Hard Master Mute,  0---not mute,adjust volume
  410. */
  411. void ddx_master_volume_adjust(int updown,BYTE mute)
  412. {
  413.     BYTE tmp_var;
  414.     int iRts;
  415.     
  416.     if(mute)
  417.     {
  418. tmp_var = 0xff;
  419. vol_gain[0] = tmp_var;
  420. WriteToI2c(DDX8K_ADDR,MASTER_VOL_REG,&tmp_var,1);
  421. return;
  422.     }
  423.     else
  424.     {
  425. //     ddx_masterMute(1);
  426. iRts = ReadFromI2c(DDX8K_ADDR,MASTER_VOL_REG,&tmp_var,1);
  427.      if(updown==1)
  428.      {
  429.      if(tmp_var>0x00 && tmp_var<=0x13)//0x00:0dB,0x13:-9.5dB
  430.      tmp_var--;
  431.      else if(tmp_var>=0x14 && tmp_var<=0x31)//0x14:-10dB,0x31:-24.5dB
  432.          tmp_var = tmp_var - 2;
  433.      else if(tmp_var>=0x32 && tmp_var<=0x6b)//0x32:-25dB,0x6b:-53dB
  434.      tmp_var = tmp_var - 4;
  435.      }
  436.      else if(updown==-1)
  437.      {
  438.      if(tmp_var>=0x00 && tmp_var<=0x13)//0x00:0dB,0x13:-9.5dB
  439.      tmp_var++;
  440.      else if(tmp_var>=0x14 && tmp_var<=0x31)//0x14:-10dB,0x31:-24.5dB
  441.          tmp_var += 2;
  442.      else if(tmp_var>=0x32 && tmp_var<=0x6b)//0x32:-25dB,0x6b:-53dB
  443.      tmp_var += 4;
  444.      }
  445.      if(amp_lev[0]==1)
  446.      tmp_var = 0x6b;//-53dB
  447.      else if(amp_lev[0]==0)
  448.      tmp_var = 0xff;
  449. vol_gain[0] = tmp_var;
  450.      WriteToI2c(DDX8K_ADDR,MASTER_VOL_REG,&tmp_var,1);
  451. #ifdef SUPPORT_SAVE_AMPLIFIER_STATUS
  452. iRts = WriteToI2c(0xa0,AMPLIFIER_START,&amp_lev[0],1);    
  453. iRts = WriteToI2c(0xa0,AMPLIFIER_START+9,&tmp_var,1);
  454. #endif
  455. //     ddx_masterMute(0);
  456.     }
  457. }
  458. //Set Master Volume Gain
  459. void ddx_setMVG(BYTE chAddr,BYTE ctrl)
  460. {
  461. WriteToI2c(DDX8K_ADDR,chAddr,&ctrl,1);
  462. }
  463. //input:
  464. /*
  465. chAddr:  channel volume regsiter address
  466. updown:  1---boost,  -1---cut
  467. */
  468. #ifdef AMPVOL_ADJUST_TYPE1//xyy 2004-5-25
  469. void ddx_channel_volume_adjust(BYTE chAddr,int updown)
  470. {
  471. //    UINT16      romSum=0;
  472.     BYTE tmp_var;
  473. // ddx_masterMute(1);
  474. ReadFromI2c(DDX8K_ADDR,chAddr,&tmp_var,1);
  475. if(updown==1)
  476. {
  477. if(tmp_var>0x00)
  478.     tmp_var -= 2;
  479. }
  480. else if(updown==-1)
  481. {
  482. if(tmp_var<0x28)
  483.     tmp_var += 2;
  484. }
  485. vol_gain[channelNm] = tmp_var;
  486. WriteToI2c(DDX8K_ADDR,chAddr,&tmp_var,1);
  487. #ifdef SUPPORT_SAVE_AMPLIFIER_STATUS //xyy 2004-3-6 10:16
  488. WriteToI2c(0xa0,AMPLIFIER_START+channelNm,&amp_lev[channelNm],1);    
  489. WriteToI2c(0xa0,AMPLIFIER_START+(9+channelNm),&tmp_var,1);
  490. #endif
  491. // ddx_masterMute(0);
  492. }
  493. #else
  494. void ddx_channel_volume_adjust(BYTE chAddr,int updown)
  495. {
  496. //    UINT16      romSum=0;
  497.     BYTE tmp_var;
  498. // ddx_masterMute(1);
  499. ReadFromI2c(DDX8K_ADDR,chAddr,&tmp_var,1);
  500. if(updown==1)
  501. {
  502.      if(tmp_var>0x00 && tmp_var<=0x13)//0x00:24dB,0x13:14.5dB
  503.      tmp_var--;
  504.      else if(tmp_var>=0x14 && tmp_var<=0x31)//0x14:14dB,0x31:-0.5dB
  505.          tmp_var -= 2;
  506.      else if(tmp_var>=0x32 && tmp_var<=0x6e)//0x32:-1dB,0x6b:-30.5dB
  507.      tmp_var -= 4;
  508. }
  509. else if(updown==-1)
  510. {
  511.      if(tmp_var>=0x00 && tmp_var<=0x13)//0x00:24dB,0x13:14.5dB
  512.      tmp_var++;
  513.      else if(tmp_var>=0x14 && tmp_var<=0x31)//0x14:14dB,0x31:-0.5dB
  514.          tmp_var += 2;
  515.      else if(tmp_var>=0x32 && tmp_var<=0x6e)//0x32:-1dB,0x6b:-30.5dB
  516.      tmp_var += 4;
  517. }
  518. vol_gain[y_index] = tmp_var;
  519. WriteToI2c(DDX8K_ADDR,chAddr,&tmp_var,1);
  520. #ifdef SUPPORT_SAVE_AMPLIFIER_STATUS //xyy 2004-3-6 10:16
  521. WriteToI2c(0xa0,AMPLIFIER_START+y_index,&amp_lev[y_index],1);    
  522. WriteToI2c(0xa0,AMPLIFIER_START+(9+y_index),&tmp_var,1);
  523. #endif
  524. // ddx_masterMute(0);
  525. }
  526. #endif
  527. //Set Channel Volume Gain
  528. void ddx_setCVG(BYTE chAddr,BYTE ctrl)
  529. {
  530. WriteToI2c(DDX8K_ADDR,chAddr,&ctrl,1);
  531. }
  532. //all changes in volume take place at digital zero-crossing
  533. //will create the smoothest possible volume transition
  534. void ddx_enZeroCross(void)
  535. {
  536. write_reg_bit(CONFIGREG_B,6,1);
  537. }
  538. void ddx_disZeroCross(void)
  539. {//volume updates immediately
  540. write_reg_bit(CONFIGREG_B,6,0);
  541. }
  542. //Master Volume Mute
  543. //mute all channels simultaneously
  544. //mute   1: mute       0: demute
  545. void ddx_masterMute(BYTE mute)
  546. {
  547. if(mute)
  548. write_reg_bit(MASTER_MUTE_REG,0,1);
  549. else
  550. write_reg_bit(MASTER_MUTE_REG,0,0);
  551. }
  552. //channel mute individually
  553. //mute   1: mute       0: demute
  554. void ddx_channelMute(BYTE chNum,BYTE mute)
  555. {
  556. if(mute)
  557. write_reg_bit(CHANEL_MUTE_REG,chNum,1);
  558. else
  559. write_reg_bit(CHANEL_MUTE_REG,chNum,0);
  560. }
  561. //Channel Limiter Selection
  562. /*
  563. CxLS(1,0)   Channel Limiter Mapping
  564. -------------------------------------------
  565.    00       Channel has limiting disabled
  566.    01       Channel is mapped to limiter #1
  567.    10       Channel is mapped to limiter #2
  568.    11       Reserved.Don't use this setting
  569. --------------------------------------------
  570. */
  571. void ddx_ch1_limiterSel(BYTE selCtrl)
  572. {
  573. BYTE data;
  574. ReadFromI2c(DDX8K_ADDR,CLIMITER_SEL0,&data,1);
  575. data = selCtrl | (data & 0xfc); 
  576. if(selCtrl<0x03)
  577. WriteToI2c(DDX8K_ADDR,CLIMITER_SEL0,&data,1);
  578. }
  579. void ddx_ch2_limiterSel(BYTE selCtrl)
  580. {
  581. BYTE data;
  582. ReadFromI2c(DDX8K_ADDR,CLIMITER_SEL0,&data,1);
  583. data = (selCtrl << 2) | (data & 0xf3); 
  584. if(selCtrl<0x03)
  585. WriteToI2c(DDX8K_ADDR,CLIMITER_SEL0,&data,1);
  586. }
  587. void ddx_ch3_limiterSel(BYTE selCtrl)
  588. {
  589. BYTE data;
  590. ReadFromI2c(DDX8K_ADDR,CLIMITER_SEL0,&data,1);
  591. data = (selCtrl << 4) | (data & 0xcf); 
  592. if(selCtrl<0x03)
  593. WriteToI2c(DDX8K_ADDR,CLIMITER_SEL0,&data,1);
  594. }
  595. void ddx_ch4_limiterSel(BYTE selCtrl)
  596. {
  597. BYTE data;
  598. ReadFromI2c(DDX8K_ADDR,CLIMITER_SEL0,&data,1);
  599. data = (selCtrl << 6) | (data & 0x3f); 
  600. if(selCtrl<0x03)
  601. WriteToI2c(DDX8K_ADDR,CLIMITER_SEL0,&data,1);
  602. }
  603. void ddx_ch5_limiterSel(BYTE selCtrl)
  604. {
  605. BYTE data;
  606. ReadFromI2c(DDX8K_ADDR,CLIMITER_SEL1,&data,1);
  607. data = selCtrl | (data & 0xfc); 
  608. if(selCtrl<0x03)
  609. WriteToI2c(DDX8K_ADDR,CLIMITER_SEL1,&data,1);
  610. }
  611. void ddx_ch6_limiterSel(BYTE selCtrl)
  612. {
  613. BYTE data;
  614. ReadFromI2c(DDX8K_ADDR,CLIMITER_SEL1,&data,1);
  615. data = (selCtrl << 2) | (data & 0xf3); 
  616. if(selCtrl<0x03)
  617. WriteToI2c(DDX8K_ADDR,CLIMITER_SEL1,&data,1);
  618. }
  619. void ddx_ch7_limiterSel(BYTE selCtrl)
  620. {
  621. BYTE data;
  622. ReadFromI2c(DDX8K_ADDR,CLIMITER_SEL1,&data,1);
  623. data = (selCtrl << 4) | (data & 0xcf); 
  624. if(selCtrl<0x03)
  625. WriteToI2c(DDX8K_ADDR,CLIMITER_SEL1,&data,1);
  626. }
  627. void ddx_ch8_limiterSel(BYTE selCtrl)
  628. {
  629. BYTE data;
  630. ReadFromI2c(DDX8K_ADDR,CLIMITER_SEL1,&data,1);
  631. data = (selCtrl << 6) | (data & 0x3f); 
  632. if(selCtrl<0x03)
  633. WriteToI2c(DDX8K_ADDR,CLIMITER_SEL1,&data,1);
  634. }
  635. //Set Compression and Release Rates of Limiter
  636. void ddx_setL1CRrates(BYTE ctrl)
  637. {
  638. WriteToI2c(DDX8K_ADDR,L1RATE_REG,&ctrl,1);
  639. }
  640. void ddx_setL2CRrates(BYTE ctrl)
  641. {
  642. WriteToI2c(DDX8K_ADDR,L2RATE_REG,&ctrl,1);
  643. }
  644. //Set Compression and Release Threshold of Limiter
  645. void ddx_setL1CRthreshold(BYTE ctrl)
  646. {
  647. WriteToI2c(DDX8K_ADDR,L1THRESHOLDS_REG,&ctrl,1);
  648. }
  649. void ddx_setL2CRthreshold(BYTE ctrl)
  650. {
  651. WriteToI2c(DDX8K_ADDR,L2THRESHOLDS_REG,&ctrl,1);
  652. }
  653. //Set Dynamic Range Compression mode
  654. //drc: 1----Dynamic Range Compression mode
  655. //     0----Anti-Clipping Mode(default)
  656. void ddx_setDRCmode(BYTE drc)
  657. {
  658. write_reg_bit(CONFIGREG_B,7,drc);
  659. }
  660. //Set Max Power Correction
  661. void ddx_setMPC(void)
  662. {
  663. write_reg_bit(CONFIGREG_A,7,1);
  664. }
  665. //Head Phone Enable or Disable
  666. void ddx_enHeadPhone(void)
  667. {
  668. write_reg_bit(CONFIGREG_A,6,1);
  669. }
  670. void ddx_disHeadPhone(void)
  671. {
  672. write_reg_bit(CONFIGREG_A,6,0);
  673. }
  674. //AM Mode Enable or Disable
  675. void ddx_enableAM_mode(void)
  676. {
  677. write_reg_bit(CONFIGREG_F,3,1);
  678. }
  679. void ddx_disableAM_mode(void)
  680. {
  681. write_reg_bit(CONFIGREG_F,3,0);
  682. }
  683. //Initialize volume gain
  684. #if defined(DDX8000_BINARY_MODE) || defined(XINGQIU_BINARY_MODE)
  685. void ddx_set_BassManagement(void)
  686. {
  687. coef_factor bass_coef;
  688. //set channel 7,5,4,2,1 pre-scale factor
  689. //set channel 2,4,7,5,1 pre-scale factor
  690.     ddx_writeCoefVal(0xd6,FL_SCALE_FACTOR); 
  691.     ddx_writeCoefVal(0xd4,FR_SCALE_FACTOR);
  692.     ddx_writeCoefVal(0xd3,SL_SCALE_FACTOR);
  693.     ddx_writeCoefVal(0xd1,SR_SCALE_FACTOR);
  694.     ddx_writeCoefVal(0xd0,CE_SCALE_FACTOR);
  695.     ddx_writeCoefVal(0xd5,LFE_SCALE_FACTOR);
  696.     
  697. //set channel 7,5,4,2,1 filter coefficient
  698. bass_coef.b2 = HPF_COEF_B2;
  699. bass_coef.b0 = HPF_COEF_B0;
  700. bass_coef.a2 = HPF_COEF_A2;
  701. bass_coef.a1 = HPF_COEF_A1;
  702. bass_coef.b1 = HPF_COEF_B1;
  703. ddx_writeCoefValSets(0x96,bass_coef);  //channel 7    
  704. ddx_writeCoefValSets(0x64,bass_coef);  //channel 5
  705. ddx_writeCoefValSets(0x4b,bass_coef);  //channel 4
  706. ddx_writeCoefValSets(0x19,bass_coef);  //channel 2
  707. ddx_writeCoefValSets(0x00,bass_coef);  //channel 1
  708. //set channel 6 filter coefficient
  709. bass_coef.b2 = LPF_COEF_B2;
  710. bass_coef.b0 = LPF_COEF_B0;
  711. bass_coef.a2 = LPF_COEF_A2;
  712. bass_coef.a1 = LPF_COEF_A1;
  713. bass_coef.b1 = LPF_COEF_B1;
  714. ddx_writeCoefValSets(0x7d,bass_coef);
  715. }
  716. void ddx_init_volumeGain(void)
  717. {
  718. #if defined(DDX8000_BINARY_MODE)
  719. ddx_setMVG(MASTER_VOL_REG,vol_gain[0]);
  720. ddx_setCVG(C7V_REG,vol_gain[1]);
  721. ddx_setCVG(C5V_REG,vol_gain[2]);
  722. ddx_setCVG(C4V_REG,vol_gain[3]);
  723. ddx_setCVG(C2V_REG,vol_gain[4]);
  724. ddx_setCVG(C1V_REG,vol_gain[5]);
  725. ddx_setCVG(C6V_REG,vol_gain[6]);
  726. ddx_setCVG(C3V_REG,0xff);
  727. ddx_setCVG(C8V_REG,0xff);
  728. #elif defined(XINGQIU_BINARY_MODE)
  729. ddx_setMVG(MASTER_VOL_REG,vol_gain[0]);
  730. ddx_setCVG(C2V_REG,vol_gain[1]);
  731. ddx_setCVG(C4V_REG,vol_gain[2]);
  732. ddx_setCVG(C7V_REG,vol_gain[3]);
  733. ddx_setCVG(C5V_REG,vol_gain[4]);
  734. ddx_setCVG(C1V_REG,vol_gain[5]);
  735. ddx_setCVG(C6V_REG,vol_gain[6]);
  736. ddx_setCVG(C3V_REG,0xff);
  737. ddx_setCVG(C8V_REG,0xff);
  738. #endif
  739. }
  740. #else
  741. void ddx_set_BassManagement(void)
  742. {
  743. coef_factor bass_coef;
  744. //set pre-scale factor
  745.     ddx_writeCoefVal(0xd0,FL_SCALE_FACTOR);
  746.     ddx_writeCoefVal(0xd1,FR_SCALE_FACTOR);
  747.     ddx_writeCoefVal(0xd2,SL_SCALE_FACTOR);
  748.     ddx_writeCoefVal(0xd3,SL_SCALE_FACTOR);
  749.     ddx_writeCoefVal(0xd4,CE_SCALE_FACTOR);
  750.     ddx_writeCoefVal(0xd5,LFE_SCALE_FACTOR);
  751.     
  752. //set channel 1,2,3,4,5 filter coefficient
  753. bass_coef.b2 = HPF_COEF_B2;
  754. bass_coef.b0 = HPF_COEF_B0;
  755. bass_coef.a2 = HPF_COEF_A2;
  756. bass_coef.a1 = HPF_COEF_A1;
  757. bass_coef.b1 = HPF_COEF_B1;
  758. ddx_writeCoefValSets(0x00,bass_coef);
  759. ddx_writeCoefValSets(0x19,bass_coef);
  760. ddx_writeCoefValSets(0x32,bass_coef);
  761. ddx_writeCoefValSets(0x4b,bass_coef);
  762. ddx_writeCoefValSets(0x64,bass_coef);
  763. //set channel 6 filter coefficient
  764. bass_coef.b2 = LPF_COEF_B2;
  765. bass_coef.b0 = LPF_COEF_B0;
  766. bass_coef.a2 = LPF_COEF_A2;
  767. bass_coef.a1 = LPF_COEF_A1;
  768. bass_coef.b1 = LPF_COEF_B1;
  769. ddx_writeCoefValSets(0x7d,bass_coef);
  770. }
  771. void ddx_init_volumeGain(void)
  772. {
  773. //set volume gain 
  774. // ddx_setMVG(MASTER_VOL_REG,0x2c/*-20dB*/);
  775. // ddx_setMVG(MASTER_VOL_REG,0x3c/*-30dB*/);
  776. ddx_setMVG(MASTER_VOL_REG,vol_gain[0]);
  777. ddx_setCVG(C1V_REG,vol_gain[1]);
  778. ddx_setCVG(C2V_REG,vol_gain[2]);
  779. ddx_setCVG(C3V_REG,vol_gain[3]);
  780. ddx_setCVG(C4V_REG,vol_gain[4]);
  781. ddx_setCVG(C5V_REG,vol_gain[5]);
  782. ddx_setCVG(C6V_REG,vol_gain[6]);
  783. ddx_setCVG(C7V_REG,0xff);
  784. ddx_setCVG(C8V_REG,0xff);
  785. }
  786. #endif
  787. void ddx_set_biquad_iir_filter_coef(BYTE addr,BYTE top,BYTE mid,BYTE bot)
  788. {
  789. #if 1
  790. BYTE data;
  791. NOP;
  792. data = addr;
  793. WriteToI2c(DDX8K_ADDR,0x1c,&data,1);
  794. data = top;
  795. WriteToI2c(DDX8K_ADDR,0x1d,&data,1);
  796. data = mid;
  797. WriteToI2c(DDX8K_ADDR,0x1e,&data,1);
  798. data = bot;
  799. WriteToI2c(DDX8K_ADDR,0x1f,&data,1);
  800. data = 0x01;
  801. WriteToI2c(DDX8K_ADDR,0x2c,&data,1);
  802. #endif
  803. }
  804. void ddx_set_biquad_iir_filter()
  805. {
  806. int index = 0;
  807. do{
  808. ddx_set_biquad_iir_filter_coef(index,0x7f,0x8e,0x71);
  809. ddx_set_biquad_iir_filter_coef((index+1),0x3f,0xc7,0x38);
  810. ddx_set_biquad_iir_filter_coef((index+2),0x80,0xe2,0xb9);
  811. ddx_set_biquad_iir_filter_coef((index+3),0x7f,0x8e,0x3e);
  812. ddx_set_biquad_iir_filter_coef((index+4),0x80,0x71,0x8f);
  813. index += 5;
  814. }while (index <= 125);
  815. ddx_set_biquad_iir_filter_coef(126,0x00,0x00,0x8c);
  816. ddx_set_biquad_iir_filter_coef(127,0x00,0x00,0x46);
  817. ddx_set_biquad_iir_filter_coef(128,0x81,0x7a,0x80);
  818. ddx_set_biquad_iir_filter_coef(129,0x7f,0x41,0xa7);
  819. ddx_set_biquad_iir_filter_coef(130,0x00,0x00,0x8c);
  820. }
  821. //Initialization
  822. void ddx_initialization(void)
  823. {
  824. int res;
  825. BYTE data;
  826. //printf("ddx_initialization()n");
  827. /*
  828. before write cmd to initiate the amplifier,we should confirm its existence first!
  829. huziqin 2004-1-14
  830. */
  831. res = ReadFromI2c(DDX8K_ADDR,0,&data,1);
  832. if(res<0)
  833. {
  834. printf("fail to init ddx or there is no ddx!! ret n");
  835. return;
  836. }
  837. enable_hpf();
  838.        //NOP;
  839. set_inputClock(0x00,0x03);//256Fs
  840. //NOP;
  841. //set input data format
  842. //set input data format   :DVD,VCD,MP3,CD,
  843. #if defined(WM8746)//Right-Justified 24-bit Data
  844. set_inputData_format(0x05);
  845. #elif defined(WM8746I2S24) || defined(USE_DAC_I2S24)//I2S 24-bit Data
  846. set_inputData_format(0x00);
  847. #endif
  848. // BYTE data = 0x27;
  849. // WriteToI2c(DDX8K_ADDR,0x03,&data,1);
  850. //enable bass management
  851. //ddx_enable_BassManagement();
  852. //Enable Zero Crossing
  853. //ddx_enZeroCross();
  854. //set Anti-clipping Mode for 5.1 Channels
  855. //ddx_setDRCmode(0);
  856. #ifdef SUPPORT_SAVE_AMPLIFIER_STATUS
  857. load_amplifier_status_from_e2prom();
  858. #endif
  859. //initialize volume gain
  860. ddx_init_volumeGain();
  861. //This function cause crash when the amplifier is not connected.
  862. // ddx_set_biquad_iir_filter();
  863. #if defined(DDX8000_BINARY_MODE)
  864. data=0x2f;              
  865. WriteToI2c(DDX8K_ADDR,CONFIGREG_D,&data,1);  
  866.     //channel mapping via I2C
  867.     //output: 7 5 4 2 1 6=====input: 1 2 3 4 5 6
  868. data = 0x34;        
  869. WriteToI2c(DDX8K_ADDR,C12MAP_REG,&data,1);
  870. data = 0x20;
  871. WriteToI2c(DDX8K_ADDR,C34MAP_REG,&data,1);
  872. data = 0x51;
  873. WriteToI2c(DDX8K_ADDR,C56MAP_REG,&data,1);
  874. data = 0x00;
  875. WriteToI2c(DDX8K_ADDR,C78MAP_REG,&data,1);
  876. #elif defined(XINGQIU_BINARY_MODE)//xyy 2004-3-31
  877. data=0x2f;              
  878. WriteToI2c(DDX8K_ADDR,CONFIGREG_D,&data,1);  
  879.     //channel mapping via I2C
  880.     //input: 1 2 3 4 5 6=====output: 2 4 7 5 1 6
  881. data = 0x04;        
  882. WriteToI2c(DDX8K_ADDR,C12MAP_REG,&data,1);
  883. data = 0x10;
  884. WriteToI2c(DDX8K_ADDR,C34MAP_REG,&data,1);
  885. data = 0x53;
  886. WriteToI2c(DDX8K_ADDR,C56MAP_REG,&data,1);
  887. data = 0x02;
  888. WriteToI2c(DDX8K_ADDR,C78MAP_REG,&data,1);
  889. #endif
  890. //set bass management
  891. //ddx_set_BassManagement();
  892. //limiter selection: channel 1,2,3,4,5 select limiter 1
  893. //channel 6 select limiter 2
  894. ddx_ch7_limiterSel(0x01);//unmark by xyy 2004-4-29 
  895. ddx_ch4_limiterSel(0x01);
  896. ddx_ch5_limiterSel(0x01);
  897. ddx_ch2_limiterSel(0x01);
  898. ddx_ch1_limiterSel(0x01);
  899. ddx_ch6_limiterSel(0x02);
  900. //set limiter 1,2 Attack Rate and Release Rate
  901. ddx_setL1CRrates(0xa4);
  902. ddx_setL2CRrates(0xf7);
  903. //set limiter 1,2 Attack Threshold and Release Threshold
  904. ddx_setL1CRthreshold(0x76);
  905. ddx_setL2CRthreshold(0x76);
  906. // write_reg_bit(0x30,
  907. // BYTE data = 0x00;
  908. // WriteToI2c(DDX8K_ADDR,0x03,&data,1);
  909. //unmute all channels
  910. // ddx_enableAM_mode();
  911. /* NOP;
  912. ddx_masterMute(0);
  913. NOP;
  914. ddx_enableEPAD();
  915. */
  916. }
  917. void ddx_ampvol_func_left(void);
  918. void ddx_ampvol_func_right(void);
  919. void ddx_ampvol_func_up(void);
  920. void ddx_ampvol_func_down(void);
  921. void ddx_volume_adjust(UINT32 key)
  922. {
  923. switch(key)
  924. {
  925. case IRC_UP:
  926. ddx_ampvol_func_up();
  927. break;
  928. case IRC_DOWN:
  929. ddx_ampvol_func_down();
  930. break;
  931. case IRC_LEFT:
  932. ddx_ampvol_func_left();
  933. break;
  934. case IRC_RIGHT:
  935. ddx_ampvol_func_right();
  936. break;
  937. }
  938. }
  939. /*****************************************
  940. /Function: ddx_Set_EQ()
  941. /Description: Set coefficient values of biquads for preset EQ settings. 
  942. /Creator: xulf
  943. /Date: 2003-12-27
  944. ****************************************/
  945. #ifdef AMP_SUPPORT_EQ
  946. void ddx_Set_EQ(BYTE EQtype)
  947. {
  948.     coef_factor biquad_coef;
  949. //    ddx_disableEPAD();   //EAPD
  950.     ddx_masterMute(1);  //mute all channels
  951.     switch(EQtype)
  952.     {
  953. case NONE:
  954.     //set the channel pre-scale. 
  955.     ddx_writeCoefVal(0xc8,0xe36809);  //channel 1 
  956.      biquad_coef.b2 = 0x000000;
  957.     biquad_coef.b0 = 0x3fffff;
  958.     biquad_coef.a2 = 0x000000;
  959.     biquad_coef.a1 = 0x000000;
  960.     biquad_coef.b1 = 0x000000;
  961.     ddx_writeCoefValSets(0x05,biquad_coef);  //channel 1 biquad2
  962.     ddx_writeCoefValSets(0x0a,biquad_coef);  //channel 1 biquad3     
  963.     ddx_writeCoefValSets(0x0f,biquad_coef);  //channel 1 biquad4     
  964.     ddx_writeCoefValSets(0x14,biquad_coef);  //channel 1 biquad5
  965.     //each channel uses channel 1 coefficient values.
  966.      write_reg_bit(CONFIGREG_D,7,1); 
  967.     break;
  968. case ROCK:
  969.     ddx_writeCoefVal(0xc8,0xaf3cc5);  //channel 1 
  970.     biquad_coef.b2 = 0x7fcf05;
  971.     biquad_coef.b0 = 0x40058a;
  972.     biquad_coef.a2 = 0x8025e6;
  973.     biquad_coef.a1 = 0x7fed02;
  974.     biquad_coef.b1 = 0x8012fe;
  975.     ddx_writeCoefValSets(0x05,biquad_coef);  //channel 1 biquad2
  976.      biquad_coef.b2 = 0x7fd80a;
  977.     biquad_coef.b0 = 0x4006a3;
  978.     biquad_coef.a2 = 0x801aaf;
  979.     biquad_coef.a1 = 0x7ff28c;
  980.     biquad_coef.b1 = 0x800d74;
  981.     ddx_writeCoefValSets(0x0a,biquad_coef);  //channel 1 biquad3     
  982.      biquad_coef.b2 = 0x7ead9f;
  983.     biquad_coef.b0 = 0x3fc7c8;
  984.     biquad_coef.a2 = 0x81c2d0;
  985.     biquad_coef.a1 = 0x7f1d06;
  986.     biquad_coef.b1 = 0x80e2fa;
  987.     ddx_writeCoefValSets(0x0f,biquad_coef);  //channel 1 biquad4     
  988.      biquad_coef.b2 = 0x5d3dab;
  989.     biquad_coef.b0 = 0x46a5ae;
  990.     biquad_coef.a2 = 0x9576f8;
  991.     biquad_coef.a1 = 0x714597;
  992.     biquad_coef.b1 = 0x8eba69;
  993.     ddx_writeCoefValSets(0x14,biquad_coef);  //channel 1 biquad5
  994.     //each channel uses channel 1 coefficient values.
  995.      write_reg_bit(CONFIGREG_D,7,1); 
  996.     break;
  997. case POP:
  998.     ddx_writeCoefVal(0xc8,0xdb759b);  //channel 1 
  999.      biquad_coef.b2 = 0x7fe781;
  1000.     biquad_coef.b0 = 0x3ffd3a;
  1001.     biquad_coef.a2 = 0x801e09;
  1002.     biquad_coef.a1 = 0x7ff0f8;
  1003.     biquad_coef.b1 = 0x800f08;
  1004.     ddx_writeCoefValSets(0x05,biquad_coef);  //channel 1 biquad2
  1005.      biquad_coef.b2 = 0x7cc19b;
  1006.     biquad_coef.b0 = 0x40e89e;
  1007.     biquad_coef.a2 = 0x816d29;
  1008.     biquad_coef.a1 = 0x7f40df;
  1009.     biquad_coef.b1 = 0x80bf21;
  1010.     ddx_writeCoefValSets(0x0a,biquad_coef);  //channel 1 biquad3     
  1011.      biquad_coef.b2 = 0x640c0d;
  1012.     biquad_coef.b0 = 0x3cd666;
  1013.     biquad_coef.a2 = 0xa24727;
  1014.     biquad_coef.a1 = 0x6cbb1a;
  1015.     biquad_coef.b1 = 0x9344e6;
  1016.     ddx_writeCoefValSets(0x0f,biquad_coef);  //channel 1 biquad4     
  1017.      biquad_coef.b2 = 0x4274ad;
  1018.     biquad_coef.b0 = 0x37613b;
  1019.     biquad_coef.a2 = 0xcec8dd;
  1020.     biquad_coef.a1 = 0x4cbc8c;
  1021.     biquad_coef.b1 = 0xb34374;
  1022.     ddx_writeCoefValSets(0x14,biquad_coef);  //channel 1 biquad5
  1023.     //each channel uses channel 1 coefficient values.
  1024.      write_reg_bit(CONFIGREG_D,7,1); 
  1025.     break;
  1026. case PARTY:
  1027.     ddx_writeCoefVal(0xc8,0xe4a917);  //channel 1 
  1028.      biquad_coef.b2 = 0x7fc83b;
  1029.     biquad_coef.b0 = 0x400e7c;
  1030.     biquad_coef.a2 = 0x801acd;
  1031.     biquad_coef.a1 = 0x7ff297;
  1032.     biquad_coef.b1 = 0x800d69;
  1033.     ddx_writeCoefValSets(0x05,biquad_coef);  //channel 1 biquad2
  1034.      biquad_coef.b2 = 0x7f4db3;
  1035.     biquad_coef.b0 = 0x402e50;
  1036.     biquad_coef.a2 = 0x8055ad;
  1037.     biquad_coef.a1 = 0x7fd50c;
  1038.     biquad_coef.b1 = 0x802af4;
  1039.     ddx_writeCoefValSets(0x0a,biquad_coef);  //channel 1 biquad3     
  1040.      biquad_coef.b2 = 0x7908a0;
  1041.     biquad_coef.b0 = 0x412849;
  1042.     biquad_coef.a2 = 0x84a6cc;
  1043.     biquad_coef.a1 = 0x7d8082;
  1044.     biquad_coef.b1 = 0x827f7e;
  1045.     ddx_writeCoefValSets(0x0f,biquad_coef);  //channel 1 biquad4     
  1046.      biquad_coef.b2 = 0x2688b9;
  1047.     biquad_coef.b0 = 0x4edd22;
  1048.     biquad_coef.a2 = 0xbbbd01;
  1049.     biquad_coef.a1 = 0x4dda39;
  1050.     biquad_coef.b1 = 0xb225c7;
  1051.     ddx_writeCoefValSets(0x14,biquad_coef);  //channel 1 biquad5
  1052.     //each channel uses channel 1 coefficient values.
  1053.      write_reg_bit(CONFIGREG_D,7,1); 
  1054.     break;
  1055.     case DANCE:
  1056.     ddx_writeCoefVal(0xc8,0xddef46);  //channel 1 
  1057.      biquad_coef.b2 = 0x7fd0f2;
  1058.     biquad_coef.b0 = 0x400a20;
  1059.     biquad_coef.a2 = 0x801acd;
  1060.     biquad_coef.a1 = 0x7ff297;
  1061.     biquad_coef.b1 = 0x800d69;
  1062.     ddx_writeCoefValSets(0x05,biquad_coef);  //channel 1 biquad2
  1063.      biquad_coef.b2 = 0x7f2132;
  1064.     biquad_coef.b0 = 0x4039df;
  1065.     biquad_coef.a2 = 0x806b0f;
  1066.     biquad_coef.a1 = 0x7fca4b;
  1067.     biquad_coef.b1 = 0x8035b5;
  1068.     ddx_writeCoefValSets(0x0a,biquad_coef);  //channel 1 biquad3     
  1069.      biquad_coef.b2 = 0x7a469f;
  1070.     biquad_coef.b0 = 0x40cd3f;
  1071.     biquad_coef.a2 = 0x841ee2;
  1072.     biquad_coef.a1 = 0x7ddf4c;
  1073.     biquad_coef.b1 = 0x8220b4;
  1074.     ddx_writeCoefValSets(0x0f,biquad_coef);  //channel 1 biquad4     
  1075.      biquad_coef.b2 = 0x2ca6df;
  1076.     biquad_coef.b0 = 0x4dd8f0;
  1077.     biquad_coef.a2 = 0xb7a741;
  1078.     biquad_coef.a1 = 0x534a84;
  1079.     biquad_coef.b1 = 0xacb57c;
  1080.     ddx_writeCoefValSets(0x14,biquad_coef);  //channel 1 biquad5
  1081.     //each channel uses channel 1 coefficient values.
  1082.      write_reg_bit(CONFIGREG_D,7,1); 
  1083.     break;
  1084. case HARD:
  1085.     ddx_writeCoefVal(0xc8,0xdfd91e);  //channel 1 
  1086.      biquad_coef.b2 = 0x7fdeb7;
  1087.     biquad_coef.b0 = 0x400729;
  1088.     biquad_coef.a2 = 0x8012f5;
  1089.     biquad_coef.a1 = 0x7ff683;
  1090.     biquad_coef.b1 = 0x80097d;
  1091.     ddx_writeCoefValSets(0x05,biquad_coef);  //channel 1 biquad2
  1092.      biquad_coef.b2 = 0x7fbd74;
  1093.     biquad_coef.b0 = 0x400e52;
  1094.     biquad_coef.a2 = 0x8025e6;
  1095.     biquad_coef.a1 = 0x7fed02;
  1096.     biquad_coef.b1 = 0x8012fe;
  1097.     ddx_writeCoefValSets(0x0a,biquad_coef);  //channel 1 biquad3     
  1098.      biquad_coef.b2 = 0x007c0c;
  1099.     biquad_coef.b0 = 0x662860;
  1100.     biquad_coef.a2 = 0xb33334;
  1101.     biquad_coef.a1 = 0x58ae56;
  1102.     biquad_coef.b1 = 0xa751aa;
  1103.     ddx_writeCoefValSets(0x0f,biquad_coef);  //channel 1 biquad4     
  1104.      biquad_coef.b2 = 0x000000;
  1105.     biquad_coef.b0 = 0x3fffff;
  1106.     biquad_coef.a2 = 0x000000;
  1107.     biquad_coef.a1 = 0x000000;
  1108.     biquad_coef.b1 = 0x000000;
  1109.     ddx_writeCoefValSets(0x14,biquad_coef);  //channel 1 biquad5
  1110.     //each channel uses channel 1 coefficient values.
  1111.      write_reg_bit(CONFIGREG_D,7,1);      
  1112.     break;
  1113. case CLASSIC:
  1114.     ddx_writeCoefVal(0xc8,0xaf3cc5);  //channel 1 
  1115.      biquad_coef.b2 = 0x7f4977;
  1116.     biquad_coef.b0 = 0x400f9b;
  1117.     biquad_coef.a2 = 0x809753;
  1118.     biquad_coef.a1 = 0x7fb3a3;
  1119.     biquad_coef.b1 = 0x804c5d;
  1120.     ddx_writeCoefValSets(0x05,biquad_coef);  //channel 1 biquad2
  1121.      biquad_coef.b2 = 0x7b9d6f;
  1122.     biquad_coef.b0 = 0x40ba80;
  1123.     biquad_coef.a2 = 0x82ed90;
  1124.     biquad_coef.a1 = 0x7e77e0;
  1125.     biquad_coef.b1 = 0x818820;
  1126.     ddx_writeCoefValSets(0x0a,biquad_coef);  //channel 1 biquad3     
  1127.      biquad_coef.b2 = 0x4e4a5f;
  1128.     biquad_coef.b0 = 0x459fbc;
  1129.     biquad_coef.a2 = 0xa67628;
  1130.     biquad_coef.a1 = 0x5e3269;
  1131.     biquad_coef.b1 = 0xa1cd97;
  1132.     ddx_writeCoefValSets(0x0f,biquad_coef);  //channel 1 biquad4     
  1133.      biquad_coef.b2 = 0x000000;
  1134.     biquad_coef.b0 = 0x3fffff;
  1135.     biquad_coef.a2 = 0x000000;
  1136.     biquad_coef.a1 = 0x000000;
  1137.     biquad_coef.b1 = 0x000000;
  1138.     ddx_writeCoefValSets(0x14,biquad_coef);  //channel 1 biquad5
  1139.     //each channel uses channel 1 coefficient values.
  1140.      write_reg_bit(CONFIGREG_D,7,1); 
  1141.     break;
  1142. case SOFT:
  1143.     ddx_writeCoefVal(0xc8,0xd77b6);  //channel 1 
  1144.      biquad_coef.b2 = 0x7fdd5d;
  1145.     biquad_coef.b0 = 0x4003eb;
  1146.     biquad_coef.a2 = 0x801acd;
  1147.     biquad_coef.a1 = 0x7ff297;
  1148.     biquad_coef.b1 = 0x800d69;
  1149.     ddx_writeCoefValSets(0x05,biquad_coef);  //channel 1 biquad2
  1150.      biquad_coef.b2 = 0x7fa8c6;
  1151.     biquad_coef.b0 = 0x4009de;
  1152.     biquad_coef.a2 = 0x80437d;
  1153.     biquad_coef.a1 = 0x7fde2f;
  1154.     biquad_coef.b1 = 0x8021d1;
  1155.     ddx_writeCoefValSets(0x0a,biquad_coef);  //channel 1 biquad3     
  1156.      biquad_coef.b2 = 0x7d21e7;
  1157.     biquad_coef.b0 = 0x3f992d;
  1158.     biquad_coef.a2 = 0x83abbd;
  1159.     biquad_coef.a1 = 0x7e25ce;
  1160.     biquad_coef.b1 = 0x81da32;
  1161.     ddx_writeCoefValSets(0x0f,biquad_coef);  //channel 1 biquad4     
  1162.      biquad_coef.b2 = 0x157218;
  1163.     biquad_coef.b0 = 0x5bad59;
  1164.     biquad_coef.a2 = 0xb33334;
  1165.     biquad_coef.a1 = 0x58ae56;
  1166.     biquad_coef.b1 = 0xa751aa;
  1167.     ddx_writeCoefValSets(0x14,biquad_coef);  //channel 1 biquad5
  1168.     //each channel uses channel 1 coefficient values.
  1169.      write_reg_bit(CONFIGREG_D,7,1); 
  1170.     break;
  1171. default:
  1172.     }
  1173. //    ddx_enableEPAD();   //unEAPD
  1174.     ddx_masterMute(0);  //demute all channels
  1175. }
  1176. #endif
  1177. /******************************************
  1178. /Function: ddx_TunerOutput_VSS()
  1179. /description: Specific stereo to "virtual 5.1 effect" 
  1180. setting for tuner input mode 
  1181. /creator: xulf 
  1182. /date: 2003-12-24
  1183. *****************************************/
  1184. void ddx_TunerOutput_VSS(void)
  1185. {
  1186.     BYTE data;
  1187.     coef_factor bass_coef;
  1188.     
  1189.     ddx_disableEPAD();   //EAPD
  1190.     ddx_masterMute(1);  //mute all channels
  1191.     //disable bass management mode
  1192.     ddx_disable_BassManagement();
  1193.     //enable adjacent channel-mixing mode
  1194.     write_reg_bit(CONFIGREG_E,0,1);
  1195.     //SDI_12-->LT/RT; SDI_34-->0; SDI_56-->0; SDI_78-->0
  1196.     //7 5 4 2 1 6-->FL FR VirtualCE  VirtualSL VirtualSR VirtualSW
  1197. data = 0x01;
  1198. WriteToI2c(DDX8K_ADDR,C12MAP_REG,&data,1);
  1199. data = 0x01;
  1200. WriteToI2c(DDX8K_ADDR,C34MAP_REG,&data,1);
  1201. data = 0x01;
  1202. WriteToI2c(DDX8K_ADDR,C56MAP_REG,&data,1);
  1203. data = 0x00;
  1204. WriteToI2c(DDX8K_ADDR,C78MAP_REG,&data,1);
  1205.     
  1206.     //set pre-scale factor
  1207.     ddx_writeCoefVal(0xd0,0x000000);  //X-Full attenuation
  1208.     ddx_writeCoefVal(0xd1,0x7FFFFF);  //0dB
  1209.     ddx_writeCoefVal(0xd2,0x400000);  //-6dB
  1210.     ddx_writeCoefVal(0xd3,0x400000);
  1211.     ddx_writeCoefVal(0xd4,0x400000);
  1212.     ddx_writeCoefVal(0xd5,0x400000);
  1213.     ddx_writeCoefVal(0xd6,0x000000);
  1214.     
  1215.     //set channel 7,5,4,2,1 filter coefficient
  1216.     bass_coef.b2 = HPF_COEF_B2;
  1217.     bass_coef.b0 = HPF_COEF_B0;
  1218.     bass_coef.a2 = HPF_COEF_A2;
  1219.     bass_coef.a1 = HPF_COEF_A1;
  1220.     bass_coef.b1 = HPF_COEF_B1;
  1221.     ddx_writeCoefValSets(0x96,bass_coef);  //channel 7    xulf 2003-12-15
  1222.     ddx_writeCoefValSets(0x64,bass_coef);  //channel 5
  1223.     ddx_writeCoefValSets(0x4b,bass_coef);  //channel 4
  1224.     ddx_writeCoefValSets(0x19,bass_coef);  //channel 2
  1225.     ddx_writeCoefValSets(0x00,bass_coef);  //channel 1
  1226.     //set channel 6 filter coefficient
  1227.     bass_coef.b2 = LPF_COEF_B2;
  1228.     bass_coef.b0 = LPF_COEF_B0;
  1229.     bass_coef.a2 = LPF_COEF_A2;
  1230.     bass_coef.a1 = LPF_COEF_A1;
  1231.     bass_coef.b1 = LPF_COEF_B1;
  1232.     ddx_writeCoefValSets(0x7d,bass_coef);    
  1233.     ddx_enableEPAD();   //unEAPD
  1234.     ddx_masterMute(0);  //demute all channels
  1235.     
  1236. }