Merge pull request #1917 from Fisherman166/HalReadSMCTrayState
Rewrite HalReadSMCTrayState to match original kernel implementation.
This commit is contained in:
commit
f1d09aff15
|
|
@ -15,7 +15,7 @@
|
|||
// ******************************************************************
|
||||
// * HalReadSMCTrayState
|
||||
// ******************************************************************
|
||||
XBSYSAPI EXPORTNUM(9) VOID NTAPI HalReadSMCTrayState
|
||||
XBSYSAPI EXPORTNUM(9) NTSTATUS NTAPI HalReadSMCTrayState
|
||||
(
|
||||
DWORD* State,
|
||||
DWORD* Count
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
// ******************************************************************
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
//
|
||||
|
|
|
|||
Loading…
Reference in New Issue