From 20e9cd01311609ecaae0c5543901e19018a30574 Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Fri, 24 Feb 2017 11:50:40 +0100 Subject: [PATCH] Kernel : AvSendTVEncoderOption expanded with all possible options --- import/OpenXDK/include/xboxkrnl/xbox.h | 47 ++++++++++++++- src/CxbxKrnl/EmuKrnlAv.cpp | 81 +++++++++++++++++++++++--- src/CxbxKrnl/EmuKrnlHal.cpp | 2 +- 3 files changed, 117 insertions(+), 13 deletions(-) diff --git a/import/OpenXDK/include/xboxkrnl/xbox.h b/import/OpenXDK/include/xboxkrnl/xbox.h index 4de29960c..3272691e7 100644 --- a/import/OpenXDK/include/xboxkrnl/xbox.h +++ b/import/OpenXDK/include/xboxkrnl/xbox.h @@ -12,8 +12,6 @@ #ifndef XBOX_H #define XBOX_H -#define AV_FLAGS_60Hz 0x00400000 -#define AV_FLAGS_50Hz 0x00800000 #define AV_PACK_NONE 0x00000000 #define AV_PACK_STANDARD 0x00000001 #define AV_PACK_RFU 0x00000002 @@ -23,12 +21,55 @@ #define AV_PACK_SVIDEO 0x00000006 #define AV_PACK_MAX 0x00000007 #define AV_PACK_MASK 0x000000FF + #define AV_STANDARD_NTSC_M 0x00000100 #define AV_STANDARD_NTSC_J 0x00000200 #define AV_STANDARD_PAL_I 0x00000300 #define AV_STANDARD_PAL_M 0x00000400 #define AV_STANDARD_MAX 0x00000500 -#define AV_QUERY_AV_CAPABILITIES 6 +#define AV_STANDARD_MASK 0x00000F00 +#define AV_STANDARD_SHIFT 8 + +#define AV_FLAGS_HDTV_480i 0x00000000 // Bogus 'flag' +#define AV_FLAGS_HDTV_720p 0x00020000 +#define AV_FLAGS_HDTV_1080i 0x00040000 +#define AV_FLAGS_HDTV_480p 0x00080000 +#define AV_HDTV_MODE_MASK 0x000E0000 // Exclude AV_FLAGS_WIDESCREEN ! + +#define AV_FLAGS_WIDESCREEN 0x00010000 +#define AV_FLAGS_LETTERBOX 0x00100000 +#define AV_ASPECT_RATIO_MASK 0x00110000 // = AV_FLAGS_WIDESCREEN | AV_FLAGS_LETTERBOX + +#define AV_FLAGS_INTERLACED 0x00200000 + +#define AV_FLAGS_60Hz 0x00400000 +#define AV_FLAGS_50Hz 0x00800000 +#define AV_REFRESH_MASK 0x00C00000 // = AV_FLAGS_60Hz | AV_FLAGS_50Hz + +#define AV_FLAGS_FIELD 0x01000000 +#define AV_FLAGS_10x11PAR 0x02000000 + +#define AV_USER_FLAGS_MASK (AV_HDTV_MODE_MASK | AV_ASPECT_RATIO_MASK | AV_REFRESH_MASK) // TODO : Should AV_REFRESH_MASK be AV_FLAGS_60Hz instead? +#define AV_USER_FLAGS_SHIFT 16 + +// Options to AvSendTVEncoderOption() : +#define AV_OPTION_MACROVISION_MODE 1 +#define AV_OPTION_ENABLE_CC 2 +#define AV_OPTION_DISABLE_CC 3 +#define AV_OPTION_SEND_CC_DATA 4 +#define AV_QUERY_CC_STATUS 5 +#define AV_QUERY_AV_CAPABILITIES 6 +#define AV_OPTION_BLANK_SCREEN 9 +#define AV_OPTION_MACROVISION_COMMIT 10 +#define AV_OPTION_FLICKER_FILTER 11 +#define AV_OPTION_ZERO_MODE 12 +#define AV_OPTION_QUERY_MODE 13 +#define AV_OPTION_ENABLE_LUMA_FILTER 14 +#define AV_OPTION_GUESS_FIELD 15 +#define AV_QUERY_ENCODER_TYPE 16 +#define AV_QUERY_MODE_TABLE_VERSION 17 +#define AV_OPTION_CGMS 18 +#define AV_OPTION_WIDESCREEN 19 // ****************************************************************** // * 0x0001 - AvGetSavedDataAddress() diff --git a/src/CxbxKrnl/EmuKrnlAv.cpp b/src/CxbxKrnl/EmuKrnlAv.cpp index bcc2e57b8..9a65cf6fd 100644 --- a/src/CxbxKrnl/EmuKrnlAv.cpp +++ b/src/CxbxKrnl/EmuKrnlAv.cpp @@ -58,6 +58,21 @@ namespace NtDll // Global Variable(s) PVOID g_pPersistedData = NULL; +ULONG AvQueryAvCapabilities() +{ + // This is the only AV mode we currently emulate, so we can hardcode the return value + // TODO: Once we allow the user to configure the connected AV pack, we should implement this proper + // This function should first query the AV Pack type, read the user's EEPROM settings and + // return the correct flags based on this. + // + // For the AV Pack, read SMC_COMMAND_VIDEO_MODE (or HalBootSMCVideoMode) and convert it to a AV_PACK_* + // + // To read the EEPROM, call ExQueryNonVolatileSetting() with these config flags : + // XC_FACTORY_AV_REGION; if that fails, fallback on AV_STANDARD_NTSC_M | AV_FLAGS_60Hz + // XC_VIDEO_FLAGS; if that fails, fallback on 0 + return AV_PACK_HDTV | AV_STANDARD_NTSC_M | AV_FLAGS_60Hz; +} + // ****************************************************************** // * 0x0001 - AvGetSavedDataAddress() // ****************************************************************** @@ -126,16 +141,64 @@ XBSYSAPI EXPORTNUM(2) xboxkrnl::VOID NTAPI xboxkrnl::AvSendTVEncoderOption LOG_FUNC_ARG_OUT(Result) LOG_FUNC_END; + //if (RegisterBase == NULL) + // RegisterBase = (void *)NV20_REG_BASE_KERNEL; + switch (Option) { - case AV_QUERY_AV_CAPABILITIES: - // This is the only AV mode we currently emulate, so we can hardcode the return value - // TODO: Once we allow the user to configure the connected AV pack, we should implement this proper - // This function should first query the AV Pack type, read the user's EEPROM settings and - // return the correct flags based on this. - *Result = AV_PACK_HDTV | AV_STANDARD_NTSC_M | AV_FLAGS_60Hz; - break; - default: - LOG_UNIMPLEMENTED(); + case AV_OPTION_MACROVISION_MODE: + LOG_UNIMPLEMENTED(); + break; + case AV_OPTION_ENABLE_CC: + LOG_UNIMPLEMENTED(); + break; + case AV_OPTION_DISABLE_CC: + LOG_UNIMPLEMENTED(); + break; + case AV_OPTION_SEND_CC_DATA: + LOG_UNIMPLEMENTED(); + break; + case AV_QUERY_CC_STATUS: + LOG_UNIMPLEMENTED(); + break; + case AV_QUERY_AV_CAPABILITIES: + *Result = AvQueryAvCapabilities(); + break; + case AV_OPTION_BLANK_SCREEN: + LOG_UNIMPLEMENTED(); + break; + case AV_OPTION_MACROVISION_COMMIT: + LOG_UNIMPLEMENTED(); + break; + case AV_OPTION_FLICKER_FILTER: + LOG_UNIMPLEMENTED(); + break; + case AV_OPTION_ZERO_MODE: + LOG_UNIMPLEMENTED(); + break; + case AV_OPTION_QUERY_MODE: + LOG_UNIMPLEMENTED(); + break; + case AV_OPTION_ENABLE_LUMA_FILTER: + LOG_UNIMPLEMENTED(); + break; + case AV_OPTION_GUESS_FIELD: + LOG_UNIMPLEMENTED(); + break; + case AV_QUERY_ENCODER_TYPE: + LOG_UNIMPLEMENTED(); + break; + case AV_QUERY_MODE_TABLE_VERSION: + LOG_UNIMPLEMENTED(); + break; + case AV_OPTION_CGMS: + LOG_UNIMPLEMENTED(); + break; + case AV_OPTION_WIDESCREEN: + LOG_UNIMPLEMENTED(); + break; + default: + // do nothing + break; } } diff --git a/src/CxbxKrnl/EmuKrnlHal.cpp b/src/CxbxKrnl/EmuKrnlHal.cpp index 9c084f2ee..af0e5bbc4 100644 --- a/src/CxbxKrnl/EmuKrnlHal.cpp +++ b/src/CxbxKrnl/EmuKrnlHal.cpp @@ -563,7 +563,7 @@ XBSYSAPI EXPORTNUM(334) xboxkrnl::VOID NTAPI xboxkrnl::WRITE_PORT_BUFFER_ULONG // * 0x0164 - HalBootSMCVideoMode // ****************************************************************** // TODO: Verify this! -XBSYSAPI EXPORTNUM(356) xboxkrnl::DWORD xboxkrnl::HalBootSMCVideoMode = 1; +XBSYSAPI EXPORTNUM(356) xboxkrnl::DWORD xboxkrnl::HalBootSMCVideoMode = 1; // TODO : AV_PACK_STANDARD? // ****************************************************************** // * 0x0166 - HalIsResetOrShutdownPending()