lowlevel.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 Auravision VxP524 Video processor chip
  39.  * Low level functions
  40.  *
  41.  */
  42. #include <linux/pci.h>
  43. #include <asm/io.h>
  44. #include <linux/types.h>
  45. #include <vxp524.h>
  46. /**
  47.  *
  48.  * Enable memory mapped access & IRQ for the VxP524
  49.  *
  50.  * @param instance instance to do this for
  51.  * 
  52.  */
  53. extern void vxp524_enable_mem(vxp524_t* instance)
  54. {
  55.   u16 word;
  56.   pci_read_config_word (instance->pci_dev, PCI_COMMAND, &word);
  57.   word |= PCI_COMMAND_MEMORY;
  58.   pci_write_config_word (instance->pci_dev, PCI_COMMAND, word);
  59.   pci_set_master (instance->pci_dev);
  60. }
  61. /**
  62.  *
  63.  * Disable memory mapped access & IRQ for the VxP524
  64.  *
  65.  * @param instance instance to do this for
  66.  * 
  67.  */
  68. extern void vxp524_disable_mem(vxp524_t* instance)
  69. {
  70.   u16 word;
  71.   
  72.   pci_read_config_word (instance->pci_dev, PCI_COMMAND, &word);
  73.   word &= ~(PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY);
  74.   pci_write_config_word(instance->pci_dev, PCI_COMMAND, word);
  75. }
  76. /**
  77.  *
  78.  * Get (8bit) register from the Vxp524
  79.  * This retrives the value: [reg] (LSB first)
  80.  *
  81.  * @param instance Instance of the VxP524 to use
  82.  * @param reg Register to retrieve
  83.  * @return The register's value (or negative on error)
  84.  *
  85.  */
  86. extern int vxp524_get_reg(vxp524_t* instance, int reg)
  87. {
  88.   return(readb(instance->base + (reg << 2)));
  89. }
  90. /**
  91.  *
  92.  * Set (8bit) register on the Vxp524
  93.  * This sets the value: [reg] (LSB first)
  94.  *
  95.  * @param instance Instance of the VxP524 to use
  96.  * @param reg Register to retrieve
  97.  * @param val 8 bit value to set
  98.  *
  99.  */
  100. extern void vxp524_set_reg(vxp524_t* instance, int reg, int val)
  101. {
  102.   writeb(val, instance->base + (reg << 2));
  103. }
  104. /**
  105.  *
  106.  * Get (16bit) register from the Vxp524
  107.  * This retrives the value: [reg] | ([reg+1] <<8) (LSB first)
  108.  *
  109.  * @param instance Instance of the VxP524 to use
  110.  * @param reg Register to retrieve
  111.  * @return The register's value (or negative on error)
  112.  *
  113.  */
  114. extern int vxp524_get_reg16(vxp524_t* instance, int reg)
  115. {
  116.   register u32 value;
  117.   value  =  readb(instance->base + (reg << 2)); reg++;
  118.   value |= (readb(instance->base + (reg << 2)) << 8);
  119.   return(value);
  120. }
  121. /**
  122.  *
  123.  * Set (16bit) register on the Vxp524
  124.  * This sets the value: [reg], [reg+1] (LSB first)
  125.  *
  126.  * @param instance Instance of the VxP524 to use
  127.  * @param reg Register to retrieve
  128.  * @param val 8 bit value to set
  129.  *
  130.  */
  131. extern void vxp524_set_reg16(vxp524_t* instance, int reg, int val)
  132. {
  133.   writeb(val, (u32) instance->base + (reg << 2)); val >>=8; reg++;
  134.   writeb(val, (u32) instance->base + (reg << 2));
  135. }
  136. /**
  137.  *
  138.  * Get (24bit) register from the Vxp524
  139.  * This retrives the value: [reg] | ([reg+1] <<8) | ([reg+2]<<16) (LSB first)
  140.  *
  141.  * @param instance Instance of the VxP524 to use
  142.  * @param reg Register to retrieve
  143.  * @return The register's value (or negative on error)
  144.  *
  145.  */
  146. extern int vxp524_get_reg24(vxp524_t* instance, int reg)
  147. {
  148.   register u32 value;
  149.   value  =  readb((u32) instance->base + (reg << 2));       reg++;
  150.   value |= (readb((u32) instance->base + (reg << 2)) << 8); reg++;
  151.   value |= (readb((u32) instance->base + (reg << 2)) << 16);
  152.   
  153.   return(value);
  154. }
  155. /**
  156.  *
  157.  * Set (24bit) register on the Vxp524
  158.  * This sets the value: [reg], [reg+1], [reg+2] (LSB first)
  159.  *
  160.  * @param instance Instance of the VxP524 to use
  161.  * @param reg Register to retrieve
  162.  * @param val 8 bit value to set
  163.  *
  164.  */
  165. extern void vxp524_set_reg24(vxp524_t* instance, int reg, int val)
  166. {
  167.   writeb(val, (u32) instance->base + (reg << 2)); val >>=8; reg++;
  168.   writeb(val, (u32) instance->base + (reg << 2)); val >>=8; reg++;
  169.   writeb(val, (u32) instance->base + (reg << 2));
  170. }
  171. /**
  172.  *
  173.  * Get (32bit) register from the Vxp524
  174.  * This retrives the value: [reg] | ([reg+1] <<8) | ([reg+2]<<16) | ([reg+3]<<24) (LSB first)
  175.  *
  176.  * @param instance Instance of the VxP524 to use
  177.  * @param reg Register to retrieve
  178.  * @return The register's value (or negative on error)
  179.  *
  180.  */
  181. extern int vxp524_get_reg32(vxp524_t* instance, int reg)
  182. {
  183.   register u32 value;
  184.   value  =  readb((u32) instance->base + (reg << 2));        reg++;
  185.   value |= (readb((u32) instance->base + (reg << 2)) << 8);  reg++;
  186.   value |= (readb((u32) instance->base + (reg << 2)) << 16); reg++;
  187.   value |= (readb((u32) instance->base + (reg << 2)) << 24);
  188.   
  189.   return(value);
  190. }
  191. /**
  192.  *
  193.  * Set (32bit) register on the Vxp524
  194.  * This sets the value: [reg], [reg+1], [reg+2], [reg+3] (LSB first)
  195.  *
  196.  * @param instance Instance of the VxP524 to use
  197.  * @param reg Register to retrieve
  198.  * @param val 8 bit value to set
  199.  *
  200.  */
  201. extern void vxp524_set_reg32(vxp524_t* instance, int reg, int val)
  202. {
  203.   writeb(val, (u32) instance->base + (reg << 2)); val >>=8; reg++;
  204.   writeb(val, (u32) instance->base + (reg << 2)); val >>=8; reg++;
  205.   writeb(val, (u32) instance->base + (reg << 2)); val >>=8; reg++;
  206.   writeb(val, (u32) instance->base + (reg << 2));
  207. }
  208. /**
  209.  *
  210.  * Get specified bitmask of an (8bit) register from vxp524
  211.  *
  212.  * @param instance Instance of the vxp524 to use
  213.  * @param reg Register to retrieve
  214.  * @param bitmask Bitmask of bits to retrive from that register
  215.  *
  216.  * @return The register bitvalues
  217.  *
  218.  */
  219. extern int vxp524_get_bits(vxp524_t* instance, int reg, int bitmask)
  220. {
  221.   return (vxp524_get_reg (instance, reg) & bitmask);
  222. }
  223. /**
  224.  *
  225.  * Set specified bits of an (8bit) register on vxp524
  226.  *
  227.  * @param instance Instance of the vxp524 to use
  228.  * @param reg Register to retrieve
  229.  * @param bitmask Bitmask of bits to set from that register
  230.  * @param valuemask Values of the bits in the bitmask
  231.  *
  232.  */
  233. extern void vxp524_set_bits(vxp524_t* instance, int reg, int bitmask, int valuemask)
  234. {
  235.   // get the current register value
  236.   int value = vxp524_get_reg(instance, reg);
  237.   
  238.   // set it on the hardware
  239.   vxp524_set_reg(instance, reg, (value & (~bitmask)) | valuemask);
  240. }