File indexing completed on 2025-05-11 08:22:48
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 #include <bsp.h>
0029 #include <bsp/power.h>
0030 #include <bsp/irq.h>
0031
0032 #include <libchip/chip.h>
0033
0034 void atsam_power_change_state(
0035 const atsam_power_control *controls,
0036 size_t n,
0037 atsam_power_state state
0038 )
0039 {
0040 size_t i;
0041
0042 switch (state) {
0043 case ATSAM_POWER_ON:
0044 for (i = n; i > 0; --i) {
0045 const atsam_power_control *c;
0046
0047 c = &controls[i - 1];
0048 (*c->handler)(c, state);
0049 }
0050
0051 break;
0052 case ATSAM_POWER_INIT:
0053 case ATSAM_POWER_OFF:
0054 for (i = 0; i < n; ++i) {
0055 const atsam_power_control *c;
0056
0057 c = &controls[i];
0058 (*c->handler)(c, state);
0059 }
0060
0061 break;
0062 default:
0063 break;
0064 }
0065 }
0066
0067 void atsam_power_handler_peripheral(
0068 const atsam_power_control *control,
0069 atsam_power_state state
0070 )
0071 {
0072 uint32_t id;
0073 uint32_t end;
0074
0075 id = control->data.peripherals.first;
0076 end = control->data.peripherals.last + 1;
0077
0078 switch (state) {
0079 case ATSAM_POWER_ON:
0080 while (id != end) {
0081 PMC_EnablePeripheral(id);
0082 ++id;
0083 }
0084 break;
0085 case ATSAM_POWER_OFF:
0086 while (id != end) {
0087 PMC_DisablePeripheral(id);
0088 ++id;
0089 }
0090 break;
0091 default:
0092 break;
0093 }
0094 }
0095
0096 void atsam_power_handler_sleep_mode(const atsam_power_control *control, atsam_power_state state)
0097 {
0098 (void) control;
0099
0100 switch (state) {
0101 case ATSAM_POWER_OFF:
0102
0103 PMC->PMC_FSMR &= (uint32_t)~PMC_FSMR_LPM;
0104
0105 SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;
0106
0107 __asm__ volatile ("wfi");
0108 break;
0109 default:
0110 break;
0111 }
0112 }