accessoryservices/pluggeddisplay/pluggeddisplayengine/src/edidhandler.cpp
branchGCC_SURGE
changeset 49 00076e39386f
parent 45 c6215323ad55
child 54 072a9626b290
--- a/accessoryservices/pluggeddisplay/pluggeddisplayengine/src/edidhandler.cpp	Wed Jun 23 22:58:50 2010 +0100
+++ b/accessoryservices/pluggeddisplay/pluggeddisplayengine/src/edidhandler.cpp	Thu Jul 22 16:45:41 2010 +0100
@@ -40,6 +40,7 @@
 
 const TInt KDefaultCEAMode = E640x480p59_94d60Hz4d3;
 const TInt KDefaultCEAModeIndex = 0;
+const TInt KDefaultDMTModeIndex = 3;
 
 // Retry Delay for EDID access
 const TInt KRetryDelay = 50 * 1000; // 50 milliseconds
@@ -124,9 +125,6 @@
     RArray<TTvSettings> analogConfigs;
     RArray<THdmiDviTimings> hdmiConfigs;
     
-    // Update overscan values from cenrep
-    UpdateOverscanValues();
-
     // Set video parameters
     INFO( "--------------------------------------------------------------------" );
     INFO( "SETTING CEA AND DMT TIMINGS:" );
@@ -176,6 +174,9 @@
     iEdidParserPtr = NULL;
     delete iExtensionParserPtr;
     iExtensionParserPtr = NULL;
+
+	iCurrentBlock = 0;
+	inbrOfExtensions = 0;
     }
 
 //------------------------------------------------------------------------------
