tvp5150a.c
上传用户:dahaojd
上传日期:2008-01-29
资源大小:14357k
文件大小:12k
源码类别:

DSP编程

开发平台:

C/C++

  1. /*
  2.  *  Copyright 2003 by Texas Instruments Incorporated.
  3.  *  All rights reserved. Property of Texas Instruments Incorporated.
  4.  *  Restricted rights to use, duplicate or disclose this code are
  5.  *  granted through contract.
  6.  *  
  7.  */
  8. /* "@(#) DDK 1.10.00.23 07-02-03 (ddk-b12)" */
  9. /**************************************************************************/
  10. /* tvp5150a.c file */
  11. /**************************************************************************/
  12. #include <std.h>
  13. #include <csl_i2c.h>      
  14. #include <csl_stdinc.h>
  15. #include <edc.h>
  16. #include "tvp5150a.h"
  17. #include "_iic.h"
  18. #include "_tvp5150a.h"
  19. typedef enum {INTERLACED = TRUE, PROGRESSIVE = FALSE} FrameType ;   
  20. static void configTVP5150A(Int decNum, TVP5150A_Mode inMode,                     
  21.     TVP5150A_Mode outMode, TVP5150A_AnalogFormat inFormat);
  22. static void configTVP5146(Int decNum, TVP5150A_Mode inMode,                     
  23.     TVP5150A_Mode outMode, TVP5150A_AnalogFormat inFormat);
  24. static void initTVP5150ADef(Uns channel);
  25. static void initTVP5146Def(Uns channel);
  26. static void powerdownTVP5150A(Int channel, Bool powerDownEnable);
  27. static void resetTVP5150A(Int channel);
  28. static void scalerReset(Uns channel);
  29. static void setTVP5150AInputFormat(Int channel, TVP5150A_AnalogFormat inFormat);
  30. static void setTVP5146InputFormat(Int channel, TVP5150A_AnalogFormat inFormat);
  31. static void setTVP5150ASyncMode(Int channel, Bool enableBT656Sync);
  32. static void setupUserDefResolution(Arg arg);
  33. static Int TVP5150A_ctrl(EDC_Handle handle, TVP5150A_Cmd cmd, Arg arg);
  34. static Int TVP5150A_close(EDC_Handle handle);
  35. static EDC_Handle TVP5150A_open(String devName, Arg optArg);
  36. EDC_Fxns TVP5150A_Fxns = {
  37.     TVP5150A_open,
  38.     TVP5150A_close,
  39.     TVP5150A_ctrl                   
  40. };
  41. static I2C_Handle hI2C[2] = {INV, INV};
  42. /*
  43.  * ======== configTVP5150A ========
  44.  */
  45. static void configTVP5150A(Int decNum, TVP5150A_Mode inMode, 
  46.         TVP5150A_Mode outMode, TVP5150A_AnalogFormat inFormat)
  47. {
  48.     initTVP5150ADef(decNum);  
  49.     setTVP5150AInputFormat(decNum, inFormat);
  50. }
  51. /*
  52.  * ======== configTVP5146 ========
  53.  */
  54. static void configTVP5146(Int decNum, TVP5150A_Mode inMode, 
  55.         TVP5150A_Mode outMode, TVP5150A_AnalogFormat inFormat)
  56. {
  57.     initTVP5146Def(decNum);  
  58.     setTVP5146InputFormat(decNum, inFormat);
  59. }
  60. /*
  61.  * ======== enableIPortOutput ========
  62.  */
  63. /*
  64. static void enableIPortOutput(Int channel, Bool iPortOutputEnable)
  65. {
  66.     _TVP5150A_settingsDef[channel].globals.iPortEnable = iPortOutputEnable;
  67.     _TVP5150A_settingsDef[channel].globals.xPortEnable = !iPortOutputEnable;
  68. }
  69. */
  70. /*
  71.  * ======== initTVP5150ADef ========
  72.  */
  73. static void initTVP5150ADef(Uns channel)
  74. {
  75.     Uint8 addrI2C;
  76. Uint8 misc_ctrl = 0x6D;
  77. Uint8 output_format = 0x47;
  78. // Uint8 input_sel = 0x01; // for svideo
  79. // Uint8 input_sel = 0x00; // for cvbs
  80. // Uint8 input_sel = 0x02;
  81. Uint8 pin_cfg = 0x00;
  82. //BY XRH
  83. Uint8 format_mask = 0xF0;
  84.     addrI2C = (channel == 0) ? _TVP5150A_IIC_ADDR0 : _TVP5150A_IIC_ADDR1;
  85. //    addrI2C = _TVP5150A_IIC_ADDR0;
  86. /* if(channel==0)
  87. input_sel = 0x0; //CVBS port1
  88. else if(channel==1)
  89. input_sel = 0x02; //CVBS port2
  90. else if(channel==2)
  91. input_sel = 0x01; //S-Video
  92. */
  93. //    _IIC_write(hI2C[0], addrI2C,0x00, &input_sel,0x1);
  94. //BY XRH, the last para is changed from 0x1 to 0x5
  95.     _IIC_write(hI2C[0], addrI2C,0x03, &misc_ctrl,0x5);
  96.     _IIC_write(hI2C[0], addrI2C,0x0D, &output_format,0x1);
  97.     _IIC_write(hI2C[0], addrI2C,0x0F, &pin_cfg,0x1);
  98. //BY XRH
  99.     _IIC_write(hI2C[0], addrI2C,0x04, &format_mask,0x1);
  100. //    _IIC_write(hI2C[channel], addrI2C,0x16, &h_start,0x1);
  101.     
  102. }
  103. /*
  104.  * ======== initTVP5150ADef ========
  105.  */
  106. static void initTVP5146Def(Uns channel)
  107. {
  108.     Uint8 addrI2C;
  109. Uint8 input_sel = 0x0C;
  110. Uint8 autoswitch = 0x3F;
  111. Uint8 pedestal = 0x40;
  112. Uint8 luminance = 0x00;
  113. Uint8 chrominance = 0x04;
  114. Uint8 output2 = 0x11;
  115. Uint8 output3 = 0xFA;
  116. Uint8 output4 = 0xAF;
  117. Uint8 output1 = 0x40;//10bit BT.656
  118. if (channel >=9 && channel <=0xC)
  119. output1 = 0x41;//20bit YCbCr with separate syn
  120.     addrI2C = _TVP5150A_IIC_ADDR1;
  121.     _IIC_write(hI2C[1], addrI2C,0x00, &input_sel,0x1);
  122.     _IIC_write(hI2C[1], addrI2C,0x04, &autoswitch,0x1);
  123.     _IIC_write(hI2C[1], addrI2C,0x06, &pedestal,0x1);
  124.     _IIC_write(hI2C[1], addrI2C,0x08, &luminance,0x1);
  125.     _IIC_write(hI2C[1], addrI2C,0x0E, &chrominance,0x1);
  126.     _IIC_write(hI2C[1], addrI2C,0x33, &output1,0x1);
  127.     _IIC_write(hI2C[1], addrI2C,0x34, &output2,0x1);
  128.     _IIC_write(hI2C[1], addrI2C,0x35, &output3,0x1);
  129.     _IIC_write(hI2C[1], addrI2C,0x36, &output4,0x1);
  130.     
  131. }
  132. /*
  133.  * ======== powerdownTVP5150A ========
  134.  */
  135. static void powerdownTVP5150A(Int channel, Bool powerDownEnable)
  136. {
  137.     Uint8 addrI2C;
  138.     Uint8 powerdownSettings = 0x01;
  139.     /*Put _TVP5150A in power down mode */
  140.     if(!powerDownEnable) {
  141.         powerdownSettings = 0x00;
  142.     }
  143.     addrI2C = (channel == 0) ? _TVP5150A_IIC_ADDR0 : _TVP5150A_IIC_ADDR1;
  144.     _IIC_write(hI2C[channel], addrI2C,0x02,&powerdownSettings,1);
  145. }
  146. /*
  147.  * ======== resetTVP5150A ========
  148.  */
  149. static void resetTVP5150A(Int channel)
  150. {
  151. /***************************************************************/
  152. /* Reset 5150 */
  153. /***************************************************************/
  154.     scalerReset(channel);
  155.     powerdownTVP5150A(channel, FALSE);
  156. }
  157. /*
  158.  * ======== scalerReset ========
  159.  */
  160. static void scalerReset(Uns channel)
  161. {
  162.     _TVP5150A_Generics *genericPtr; 
  163.     Uint8 addrI2C;
  164.     addrI2C = (channel == 0) ? _TVP5150A_IIC_ADDR0 : _TVP5150A_IIC_ADDR1;
  165.     genericPtr = &_TVP5150A_settingsDef[channel].generics;
  166.     /* reset */
  167.     genericPtr->reset = 1;
  168.     _IIC_write( hI2C[channel], addrI2C, 0x05, (Uint8 *)genericPtr + 5, 1 );
  169.     /* unreset */
  170.     genericPtr->reset = 0;
  171.     _IIC_write( hI2C[channel], addrI2C, 0x05, (Uint8 *)genericPtr + 5, 1 );
  172. }
  173. /*
  174.  * ======== setTVP5150AInputFormat ========
  175.  */
  176. static void setTVP5150AInputFormat(Int channel, TVP5150A_AnalogFormat inFormat)
  177. {
  178. //    _TVP5150A_Generics *genericPtr; 
  179.     Uint8 addrI2C;
  180. // Uint8 temp=1;
  181. Uint8 input_format = 0;
  182.     addrI2C = (channel == 0) ? _TVP5150A_IIC_ADDR0 : _TVP5150A_IIC_ADDR1;
  183. //    genericPtr = &_TVP5150A_settingsDef[channel].generics;
  184.     if(inFormat == TVP5150A_AFMT_SVIDEO) {
  185. //        _TVP5150A_settingsDef[channel].generics.svideo_sel = 1; 
  186. input_format = 1;
  187.     }    
  188.     else if(channel == 0) {
  189.      input_format = 0;
  190.     }
  191.     else if(channel == 1) {
  192.      input_format = 2;
  193.     }
  194.     
  195.     _IIC_write(hI2C[0], addrI2C, 0x0, &input_format,1);
  196. //    _IIC_write(hI2C[channel], addrI2C, 0x0, &temp,1);
  197. }
  198. /*
  199.  * ======== setTVP5146InputFormat ========
  200.  */
  201. static void setTVP5146InputFormat(Int channel, TVP5150A_AnalogFormat inFormat)
  202. {
  203. //    _TVP5150A_Generics *genericPtr; 
  204.     Uint8 addrI2C;
  205. // Uint8 temp=1;
  206. Uint8 input_format = 0x0C;
  207. //    addrI2C = (channel == 0) ? _TVP5150A_IIC_ADDR0 : _TVP5150A_IIC_ADDR1;
  208.     addrI2C = _TVP5150A_IIC_ADDR1;
  209. //    genericPtr = &_TVP5150A_settingsDef[channel].generics;
  210.     if(inFormat == TVP5150A_AFMT_SVIDEO) {
  211. //        _TVP5150A_settingsDef[channel].generics.svideo_sel = 1; 
  212. input_format = 0x46;
  213.     }    
  214.     else if(channel == 3 || channel == 9 )
  215.      input_format = 0x01;
  216.     else if(channel == 4 || channel == 0xA)
  217.      input_format = 0x05;
  218.     else if(channel == 5 || channel == 0xB)
  219.      input_format = 0x09;
  220.     else if(channel == 6 || channel == 0xC)
  221.      input_format = 0x0C;
  222.     else if(channel == 8)             
  223.      input_format = 0x84;                 //RGB
  224.     
  225.     
  226.     
  227.     _IIC_write(hI2C[1], addrI2C, 0x0, &input_format,1);
  228. //    _IIC_write(hI2C[channel], addrI2C, 0x0, &temp,1);
  229. }
  230. /*
  231.   ======== setTVP5150ASyncMode ========
  232.  */
  233. /*static void setTVP5150ASyncMode(Int channel, Bool enableBT656Sync)
  234. {
  235.     _TVP5150A_Generics *genericPtr; 
  236.     Uint8 addrI2C;
  237.     addrI2C = (channel == 0) ? _TVP5150A_IIC_ADDR0 : _TVP5150A_IIC_ADDR1;
  238.     genericPtr = &_TVP5150A_settingsDef[channel].generics;
  239.     if(enableBT656Sync) {
  240.         _TVP5150A_settingsDef[channel].generics.ycrcb_output_format = 0x07;   
  241.     } else {
  242.         _TVP5150A_settingsDef[channel].generics.ycrcb_output_format = 0;   
  243.     
  244.         
  245.     }    
  246.     _IIC_write(hI2C[channel], addrI2C,0x0D,(Uint8 *)genericPtr + 0x0D,1);
  247.     
  248. }*/
  249.  
  250. /*
  251.  * ======== setupUserDefResolution ========
  252.  */
  253. /*static void setupUserDefResolution(Arg arg)
  254. {
  255.     TVP5150A_ConfParams *TVP5150AParams = (TVP5150A_ConfParams *)arg;    
  256.     if(TVP5150AParams->outMode == TVP5150A_MODE_USER) {
  257.         outModeTbl[TVP5150A_MODE_USER][0] = TVP5150AParams->hSize;
  258.         outModeTbl[TVP5150A_MODE_USER][1] = TVP5150AParams->vSize;
  259.         outModeTbl[TVP5150A_MODE_USER][2] = TVP5150AParams->interlaced;
  260.         
  261.         
  262.     }
  263.     
  264. }*/
  265. /*
  266.  * ======== TVP5150A_close ========
  267.  */
  268. static Int TVP5150A_close(EDC_Handle handle) 
  269. {
  270.     Int devId = (int)handle;
  271.     /*First Check if the Handle is correct */
  272.     if(devId == 0 || devId == 1) {
  273.         /*Put _TVP5150A in power down mode */
  274.         powerdownTVP5150A(devId, TRUE);
  275.         return EDC_SUCCESS;    
  276.     } else {
  277.         return EDC_FAILED;
  278.     }
  279. }
  280. /*
  281.  * ======== TVP5150A_ctrl ========
  282.  */
  283. static Int TVP5150A_ctrl(EDC_Handle handle, TVP5150A_Cmd cmd, Arg arg)
  284. {
  285.     Int devId = (int)handle;                    
  286. //    _TVP5150A_Generics *genericPtr; 
  287. //    Uint8 addrI2C;
  288.     
  289. //    addrI2C = (devId == 0) ? _TVP5150A_IIC_ADDR0 : _TVP5150A_IIC_ADDR1;
  290. //    genericPtr = &_TVP5150A_settingsDef[devId].generics;
  291.     /*First Check if the Handle is correct */
  292.     if(devId > 0xC || devId < 0) {
  293.         return EDC_FAILED;
  294.     }
  295.     
  296.     switch(cmd) {
  297.         case EDC_CONFIG: {
  298.             TVP5150A_ConfParams *TVP5150AParams = (TVP5150A_ConfParams *)arg;
  299. //            hI2C[devId] = TVP5150AParams->hI2C;
  300.             hI2C[0] = TVP5150AParams->hI2C;
  301.             hI2C[1] = TVP5150AParams->hI2C;
  302. //            setupUserDefResolution(arg);
  303. if(devId==0 || devId==1 || devId==2) {
  304.              configTVP5150A(devId, TVP5150AParams->inMode, TVP5150AParams->outMode, 
  305.                  TVP5150AParams->aFmt);
  306. //             setTVP5150ASyncMode(devId, TVP5150AParams->enableBT656Sync);
  307.             }
  308.             else {
  309.              configTVP5146(devId, TVP5150AParams->inMode, TVP5150AParams->outMode, 
  310.                  TVP5150AParams->aFmt);
  311.             }
  312.         }
  313.         break;
  314.         case EDC_RESET:
  315.         resetTVP5150A(devId);
  316.         break;
  317.         case TVP5150A_POWERDOWN:
  318.         powerdownTVP5150A(devId, TRUE);
  319.         break;                 
  320.         case TVP5150A_POWERUP:
  321.         powerdownTVP5150A(devId, FALSE);
  322.         break;
  323. /*
  324.         case TVP5150A_SET_AMUXMODE:
  325.         _TVP5150A_settingsDef[devId].generics.analogMuxMode = (int)arg; 
  326. */
  327.     }
  328.     return EDC_SUCCESS;
  329. }
  330.  
  331. /*
  332.  * ======== TVP5150A_open ========
  333.  */
  334. static EDC_Handle TVP5150A_open(String devName, Arg optArg)
  335. {
  336.     Int devId;
  337.     /* Check if the addresse is correct */
  338.     if(devName[0] != '/') {
  339.         devId = -1;
  340.     } else if(devName[1] == '0') {
  341.          devId = 0; //TVP5150A CVBS port1
  342.     } else if(devName[1] == '1'){
  343.          devId = 1; //TVP5150A CVBS port2
  344.     } else if(devName[1] == '2') {
  345.       devId = 2; //TVP5150A S-Video
  346.     } else if(devName[1] == '3') {
  347.          devId = 3; //TVP5146 CVBS port1
  348.     } else if(devName[1] == '4'){
  349.          devId = 4; //TVP5146 CVBS port2
  350.     } else if(devName[1] == '5') {
  351.       devId = 5; //TVP5146 CVBS port3
  352.     } else if(devName[1] == '6') {
  353.          devId = 6; //TVP5146 CVBS port4
  354.     } else if(devName[1] == '7'){
  355.          devId = 7; //TVP5146 S-Video
  356.     } else if(devName[1] == '8') {
  357.       devId = 8; //TVP5146 RGB    
  358.     } else if(devName[1] == '9') {
  359.       devId = 9; //TVP5146 CVBS port1 20bit YCbCr with separate syn
  360.     } else if(devName[1] == 'A') {
  361.       devId = 0xA;//TVP5146 CVBS port2 20bit YCbCr with separate syn
  362.     } else if(devName[1] == 'B') {
  363.       devId = 0xB; //TVP5146 CVBS port3 20bit YCbCr with separate syn
  364.     } else if(devName[1] == 'C') {
  365.       devId = 0xC; //TVP5146 CVBS port4 20bit YCbCr with separate syn
  366.     } else {
  367.          devId = -1;
  368.     }
  369.     return (EDC_Handle)devId;
  370. }
  371. /**************************************************************************/
  372. /* End of file                                                                            */
  373. /**************************************************************************/