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

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 C-Cube Ziva-DS MPEG decoder chip
  39.  * High level functions.
  40.  *
  41.  */
  42. #include <linux/errno.h>
  43. #include <linux/sched.h>
  44. #include <linux/byteorder/generic.h>
  45. #include <zivaDS.h>
  46. /**
  47.  *
  48.  * Table of attenuation values for zivaDS_setAudioVolume
  49.  *
  50.  */
  51. static int volumeTable[] = {
  52.   0x60, 0x20, 0x1c, 0x18, 0x16, 0x14, 0x12,
  53.   0x10, 0x0e, 0x0c, 0x0a, 9, 8, 7, 6, 5, 4, 3, 2, 1
  54. };
  55. /**
  56.  *
  57.  * Table of values for slow forwards
  58.  *
  59.  */
  60. static int slowForwardsTable[] = {
  61.   
  62.   4, 6, 8, 0xa, 0xc
  63. };
  64. /**
  65.  *
  66.  * Table of values for slow backwards
  67.  *
  68.  */
  69. static int slowBackwardsTable[] = {
  70.   
  71.   4, 8, 0xa, 0xc, 0x14
  72. };
  73. /**
  74.  *
  75.  * Bitstream type table
  76.  *
  77.  */
  78. static int bitStreamTypeTable[] = {
  79.   
  80.   0,2,1,0x11,0x10
  81. };
  82. /**
  83.  *
  84.  * This detects the Ziva chip. You can't just reset the thing, because
  85.  * you need the firmware uploaded first (I think)... 
  86.  *
  87.  * @return 0 on success, <0 on failure
  88.  *
  89.  */
  90. extern int zivaDS_detect(zivaDS_t* instance) {
  91.   
  92.   // set register to 0xa5
  93.   zivaDS_set_reg(instance, ZIVADS_REGADDRESS, 0xA5); // is this right?
  94.   // try and read it again
  95.   if (zivaDS_get_reg(instance, ZIVADS_REGADDRESS) != 0xA5) {
  96.     
  97.     return(-ENODEV);
  98.   }
  99.  
  100.   // OK!
  101.   return(0);
  102. }
  103. /**
  104.  *
  105.  * Get the CSS flags from the ziva and store them in supplied structure
  106.  *
  107.  * @param instance Ziva instance to use
  108.  * @param flags Where to store the flags
  109.  *
  110.  */
  111. extern void zivaDS_get_css_flags(zivaDS_t* instance, zivaDS_cssFlags_t* flags) 
  112. {
  113.   // OK, get these memory locations
  114.   flags->flag1 = zivaDS_get_mem(instance, 0x80001F);
  115.   flags->flag2 = zivaDS_get_mem(instance, 0x80001C);
  116. }
  117.   
  118. /**
  119.  *
  120.  * Restore the CSS flags to the ziva from the supplied structure
  121.  *
  122.  * @param instance Ziva instance to use
  123.  * @param flags Where to store the flags
  124.  *
  125.  */
  126. extern void zivaDS_restore_css_flags(zivaDS_t* instance, zivaDS_cssFlags_t* flags) 
  127. {
  128.   // OK, restore 'em
  129.   zivaDS_set_mem(instance, 0x80001F, flags->flag1);
  130.   zivaDS_set_mem(instance, 0x80001C, flags->flag2);
  131. }
  132.   
  133. /**
  134.  *
  135.  * Set the CSS mode... used for the tc6807af functions
  136.  * You call this with mode=1 before doing anything with the tc6807af, and then with
  137.  * mode=0 after you have finished.
  138.  *
  139.  * @param instance Ziva instance to use
  140.  * @param mode Mode to set (0 or 1).
  141.  *
  142.  */
  143. extern void zivaDS_set_css_mode(zivaDS_t* instance, int mode) 
  144. {
  145.   switch(mode) {
  146.   case 0:
  147.     
  148.       zivaDS_set_mem(instance, 0x80001C, 8);
  149.       break;
  150.       
  151.   case 1:
  152.     zivaDS_set_mem(instance, 0x80001F, 3);
  153.     zivaDS_set_mem(instance, 0x80001C, 0xC);
  154.     break;
  155.   }
  156. }
  157. /**
  158.  *
  159.  * Enable/disable subpicture
  160.  *
  161.  * @param instance instance to use
  162.  * @param flag one of ZIVADS_SUBPICTURE_OFF, ZIVADS_SUBPICTURE_ON
  163.  *
  164.  * @return 0 on success, <0 on failure
  165.  *
  166.  */
  167. extern int zivaDS_enable_subpicture(zivaDS_t* instance, int flag) 
  168. {
  169.   
  170.   // invert sense of flag.
  171.   if (flag == ZIVADS_SUBPICTURE_OFF) {
  172.     
  173.     flag = 1;
  174.   }
  175.   else {
  176.     flag = 0;
  177.   }
  178.   // do it
  179.   zivaDS_set_mem(instance, ZIVADS_ENABLE_SUBPICTURE, flag);
  180.   
  181.   // OK
  182.   return(0);
  183. }
  184. /**
  185.  *
  186.  * Abort playback
  187.  *
  188.  * @param instance zivaDS instance to use
  189.  *
  190.  * @return 0 on success, <0 on failure
  191.  *
  192.  */
  193. extern int zivaDS_abort(zivaDS_t* instance) 
  194. {
  195.   return(zivaDS_command(instance, ZIVADS_CMD_ABORT,
  196. 0,2,0,0,0,0,
  197. 0x200,4));
  198. }
  199. /**
  200.  *
  201.  * Set the output aspect ratio
  202.  *
  203.  * @param instance zivaDS instance to use
  204.  * @param buffer instance of dxr2_oneArg_t. 
  205.  *               arg is one of ZIVADS_ASPECTRATIO_4_3 or ZIVADS_ASPECTRATIO_16_9
  206.  *
  207.  * @return 0 on success, <0 on failure
  208.  *
  209.  */
  210. extern int zivaDS_set_output_aspect_ratio(zivaDS_t* instance, int ratio)
  211. {
  212.   // check parameters
  213.   if ((ratio != ZIVADS_ASPECTRATIO_4_3) &&
  214.       (ratio != ZIVADS_ASPECTRATIO_16_9)) {
  215.     
  216.     return(-EINVAL);
  217.   }
  218.   // set it!
  219.   zivaDS_set_mem(instance, ZIVADS_DISPLAY_ASPECT_RATIO, ratio);
  220.   // OK
  221.   return(0);
  222. }
  223. /**
  224.  *
  225.  * Set source aspect ratio
  226.  *
  227.  * @param instance ZivaDS instance
  228.  * @param ratio one of ZIVADS_ASPECTRATIO_4_3, ZIVADS_ASPECTRATIO_16_9
  229.  *
  230.  * @return 0 on success, <0 on failure
  231.  *
  232.  */
  233. extern int zivaDS_set_source_aspect_ratio(zivaDS_t* instance, int ratio) 
  234. {
  235.   int value;
  236.   // check parameters
  237.   switch(ratio) {
  238.   case ZIVADS_ASPECTRATIO_4_3:
  239.     
  240.     value = 0;
  241.     break;
  242.     
  243.   case ZIVADS_ASPECTRATIO_16_9:
  244.     
  245.     value = 3;
  246.     break;
  247.   default:
  248.     return(-EINVAL);
  249.   }
  250.   // set it!
  251.   zivaDS_set_mem(instance, ZIVADS_SOURCE_ASPECT_RATIO, value);
  252.   
  253.   // OK
  254.   return(0);
  255. }
  256. /**
  257.  *
  258.  * Set audio volume
  259.  *
  260.  * @param instance ZivaDS instance to use
  261.  * @param volume Volume to to (0-19), 0 =min, 19=max
  262.  *
  263.  * @return 0 on success, <0 on failure
  264.  *
  265.  */
  266. extern int zivaDS_set_audio_volume(zivaDS_t* instance, int volume) 
  267. {
  268.   int value;
  269.   
  270.   // check parameters
  271.   if ((volume < 0) || (volume > 19)) {
  272.     
  273.     return(-EINVAL);
  274.   }
  275.   // OK, work out REAL value
  276.   value = volumeTable[volume];
  277.   // set it!
  278.   zivaDS_set_mem(instance, ZIVADS_AUDIO_ATTENUATION, value);
  279.   
  280.   // OK
  281.   return(0);
  282. }
  283. /**
  284.  *
  285.  * Pause playback
  286.  *
  287.  * @param instance ZivaDS instance
  288.  *
  289.  * @return 0 on success, <0 on failure
  290.  *
  291.  */
  292. extern int zivaDS_pause(zivaDS_t* instance)
  293. {
  294.   // pause, with repeated even field
  295.   return(zivaDS_command(instance, 
  296. ZIVADS_CMD_PAUSE,
  297. 1,0,0,0,0,0,
  298. 0x2000, 4));
  299. }
  300. /**
  301.  *
  302.  * Clear video
  303.  *
  304.  * @param instance ZivaDS instance
  305.  *
  306.  * @return 0 on success, <0 on failure
  307.  *
  308.  */
  309. extern int zivaDS_clear_video(zivaDS_t* instance) 
  310. {
  311.   // fill screen with colour 0x108080
  312.   return(zivaDS_command(instance, 
  313. ZIVADS_CMD_SETFILL,
  314. 0xffffffff,0,0,0,0x108080,0,
  315. 0, 0));
  316. }
  317. /**
  318.  *
  319.  * Slow forwards
  320.  *
  321.  * @param instance ZivaDS instance
  322.  * @param rate Rate of play (one of ZIVADS_SLOWRATE_2x, ZIVADS_SLOWRATE_3x
  323.  *                           ZIVADS_SLOWRATE_4x, ZIVADS_SLOWRATE_5x, ZIVADS_SLOWRATE_6x)
  324.  *
  325.  * @return 0 on success, <0 on failure
  326.  *
  327.  */
  328. extern int zivaDS_slow_forwards(zivaDS_t* instance, int rate) 
  329. {
  330.   int value;
  331.   // check parameters
  332.   if ((rate < ZIVADS_SLOWRATE_2x) || (rate > ZIVADS_SLOWRATE_6x)) {
  333.     
  334.     return(-EINVAL);
  335.   }
  336.   // OK, work out REAL value
  337.   value = slowForwardsTable[rate];
  338.   
  339.   // slow forwards, with repeated even field
  340.   return(zivaDS_command(instance, 
  341. ZIVADS_CMD_SLOWFORWARDS,
  342. value,1,0,0,0,0,
  343. 0x100000, 0));
  344. }
  345. /**
  346.  *
  347.  * Slow backwards
  348.  *
  349.  * @param instance ZivaDS instance
  350.  * @param rate Rate of play (one of ZIVADS_SLOWRATE_2x, ZIVADS_SLOWRATE_3x
  351.  *                           ZIVADS_SLOWRATE_4x, ZIVADS_SLOWRATE_5x, ZIVADS_SLOWRATE_6x)
  352.  *
  353.  * @return 0 on success, <0 on failure
  354.  *
  355.  */
  356. extern int zivaDS_slow_backwards(zivaDS_t* instance, int rate) 
  357. {
  358.   int value;
  359.   // check parameters
  360.   if ((rate < ZIVADS_SLOWRATE_2x) || (rate > ZIVADS_SLOWRATE_6x)) {
  361.     
  362.     return(-EINVAL);
  363.   }
  364.   // OK, work out REAL value
  365.   value = slowBackwardsTable[rate];
  366.   
  367.   // do it!
  368.   return(zivaDS_command(instance, 
  369. ZIVADS_CMD_BACKWARDS,
  370. value,3,4,0,0,0,
  371. 0x100000, 0));
  372. }
  373. /**
  374.  * 
  375.  * Set aspect ratio mode
  376.  *
  377.  * @param instance ZivaDS instance to use
  378.  * @param mode Aspect ratio mode (one of ZIVADS_ASPECTRATIOMODE_NORMAL,
  379.  *                                ZIVADS_ASPECTRATIOMODE_PAN_SCAN,
  380.  *                                ZIVADS_ASPECTRATIOMODE_LETTERBOX)
  381.  *
  382.  * @return 0 on success, <0 on failure
  383.  *
  384.  */
  385. extern int zivaDS_set_aspect_ratio_mode(zivaDS_t* instance, int mode)
  386. {
  387.   int value;
  388.   // check parameters
  389.   if ((mode < ZIVADS_ASPECTRATIOMODE_NORMAL) || 
  390.       (mode > ZIVADS_ASPECTRATIOMODE_LETTERBOX)) {
  391.     
  392.     return(-EINVAL);
  393.   }
  394.   
  395.   // set it!
  396.   zivaDS_set_mem(instance, ZIVADS_ASPECT_RATIO_MODE, value);
  397.   
  398.   // OK
  399.   return(0);
  400. }
  401. /**
  402.  * UNSURE
  403.  * Scan (fastforward/fastbackward)
  404.  *
  405.  * @param instance ZivaDS instance to use
  406.  * @param scanOp ???
  407.  * @param scanParam ???
  408.  *
  409.  * @return 0 on success, <0 on failure
  410.  *
  411.  */
  412. extern int zivaDS_scan_mode(zivaDS_t* instance, int scanOp, int scanParam)
  413. {
  414.   // check parameters
  415.   if ((scanOp < 0) || (scanOp > 2)) {
  416.     
  417.     return(-EINVAL);
  418.   }
  419.   if ((scanParam < 0) || (scanParam > 3)) {
  420.     
  421.     return(-EINVAL);
  422.   }
  423.   // do it!
  424.   return(zivaDS_command(instance, 
  425. ZIVADS_CMD_SCAN,
  426. scanOp,scanParam,4,0,0,0,
  427. 0x100000, 0));
  428. }
  429. /**
  430.  * 
  431.  * Single Step
  432.  *
  433.  * @param instance ZivaDS instance to use
  434.  *
  435.  * @return 0 on success, <0 on failure
  436.  *
  437.  */
  438. extern int zivaDS_single_step(zivaDS_t* instance)
  439. {
  440.   // do it!
  441.   return(zivaDS_command(instance, 
  442. ZIVADS_CMD_SINGLESTEP,
  443. 4,0,0,0,0,0,
  444. 0x100000, 0));
  445. }
  446. /**
  447.  * 
  448.  * Reverse play
  449.  *
  450.  * @param instance ZivaDS instance to use
  451.  *
  452.  * @return 0 on success, <0 on failure
  453.  *
  454.  */
  455. extern int zivaDS_reverse_play(zivaDS_t* instance)
  456. {
  457.   // do it!
  458.   return(zivaDS_command(instance, 
  459. ZIVADS_CMD_BACKWARDS,
  460. 2,3,4,0,0,0,
  461. 0x100000, 0));
  462. }
  463. /**
  464.  * 
  465.  * Set subpicture palettes
  466.  *
  467.  * @param instance ZivaDS instance to use
  468.  * @param palette (16x32bit palette entries)
  469.  *
  470.  * @return 0 on success, <0 on failure
  471.  *
  472.  */
  473. extern int zivaDS_set_subpicture_palettes(zivaDS_t* instance, u32 palettes[])
  474. {
  475.   int palStart;
  476.   int i;
  477.   // get start of palette data in ziva memory
  478.   palStart = zivaDS_get_mem(instance, ZIVADS_SUBPICTURE_PALETTE_START);
  479.   
  480.   // write out each palette entry
  481.   for(i=0; i< 16; i++) {
  482.     
  483.     zivaDS_set_mem(instance, palStart + (i*4), palettes[i]);
  484.   }
  485.   
  486.   // inform Ziva that new palette data is present
  487.   zivaDS_set_mem(instance, ZIVADS_NEW_SUBPICTURE_PALETTE, 1);
  488.   
  489.   // OK
  490.   return(0);
  491. }
  492. /**
  493.  *
  494.  * Initialise the ziva
  495.  *
  496.  * @param instance instance to use
  497.  * @param uCode ucode data to upload
  498.  *
  499.  * @return 0 on success, <0 on failure
  500.  *
  501.  */
  502. extern int zivaDS_init(zivaDS_t* instance, char* uCode)
  503. {
  504.   u32 dataLength;
  505.   u32 destAddress;
  506.   u32 tmpLength;
  507.   u32 tmpAddress;
  508.   u32 tmpValue;
  509.   int i;
  510.   int loopFlag;
  511.   int endTime;
  512.   char* oldUcode;
  513.   char* tmpUcode;
  514.   char* block1End;
  515.   
  516.   // skip over file header
  517.   uCode += 4 + 12;
  518.   
  519.   // OK, get the data length & address
  520.   dataLength = le32_to_cpup(uCode); uCode +=4;
  521.   destAddress = le32_to_cpup(uCode); uCode +=4;
  522.   uCode += 4; // ignore the next 4 bytes
  523.   
  524.   // keep note of where we are
  525.   oldUcode = uCode;
  526.   
  527.   // set host control register to ziva normal mode
  528.   zivaDS_set_mem(instance, 0x800000, 0x1000);
  529.   // Don't know what these do.... set some internal register shite
  530.   zivaDS_set_mem(instance, 0x800022, 0xf);
  531.   zivaDS_set_mem(instance, 0x800023, 0x14ec);
  532.   zivaDS_set_mem(instance, 0x800022, 0x11);
  533.   zivaDS_set_mem(instance, 0x800023, 0);
  534.   
  535.   // OK, skip over 0xBFC bytes
  536.   tmpUcode = oldUcode + 0xBFC;
  537.   
  538.   // get length of data to write
  539.   tmpLength = be32_to_cpup((u32*) tmpUcode); tmpUcode-=4;
  540.   // OK, write out data from this table
  541.   while(tmpLength > 0) {
  542.     // get address & value
  543.     tmpAddress = be32_to_cpup((u32*) tmpUcode); tmpUcode -=4;
  544.     tmpValue = be32_to_cpup((u32*) tmpUcode); tmpUcode -=4;
  545.     
  546.     // output them
  547.     zivaDS_set_mem(instance, tmpAddress, tmpValue);
  548.     
  549.     // decrement counter
  550.     tmpLength--;
  551.   }
  552.   // remember where we are
  553.   block1End = tmpUcode;
  554.   
  555.   // OK, move to next table start
  556.   tmpUcode = oldUcode + 0x800;
  557.   
  558.   // write out table number 2
  559.   for(i=0; i<255; i++) {
  560.     // get value
  561.     tmpValue = be32_to_cpup((u32*) tmpUcode); tmpUcode+=4;
  562.     // output them... dunno what this is 
  563.     zivaDS_set_mem(instance, 0x800036, i);
  564.     zivaDS_set_mem(instance, 0x800034, tmpValue);
  565.   }
  566.   // ok, back to start of ucode
  567.   tmpUcode = oldUcode;
  568.   
  569.   // write out all the Ucode now.
  570.   for(i=0; i< dataLength; i+=4) {
  571.     
  572.     // get value
  573.     tmpValue = be32_to_cpup((u32*) tmpUcode); tmpUcode += 4;
  574.     
  575.     // output it
  576.     zivaDS_set_mem(instance, i, tmpValue);
  577.   }
  578.   
  579.   // letterbox mode
  580.   zivaDS_set_mem(instance, ZIVADS_ASPECT_RATIO_MODE, 
  581.  ZIVADS_ASPECTRATIOMODE_LETTERBOX);
  582.   
  583.   // setup bitstream source & SD mode
  584.   if (instance->zivaDSType == ZIVADS_TYPE_1) {
  585.     
  586.     // not sure what this is, actually... assume it means bitstream
  587.     // comes from host
  588.     zivaDS_set_mem(instance, ZIVADS_BITSTREAM_SOURCE, 0);
  589.     zivaDS_set_mem(instance, ZIVADS_SD_MODE, 0x0d);
  590.   }
  591.   else {
  592.     // bitstream comes from host
  593.     zivaDS_set_mem(instance, ZIVADS_BITSTREAM_SOURCE, 2);
  594.     // DVD REQ bit/REQ pin is active LOW.
  595.     zivaDS_set_mem(instance, ZIVADS_SD_MODE, 0x08);
  596.   }
  597.   // dunno what this does
  598.   zivaDS_set_mem(instance, 0x214, 0xF0);
  599.   // setup the ziva's memory layout.. I assume
  600.   if (instance->zivaDSType == ZIVADS_TYPE_4) {
  601.     
  602.     zivaDS_set_mem(instance, ZIVADS_DRAM_INFO, 0);
  603.     zivaDS_set_mem(instance, ZIVADS_UCODE_MEMORY, 0);
  604.     zivaDS_set_mem(instance, ZIVADS_MEMORY_MAP, 1);
  605.   }
  606.   else {
  607.     // OK, there are 20 MBits of DRAM there
  608.     zivaDS_set_mem(instance, ZIVADS_DRAM_INFO, 1);
  609.     // uCode is in DRAM
  610.     zivaDS_set_mem(instance, ZIVADS_UCODE_MEMORY, 0);
  611.     
  612.     // 20 Mbit DRAM with NTSC memory map.
  613.     zivaDS_set_mem(instance, ZIVADS_MEMORY_MAP, 3);
  614.   }
  615.   // AC3 output mode = 2 forward speakers, 0 rear, L/R
  616.   zivaDS_set_mem(instance, ZIVADS_AC3_OUTPUT_MODE, 0);
  617.   
  618.   // ziva Type = Ziva-DS (as opposed to Ziva-D6)
  619.   zivaDS_set_mem(instance, ZIVADS_IC_TYPE, 1);
  620.   
  621.   // frame based error recovery
  622.   zivaDS_set_mem(instance, ZIVADS_ERR_CONCEALMENT_LEVEL, 0);
  623.   
  624.   // enable ALL host interrupts
  625.   zivaDS_set_mem(instance, ZIVADS_INT_MASK, 0xffffff);
  626.   
  627.   // tri-state VDATA
  628.   zivaDS_set_mem(instance, ZIVADS_VIDEO_MODE, 2);
  629.   // dunno what this does
  630.   zivaDS_set_mem(instance, 0x80003a, 0x0a);
  631.   zivaDS_set_mem(instance, 0x80003b, 0xc000);
  632.   zivaDS_set_mem(instance, 0x80003a, 0x9);
  633.   zivaDS_set_mem(instance, 0x80003b, 0x0);
  634.   // more ucode writes
  635.   tmpUcode = block1End;
  636.   tmpLength = be32_to_cpup((u32*) tmpUcode); tmpUcode-=4;
  637.   while(tmpLength > 0) {
  638.     
  639.     // get address & value
  640.     tmpAddress = be32_to_cpup((u32*) tmpUcode); tmpUcode -=4;
  641.     tmpAddress |= 0x800000;
  642.     tmpValue = be32_to_cpup((u32*) tmpUcode); tmpUcode -=4;
  643.     
  644.     // output them
  645.     zivaDS_set_mem(instance, tmpAddress, tmpValue);
  646.     
  647.     // decrement counter
  648.     tmpLength--;
  649.   }
  650.   // loop for 50 centisecs (ish)
  651.   loopFlag = 0;
  652.   endTime = jiffies + ((50*HZ)/100);
  653.   while(jiffies < endTime) {
  654.     
  655.     // let other things in
  656.     schedule();
  657.     // check ziva state. exit if ziva is in IDLE state
  658.     if (zivaDS_get_mem(instance, ZIVADS_PROC_STATE) == 2) {
  659.       
  660.       loopFlag =1;
  661.       break;
  662.     }
  663.   }
  664.   // enable HLI interrupt
  665.   zivaDS_set_mem(instance, ZIVADS_INT_MASK, 0x80000);
  666.   
  667.   // don't know what this does
  668.   zivaDS_set_mem(instance, 0x204, 0x4);
  669.   // audio config
  670.   if (instance->zivaDSType == ZIVADS_TYPE_1) {
  671.     
  672.     // various audio parameters:
  673.     // output is encoded, IEC-958 on, L/R channels on, I2S output on L/R,
  674.     // output = 48Fs when input = 96Fs
  675.     zivaDS_set_mem(instance, ZIVADS_AUDIO_CONFIG, 0x2E);
  676.   }
  677.   else {
  678.     zivaDS_set_mem(instance, ZIVADS_AUDIO_CONFIG, 0x0E);    
  679.   }
  680.   // indicate audio config changed
  681.   zivaDS_set_mem(instance, ZIVADS_NEW_AUDIO_CONFIG, 1);
  682.   // zetup ziva audio DAC mode:
  683.   // MSB transmitted first on L/R, LRCK is high during L/R output
  684.   i = zivaDS_get_mem(instance, ZIVADS_AUDIO_DAC_MODE);
  685.   zivaDS_set_mem(instance, ZIVADS_AUDIO_DAC_MODE, i & 0xf4);
  686.   // setup ziva audio clock: frequency division = 256Fs
  687.   zivaDS_set_mem(instance, ZIVADS_AUDIO_CLOCK_SELECTION, 2);
  688.   // did it time out?
  689.   if (!loopFlag) {
  690.     
  691.     return(-ETIMEDOUT);
  692.   }
  693.   // OK
  694.   return(0);
  695. }
  696. /**
  697.  *
  698.  * Resume play (e.g. if the device is paused)
  699.  *
  700.  * @param instance instance to use
  701.  *
  702.  * @return 0 on success, <0 on failure
  703.  *
  704.  */
  705. extern int zivaDS_resume(zivaDS_t* instance)
  706. {
  707.   return(zivaDS_command(instance, 
  708. ZIVADS_CMD_RESUME, 
  709. 1,0,0,0,0,0,
  710. 0x100000,0));
  711. }
  712. /**
  713.  *
  714.  * Start play (e.g. if the device is stopped)
  715.  *
  716.  * @param instance instance to use
  717.  * @param playType ZIVADS_PLAYTYPE_NORMAL, ZIVADS_PLAYTYPE_STILLSTOP
  718.  *
  719.  * @return 0 on success, <0 on failure
  720.  *
  721.  */
  722. extern int zivaDS_play(zivaDS_t* instance, int playType)
  723. {
  724.   return(zivaDS_command(instance, 
  725. ZIVADS_CMD_PLAY, 
  726. playType+1,0,0,0,0,0,
  727. 0x100000,0));
  728. }
  729. /**
  730.  *
  731.  * Select stream
  732.  *
  733.  * @param streamType Type of stream. One of ZIVADS_STREAM_VIDEO, 
  734.  *                   ZIVADS_STREAM_SUBPICTURE, ZIVADS_STREAM_AUDIO_AC3, 
  735.  *                   ZIVADS_STREAM_AUDIO_MPEG, ZIVADS_STREAM_AUDIO_LPCM,
  736.  *                   ZIVADS_STREAM_AUDIO_5
  737.  * @param streamNumber Stream of that type to select
  738.  *
  739.  * @return 0 on success, <0 on failure
  740.  *
  741.  */
  742. extern int zivaDS_select_stream(zivaDS_t* instance, 
  743. int streamType, int streamNumber)
  744. {
  745.   if ((streamType < ZIVADS_STREAM_VIDEO) || 
  746.       (streamType > ZIVADS_STREAM_AUDIO_5)) {
  747.     
  748.     return(-EINVAL);
  749.   }
  750.   
  751.   // do it
  752.   return(zivaDS_command(instance, 
  753. ZIVADS_CMD_SELECTSTREAM,
  754. streamType, streamNumber, 0,0,0,0,
  755. 0,4));
  756. }
  757. /**
  758.  *
  759.  * Reset the Ziva
  760.  *
  761.  * @param instance instance to use
  762.  *
  763.  * @return 0 on success, <0 on failure
  764.  *
  765.  */
  766. extern int zivaDS_reset(zivaDS_t* instance)
  767. {
  768.   return(zivaDS_command(instance, 
  769. ZIVADS_CMD_RESET,
  770. 0,0,0,0,0,0,
  771. 0x800000,4));
  772. }
  773. /**
  774.  *
  775.  * Performs a new play mode command on the ziva
  776.  *
  777.  * @param instance instance to use
  778.  *
  779.  * @return 0 on success, <0 on failure
  780.  *
  781.  */
  782. extern int zivaDS_new_play_mode(zivaDS_t* instance)
  783. {
  784.   return(zivaDS_command(instance, 
  785. ZIVADS_CMD_NEWPLAYMODE, 
  786. 0,0,0,0,0,0,
  787. 0,4));
  788. }
  789. /**
  790.  *
  791.  * Sets the bitstream type
  792.  *
  793.  * @param instance instance to use
  794.  * @param type Bitstream type, one of ZIVADS_BITSTREAM_TYPE_MPEG_VOB,
  795.  * ZIVADS_BITSTREAM_TYPE_CDROM_VCD, ZIVADS_BITSTREAM_TYPE_MPEG_VCD, 
  796.  * ZIVADS_BITSTREAM_TYPE_CDDA, ZIVADS_BITSTREAM_TYPE_4
  797.  *
  798.  * @return 0 on success, <0 on failure
  799.  *
  800.  */
  801. extern int zivaDS_set_bitstream_type(zivaDS_t* instance, int type)
  802. {
  803.   int value;
  804.   // check parameters
  805.   if ((type < ZIVADS_BITSTREAM_TYPE_MPEG_VOB) || 
  806.       (type > ZIVADS_BITSTREAM_TYPE_4)) {
  807.     
  808.     return(-EINVAL);
  809.   }
  810.   
  811.   // work out REAL value
  812.   value = bitStreamTypeTable[type];
  813.   // do it
  814.   zivaDS_set_mem(instance, ZIVADS_BITSTREAM_TYPE, value);
  815.   
  816.   // OK
  817.   return(0);
  818. }
  819. /**
  820.  *
  821.  * Sets the source video frequency
  822.  *
  823.  * @param instance instance to use
  824.  * @param freq ZIVADS_SRC_VIDEO_FREQ_30, ZIVADS_SRC_VIDEO_FREQ_25
  825.  *
  826.  * @return 0 on success, <0 on failure
  827.  *
  828.  */
  829. extern int zivaDS_set_source_video_frequency(zivaDS_t* instance, int freq)
  830. {
  831.   // check parameters
  832.   if ((freq < ZIVADS_SRC_VIDEO_FREQ_30) || 
  833.       (freq > ZIVADS_SRC_VIDEO_FREQ_25)) {
  834.     
  835.     return(-EINVAL);
  836.   }
  837.   // do it
  838.   zivaDS_set_mem(instance, ZIVADS_SOURCE_TV_FORMAT, freq+1);
  839.   
  840.   // OK
  841.   return(0);
  842. }
  843. /**
  844.  *
  845.  * Setup audio DAC.
  846.  *
  847.  * @param instance ZivaDS instance to use
  848.  * @param dacMode Current Audio DAC mode
  849.  *
  850.  * @return 0 on success, <0 on failure
  851.  *
  852.  */
  853. extern int zivaDS_setup_audio_dac(zivaDS_t* instance,
  854.   int dacMode)
  855. {
  856.   int tmp;
  857.   // get the AC3 output mode
  858.   tmp = zivaDS_get_mem(instance, ZIVADS_AC3_OUTPUT_MODE);
  859.   if (tmp == 1) { // i.e. AC3 is on 1/0, C
  860.     
  861.     // output Right data on both channels
  862.     zivaDS_set_mem(instance, ZIVADS_AUDIO_DAC_MODE, dacMode | 0x20);
  863.   }
  864.   else {
  865.     // leave it as it was
  866.     zivaDS_set_mem(instance, ZIVADS_AUDIO_DAC_MODE, dacMode);
  867.   }
  868.   // OK, new audio config present
  869.   zivaDS_set_mem(instance, ZIVADS_NEW_AUDIO_CONFIG, 1);
  870.   
  871.   // OK
  872.   return(0);
  873. }
  874. /**
  875.  *
  876.  * Get the most significant 32 bits of the STC value
  877.  * this is the System time..
  878.  *
  879.  * @param instance instance to use
  880.  *
  881.  * @return Value on success, <0 on failure
  882.  *
  883.  */
  884. extern int zivaDS_get_mrc_pic_stc(zivaDS_t* instance)
  885. {
  886.   return(zivaDS_get_mem(instance, ZIVADS_MRC_PIC_STC));
  887. }
  888. /**
  889.  * 
  890.  * Get the most significant 32 bits of the PTS value
  891.  * this is the presentation time..
  892.  *
  893.  * @param instance instance to use
  894.  *
  895.  * @return Value on success, <0 on failure
  896.  *
  897.  */
  898. extern int zivaDS_get_mrc_pic_pts(zivaDS_t* instance)
  899. {
  900.   return(zivaDS_get_mem(instance, ZIVADS_MRC_PIC_PTS));
  901. }
  902. /**
  903.  * 
  904.  * Sets the IEC-958 output mode (either decoded AC3, or encoded AC3)
  905.  *
  906.  * @param instance instance to use
  907.  * @param flag (ZIVADS_IEC958_DECODED, ZIVADS_IEC958_ENCODED)
  908.  *
  909.  * @return 0 on success, <0 on failure
  910.  *
  911.  */
  912. extern int zivaDS_set_iec958_output_mode(zivaDS_t* instance, int flag)
  913. {
  914.   int tmp;
  915.   // get old value & set flags
  916.   tmp = zivaDS_get_mem(instance, ZIVADS_AUDIO_CONFIG);
  917.   if (flag == ZIVADS_IEC958_DECODED) {
  918.     
  919.     // IEC-958 off, output decoded audio on IEC-958 channel
  920.     tmp = (tmp & 0xfffffffd) | 1;
  921.   }
  922.   else {
  923.     
  924.     // IEC-958 on, output is encoded
  925.     tmp = (tmp | 2) & 0xfffffffe;
  926.   }
  927.   // set it
  928.   zivaDS_set_mem(instance, ZIVADS_AUDIO_CONFIG, tmp);
  929.   
  930.   // indicate new audio config
  931.   zivaDS_set_mem(instance, ZIVADS_NEW_AUDIO_CONFIG, 1);
  932.   // OK
  933.   return(0);
  934. }
  935.   
  936.   
  937. /**
  938.  * 
  939.  * Set the AC3 mode... probably for Karaoke... Mmmmm... how useful ;)
  940.  *
  941.  * @param instance instance to use
  942.  * @param dacMode Current Audio DAC mode
  943.  * @param param One of ZIVADS_AC3MODE_LR_STEREO, 
  944.  *                     ZIVADS_AC3MODE_LR_STEREO_PROLOGIC,
  945.  *                     ZIVADS_AC3MODE_LR_MONOR
  946.  *
  947.  * @return 0 on success, <0 on failure
  948.  *
  949.  */
  950. extern int zivaDS_set_AC3_mode(zivaDS_t* instance, 
  951.        int dacMode,
  952.        int param)
  953. {
  954.   int ac3Mode;
  955.   switch(param) {
  956.   case ZIVADS_AC3MODE_LR_STEREO:
  957.     
  958.     // 2/0, L/R
  959.     ac3Mode = 2;
  960.     break;
  961.     
  962.   case ZIVADS_AC3MODE_LR_STEREO_PROLOGIC:
  963.       
  964.     // 2/0, L/R (Dolby ProLogic)
  965.     ac3Mode = 0;
  966.     break;
  967.     
  968.   case ZIVADS_AC3MODE_LR_MONOR:
  969.     
  970.     // output right data on both channels
  971.     dacMode |= 0x20;
  972.     // 2/0, L/R
  973.     ac3Mode = 2;
  974.     break;
  975.       
  976.   default:
  977.     
  978.     return(-EINVAL);
  979.   }
  980.   
  981.   // OK, set DAC mode
  982.   zivaDS_set_mem(instance, ZIVADS_AUDIO_DAC_MODE, dacMode);
  983.   zivaDS_set_mem(instance, ZIVADS_NEW_AUDIO_CONFIG, 1);
  984.   // set AC3 mode
  985.   zivaDS_set_mem(instance, ZIVADS_AC3_OUTPUT_MODE, ac3Mode);
  986.   
  987.   // ok
  988.   return(0);
  989. }
  990. /**
  991.  * 
  992.  * Selects AC3 voice, either to NONE, or V1V2. This is for karaoke
  993.  *
  994.  * @param instance instance to use
  995.  * @param voice Voice to select (ZIVADS_AC3VOICE_NONE, ZIVADS_AC3VOICE_V1V2)
  996.  *
  997.  * @return 0 on success, <0 on failure
  998.  *
  999.  */
  1000. extern int zivaDS_select_AC3_voice(zivaDS_t* instance, int voice)
  1001. {
  1002.   int ac3Voice;
  1003.   // what should we be doing?
  1004.   if (voice == ZIVADS_AC3VOICE_NONE) {
  1005.     
  1006.     ac3Voice = 4;
  1007.   }
  1008.   else {
  1009.     
  1010.     ac3Voice = 3;
  1011.   }
  1012.   
  1013.   // set it
  1014.   zivaDS_set_mem(instance, ZIVADS_AC3_VOICE_SELECT, ac3Voice);
  1015.   // OK
  1016.   return(0);
  1017. }
  1018. /**
  1019.  *
  1020.  * Set the audio attenuation
  1021.  *
  1022.  * @param instance instance to use
  1023.  * @param attenuation The attenuation
  1024.  *
  1025.  * @return 0 on success, <0 on failure
  1026.  *
  1027.  */
  1028. extern int zivaDS_set_audio_attenuation(zivaDS_t* instance, int attenuation) 
  1029. {
  1030.   // do it
  1031.   zivaDS_set_mem(instance, ZIVADS_AUDIO_ATTENUATION, attenuation);
  1032.   // OK
  1033.   return(0);
  1034. }
  1035. /**
  1036.  *
  1037.  * Highlights a button
  1038.  *
  1039.  * @param instance zivaDS instance
  1040.  * @param button Index of button to highlight (1-36), or ZIVADS_BUTTON_NONE,
  1041.  *     ZIVADS_BUTTON_UP, ZIVADS_BUTTON_DOWN, ZIVADS_BUTTON_LEFT, 
  1042.  *     ZIVADS_BUTTON_RIGHT
  1043.  * @param action to perform on button:
  1044.  *     ZIVADS_BUTTONACTION_SELECT, ZIVADS_BUTTONACTION_UNHIGHLIGHT,
  1045.  *     ZIVADS_BUTTONACTION_ACTIVATE, ZIVADS_BUTTONACTION_ACTIVATE_SELECTED
  1046.  *
  1047.  * @return 0 on success, <0 on failure
  1048.  *
  1049.  */
  1050. extern int zivaDS_highlight(zivaDS_t* instance, int button, int action)
  1051. {
  1052.   return(zivaDS_command(instance, ZIVADS_CMD_HIGHLIGHT,
  1053. button, action, 0,0,0,0,
  1054. 0,0));
  1055. }
  1056. /**
  1057.  *
  1058.  * Waits for the current HLI interrupt to finish??
  1059.  *
  1060.  * @param instance zivaDS instance
  1061.  *
  1062.  * @return 0 on success, <0 on failure
  1063.  *
  1064.  */
  1065. extern int zivaDS_wait_for_HLI_int(zivaDS_t* instance) 
  1066. {
  1067.   zivaDS_int_src_t intSrcs;  
  1068.   int status;
  1069.   int endTime;
  1070.   int loopFlag;
  1071.   // loop for 3 centisecs (ish)
  1072.   loopFlag =0;
  1073.   endTime = jiffies + ((3*HZ)/100);
  1074.   while(jiffies < endTime) {
  1075.     
  1076.     // let other things in
  1077.     schedule();
  1078.     // check ziva state
  1079.     if (zivaDS_get_int_status(instance, &intSrcs) & 0x80000) {
  1080.       
  1081.       if (intSrcs.HLI_int_src == 0xff) {
  1082. loopFlag = 1;
  1083. break;
  1084.       }
  1085.       break;
  1086.     }
  1087.   }
  1088.   
  1089.   // did it time out?
  1090.   if (!loopFlag) {
  1091.     
  1092.     return(-ETIMEDOUT);
  1093.   }
  1094.   
  1095.   // OK
  1096.   return(0);
  1097. }
  1098.   
  1099. /**
  1100.  *
  1101.  * Sets the ziva Audio clock frequency
  1102.  *
  1103.  * @param instance ZivaDS instance
  1104.  * @param freq Frequency to set (ZIVADS_CLKFRE256 or ZIVADS_CLKFREQ384)
  1105.  *
  1106.  */
  1107. extern int zivaDS_set_audio_clock_frequency(zivaDS_t* instance, int freq) 
  1108. {
  1109.   int value;
  1110.   // get values
  1111.   switch(freq) {
  1112.   case ZIVADS_CLKFREQ256:
  1113.     
  1114.     value = 2;
  1115.     break;
  1116.   case ZIVADS_CLKFREQ384:
  1117.     
  1118.     value = 0;
  1119.     break;
  1120.   default:
  1121.     
  1122.     return(-EINVAL);
  1123.   }
  1124.   
  1125.   // set it!
  1126.   zivaDS_set_mem(instance, ZIVADS_AUDIO_CLOCK_SELECTION, value);  
  1127.   
  1128.   // OK
  1129.   return(0);
  1130. }