highlevel.c
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:7k
源码类别:

DVD

开发平台:

Unix_Linux

  1. /*
  2.   **********************************************************************
  3.   *
  4.   *     Copyright 1999, 2000 Creative Labs, Inc.
  5.   *
  6.   **********************************************************************
  7.   *
  8.   *     Date                 Author               Summary of changes
  9.   *     ----                 ------               ------------------
  10.   *     October 20, 1999     Andrew de Quincey    Rewrote and extended
  11.   *                          Lucien Murray-Pitts  original incomplete 
  12.   *                                               driver.
  13.   *
  14.   *     April 18, 1999       Andrew Veliath       Original Driver
  15.   *                                               implementation
  16.   *
  17.   **********************************************************************
  18.   *
  19.   *     This program is free software; you can redistribute it and/or
  20.   *     modify it under the terms of the GNU General Public License as
  21.   *     published by the Free Software Foundation; either version 2 of
  22.   *     the License, or (at your option) any later version.
  23.   *
  24.   *     This program is distributed in the hope that it will be useful,
  25.   *     but WITHOUT ANY WARRANTY; without even the implied warranty of
  26.   *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  27.   *     GNU General Public License for more details.
  28.   *
  29.   *     You should have received a copy of the GNU General Public
  30.   *     License along with this program; if not, write to the Free
  31.   *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
  32.   *     USA.
  33.   *
  34.   **********************************************************************
  35.   */
  36. /**
  37.  *
  38.  * Driver for the Burr-Brown PCM1723 DAC
  39.  * High level functions.
  40.  *
  41.  */
  42. #include <linux/errno.h>
  43. #include <linux/types.h>
  44. #include <pcm1723.h>
  45. /**
  46.  *
  47.  * Initialises the DAC. 
  48.  *
  49.  * @param instance Instance of the PCM1723 to use
  50.  *
  51.  * @return nonzero on failure
  52.  *
  53.  */
  54. extern int pcm1723_init(pcm1723_t* instance)
  55. {
  56.   // set left & right attenuation to 0dB
  57.   pcm1723_set_reg(instance, PCM1723_REG0, 0xff);
  58.   pcm1723_set_reg(instance, PCM1723_REG1, 0xff);
  59.   pcm1723_set_reg(instance, PCM1723_REG0, 0x1ff);
  60.   pcm1723_set_reg(instance, PCM1723_REG1, 0x1ff);
  61.   // Mute off, Deemphasis off, operational control=0, input resolution=16bits,
  62.   // normal stereo mode enabled.
  63.   pcm1723_set_reg(instance, PCM1723_REG2, 0x120);
  64.   
  65.   // i2c mode, l&r channel data polarity reversed, attenuation applied
  66.   // to each channel seperately, system clock=256fs, sample rate=normal,
  67.   // sampling frequency=32kHz group, infinite zero detect off
  68.   pcm1723_set_reg(instance, PCM1723_REG3, 0x4B);
  69.   
  70.   // OK
  71.   return(0);
  72. }
  73. /**
  74.  *
  75.  * Sets the DAC Sample frequency.
  76.  *
  77.  * @param instance Instance of the PCM1723 to use
  78.  * @param freqMode. One of the PCM1723_FREQXX defines
  79.  *
  80.  * @return nonzero on failure
  81.  *
  82.  */
  83. int pcm1723_set_sample_frequency(pcm1723_t* instance, int freqMode)
  84. {
  85.   u32 tmp;
  86.   // get the current DAC register 3
  87.   if ((tmp = pcm1723_get_reg(instance, PCM1723_REG3)) < 0) {
  88.     
  89.     return(-EINVAL);
  90.   }
  91.   // set the sampling frequency = 44.1, multiplier =1
  92.   tmp &= 0xFFFFFF0F;
  93.   // set the frequency mode
  94.   switch(freqMode) {
  95.   case PCM1723_FREQ441:
  96.     break;
  97.   case PCM1723_FREQ48:
  98.     tmp |= 0x40;
  99.     break;
  100.   case PCM1723_FREQ96:
  101.     tmp |= 0x50;
  102.     break;
  103.     
  104.   case PCM1723_FREQ2205:
  105.     tmp |= 0x20;
  106.     break;
  107.     
  108.   case PCM1723_FREQ32:
  109.     tmp |= 0x80;
  110.     break;
  111.     
  112.   default:
  113.     return(-EINVAL);
  114.   }
  115.   // set the value
  116.   return(pcm1723_set_reg(instance, PCM1723_REG3, tmp));
  117. }
  118. /**
  119.  *
  120.  * Sets the DAC input width
  121.  *
  122.  * @param instance Instance of the PCM1723 to use
  123.  * @param freqMode. One of the PCM1723_WIDTHXX defines
  124.  *
  125.  * @return nonzero on failure
  126.  *
  127.  */
  128. extern int pcm1723_set_input_width(pcm1723_t* instance, int width)
  129. {
  130.   u32 tmp;
  131.   // get the current DAC register 2
  132.   if ((tmp = pcm1723_get_reg(instance, PCM1723_REG2)) < 0) {
  133.     
  134.     return(-EINVAL);
  135.   }
  136.   // set input width = 16 bits
  137.   tmp &= 0xFFFFFFE7;
  138.   // set the input width
  139.   switch(width) {
  140.   case PCM1723_WIDTH16:
  141.     break;
  142.   case PCM1723_WIDTH20:
  143.     tmp |= 8;
  144.     break;
  145.   case PCM1723_WIDTH24:
  146.     tmp |=0x10;
  147.     break;
  148.     
  149.   default:
  150.     return(-EINVAL);
  151.   }
  152.   // set the value
  153.   return(pcm1723_set_reg(instance, PCM1723_REG2, tmp));
  154. }
  155. /**
  156.  *
  157.  * Sets/unsets the mute on the DAC
  158.  *
  159.  * @param instance Instance of the PCM1723 to use
  160.  * @param muteMode. One of the PCM1723_MUTEON or PCM1723_MUTEOFF defines
  161.  *
  162.  * @return nonzero on failure
  163.  *
  164.  */
  165. extern int pcm1723_set_mute_mode(pcm1723_t* instance, int muteMode)
  166. {
  167.   u32 tmp;
  168.   // get the current DAC register 2
  169.   if ((tmp = pcm1723_get_reg(instance, PCM1723_REG2)) < 0) {
  170.     
  171.     return(-EINVAL);
  172.   }
  173.   // mute off
  174.   tmp &= 0xFFFFFFFE;
  175.   if (muteMode == PCM1723_MUTEON) {
  176.     
  177.     tmp |=1;
  178.   }
  179.   // set the value
  180.   return(pcm1723_set_reg(instance, PCM1723_REG2, tmp));
  181. }
  182. /**
  183.  *
  184.  * Sets stereo mode
  185.  *
  186.  * @param instance Instance of the PCM1723 to use
  187.  * @param muteMode. One of the PCM1723_STEREOXX defines
  188.  *
  189.  * @return nonzero on failure
  190.  *
  191.  */
  192. extern int pcm1723_set_stereo_mode(pcm1723_t* instance, int stereoMode)
  193. {
  194.   u32 tmp;
  195.   // get the current DAC register 2
  196.   if ((tmp = pcm1723_get_reg(instance, PCM1723_REG2)) < 0) {
  197.     
  198.     return(-EINVAL);
  199.   }
  200.   // wipe stereo mode bits
  201.   tmp &= 0xFFFFFE1F;
  202.   // set stereo mode
  203.   switch(stereoMode) {
  204.   case PCM1723_STEREONORMAL:
  205.     
  206.     tmp |= 0x120;
  207.     break;
  208.   case PCM1723_STEREOMONOL:
  209.     
  210.     tmp |= 0x140;
  211.     break;
  212.     
  213.   case PCM1723_STEREOMONOR:
  214.     tmp |= 0xA0;
  215.     break;
  216.   case PCM1723_STEREOREVERSE:
  217.     tmp |= 0xC0;
  218.     break;
  219.     
  220.   default:
  221.     
  222.     return(-EINVAL);
  223.   }
  224.   // set the value
  225.   return(pcm1723_set_reg(instance, PCM1723_REG2, tmp));
  226. }
  227. /**
  228.  *
  229.  * Sets clock frequency
  230.  *
  231.  * @param instance Instance of the PCM1723 to use
  232.  * @param clockFrequency. One of the PCM1723_CLKFREQXX defines
  233.  *
  234.  * @return nonzero on failure
  235.  *
  236.  */
  237. extern int pcm1723_set_clock_frequency(pcm1723_t* instance, int clockFrequency)
  238. {
  239.   u32 tmp;
  240.   // get the current DAC register 2
  241.   if ((tmp = pcm1723_get_reg(instance, PCM1723_REG3)) < 0) {
  242.     
  243.     return(-EINVAL);
  244.   }
  245.   // clock mode = 384fs
  246.   tmp &= 0xFFFFFFF7;
  247.   // clock mode = 256fs 
  248.   if (clockFrequency == PCM1723_CLKFREQ256) {
  249.     
  250.     tmp |= 8;
  251.   }
  252.   // set the value
  253.   return(pcm1723_set_reg(instance, PCM1723_REG3, tmp));
  254. }