diff --git a/ecsim b/ecsim index f735f20..0af66f9 160000 --- a/ecsim +++ b/ecsim @@ -1 +1 @@ -Subproject commit f735f202a66f903dd571276fc67b8a679dd3ddae +Subproject commit 0af66f969924e2986edbb47c5e2f29fbfbf1ddd1 diff --git a/src/main.c b/src/main.c index e62ad0e..0f45cd4 100644 --- a/src/main.c +++ b/src/main.c @@ -72,14 +72,63 @@ void kbc_event(struct Kbc * kbc) { } } +enum PmcState { + PMC_STATE_DEFAULT, + PMC_STATE_ACPI_READ, + PMC_STATE_ACPI_WRITE, + PMC_STATE_ACPI_WRITE_ADDR, +}; + void pmc_event(struct Pmc * pmc) { + static enum PmcState state = PMC_STATE_DEFAULT; + static uint8_t state_data[2] = {0, 0}; + uint8_t sts = pmc_status(pmc); if (sts & PMC_STS_IBF) { uint8_t data = pmc_read(pmc); if (sts & PMC_STS_CMD) { - printf("PMC command: %X\n", data); + printf("PMC command: %02X\n", data); + + switch (data) { + case 0x80: + state = PMC_STATE_ACPI_READ; + printf(" ACPI read\n"); + break; + case 0x81: + state = PMC_STATE_ACPI_WRITE; + printf(" ACPI write\n"); + break; + default: + state = PMC_STATE_DEFAULT; + printf(" Unknown command\n"); + break; + } } else { - printf("PMC data: %X\n", data); + printf("PMC data: %02X\n", data); + + switch (state) { + case PMC_STATE_ACPI_READ: + state = PMC_STATE_DEFAULT; + //TODO - read value + uint8_t value = 0; + pmc_write(pmc, value); + printf(" ACPI read %02X = %02X\n", data, value); + break; + case PMC_STATE_ACPI_WRITE: + state = PMC_STATE_ACPI_WRITE_ADDR; + state_data[0] = data; + printf(" ACPI write %02X\n", data); + break; + case PMC_STATE_ACPI_WRITE_ADDR: + state = PMC_STATE_DEFAULT; + //TODO - write value + printf(" ACPI write %02X = %02X\n", state_data[0], data); + break; + default: + state = PMC_STATE_DEFAULT; + printf(" Unknown data\n"); + break; + } } } }