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

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 EVM5509 board.
  14.  */
  15. #include <std.h>
  16. #include <csl.h>
  17. #include <csl_i2c.h>
  18. #include <aic23.h>      
  19. /* The I2C slave address of the AIC23 */
  20. #define AIC23_I2CADDR        0x1A
  21. /* a flag indicating whether the codec has been initialized */
  22. static Bool codecInitialized = FALSE;
  23. /* function for writing a control word to the AIC23 thru I2C */
  24. static Void i2cWriteCtrl( Uns regaddr, Uns data );
  25. /*
  26.  *  ======== AIC23_init ========
  27.  *
  28.  *  Initializes codec module variables, if any. (There are none.)
  29.  */
  30. #pragma CODE_SECTION(AIC23_init, ".text:init")
  31. Void AIC23_init()
  32. {
  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.
  41.  *  The 16-bit word is composed of register address in the upper 7 bits
  42.  *  and the 9-bit register value stored in the parameters structure.
  43.  */
  44. Int AIC23_setParams( AIC23_Params *params )
  45. {
  46.     Uns i;
  47.     /* 
  48.      * I2C structure which will be used to send the data */
  49.     I2C_Init i2cInit = {
  50.         0,      /* 7 bit address mode */
  51.         0x007F,         /* own address - dont care if master */
  52.         120,            /* clkout value (Mhz) */
  53.         400,            /* a number between 10 and 400 */
  54.         0,              /* num of bits/bytes to be received/transmitted (8) */
  55.         0,              /* DLB mode off */
  56.         0               /* FREE mode of operation off */
  57.     };
  58.     if (codecInitialized == FALSE) {
  59.         codecInitialized = TRUE;
  60.         
  61.         /* setup config for I2C */
  62.         I2C_init(&i2cInit);
  63.         i2cWriteCtrl(15, 0);
  64.     }
  65.     
  66.     for (i = 0; i < AIC23_NUMREGS; i++) {        
  67.         i2cWriteCtrl(i, (params->regs[i] & 0x1ff));
  68.     }
  69.     return TRUE;
  70. }
  71. /*
  72.  *  ======== i2cWriteCtrl ========
  73.  *
  74.  *  This function writes a control word to AIC23 reg thru I2C port 
  75.  */
  76. static Void i2cWriteCtrl(Uns regaddr, Uns data)
  77. {
  78.     Uint16 buf[2];
  79.     buf[0] = (Uint16)((regaddr<<1)+(data>>8));
  80.     buf[1] = (Uint16)(data & 0x00FF);
  81.     I2C_write(buf, 2, 1, AIC23_I2CADDR, 1, 100);
  82. }
  83.