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:
Tim Crawford
2024-07-12 06:20:15 -06:00
committed by Tim Crawford
parent 9e7f1952fa
commit 0f7642defb
7 changed files with 20 additions and 18 deletions

View File

@ -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

View File

@ -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;
} }

View File

@ -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) {

View File

@ -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;

View File

@ -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) {

View File

@ -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__);

View File

@ -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