122 |
123 |
123 TInt retVal = KErrNone; |
124 TInt retVal = KErrNone; |
124 RArray<TTvSettings> analogConfigs; |
125 RArray<TTvSettings> analogConfigs; |
125 RArray<THdmiDviTimings> hdmiConfigs; |
126 RArray<THdmiDviTimings> hdmiConfigs; |
126 |
127 |
127 // Update overscan values from cenrep |
|
128 UpdateOverscanValues(); |
|
129 |
|
130 // Set video parameters |
128 // Set video parameters |
131 INFO( "--------------------------------------------------------------------" ); |
129 INFO( "--------------------------------------------------------------------" ); |
132 INFO( "SETTING CEA AND DMT TIMINGS:" ); |
130 INFO( "SETTING CEA AND DMT TIMINGS:" ); |
133 retVal = SetCeaModes( hdmiConfigs ); |
131 retVal = SetCeaModes( hdmiConfigs ); |
134 ERROR( retVal, "Failed to set CEA modes" ); |
132 ERROR( retVal, "Failed to set CEA modes" ); |
516 |
517 |
517 switch ( iRequestID ) |
518 switch ( iRequestID ) |
518 { |
519 { |
519 case EDdcReadRequest: |
520 case EDdcReadRequest: |
520 { |
521 { |
521 if( KErrNone == iStatus.Int() ) |
522 if( KErrNone == iStatus.Int() ) |
522 { |
523 { |
523 TPtrC8 |
524 if( iCurrentBlock == 0 ) |
524 dataBlockDes( iDataBlockPtr->iDataBlock, sizeof( *iDataBlockPtr ) ); |
525 { |
525 iEdidParserPtr = CEdidParserBase::NewL( dataBlockDes ); |
526 TPtrC8 dataBlockDes( iDataBlockPtr->iDataBlock, sizeof( *iDataBlockPtr ) ); |
526 TInt nbrOfExtensions = iEdidParserPtr->GetNumberOfExtensions(); |
527 |
527 for( TInt i = 0; i < nbrOfExtensions; ++i ) |
528 iEdidParserPtr = CEdidParserBase::NewL( dataBlockDes ); |
528 { |
529 inbrOfExtensions = iEdidParserPtr->GetNumberOfExtensions(); |
529 if( ECea861Ext == iEdidParserPtr->GetExtensionType( i + 1 ) ) |
530 |
530 { |
531 INFO_1( "No. of extensions from Block 0: %d", inbrOfExtensions ); |
531 INFO_1( "ECea861Ext extension data block number: %d", ( i+1 ) ); |
532 |
532 iExtensionParserPtr |
533 if( inbrOfExtensions ) |
533 = iEdidParserPtr->CreateCea861ExtensionParserL( i + 1 ); |
534 { |
534 break; |
535 inbrOfExtensions--; |
535 } |
536 } |
536 } |
537 } |
537 INFO_1( "Data block count in nbrOfExtensions: %d", nbrOfExtensions ); |
538 else |
538 iFSM.Input( EPDEIfEDIDHandler, EPDEIfEDIDHandlerEventEdidDataFetched ); |
539 { |
539 iRetryCounter = KErrNone; |
540 TPtrC8 dataBlockDes( iDataBlockPtr->iDataBlock, sizeof( *iDataBlockPtr ) ); |
540 } |
541 |
|
542 INFO_1( "Updating the Rawdata for the Block %d...", iCurrentBlock ); |
|
543 iEdidParserPtr->UpdateRawDataL(dataBlockDes); |
|
544 |
|
545 iCurrentBlock++; |
|
546 if( inbrOfExtensions >= 2 ) |
|
547 { |
|
548 inbrOfExtensions = inbrOfExtensions - 2; |
|
549 } |
|
550 else |
|
551 { |
|
552 inbrOfExtensions--; |
|
553 } |
|
554 } |
|
555 |
|
556 if( inbrOfExtensions ) |
|
557 { |
|
558 iRetryCounter = KErrNone; |
|
559 |
|
560 if( ReadEDIDDataL() != KErrNone ) |
|
561 { |
|
562 ResetData(); |
|
563 iFSM.Input( EPDEIfEDIDHandler, EPDEIfEDIDHandlerEventEdidDataFetchFailed ); |
|
564 } |
|
565 } |
|
566 else |
|
567 { |
|
568 TInt extensions = iEdidParserPtr->GetNumberOfExtensions(); |
|
569 |
|
570 INFO_1( "No. of extensions from Block 0: %d", extensions ); |
|
571 |
|
572 for( TInt i = 0; i < extensions; ++i ) |
|
573 { |
|
574 if( ECea861Ext == iEdidParserPtr->GetExtensionType( i + 1 ) ) |
|
575 { |
|
576 INFO_1( "ECea861Ext extension data block number: %d", ( i+1 ) ); |
|
577 if( !iExtensionParserPtr ) |
|
578 { |
|
579 INFO( "First CEA 861 extension is being read..." ); |
|
580 iExtensionParserPtr |
|
581 = iEdidParserPtr->CreateCea861ExtensionParserL( i + 1 ); |
|
582 } |
|
583 else |
|
584 { |
|
585 INFO_1( "CEA 861 extension is being read... at the index %d", i+1 ); |
|
586 iEdidParserPtr->UpdateCea861ExtensionL( i + 1, iExtensionParserPtr ); |
|
587 } |
|
588 } |
|
589 } |
|
590 } |
|
591 |
|
592 TRACE_EDID_DATA( *iEdidParserPtr ); |
|
593 |
|
594 iFSM.Input( EPDEIfEDIDHandler, EPDEIfEDIDHandlerEventEdidDataFetched ); |
|
595 iRetryCounter = KErrNone; |
|
596 } |
541 else |
597 else |
542 { |
598 { |
543 INFO_1( "CDdcPortAccess::Read failed, error code: %d", iStatus.Int() ); |
599 INFO_1( "CDdcPortAccess::Read failed, error code: %d", iStatus.Int() ); |
544 |
600 |
545 if( (iStatus.Int() == KErrNotReady) && (iRetryCounter < KMaxRetryCount) ) |
601 if( (iStatus.Int() == KErrNotReady) && (iRetryCounter < KMaxRetryCount) ) |
641 // |
709 // |
642 void CEDIDHandler::FillCommonHdmiDviTimings( THdmiDviTimings& aTimings ) const |
710 void CEDIDHandler::FillCommonHdmiDviTimings( THdmiDviTimings& aTimings ) const |
643 { |
711 { |
644 FUNC_LOG; |
712 FUNC_LOG; |
645 |
713 |
646 aTimings.iTvPhysicalImageWidthMm = iEdidParserPtr->GetHorizontalScreenSize() * 10; |
|
647 aTimings.iTvPhysicalImageHeightMm = iEdidParserPtr->GetVerticalScreenSize() * 10; |
|
648 aTimings.iTvPhysicalImageAspectRatioNumerator = 0; |
714 aTimings.iTvPhysicalImageAspectRatioNumerator = 0; |
649 aTimings.iTvPhysicalImageAspectRatioDenominator = 0; |
715 aTimings.iTvPhysicalImageAspectRatioDenominator = 0; |
650 aTimings.iHorizontalBorderPixels = 0; |
716 aTimings.iHorizontalBorderPixels = 0; |
651 aTimings.iVerticalBorderLinesField1 = 0; |
717 aTimings.iVerticalBorderLinesField1 = 0; |
652 aTimings.iVerticalBorderLinesField2 = 0; |
718 aTimings.iVerticalBorderLinesField2 = 0; |
653 aTimings.iLeftBorderPixels = 0; |
719 aTimings.iLeftBorderPixels = 0; |
654 aTimings.iRightBorderPixels = 0; |
720 aTimings.iRightBorderPixels = 0; |
655 aTimings.iUnderscanEnabled = EFalse; |
|
656 |
721 |
657 if( iExtensionParserPtr ) |
722 if( iExtensionParserPtr ) |
658 { |
723 { |
|
724 INFO("==CEA Extension Exists"); |
659 aTimings.iUnderscanEnabled = iExtensionParserPtr->Underscan(); |
725 aTimings.iUnderscanEnabled = iExtensionParserPtr->Underscan(); |
660 } |
726 } |
|
727 else |
|
728 { |
|
729 INFO("==No CEA Extension"); |
|
730 // No CEA Extension so it should be DVI |
|
731 // Underscan supported always |
|
732 aTimings.iTvPhysicalImageAspectRatioNumerator = 4; |
|
733 aTimings.iTvPhysicalImageAspectRatioDenominator = 3; |
|
734 aTimings.iUnderscanEnabled = ETrue; |
|
735 } |
661 |
736 |
662 if( aTimings.iUnderscanEnabled ) |
737 if( aTimings.iUnderscanEnabled ) |
663 { |
738 { |
|
739 INFO("==Underscan Enabled"); |
664 // Underscan |
740 // Underscan |
665 aTimings.iLeftTopCorner.iX = 0; |
741 aTimings.iLeftTopCorner.iX = 0; |
666 aTimings.iLeftTopCorner.iY = 0; |
742 aTimings.iLeftTopCorner.iY = 0; |
667 aTimings.iRightBottomCorner.iX = aTimings.iHorizontalActivePixels; |
743 aTimings.iRightBottomCorner.iX = aTimings.iHorizontalActivePixels; |
668 aTimings.iRightBottomCorner.iY = aTimings.iVerticalActiveLines; |
744 aTimings.iRightBottomCorner.iY = aTimings.iVerticalActiveLines; |
669 } |
745 } |
670 else |
746 else |
671 { |
747 { |
|
748 INFO("==Underscan Disabled"); |
672 // Calculate overscan |
749 // Calculate overscan |
673 CalculateOverscan( aTimings.iLeftTopCorner, |
750 CalculateOverscan( aTimings.iLeftTopCorner, |
674 aTimings.iRightBottomCorner ); |
751 aTimings.iRightBottomCorner ); |
675 } |
752 } |
676 aTimings.iTvPhysicalImageAspectRatioNumerator = iEdidParserPtr->GetAspectRatioLandscape(); |
|
677 aTimings.iTvPhysicalImageAspectRatioDenominator = iEdidParserPtr->GetAspectRatioPortrait(); |
|
678 aTimings.iConnector = TTvSettings::EHDMI; |
753 aTimings.iConnector = TTvSettings::EHDMI; |
679 aTimings.iTvColorCoordinates.iRed.iX = iEdidParserPtr->GetColorCoordinatesRedX(); |
754 |
680 aTimings.iTvColorCoordinates.iRed.iY = iEdidParserPtr->GetColorCoordinatesRedY(); |
755 if( iEdidParserPtr ) |
681 aTimings.iTvColorCoordinates.iGreen.iX = iEdidParserPtr->GetColorCoordinatesGreenX(); |
756 { |
682 aTimings.iTvColorCoordinates.iGreen.iY = iEdidParserPtr->GetColorCoordinatesGreenY(); |
757 aTimings.iTvPhysicalImageWidthMm = iEdidParserPtr->GetHorizontalScreenSize() * 10; |
683 aTimings.iTvColorCoordinates.iBlue.iX = iEdidParserPtr->GetColorCoordinatesBlueX(); |
758 aTimings.iTvPhysicalImageHeightMm = iEdidParserPtr->GetVerticalScreenSize() * 10; |
684 aTimings.iTvColorCoordinates.iBlue.iY = iEdidParserPtr->GetColorCoordinatesBlueY(); |
759 aTimings.iTvPhysicalImageAspectRatioNumerator = iEdidParserPtr->GetAspectRatioLandscape(); |
685 aTimings.iTvColorCoordinates.iWhite.iX = iEdidParserPtr->GetColorCoordinatesWhiteX(); |
760 aTimings.iTvPhysicalImageAspectRatioDenominator = iEdidParserPtr->GetAspectRatioPortrait(); |
686 aTimings.iTvColorCoordinates.iWhite.iY = iEdidParserPtr->GetColorCoordinatesWhiteY(); |
761 aTimings.iTvColorCoordinates.iRed.iX = iEdidParserPtr->GetColorCoordinatesRedX(); |
687 aTimings.iTvHdmiVersion = iEdidParserPtr->GetVersion(); |
762 aTimings.iTvColorCoordinates.iRed.iY = iEdidParserPtr->GetColorCoordinatesRedY(); |
688 aTimings.iTvHdmiRevision = iEdidParserPtr->GetRevision(); |
763 aTimings.iTvColorCoordinates.iGreen.iX = iEdidParserPtr->GetColorCoordinatesGreenX(); |
|
764 aTimings.iTvColorCoordinates.iGreen.iY = iEdidParserPtr->GetColorCoordinatesGreenY(); |
|
765 aTimings.iTvColorCoordinates.iBlue.iX = iEdidParserPtr->GetColorCoordinatesBlueX(); |
|
766 aTimings.iTvColorCoordinates.iBlue.iY = iEdidParserPtr->GetColorCoordinatesBlueY(); |
|
767 aTimings.iTvColorCoordinates.iWhite.iX = iEdidParserPtr->GetColorCoordinatesWhiteX(); |
|
768 aTimings.iTvColorCoordinates.iWhite.iY = iEdidParserPtr->GetColorCoordinatesWhiteY(); |
|
769 aTimings.iTvHdmiVersion = iEdidParserPtr->GetVersion(); |
|
770 aTimings.iTvHdmiRevision = iEdidParserPtr->GetRevision(); |
|
771 } |
689 Mem::FillZ( ( TAny* )&aTimings.iProductName, ( sizeof( TChar ) * KProductNameChars ) ); |
772 Mem::FillZ( ( TAny* )&aTimings.iProductName, ( sizeof( TChar ) * KProductNameChars ) ); |
690 Mem::FillZ( ( TAny* )&aTimings.iProductDescription, ( sizeof( TChar ) * KProductDescriptorsChars ) ); |
773 Mem::FillZ( ( TAny* )&aTimings.iProductDescription, ( sizeof( TChar ) * KProductDescriptorsChars ) ); |
691 aTimings.iSourceType = THdmiDviTimings::ESourceTypeUnknown; |
774 aTimings.iSourceType = THdmiDviTimings::ESourceTypeUnknown; |
692 } |
775 } |
693 |
776 |
859 TInt CEDIDHandler::SetDmtModes( RArray<THdmiDviTimings>& aTimings ) const |
942 TInt CEDIDHandler::SetDmtModes( RArray<THdmiDviTimings>& aTimings ) const |
860 { |
943 { |
861 FUNC_LOG; |
944 FUNC_LOG; |
862 |
945 |
863 TInt retVal(KErrNone); |
946 TInt retVal(KErrNone); |
864 |
947 |
865 // Check established timings 1 and 2 |
948 if( iDataBlockPtr ) |
866 retVal = SetDmtModesFromEstablishedTimings( aTimings ); |
949 { |
867 |
950 // Check established timings 1 and 2 |
868 if( KErrNone == retVal ) |
951 retVal = SetDmtModesFromEstablishedTimings( aTimings ); |
869 { |
952 |
870 // Check standard timings |
953 if( KErrNone == retVal ) |
871 retVal = SetDmtModesFromStandardTimings( aTimings ); |
954 { |
872 |
955 // Check standard timings |
873 if( KErrNone == retVal ) |
956 retVal = SetDmtModesFromStandardTimings( aTimings ); |
874 { |
957 |
875 // Check timing descriptors |
958 if( KErrNone == retVal ) |
876 retVal = SetDmtModesFromTimingDescriptors( aTimings ); |
959 { |
877 } |
960 // Check timing descriptors |
878 } |
961 retVal = SetDmtModesFromTimingDescriptors( aTimings ); |
|
962 } |
|
963 } |
|
964 } |
|
965 else |
|
966 { |
|
967 INFO( "==No EDID available from the Sink. Setting DMT 4" ); |
|
968 // No EDID data available from the sink |
|
969 // Default VGA resolution should be selected |
|
970 THdmiDviTimings timings; |
|
971 const TTimingItem* item = TimingByIndex( KDefaultDMTModeIndex, ETimingModeDMT ); |
|
972 if( item ) |
|
973 { |
|
974 Mem::FillZ( ( TAny* )&timings, sizeof( timings ) ); |
|
975 FillHdmiDviTimings( *item, timings ); |
|
976 retVal = aTimings.Append( timings ); |
|
977 ERROR_1( retVal, "Failed to append DMT timing: %S in array", item->iTimingName ); |
|
978 } |
|
979 else |
|
980 { |
|
981 ERROR_1( KErrArgument, "DMT timing item not found for VIC mode: %d", KDefaultDMTModeIndex ); |
|
982 retVal = KErrNotFound; |
|
983 } |
|
984 } |
879 |
985 |
880 return retVal; |
986 return retVal; |
881 } |
987 } |
882 |
988 |
883 //------------------------------------------------------------------------------ |
989 //------------------------------------------------------------------------------ |
1306 |
1412 |
1307 //------------------------------------------------------------------------------ |
1413 //------------------------------------------------------------------------------ |
1308 // CalculateOverscan |
1414 // CalculateOverscan |
1309 //------------------------------------------------------------------------------ |
1415 //------------------------------------------------------------------------------ |
1310 // |
1416 // |
1311 void CEDIDHandler::UpdateOverscanValues() |
1417 TBool CEDIDHandler::UpdateOverscanValues() |
1312 { |
1418 { |
1313 FUNC_LOG; |
1419 FUNC_LOG; |
1314 |
1420 |
1315 // Overscan from cenrep |
1421 // Overscan from cenrep |
1316 TInt hOverscan = 0; |
1422 TInt hOverscan = 0; |
1317 TInt vOverscan = 0; |
1423 TInt vOverscan = 0; |
1318 CRepository* cenRep = NULL; |
1424 CRepository* cenRep = NULL; |
1319 TInt err = KErrNone; |
1425 TInt err = KErrNone; |
|
1426 TBool valChanged = EFalse; |
1320 |
1427 |
1321 TRAP( err, cenRep = CRepository::NewL( KCRUidTvoutSettings ) ); |
1428 TRAP( err, cenRep = CRepository::NewL( KCRUidTvoutSettings ) ); |
1322 if( err == KErrNone ) |
1429 if( err == KErrNone ) |
1323 { |
1430 { |
1324 |
1431 |
1464 } |
1580 } |
1465 |
1581 |
1466 return retVal; |
1582 return retVal; |
1467 } |
1583 } |
1468 |
1584 |
|
1585 void CEDIDHandler::GetCurrentOverscanValue( TInt& aHOverscan, TInt& aVOverscan ) |
|
1586 { |
|
1587 FUNC_LOG; |
|
1588 |
|
1589 aHOverscan = iHOverscan; |
|
1590 aVOverscan = iVOverscan; |
|
1591 |
|
1592 INFO_2("Overscan used: %d, %d", iHOverscan, iVOverscan); |
|
1593 } |
|
1594 |
1469 //------------------------------------------------------------------------------ |
1595 //------------------------------------------------------------------------------ |
1470 // C++ constructor |
1596 // C++ constructor |
1471 //------------------------------------------------------------------------------ |
1597 //------------------------------------------------------------------------------ |
1472 // |
1598 // |
1473 CEDIDHandler::CEDIDHandler( MFSMForBody& aFSM, |
1599 CEDIDHandler::CEDIDHandler( MFSMForBody& aFSM, |
1474 CTVOutConfigForHDMI& aTVOutConfigForHDMI ) : |
1600 CTVOutConfigForHDMI& aTVOutConfigForHDMI ) : |
1475 CActive( CActive::EPriorityLow ), |
1601 CActive( CActive::EPriorityLow ), |
1476 iFSM( aFSM ), |
1602 iFSM( aFSM ), |
1477 iTVOutConfigForHDMI( aTVOutConfigForHDMI ), |
1603 iTVOutConfigForHDMI( aTVOutConfigForHDMI ), |
1478 iRetryCounter( 0 ), |
1604 iRetryCounter( 0 ), |
1479 iRequestID( EUndefRequest ) |
1605 iRequestID( EUndefRequest ), |
|
1606 inbrOfExtensions( 0 ), |
|
1607 iCurrentBlock( 0 ) |
1480 { |
1608 { |
1481 FUNC_LOG; |
1609 FUNC_LOG; |
1482 } |
1610 } |
1483 |
1611 |
1484 //------------------------------------------------------------------------------ |
1612 //------------------------------------------------------------------------------ |