@@ -518,26 +519,81 @@
         {
         case EDdcReadRequest:
             {
-            if( KErrNone == iStatus.Int() )
-                {
-                TPtrC8
-                    dataBlockDes( iDataBlockPtr->iDataBlock, sizeof( *iDataBlockPtr ) );
-                iEdidParserPtr = CEdidParserBase::NewL( dataBlockDes );
-                TInt nbrOfExtensions = iEdidParserPtr->GetNumberOfExtensions();
-                for( TInt i = 0; i < nbrOfExtensions; ++i )
-                    {
-                    if( ECea861Ext == iEdidParserPtr->GetExtensionType( i + 1 ) )
-                        {
-                        INFO_1( "ECea861Ext extension data block number: %d", ( i+1 ) );
-                        iExtensionParserPtr
-                            = iEdidParserPtr->CreateCea861ExtensionParserL( i + 1 );
-                        break;
-                        }
-                    }
-                INFO_1( "Data block count in nbrOfExtensions: %d", nbrOfExtensions );
-                iFSM.Input( EPDEIfEDIDHandler, EPDEIfEDIDHandlerEventEdidDataFetched );
-                iRetryCounter = KErrNone;
-                }
+			if( KErrNone == iStatus.Int() )
+				{				
+				if( iCurrentBlock == 0 )
+					{
+					TPtrC8 dataBlockDes( iDataBlockPtr->iDataBlock, sizeof( *iDataBlockPtr ) );
+					
+					iEdidParserPtr = CEdidParserBase::NewL( dataBlockDes );
+					inbrOfExtensions = iEdidParserPtr->GetNumberOfExtensions();
+
+					INFO_1( "No. of extensions from Block 0: %d", inbrOfExtensions );
+
+					if( inbrOfExtensions )
+						{
+						inbrOfExtensions--;
+						}
+ 					}
+				else
+					{
+					TPtrC8 dataBlockDes( iDataBlockPtr->iDataBlock, sizeof( *iDataBlockPtr ) );
+
+					INFO_1( "Updating the Rawdata for the Block %d...", iCurrentBlock );
+					iEdidParserPtr->UpdateRawDataL(dataBlockDes);
+					
+					iCurrentBlock++;
+					if( inbrOfExtensions >= 2 )
+						{
+ 						inbrOfExtensions = inbrOfExtensions - 2;
+						}
+					else
+						{
+						inbrOfExtensions--;
+						}
+  					}
+
+				if( inbrOfExtensions )
+					{
+					iRetryCounter = KErrNone;
+					
+					if( ReadEDIDDataL() != KErrNone )
+						{
+						ResetData();
+						iFSM.Input( EPDEIfEDIDHandler, EPDEIfEDIDHandlerEventEdidDataFetchFailed );
+						}
+					}
+				else
+					{
+					TInt extensions = iEdidParserPtr->GetNumberOfExtensions();
+
+					INFO_1( "No. of extensions from Block 0: %d", extensions );
+					
+					for( TInt i = 0; i < extensions; ++i )
+						{
+						if( ECea861Ext == iEdidParserPtr->GetExtensionType( i + 1 ) )
+							{
+							INFO_1( "ECea861Ext extension data block number: %d", ( i+1 ) );
+							if( !iExtensionParserPtr )
+								{
+								INFO( "First CEA 861 extension is being read..." );
+								iExtensionParserPtr
+									= iEdidParserPtr->CreateCea861ExtensionParserL( i + 1 );
+								}
+							else
+								{
+								INFO_1( "CEA 861 extension is being read... at the index %d", i+1 );
+								iEdidParserPtr->UpdateCea861ExtensionL( i + 1, iExtensionParserPtr );
+								}
+ 							}
+						}
+					}
+
+				TRACE_EDID_DATA( *iEdidParserPtr );
+				
+				iFSM.Input( EPDEIfEDIDHandler, EPDEIfEDIDHandlerEventEdidDataFetched );
+				iRetryCounter = KErrNone;
+				}
             else
                 {
                 INFO_1( "CDdcPortAccess::Read failed, error code: %d", iStatus.Int() );
@@ -551,9 +607,10 @@
                     }
                 else
                     {
+                    // No EDID data available from the sink
                     iRetryCounter = KErrNone;
-                    iFSM.Input( EPDEIfEDIDHandler,
-                        EPDEIfEDIDHandlerEventEdidDataFetchFailed );
+					ResetData();
+					iFSM.Input( EPDEIfEDIDHandler, EPDEIfEDIDHandlerEventEdidDataFetched );
                     }
                 }
             break;
@@ -623,8 +680,19 @@
         {
         iDataBlockPtr = new(ELeave) TDataBlock;
         }
+	else if( inbrOfExtensions )
+		{
+		if( iDataBlockPtr )
+			{
+			delete iDataBlockPtr;
+			iDataBlockPtr = NULL;
+			}
+		iDataBlockPtr = new(ELeave) TDataBlock;
+		}
+
+	INFO_1( "Reading EDID block %d...", iCurrentBlock );
     
-    retVal = iDdcPortAccess->Read( EMonitorPort, 0, // First block contains EDID data if that exists
+    retVal = iDdcPortAccess->Read( EMonitorPort, iCurrentBlock, // First block contains EDID data if that exists
         iDataBlockPtr->iDataBlock,
         iStatus );
         
@@ -643,8 +711,6 @@
     {
     FUNC_LOG;
     
-    aTimings.iTvPhysicalImageWidthMm = iEdidParserPtr->GetHorizontalScreenSize() * 10;
-    aTimings.iTvPhysicalImageHeightMm = iEdidParserPtr->GetVerticalScreenSize() * 10;
     aTimings.iTvPhysicalImageAspectRatioNumerator = 0;
     aTimings.iTvPhysicalImageAspectRatioDenominator = 0;
     aTimings.iHorizontalBorderPixels = 0;
@@ -652,15 +718,25 @@
     aTimings.iVerticalBorderLinesField2 = 0;
     aTimings.iLeftBorderPixels = 0;
     aTimings.iRightBorderPixels = 0;
-    aTimings.iUnderscanEnabled = EFalse;
     
     if( iExtensionParserPtr )
         {
+        INFO("==CEA Extension Exists");
         aTimings.iUnderscanEnabled = iExtensionParserPtr->Underscan();
         }
+	else
+		{
+        INFO("==No CEA Extension");
+		// No CEA Extension so it should be DVI
+		// Underscan supported always		
+		aTimings.iTvPhysicalImageAspectRatioNumerator = 4;
+		aTimings.iTvPhysicalImageAspectRatioDenominator = 3;
+		aTimings.iUnderscanEnabled = ETrue;
+		}
     
     if( aTimings.iUnderscanEnabled )
         {
+        INFO("==Underscan Enabled");
         // Underscan
         aTimings.iLeftTopCorner.iX = 0;
         aTimings.iLeftTopCorner.iY = 0;
@@ -669,23 +745,30 @@
         }
     else
         {
+        INFO("==Underscan Disabled");
         // Calculate overscan
         CalculateOverscan( aTimings.iLeftTopCorner,
             aTimings.iRightBottomCorner );                
         }
-    aTimings.iTvPhysicalImageAspectRatioNumerator = iEdidParserPtr->GetAspectRatioLandscape();
-    aTimings.iTvPhysicalImageAspectRatioDenominator = iEdidParserPtr->GetAspectRatioPortrait();
     aTimings.iConnector = TTvSettings::EHDMI;
-    aTimings.iTvColorCoordinates.iRed.iX = iEdidParserPtr->GetColorCoordinatesRedX();
-    aTimings.iTvColorCoordinates.iRed.iY = iEdidParserPtr->GetColorCoordinatesRedY();
-    aTimings.iTvColorCoordinates.iGreen.iX = iEdidParserPtr->GetColorCoordinatesGreenX();
-    aTimings.iTvColorCoordinates.iGreen.iY = iEdidParserPtr->GetColorCoordinatesGreenY();
-    aTimings.iTvColorCoordinates.iBlue.iX = iEdidParserPtr->GetColorCoordinatesBlueX();
-    aTimings.iTvColorCoordinates.iBlue.iY = iEdidParserPtr->GetColorCoordinatesBlueY();
-    aTimings.iTvColorCoordinates.iWhite.iX = iEdidParserPtr->GetColorCoordinatesWhiteX();
-    aTimings.iTvColorCoordinates.iWhite.iY = iEdidParserPtr->GetColorCoordinatesWhiteY();
-    aTimings.iTvHdmiVersion = iEdidParserPtr->GetVersion();
-    aTimings.iTvHdmiRevision = iEdidParserPtr->GetRevision();
+
+	if( iEdidParserPtr )
+		{
+		aTimings.iTvPhysicalImageWidthMm = iEdidParserPtr->GetHorizontalScreenSize() * 10;
+		aTimings.iTvPhysicalImageHeightMm = iEdidParserPtr->GetVerticalScreenSize() * 10;
+	    aTimings.iTvPhysicalImageAspectRatioNumerator = iEdidParserPtr->GetAspectRatioLandscape();
+	    aTimings.iTvPhysicalImageAspectRatioDenominator = iEdidParserPtr->GetAspectRatioPortrait();
+	    aTimings.iTvColorCoordinates.iRed.iX = iEdidParserPtr->GetColorCoordinatesRedX();
+	    aTimings.iTvColorCoordinates.iRed.iY = iEdidParserPtr->GetColorCoordinatesRedY();
+	    aTimings.iTvColorCoordinates.iGreen.iX = iEdidParserPtr->GetColorCoordinatesGreenX();
+	    aTimings.iTvColorCoordinates.iGreen.iY = iEdidParserPtr->GetColorCoordinatesGreenY();
+	    aTimings.iTvColorCoordinates.iBlue.iX = iEdidParserPtr->GetColorCoordinatesBlueX();
+	    aTimings.iTvColorCoordinates.iBlue.iY = iEdidParserPtr->GetColorCoordinatesBlueY();
+	    aTimings.iTvColorCoordinates.iWhite.iX = iEdidParserPtr->GetColorCoordinatesWhiteX();
+	    aTimings.iTvColorCoordinates.iWhite.iY = iEdidParserPtr->GetColorCoordinatesWhiteY();
+	    aTimings.iTvHdmiVersion = iEdidParserPtr->GetVersion();
+	    aTimings.iTvHdmiRevision = iEdidParserPtr->GetRevision();
+		}
     Mem::FillZ( ( TAny* )&aTimings.iProductName, ( sizeof( TChar ) * KProductNameChars ) );
     Mem::FillZ( ( TAny* )&aTimings.iProductDescription, ( sizeof( TChar ) * KProductDescriptorsChars ) );
     aTimings.iSourceType = THdmiDviTimings::ESourceTypeUnknown;
@@ -861,21 +944,44 @@
     FUNC_LOG;
     
     TInt retVal(KErrNone);
-    
-    // Check established timings 1 and 2
-    retVal = SetDmtModesFromEstablishedTimings( aTimings );
-    
-    if( KErrNone == retVal )
-        {
-        // Check standard timings
-        retVal = SetDmtModesFromStandardTimings( aTimings );
-        
-        if( KErrNone == retVal )
-            {
-            // Check timing descriptors
-            retVal = SetDmtModesFromTimingDescriptors( aTimings );        
-            }
-        }
+
+	if( iDataBlockPtr )
+		{
+	    // Check established timings 1 and 2
+	    retVal = SetDmtModesFromEstablishedTimings( aTimings );
+	    
+	    if( KErrNone == retVal )
+	        {
+	        // Check standard timings
+	        retVal = SetDmtModesFromStandardTimings( aTimings );
+	        
+	        if( KErrNone == retVal )
+	            {
+	            // Check timing descriptors
+	            retVal = SetDmtModesFromTimingDescriptors( aTimings );        
+	            }
+	        }
+		}
+	else
+		{
+		INFO( "==No EDID available from the Sink. Setting DMT 4" );
+		// No EDID data available from the sink
+		// Default VGA resolution should be selected
+		THdmiDviTimings timings;
+		const TTimingItem* item = TimingByIndex( KDefaultDMTModeIndex, ETimingModeDMT );
+		if( item )
+			{
+			Mem::FillZ( ( TAny* )&timings, sizeof( timings ) );
+			FillHdmiDviTimings( *item, timings );
+			retVal = aTimings.Append( timings );
+			ERROR_1( retVal, "Failed to append DMT timing: %S in array", item->iTimingName );
+			}
+		else
+			{
+			ERROR_1( KErrArgument, "DMT timing item not found for VIC mode: %d", KDefaultDMTModeIndex );
+			retVal = KErrNotFound;
+			}
+		}
     
     return retVal;
     }
@@ -1308,7 +1414,7 @@
 // CalculateOverscan
 //------------------------------------------------------------------------------
 //
-void CEDIDHandler::UpdateOverscanValues()
+TBool CEDIDHandler::UpdateOverscanValues()
     {
     FUNC_LOG;
 
@@ -1317,6 +1423,7 @@
     TInt vOverscan = 0;
     CRepository* cenRep = NULL;
     TInt err = KErrNone;
+	TBool valChanged = EFalse;
     
     TRAP( err, cenRep = CRepository::NewL( KCRUidTvoutSettings ) );
     if( err == KErrNone )
@@ -1339,10 +1446,19 @@
         // Cleanup
         delete cenRep;
         }
+
+	if( (iHOverscan != hOverscan) || (iVOverscan != vOverscan) )
+		{
+		valChanged = ETrue;
+		}
     
     // Update overscan values
     iHOverscan = hOverscan;
     iVOverscan = vOverscan;
+
+	INFO_3( "Overscan Values: %d,%d Changed:%d", iHOverscan, iVOverscan, valChanged );
+
+	return valChanged;
     }
 
 // ----------------------------------------------------------------------------
@@ -1466,6 +1582,16 @@
 	return retVal;
     }
 
+void CEDIDHandler::GetCurrentOverscanValue( TInt& aHOverscan, TInt& aVOverscan )
+	{
+	FUNC_LOG;
+	
+	aHOverscan = iHOverscan;
+	aVOverscan = iVOverscan;
+
+	INFO_2("Overscan used: %d, %d", iHOverscan, iVOverscan);
+	}
+
 //------------------------------------------------------------------------------
 // C++ constructor
 //------------------------------------------------------------------------------
@@ -1476,7 +1602,9 @@
     iFSM( aFSM ),
     iTVOutConfigForHDMI( aTVOutConfigForHDMI ),
     iRetryCounter( 0 ),
-    iRequestID( EUndefRequest )
+    iRequestID( EUndefRequest ),
+    inbrOfExtensions( 0 ),
+    iCurrentBlock( 0 )
     {
     FUNC_LOG;
     }