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

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