Use a 16-bit system tick
The maximum interval when configured for a 1ms tick: - 16-bit: ~65 seconds - 32-bit: ~49.7 days The value is used for scheduling and timeouts, and not to track the uptime of the system, so the 32-bit value is excessive. Signed-off-by: Tim Crawford <tcrawford@system76.com>
This commit is contained in:
committed by
Tim Crawford
parent
9e7f1952fa
commit
0f7642defb
@ -5,7 +5,9 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
typedef uint16_t systick_t;
|
||||||
|
|
||||||
void time_init(void);
|
void time_init(void);
|
||||||
uint32_t time_get(void);
|
systick_t time_get(void);
|
||||||
|
|
||||||
#endif // _ARCH_TIME_H
|
#endif // _ARCH_TIME_H
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
// Value to reload into the timer when the overflow interrupt is triggered.
|
// Value to reload into the timer when the overflow interrupt is triggered.
|
||||||
#define TIMER_RELOAD (0xFFFF - (TICK_INTERVAL_MS * (CONFIG_CLOCK_FREQ_KHZ / OSC_DIVISOR)))
|
#define TIMER_RELOAD (0xFFFF - (TICK_INTERVAL_MS * (CONFIG_CLOCK_FREQ_KHZ / OSC_DIVISOR)))
|
||||||
|
|
||||||
static volatile uint32_t time_overflows = 0;
|
static volatile systick_t time_overflows = 0;
|
||||||
|
|
||||||
void timer_0(void) __interrupt(1) {
|
void timer_0(void) __interrupt(1) {
|
||||||
// Hardware automatically clears the the interrupt
|
// Hardware automatically clears the the interrupt
|
||||||
@ -52,6 +52,6 @@ void time_init(void) __critical {
|
|||||||
TR0 = 1;
|
TR0 = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t time_get(void) __critical {
|
systick_t time_get(void) __critical {
|
||||||
return time_overflows;
|
return time_overflows;
|
||||||
}
|
}
|
||||||
|
@ -284,15 +284,15 @@ void kbscan_event(void) {
|
|||||||
uint8_t matrix_curr[KM_OUT];
|
uint8_t matrix_curr[KM_OUT];
|
||||||
|
|
||||||
static bool debounce = false;
|
static bool debounce = false;
|
||||||
static uint32_t debounce_time = 0;
|
static systick_t debounce_time = 0;
|
||||||
|
|
||||||
static bool repeat = false;
|
static bool repeat = false;
|
||||||
static uint16_t repeat_key = 0;
|
static uint16_t repeat_key = 0;
|
||||||
static uint32_t repeat_key_time = 0;
|
static systick_t repeat_key_time = 0;
|
||||||
|
|
||||||
// If debounce complete
|
// If debounce complete
|
||||||
if (debounce) {
|
if (debounce) {
|
||||||
uint32_t time = time_get();
|
systick_t time = time_get();
|
||||||
if ((time - debounce_time) >= DEBOUNCE_DELAY) {
|
if ((time - debounce_time) >= DEBOUNCE_DELAY) {
|
||||||
// Debounce time elapsed: Read new state
|
// Debounce time elapsed: Read new state
|
||||||
debounce = false;
|
debounce = false;
|
||||||
@ -384,8 +384,8 @@ void kbscan_event(void) {
|
|||||||
kbscan_matrix[i] = new;
|
kbscan_matrix[i] = new;
|
||||||
} else if (new && repeat_key != 0 && key_should_repeat(repeat_key)) {
|
} else if (new && repeat_key != 0 && key_should_repeat(repeat_key)) {
|
||||||
// A key is being pressed
|
// A key is being pressed
|
||||||
uint32_t time = time_get();
|
systick_t time = time_get();
|
||||||
static uint32_t repeat_start = 0;
|
static systick_t repeat_start = 0;
|
||||||
|
|
||||||
if (!repeat) {
|
if (!repeat) {
|
||||||
if (time < repeat_key_time) {
|
if (time < repeat_key_time) {
|
||||||
|
@ -98,8 +98,8 @@ void main(void) {
|
|||||||
|
|
||||||
INFO("System76 EC board '%s', version '%s'\n", board(), version());
|
INFO("System76 EC board '%s', version '%s'\n", board(), version());
|
||||||
|
|
||||||
uint32_t last_time_battery = 0;
|
systick_t last_time_battery = 0;
|
||||||
uint32_t last_time_fan = 0;
|
systick_t last_time_fan = 0;
|
||||||
|
|
||||||
for (main_cycle = 0;; main_cycle++) {
|
for (main_cycle = 0;; main_cycle++) {
|
||||||
// NOTE: Do note use modulo to avoid expensive call to SDCC library
|
// NOTE: Do note use modulo to avoid expensive call to SDCC library
|
||||||
@ -128,7 +128,7 @@ void main(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (main_cycle == 0) {
|
if (main_cycle == 0) {
|
||||||
uint32_t time = time_get();
|
systick_t time = time_get();
|
||||||
// Only run the following once per interval
|
// Only run the following once per interval
|
||||||
if ((time - last_time_fan) >= fan_interval) {
|
if ((time - last_time_fan) >= fan_interval) {
|
||||||
last_time_fan = time;
|
last_time_fan = time;
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
bool parallel_debug = false;
|
bool parallel_debug = false;
|
||||||
|
|
||||||
static bool parallel_wait_peripheral(uint8_t mask, uint8_t value) {
|
static bool parallel_wait_peripheral(uint8_t mask, uint8_t value) {
|
||||||
uint32_t start = time_get();
|
systick_t start = time_get();
|
||||||
|
|
||||||
while ((time_get() - start) < PARALLEL_TIMEOUT) {
|
while ((time_get() - start) < PARALLEL_TIMEOUT) {
|
||||||
if ((KSOHGDMRR & mask) == value) {
|
if ((KSOHGDMRR & mask) == value) {
|
||||||
|
@ -93,7 +93,7 @@ bool peci_get_temp(int16_t *const data) {
|
|||||||
ESUCTRL0 |= ESUCTRL0_GO;
|
ESUCTRL0 |= ESUCTRL0_GO;
|
||||||
|
|
||||||
// Wait until upstream done
|
// Wait until upstream done
|
||||||
uint32_t start = time_get();
|
systick_t start = time_get();
|
||||||
while (!(ESUCTRL0 & ESUCTRL0_DONE)) {
|
while (!(ESUCTRL0 & ESUCTRL0_DONE)) {
|
||||||
if ((time_get() - start) >= PECI_ESPI_TIMEOUT) {
|
if ((time_get() - start) >= PECI_ESPI_TIMEOUT) {
|
||||||
DEBUG("peci_get_temp: upstream timeout\n");
|
DEBUG("peci_get_temp: upstream timeout\n");
|
||||||
@ -189,7 +189,7 @@ int16_t peci_wr_pkg_config(uint8_t index, uint16_t param, uint32_t data) {
|
|||||||
ESUCTRL0 |= ESUCTRL0_GO;
|
ESUCTRL0 |= ESUCTRL0_GO;
|
||||||
|
|
||||||
// Wait until upstream done
|
// Wait until upstream done
|
||||||
uint32_t start = time_get();
|
systick_t start = time_get();
|
||||||
while (!(ESUCTRL0 & ESUCTRL0_DONE)) {
|
while (!(ESUCTRL0 & ESUCTRL0_DONE)) {
|
||||||
DEBUG("peci_wr_pkg_config: wait upstream\n");
|
DEBUG("peci_wr_pkg_config: wait upstream\n");
|
||||||
if ((time_get() - start) >= PECI_ESPI_TIMEOUT) {
|
if ((time_get() - start) >= PECI_ESPI_TIMEOUT) {
|
||||||
@ -254,7 +254,7 @@ void peci_init(void) {
|
|||||||
// Returns true on success, false on error
|
// Returns true on success, false on error
|
||||||
bool peci_get_temp(int16_t *const data) {
|
bool peci_get_temp(int16_t *const data) {
|
||||||
// Wait for any in-progress transaction to complete
|
// Wait for any in-progress transaction to complete
|
||||||
uint32_t start = time_get();
|
systick_t start = time_get();
|
||||||
while (HOSTAR & BIT(0)) {
|
while (HOSTAR & BIT(0)) {
|
||||||
if ((time_get() - start) >= PECI_ESPI_TIMEOUT) {
|
if ((time_get() - start) >= PECI_ESPI_TIMEOUT) {
|
||||||
DEBUG("%s: host timeout\n", __func__);
|
DEBUG("%s: host timeout\n", __func__);
|
||||||
@ -310,7 +310,7 @@ bool peci_get_temp(int16_t *const data) {
|
|||||||
// negative (0x1000 | status register) on PECI hardware error
|
// negative (0x1000 | status register) on PECI hardware error
|
||||||
int16_t peci_wr_pkg_config(uint8_t index, uint16_t param, uint32_t data) {
|
int16_t peci_wr_pkg_config(uint8_t index, uint16_t param, uint32_t data) {
|
||||||
// Wait for any in-progress transaction to complete
|
// Wait for any in-progress transaction to complete
|
||||||
uint32_t start = time_get();
|
systick_t start = time_get();
|
||||||
while (HOSTAR & BIT(0)) {
|
while (HOSTAR & BIT(0)) {
|
||||||
if ((time_get() - start) >= PECI_ESPI_TIMEOUT) {
|
if ((time_get() - start) >= PECI_ESPI_TIMEOUT) {
|
||||||
DEBUG("%s: host timeout\n", __func__);
|
DEBUG("%s: host timeout\n", __func__);
|
||||||
|
@ -572,8 +572,8 @@ void power_event(void) {
|
|||||||
wake_last = wake_new;
|
wake_last = wake_new;
|
||||||
#endif // HAVE_LAN_WAKEUP_N
|
#endif // HAVE_LAN_WAKEUP_N
|
||||||
|
|
||||||
static uint32_t last_time = 0;
|
static systick_t last_time = 0;
|
||||||
uint32_t time = time_get();
|
systick_t time = time_get();
|
||||||
if (power_state == POWER_STATE_S0) {
|
if (power_state == POWER_STATE_S0) {
|
||||||
#if CONFIG_BUS_ESPI
|
#if CONFIG_BUS_ESPI
|
||||||
// HOST_C10 virtual wire is high when CPU is in C10 sleep state
|
// HOST_C10 virtual wire is high when CPU is in C10 sleep state
|
||||||
|
Reference in New Issue
Block a user