aic23.c
上传用户:dahaojd
上传日期:2008-01-29
资源大小:14357k
文件大小:4k
源码类别:

DSP编程

开发平台:

C/C++

  1. /*
  2.  *  Copyright 2003 by Texas Instruments Incorporated.
  3.  *  All rights reserved. Property of Texas Instruments Incorporated.
  4.  *  Restricted rights to use, duplicate or disclose this code are
  5.  *  granted through contract.
  6.  *  
  7.  */
  8. /* "@(#) DDK 1.11.00.00 11-04-03 (ddk-b13)" */
  9. /* 
  10.  *  ======== aic23.c ======== 
  11.  *
  12.  *  AIC23 codec driver implementation specific to the 
  13.  *  Spectrum Digital DM642 EVM board.
  14.  */
  15. #include <std.h>
  16. #include <csl.h>
  17. #include <csl_i2c.h>
  18. #include <aic23.h>      
  19. #include <evmdm642_edma_aic23.h>
  20. extern I2C_Handle EVMDM642_I2C_hI2C;
  21. static void aic23Rset(Uint16 regnum, Uint16 regval);
  22.                                                                    
  23. static AIC23_Params codecstate = AIC23_DEFAULTPARAMS_EVMDM642;
  24. static I2C_Config aic23XmtCfg = {
  25.     0x0000007f, /* I2COAR -    Not used if master */
  26.     0x00000000, /* I2CIER -    Disable interrupts, use polling */
  27.     0x0000001b, /* I2CCLKL -   Low period for 100KHz operation */
  28.     0x0000001b, /* I2CCLKH -   High period for 100KHz operation */
  29.     0x00000002, /* I2CCNT -    Data words per transmission */
  30.     0x0000001a, /* I2CSAR -    Slave address */
  31.     0x00004ea0, /* I2CMDR -    Mode */
  32.     0x00000019  /* I2CPSC -    Prescale 300MHz to 12MHz */
  33. };
  34. /*
  35.  *  ======== AIC23_setParams ========
  36.  *
  37.  *  This function takes a pointer to the object of type AIC23_Params,
  38.  *  and writes all 11 control words found in it to the codec. Prior
  39.  *  to that it initializes the codec if this is the first time the
  40.  *  function is ever called.  Return TRUE for successful completion,
  41.  *  FALSE if errors.
  42.  */
  43. Int AIC23_setParams(AIC23_Params *paramsp)
  44. {
  45.     Int i;
  46.     AIC23_Params *params = paramsp;
  47.    
  48.     /*  set to AIC23_DEFAULTPARAMS_EVMDM642 if NULL */
  49.     if (params == NULL) {
  50.         params = &codecstate;
  51.     }
  52.     
  53.     /* Reset the AIC23 */
  54.     aic23Rset(AIC23_RESET, 0);
  55.     
  56.     /* Assign each register */
  57.     for (i = 0; i < AIC23_NUMREGS; i++) {
  58.         aic23Rset(i, params->regs[i]);
  59.     }
  60.     
  61.     return TRUE;
  62. }
  63. /*
  64.  *  ======== aic23Rset ========
  65.  *  Set codec register regnum to value regval.  The 16-bit word is composed
  66.  *  of register address in the upper 7 bits and the 9-bit register value
  67.  *  stored in the parameters structure.
  68.  */
  69. static Void aic23Rset(Uint16 regnum, Uint16 regval)
  70. {
  71.     Uint16 data;
  72.     I2C_Config prevI2CCfg;
  73.     
  74.     /* Mask off lower 9 bits */
  75.     regval &= 0x1ff;
  76.     
  77.     /* Set transmit data */
  78.     data = (regnum << 9) | regval;
  79.     
  80.     /* Wait until bus is free */
  81.     while (I2C_bb(EVMDM642_I2C_hI2C));
  82.     
  83.     /* Save old settings */
  84.     I2C_getConfig(EVMDM642_I2C_hI2C, &prevI2CCfg);
  85.     
  86.     /* Restore settings for AIC23 */
  87.     I2C_config(EVMDM642_I2C_hI2C, &aic23XmtCfg);
  88.     /* Submit the MSB for transmit */
  89.     I2C_writeByte(EVMDM642_I2C_hI2C, (data >> 8) & 0xff);
  90.     
  91.     /* Generate start condition, starts transmission */
  92.     I2C_start(EVMDM642_I2C_hI2C);
  93.     
  94.     /* Wait until MSB transmit is done */
  95.     while(!I2C_xrdy(EVMDM642_I2C_hI2C));
  96.     /* Submit the LSB for transmit */ 
  97.     I2C_writeByte(EVMDM642_I2C_hI2C, data & 0xff);
  98.         
  99.     /* Generate stop condition */
  100.     I2C_sendStop(EVMDM642_I2C_hI2C);  
  101.     /* Wait until bus is free */
  102.     while (I2C_bb(EVMDM642_I2C_hI2C));
  103.     
  104.     /* Save register value if regnum is in range */
  105.     if (regnum < AIC23_NUMREGS)
  106.         codecstate.regs[regnum] = regval;
  107.     /* Short delay for AIC23 to accept command */        
  108.     EVMDM642_waitusec(20);
  109.     /* Reconfigure I2C with old settings */
  110.     I2C_config(EVMDM642_I2C_hI2C, &prevI2CCfg);  
  111. }