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

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.11.00.00 11-04-03 (ddk-b13)" */
  9. /**************************************************************************/
  10. /* saa7115.c file */
  11. /**************************************************************************/
  12. #include <std.h>
  13. #include <csl_i2c.h>      
  14. #include <csl_stdinc.h>
  15. #include <edc.h>
  16. #include <saa7115.h>
  17. #include "_iic.h"
  18. #include "_saa7115.h"
  19. typedef enum {INTERLACED = TRUE, PROGRESSIVE = FALSE} FrameType ;   
  20. static void configSAA7115(Int decNum, SAA7115_Mode inMode,                     
  21.     SAA7115_Mode outMode, SAA7115_AnalogFormat inFormat);
  22. static void enableIPortOutput(Int channel, Bool iPortOutputEnable);
  23. static void enableTask(Uns channel, Uns task, Uns enableFlag);
  24. static void initSAA7115Def(Uns channel);
  25. static void powerdownSAA7115(Int channel, Bool powerDownEnable);
  26. static void resetSAA7115(Int channel);
  27. static void scalerReset(Uns channel);
  28. static void setInOutImageSize(Uns channel, Uns inType, Uns outType);
  29. static void setNTSCScalerParameters(Uns channel,Uns task, Uns frameType);
  30. static void setScalerGlobals(Uns channel);
  31. static void setSAA7115InputFormat(Int channel, SAA7115_AnalogFormat inFormat);
  32. static void setSAA7115SyncMode(Int channel, Bool enableBT656Sync);
  33. static void setupUserDefResolution(Arg arg);
  34. static Int SAA7115_ctrl(EDC_Handle handle, SAA7115_Cmd cmd, Arg arg);
  35. static Int SAA7115_close(EDC_Handle handle);
  36. static EDC_Handle SAA7115_open(String devName, Arg optArg);
  37. EDC_Fxns SAA7115_Fxns = {
  38.     SAA7115_open,
  39.     SAA7115_close,
  40.     SAA7115_ctrl                   
  41. };
  42. static I2C_Handle hI2C[2] = {INV, INV};
  43. static const Int inModeTbl[2][5] = {
  44.     {240, 0x11, 0x01, 0, 1},/* NTSC */
  45.     {288, 0x15, 0x35, 0, 1} /* PAL  */
  46. };
  47. static Int outModeTbl[9][3] = {
  48.     {640, 480, INTERLACED},/* NTSC640 */
  49.     {720, 480, INTERLACED},/* NTSC720 */
  50.     {720, 576, INTERLACED},/* PAL720  */
  51.     {768, 576, INTERLACED},/* PAL768  */
  52.     {352, 288, INTERLACED},/* CIF    */
  53.     {176, 144, INTERLACED},/* QCIF   */
  54.     {128, 96,  INTERLACED},/* SQCIF  */
  55.     {320, 240, INTERLACED},/* SIF    */ 
  56.     {480, 480, INTERLACED} /* USER DEFINED */
  57. };
  58. /*
  59.  * ======== configSAA7115 ========
  60.  */
  61. static void configSAA7115(Int decNum, SAA7115_Mode inMode, 
  62.         SAA7115_Mode outMode, SAA7115_AnalogFormat inFormat)
  63. {
  64.     initSAA7115Def(decNum);  
  65.     setInOutImageSize(decNum,inMode,outMode);
  66.     setSAA7115InputFormat(decNum, inFormat);
  67. }
  68. /*
  69.  * ======== enableIPortOutput ========
  70.  */
  71. static void enableIPortOutput(Int channel, Bool iPortOutputEnable)
  72. {
  73.     _SAA7115_settingsDef[channel].globals.iPortEnable = iPortOutputEnable;
  74.     _SAA7115_settingsDef[channel].globals.xPortEnable = !iPortOutputEnable;
  75. }
  76. /*
  77.  * ======== enableTask ========
  78.  */
  79. static void enableTask(Uns channel, Uns task, Uns enableFlag)
  80. {
  81.     _SAA7115_Globals *globalPtr;
  82.     Uint8 addrI2C;
  83.     addrI2C = (channel == 0) ? _SAA7115_IIC_ADDR0 : _SAA7115_IIC_ADDR1;
  84.     globalPtr = &_SAA7115_settingsDef[channel].globals;
  85.     if(task == _SAA7115_TASKA) {
  86.         globalPtr->taskAEnable = enableFlag;
  87.     }else {
  88.         globalPtr->taskBEnable = enableFlag;
  89.     }   
  90.     _IIC_write(hI2C[channel], addrI2C,0x80,(Uint8 *)globalPtr,1);
  91. }
  92. /*
  93.  * ======== initSAA7115Def ========
  94.  */
  95. static void initSAA7115Def(Uns channel)
  96. {
  97.     _SAA7115_Generics *genericPtr; 
  98.     Uint8 addrI2C;
  99.     addrI2C = (channel == 0) ? _SAA7115_IIC_ADDR0 : _SAA7115_IIC_ADDR1;
  100.     genericPtr = &_SAA7115_settingsDef[channel].generics;
  101.     _IIC_write(hI2C[channel], addrI2C,1,(Uint8 *)genericPtr + 1,29);
  102.     _IIC_write(hI2C[channel], addrI2C,0x30,(Uint8 *)genericPtr + 0x30,0x30);
  103.     _IIC_write(hI2C[channel], addrI2C,0xF0,(Uint8 *)genericPtr + 0xF0,0x10);
  104.     setScalerGlobals(channel);
  105. }
  106. /*
  107.  * ======== powerdownSAA7115 ========
  108.  */
  109. static void powerdownSAA7115(Int channel, Bool powerDownEnable)
  110. {
  111.     Uint8 addrI2C;
  112.     Uint8 powerdownSettings = 0x0d;
  113.     /*Put _SAA7115 in power down mode */
  114.     if(!powerDownEnable) {
  115.         powerdownSettings = 0xf0;
  116.     }
  117.     addrI2C = (channel == 0) ? _SAA7115_IIC_ADDR0 : _SAA7115_IIC_ADDR1;
  118.     _IIC_write(hI2C[channel], addrI2C,0x88,&powerdownSettings,1);
  119. }
  120. /*
  121.  * ======== resetSAA7115 ========
  122.  */
  123. static void resetSAA7115(Int channel)
  124. {
  125. /***************************************************************/
  126. /* Reset 7115 */
  127. /***************************************************************/
  128.     scalerReset(channel);
  129.     powerdownSAA7115(channel, FALSE);
  130. }
  131. /*
  132.  * ======== scalerReset ========
  133.  */
  134. static void scalerReset(Uns channel)
  135. {
  136.     _SAA7115_Globals *globalPtr;
  137.     Uint8 addrI2C;
  138.     addrI2C = (channel == 0) ? _SAA7115_IIC_ADDR0 : _SAA7115_IIC_ADDR1;
  139.     globalPtr = &_SAA7115_settingsDef[channel].globals;
  140.     /* reset */
  141.     globalPtr->resetScaler = 0;
  142.     _IIC_write( hI2C[channel], addrI2C, 0x88, (Uint8 *)globalPtr + 8, 1 );
  143.     /* unreset */
  144.     globalPtr->resetScaler = 1;
  145.     _IIC_write( hI2C[channel], addrI2C, 0x88, (Uint8 *)globalPtr + 8, 1 );
  146. }
  147. /*
  148.  * ======== setInOutImageSize ========
  149.  */
  150. static void setInOutImageSize(Uns channel, Uns inType, Uns outType)
  151. {
  152.     _SAA7115_Task *taskPtr;
  153.     _SAA7115_Generics *genericPtr; 
  154.     Uns pixelsInput,linesInput,pixelsOutput,linesOutput;
  155.     Int frameType;
  156.     Uns scalerFlag;
  157.     Uns xOffset = 8;
  158.     Uns yOffset = 15;
  159.     Uint8 addrI2C;
  160.     Int index;
  161.     
  162.     pixelsInput = 720; 
  163.     addrI2C = (channel == 0) ? _SAA7115_IIC_ADDR0 : _SAA7115_IIC_ADDR1;
  164.     index = (inType == SAA7115_MODE_NTSC720) ? 0 : 1;
  165.     linesInput = inModeTbl[index][0];
  166.     _SAA7115_settingsDef[channel].generics.vGateStart = inModeTbl[index][1];
  167.     _SAA7115_settingsDef[channel].generics.vGateStop = inModeTbl[index][2];
  168.     _SAA7115_settingsDef[channel].generics.vGateStartMsb = inModeTbl[index][3];
  169.     _SAA7115_settingsDef[channel].generics.vGateStopMsb = inModeTbl[index][4];                      
  170.     
  171.     genericPtr = &_SAA7115_settingsDef[channel].generics;
  172.     _IIC_write(hI2C[channel], addrI2C,0x15,(Uint8 *)genericPtr + 0X15, 3);
  173.     index = outType;
  174.     
  175.     pixelsOutput = outModeTbl[index][0];
  176.     linesOutput = outModeTbl[index][1];
  177.     frameType = outModeTbl[index][2];
  178.     scalerFlag = TRUE;
  179.     if(pixelsInput == pixelsOutput) {
  180.         if (frameType == INTERLACED){
  181.             if (linesInput == linesOutput / 2){
  182.                 scalerFlag = FALSE;          
  183.             }
  184.         }
  185.         else if (linesInput == linesOutput){
  186.             scalerFlag = FALSE;
  187.         }
  188.     }
  189.     if(scalerFlag == TRUE) {
  190.         /* enable I-port output but disable X-port output */
  191.         _SAA7115_settingsDef[channel].globals.iPortEnable = 1;
  192.         _SAA7115_settingsDef[channel].globals.xPortEnable = 0;
  193.     }
  194.     taskPtr = &_SAA7115_settingsDef[channel].taskA;
  195.     taskPtr->xInputOffset = xOffset;
  196.     taskPtr->yInputOffset = yOffset;
  197.     taskPtr->xInputLength = pixelsInput;
  198.     taskPtr->yInputLength = linesInput;
  199.     taskPtr->xOutputLength = pixelsOutput;
  200.     if(frameType == INTERLACED){
  201.         taskPtr->yOutputLength = linesOutput / 2;
  202.     }else{
  203.         taskPtr->yOutputLength = linesOutput;
  204.     }
  205.     setNTSCScalerParameters(channel,_SAA7115_TASKA, frameType);
  206.     enableTask(channel,_SAA7115_TASKA, TRUE);
  207.     taskPtr = &_SAA7115_settingsDef[channel].taskB;
  208.     taskPtr->xInputOffset = xOffset;
  209.     taskPtr->yInputOffset = yOffset;
  210.     taskPtr->xInputLength = pixelsInput;
  211.     taskPtr->yInputLength = linesInput;
  212.     taskPtr->xOutputLength = pixelsOutput;
  213.     if(frameType == INTERLACED){
  214.         taskPtr->yOutputLength = linesOutput / 2;
  215.     }else{
  216.         taskPtr->yOutputLength = linesOutput;
  217.     }
  218.     setNTSCScalerParameters(channel,_SAA7115_TASKB, frameType);
  219.     enableTask(channel,_SAA7115_TASKB, TRUE);
  220.     
  221. }
  222. /*
  223.  * ======== setNTSCScalerParameters ========
  224.  */
  225. static void setNTSCScalerParameters(Uns channel,Uns task, Uns frameType)
  226. {
  227.     Uns i,xRatio,firLuma,firChroma,xLumaInc;
  228.     Uns saturation,yRatio,lpiMode,yLumaInc;
  229.     _SAA7115_Regs *regPtr;
  230.     _SAA7115_Task *taskPtr;
  231.     Uint8 addrI2C;
  232.     
  233.     addrI2C = (channel == 0) ? _SAA7115_IIC_ADDR0 : _SAA7115_IIC_ADDR1;
  234.     regPtr = (_SAA7115_Regs *)&_SAA7115_settingsDef[channel];
  235.     if(task == _SAA7115_TASKA){
  236.         taskPtr = &_SAA7115_settingsDef[channel].taskA;
  237.     }
  238.     else{
  239.         taskPtr = &_SAA7115_settingsDef[channel].taskB;
  240.     }
  241.     taskPtr->xPreScale = taskPtr->xInputLength / taskPtr->xOutputLength;
  242.     if(taskPtr->xPreScale == 0){
  243.         taskPtr->xPreScale = 1; 
  244.     }
  245.     else if(taskPtr->xPreScale > 63){
  246.         taskPtr->xPreScale = 63;     
  247.     }
  248.     taskPtr->xAccLength = _SAA7115_xScale.xValues[taskPtr->xPreScale].acl;
  249.     xRatio = 100 * taskPtr->xInputLength;
  250.     xRatio /= taskPtr->xOutputLength;
  251.     if(xRatio > 275){
  252.         firLuma = 3; 
  253.     }else if(xRatio > 200){
  254.         firLuma = 2;      
  255.     }else if(xRatio >= 170){
  256.         firLuma = 1;        
  257.     }else{
  258.         firLuma = 0;
  259.     }
  260.     firChroma = firLuma;
  261.     taskPtr->xACLWeighting = _SAA7115_xScale.xValues[taskPtr->xPreScale].c21;
  262.     taskPtr->scalerDCGain = _SAA7115_xScale.xValues[taskPtr->xPreScale].dcGain;
  263.     taskPtr->yPreFilterType = firLuma;
  264.     taskPtr->cxPreFilterType = firChroma;
  265.     xLumaInc = 1024 * taskPtr->xInputLength;
  266.     xLumaInc /= taskPtr->xOutputLength;
  267.     xLumaInc /= taskPtr->xPreScale;
  268.     if(xLumaInc > 0x1FFF){
  269.         xLumaInc = 0x1FFF;
  270.     }
  271.     yRatio = 100 * taskPtr->yInputLength;
  272.     yRatio /= taskPtr->yOutputLength;
  273.     taskPtr->brightness = 0x80;
  274.     if(yRatio < 125){
  275.         lpiMode = 0;
  276.         taskPtr->contrast = 64;
  277.         taskPtr->saturation = 64;
  278.     }else{
  279.         lpiMode = 1;
  280.         saturation = 64 * taskPtr->yOutputLength;
  281.         saturation /= taskPtr->yInputLength;
  282.         taskPtr->contrast = (Uint8)saturation;
  283.         taskPtr->saturation = (Uint8)saturation;
  284.     }
  285.     taskPtr->xLumaIncrement = xLumaInc;
  286.     taskPtr->xChromaIncrement = xLumaInc / 2;
  287.     taskPtr->xLumaPhaseOffset = 0;
  288.     taskPtr->xChromaPhaseOffset = 0;
  289.     yLumaInc = 1024 * taskPtr->yInputLength;
  290.     yLumaInc /= taskPtr->yOutputLength;
  291.     if(yLumaInc > 0xFFFF){
  292.         yLumaInc = 0xFFFF;
  293.     }
  294.     taskPtr->yLumaIncrement = yLumaInc;
  295.     taskPtr->yChromaIncrement = yLumaInc;
  296.     taskPtr->verticalScalingType = lpiMode;
  297.     for(i = 0; i < 4; i ++){
  298.         taskPtr->yLumaPhaseOffset[i] = 0;
  299.         taskPtr->yChromaPhaseOffset[i] = 0;
  300.     }
  301.     if(frameType == INTERLACED){
  302.         taskPtr->eventTrigger = 1;
  303.     }
  304.     else {
  305.         if(taskPtr == &regPtr->taskA){
  306.             taskPtr->eventTrigger = 2;
  307.         }else{
  308.             taskPtr->eventTrigger = 3;
  309.         }         
  310.     }
  311.     if(task == _SAA7115_TASKA){
  312.         _IIC_write(hI2C[channel], addrI2C,0x90,(Uint8 *)taskPtr,0x30);  
  313.     }
  314.     else {
  315.         _IIC_write(hI2C[channel], addrI2C,0xC0,(Uint8 *)taskPtr,0x30);  
  316.     }
  317. }
  318. /*
  319.  * ======== setScalerGlobals ========
  320.  */
  321. static void setScalerGlobals(Uns channel)
  322. {
  323.     _SAA7115_Globals *globalPtr;
  324.     Uint8 addrI2C;
  325.     addrI2C = (channel == 0) ? _SAA7115_IIC_ADDR0 : _SAA7115_IIC_ADDR1;
  326.     globalPtr = &_SAA7115_settingsDef[channel].globals;
  327.     _IIC_write(hI2C[channel], addrI2C,0x80,(Uint8 *)globalPtr,9);
  328. }
  329. /*
  330.  * ======== setSAA7115InputFormat ========
  331.  */
  332. static void setSAA7115InputFormat(Int channel, SAA7115_AnalogFormat inFormat)
  333. {
  334.     _SAA7115_Generics *genericPtr; 
  335.     Uint8 addrI2C;
  336.     addrI2C = (channel == 0) ? _SAA7115_IIC_ADDR0 : _SAA7115_IIC_ADDR1;
  337.     genericPtr = &_SAA7115_settingsDef[channel].generics;
  338.     if(inFormat == SAA7115_AFMT_SVIDEO) {
  339.         _SAA7115_settingsDef[channel].generics.analogMuxMode = 7; 
  340.         _SAA7115_settingsDef[channel].generics.bypassYCombFilter = 1; 
  341.         _SAA7115_settingsDef[channel].generics.yCombFilter = 0;
  342.     }    
  343.     else {
  344.         _SAA7115_settingsDef[channel].generics.analogMuxMode = channel; 
  345.         _SAA7115_settingsDef[channel].generics.bypassYCombFilter = 0; 
  346.         _SAA7115_settingsDef[channel].generics.yCombFilter = 1;
  347.     }
  348.     _IIC_write(hI2C[channel], addrI2C, 0x2,(Uint8 *)genericPtr + 2,1);
  349.     _IIC_write(hI2C[channel], addrI2C, 0x9,(Uint8 *)genericPtr + 9,1);
  350. }
  351. /*
  352.  * ======== setSAA7115SyncMode ========
  353.  */
  354. static void setSAA7115SyncMode(Int channel, Bool enableBT656Sync)
  355. {
  356.     _SAA7115_Task *taskPtrA, *taskPtrB;
  357.     _SAA7115_Generics *genericPtr; 
  358.     Uint8 addrI2C;
  359.     addrI2C = (channel == 0) ? _SAA7115_IIC_ADDR0 : _SAA7115_IIC_ADDR1;
  360.     genericPtr = &_SAA7115_settingsDef[channel].generics;
  361.     taskPtrA = &_SAA7115_settingsDef[channel].taskA;
  362.     taskPtrB = &_SAA7115_settingsDef[channel].taskB;
  363.     if(enableBT656Sync) {
  364.         _SAA7115_settingsDef[channel].taskA.ccir656Enable = 1;
  365.         _SAA7115_settingsDef[channel].taskB.ccir656Enable = 1;
  366.         _SAA7115_settingsDef[channel].generics.ofts = 0;   
  367.         _SAA7115_settingsDef[channel].generics.ofts3 = 0;
  368.     } else {
  369.         _SAA7115_settingsDef[channel].taskA.ccir656Enable = 0;
  370.         _SAA7115_settingsDef[channel].taskB.ccir656Enable = 0;
  371.         _SAA7115_settingsDef[channel].generics.ofts = 2;   
  372.         _SAA7115_settingsDef[channel].generics.ofts3 = 0;
  373.     
  374.         
  375.     }    
  376.     _IIC_write(hI2C[channel], addrI2C,0x93,(Uint8 *)taskPtrA + 3,1);
  377.     _IIC_write(hI2C[channel], addrI2C,0xc3,(Uint8 *)taskPtrB + 3,1);
  378.     _IIC_write(hI2C[channel], addrI2C,0x13,(Uint8 *)genericPtr + 0x13, 1);
  379.     _IIC_write(hI2C[channel], addrI2C,0x1b,(Uint8 *)genericPtr + 0x1b, 1);
  380.     
  381. }
  382.  
  383. /*
  384.  * ======== setupUserDefResolution ========
  385.  */
  386. static void setupUserDefResolution(Arg arg)
  387. {
  388.     SAA7115_ConfParams *saa7115Params = (SAA7115_ConfParams *)arg;    
  389.     if(saa7115Params->outMode == SAA7115_MODE_USER) {
  390.         outModeTbl[SAA7115_MODE_USER][0] = saa7115Params->hSize;
  391.         outModeTbl[SAA7115_MODE_USER][1] = saa7115Params->vSize;
  392.         outModeTbl[SAA7115_MODE_USER][2] = saa7115Params->interlaced;
  393.         
  394.         
  395.     }
  396.     
  397. }
  398. /*
  399.  * ======== SAA7115_close ========
  400.  */
  401. static Int SAA7115_close(EDC_Handle handle) 
  402. {
  403.     Int devId = (int)handle;
  404.     /*First Check if the Handle is correct */
  405.     if(devId == 0 || devId == 1) {
  406.         /*Put _SAA7115 in power down mode */
  407.         powerdownSAA7115(devId, TRUE);
  408.         return EDC_SUCCESS;    
  409.     } else {
  410.         return EDC_FAILED;
  411.     }
  412. }
  413. /*
  414.  * ======== SAA7115_ctrl ========
  415.  */
  416. static Int SAA7115_ctrl(EDC_Handle handle, SAA7115_Cmd cmd, Arg arg)
  417. {
  418.     Int devId = (int)handle;                    
  419.     _SAA7115_Generics *genericPtr; 
  420.     Uint8 addrI2C;
  421.     
  422.     addrI2C = (devId == 0) ? _SAA7115_IIC_ADDR0 : _SAA7115_IIC_ADDR1;
  423.     genericPtr = &_SAA7115_settingsDef[devId].generics;
  424.     /*First Check if the Handle is correct */
  425.     if(devId != 0 && devId != 1) {
  426.         return EDC_FAILED;
  427.     }
  428.     
  429.     switch(cmd) {
  430.         case EDC_CONFIG: {
  431.             SAA7115_ConfParams *saa7115Params = (SAA7115_ConfParams *)arg;
  432.             hI2C[devId] = saa7115Params->hI2C;
  433.             enableIPortOutput(devId, saa7115Params->enableIPortOutput);
  434.             setupUserDefResolution(arg);
  435.             configSAA7115(devId, saa7115Params->inMode, saa7115Params->outMode, 
  436.                 saa7115Params->aFmt);
  437.             setSAA7115SyncMode(devId, saa7115Params->enableBT656Sync);
  438.         }
  439.         break;
  440.         case EDC_RESET:
  441.         resetSAA7115(devId);
  442.         break;
  443.         case SAA7115_POWERDOWN:
  444.         powerdownSAA7115(devId, TRUE);
  445.         break;                 
  446.         case SAA7115_POWERUP:
  447.         powerdownSAA7115(devId, FALSE);
  448.         break;
  449.         case SAA7115_SET_AMUXMODE:
  450.         _SAA7115_settingsDef[devId].generics.analogMuxMode = (int)arg; 
  451.         if((int)arg >= 6) {/* svideo input */
  452.             _SAA7115_settingsDef[devId].generics.bypassYCombFilter = 1; 
  453.            _SAA7115_settingsDef[devId].generics.yCombFilter = 0;
  454.         }else {
  455.             _SAA7115_settingsDef[devId].generics.bypassYCombFilter = 0;         
  456.            _SAA7115_settingsDef[devId].generics.yCombFilter = 1;
  457.         }
  458.         _IIC_write(hI2C[0], addrI2C,0x2,(Uint8 *)genericPtr + 2,1);
  459.         _IIC_write(hI2C[0], addrI2C,0x9,(Uint8 *)genericPtr + 9,1);
  460.         break;
  461.     }
  462.     return EDC_SUCCESS;
  463. }
  464.  
  465. /*
  466.  * ======== SAA7115_open ========
  467.  */
  468. static EDC_Handle SAA7115_open(String devName, Arg optArg)
  469. {
  470.     Int devId;
  471.     /* Check if the addresse is correct */
  472.     if(devName[0] != '/') {
  473.         devId = -1;
  474.     } else if(devName[1] == '0') {
  475.          devId = 0;
  476.     } else if(devName[1] == '1'){
  477.          devId = 1;
  478.     } else {
  479.          devId = -1;
  480.     }
  481.     return (EDC_Handle)devId;
  482. }
  483. /**************************************************************************/
  484. /* End of file                                                                            */
  485. /**************************************************************************/