diff --git a/FrameworkSensors/AccelerometerClient.cpp b/FrameworkSensors/AccelerometerClient.cpp index 8226095..44c4eab 100644 --- a/FrameworkSensors/AccelerometerClient.cpp +++ b/FrameworkSensors/AccelerometerClient.cpp @@ -38,14 +38,18 @@ typedef enum ACCELEROMETER_DATA_COUNT } ACCELEROMETER_DATA_INDEX; -UINT8 CrosEcGetMotionSensorCount(HANDLE Handle) +NTSTATUS CrosEcGetMotionSensorCount(HANDLE Handle, UINT8 *Count) { EC_REQUEST_MOTION_SENSE_DUMP req{}; EC_RESPONSE_MOTION_SENSE_DUMP res{}; if (Handle == INVALID_HANDLE_VALUE) { TraceError("%!FUNC! Handle is invalid"); - return 0; + return STATUS_INVALID_PARAMETER; + } + if (Count == nullptr) { + TraceError("%!FUNC! Count==NULL"); + return STATUS_INVALID_PARAMETER; } req.Cmd = 0; @@ -60,21 +64,21 @@ UINT8 CrosEcGetMotionSensorCount(HANDLE Handle) sizeof(res) )) { TraceError("%!FUNC! EC_CMD_MOTION_SENSE_DUMP failed"); - return 0; + return STATUS_NOT_FOUND; } - return res.SensorCount; + *Count = res.SensorCount; + return STATUS_SUCCESS; } // Returns STATUS_NOT_FOUND if either base or lid accelerometer sensors are not found. NTSTATUS -CrosEcGetAccelIndeces(HANDLE Handle, UINT8 *BaseSensor, UINT8 *LidSensor) +CrosEcGetAccelIndeces(HANDLE Handle, UINT8 *LidSensor, UINT8 *BaseSensor, UINT8 SensorCount) { EC_REQUEST_MOTION_SENSE_INFO req{}; EC_RESPONSE_MOTION_SENSE_INFO res{}; BOOLEAN FoundBase = FALSE; BOOLEAN FoundLid = FALSE; - UINT8 SensorCount = 0; if (Handle == INVALID_HANDLE_VALUE) { TraceError("%!FUNC! Handle is invalid"); @@ -87,8 +91,6 @@ CrosEcGetAccelIndeces(HANDLE Handle, UINT8 *BaseSensor, UINT8 *LidSensor) return STATUS_INVALID_PARAMETER; } - SensorCount = CrosEcGetMotionSensorCount(Handle); - for (UINT8 i = 0; i < SensorCount; i++) { req.Cmd = 1; @@ -164,24 +166,38 @@ AccelerometerDevice::Initialize( m_Device = Device; m_SensorInstance = SensorInstance; m_Started = FALSE; + SensorCount = 0; // Sensible defaults - applies to most devices m_LidSensorIndex = 0; - m_LidBaseSensor = 1; + m_BaseSensor = 1; + m_SensorIndicesInitialized = FALSE; + Context->m_CrosEcHandle = INVALID_HANDLE_VALUE; + + // Make sure we have a handle to the EC driver + ConnectToEc(&Context->m_CrosEcHandle); - SensorCount = CrosEcGetMotionSensorCount(Context->m_CrosEcHandle); + Status = CrosEcGetMotionSensorCount(Context->m_CrosEcHandle, &SensorCount); TraceInformation("%!FUNC! Found %d Sensors on this device", SensorCount); - if (SensorCount == 0) + // If the EC is present, we evaluate the responses, + // If not just ignore it and try again later. + // Want to avoid failing the driver load if the EC is not present. + if (NT_SUCCESS(Status)) { - TraceError("%!FUNC! No Sensors available. Not initializing AccelerometerClient"); - Status = STATUS_NOT_FOUND; - goto Exit; - } + if (SensorCount == 0) + { + TraceError("%!FUNC! No Sensors available. Not initializing AccelerometerClient"); + Status = STATUS_NOT_FOUND; + goto Exit; + } - Status = CrosEcGetAccelIndeces(Context->m_CrosEcHandle, &m_LidSensorIndex, &m_LidBaseSensor); - if (!NT_SUCCESS(Status)) - { - TraceError("%!FUNC! Failed to get accelerometer indeces: %!STATUS!", Status); - goto Exit; + Status = CrosEcGetAccelIndeces(Context->m_CrosEcHandle, &m_LidSensorIndex, &m_BaseSensor, SensorCount); + if (!NT_SUCCESS(Status)) + { + TraceError("%!FUNC! Failed to get accelerometer indeces: %!STATUS!", Status); + Status = STATUS_NOT_FOUND; + goto Exit; + } + m_SensorIndicesInitialized = TRUE; } // @@ -515,6 +531,30 @@ AccelerometerDevice::GetData( SENSOR_FunctionEnter(); + if (Handle == INVALID_HANDLE_VALUE) { + TraceError("%!FUNC! Handle is invalid"); + return STATUS_INVALID_HANDLE; + } + + // Initialize sensor indices if not done during Initialize() (EC wasn't available then) + if (!m_SensorIndicesInitialized) { + UINT8 SensorCount = 0; + Status = CrosEcGetMotionSensorCount(Handle, &SensorCount); + if (NT_SUCCESS(Status) && SensorCount > 0) { + Status = CrosEcGetAccelIndeces(Handle, &m_LidSensorIndex, &m_BaseSensor, SensorCount); + if (NT_SUCCESS(Status)) { + m_SensorIndicesInitialized = TRUE; + TraceInformation("%!FUNC! Late-initialized sensor indices: Lid=%d, Base=%d", m_LidSensorIndex, m_BaseSensor); + } else { + TraceError("%!FUNC! Failed to get accelerometer indices: %!STATUS!", Status); + return Status; + } + } else { + TraceError("%!FUNC! Failed to get sensor count or no sensors available"); + return STATUS_DEVICE_NOT_READY; + } + } + UINT8 acc_status = 0; CrosEcReadMemU8(Handle, EC_MEMMAP_ACC_STATUS, &acc_status); TraceInformation("Status: (%02x), Present: %d, Busy: %d\n", @@ -663,4 +703,4 @@ AccelerometerDevice::UpdateCachedThreshold( Exit: SENSOR_FunctionExit(Status); return Status; -} \ No newline at end of file +} diff --git a/FrameworkSensors/Clients.cpp b/FrameworkSensors/Clients.cpp index 4673356..4374951 100644 --- a/FrameworkSensors/Clients.cpp +++ b/FrameworkSensors/Clients.cpp @@ -10,6 +10,7 @@ // Windows User-Mode Driver Framework (WUDF) #include "Clients.h" +#include "EcCommunication.h" #include "Clients.tmh" @@ -47,6 +48,8 @@ OnTimerExpire( // Get data and push to clx Lock(pDevice->m_Lock); + // Make sure we have a handle to the EC driver + ConnectToEc(&pDevice->m_CrosEcHandle); Status = pDevice->GetData(pDevice->m_CrosEcHandle); if (!NT_SUCCESS(Status) && Status != STATUS_DATA_NOT_ACCEPTED) { diff --git a/FrameworkSensors/Clients.h b/FrameworkSensors/Clients.h index db0780f..1965fdb 100644 --- a/FrameworkSensors/Clients.h +++ b/FrameworkSensors/Clients.h @@ -222,7 +222,8 @@ typedef class _AccelerometerDevice : public _ComboDevice AccelerometerSample m_CachedData; AccelerometerSample m_LastSample; UINT8 m_LidSensorIndex; - UINT8 m_LidBaseSensor; + UINT8 m_BaseSensor; + BOOLEAN m_SensorIndicesInitialized; public: diff --git a/FrameworkSensors/Device.cpp b/FrameworkSensors/Device.cpp index c946fe0..c5197b0 100644 --- a/FrameworkSensors/Device.cpp +++ b/FrameworkSensors/Device.cpp @@ -219,43 +219,9 @@ OnPrepareHardware( ) { NTSTATUS Status = STATUS_SUCCESS; - ULONG i; - HANDLE Handle; - DWORD retb{}; - CROSEC_READMEM rm{}; SENSOR_FunctionEnter(); - Status = ConnectToEc(&Handle); - if (!NT_SUCCESS(Status)) { - TraceError("COMBO %!FUNC! ConnectToEc failed %!STATUS!", Status); - goto Exit; - } - - rm.bytes = 0xfe; - rm.offset = 0; - Status = DeviceIoControl(Handle, - (DWORD) IOCTL_CROSEC_RDMEM, - &rm, - sizeof(rm), - &rm, - sizeof(rm), - &retb, - nullptr); - if (!NT_SUCCESS(Status)) { - TraceError("COMBO %!FUNC! ConnectToEc failed %!STATUS!", Status); - goto Exit; - } - - UINT8 *EcMem = rm.buffer; - for (i = 0; i < 0xfe-16; i+=16) { - TraceInformation( - "%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", - EcMem[i], EcMem[i+1], EcMem[i+2], EcMem[i+3], EcMem[i+4], EcMem[i + 5], EcMem[i + 6], EcMem[i + 7], - EcMem[i + 8], EcMem[i+9], EcMem[i+10], EcMem[i+11], EcMem[i+12], EcMem[i + 13], EcMem[i + 14], EcMem[i + 15] - ); - } - for (ULONG Count = 0; Count < SensorInstanceCount; Count++) { PComboDevice pDevice = nullptr; @@ -285,7 +251,7 @@ OnPrepareHardware( AllocateDeviceAtIndex(Count, &pDevice); - pDevice->m_CrosEcHandle = Handle; + pDevice->m_CrosEcHandle = INVALID_HANDLE_VALUE; // Fill out properties Status = pDevice->Initialize(Device, SensorInstance); @@ -513,6 +479,13 @@ OnD0Exit( goto Exit; } + // Close EC handle before sleep to avoid stale handles after wake. + // The handle will be re-acquired in OnTimerExpire when the device wakes. + if (pDevice->m_CrosEcHandle != INVALID_HANDLE_VALUE) { + CloseHandle(pDevice->m_CrosEcHandle); + pDevice->m_CrosEcHandle = INVALID_HANDLE_VALUE; + } + pDevice->m_PoweredOn = FALSE; InitPropVariantFromUInt32(SensorState_Idle, &(pDevice->m_pProperties->List[SENSOR_COMMON_PROPERTY_STATE].Value)); diff --git a/FrameworkSensors/EcCommunication.cpp b/FrameworkSensors/EcCommunication.cpp index 00015c3..aebcbdb 100644 --- a/FrameworkSensors/EcCommunication.cpp +++ b/FrameworkSensors/EcCommunication.cpp @@ -21,7 +21,16 @@ NTSTATUS ConnectToEc( _Inout_ HANDLE* Handle ) { - NTSTATUS Status = STATUS_SUCCESS; + if (Handle == NULL) { + TraceError("%!FUNC! Handle pointer is NULL"); + return STATUS_INVALID_PARAMETER; + } + + if (*Handle != INVALID_HANDLE_VALUE) { + // Already connected + TraceError("%!FUNC! Already connected"); + return STATUS_SUCCESS; + } *Handle = CreateFileW( LR"(\\.\GLOBALROOT\Device\CrosEC)", @@ -33,11 +42,12 @@ NTSTATUS ConnectToEc( NULL); if (*Handle == INVALID_HANDLE_VALUE) { - TraceError("%!FUNC! CreateFileW failed %!STATUS!", Status); + TraceError("%!FUNC! CreateFileW failed"); return STATUS_INVALID_HANDLE; } - return Status; + TraceInformation("%!FUNC! Got Handle"); + return STATUS_SUCCESS; } int CrosEcSendCommand( @@ -50,12 +60,10 @@ int CrosEcSendCommand( unsigned int inlen ) { - NTSTATUS Status = STATUS_SUCCESS; DWORD retb{}; CROSEC_COMMAND cmd{}; if (Handle == INVALID_HANDLE_VALUE) { - Status = STATUS_INVALID_HANDLE; TraceError("%!FUNC! Invalid Handle"); return 0; } @@ -81,16 +89,16 @@ int CrosEcSendCommand( RtlCopyMemory(cmd.data, outdata, outlen); - Status = DeviceIoControl(Handle, + if (!DeviceIoControl(Handle, (DWORD) IOCTL_CROSEC_XCMD, &cmd, sizeof(cmd), &cmd, sizeof(cmd), &retb, - nullptr); - if (!NT_SUCCESS(Status)) { - TraceError("%!FUNC! ConnectToEc failed %!STATUS!", Status); + nullptr)) { + DWORD err = GetLastError(); + TraceError("%!FUNC! DeviceIoControl XCMD failed, error=%d", err); return 0; } @@ -113,28 +121,26 @@ int CrosEcSendCommand( int CrosEcReadMemU8(HANDLE Handle, unsigned int offset, UINT8* dest) { - NTSTATUS Status = STATUS_SUCCESS; DWORD retb{}; CROSEC_READMEM rm{}; if (Handle == INVALID_HANDLE_VALUE) { - Status = STATUS_INVALID_HANDLE; TraceError("%!FUNC! Invalid Handle"); return 0; } rm.bytes = 0x01; rm.offset = offset; - Status = DeviceIoControl(Handle, + if (!DeviceIoControl(Handle, (DWORD) IOCTL_CROSEC_RDMEM, &rm, sizeof(rm), &rm, sizeof(rm), &retb, - nullptr); - if (!NT_SUCCESS(Status)) { - TraceError("%!FUNC! ConnectToEc failed %!STATUS!", Status); + nullptr)) { + DWORD err = GetLastError(); + TraceError("%!FUNC! DeviceIoControl RDMEM failed, error=%d", err); return 0; } diff --git a/FrameworkSensors/FrameworkSensors.inx b/FrameworkSensors/FrameworkSensors.inx index 64166c2..f2a0ce3 100644 --- a/FrameworkSensors/FrameworkSensors.inx +++ b/FrameworkSensors/FrameworkSensors.inx @@ -16,7 +16,7 @@ Class = Sensor ClassGuid = {5175D334-C371-4806-B3BA-71FD53C9258D} Provider = %PROVIDER% CatalogFile = FrameworkSensors.cat -DriverVer = 2/19/2025,0.0.0.6 +DriverVer = 2/19/2025,0.0.7.0 PnpLockdown = 1 [SourceDisksNames] diff --git a/FrameworkSensors/FrameworkSensors.vcxproj b/FrameworkSensors/FrameworkSensors.vcxproj index 2be76a8..5963940 100644 --- a/FrameworkSensors/FrameworkSensors.vcxproj +++ b/FrameworkSensors/FrameworkSensors.vcxproj @@ -124,7 +124,7 @@ %(AdditionalDependencies);mincore.lib;propsys.lib;$(WDK_UM_LIB_PATH)\sensors\1.1\sensorscxstub.lib;sensorsutils.lib - 0.0.0.6 + 0.0.7.0 sha256 @@ -150,7 +150,7 @@ %(AdditionalDependencies);mincore.lib;propsys.lib;$(WDK_UM_LIB_PATH)\sensors\1.1\sensorscxstub.lib;sensorsutils.lib - 0.0.0.6 + 0.0.7.0 sha256 @@ -176,7 +176,7 @@ %(AdditionalDependencies);mincore.lib;propsys.lib;$(WDK_UM_LIB_PATH)\sensors\1.1\sensorscxstub.lib;sensorsutils.lib - 0.0.0.6 + 0.0.7.0 sha256 @@ -202,7 +202,7 @@ %(AdditionalDependencies);mincore.lib;propsys.lib;$(WDK_UM_LIB_PATH)\sensors\1.1\sensorscxstub.lib;sensorsutils.lib - 0.0.0.6 + 0.0.7.0 sha256