bm.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.  * vxp524 Bus mastering routines
  40.  *
  41.  */
  42. #include <asm/atomic.h>
  43. #include <linux/errno.h>
  44. #include <vxp524.h>
  45. /**
  46.  *
  47.  * Start bus master TX to VXP524
  48.  *
  49.  * @param instance VXP524 instance to use
  50.  * @param buffer Buffer start address (this is the BUS ADDRESS of it BTW)
  51.  * @param count Number of bytes to TX
  52.  * @param irqEndFlag 1=> cause IRQ on tx end, 0=>no IRQ on tx end
  53.  *
  54.  */
  55. extern void vxp524_bm_send_data(vxp524_t* instance, 
  56.       unsigned long buffer, unsigned long count,
  57.       int irqEndFlag)
  58. {
  59.   // set address
  60.   vxp524_set_reg32(instance, VXP524_PCI_DMA_ADDR0, buffer);
  61.   // set count
  62.   vxp524_set_reg24(instance, VXP524_PCI_DMA_CNT0, count);
  63.   // set PCI burst size to 32 dwords
  64.   vxp524_set_reg(instance, VXP524_PCI_BURST_SIZE, 0xff);
  65.   // setup FIFO thresholds 
  66.   vxp524_set_reg(instance, VXP524_PCI_FIFO_THRESH, 0xf);
  67.   // all IRQs off
  68.   vxp524_set_reg(instance, VXP524_INTR_STATUS, 0);
  69.   // setup interrupt on TX end status
  70.   if (irqEndFlag) {
  71.     // IRQ on TX end
  72.     vxp524_set_reg(instance, VXP524_INTR_CTRL, 0x10);
  73.   }
  74.   else {
  75.     // no IRQs
  76.     vxp524_set_reg(instance, VXP524_INTR_CTRL, 0);
  77.   }
  78.     
  79.   // start TX!
  80.   vxp524_set_reg(instance, VXP524_INPUT_CFG, 0x12);
  81.   // OK! BM is now in use
  82.   instance->bmInUse =1;
  83. }
  84. /**
  85.  *
  86.  * Flush the vxp BM system
  87.  *
  88.  * @param instance Vxp524 instance to use
  89.  *
  90.  */
  91. extern void vxp524_bm_flush(vxp524_t* instance)
  92. {
  93.   // enable demux
  94.   vxp524_set_bits(instance, VXP524_INPUT_CFG, 2, 2);
  95.   
  96.   // all IRQs off
  97.   vxp524_set_reg(instance, VXP524_INTR_STATUS, 0);
  98.   // Master FIFO flush On
  99.   vxp524_set_bits(instance, VXP524_PCI_GLOBAL_REGS, 0x10, 0x10);
  100.   // Master FIFO flush Off
  101.   vxp524_set_bits(instance, VXP524_PCI_GLOBAL_REGS, 0x10, 0);
  102.   // BM no longer in use
  103.   instance->bmInUse = 0;
  104. }
  105. /**
  106.  *
  107.  * Reset the Vxp524 BM system
  108.  *
  109.  * @param instance Vxp524 instance to use
  110.  *
  111.  */
  112. extern void vxp524_bm_reset(vxp524_t* instance)
  113. {
  114.   // disable PCI master cycle
  115.   vxp524_set_bits(instance, VXP524_INPUT_CFG, 0x10, 0);  
  116.   // flush BM stuff
  117.   vxp524_bm_flush(instance);
  118.   
  119.   // all interrupts off
  120.   vxp524_set_reg(instance, VXP524_INTR_STATUS, 0); 
  121. /**
  122.  *
  123.  * Check whether the BM operation has completed yet?
  124.  *
  125.  * @param instance Vxp524 instance to use
  126.  * @param checkType 0 => see if the PCI master cycle has finished yet...
  127.  *                  1 => see if the IRQ has occurred yet, and clear it if so
  128.  *
  129.  * @return 1 if the operation HAS completed, 0 if not
  130.  *
  131.  */
  132. extern int vxp524_bm_completed(vxp524_t* instance, int checkType)
  133. {
  134.   switch(checkType) {
  135.   case 0:
  136.     
  137.     // if the PCI master cycle is no longer ENABLED, then the TX HAS finished
  138.     if (!(vxp524_get_reg(instance, VXP524_INPUT_CFG) & 0x10)) {
  139.       
  140.       return(1);
  141.     }
  142.     
  143.     // otherwise, return 0
  144.     return(0);
  145.     
  146.   case 1:
  147.     
  148.     // if IRQ on PCI burst end is not enabled... return(0)
  149.     if (!(vxp524_get_reg(instance, VXP524_INTR_CTRL) & 0x10)) {
  150.       return(0);
  151.     }
  152.     
  153.     // if IRQ on burst end status != 1, return(0)
  154.     if (!(vxp524_get_reg(instance, VXP524_INTR_STATUS) & 0x10)) {
  155.       
  156.       return(0);
  157.     }
  158.     
  159.     // clear bus master IRQ status
  160.     vxp524_set_bits(instance, VXP524_INTR_STATUS, 0x10, 0);
  161.     // OK! DMA HAD finished!
  162.     return(1);
  163.     
  164.   default:
  165.     
  166.     return(0);
  167.   }
  168. }
  169. /**
  170.  *
  171.  * Checks if BM in use, and sets BM in use flag if it wasn't
  172.  *
  173.  * @param instance vxp524 instance to use
  174.  *
  175.  * @return 0 on success, -EBUSY if BM is already in use
  176.  *
  177.  */
  178. extern int vxp524_bm_check_status(vxp524_t* instance)
  179. {
  180.   unsigned long flags;
  181.   int status = -EBUSY;
  182.   
  183.   // if BM isn't in use, mark it as such & set status to successful
  184.   if (!instance->bmInUse) {
  185.     
  186.     instance->bmInUse = 1;
  187.     status = 0;
  188.   }
  189.   // return status
  190.   return(status);
  191. }
  192. /**
  193.  *
  194.  * Mark BM as no longer in use
  195.  *
  196.  */
  197. extern int vxp524_bm_not_in_use(vxp524_t* instance)
  198. {
  199.   instance->bmInUse = 0;
  200.   
  201.   // OK
  202.   return(0);
  203. }