Skip to content

Commit b1e8de9

Browse files
committed
Hook up to ALS sensor
Works on 13in to report ALS reading. Signed-off-by: Daniel Schaefer <dhs@frame.work>
1 parent be4068b commit b1e8de9

6 files changed

Lines changed: 141 additions & 84 deletions

File tree

SensorsComboDriver/AlsClient.cpp

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
// Windows User-Mode Driver Framework (WUDF)
1010

1111
#include "Clients.h"
12+
#include <handleapi.h>
1213

1314
#include "AlsClient.tmh"
1415

@@ -462,6 +463,40 @@ AlsDevice::Initialize(
462463
}
463464

464465

466+
static int CrosEcReadMemU8(HANDLE Handle, unsigned int offset, UINT8* dest)
467+
{
468+
NTSTATUS Status = STATUS_SUCCESS;
469+
DWORD retb{};
470+
CROSEC_READMEM rm{};
471+
472+
if (Handle == INVALID_HANDLE_VALUE) {
473+
Status = STATUS_INVALID_HANDLE;
474+
TraceError("COMBO %!FUNC! Invalid Handle");
475+
return 0;
476+
}
477+
478+
rm.bytes = 0x01;
479+
rm.offset = offset;
480+
Status = DeviceIoControl(Handle,
481+
(DWORD) IOCTL_CROSEC_RDMEM,
482+
&rm,
483+
sizeof(rm),
484+
&rm,
485+
sizeof(rm),
486+
&retb,
487+
nullptr);
488+
if (!NT_SUCCESS(Status)) {
489+
TraceError("COMBO %!FUNC! ConnectToEc failed %!STATUS!", Status);
490+
return 0;
491+
}
492+
493+
TraceInformation("COMBO %!FUNC! Successfully read %d bytes from EC memory at %02x. First one %02x. retb=%d", rm.bytes, rm.offset, rm.buffer[0], retb);
494+
*dest = rm.buffer[0];
495+
496+
return rm.bytes;
497+
}
498+
499+
465500

