Move event loops outside of main.c

This commit is contained in:
Jeremy Soller 2019-09-29 12:51:14 -06:00
parent f00326edd1
commit c1757e0ddb
No known key found for this signature in database
GPG Key ID: E988B49EE78A7FB1
7 changed files with 141 additions and 112 deletions

15
src/acpi.c Normal file
View File

@ -0,0 +1,15 @@
#include <stdio.h>
#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);
}

9
src/include/acpi.h Normal file
View File

@ -0,0 +1,9 @@
#ifndef _ACPI_H_
#define _ACPI_H_
#include <stdint.h>
uint8_t acpi_read(uint8_t addr);
void acpi_write(uint8_t addr, uint8_t data);
#endif // _ACPI_H_

View File

@ -1,21 +1,23 @@
#ifndef _KBC_H_ #ifndef _KBC_H_
#define _KBC_H_ #define _KBC_H_
#include <stdint.h>
void kbc_init(void); void kbc_init(void);
struct Kbc { struct Kbc {
// Control register // Control register
volatile unsigned char * control; volatile uint8_t * control;
// Interrupt control register // Interrupt control register
volatile unsigned char * irq; volatile uint8_t * irq;
// Status register // Status register
volatile unsigned char * status; volatile uint8_t * status;
// Keyboard out register // Keyboard out register
volatile unsigned char * keyboard_out; volatile uint8_t * keyboard_out;
// Mouse out register // Mouse out register
volatile unsigned char * mouse_out; volatile uint8_t * mouse_out;
// Data in register // Data in register
volatile unsigned char * data_in; volatile uint8_t * data_in;
}; };
extern __code struct Kbc KBC; extern __code struct Kbc KBC;
@ -24,16 +26,18 @@ extern __code struct Kbc KBC;
#define KBC_STS_IBF (1 << 1) #define KBC_STS_IBF (1 << 1)
#define KBC_STS_CMD (1 << 3) #define KBC_STS_CMD (1 << 3)
unsigned char kbc_status(struct Kbc * kbc); uint8_t kbc_status(struct Kbc * kbc);
unsigned char kbc_read(struct Kbc * kbc); uint8_t kbc_read(struct Kbc * kbc);
void kbc_keyboard(struct Kbc * kbc, unsigned char data); void kbc_keyboard(struct Kbc * kbc, uint8_t data);
void kbc_mouse(struct Kbc * kbc, unsigned char data); void kbc_mouse(struct Kbc * kbc, uint8_t data);
__xdata volatile unsigned char __at(0x1300) KBHICR; void kbc_event(struct Kbc * kbc);
__xdata volatile unsigned char __at(0x1302) KBIRQR;
__xdata volatile unsigned char __at(0x1304) KBHISR; __xdata volatile uint8_t __at(0x1300) KBHICR;
__xdata volatile unsigned char __at(0x1306) KBHIKDOR; __xdata volatile uint8_t __at(0x1302) KBIRQR;
__xdata volatile unsigned char __at(0x1308) KBHIMDOR; __xdata volatile uint8_t __at(0x1304) KBHISR;
__xdata volatile unsigned char __at(0x130A) KBHIDIR; __xdata volatile uint8_t __at(0x1306) KBHIKDOR;
__xdata volatile uint8_t __at(0x1308) KBHIMDOR;
__xdata volatile uint8_t __at(0x130A) KBHIDIR;
#endif // _KBC_H_ #endif // _KBC_H_

View File

@ -1,17 +1,19 @@
#ifndef _PMC_H_ #ifndef _PMC_H_
#define _PMC_H_ #define _PMC_H_
#include <stdint.h>
void pmc_init(void); void pmc_init(void);
struct Pmc { struct Pmc {
// Status register // Status register
volatile unsigned char * status; volatile uint8_t * status;
// Data out register // Data out register
volatile unsigned char * data_out; volatile uint8_t * data_out;
// Data in register // Data in register
volatile unsigned char * data_in; volatile uint8_t * data_in;
// Control register // Control register
volatile unsigned char * control; volatile uint8_t * control;
}; };
extern __code struct Pmc PMC_1; 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_IBF (1 << 1)
#define PMC_STS_CMD (1 << 3) #define PMC_STS_CMD (1 << 3)
unsigned char pmc_status(struct Pmc * pmc); uint8_t pmc_status(struct Pmc * pmc);
unsigned char pmc_read(struct Pmc * pmc); uint8_t pmc_read(struct Pmc * pmc);
void pmc_write(struct Pmc * pmc, unsigned char data); void pmc_write(struct Pmc * pmc, uint8_t data);
__xdata volatile unsigned char __at(0x1500) PM1STS; void pmc_event(struct Pmc * pmc);
__xdata volatile unsigned char __at(0x1501) PM1DO;
__xdata volatile unsigned char __at(0x1504) PM1DI;
__xdata volatile unsigned char __at(0x1506) PM1CTL;
__xdata volatile unsigned char __at(0x1510) PM2STS; __xdata volatile uint8_t __at(0x1500) PM1STS;
__xdata volatile unsigned char __at(0x1511) PM2DO; __xdata volatile uint8_t __at(0x1501) PM1DO;
__xdata volatile unsigned char __at(0x1514) PM2DI; __xdata volatile uint8_t __at(0x1504) PM1DI;
__xdata volatile unsigned char __at(0x1516) PM2CTL; __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_ #endif // _PMC_H_

View File

@ -1,3 +1,5 @@
#include <stdio.h>
#include "include/kbc.h" #include "include/kbc.h"
__code struct Kbc KBC = { __code struct Kbc KBC = {
@ -14,18 +16,30 @@ void kbc_init(void) {
*(KBC.control) = 0x48; *(KBC.control) = 0x48;
} }
unsigned char kbc_status(struct Kbc * kbc) { uint8_t kbc_status(struct Kbc * kbc) {
return *(kbc->status); return *(kbc->status);
} }
unsigned char kbc_read(struct Kbc * kbc) { uint8_t kbc_read(struct Kbc * kbc) {
return *(kbc->data_in); 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; *(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; *(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);
}
}
}

View File

@ -1,6 +1,6 @@
#include <stdbool.h> #include <stdbool.h>
#include <stdio.h>
#include <stdint.h> #include <stdint.h>
#include <stdio.h>
#include "include/delay.h" #include "include/delay.h"
#include "include/gpio.h" #include "include/gpio.h"
@ -60,79 +60,6 @@ void power_switch(void) {
last = new; 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_CHG = PIN(A, 5);
struct Pin LED_BAT_FULL = PIN(A, 6); struct Pin LED_BAT_FULL = PIN(A, 6);
struct Pin LED_PWR = PIN(A, 7); struct Pin LED_PWR = PIN(A, 7);

View File

@ -1,3 +1,6 @@
#include <stdio.h>
#include "include/acpi.h"
#include "include/pmc.h" #include "include/pmc.h"
#define PMC(NUM) { \ #define PMC(NUM) { \
@ -15,14 +18,67 @@ void pmc_init(void) {
*(PMC_2.control) = 0x41; *(PMC_2.control) = 0x41;
} }
unsigned char pmc_status(struct Pmc * pmc) { uint8_t pmc_status(struct Pmc * pmc) {
return *(pmc->status); return *(pmc->status);
} }
unsigned char pmc_read(struct Pmc * pmc) { uint8_t pmc_read(struct Pmc * pmc) {
return *(pmc->data_in); 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; *(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;
}
}
}
}