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

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 dxr2 card
  39.  *
  40.  */
  41. #define EXPORT_SYMTAB
  42. #include <linux/config.h>
  43. #undef MODVERSION
  44. #undef CONFIG_MODVERSIONS
  45. #include <linux/version.h>
  46. #include <linux/module.h>
  47. #include <linux/kernel.h>
  48. #include <linux/sched.h>
  49. #include <linux/string.h>
  50. #include <linux/ptrace.h>
  51. #include <linux/errno.h>
  52. #include <linux/ioport.h>
  53. #include <linux/malloc.h>
  54. #include <linux/interrupt.h>
  55. #include <linux/pci.h>
  56. #include <linux/delay.h>
  57. #include <linux/init.h>
  58. #include <linux/pci.h>
  59. #include <linux/cdrom.h>
  60. #include <linux/videodev.h>
  61. #include <linux/types.h>
  62. #include <asm/byteorder.h>
  63. #include <asm/bitops.h>
  64. #include <asm/io.h>
  65. #include <asm/irq.h>
  66. #include <asm/uaccess.h>
  67. #include <asm/spinlock.h>
  68. #include <pcm1723.h>
  69. #include <bt865.h>
  70. #include <tc6807af.h>
  71. #include <anp82.h>
  72. #include <zivaDS.h>
  73. #include <vxp524.h>
  74. #include <dxr2.h>
  75. /**
  76.  *
  77.  * IRQ handler function
  78.  *
  79.  * @param irq IRQ number
  80.  * @param vInstance DXR2 instance pointer
  81.  * @param regs Processor regs
  82.  *
  83.  */
  84. extern void dxr2_irq_handler(int irq, void* vInstance, struct pt_regs* regs);
  85. extern ssize_t dxr2_io_write(struct file* filp, const char* buf, size_t count, loff_t* offset);
  86. extern int dxr2_io_ioctl(struct inode* inode, struct file* filp, unsigned int cmd, unsigned long arg);
  87. extern int dxr2_io_open(struct inode* inode, struct file* filp);
  88. extern int dxr2_io_release(struct inode* inode, struct file* filp);
  89. extern vxp524_ops_t vxp524_ops_table;
  90. extern anp82_ops_t anp82_ops_table;
  91. extern bt865_ops_t bt865_ops_table;
  92. extern pcm1723_ops_t pcm1723_ops_table;
  93. extern tc6807af_ops_t tc6807af_ops_table;
  94. extern zivaDS_ops_t zivaDS_ops_table;
  95. static struct file_operations dxr2_fops = {
  96.   NULL,
  97.   NULL,
  98.   dxr2_io_write,
  99.   NULL,
  100.   NULL,
  101.   dxr2_io_ioctl,
  102.   NULL,
  103.   dxr2_io_open,
  104.   NULL,
  105.   dxr2_io_release,
  106.   NULL,
  107.   NULL,
  108.   NULL,
  109.   NULL,
  110.   NULL };
  111. /**
  112.  *
  113.  * Create new DXR2 device
  114.  *
  115.  */
  116. extern dxr2_t* dxr2_new()
  117. {
  118.   dxr2_t* instance;
  119.   // create new structure
  120.   instance = (dxr2_t*) vmalloc (sizeof (dxr2_t));
  121.   if (!instance)
  122.     return;
  123.   // OK, initialise the VxP524
  124.   if (!(instance->vxp524Instance = vxp524_new(&vxp524_ops_table, instance)))
  125.     goto err_vxp524;
  126.   // work out base addresses for all the hardware
  127.   instance->vxp524Base = instance->vxp524Instance->base;
  128.   instance->asicBase = instance->vxp524Base + 0x80040;
  129.   instance->zivaDSBase = instance->vxp524Base + 0x80000;
  130.   instance->tc6807afBase = instance->vxp524Base + 0x80080;
  131.   // initialise the ASIC
  132.   dxr2_asic_init(instance);
  133.   // this works out the type of ziva chip (initially... can be changed
  134.   // during ziva initialisation)
  135.   dxr2_zivaDS_get_hardware_type(instance);
  136.   // pre-initialise the ZiVA
  137.   if (!(instance->zivaDSInstance = zivaDS_new (&zivaDS_ops_table, instance)))
  138.     goto err_ziva;
  139.   
  140.   // we've not *actually* initialised the ziva yet... cannot do that until
  141.   // firmware is loaded
  142.   instance->zivaDSInitialised = 0;
  143.   // OK, now we can initialise the rest of the hardware
  144.   // initialise the AnP82
  145.   if (!(instance->anp82Instance = anp82_new (&anp82_ops_table, instance)))
  146.     goto err_anp82;
  147.   // initialise the pcm1723e
  148.   if (!(instance->pcm1723Instance = pcm1723_new (&pcm1723_ops_table, instance)))
  149.     goto err_pcm1723;
  150.   
  151.   // initialise the Bt865
  152.   if (!(instance->bt865Instance = bt865_new (&bt865_ops_table, instance)))
  153.     goto err_bt865;
  154.   // OK, check if the ziva is ZIVADS_TYPE_1
  155.   if (zivaDS_check_type_1(instance->zivaDSInstance)) {
  156.     
  157.     instance->zivaDSInstance->zivaDSType = ZIVADS_TYPE_1;
  158.     if (!(instance->tc6807afInstance = tc6807af_new(&tc6807af_ops_table, instance)))
  159.       goto err_tc6807af;
  160.   }
  161.   else {
  162.     instance->tc6807afInstance = NULL;
  163.   }
  164.   // nothing in the deferred queue
  165.   instance->deferredCount = 0;
  166.   // semaphore = *1*... i.e. nothing in the critial section
  167.   atomic_set(&(instance->semaphore), 1);
  168.   // initialise other structure members
  169.   instance->waitQueue = NULL;
  170.   instance->userBuffer = 0;
  171.   instance->userBytesTransferred = 0;
  172.   instance->userBufferSize = 0;
  173.   instance->hliFlag = DXR2_SUBPICTURE_OFF;
  174.   instance->currentOutputTvFormat = DXR2_TVFORMAT_NTSC;
  175.   instance->currentZivaAudioDACMode = 0;
  176.   instance->currentSourceVideoFrequency = DXR2_SRC_VIDEO_FREQ_30;
  177.   instance->currentSourceVideoXRes = 720;
  178.   instance->currentSourceVideoYRes = 480;
  179.   instance->currentPlayMode = 0;
  180.   instance->currentAudioVolume = 19;
  181.   instance->currentOutputAspectRatio = DXR2_ASPECTRATIO_4_3;
  182.   instance->currentSlowRate = 0;
  183.   instance->currentAspectRatioMode = 0;
  184.   instance->currentScanOp = 0;
  185.   instance->currentScanParam = 0;
  186.   instance->currentBitstreamType = DXR2_BITSTREAM_TYPE_MPEG_VOB;
  187.   instance->currentVideoStream = 0;
  188.   instance->currentSubPictureStream = 0;
  189.   instance->currentAudioStream = 0;
  190.   instance->currentAudioStreamType = DXR2_STREAM_AUDIO_AC3;
  191.   instance->currentAudioMuteStatus = 0;
  192.   // bus mastering stuff
  193.   instance->bmBuffer = 1;
  194.   instance->writeBuffer = 0;
  195.   instance->bufferCount[0] = 0;
  196.   instance->bufferCount[1] = 0;
  197.   // get BM buffers
  198.   if (!(instance->buffer[0] = __get_free_pages(GFP_KERNEL, DXR2_PAGE_ORDER))) {
  199.     
  200.     goto err_mem1;
  201.   }
  202.   if (!(instance->buffer[1] = __get_free_pages(GFP_KERNEL, DXR2_PAGE_ORDER))) {
  203.     
  204.     goto err_mem2;
  205.   }
  206.   instance->bufferSize[0] = (2*2*2) * PAGE_SIZE;
  207.   instance->bufferSize[1] = (2*2*2) * PAGE_SIZE;
  208.   // hook the IRQ
  209.   if (request_irq(instance->vxp524Instance->pci_dev->irq,
  210.   dxr2_irq_handler,
  211.   SA_INTERRUPT | SA_SHIRQ,
  212.   DXR2_LOGNAME,
  213.   instance) != 0) {
  214.     
  215.     goto err_irq;
  216.   }
  217.   // another module use
  218.   MOD_INC_USE_COUNT;
  219.   
  220.   // OK!
  221.   return(instance);
  222.   
  223.   // error handling!
  224.  err_irq:
  225.   free_pages(instance->buffer[1], DXR2_PAGE_ORDER);
  226.  err_mem2:
  227.   free_pages(instance->buffer[0], DXR2_PAGE_ORDER);
  228.  err_mem1:
  229.   if (instance->tc6807afInstance != NULL) tc6807af_free(instance->tc6807afInstance);
  230.  err_tc6807af:
  231.   bt865_free (instance->bt865Instance);
  232.  err_bt865:
  233.   pcm1723_free (instance->pcm1723Instance);
  234.  err_pcm1723:
  235.   anp82_free (instance->anp82Instance);
  236.  err_anp82:
  237.   zivaDS_free (instance->zivaDSInstance);
  238.  err_ziva:
  239.   vxp524_free (instance->vxp524Instance);
  240.  err_vxp524:
  241.   vfree (instance);
  242.   return(NULL);
  243. }
  244. /**
  245.  *
  246.  * Destroy a dxr2 device (BURNY BURNY!!!!)
  247.  *
  248.  * @param instance DXR2 instance to use
  249.  *
  250.  */
  251. void dxr2_free (dxr2_t* instance)
  252. {
  253.   // ok, shut everything down...
  254.   zivaDS_reset(instance->zivaDSInstance);
  255.   vxp524_bm_reset(instance->vxp524Instance);
  256.   if (instance->zivaDSInitialised) {
  257.     zivaDS_set_audio_attenuation(instance->zivaDSInstance, 0x60);
  258.     zivaDS_clear_video(instance->zivaDSInstance);
  259.   }
  260.   pcm1723_set_mute_mode(instance->pcm1723Instance, DXR2_AUDIO_MUTE_ON);
  261.   // unhook IRQ
  262.   free_irq(instance->vxp524Instance->pci_dev->irq, instance);
  263.   // free BM buffers
  264.   free_pages(instance->buffer[0], DXR2_PAGE_ORDER);
  265.   free_pages(instance->buffer[1], DXR2_PAGE_ORDER);
  266.   // free all the other drivers
  267.   if (instance->tc6807afInstance != NULL) {
  268.     tc6807af_free (instance->tc6807afInstance);
  269.   }
  270.   pcm1723_free (instance->pcm1723Instance);
  271.   zivaDS_free (instance->zivaDSInstance);
  272.   bt865_free (instance->bt865Instance);
  273.   anp82_free (instance->anp82Instance);
  274.   vxp524_free (instance->vxp524Instance);
  275.   // OK, free ourselves!
  276.   vfree(instance);
  277.   // one less module usage
  278.   MOD_DEC_USE_COUNT;
  279. }
  280. /**
  281.  *
  282.  * IOCTL handler. This is temporary, so kI can get the driver out so people
  283.  * can test it etc...
  284.  *
  285.  */
  286. extern int dxr2_io_ioctl(struct inode* inode, struct file* filp, unsigned int cmd, unsigned long arg)
  287. {
  288.   char* buffer = (char*) arg;
  289.   dxr2_t* instance = (dxr2_t*) filp->private_data;
  290.   int status;
  291.   // OK, do it!
  292.   switch(cmd) {
  293.   case DXR2_IOC_GET_REGION_CODE:
  294.       
  295.     status = dxr2_ioc_get_region_code(instance, buffer);
  296.     break;
  297.   case DXR2_IOC_SET_OUTPUT_TV_FORMAT:
  298.     
  299.     status = dxr2_ioc_set_output_tv_format(instance, buffer);
  300.     break;
  301.   case DXR2_IOC_SET_SOURCE_VIDEO_FORMAT:
  302.     status = dxr2_ioc_set_source_video_format(instance, buffer);
  303.     break;
  304.   case DXR2_IOC_GET_CAPABILITIES:
  305.     
  306.     status = dxr2_ioc_get_capabilities(instance, buffer);
  307.     break;
  308.     
  309.   case DXR2_IOC_CLEAR_VIDEO:
  310.     
  311.     status = dxr2_ioc_clear_video(instance);
  312.     break;
  313.   case DXR2_IOC_PAUSE:
  314.     
  315.     status = dxr2_ioc_pause(instance);
  316.     break;
  317.     
  318.   case DXR2_IOC_SET_AUDIO_VOLUME:
  319.     
  320.     status = dxr2_ioc_set_audio_volume(instance, buffer);
  321.     break;
  322.     
  323.   case DXR2_IOC_SET_OUTPUT_ASPECT_RATIO:
  324.     
  325.     status = dxr2_ioc_set_output_aspect_ratio(instance, buffer);
  326.     break;
  327.     
  328.   case DXR2_IOC_ABORT:
  329.     
  330.     status = dxr2_ioc_abort(instance);
  331.     break;
  332.     
  333.   case DXR2_IOC_STOP:
  334.     
  335.     status = dxr2_ioc_stop(instance);
  336.     break;
  337.     
  338.   case DXR2_IOC_ENABLE_SUBPICTURE:
  339.     
  340.     status = dxr2_ioc_enable_subpicture(instance, buffer);
  341.     break;
  342.     
  343.   case DXR2_IOC_SLOW_FORWARDS:
  344.     
  345.     status = dxr2_ioc_slow_forwards(instance, buffer);
  346.     break;
  347.   case DXR2_IOC_SLOW_BACKWARDS:
  348.     
  349.     status = dxr2_ioc_slow_backwards(instance, buffer);
  350.     break;
  351.   case DXR2_IOC_SET_SOURCE_ASPECT_RATIO:
  352.     
  353.     status = dxr2_ioc_set_source_aspect_ratio(instance, buffer);
  354.     break;
  355.   case DXR2_IOC_SET_ASPECT_RATIO_MODE:
  356.     
  357.     status = dxr2_ioc_set_aspect_ratio_mode(instance, buffer);
  358.     break;
  359.   case DXR2_IOC_SINGLE_STEP:
  360.     
  361.     status = dxr2_ioc_single_step(instance);
  362.     break;
  363.   case DXR2_IOC_REVERSE_PLAY:
  364.     
  365.     status = dxr2_ioc_reverse_play(instance);
  366.     break;
  367.     
  368.   case DXR2_IOC_SET_SUBPICTURE_PALETTE:
  369.     
  370.     status = dxr2_ioc_set_subpicture_palettes(instance, buffer);
  371.     break;
  372.   case DXR2_IOC_GET_CHALLENGE_KEY:
  373.     
  374.     status = dxr2_ioc_get_challenge_key(instance, buffer);
  375.     break;
  376.   case DXR2_IOC_SEND_CHALLENGE_KEY:
  377.     
  378.     status = dxr2_ioc_send_challenge_key(instance, buffer);
  379.     break;
  380.   case DXR2_IOC_GET_RESPONSE_KEY:
  381.     
  382.     status = dxr2_ioc_get_response_key(instance, buffer);
  383.     break;
  384.   case DXR2_IOC_SEND_RESPONSE_KEY:
  385.     
  386.     status = dxr2_ioc_send_response_key(instance, buffer);
  387.     break;
  388.   case DXR2_IOC_SEND_DISC_KEY:
  389.     
  390.     status = dxr2_ioc_send_disc_key(instance, buffer);
  391.     break;
  392.   case DXR2_IOC_SEND_TITLE_KEY:
  393.     
  394.     status = dxr2_ioc_send_title_key(instance, buffer);
  395.     break;
  396.   case DXR2_IOC_SET_DECRYPTION_MODE:
  397.     
  398.     status = dxr2_ioc_set_decryption_mode(instance, buffer);
  399.     break;
  400.   case DXR2_IOC_INIT_ZIVADS:
  401.     
  402.     status = dxr2_ioc_init_zivaDS(instance, buffer);
  403.     break;
  404.   case DXR2_IOC_SCAN_MODE:
  405.     
  406.     status = dxr2_ioc_scan_mode(instance, buffer);
  407.     break;
  408.   case DXR2_IOC_SET_MACROVISION_MODE:
  409.     
  410.     status = dxr2_ioc_set_macrovision_mode(instance, buffer);
  411.     break;
  412.   case DXR2_IOC_RESET:
  413.     
  414.     status = dxr2_ioc_reset(instance);
  415.     break;
  416.     
  417.   case DXR2_IOC_SET_BITSTREAM_TYPE:
  418.     
  419.     status = dxr2_ioc_set_bitstream_type(instance, buffer);
  420.     break;
  421.     
  422.   case DXR2_IOC_PLAY:
  423.     
  424.     status = dxr2_ioc_play(instance);
  425.     break;
  426.     
  427.   case DXR2_IOC_GET_STC:
  428.     
  429.     status = dxr2_ioc_get_stc(instance, buffer);
  430.     break;
  431.   case DXR2_IOC_SET_AUDIO_SAMPLE_FREQUENCY:
  432.     
  433.     status = dxr2_ioc_set_audio_sample_freqency(instance, buffer);
  434.     break;
  435.   case DXR2_IOC_SET_AUDIO_DATA_WIDTH:
  436.     
  437.     status = dxr2_ioc_set_audio_data_width(instance, buffer);
  438.     break;
  439.     
  440.   case DXR2_IOC_IEC958_OUTPUT_MODE:
  441.     
  442.     status = dxr2_ioc_iec958_output_mode(instance, buffer);
  443.     break;
  444.     
  445.   case DXR2_IOC_SET_AC3_MODE:
  446.     
  447.     status = dxr2_ioc_set_AC3_mode(instance, buffer);
  448.     break;
  449.     
  450.   case DXR2_IOC_SELECT_AC3_VOICE:
  451.     
  452.     status = dxr2_ioc_select_AC3_voice(instance, buffer);
  453.     break;
  454.     
  455.   case DXR2_IOC_AUDIO_MUTE:
  456.     
  457.     status = dxr2_ioc_audio_mute(instance, buffer);
  458.     break;
  459.   case DXR2_IOC_SET_STEREO_MODE:
  460.     
  461.     status = dxr2_ioc_set_stereo_mode(instance, buffer);
  462.     break;
  463.   case DXR2_IOC_SELECT_STREAM:
  464.     
  465.     status = dxr2_ioc_select_stream(instance, buffer);
  466.     break;
  467.     
  468.   case DXR2_IOC_HIGHLIGHT:
  469.     
  470.     status = dxr2_ioc_highlight(instance, buffer);
  471.     break;
  472.     
  473.   default:
  474.     
  475.     status = -EINVAL;
  476.   }
  477.   
  478.   return(status);
  479. }
  480.     
  481.     
  482. extern int dxr2_io_open(struct inode* inode, struct file* filp) 
  483. {
  484.   dxr2_t* instance;
  485.   // create new DXR2 instance & check (increments module usage automatically)
  486.   if ((instance = dxr2_new()) == NULL) {
  487.     
  488.     return(-EIO);
  489.   }
  490.   // OK, remember instance pointer
  491.   filp->private_data = instance;
  492.   // OK!
  493.   return(0);
  494. }
  495. extern int dxr2_io_release(struct inode* inode, struct file* filp) 
  496. {
  497.   dxr2_t* instance = (dxr2_t*) filp->private_data;
  498.   
  499.   // free the DXR2 instance (decrements module usage automatically)
  500.   dxr2_free(instance);
  501.   // OK
  502.   return(0);
  503. }
  504.     
  505.     
  506.     
  507. #ifdef MODULE
  508. int init_module (void)
  509. {
  510.   return(register_chrdev(DXR2_MAJOR, DXR2_LOGNAME, &dxr2_fops));
  511. }
  512. void cleanup_module (void)
  513. {
  514.   unregister_chrdev(DXR2_MAJOR, DXR2_LOGNAME);
  515. }
  516. #endif