Skip to content

Commit be4068b

Browse files
committed
Proof of concept UMDF=>crosecbus interaction
Can see the the full EC memory map dump in TraceView. Signed-off-by: Daniel Schaefer <dhs@frame.work>
1 parent e02d0ec commit be4068b

1 file changed

Lines changed: 82 additions & 0 deletions

File tree

SensorsComboDriver/Device.cpp

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,13 @@
1313
#include "Driver.h"
1414

1515
#include <new.h>
16+
#include <winnt.h>
1617

1718
#include "Device.tmh"
1819

20+
#define EC_LPC_ADDR_MEMMAP 0xE00
21+
#define EC_MEMMAP_SIZE 255 /* ACPI IO buffer max is 255 bytes */
22+
1923
//---------------------------------------
2024
// Declare and map devices below
2125
//---------------------------------------
@@ -327,6 +331,78 @@ OnReleaseHardware(
327331
return Status;
328332
}
329333

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+
}
330406

331407

332408
//------------------------------------------------------------------------------
@@ -359,6 +435,12 @@ OnD0Entry(
359435

360436
SENSOR_FunctionEnter();
361437

438+
Status = ConnectToEc(Device);
439+
if (!NT_SUCCESS(Status)) {
440+
TraceError("COMBO %!FUNC! ConnectToEc failed %!STATUS!", Status);
441+
goto Exit;
442+
}
443+
362444
//
363445
// Get sensor instances
364446
//

0 commit comments

Comments
 (0)