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

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.  * Overall driver for the Creative DXR2 card
  39.  * Low level zivaDS functions
  40.  *
  41.  */
  42. #include <zivaDS.h>
  43. #include <dxr2.h>
  44. #include <asm/io.h>
  45. #include <asm/uaccess.h>
  46. static int dxr2_zivaDS_get_reg (zivaDS_t* instance, int reg);
  47. static int dxr2_zivaDS_set_reg (zivaDS_t* instance, int reg, int val);
  48. static int dxr2_zivaDS_get_mem (zivaDS_t* instance, int addr);
  49. static int dxr2_zivaDS_set_mem (zivaDS_t* instance, int reg, int val);
  50. static int dxr2_zivaDS_enable_int (zivaDS_t* instance, int flag);
  51. static int dxr2_zivaDS_set_bits(zivaDS_t* instance, int reg, int bitmask, int valuemask);
  52. zivaDS_ops_t zivaDS_ops_table = {
  53.   DXR2_LOGNAME,
  54.   dxr2_zivaDS_get_reg,
  55.   dxr2_zivaDS_set_reg,
  56.   dxr2_zivaDS_get_mem,
  57.   dxr2_zivaDS_set_mem,
  58.   dxr2_zivaDS_enable_int
  59. };
  60. /**
  61.  *
  62.  * Get a *register* from the ziva
  63.  *
  64.  * @param instance Instance of the ziva to use
  65.  * @param reg Register to get
  66.  *
  67.  * @return Value on success, <0 on failure
  68.  *
  69.  */
  70. static int dxr2_zivaDS_get_reg (zivaDS_t* instance, int reg)
  71. {
  72.   dxr2_t* dxr2Inst = (dxr2_t*) instance->data;
  73.   // read & return value
  74.   return(readb(dxr2Inst->zivaDSBase + (reg<<2)));
  75. }
  76. /**
  77.  *
  78.  * Set a *register* on the ziva
  79.  *
  80.  * @param instance Instance of the ziva to use
  81.  * @param reg Register to set
  82.  * @param val Value to set
  83.  *
  84.  * @return 0 on success, <0 on failure
  85.  *
  86.  */
  87. static int dxr2_zivaDS_set_reg (zivaDS_t* instance, int reg, int val)
  88. {
  89.   dxr2_t* dxr2Inst = (dxr2_t*) instance->data;
  90.   // write byte out
  91.   writeb(val, dxr2Inst->zivaDSBase + (reg<<2));
  92.   
  93.   // OK
  94.   return(0);
  95. }
  96. /**
  97.  *
  98.  * Get a memory location from the ziva DS
  99.  *
  100.  * @param instance instance of the ziva to use
  101.  * @param addr Address on the ziva to get
  102.  *
  103.  * @return value on success, <0 on failure
  104.  *
  105.  */
  106. static int dxr2_zivaDS_get_mem (zivaDS_t* instance, int addr)
  107. {
  108.   dxr2_t* dxr2Inst = (dxr2_t*) instance->data;
  109.   u32 value;
  110.   // clear bit 3 of ZiVA register 7
  111.   dxr2_zivaDS_set_bits(instance, ZIVADS_REGCONTROL, 0x8, 0);
  112.   // write the address out
  113.   dxr2_zivaDS_set_reg(instance, ZIVADS_REGADDRESS, addr & 0xff); addr >>= 8;
  114.   dxr2_zivaDS_set_reg(instance, ZIVADS_REGADDRESS+1, addr & 0xff); addr >>= 8;
  115.   dxr2_zivaDS_set_reg(instance, ZIVADS_REGADDRESS+2, addr & 0xff);
  116.   // read reg3 ONCE
  117.   dxr2_zivaDS_get_reg(instance, ZIVADS_REGDATA+3);
  118.   
  119.   // read in the data values
  120.   value =  (dxr2_zivaDS_get_reg(instance, ZIVADS_REGDATA+3) << 24);
  121.   value |= (dxr2_zivaDS_get_reg(instance, ZIVADS_REGDATA+2) << 16);
  122.   value |= (dxr2_zivaDS_get_reg(instance, ZIVADS_REGDATA+1) << 8);
  123.   value |=  dxr2_zivaDS_get_reg(instance, ZIVADS_REGDATA+0);
  124.   // return it
  125.   return(value);
  126. }
  127. /**
  128.  *
  129.  * Set a memory location on the ziva DS
  130.  *
  131.  * @param instance instance of the ziva to use
  132.  * @param addr Address on the ziva to set
  133.  * @param val Value to set
  134.  *
  135.  * @return 0 on success, <0 on failure
  136.  *
  137.  */
  138. static int dxr2_zivaDS_set_mem(zivaDS_t* instance, int addr, int val)
  139. {
  140.   dxr2_t* dxr2Inst = (dxr2_t*) instance->data;
  141.   // clear bit 3 of ZiVA register 7
  142.   dxr2_zivaDS_set_bits(instance, ZIVADS_REGCONTROL, 0x8, 0);
  143.   // write the address out
  144.   dxr2_zivaDS_set_reg(instance, ZIVADS_REGADDRESS, addr & 0xff); addr >>= 8;
  145.   dxr2_zivaDS_set_reg(instance, ZIVADS_REGADDRESS+1, addr & 0xff); addr >>= 8;
  146.   dxr2_zivaDS_set_reg(instance, ZIVADS_REGADDRESS+2, addr & 0xff);
  147.   // write out the data values
  148.   dxr2_zivaDS_set_reg(instance, ZIVADS_REGDATA+3, (val & 0xff000000) >> 24);
  149.   dxr2_zivaDS_set_reg(instance, ZIVADS_REGDATA+2, (val & 0xff0000) >> 16);
  150.   dxr2_zivaDS_set_reg(instance, ZIVADS_REGDATA+1, (val & 0xff00) >> 8);
  151.   dxr2_zivaDS_set_reg(instance, ZIVADS_REGDATA+0, (val & 0xff));
  152.   
  153.   // OK
  154.   return(0);
  155. }
  156. /**
  157.  *
  158.  * Enable/disable ziva interrupt
  159.  *
  160.  * @param instance zivaDS instance
  161.  * @param flag 0=> disable, 1=> enable
  162.  *
  163.  * @return 0 on success, <0 on failure
  164.  *
  165.  */
  166. static int dxr2_zivaDS_enable_int(zivaDS_t* instance, int flag)
  167. {
  168.   if (!flag) {
  169.     
  170.     dxr2_asic_set_bits(instance->data, 0x40, 0x40);
  171.   }
  172.   else {
  173.     
  174.     dxr2_asic_set_bits(instance->data, 0x40, 0);
  175.   }
  176.   // OK 
  177.   return(0);
  178. }
  179.   
  180. /**
  181.  *
  182.  * Set specified bits of an (8bit) register on zivaDS
  183.  *
  184.  * @param instance Instance of the vxp524 to use
  185.  * @param reg Register to retrieve
  186.  * @param bitmask Bitmask of bits to set from that register
  187.  * @param valuemask Values of the bits in the bitmask
  188.  *
  189.  * @return 0 on success, <0 on failure
  190.  *
  191.  */
  192. static int dxr2_zivaDS_set_bits(zivaDS_t* instance, int reg, int bitmask, int valuemask)
  193. {
  194.   // get the current register value
  195.   int value = dxr2_zivaDS_get_reg(instance, reg);
  196.   
  197.   // set it on the hardware
  198.   dxr2_zivaDS_set_reg(instance, reg, (valuemask & (~bitmask)) | valuemask);
  199.   // OK
  200.   return(0);
  201. }
  202. /**
  203.  *
  204.  * Send disc key to the Ziva DS
  205.  *
  206.  * @param instance The instance of zivaDS to use
  207.  * @param discKey 0x800 byte array containing the disc key
  208.  *
  209.  * @return 0 on success, <0 on failure
  210.  *
  211.  */
  212. extern int dxr2_zivaDS_send_disc_key(zivaDS_t* instance, char* discKey) 
  213. {
  214.   dxr2_t* dxr2Inst = (dxr2_t*) instance->data;
  215.   int status=0;
  216.   int endTime;
  217.   int loopFlag;
  218.   // check BM is not in use
  219.   if ((status = vxp524_bm_check_status(dxr2Inst->vxp524Instance)) < 0) {
  220.     
  221.     return(status);
  222.   }
  223.   // copy supplied buffer to DMA buffer
  224.   if (copy_from_user((void*) dxr2Inst->buffer[0], (void*) discKey, 0x800)) {
  225.     
  226.     return(-EFAULT);
  227.   }
  228.   // do some ASIC twiddling
  229.   dxr2_asic_set_bits(dxr2Inst, 0x10, 0x10);
  230.   dxr2_asic_set_bits(dxr2Inst, 0x20, 0x20);
  231.   // get the ziva "warmed up"
  232.   if ((status = zivaDS_send_disc_key_part1(instance)) < 0) {
  233.     
  234.     return(status);
  235.   }
  236.   // send the data
  237.   // remembering to convert VIRTUAL address into BUS address...
  238.   vxp524_bm_send_data(dxr2Inst->vxp524Instance, virt_to_bus((void*) dxr2Inst->buffer[0]), 0x800, 0);
  239.   
  240.   // wait for BM TX to finish
  241.   loopFlag=0;
  242.   endTime = jiffies + ((50*HZ)/100);
  243.   while(jiffies < endTime) {
  244.     
  245.     // let other things in
  246.     schedule();
  247.     // wait till DMA complete
  248.     if (vxp524_bm_completed(dxr2Inst->vxp524Instance, 0)) {
  249.       
  250.       loopFlag=1;
  251.       break;
  252.     }
  253.   }
  254.   
  255.   // disable PCI bus master
  256.   vxp524_set_bits(dxr2Inst->vxp524Instance, VXP524_INPUT_CFG, 0x10, 0);
  257.   // OK, bm no longer in use..
  258.   vxp524_bm_not_in_use(dxr2Inst->vxp524Instance);
  259.   // did it time out?
  260.   if (!loopFlag) {
  261.     return(-ETIMEDOUT);
  262.   }
  263.   
  264.   // finalise
  265.   zivaDS_send_disc_key_part2(instance);
  266.   // OK
  267.   return(0);
  268. }