accessoryservices/pluggeddisplay/pluggeddisplayengine/src/edidhandler.cpp
changeset 29 e5a0aab53f3f
parent 16 ef634fd8dac3
child 35 f7565e9c9ce8
equal deleted inserted replaced
22:effbe8362efc 29:e5a0aab53f3f
    38 const TReal K16d9 = 1.778;
    38 const TReal K16d9 = 1.778;
    39 const TReal K4d3 = 1.333;
    39 const TReal K4d3 = 1.333;
    40 
    40 
    41 const TInt KDefaultCEAMode = E640x480p59_94d60Hz4d3;
    41 const TInt KDefaultCEAMode = E640x480p59_94d60Hz4d3;
    42 const TInt KDefaultCEAModeIndex = 0;
    42 const TInt KDefaultCEAModeIndex = 0;
       
    43 const TInt KDefaultDMTModeIndex = 3;
    43 
    44 
    44 // Retry Delay for EDID access
    45 // Retry Delay for EDID access
    45 const TInt KRetryDelay = 50 * 1000; // 50 milliseconds
    46 const TInt KRetryDelay = 50 * 1000; // 50 milliseconds
    46 
    47 
    47 // Maximum retry count for EDID access
    48 // Maximum retry count for EDID access
   549                     iRetryTimer.After( iStatus, KRetryDelay );
   550                     iRetryTimer.After( iStatus, KRetryDelay );
   550                     SetActive();
   551                     SetActive();
   551                     }
   552                     }
   552                 else
   553                 else
   553                     {
   554                     {
       
   555                     // No EDID data available from the sink
   554                     iRetryCounter = KErrNone;
   556                     iRetryCounter = KErrNone;
   555                     iFSM.Input( EPDEIfEDIDHandler,
   557 					ResetData();
   556                         EPDEIfEDIDHandlerEventEdidDataFetchFailed );
   558 					iFSM.Input( EPDEIfEDIDHandler, EPDEIfEDIDHandlerEventEdidDataFetched );
   557                     }
   559                     }
   558                 }
   560                 }
   559             break;
   561             break;
   560             }
   562             }
   561         case ERetryTimerRequest:
   563         case ERetryTimerRequest:
   641 //
   643 //
   642 void CEDIDHandler::FillCommonHdmiDviTimings( THdmiDviTimings& aTimings ) const
   644 void CEDIDHandler::FillCommonHdmiDviTimings( THdmiDviTimings& aTimings ) const
   643     {
   645     {
   644     FUNC_LOG;
   646     FUNC_LOG;
   645     
   647     
   646     aTimings.iTvPhysicalImageWidthMm = iEdidParserPtr->GetHorizontalScreenSize() * 10;
       
   647     aTimings.iTvPhysicalImageHeightMm = iEdidParserPtr->GetVerticalScreenSize() * 10;
       
   648     aTimings.iTvPhysicalImageAspectRatioNumerator = 0;
   648     aTimings.iTvPhysicalImageAspectRatioNumerator = 0;
   649     aTimings.iTvPhysicalImageAspectRatioDenominator = 0;
   649     aTimings.iTvPhysicalImageAspectRatioDenominator = 0;
   650     aTimings.iHorizontalBorderPixels = 0;
   650     aTimings.iHorizontalBorderPixels = 0;
   651     aTimings.iVerticalBorderLinesField1 = 0;
   651     aTimings.iVerticalBorderLinesField1 = 0;
   652     aTimings.iVerticalBorderLinesField2 = 0;
   652     aTimings.iVerticalBorderLinesField2 = 0;
   653     aTimings.iLeftBorderPixels = 0;
   653     aTimings.iLeftBorderPixels = 0;
   654     aTimings.iRightBorderPixels = 0;
   654     aTimings.iRightBorderPixels = 0;
   655     aTimings.iUnderscanEnabled = EFalse;
       
   656     
   655     
   657     if( iExtensionParserPtr )
   656     if( iExtensionParserPtr )
   658         {
   657         {
       
   658         INFO("==CEA Extension Exists");
   659         aTimings.iUnderscanEnabled = iExtensionParserPtr->Underscan();
   659         aTimings.iUnderscanEnabled = iExtensionParserPtr->Underscan();
   660         }
   660         }
       
   661 	else
       
   662 		{
       
   663         INFO("==No CEA Extension");
       
   664 		// No CEA Extension so it should be DVI
       
   665 		// Underscan supported always		
       
   666 		aTimings.iTvPhysicalImageAspectRatioNumerator = 4;
       
   667 		aTimings.iTvPhysicalImageAspectRatioDenominator = 3;
       
   668 		aTimings.iUnderscanEnabled = ETrue;
       
   669 		}
   661     
   670     
   662     if( aTimings.iUnderscanEnabled )
   671     if( aTimings.iUnderscanEnabled )
   663         {
   672         {
       
   673         INFO("==Underscan Enabled");
   664         // Underscan
   674         // Underscan
   665         aTimings.iLeftTopCorner.iX = 0;
   675         aTimings.iLeftTopCorner.iX = 0;
   666         aTimings.iLeftTopCorner.iY = 0;
   676         aTimings.iLeftTopCorner.iY = 0;
   667         aTimings.iRightBottomCorner.iX = aTimings.iHorizontalActivePixels;
   677         aTimings.iRightBottomCorner.iX = aTimings.iHorizontalActivePixels;
   668         aTimings.iRightBottomCorner.iY = aTimings.iVerticalActiveLines;
   678         aTimings.iRightBottomCorner.iY = aTimings.iVerticalActiveLines;
   669         }
   679         }
   670     else
   680     else
   671         {
   681         {
       
   682         INFO("==Underscan Disabled");
   672         // Calculate overscan
   683         // Calculate overscan
   673         CalculateOverscan( aTimings.iLeftTopCorner,
   684         CalculateOverscan( aTimings.iLeftTopCorner,
   674             aTimings.iRightBottomCorner );                
   685             aTimings.iRightBottomCorner );                
   675         }
   686         }
   676     aTimings.iTvPhysicalImageAspectRatioNumerator = iEdidParserPtr->GetAspectRatioLandscape();
       
   677     aTimings.iTvPhysicalImageAspectRatioDenominator = iEdidParserPtr->GetAspectRatioPortrait();
       
   678     aTimings.iConnector = TTvSettings::EHDMI;
   687     aTimings.iConnector = TTvSettings::EHDMI;
   679     aTimings.iTvColorCoordinates.iRed.iX = iEdidParserPtr->GetColorCoordinatesRedX();
   688 
   680     aTimings.iTvColorCoordinates.iRed.iY = iEdidParserPtr->GetColorCoordinatesRedY();
   689 	if( iEdidParserPtr )
   681     aTimings.iTvColorCoordinates.iGreen.iX = iEdidParserPtr->GetColorCoordinatesGreenX();
   690 		{
   682     aTimings.iTvColorCoordinates.iGreen.iY = iEdidParserPtr->GetColorCoordinatesGreenY();
   691 		aTimings.iTvPhysicalImageWidthMm = iEdidParserPtr->GetHorizontalScreenSize() * 10;
   683     aTimings.iTvColorCoordinates.iBlue.iX = iEdidParserPtr->GetColorCoordinatesBlueX();
   692 		aTimings.iTvPhysicalImageHeightMm = iEdidParserPtr->GetVerticalScreenSize() * 10;
   684     aTimings.iTvColorCoordinates.iBlue.iY = iEdidParserPtr->GetColorCoordinatesBlueY();
   693 	    aTimings.iTvPhysicalImageAspectRatioNumerator = iEdidParserPtr->GetAspectRatioLandscape();
   685     aTimings.iTvColorCoordinates.iWhite.iX = iEdidParserPtr->GetColorCoordinatesWhiteX();
   694 	    aTimings.iTvPhysicalImageAspectRatioDenominator = iEdidParserPtr->GetAspectRatioPortrait();
   686     aTimings.iTvColorCoordinates.iWhite.iY = iEdidParserPtr->GetColorCoordinatesWhiteY();
   695 	    aTimings.iTvColorCoordinates.iRed.iX = iEdidParserPtr->GetColorCoordinatesRedX();
   687     aTimings.iTvHdmiVersion = iEdidParserPtr->GetVersion();
   696 	    aTimings.iTvColorCoordinates.iRed.iY = iEdidParserPtr->GetColorCoordinatesRedY();
   688     aTimings.iTvHdmiRevision = iEdidParserPtr->GetRevision();
   697 	    aTimings.iTvColorCoordinates.iGreen.iX = iEdidParserPtr->GetColorCoordinatesGreenX();
       
   698 	    aTimings.iTvColorCoordinates.iGreen.iY = iEdidParserPtr->GetColorCoordinatesGreenY();
       
   699 	    aTimings.iTvColorCoordinates.iBlue.iX = iEdidParserPtr->GetColorCoordinatesBlueX();
       
   700 	    aTimings.iTvColorCoordinates.iBlue.iY = iEdidParserPtr->GetColorCoordinatesBlueY();
       
   701 	    aTimings.iTvColorCoordinates.iWhite.iX = iEdidParserPtr->GetColorCoordinatesWhiteX();
       
   702 	    aTimings.iTvColorCoordinates.iWhite.iY = iEdidParserPtr->GetColorCoordinatesWhiteY();
       
   703 	    aTimings.iTvHdmiVersion = iEdidParserPtr->GetVersion();
       
   704 	    aTimings.iTvHdmiRevision = iEdidParserPtr->GetRevision();
       
   705 		}
   689     Mem::FillZ( ( TAny* )&aTimings.iProductName, ( sizeof( TChar ) * KProductNameChars ) );
   706     Mem::FillZ( ( TAny* )&aTimings.iProductName, ( sizeof( TChar ) * KProductNameChars ) );
   690     Mem::FillZ( ( TAny* )&aTimings.iProductDescription, ( sizeof( TChar ) * KProductDescriptorsChars ) );
   707     Mem::FillZ( ( TAny* )&aTimings.iProductDescription, ( sizeof( TChar ) * KProductDescriptorsChars ) );
   691     aTimings.iSourceType = THdmiDviTimings::ESourceTypeUnknown;
   708     aTimings.iSourceType = THdmiDviTimings::ESourceTypeUnknown;
   692     }
   709     }
   693 
   710 
   859 TInt CEDIDHandler::SetDmtModes( RArray<THdmiDviTimings>& aTimings ) const
   876 TInt CEDIDHandler::SetDmtModes( RArray<THdmiDviTimings>& aTimings ) const
   860     {
   877     {
   861     FUNC_LOG;
   878     FUNC_LOG;
   862     
   879     
   863     TInt retVal(KErrNone);
   880     TInt retVal(KErrNone);
   864     
   881 
   865     // Check established timings 1 and 2
   882 	if( iDataBlockPtr )
   866     retVal = SetDmtModesFromEstablishedTimings( aTimings );
   883 		{
   867     
   884 	    // Check established timings 1 and 2
   868     if( KErrNone == retVal )
   885 	    retVal = SetDmtModesFromEstablishedTimings( aTimings );
   869         {
   886 	    
   870         // Check standard timings
   887 	    if( KErrNone == retVal )
   871         retVal = SetDmtModesFromStandardTimings( aTimings );
   888 	        {
   872         
   889 	        // Check standard timings
   873         if( KErrNone == retVal )
   890 	        retVal = SetDmtModesFromStandardTimings( aTimings );
   874             {
   891 	        
   875             // Check timing descriptors
   892 	        if( KErrNone == retVal )
   876             retVal = SetDmtModesFromTimingDescriptors( aTimings );        
   893 	            {
   877             }
   894 	            // Check timing descriptors
   878         }
   895 	            retVal = SetDmtModesFromTimingDescriptors( aTimings );        
       
   896 	            }
       
   897 	        }
       
   898 		}
       
   899 	else
       
   900 		{
       
   901 		INFO( "==No EDID available from the Sink. Setting DMT 4" );
       
   902 		// No EDID data available from the sink
       
   903 		// Default VGA resolution should be selected
       
   904 		THdmiDviTimings timings;
       
   905 		const TTimingItem* item = TimingByIndex( KDefaultDMTModeIndex, ETimingModeDMT );
       
   906 		if( item )
       
   907 			{
       
   908 			Mem::FillZ( ( TAny* )&timings, sizeof( timings ) );
       
   909 			FillHdmiDviTimings( *item, timings );
       
   910 			retVal = aTimings.Append( timings );
       
   911 			ERROR_1( retVal, "Failed to append DMT timing: %S in array", item->iTimingName );
       
   912 			}
       
   913 		else
       
   914 			{
       
   915 			ERROR_1( KErrArgument, "DMT timing item not found for VIC mode: %d", KDefaultDMTModeIndex );
       
   916 			retVal = KErrNotFound;
       
   917 			}
       
   918 		}
   879     
   919     
   880     return retVal;
   920     return retVal;
   881     }
   921     }
   882 
   922 
   883 //------------------------------------------------------------------------------
   923 //------------------------------------------------------------------------------