highlevel.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.  * Driver for the Brooktree/Rockwell/Conexant BT865 TV encoder chip
  39.  * High level convenience functions
  40.  *
  41.  */
  42. #include <linux/delay.h>
  43. #include <linux/errno.h>
  44. #include <bt865.h>
  45. /**
  46.  *
  47.  * Initialises the bt865 chip
  48.  *
  49.  * @param instance bt865 instance to use
  50.  *
  51.  */
  52. extern int bt865_init(bt865_t* instance)
  53. {
  54.   int tmp;
  55.   // reset the chip
  56.   bt865_set_reg(instance, 0xA6, 0x80);
  57.   
  58.   // set TXHS[7:0] to 0
  59.   bt865_set_reg(instance, 0xAC, 0);
  60.   // set TXHE[7:0] to 0
  61.   bt865_set_reg(instance, 0xAE, 0);
  62.   // set TXHS[10:8], TXHE[10:8], LUMADLY[1:0] to 0
  63.   bt865_set_reg(instance, 0xB0, 0);
  64.   // basically, disable teletext
  65.   bt865_set_reg(instance, 0xB2, 0);
  66.   // sets a reserved bit in register 0xBC!!!
  67.   bt865_set_reg(instance, 0xBC, 0x10);
  68.   // noninterlaced mode, setup off, among other things
  69.   bt865_set_reg(instance, 0xCC, 0x42);
  70.   // normal video mode, ESTATUS = 0
  71.   bt865_set_reg(instance, 0xCE, 2);
  72.   
  73.   // enable WSS/CGMS in second field
  74.   bt865_set_reg(instance, 0xA0, 0x80);
  75.   // OK
  76.   return(0);
  77. }
  78.   
  79.   
  80. /**
  81.  *
  82.  * Put the bt865 into PAL mode
  83.  *
  84.  * @param instance bt865 instance to use
  85.  *
  86.  * @return 0 on success, <0 on failure
  87.  *
  88.  */
  89. extern int bt865_set_PAL_mode(bt865_t* instance) 
  90. {
  91.   // PAL mode
  92.   bt865_set_reg(instance, 0xCC, 0xE4);
  93.   // but not PAL-N
  94.   bt865_set_reg(instance, 0xD0, 0);
  95.   
  96.   // OK
  97.   return(0);
  98. }
  99. /**
  100.  *
  101.  * Put the bt865 into NTSC mode
  102.  *
  103.  * @param instance bt865 instance to use
  104.  *
  105.  * @return 0 on success, <0 on failure
  106.  *
  107.  */
  108. extern int bt865_set_NTSC_mode(bt865_t* instance) 
  109. {
  110.   // NTSC mode
  111.   bt865_set_reg(instance, 0xCC, 0x80);
  112.   // turn PAL-N bit off for good measure!
  113.   bt865_set_reg(instance, 0xD0, 0);
  114.   
  115.   // OK
  116.   return(0);
  117. }
  118. /**
  119.  *
  120.  * Set the macrovision mode.
  121.  *
  122.  * @param instance bt865 instance to use
  123.  * @param macrovisionMode (one of BT865_MACROVISION_OFF, BT865_MACROVISION_1, BT865_MACROVISION_2,
  124.  *                         BT865_MACROVISION_3, BT865_MACROVISION_AGC)
  125.  * @param tvMode Current TV mode (one of BT865_PAL_MODE, or BT865_NTSC_MODE)
  126.  *
  127.  * @return 0 on success, <0 on failure
  128.  *
  129.  */
  130. extern int bt865_set_macrovision_mode(bt865_t* instance, int macrovisionMode, int tvMode)
  131. {
  132.   int tmp;
  133.   // set bt865 into normal video
  134.   bt865_set_reg(instance, 0xCE,2);
  135.   // get BT865 mode. if it's a bt864, return now, since it doesn't support macrovision
  136.   tmp = bt865_get_reg(instance, BT865_READBACK);
  137.   if (tmp != 0xa0) {
  138.     
  139.     return(0);
  140.   }
  141.   
  142.   // if we're in PAL mode, there are really only two macrovision modes (off, and mode 4)
  143.   if ((tvMode == BT865_PAL_MODE) && (macrovisionMode != BT865_MACROVISION_OFF)) {
  144.     
  145.     macrovisionMode = BT865_MACROVISION_AGC;
  146.   }
  147.   // OK, do it
  148.   switch(macrovisionMode) {
  149.   case BT865_MACROVISION_OFF:
  150.     
  151.     bt865_set_reg(instance, 0xd8, 0);
  152.     break;
  153.     
  154.   case BT865_MACROVISION_1:
  155.     
  156.     bt865_set_reg(instance, 0xd8, 0);
  157.     bt865_set_reg(instance, 0xdA, 0x60);
  158.     bt865_set_reg(instance, 0xdC, 0xF);
  159.     bt865_set_reg(instance, 0xdE, 0xF);
  160.     bt865_set_reg(instance, 0xE0, 0x0);
  161.     bt865_set_reg(instance, 0xE2, 0);
  162.     bt865_set_reg(instance, 0xE4, 0xFC);
  163.     bt865_set_reg(instance, 0xE6, 3);
  164.     bt865_set_reg(instance, 0xE8, 0xB9);
  165.     bt865_set_reg(instance, 0xEA, 0x6D);
  166.     bt865_set_reg(instance, 0xEC, 0xb6);
  167.     bt865_set_reg(instance, 0xEE, 0xd5);
  168.     bt865_set_reg(instance, 0xF0, 0xb0);
  169.     bt865_set_reg(instance, 0xF2, 0x72);
  170.     bt865_set_reg(instance, 0xF4, 0x0D);
  171.     bt865_set_reg(instance, 0xF6, 0xff);
  172.     bt865_set_reg(instance, 0xF8, 0x2c);
  173.     bt865_set_reg(instance, 0xFA, 0xd0);
  174.     bt865_set_reg(instance, 0xD8, 0x36);
  175.     break;
  176.     
  177.   case BT865_MACROVISION_2:
  178.     
  179.     bt865_set_reg(instance, 0xd8, 0);
  180.     bt865_set_reg(instance, 0xdA, 0x60);
  181.     bt865_set_reg(instance, 0xdC, 0xF);
  182.     bt865_set_reg(instance, 0xdE, 0xF);
  183.     bt865_set_reg(instance, 0xE0, 0);
  184.     bt865_set_reg(instance, 0xE2, 0);
  185.     bt865_set_reg(instance, 0xE4, 0xFC);
  186.     bt865_set_reg(instance, 0xE6, 3);
  187.     bt865_set_reg(instance, 0xE8, 0xB9);
  188.     bt865_set_reg(instance, 0xEA, 0x6D);
  189.     bt865_set_reg(instance, 0xEC, 0x3c);
  190.     bt865_set_reg(instance, 0xEE, 0xd1);
  191.     bt865_set_reg(instance, 0xF0, 0x32);
  192.     bt865_set_reg(instance, 0xF2, 0xd2);
  193.     bt865_set_reg(instance, 0xF4, 0x0D);
  194.     bt865_set_reg(instance, 0xF6, 0xff);
  195.     bt865_set_reg(instance, 0xF8, 0x2c);
  196.     bt865_set_reg(instance, 0xFA, 0xd0);
  197.     bt865_set_reg(instance, 0xD8, 0x3e);
  198.     break;
  199.   case BT865_MACROVISION_3:
  200.     
  201.     bt865_set_reg(instance, 0xd8, 0);
  202.     bt865_set_reg(instance, 0xdA, 0x60);
  203.     bt865_set_reg(instance, 0xdC, 0xF);
  204.     bt865_set_reg(instance, 0xdE, 0xF);
  205.     bt865_set_reg(instance, 0xE0, 0);
  206.     bt865_set_reg(instance, 0xE2, 0);
  207.     bt865_set_reg(instance, 0xE4, 0xFC);
  208.     bt865_set_reg(instance, 0xE6, 3);
  209.     bt865_set_reg(instance, 0xE8, 0xB9);
  210.     bt865_set_reg(instance, 0xEA, 0x6D);
  211.     bt865_set_reg(instance, 0xEC, 0xB6);
  212.     bt865_set_reg(instance, 0xEE, 0xd5);
  213.     bt865_set_reg(instance, 0xF0, 0xb0);
  214.     bt865_set_reg(instance, 0xF2, 0x72);
  215.     bt865_set_reg(instance, 0xF4, 0x0D);
  216.     bt865_set_reg(instance, 0xF6, 0xff);
  217.     bt865_set_reg(instance, 0xF8, 0x2c);
  218.     bt865_set_reg(instance, 0xFA, 0xd0);
  219.     bt865_set_reg(instance, 0xD8, 0x3e);
  220.     break;
  221.   case BT865_MACROVISION_AGC:
  222.     
  223.     bt865_set_reg(instance, 0xd8, 0);
  224.     bt865_set_reg(instance, 0xdA, 0x60);
  225.     bt865_set_reg(instance, 0xdC, 0x7E);
  226.     bt865_set_reg(instance, 0xdE, 0xFE);
  227.     bt865_set_reg(instance, 0xE0, 0x54);
  228.     bt865_set_reg(instance, 0xE2, 1);
  229.     bt865_set_reg(instance, 0xE4, 0xFF);
  230.     bt865_set_reg(instance, 0xE6, 1);
  231.     bt865_set_reg(instance, 0xE8, 0xD5);
  232.     bt865_set_reg(instance, 0xEA, 0x73);
  233.     bt865_set_reg(instance, 0xEC, 0xa8);
  234.     bt865_set_reg(instance, 0xEE, 0x62);
  235.     bt865_set_reg(instance, 0xF0, 0x55);
  236.     bt865_set_reg(instance, 0xF2, 0xa4);
  237.     bt865_set_reg(instance, 0xF4, 0x5);
  238.     bt865_set_reg(instance, 0xF6, 0x55);
  239.     bt865_set_reg(instance, 0xF8, 0x27);
  240.     bt865_set_reg(instance, 0xFA, 0x40);
  241.     bt865_set_reg(instance, 0xD8, 0x36);
  242.     break;
  243.     
  244.   default:
  245.     
  246.     return(-EINVAL);
  247.   }
  248.   
  249.   // OK
  250.   return(0);
  251. }