Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 48 additions & 15 deletions src/app/main/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ void timer_2(void) __interrupt(5) {}

uint8_t main_cycle = 0;

#define INTERVAL_1MS 1U
#define INTERVAL_5MS 5U
#define INTERVAL_100MS 100U
#define INTERVAL_250MS 250U
Expand Down Expand Up @@ -107,18 +106,52 @@ void main(void) {

INFO("System76 EC board '%s', version '%s'\n", board(), version());

systick_t last_time_1ms = 0;
systick_t last_time_5ms = 0;
systick_t last_time_100ms = 0;
systick_t last_time_250ms = 0;
systick_t last_time_500ms = 0;
systick_t last_time_1sec = 0;

__bit evt_1ms = 0;
__bit evt_5ms = 0;
__bit evt_100ms = 0;
__bit evt_250ms = 0;
__bit evt_500ms = 0;
__bit evt_1sec = 0;

for (main_cycle = 0;; main_cycle++) {
systick_t time = time_get();
// Calculate which intervals need to run at systick update.
if (evt_systick) {
evt_systick = 0;

systick_t time = time_get();

evt_1ms = 1;

if ((time - last_time_5ms) >= INTERVAL_5MS) {
last_time_5ms = time;
evt_5ms = 1;
}
if ((time - last_time_100ms) >= INTERVAL_100MS) {
last_time_100ms = time;
evt_100ms = 1;
}
if ((time - last_time_250ms) >= INTERVAL_250MS) {
last_time_250ms = time;
evt_250ms = 1;
}
if ((time - last_time_500ms) >= INTERVAL_500MS) {
last_time_500ms = time;
evt_500ms = 1;
}
if ((time - last_time_1sec) >= INTERVAL_1SEC) {
last_time_1sec = time;
evt_1sec = 1;
}
}

if ((time - last_time_1ms) >= INTERVAL_1MS) {
last_time_1ms = time;
if (evt_1ms) {
evt_1ms = 0;

// Handle USB-C events immediately before power states
usbpd_event();
Expand All @@ -135,8 +168,8 @@ void main(void) {
smfi_event();
}

if ((time - last_time_5ms) >= INTERVAL_5MS) {
last_time_5ms = time;
if (evt_5ms) {
evt_5ms = 0;

#if PARALLEL_DEBUG
if (!parallel_debug)
Expand All @@ -147,30 +180,30 @@ void main(void) {
}
}

if ((time - last_time_100ms) >= INTERVAL_100MS) {
last_time_100ms = time;
if (evt_100ms) {
evt_100ms = 0;

fan_update_duty();
}

if ((time - last_time_250ms) >= INTERVAL_250MS) {
last_time_250ms = time;
if (evt_250ms) {
evt_250ms = 0;

#if CONFIG_PLATFORM_INTEL
peci_read_temp();
#endif
dgpu_read_temp();
}

if ((time - last_time_500ms) >= INTERVAL_500MS) {
last_time_500ms = time;
if (evt_500ms) {
evt_500ms = 0;

// Handle lid close/open
lid_event();
}

if ((time - last_time_1sec) >= INTERVAL_1SEC) {
last_time_1sec = time;
if (evt_1sec) {
evt_1sec = 0;

battery_event();

Expand Down
3 changes: 3 additions & 0 deletions src/arch/8051/include/arch/time.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@

typedef uint16_t systick_t;

// Event flag for app to hook systick update.
extern volatile __bit evt_systick;

void time_init(void);
systick_t time_get(void);

Expand Down
3 changes: 3 additions & 0 deletions src/arch/8051/time.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#define TIMER_RELOAD (0xFFFF - (TICK_INTERVAL_MS * (CONFIG_CLOCK_FREQ_KHZ / OSC_DIVISOR)))

static volatile systick_t time_overflows = 0;
volatile __bit evt_systick;

void timer_0(void) __interrupt(1) {
// Hardware automatically clears the the interrupt
Expand All @@ -19,6 +20,7 @@ void timer_0(void) __interrupt(1) {
TR0 = 0;

time_overflows++;
evt_systick = 1;

// Reload the values
TH0 = TIMER_RELOAD >> 8;
Expand All @@ -37,6 +39,7 @@ void time_init(void) __critical {
TF0 = 0;

time_overflows = 0;
evt_systick = 0;

// Enable the interrupt
ET0 = 1;
Expand Down