Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 61 additions & 21 deletions FrameworkSensors/AccelerometerClient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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");
Expand All @@ -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;
Expand Down Expand Up @@ -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;
}

//
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -663,4 +703,4 @@ AccelerometerDevice::UpdateCachedThreshold(
Exit:
SENSOR_FunctionExit(Status);
return Status;
}
}
3 changes: 3 additions & 0 deletions FrameworkSensors/Clients.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
// Windows User-Mode Driver Framework (WUDF)

#include "Clients.h"
#include "EcCommunication.h"

#include "Clients.tmh"

Expand Down Expand Up @@ -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)
{
Expand Down
3 changes: 2 additions & 1 deletion FrameworkSensors/Clients.h
Original file line number Diff line number Diff line change
Expand Up @@ -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:

Expand Down
43 changes: 8 additions & 35 deletions FrameworkSensors/Device.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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));
Expand Down
36 changes: 21 additions & 15 deletions FrameworkSensors/EcCommunication.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)",
Expand All @@ -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(
Expand All @@ -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;
}
Expand All @@ -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;
}

Expand All @@ -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;
}

Expand Down
2 changes: 1 addition & 1 deletion FrameworkSensors/FrameworkSensors.inx
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down
8 changes: 4 additions & 4 deletions FrameworkSensors/FrameworkSensors.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@
<AdditionalDependencies>%(AdditionalDependencies);mincore.lib;propsys.lib;$(WDK_UM_LIB_PATH)\sensors\1.1\sensorscxstub.lib;sensorsutils.lib</AdditionalDependencies>
</Link>
<Inf>
<TimeStamp>0.0.0.6</TimeStamp>
<TimeStamp>0.0.7.0</TimeStamp>
</Inf>
<DriverSign>
<FileDigestAlgorithm>sha256</FileDigestAlgorithm>
Expand All @@ -150,7 +150,7 @@
<AdditionalDependencies>%(AdditionalDependencies);mincore.lib;propsys.lib;$(WDK_UM_LIB_PATH)\sensors\1.1\sensorscxstub.lib;sensorsutils.lib</AdditionalDependencies>
</Link>
<Inf>
<TimeStamp>0.0.0.6</TimeStamp>
<TimeStamp>0.0.7.0</TimeStamp>
</Inf>
<DriverSign>
<FileDigestAlgorithm>sha256</FileDigestAlgorithm>
Expand All @@ -176,7 +176,7 @@
<AdditionalDependencies>%(AdditionalDependencies);mincore.lib;propsys.lib;$(WDK_UM_LIB_PATH)\sensors\1.1\sensorscxstub.lib;sensorsutils.lib</AdditionalDependencies>
</Link>
<Inf>
<TimeStamp>0.0.0.6</TimeStamp>
<TimeStamp>0.0.7.0</TimeStamp>
</Inf>
<DriverSign>
<FileDigestAlgorithm>sha256</FileDigestAlgorithm>
Expand All @@ -202,7 +202,7 @@
<AdditionalDependencies>%(AdditionalDependencies);mincore.lib;propsys.lib;$(WDK_UM_LIB_PATH)\sensors\1.1\sensorscxstub.lib;sensorsutils.lib</AdditionalDependencies>
</Link>
<Inf>
<TimeStamp>0.0.0.6</TimeStamp>
<TimeStamp>0.0.7.0</TimeStamp>
</Inf>
<DriverSign>
<FileDigestAlgorithm>sha256</FileDigestAlgorithm>
Expand Down
Loading