# HG changeset patch # User Paul Boddie # Date 1700153312 -3600 # Node ID bf804c0fe6dc33777e93c06bec69f69e0c5030b0 # Parent 8063597483598f270dfa29fd7d4f32b2aca1f0c8 Added support for resetting/rebooting the system. diff -r 806359748359 -r bf804c0fe6dc pkg/devices/lib/rtc/include/rtc-x1600.h --- a/pkg/devices/lib/rtc/include/rtc-x1600.h Thu Nov 16 01:15:40 2023 +0100 +++ b/pkg/devices/lib/rtc/include/rtc-x1600.h Thu Nov 16 17:48:32 2023 +0100 @@ -52,6 +52,10 @@ void alarm_enable(); + void wakeup_alarm_disable(); + + void wakeup_alarm_enable(); + uint32_t get_seconds(); void set_seconds(uint32_t seconds); @@ -62,6 +66,8 @@ void set_regulator(uint32_t base, uint32_t adjustment); + void hibernate(); + void power_down(); }; @@ -83,6 +89,10 @@ void x1600_rtc_alarm_enable(void *rtc); +void x1600_rtc_wakeup_alarm_disable(void *rtc); + +void x1600_rtc_wakeup_alarm_enable(void *rtc); + uint32_t x1600_rtc_get_seconds(void *rtc); void x1600_rtc_set_seconds(void *rtc, uint32_t seconds); @@ -93,6 +103,8 @@ void x1600_rtc_set_regulator(void *rtc, uint32_t base, uint32_t adjustment); +void x1600_rtc_hibernate(void *rtc); + void x1600_rtc_power_down(void *rtc); EXTERN_C_END diff -r 806359748359 -r bf804c0fe6dc pkg/devices/lib/rtc/src/x1600.cc --- a/pkg/devices/lib/rtc/src/x1600.cc Thu Nov 16 01:15:40 2023 +0100 +++ b/pkg/devices/lib/rtc/src/x1600.cc Thu Nov 16 17:48:32 2023 +0100 @@ -193,7 +193,21 @@ Rtc_x1600_chip::alarm_enable() { write_enable(); - _regs[Rtc_control] = _regs[Rtc_control] | Control_alarm_enable; + _regs[Rtc_control] = (_regs[Rtc_control] & ~Control_alarm) | Control_alarm_enable; +} + +void +Rtc_x1600_chip::wakeup_alarm_disable() +{ + write_enable(); + _regs[Hibernate_wakeup_control] = _regs[Hibernate_wakeup_control] & ~Rtc_alarm_wakeup_enable; +} + +void +Rtc_x1600_chip::wakeup_alarm_enable() +{ + write_enable(); + _regs[Hibernate_wakeup_control] = _regs[Hibernate_wakeup_control] | Rtc_alarm_wakeup_enable; } uint32_t @@ -240,6 +254,14 @@ } void +Rtc_x1600_chip::hibernate() +{ + alarm_enable(); + wakeup_alarm_enable(); + power_down(); +} + +void Rtc_x1600_chip::power_down() { write_enable(); @@ -301,6 +323,11 @@ static_cast(rtc)->set_regulator(base, adjustment); } +void x1600_rtc_hibernate(void *rtc) +{ + static_cast(rtc)->hibernate(); +} + void x1600_rtc_power_down(void *rtc) { static_cast(rtc)->power_down(); diff -r 806359748359 -r bf804c0fe6dc pkg/landfall-examples/hw_info/common.h --- a/pkg/landfall-examples/hw_info/common.h Thu Nov 16 01:15:40 2023 +0100 +++ b/pkg/landfall-examples/hw_info/common.h Thu Nov 16 17:48:32 2023 +0100 @@ -181,6 +181,8 @@ void rtc_set_alarm_seconds(void *rtc, uint32_t seconds); +void rtc_hibernate(void *rtc); + void rtc_power_down(void *rtc); void rtc_set_regulator(void *rtc, uint32_t base, uint32_t adjustment); diff -r 806359748359 -r bf804c0fe6dc pkg/landfall-examples/hw_info/hw_info.c --- a/pkg/landfall-examples/hw_info/hw_info.c Thu Nov 16 01:15:40 2023 +0100 +++ b/pkg/landfall-examples/hw_info/hw_info.c Thu Nov 16 17:48:32 2023 +0100 @@ -1115,6 +1115,22 @@ /* RTC operations. */ +static void rtc_reset(void *rtc, void *cpm) +{ + unsigned int seconds; + + if (!read_number("Seconds", &seconds)) + return; + + /* NOTE: Assuming EXCLK/512 as RTC source. */ + + uint32_t rtc_seconds = rtc_get_seconds(rtc); + uint32_t value = seconds * cpm_get_frequency(cpm, Clock_external) / 512; + + rtc_set_alarm_seconds(rtc, rtc_seconds + value); + rtc_hibernate(rtc); +} + static void _rtc_set_seconds(void *rtc, int alarm) { unsigned int seconds; @@ -1436,7 +1452,7 @@ list_memory_regions(); } -static void handle_rtc(void *rtc) +static void handle_rtc(void *rtc, void *cpm) { char *token; @@ -1452,15 +1468,17 @@ printf("seconds = %d\n", rtc_get_alarm_seconds(rtc)); else if (!strcmp(token, "p") || !strcmp(token, "power-down")) rtc_power_down(rtc); + else if (!strcmp(token, "r") || !strcmp(token, "reset")) + rtc_reset(rtc, cpm); else if (!strcmp(token, "s") || !strcmp(token, "set")) _rtc_set_seconds(rtc, 0); else if (!strcmp(token, "sa") || !strcmp(token, "set-alarm")) _rtc_set_seconds(rtc, 1); else - printf("rtc disable | enable | get | get-alarm | power-down | set | set-alarm\n"); + printf("rtc disable | enable | get | get-alarm | power-down | reset | set | set-alarm\n"); } else - printf("rtc disable | enable | get | get-alarm | power-down | set | set-alarm\n"); + printf("rtc disable | enable | get | get-alarm | power-down | reset | set | set-alarm\n"); } static void handle_spi(void *spi, void *gpio[]) @@ -1646,7 +1664,7 @@ /* RTC commands. */ else if (!strcmp(token, "r") || !strcmp(token, "rtc")) - handle_rtc(rtc); + handle_rtc(rtc, cpm); /* SPI commands. */ diff -r 806359748359 -r bf804c0fe6dc pkg/landfall-examples/hw_info/jz4780.c --- a/pkg/landfall-examples/hw_info/jz4780.c Thu Nov 16 01:15:40 2023 +0100 +++ b/pkg/landfall-examples/hw_info/jz4780.c Thu Nov 16 17:48:32 2023 +0100 @@ -372,6 +372,11 @@ x1600_rtc_set_alarm_seconds(rtc, seconds); } +void rtc_hibernate(void *rtc) +{ + x1600_rtc_hibernate(rtc); +} + void rtc_power_down(void *rtc) { x1600_rtc_power_down(rtc); diff -r 806359748359 -r bf804c0fe6dc pkg/landfall-examples/hw_info/x1600.c --- a/pkg/landfall-examples/hw_info/x1600.c Thu Nov 16 01:15:40 2023 +0100 +++ b/pkg/landfall-examples/hw_info/x1600.c Thu Nov 16 17:48:32 2023 +0100 @@ -361,6 +361,11 @@ x1600_rtc_set_alarm_seconds(rtc, seconds); } +void rtc_hibernate(void *rtc) +{ + x1600_rtc_hibernate(rtc); +} + void rtc_power_down(void *rtc) { x1600_rtc_power_down(rtc);