From c1757e0ddbf8c63b1397047a21245ce18411ef12 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Sun, 29 Sep 2019 12:51:14 -0600 Subject: [PATCH] Move event loops outside of main.c --- src/acpi.c | 15 ++++++++++ src/include/acpi.h | 9 ++++++ src/include/kbc.h | 36 ++++++++++++---------- src/include/pmc.h | 34 +++++++++++---------- src/kbc.c | 22 +++++++++++--- src/main.c | 75 +--------------------------------------------- src/pmc.c | 62 ++++++++++++++++++++++++++++++++++++-- 7 files changed, 141 insertions(+), 112 deletions(-) create mode 100644 src/acpi.c create mode 100644 src/include/acpi.h diff --git a/src/acpi.c b/src/acpi.c new file mode 100644 index 0000000..e8b3f3c --- /dev/null +++ b/src/acpi.c @@ -0,0 +1,15 @@ +#include + +#include "include/acpi.h" + +uint8_t acpi_read(uint8_t addr) { + uint8_t data = 0; + //TODO + printf("acpi_read %02X = %02X\n", addr, data); + return data; +} + +void acpi_write(uint8_t addr, uint8_t data) { + //TODO + printf("acpi_write %02X = %02X\n", addr, data); +} diff --git a/src/include/acpi.h b/src/include/acpi.h new file mode 100644 index 0000000..2122af2 --- /dev/null +++ b/src/include/acpi.h @@ -0,0 +1,9 @@ +#ifndef _ACPI_H_ +#define _ACPI_H_ + +#include + +uint8_t acpi_read(uint8_t addr); +void acpi_write(uint8_t addr, uint8_t data); + +#endif // _ACPI_H_ diff --git a/src/include/kbc.h b/src/include/kbc.h index 7dcc189..1a3b6d9 100644 --- a/src/include/kbc.h +++ b/src/include/kbc.h @@ -1,21 +1,23 @@ #ifndef _KBC_H_ #define _KBC_H_ +#include + void kbc_init(void); struct Kbc { // Control register - volatile unsigned char * control; + volatile uint8_t * control; // Interrupt control register - volatile unsigned char * irq; + volatile uint8_t * irq; // Status register - volatile unsigned char * status; + volatile uint8_t * status; // Keyboard out register - volatile unsigned char * keyboard_out; + volatile uint8_t * keyboard_out; // Mouse out register - volatile unsigned char * mouse_out; + volatile uint8_t * mouse_out; // Data in register - volatile unsigned char * data_in; + volatile uint8_t * data_in; }; extern __code struct Kbc KBC; @@ -24,16 +26,18 @@ extern __code struct Kbc KBC; #define KBC_STS_IBF (1 << 1) #define KBC_STS_CMD (1 << 3) -unsigned char kbc_status(struct Kbc * kbc); -unsigned char kbc_read(struct Kbc * kbc); -void kbc_keyboard(struct Kbc * kbc, unsigned char data); -void kbc_mouse(struct Kbc * kbc, unsigned char data); +uint8_t kbc_status(struct Kbc * kbc); +uint8_t kbc_read(struct Kbc * kbc); +void kbc_keyboard(struct Kbc * kbc, uint8_t data); +void kbc_mouse(struct Kbc * kbc, uint8_t data); -__xdata volatile unsigned char __at(0x1300) KBHICR; -__xdata volatile unsigned char __at(0x1302) KBIRQR; -__xdata volatile unsigned char __at(0x1304) KBHISR; -__xdata volatile unsigned char __at(0x1306) KBHIKDOR; -__xdata volatile unsigned char __at(0x1308) KBHIMDOR; -__xdata volatile unsigned char __at(0x130A) KBHIDIR; +void kbc_event(struct Kbc * kbc); + +__xdata volatile uint8_t __at(0x1300) KBHICR; +__xdata volatile uint8_t __at(0x1302) KBIRQR; +__xdata volatile uint8_t __at(0x1304) KBHISR; +__xdata volatile uint8_t __at(0x1306) KBHIKDOR; +__xdata volatile uint8_t __at(0x1308) KBHIMDOR; +__xdata volatile uint8_t __at(0x130A) KBHIDIR; #endif // _KBC_H_ diff --git a/src/include/pmc.h b/src/include/pmc.h index 3474ea0..92eb120 100644 --- a/src/include/pmc.h +++ b/src/include/pmc.h @@ -1,17 +1,19 @@ #ifndef _PMC_H_ #define _PMC_H_ +#include + void pmc_init(void); struct Pmc { // Status register - volatile unsigned char * status; + volatile uint8_t * status; // Data out register - volatile unsigned char * data_out; + volatile uint8_t * data_out; // Data in register - volatile unsigned char * data_in; + volatile uint8_t * data_in; // Control register - volatile unsigned char * control; + volatile uint8_t * control; }; extern __code struct Pmc PMC_1; @@ -21,18 +23,20 @@ extern __code struct Pmc PMC_2; #define PMC_STS_IBF (1 << 1) #define PMC_STS_CMD (1 << 3) -unsigned char pmc_status(struct Pmc * pmc); -unsigned char pmc_read(struct Pmc * pmc); -void pmc_write(struct Pmc * pmc, unsigned char data); +uint8_t pmc_status(struct Pmc * pmc); +uint8_t pmc_read(struct Pmc * pmc); +void pmc_write(struct Pmc * pmc, uint8_t data); -__xdata volatile unsigned char __at(0x1500) PM1STS; -__xdata volatile unsigned char __at(0x1501) PM1DO; -__xdata volatile unsigned char __at(0x1504) PM1DI; -__xdata volatile unsigned char __at(0x1506) PM1CTL; +void pmc_event(struct Pmc * pmc); -__xdata volatile unsigned char __at(0x1510) PM2STS; -__xdata volatile unsigned char __at(0x1511) PM2DO; -__xdata volatile unsigned char __at(0x1514) PM2DI; -__xdata volatile unsigned char __at(0x1516) PM2CTL; +__xdata volatile uint8_t __at(0x1500) PM1STS; +__xdata volatile uint8_t __at(0x1501) PM1DO; +__xdata volatile uint8_t __at(0x1504) PM1DI; +__xdata volatile uint8_t __at(0x1506) PM1CTL; + +__xdata volatile uint8_t __at(0x1510) PM2STS; +__xdata volatile uint8_t __at(0x1511) PM2DO; +__xdata volatile uint8_t __at(0x1514) PM2DI; +__xdata volatile uint8_t __at(0x1516) PM2CTL; #endif // _PMC_H_ diff --git a/src/kbc.c b/src/kbc.c index cdd9e87..20e1a49 100644 --- a/src/kbc.c +++ b/src/kbc.c @@ -1,3 +1,5 @@ +#include + #include "include/kbc.h" __code struct Kbc KBC = { @@ -14,18 +16,30 @@ void kbc_init(void) { *(KBC.control) = 0x48; } -unsigned char kbc_status(struct Kbc * kbc) { +uint8_t kbc_status(struct Kbc * kbc) { return *(kbc->status); } -unsigned char kbc_read(struct Kbc * kbc) { +uint8_t kbc_read(struct Kbc * kbc) { return *(kbc->data_in); } -void kbc_keyboard(struct Kbc * kbc, unsigned char data) { +void kbc_keyboard(struct Kbc * kbc, uint8_t data) { *(kbc->keyboard_out) = data; } -void kbc_mouse(struct Kbc * kbc, unsigned char data) { +void kbc_mouse(struct Kbc * kbc, uint8_t data) { *(kbc->mouse_out) = data; } + +void kbc_event(struct Kbc * kbc) { + uint8_t sts = kbc_status(kbc); + if (sts & KBC_STS_IBF) { + uint8_t data = kbc_read(kbc); + if (sts & KBC_STS_CMD) { + printf("kbc cmd: %02X\n", data); + } else { + printf("kbc data: %02X\n", data); + } + } +} diff --git a/src/main.c b/src/main.c index 0f45cd4..7219abb 100644 --- a/src/main.c +++ b/src/main.c @@ -1,6 +1,6 @@ #include -#include #include +#include #include "include/delay.h" #include "include/gpio.h" @@ -60,79 +60,6 @@ void power_switch(void) { last = new; } -void kbc_event(struct Kbc * kbc) { - uint8_t sts = kbc_status(kbc); - if (sts & KBC_STS_IBF) { - uint8_t data = kbc_read(kbc); - if (sts & KBC_STS_CMD) { - printf("KBC command: %X\n", data); - } else { - printf("KBC data: %X\n", data); - } - } -} - -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: %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: %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; - } - } - } -} - struct Pin LED_BAT_CHG = PIN(A, 5); struct Pin LED_BAT_FULL = PIN(A, 6); struct Pin LED_PWR = PIN(A, 7); diff --git a/src/pmc.c b/src/pmc.c index 9a651c9..b9ad3ee 100644 --- a/src/pmc.c +++ b/src/pmc.c @@ -1,3 +1,6 @@ +#include + +#include "include/acpi.h" #include "include/pmc.h" #define PMC(NUM) { \ @@ -15,14 +18,67 @@ void pmc_init(void) { *(PMC_2.control) = 0x41; } -unsigned char pmc_status(struct Pmc * pmc) { +uint8_t pmc_status(struct Pmc * pmc) { return *(pmc->status); } -unsigned char pmc_read(struct Pmc * pmc) { +uint8_t pmc_read(struct Pmc * pmc) { return *(pmc->data_in); } -void pmc_write(struct Pmc * pmc, unsigned char data) { +void pmc_write(struct Pmc * pmc, uint8_t data) { *(pmc->data_out) = data; } + +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 cmd: %02X\n", data); + + switch (data) { + case 0x80: + state = PMC_STATE_ACPI_READ; + break; + case 0x81: + state = PMC_STATE_ACPI_WRITE; + break; + default: + state = PMC_STATE_DEFAULT; + break; + } + } else { + printf("pmc data: %02X\n", data); + + switch (state) { + case PMC_STATE_ACPI_READ: + state = PMC_STATE_DEFAULT; + uint8_t value = acpi_read(data); + pmc_write(pmc, value); + break; + case PMC_STATE_ACPI_WRITE: + state = PMC_STATE_ACPI_WRITE_ADDR; + state_data[0] = data; + break; + case PMC_STATE_ACPI_WRITE_ADDR: + state = PMC_STATE_DEFAULT; + acpi_write(state_data[0], data); + break; + default: + state = PMC_STATE_DEFAULT; + break; + } + } + } +}