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

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