Skip to content

Commit 115d95d

Browse files
committed
Demo: direct port I/O access
Instead of going through crosecbus Signed-off-by: Daniel Schaefer <dhs@frame.work>
1 parent 088f093 commit 115d95d

3 files changed

Lines changed: 88 additions & 3 deletions

File tree

SensorsComboDriver/AlsClient.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,15 @@ AlsDevice::GetData(
531531
TraceInformation("Read ALS value %02x %02x %02x %02x (%f)\n",
532532
als[0], als[1], als[2], als[3], m_CachedData.Lux);
533533

534+
UINT8 als[4];
535+
als[0] = WDF_READ_PORT_UCHAR(Device, (PUCHAR) 0xE00 + 0x80 + 0);
536+
als[1] = WDF_READ_PORT_UCHAR(Device, (PUCHAR) 0xE00 + 0x80 + 1);
537+
als[2] = WDF_READ_PORT_UCHAR(Device, (PUCHAR) 0xE00 + 0x80 + 2);
538+
als[3] = WDF_READ_PORT_UCHAR(Device, (PUCHAR) 0xE00 + 0x80 + 3);
539+
m_CachedData.Lux = (float) (als[0] + (als[1] << 8) + (als[2] << 16) + (als[3] << 24));
540+
TraceInformation("Read ALS value %02x %02x %02x %02x (%f)\n",
541+
als[0], als[1], als[2], als[3], m_CachedData.Lux);
542+
534543
// new sample?
535544
if (m_FirstSample != FALSE)
536545
{

SensorsComboDriver/Device.cpp

Lines changed: 74 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -226,18 +226,72 @@ OnDeviceAdd(
226226
NTSTATUS
227227
OnPrepareHardware(
228228
_In_ WDFDEVICE Device,
229-
_In_ WDFCMRESLIST /*ResourcesRaw*/,
230-
_In_ WDFCMRESLIST /*ResourcesTranslated*/
229+
_In_ WDFCMRESLIST ResourcesRaw,
230+
_In_ WDFCMRESLIST ResourcesTranslated
231231
)
232232
{
233233
NTSTATUS Status = STATUS_SUCCESS;
234+
PCM_PARTIAL_RESOURCE_DESCRIPTOR desc = NULL;
235+
PCM_PARTIAL_RESOURCE_DESCRIPTOR descTranslated = NULL;
234236
ULONG i;
235237
HANDLE Handle;
236238
DWORD retb{};
237239
CROSEC_READMEM rm{};
238240

239241
SENSOR_FunctionEnter();
240242

243+
TraceInformation("%!FUNC! Device 0x%p ResRaw 0x%p ResTrans "
244+
"0x%p Count %d\n", Device, ResourcesRaw, ResourcesTranslated,
245+
WdfCmResourceListGetCount(ResourcesTranslated));
246+
for (i = 0; i < WdfCmResourceListGetCount(ResourcesTranslated); i++) {
247+
desc = WdfCmResourceListGetDescriptor(ResourcesRaw, i);
248+
descTranslated = WdfCmResourceListGetDescriptor(ResourcesTranslated, i);
249+
250+
switch (desc->Type) {
251+
case CmResourceTypeMemory:
252+
TraceInformation("%!FUNC!: found CmResourceTypeMemory resources \n");
253+
break;
254+
case CmResourceTypePort:
255+
TraceInformation("%!FUNC!: found CmResourceTypePort"
256+
" resource\n");
257+
switch (descTranslated->Type) {
258+
case CmResourceTypePort:
259+
TraceInformation("Resource Translated Port: (%x) Length: (%d), matching: %d\n",
260+
descTranslated->u.Port.Start.LowPart,
261+
descTranslated->u.Port.Length,
262+
descTranslated->u.Port.Start.LowPart == EC_LPC_ADDR_MEMMAP);
263+
break;
264+
case CmResourceTypeMemory:
265+
TraceInformation("Resource Translated Memory: (%x) Length: (%d)\n",
266+
descTranslated->u.Memory.Start.LowPart,
267+
descTranslated->u.Memory.Length);
268+
break;
269+
default:
270+
TraceInformation("Unhandled resource_type (0x%x)\n",
271+
descTranslated->Type);
272+
}
273+
break;
274+
case CmResourceTypeInterrupt:
275+
TraceInformation("%!FUNC!: found CmResourceTypeInterrupt"
276+
"resource\n");
277+
break;
278+
279+
case CmResourceTypeConnection:
280+
TraceInformation("%!FUNC!: found CmResourceTypeConnection"
281+
"resource\n");
282+
break;
283+
284+
default:
285+
TraceInformation("%!FUNC!: found resources of type %d"
286+
"(CM_RESOURCE_TYPE)\n", desc->Type);
287+
break;
288+
}
289+
}
290+
291+
if (i == 0) {
292+
TraceInformation("%!FUNC!: no cm resources found \n");
293+
}
294+
241295
Status = ConnectToEc(Device, &Handle);
242296
if (!NT_SUCCESS(Status)) {
243297
TraceError("COMBO %!FUNC! ConnectToEc failed %!STATUS!", Status);
@@ -429,6 +483,24 @@ OnD0Entry(
429483

430484
SENSOR_FunctionEnter();
431485

486+
UINT8 EcMem[0x100];
487+
for (int offset = 0; offset < 0x100; offset++) {
488+
cros_ec_sensors_cmd_read_u8(Device, offset, &EcMem[offset]);
489+
}
490+
for (int i = 0; i < 0x100-8; i+=8) {
491+
TraceInformation(
492+
"%02X %02X %02X %02X %02X %02X %02X %02X\n",
493+
EcMem[i], EcMem[i+1], EcMem[i+2], EcMem[i+3], EcMem[i+4], EcMem[i + 5], EcMem[i + 6], EcMem[i + 7]
494+
);
495+
}
496+
497+
UINT8 data;
498+
data = WDF_READ_PORT_UCHAR(Device, (PUCHAR) 0xE00 + 0x20);
499+
TraceInformation("Read value %d from port address 0x%d+0x20\n", data,
500+
0xE00);
501+
data = WDF_READ_PORT_UCHAR(Device, (PUCHAR) 0xE00 + 0x21);
502+
TraceInformation("Read value %d from port address 0x%d+0x21\n", data,
503+
0xE00);
432504

433505
//
434506
// Get sensor instances

SensorsComboDriver/SensorsComboDriver.inx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,11 @@ SensorsComboDriver.dll = 1,,
3737
[SensorsComboDriver_Device.NT$ARCH$.10.0...22000]
3838
; DisplayName Section DeviceId
3939
; ----------- ------- --------
40-
%SensorsComboDriver_DevDesc% = SensorsComboDriver_Inst, umdf2\SensorsComboDriver
40+
; %SensorsComboDriver_DevDesc% = SensorsComboDriver_Inst, umdf2\SensorsComboDriver
41+
; ACPI Device with _CRS section that maps the port I/O ranges that we need to access
42+
; ACPI\FRMWC004
43+
; ACPI\PNP0C09
44+
%SensorsComboDriver_DevDesc% = SensorsComboDriver_Inst, ACPI\PNP0C09
4145

4246
[SensorsComboDriver_Inst.NT]
4347
Include=WUDFRD.inf

0 commit comments

Comments
 (0)