Revision 1a8fb642 core/src/aos_system.c
| core/src/aos_system.c | ||
|---|---|---|
| 661 | 661 |
* |
| 662 | 662 |
* @param[in] args Pointer to the GPIO line identifier. |
| 663 | 663 |
*/ |
| 664 |
static void _extiCallback(void* args)
|
|
| 664 |
static void _gpioCallback(void* args)
|
|
| 665 | 665 |
{
|
| 666 | 666 |
aosDbgCheck((args != NULL) && (*((ioline_t*)args) != PAL_NOLINE) && (PAL_PAD(*((ioline_t*)args)) < sizeof(eventflags_t) * 8)); |
| 667 | 667 |
|
| 668 | 668 |
chSysLockFromISR(); |
| 669 |
chEvtBroadcastFlagsI(&aos.events.io, AOS_IOEVENT_FLAG(PAL_PAD(*((ioline_t*)args))));
|
|
| 669 |
chEvtBroadcastFlagsI(&aos.events.gpio, AOS_GPIOEVENT_FLAG(PAL_PAD(*((ioline_t*)args))));
|
|
| 670 | 670 |
chSysUnlockFromISR(); |
| 671 | 671 |
|
| 672 | 672 |
return; |
| ... | ... | |
| 690 | 690 |
// if the system is in operation phase |
| 691 | 691 |
if (aos.sssp.stage == AOS_SSSP_OPERATION) {
|
| 692 | 692 |
// read signal S |
| 693 |
apalControlGpioGet(&moduleSsspGpioSync, &s_state);
|
|
| 693 |
apalControlGpioGet(&moduleSsspGpioS, &s_state); |
|
| 694 | 694 |
// if S was toggled from on to off |
| 695 | 695 |
if (s_state == APAL_GPIO_OFF) {
|
| 696 | 696 |
// get current uptime |
| ... | ... | |
| 710 | 710 |
} |
| 711 | 711 |
} |
| 712 | 712 |
// broadcast event |
| 713 |
chEvtBroadcastFlagsI(&aos.events.io, AOS_IOEVENT_FLAG(PAL_PAD(*((ioline_t*)args))));
|
|
| 713 |
chEvtBroadcastFlagsI(&aos.events.gpio, AOS_GPIOEVENT_FLAG(PAL_PAD(*((ioline_t*)args))));
|
|
| 714 | 714 |
chSysUnlockFromISR(); |
| 715 | 715 |
|
| 716 | 716 |
return; |
| ... | ... | |
| 755 | 755 |
|
| 756 | 756 |
chSysLockFromISR(); |
| 757 | 757 |
// toggle and read signal S |
| 758 |
apalGpioToggle(moduleSsspGpioSync.gpio);
|
|
| 759 |
apalControlGpioGet(&moduleSsspGpioSync, &s_state);
|
|
| 758 |
apalGpioToggle(moduleSsspGpioS.gpio); |
|
| 759 |
apalControlGpioGet(&moduleSsspGpioS, &s_state); |
|
| 760 | 760 |
// if S was toggled from off to on |
| 761 | 761 |
if (s_state == APAL_GPIO_ON) {
|
| 762 | 762 |
// reconfigure the timer precisely, because the logically falling edge (next interrupt) snychronizes the system time |
| ... | ... | |
| 817 | 817 |
aos.sssp.moduleId = 0; |
| 818 | 818 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */ |
| 819 | 819 |
aosIOStreamInit(&aos.iostream); |
| 820 |
chEvtObjectInit(&aos.events.io); |
|
| 820 |
chEvtObjectInit(&aos.events.gpio);
|
|
| 821 | 821 |
chEvtObjectInit(&aos.events.os); |
| 822 | 822 |
|
| 823 | 823 |
/* interrupt setup */ |
| 824 | 824 |
#if (AMIROOS_CFG_SSSP_ENABLE == true) |
| 825 | 825 |
// PD signal |
| 826 |
palSetLineCallback(moduleSsspGpioPd.gpio->line, _extiCallback, &moduleSsspGpioPd.gpio->line);
|
|
| 827 |
palEnableLineEvent(moduleSsspGpioPd.gpio->line, APAL2CH_EDGE(moduleSsspGpioPd.meta.edge));
|
|
| 826 |
palSetLineCallback(moduleSsspGpioPD.gpio->line, _gpioCallback, &moduleSsspGpioPD.gpio->line);
|
|
| 827 |
palEnableLineEvent(moduleSsspGpioPD.gpio->line, APAL2CH_EDGE(moduleSsspGpioPD.meta.edge));
|
|
| 828 | 828 |
// SYNC signal |
| 829 | 829 |
#if (AMIROOS_CFG_SSSP_MASTER == true) |
| 830 |
palSetLineCallback(moduleSsspGpioSync.gpio->line, _extiCallback, &moduleSsspGpioSync.gpio->line);
|
|
| 830 |
palSetLineCallback(moduleSsspGpioS.gpio->line, _gpioCallback, &moduleSsspGpioS.gpio->line);
|
|
| 831 | 831 |
#else /* (AMIROOS_CFG_SSSP_MASTER == true) */ |
| 832 |
palSetLineCallback(moduleSsspGpioSync.gpio->line, _signalSyncCallback, &moduleSsspGpioSync.gpio->line);
|
|
| 832 |
palSetLineCallback(moduleSsspGpioS.gpio->line, _signalSyncCallback, &moduleSsspGpioS.gpio->line);
|
|
| 833 | 833 |
#endif /* (AMIROOS_CFG_SSSP_MASTER == true) */ |
| 834 |
palEnableLineEvent(moduleSsspGpioSync.gpio->line, APAL2CH_EDGE(moduleSsspGpioSync.meta.edge));
|
|
| 834 |
palEnableLineEvent(moduleSsspGpioS.gpio->line, APAL2CH_EDGE(moduleSsspGpioS.meta.edge));
|
|
| 835 | 835 |
#if (AMIROOS_CFG_SSSP_STACK_START != true) |
| 836 | 836 |
// DN signal |
| 837 |
palSetLineCallback(moduleSsspGpioDn.gpio->line, _extiCallback, &moduleSsspGpioDn.gpio->line);
|
|
| 838 |
palEnableLineEvent(moduleSsspGpioDn.gpio->line, APAL2CH_EDGE(moduleSsspGpioDn.meta.edge));
|
|
| 837 |
palSetLineCallback(moduleSsspGpioDN.gpio->line, _gpioCallback, &moduleSsspGpioDN.gpio->line);
|
|
| 838 |
palEnableLineEvent(moduleSsspGpioDN.gpio->line, APAL2CH_EDGE(moduleSsspGpioDN.meta.edge));
|
|
| 839 | 839 |
#endif /* (AMIROOS_CFG_SSSP_STACK_START != true) */ |
| 840 | 840 |
#if (AMIROOS_CFG_SSSP_STACK_END != true) |
| 841 | 841 |
// UP signal |
| 842 |
palSetLineCallback(moduleSsspGpioUp.gpio->line, _extiCallback, &moduleSsspGpioUp.gpio->line);
|
|
| 843 |
palEnableLineEvent(moduleSsspGpioUp.gpio->line, APAL2CH_EDGE(moduleSsspGpioUp.meta.edge));
|
|
| 842 |
palSetLineCallback(moduleSsspGpioUP.gpio->line, _gpioCallback, &moduleSsspGpioUP.gpio->line);
|
|
| 843 |
palEnableLineEvent(moduleSsspGpioUP.gpio->line, APAL2CH_EDGE(moduleSsspGpioUP.meta.edge));
|
|
| 844 | 844 |
#endif /* (AMIROOS_CFG_SSSP_STACK_END != true) */ |
| 845 | 845 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */ |
| 846 | 846 |
|
| ... | ... | |
| 926 | 926 |
aos.sssp.stage = AOS_SSSP_STARTUP_2_2; |
| 927 | 927 |
|
| 928 | 928 |
// deactivate the sync signal to indicate that the module is ready (SSSPv1 stage 2.1 of startup phase) |
| 929 |
apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_OFF);
|
|
| 929 |
apalControlGpioSet(&moduleSsspGpioS, APAL_GPIO_OFF); |
|
| 930 | 930 |
|
| 931 | 931 |
// wait for any event to occur (do not apply any filter in order not to miss any event) |
| 932 | 932 |
m = chEvtWaitOne(ALL_EVENTS); |
| 933 | 933 |
f = chEvtGetAndClearFlags(syncEvtListener); |
| 934 |
apalControlGpioGet(&moduleSsspGpioSync, &s);
|
|
| 934 |
apalControlGpioGet(&moduleSsspGpioS, &s); |
|
| 935 | 935 |
|
| 936 | 936 |
// if the event was a system event, |
| 937 | 937 |
// and it was fired because of the SysSync control signal, |
| 938 | 938 |
// and the SysSync control signal has been deactivated |
| 939 | 939 |
if (m & syncEvtListener->events && |
| 940 |
f == MODULE_SSSP_EVENTFLAGS_SYNC &&
|
|
| 940 |
f == MODULE_SSSP_EVENTFLAG_S &&
|
|
| 941 | 941 |
s == APAL_GPIO_OFF) {
|
| 942 | 942 |
chSysLock(); |
| 943 | 943 |
// start the uptime counter |
| ... | ... | |
| 1030 | 1030 |
chSysLock(); |
| 1031 | 1031 |
// activate the SYS_PD control signal only, if this module initiated the shutdown |
| 1032 | 1032 |
if (shutdown != AOS_SHUTDOWN_PASSIVE) {
|
| 1033 |
apalControlGpioSet(&moduleSsspGpioPd, APAL_GPIO_ON);
|
|
| 1033 |
apalControlGpioSet(&moduleSsspGpioPD, APAL_GPIO_ON);
|
|
| 1034 | 1034 |
} |
| 1035 | 1035 |
// activate the SYS_SYNC signal |
| 1036 |
apalControlGpioSet(&moduleSsspGpioSync, APAL_GPIO_ON);
|
|
| 1036 |
apalControlGpioSet(&moduleSsspGpioS, APAL_GPIO_ON); |
|
| 1037 | 1037 |
chSysUnlock(); |
| 1038 | 1038 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */ |
| 1039 | 1039 |
|
| ... | ... | |
| 1152 | 1152 |
* |
| 1153 | 1153 |
* @return Pointer to the callback function. |
| 1154 | 1154 |
*/ |
| 1155 |
palcallback_t aosSysGetStdExtiCallback(void)
|
|
| 1155 |
palcallback_t aosSysGetStdGpioCallback(void)
|
|
| 1156 | 1156 |
{
|
| 1157 |
return _extiCallback;
|
|
| 1157 |
return _gpioCallback;
|
|
| 1158 | 1158 |
} |
| 1159 | 1159 |
|
| 1160 | 1160 |
/** @} */ |
Also available in: Unified diff