|
13 | 13 | #include "Driver.h" |
14 | 14 |
|
15 | 15 | #include <new.h> |
| 16 | +#include <winnt.h> |
16 | 17 |
|
17 | 18 | #include "Device.tmh" |
18 | 19 |
|
| 20 | +#define EC_LPC_ADDR_MEMMAP 0xE00 |
| 21 | +#define EC_MEMMAP_SIZE 255 /* ACPI IO buffer max is 255 bytes */ |
| 22 | + |
19 | 23 | //--------------------------------------- |
20 | 24 | // Declare and map devices below |
21 | 25 | //--------------------------------------- |
@@ -327,6 +331,78 @@ OnReleaseHardware( |
327 | 331 | return Status; |
328 | 332 | } |
329 | 333 |
|
| 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 | +} |
330 | 406 |
|
331 | 407 |
|
332 | 408 | //------------------------------------------------------------------------------ |
@@ -359,6 +435,12 @@ OnD0Entry( |
359 | 435 |
|
360 | 436 | SENSOR_FunctionEnter(); |
361 | 437 |
|
| 438 | + Status = ConnectToEc(Device); |
| 439 | + if (!NT_SUCCESS(Status)) { |
| 440 | + TraceError("COMBO %!FUNC! ConnectToEc failed %!STATUS!", Status); |
| 441 | + goto Exit; |
| 442 | + } |
| 443 | + |
362 | 444 | // |
363 | 445 | // Get sensor instances |
364 | 446 | // |
|
0 commit comments