466501
//------------------------------------------------------------------------------
467502
// Function: GetData
@@ -478,6 +513,7 @@ AlsDevice::Initialize(
478513
//------------------------------------------------------------------------------
479514
NTSTATUS
480515
AlsDevice::GetData(
516+
_In_ HANDLE Handle
481517
)
482518
{
483519
BOOLEAN DataReady = FALSE;
@@ -486,6 +522,15 @@ AlsDevice::GetData(
486522

487523
SENSOR_FunctionEnter();
488524

525+
UINT8 als[4] = {0};
526+
CrosEcReadMemU8(Handle, 0x80 + 0, &als[0]);
527+
CrosEcReadMemU8(Handle, 0x80 + 1, &als[1]);
528+
CrosEcReadMemU8(Handle, 0x80 + 2, &als[2]);
529+
CrosEcReadMemU8(Handle, 0x80 + 3, &als[3]);
530+
m_CachedData.Lux = (float) (als[0] + (als[1] << 8) + (als[2] << 16) + (als[3] << 24));
531+
TraceInformation("Read ALS value %02x %02x %02x %02x (%f)\n",
532+
als[0], als[1], als[2], als[3], m_CachedData.Lux);
533+
489534
// new sample?
490535
if (m_FirstSample != FALSE)
491536
{

SensorsComboDriver/Clients.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ OnTimerExpire(
4747

4848
// Get data and push to clx
4949
Lock(pDevice->m_Lock);
50-
Status = pDevice->GetData();
50+
Status = pDevice->GetData(pDevice->m_CrosEcHandle);
5151
if (!NT_SUCCESS(Status) && Status != STATUS_DATA_NOT_ACCEPTED)
5252
{
5353
TraceError("COMBO %!FUNC! GetData Failed %!STATUS!", Status);

SensorsComboDriver/Clients.h

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ typedef class _ComboDevice
126126
ULONG m_StartTime;
127127
ULONGLONG m_SampleCount;
128128
BOOLEAN m_WakeEnabled;
129+
HANDLE m_CrosEcHandle;
129130

130131
//
131132
// Sensor Specific Properties
@@ -142,7 +143,7 @@ typedef class _ComboDevice
142143
// Sensor specific functions
143144
//
144145
virtual NTSTATUS Initialize(_In_ WDFDEVICE Device, _In_ SENSOROBJECT SensorObj) = NULL;
145-
virtual NTSTATUS GetData() = NULL;
146+
virtual NTSTATUS GetData(_In_ HANDLE Handle) = NULL;
146147
virtual NTSTATUS UpdateCachedThreshold() = NULL;
147148
virtual NTSTATUS EnableWake() { return STATUS_NOT_SUPPORTED; }
148149
virtual NTSTATUS DisableWake() { return STATUS_NOT_SUPPORTED; }
@@ -197,7 +198,7 @@ typedef class _AlsDevice : public _ComboDevice
197198
public:
198199

199200
NTSTATUS Initialize(_In_ WDFDEVICE Device, _In_ SENSOROBJECT SensorObj);
200-
NTSTATUS GetData();
201+
NTSTATUS GetData(_In_ HANDLE Device);
201202
NTSTATUS UpdateCachedThreshold();
202203

203204
} AlsDevice, *PAlsDevice;
@@ -224,7 +225,7 @@ typedef class _LinearAccelerometerDevice : public _ComboDevice
224225
public:
225226

226227
NTSTATUS Initialize(_In_ WDFDEVICE Device, _In_ SENSOROBJECT SensorObj);
227-
NTSTATUS GetData();
228+
NTSTATUS GetData(_In_ HANDLE Device);
228229
NTSTATUS UpdateCachedThreshold();
229230

230231
} LinearAccelerometerDevice, *PLinearAccelerometerDevice;
@@ -251,7 +252,23 @@ typedef class _SimpleDeviceOrientationDevice : public _ComboDevice
251252
public:
252253

253254
NTSTATUS Initialize(_In_ WDFDEVICE Device, _In_ SENSOROBJECT SensorObj);
254-
NTSTATUS GetData();
255+
NTSTATUS GetData(_In_ HANDLE Device);
255256
NTSTATUS UpdateCachedThreshold();
256257

257258
} SimpleDeviceOrientationDevice, *PSimpleDeviceOrientationDevice;
259+
260+
#define FILE_DEVICE_CROS_EMBEDDED_CONTROLLER 0x80EC
261+
262+
#define IOCTL_CROSEC_XCMD \
263+
CTL_CODE(FILE_DEVICE_CROS_EMBEDDED_CONTROLLER, 0x801, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
264+
#define IOCTL_CROSEC_RDMEM CTL_CODE(FILE_DEVICE_CROS_EMBEDDED_CONTROLLER, 0x802, METHOD_BUFFERED, FILE_READ_DATA)
265+
266+
#define CROSEC_CMD_MAX_REQUEST 0x100
267+
#define CROSEC_CMD_MAX_RESPONSE 0x100
268+
#define CROSEC_MEMMAP_SIZE 0xFF
269+
270+
typedef struct _CROSEC_READMEM {
271+
ULONG offset;
272+
ULONG bytes;
273+
UCHAR buffer[CROSEC_MEMMAP_SIZE];
274+
} * PCROSEC_READMEM, CROSEC_READMEM;

SensorsComboDriver/Device.cpp

Lines changed: 68 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,38 @@ void AllocateDeviceAtIndex(
6464
}
6565
}
6666

67+
NTSTATUS ConnectToEc(
68+
_In_ WDFDEVICE FxDevice,
69+
_Inout_ HANDLE *Handle
70+
) {
71+
SENSOR_FunctionEnter();
72+
NTSTATUS Status = STATUS_SUCCESS;
73+
74+
UNREFERENCED_PARAMETER(FxDevice);
75+
76+
*Handle = CreateFileW(
77+
LR"(\\.\GLOBALROOT\Device\CrosEC)",
78+
GENERIC_READ | GENERIC_WRITE,
79+
FILE_SHARE_READ | FILE_SHARE_WRITE,
80+
NULL,
81+
OPEN_EXISTING,
82+
FILE_FLAG_OVERLAPPED,
83+
NULL);
84+
85+
if (*Handle == INVALID_HANDLE_VALUE) {
86+
Status = STATUS_INVALID_HANDLE;
87+
TraceError("COMBO %!FUNC! CreateFileW failed %!STATUS!", Status);
88+
goto Exit;
89+
}
90+
91+
Exit:
92+
SENSOR_FunctionExit(Status);
93+
94+
return Status;
95+
}
96+
97+
98+
6799
//------------------------------------------------------------------------------
68100
//
69101
// Function: OnDeviceAdd
@@ -199,9 +231,43 @@ OnPrepareHardware(
199231
)
200232
{
201233
NTSTATUS Status = STATUS_SUCCESS;
234+
ULONG i;
235+
HANDLE Handle;
236+
DWORD retb{};
237+
CROSEC_READMEM rm{};
202238

203239
SENSOR_FunctionEnter();
204240

241+
Status = ConnectToEc(Device, &Handle);
242+
if (!NT_SUCCESS(Status)) {
243+
TraceError("COMBO %!FUNC! ConnectToEc failed %!STATUS!", Status);
244+
goto Exit;
245+
}
246+
247+
rm.bytes = 0xfe;
248+
rm.offset = 0;
249+
Status = DeviceIoControl(Handle,
250+
(DWORD) IOCTL_CROSEC_RDMEM,
251+
&rm,
252+
sizeof(rm),
253+
&rm,
254+
sizeof(rm),
255+
&retb,
256+
nullptr);
257+
if (!NT_SUCCESS(Status)) {
258+
TraceError("COMBO %!FUNC! ConnectToEc failed %!STATUS!", Status);
259+
goto Exit;
260+
}
261+
262+
UINT8 *EcMem = rm.buffer;
263+
for (i = 0; i < 0xfe-16; i+=16) {
264+
TraceInformation(
265+
"%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
266+
EcMem[i], EcMem[i+1], EcMem[i+2], EcMem[i+3], EcMem[i+4], EcMem[i + 5], EcMem[i + 6], EcMem[i + 7],
267+
EcMem[i + 8], EcMem[i+9], EcMem[i+10], EcMem[i+11], EcMem[i+12], EcMem[i + 13], EcMem[i + 14], EcMem[i + 15]
268+
);
269+
}
270+
205271
for (ULONG Count = 0; Count < SensorInstanceCount; Count++)
206272
{
207273
PComboDevice pDevice = nullptr;
@@ -231,6 +297,8 @@ OnPrepareHardware(
231297

232298
AllocateDeviceAtIndex(Count, &pDevice);
233299

300+
pDevice->m_CrosEcHandle = Handle;
301+
234302
// Fill out properties
235303
Status = pDevice->Initialize(Device, SensorInstance);
236304
if (!NT_SUCCESS(Status))
@@ -331,80 +399,6 @@ OnReleaseHardware(
331399
return Status;
332400
}
333401

334-
#define FILE_DEVICE_CROS_EMBEDDED_CONTROLLER 0x80EC
335-
336-
#define IOCTL_CROSEC_XCMD \
337-
CTL_CODE(FILE_DEVICE_CROS_EMBEDDED_CONTROLLER, 0x801, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
338-
#define IOCTL_CROSEC_RDMEM CTL_CODE(FILE_DEVICE_CROS_EMBEDDED_CONTROLLER, 0x802, METHOD_BUFFERED, FILE_READ_DATA)
339-
340-
#define CROSEC_CMD_MAX_REQUEST 0x100
341-
#define CROSEC_CMD_MAX_RESPONSE 0x100
342-
#define CROSEC_MEMMAP_SIZE 0xFF
343-
344-
typedef struct _CROSEC_READMEM {
345-
ULONG offset;
346-
ULONG bytes;
347-
UCHAR buffer[CROSEC_MEMMAP_SIZE];
348-
} * PCROSEC_READMEM, CROSEC_READMEM;
349-
350-
351-
NTSTATUS ConnectToEc(
352-
_In_ WDFDEVICE FxDevice
353-
) {
354-
SENSOR_FunctionEnter();
355-
NTSTATUS Status = STATUS_SUCCESS;
356-
HANDLE h;
357-
CROSEC_READMEM rm{};
358-
DWORD retb{};
359-
360-
UNREFERENCED_PARAMETER(FxDevice);
361-
362-
h = CreateFileW(
363-
LR"(\\.\GLOBALROOT\Device\CrosEC)",
364-
GENERIC_READ | GENERIC_WRITE,
365-
FILE_SHARE_READ | FILE_SHARE_WRITE,
366-
NULL,
367-
OPEN_EXISTING,
368-
FILE_FLAG_OVERLAPPED,
369-
NULL);
370-
371-
if (h == INVALID_HANDLE_VALUE) {
372-
Status = STATUS_INVALID_HANDLE;
373-
TraceError("COMBO %!FUNC! CreateFileW failed %!STATUS!", Status);
374-
goto Exit;
375-
}
376-
377-
rm.bytes = 0xfe;
378-
rm.offset = 0;
379-
Status = DeviceIoControl(h,
380-
(DWORD) IOCTL_CROSEC_RDMEM,
381-
&rm,
382-
sizeof(rm),
383-
&rm,
384-
sizeof(rm),
385-
&retb,
386-
nullptr);
387-
if (!NT_SUCCESS(Status)) {
388-
TraceError("COMBO %!FUNC! ConnectToEc failed %!STATUS!", Status);
389-
goto Exit;
390-
}
391-
392-
UINT8 *EcMem = rm.buffer;
393-
for (int i = 0; i < 0xfe-16; i+=16) {
394-
TraceInformation(
395-
"%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
396-
EcMem[i], EcMem[i+1], EcMem[i+2], EcMem[i+3], EcMem[i+4], EcMem[i + 5], EcMem[i + 6], EcMem[i + 7],
397-
EcMem[i + 8], EcMem[i+9], EcMem[i+10], EcMem[i+11], EcMem[i+12], EcMem[i + 13], EcMem[i + 14], EcMem[i + 15]
398-
);
399-
}
400-
401-
Exit:
402-
SENSOR_FunctionExit(Status);
403-
404-
return Status;
405-
}
406-
407-
408402
//------------------------------------------------------------------------------
409403
//
410404
// Function: OnD0Entry
@@ -435,11 +429,6 @@ OnD0Entry(
435429

436430
SENSOR_FunctionEnter();
437431

438-
Status = ConnectToEc(Device);
439-
if (!NT_SUCCESS(Status)) {
440-
TraceError("COMBO %!FUNC! ConnectToEc failed %!STATUS!", Status);
441-
goto Exit;
442-
}
443432

444433
//
445434
// Get sensor instances

SensorsComboDriver/SimpleDeviceOrientationClient.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,12 +364,15 @@ SimpleDeviceOrientationDevice::Initialize(
364364
//------------------------------------------------------------------------------
365365
NTSTATUS
366366
SimpleDeviceOrientationDevice::GetData(
367+
_In_ HANDLE Device
367368
)
368369
{
369370
BOOLEAN DataReady = FALSE;
370371
FILETIME TimeStamp = {0};
371372
NTSTATUS Status = STATUS_SUCCESS;
372373

374+
UNREFERENCED_PARAMETER(Device);
375+
373376
SENSOR_FunctionEnter();
374377

375378
// new sample?

SensorsComboDriver/linearaccelerometerclient.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,12 +387,15 @@ LinearAccelerometerDevice::Initialize(
387387
//------------------------------------------------------------------------------
388388
NTSTATUS
389389
LinearAccelerometerDevice::GetData(
390+
_In_ HANDLE Device
390391
)
391392
{
392393
BOOLEAN DataReady = FALSE;
393394
FILETIME TimeStamp = {0};
394395
NTSTATUS Status = STATUS_SUCCESS;
395396

397+
UNREFERENCED_PARAMETER(Device);
398+
396399
SENSOR_FunctionEnter();
397400

398401
// new sample?

0 commit comments

Comments
 (0)