Move event loops outside of main.c
This commit is contained in:
parent
f00326edd1
commit
c1757e0ddb
15
src/acpi.c
Normal file
15
src/acpi.c
Normal 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
9
src/include/acpi.h
Normal 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_
|
@ -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_
|
||||||
|
@ -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_
|
||||||
|
22
src/kbc.c
22
src/kbc.c
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
75
src/main.c
75
src/main.c
@ -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);
|
||||||
|
62
src/pmc.c
62
src/pmc.c
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user