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

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 Auravision VxP524 video processor
  39.  * Low level vxp524 generic i2s operations
  40.  *
  41.  */
  42. #include <linux/errno.h>
  43. #include <vxp524.h>
  44. /**
  45.  *
  46.  * Initialise the i2s bus
  47.  *
  48.  * @param instance VxP524 instance to use
  49.  */
  50. extern void vxp524_i2s_init(vxp524_t* instance) {
  51.   
  52.   vxp524_set_reg(instance, VXP524_I2C, 0x05);
  53. }
  54. /**
  55.  * 
  56.  * Close the i2s bus after use
  57.  *
  58.  * @param instance VxP524 instance to use
  59.  *
  60.  */
  61. extern void vxp524_i2s_close(vxp524_t* instance) {
  62.   
  63.   vxp524_set_reg(instance, VXP524_I2C, 0x0F);
  64. }
  65. /**
  66.  *
  67.  * Set the DATA line on the i2s bus
  68.  *
  69.  * @param instance VxP524 instance to use
  70.  *
  71.  */
  72. extern void vxp524_i2s_set_sda(vxp524_t* instance) {
  73.   
  74.   vxp524_set_bits(instance, VXP524_I2C, 0x4, 0x4);
  75. }
  76. /**
  77.  *
  78.  * Clear the DATA line on the i2s bus
  79.  *
  80.  * @param instance VxP524 instance to use
  81.  *
  82.  */
  83. extern void vxp524_i2s_clear_sda(vxp524_t* instance) {
  84.   
  85.   vxp524_set_bits(instance, VXP524_I2C, 0x4, 0);
  86. }
  87. /**
  88.  *
  89.  * Tristate the DATA line on the i2s bus
  90.  *
  91.  * @param instance VxP524 instance to use
  92.  *
  93.  */
  94. extern void vxp524_i2s_tri_sda(vxp524_t* instance) {
  95.   
  96.   vxp524_set_bits(instance, VXP524_I2C, 0x8, 0x8);
  97. }
  98. /**
  99.  *
  100.  * Un-Tristate the DATA line on the i2s bus
  101.  *
  102.  * @param instance VxP524 instance to use
  103.  *
  104.  */
  105. extern void vxp524_i2s_untri_sda(vxp524_t* instance) {
  106.   
  107.   vxp524_set_bits(instance, VXP524_I2C, 0x8, 0);
  108. }
  109. /**
  110.  *
  111.  * Get the current value of the DATA line on the i2s bus
  112.  *
  113.  * @param instance the VxP524 instance to use
  114.  *
  115.  */
  116. extern int vxp524_i2s_get_sda(vxp524_t* instance) {
  117.   
  118.   // was the bit set?
  119.   if (vxp524_get_bits(instance, VXP524_I2C, 0x20)) {
  120.     
  121.     return(1);
  122.   }
  123.   
  124.   // wasn't set
  125.   return(0);
  126. }
  127. /**
  128.  *
  129.  * Set the CLOCK line on the i2s bus
  130.  *
  131.  * @param instance VxP524 instance to use
  132.  *
  133.  */
  134. extern void vxp524_i2s_set_scl(vxp524_t* instance) {
  135.   
  136.   vxp524_set_bits(instance, VXP524_I2C, 0x1, 0x1);
  137. }
  138. /**
  139.  *
  140.  * Clear the clock line on the i2s bus
  141.  *
  142.  * @param instance the VxP524 instance to use
  143.  *
  144.  */
  145. extern void vxp524_i2s_clear_scl(vxp524_t* instance) {
  146.   
  147.   vxp524_set_bits(instance, VXP524_I2C, 0x1, 0);
  148.   // always read it once after doing this (dunno why)
  149.   vxp524_get_reg(instance, VXP524_I2C);
  150. }
  151. /**
  152.  *
  153.  * Reads the DATA line until it becomes set. Max. count reads
  154.  *
  155.  * @param instance the VxP524 instance to use
  156.  * @param count Maximum number of reads
  157.  *
  158.  * @return 0 on success, -ETIMEDOUT if the DATA line never became set
  159.  *
  160.  */
  161. extern int vxp524_i2s_wait_till_sda_set(vxp524_t* instance, int count) {
  162.   int counter = 0;
  163.   int value;
  164.   
  165.   // try 1000 times
  166.   while(counter++ < count) {
  167.     
  168.     // was it set?
  169.     if (vxp524_get_bits(instance, VXP524_I2C, 0x20)) {
  170.       
  171.       break;
  172.     }
  173.   }
  174.   // dunno why it does this
  175.   vxp524_get_reg(instance, VXP524_I2C);
  176.   vxp524_get_reg(instance, VXP524_I2C);
  177.   vxp524_get_reg(instance, VXP524_I2C);
  178.   vxp524_get_reg(instance, VXP524_I2C);
  179.   // what happened...
  180.   if (counter == 0) {
  181.     
  182.     return(-ETIMEDOUT);
  183.   }
  184.   
  185.   // OK! we got it!
  186.   return(0);
  187. }
  188.   
  189. /**
  190.  *
  191.  * Reads the CLOCK line until it becomes set. Max. count reads
  192.  *
  193.  * @param instance the VxP524 instance to use
  194.  * @param count Maximum number of reads
  195.  *
  196.  * @return 0 on success, -ETIMEDOUT if the CLOCK line never became set
  197.  *
  198.  */
  199. extern int vxp524_i2s_wait_till_scl_set(vxp524_t* instance, int count) {
  200.   int counter = 0;
  201.   int value;
  202.   
  203.   // try 1000 times
  204.   while(counter++ < count) {
  205.     
  206.     // was it set?
  207.     if (vxp524_get_bits(instance, VXP524_I2C, 0x10)) {
  208.       
  209.       break;
  210.     }
  211.   }
  212.   // dunno why it does this
  213.   vxp524_get_reg(instance, VXP524_I2C);
  214.   vxp524_get_reg(instance, VXP524_I2C);
  215.   // what happened...
  216.   if (counter == 0) {
  217.     
  218.     return(-ETIMEDOUT);
  219.   }
  220.   
  221.   // OK! we got it!
  222.   return(0);
  223. }