diff --git a/import/OpenXDK/include/xboxkrnl/hal.h b/import/OpenXDK/include/xboxkrnl/hal.h index 4abc2c4c0..eb643a8d3 100644 --- a/import/OpenXDK/include/xboxkrnl/hal.h +++ b/import/OpenXDK/include/xboxkrnl/hal.h @@ -15,7 +15,7 @@ // ****************************************************************** // * HalReadSMCTrayState // ****************************************************************** -XBSYSAPI EXPORTNUM(9) VOID NTAPI HalReadSMCTrayState +XBSYSAPI EXPORTNUM(9) NTSTATUS NTAPI HalReadSMCTrayState ( DWORD* State, DWORD* Count diff --git a/src/core/kernel/exports/EmuKrnlHal.cpp b/src/core/kernel/exports/EmuKrnlHal.cpp index 3baddd252..9a129c1f8 100644 --- a/src/core/kernel/exports/EmuKrnlHal.cpp +++ b/src/core/kernel/exports/EmuKrnlHal.cpp @@ -72,10 +72,17 @@ xboxkrnl::LIST_ENTRY ShutdownRoutineList = { &ShutdownRoutineList , &ShutdownRou // ****************************************************************** xboxkrnl::KPCR* WINAPI KeGetPcr(); +#define TRAY_CLOSED_MEDIA_PRESENT 0x60 +#define TRAY_CLOSED_NO_MEDIA 0x40 +#define TRAY_OPEN 0x10 +#define INIT_TRAY_STATE 0xFFFFFFFF +static DWORD g_TrayState = INIT_TRAY_STATE; +static DWORD g_TrayCount = 0; + // ****************************************************************** // * 0x0009 - HalReadSMCTrayState() // ****************************************************************** -XBSYSAPI EXPORTNUM(9) xboxkrnl::VOID NTAPI xboxkrnl::HalReadSMCTrayState +XBSYSAPI EXPORTNUM(9) xboxkrnl::NTSTATUS NTAPI xboxkrnl::HalReadSMCTrayState ( DWORD* State, DWORD* Count @@ -86,22 +93,36 @@ XBSYSAPI EXPORTNUM(9) xboxkrnl::VOID NTAPI xboxkrnl::HalReadSMCTrayState LOG_FUNC_ARG(Count) LOG_FUNC_END; -#define TRAY_CLOSED_MEDIA_PRESENT 96 -#define TRAY_CLOSED_NO_MEDIA 64 -#define TRAY_OPEN 16 + UCHAR orig_irql = KeRaiseIrqlToDpcLevel(); + DWORD TrayState = g_TrayState; + DWORD orig_TrayCount = g_TrayCount; + KfLowerIrql(orig_irql); - // TODO: Make this configurable? - // TODO: What is the count parameter for?? - - if (Count) - *Count = 1; - - // Pretend the tray is open + NTSTATUS ret = STATUS_SUCCESS; + if (TrayState == INIT_TRAY_STATE) { + ret = HalReadSMBusValue(SMBUS_ADDRESS_SYSTEM_MICRO_CONTROLLER, SMC_COMMAND_TRAY_STATE, 0, &TrayState); + // If bit 31 = 1, then there is an error so do not execute this code. + if ((ret >> 31) == 0) { + TrayState &= 0x70; + if ((TrayState != TRAY_CLOSED_MEDIA_PRESENT) && (TrayState != TRAY_CLOSED_NO_MEDIA)) { + TrayState = TRAY_OPEN; + } + orig_irql = KeRaiseIrqlToDpcLevel(); + if (orig_TrayCount != g_TrayCount) { + g_TrayState = TrayState; + } + KfLowerIrql(orig_irql); + } + } + // FIXME: Pretend the tray is open // TRAY_CLOSED_NO_MEDIA causes Dashboard to call DeviceIoControl, which we do not implement // TRAY_CLOSED_MEDIA_PRESENT causes Dashboard to attempt to launch media, causing errors. + //*State = TrayState; *State = TRAY_OPEN; - - // *Count = 1; + if (Count) { + *Count = orig_TrayCount; + } + RETURN(ret); } // ****************************************************************** diff --git a/src/devices/SMCDevice.h b/src/devices/SMCDevice.h index 085e504bc..07d9f674c 100644 --- a/src/devices/SMCDevice.h +++ b/src/devices/SMCDevice.h @@ -44,20 +44,20 @@ // From https://web.archive.org/web/20100617022549/https://www.xbox-linux.org/wiki/PIC : // Command Description -#define SMC_COMMAND_VERSION 0x01 // PIC version string -//0x03 tray state -#define SMC_COMMAND_AV_PACK 0x04 // A / V Pack state -#define SMC_COMMAND_CPU_TEMP 0x09 // CPU temperature (°C) -#define SMC_COMMAND_MOTHERBOARD_TEMP 0x0A // motherboard temperature (°C) +#define SMC_COMMAND_VERSION 0x01 // PIC version string +#define SMC_COMMAND_TRAY_STATE 0x03 //tray state +#define SMC_COMMAND_AV_PACK 0x04 // A / V Pack state +#define SMC_COMMAND_CPU_TEMP 0x09 // CPU temperature (°C) +#define SMC_COMMAND_MOTHERBOARD_TEMP 0x0A // motherboard temperature (°C) //0x0F reads scratch register written with 0x0E #define SMC_COMMAND_POWER_FAN_READBACK 0x10 // Current power fan speed (0-50) //0x11 interrupt reason //0x18 reading this reg locks up xbox in "overheated" state -#define SMC_COMMAND_SCRATCH 0x1B // scratch register for the original kernel -#define SMC_COMMAND_CHALLENGE_1C 0x1C // random number for boot challenge -#define SMC_COMMAND_CHALLENGE_1D 0x1D // random number for boot challenge -#define SMC_COMMAND_CHALLENGE_1E 0x1E // random number for boot challenge -#define SMC_COMMAND_CHALLENGE_1F 0x1F // random number for boot challenge +#define SMC_COMMAND_SCRATCH 0x1B // scratch register for the original kernel +#define SMC_COMMAND_CHALLENGE_1C 0x1C // random number for boot challenge +#define SMC_COMMAND_CHALLENGE_1D 0x1D // random number for boot challenge +#define SMC_COMMAND_CHALLENGE_1E 0x1E // random number for boot challenge +#define SMC_COMMAND_CHALLENGE_1F 0x1F // random number for boot challenge // // Writing: //