28#if (HAL_USE_PAL == TRUE) || defined(__DOXYGEN__)
44#define PAL_MODE_RESET 0U
53#define PAL_MODE_UNCONNECTED 1U
58#define PAL_MODE_INPUT 2U
63#define PAL_MODE_INPUT_PULLUP 3U
68#define PAL_MODE_INPUT_PULLDOWN 4U
73#define PAL_MODE_INPUT_ANALOG 5U
78#define PAL_MODE_OUTPUT_PUSHPULL 6U
83#define PAL_MODE_OUTPUT_OPENDRAIN 7U
105#define PAL_EVENT_MODE_EDGES_MASK 3U
106#define PAL_EVENT_MODE_DISABLED 0U
107#define PAL_EVENT_MODE_RISING_EDGE 1U
108#define PAL_EVENT_MODE_FALLING_EDGE 2U
109#define PAL_EVENT_MODE_BOTH_EDGES 3U
124#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__)
125#define PAL_USE_CALLBACKS TRUE
132#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__)
133#define PAL_USE_WAIT TRUE
150#if (PAL_USE_WAIT == TRUE) || (PAL_USE_CALLBACKS == TRUE) || defined(__DOXYGEN__)
155#if (PAL_USE_WAIT == TRUE) || defined(__DOXYGEN__)
161#if (PAL_USE_CALLBACKS == TRUE) || defined(__DOXYGEN__)
211#if !defined(PAL_PORT_BIT) || defined(__DOXYGEN__)
212#define PAL_PORT_BIT(n) ((ioportmask_t)(1U << (n)))
222#if !defined(PAL_GROUP_MASK) || defined(__DOXYGEN__)
223#define PAL_GROUP_MASK(width) ((ioportmask_t)(1U << (width)) - 1U)
236#define _IOBUS_DATA(name, port, width, offset) \
237 {port, PAL_GROUP_MASK(width), offset}
247#define IOBUS_DECL(name, port, width, offset) \
248 IOBus name = _IOBUS_DATA(name, port, width, offset)
250#if (PAL_USE_CALLBACKS == TRUE) || (PAL_USE_WAIT == TRUE) || \
256#if ((PAL_USE_CALLBACKS == TRUE) && (PAL_USE_WAIT == TRUE)) || \
265#define _pal_init_event(e) \
267 osalThreadQueueObjectInit(&_pal_events[e].threads); \
268 _pal_events[e].cb = NULL; \
269 _pal_events[e].arg = NULL; \
273#if (PAL_USE_CALLBACKS == TRUE) && (PAL_USE_WAIT == FALSE)
274#define _pal_init_event(e) \
276 _pal_events[e].cb = NULL; \
277 _pal_events[e].arg = NULL; \
281#if (PAL_USE_CALLBACKS == FALSE) && (PAL_USE_WAIT == TRUE)
282#define _pal_init_event(e) \
284 osalThreadQueueObjectInit(&_pal_events[e].threads); \
288#if ((PAL_USE_CALLBACKS == TRUE) && (PAL_USE_WAIT == TRUE)) || defined(__DOXYGEN__)
296#define _pal_clear_event(e) \
298 osalThreadDequeueAllI(&_pal_events[pad].threads, MSG_RESET); \
299 _pal_events[e].cb = NULL; \
300 _pal_events[e].arg = NULL; \
304#if (PAL_USE_CALLBACKS == TRUE) && (PAL_USE_WAIT == FALSE)
305#define _pal_clear_event(e) \
307 _pal_events[e].cb = NULL; \
308 _pal_events[e].arg = NULL; \
312#if (PAL_USE_CALLBACKS == FALSE) && (PAL_USE_WAIT == TRUE)
313#define _pal_clear_event(e) \
315 osalThreadDequeueAllI(&_pal_events[pad].threads, MSG_RESET); \
328#if ((PAL_USE_CALLBACKS == TRUE) && (PAL_USE_WAIT == TRUE)) || \
330#define _pal_isr_code(e) \
332 if (_pal_events[e].cb != NULL) { \
333 _pal_events[e].cb(_pal_events[e].arg); \
335 osalSysLockFromISR(); \
336 osalThreadDequeueAllI(&_pal_events[e].threads, MSG_OK); \
337 osalSysUnlockFromISR(); \
341#if (PAL_USE_CALLBACKS == TRUE) && (PAL_USE_WAIT == FALSE)
342#define _pal_isr_code(e) \
344 if (_pal_events[e].cb != NULL) { \
345 _pal_events[e].cb(_pal_events[e].arg); \
350#if ((PAL_USE_CALLBACKS == FALSE) && (PAL_USE_WAIT == TRUE)) || \
352#define _pal_isr_code(e) \
354 osalSysLockFromISR(); \
355 osalThreadDequeueAllI(&_pal_events[e].threads, MSG_OK); \
356 osalSysUnlockFromISR(); \
374#if defined(PAL_NEW_INIT) || defined(__DOXYGEN__)
375#define palInit() pal_lld_init()
377#define palInit(config) pal_lld_init(config)
389#if !defined(pal_lld_readport) || defined(__DOXYGEN__)
390#define palReadPort(port) ((void)(port), 0U)
392#define palReadPort(port) pal_lld_readport(port)
406#if !defined(pal_lld_readlatch) || defined(__DOXYGEN__)
407#define palReadLatch(port) ((void)(port), 0U)
409#define palReadLatch(port) pal_lld_readlatch(port)
421#if !defined(pal_lld_writeport) || defined(__DOXYGEN__)
422#define palWritePort(port, bits) ((void)(port), (void)(bits))
424#define palWritePort(port, bits) pal_lld_writeport(port, bits)
440#if !defined(pal_lld_setport) || defined(__DOXYGEN__)
441#define palSetPort(port, bits) \
442 palWritePort(port, palReadLatch(port) | (bits))
444#define palSetPort(port, bits) pal_lld_setport(port, bits)
460#if !defined(pal_lld_clearport) || defined(__DOXYGEN__)
461#define palClearPort(port, bits) \
462 palWritePort(port, palReadLatch(port) & ~(bits))
464#define palClearPort(port, bits) pal_lld_clearport(port, bits)
480#if !defined(pal_lld_toggleport) || defined(__DOXYGEN__)
481#define palTogglePort(port, bits) \
482 palWritePort(port, palReadLatch(port) ^ (bits))
484#define palTogglePort(port, bits) pal_lld_toggleport(port, bits)
499#if !defined(pal_lld_readgroup) || defined(__DOXYGEN__)
500#define palReadGroup(port, mask, offset) \
501 ((palReadPort(port) >> (offset)) & (mask))
503#define palReadGroup(port, mask, offset) pal_lld_readgroup(port, mask, offset)
518#if !defined(pal_lld_readgrouplatch) || defined(__DOXYGEN__)
519#define palReadGroupLatch(port, mask, offset) \
520 ((palReadLatch(port) >> (offset)) & (mask))
522#define palReadGroupLatch(port, mask, offset) pal_lld_readgrouplatch(port, mask, offset)
542#if !defined(pal_lld_writegroup) || defined(__DOXYGEN__)
543#define palWriteGroup(port, mask, offset, bits) \
544 palWritePort(port, (palReadLatch(port) & ~((mask) << (offset))) | \
545 (((bits) & (mask)) << (offset)))
547#define palWriteGroup(port, mask, offset, bits) \
548 pal_lld_writegroup(port, mask, offset, bits)
569#if !defined(pal_lld_setgroupmode) || defined(__DOXYGEN__)
570#define palSetGroupMode(port, mask, offset, mode) \
578#define palSetGroupMode(port, mask, offset, mode) \
579 pal_lld_setgroupmode(port, mask, offset, mode)
594#if !defined(pal_lld_readpad) || defined(__DOXYGEN__)
595#define palReadPad(port, pad) ((palReadPort(port) >> (pad)) & 1U)
597#define palReadPad(port, pad) pal_lld_readpad(port, pad)
615#if !defined(pal_lld_writepad) || defined(__DOXYGEN__)
616#define palWritePad(port, pad, bit) \
617 palWritePort(port, (palReadLatch(port) & ~PAL_PORT_BIT(pad)) | \
618 (((bit) & 1U) << pad))
620#define palWritePad(port, pad, bit) pal_lld_writepad(port, pad, bit)
636#if !defined(pal_lld_setpad) || defined(__DOXYGEN__)
637#define palSetPad(port, pad) palSetPort(port, PAL_PORT_BIT(pad))
639#define palSetPad(port, pad) pal_lld_setpad(port, pad)
655#if !defined(pal_lld_clearpad) || defined(__DOXYGEN__)
656#define palClearPad(port, pad) palClearPort(port, PAL_PORT_BIT(pad))
658#define palClearPad(port, pad) pal_lld_clearpad(port, pad)
674#if !defined(pal_lld_togglepad) || defined(__DOXYGEN__)
675#define palTogglePad(port, pad) palTogglePort(port, PAL_PORT_BIT(pad))
677#define palTogglePad(port, pad) pal_lld_togglepad(port, pad)
696#if !defined(pal_lld_setpadmode) || defined(__DOXYGEN__)
697#define palSetPadMode(port, pad, mode) \
698 palSetGroupMode(port, PAL_PORT_BIT(pad), 0U, mode)
700#define palSetPadMode(port, pad, mode) pal_lld_setpadmode(port, pad, mode)
714#if !defined(pal_lld_readline) || defined(__DOXYGEN__)
715#define palReadLine(line) palReadPad(PAL_PORT(line), PAL_PAD(line))
717#define palReadLine(line) pal_lld_readline(line)
734#if !defined(pal_lld_writeline) || defined(__DOXYGEN__)
735#define palWriteLine(line, bit) palWritePad(PAL_PORT(line), PAL_PAD(line), bit)
737#define palWriteLine(line, bit) pal_lld_writeline(line, bit)
752#if !defined(pal_lld_setline) || defined(__DOXYGEN__)
753#define palSetLine(line) palSetPad(PAL_PORT(line), PAL_PAD(line))
755#define palSetLine(line) pal_lld_setline(line)
770#if !defined(pal_lld_clearline) || defined(__DOXYGEN__)
771#define palClearLine(line) palClearPad(PAL_PORT(line), PAL_PAD(line))
773#define palClearLine(line) pal_lld_clearline(line)
788#if !defined(pal_lld_toggleline) || defined(__DOXYGEN__)
789#define palToggleLine(line) palTogglePad(PAL_PORT(line), PAL_PAD(line))
791#define palToggleLine(line) pal_lld_toggleline(line)
807#if !defined(pal_lld_setlinemode) || defined(__DOXYGEN__)
808#define palSetLineMode(line, mode) \
809 palSetPadMode(PAL_PORT(line), PAL_PAD(line), mode)
811#define palSetLineMode(line, mode) pal_lld_setlinemode(line, mode)
814#if (PAL_USE_CALLBACKS == TRUE) || (PAL_USE_WAIT == TRUE) || \
826#if !defined(pal_lld_enablepadevent) || defined(__DOXYGEN__)
827#define palEnablePadEventI(port, pad, mode)
829#define palEnablePadEventI(port, pad, mode) \
830 pal_lld_enablepadevent(port, pad, mode)
842#if !defined(pal_lld_disablepadevent) || defined(__DOXYGEN__)
843#define palDisablePadEventI(port, pad)
845#define palDisablePadEventI(port, pad) \
846 pal_lld_disablepadevent(port, pad)
859#define palEnablePadEvent(port, pad, mode) \
862 palEnablePadEventI(port, pad, mode); \
875#define palDisablePadEvent(port, pad) \
878 palDisablePadEventI(port, pad); \
891#if !defined(pal_lld_enablelineevent) || defined(__DOXYGEN__)
892#define palEnableLineEventI(line, mode) \
893 palEnablePadEventI(PAL_PORT(line), PAL_PAD(line), mode)
895#define palEnableLineEventI(line, mode) \
896 pal_lld_enablelineevent(line, mode)
907#if !defined(pal_lld_disablelineevent) || defined(__DOXYGEN__)
908#define palDisableLineEventI(line) \
909 palDisablePadEventI(PAL_PORT(line), PAL_PAD(line))
911#define palDisableLineEventI(line) pal_lld_disablelineevent(line)
923#define palEnableLineEvent(line, mode) \
926 palEnableLineEventI(line, mode); \
938#define palDisableLineEvent(line) \
941 palDisableLineEventI(line); \
956#if !defined(pal_lld_ispadeventenabled) || defined(__DOXYGEN__)
957#define palIsPadEventEnabledX(port, pad) false
959#define palIsPadEventEnabledX(port, pad) \
960 pal_lld_ispadeventenabled(port, pad)
973#if !defined(pal_lld_islineeventenabled) || defined(__DOXYGEN__)
974#define palIsLineEventEnabledX(line) \
975 pal_lld_ispadeventenabled(PAL_PORT(line), PAL_PAD(line))
977#define palIsLineEventEnabledX(line) \
978 pal_lld_islineeventenabled(line)
983#if (PAL_USE_CALLBACKS == TRUE) || defined(__DOXYGEN__)
994#define palSetPadCallback(port, pad, cb, arg) \
997 palSetPadCallbackI(port, pad, cb, arg); \
1010#define palSetLineCallback(line, cb, arg) \
1013 palSetLineCallbackI(line, cb, arg); \
1030#if (PAL_USE_CALLBACKS == TRUE) || defined(__DOXYGEN__)
1035#if (PAL_USE_WAIT == TRUE) || defined(__DOXYGEN__)
void palSetPadCallbackI(ioportid_t port, iopadid_t pad, palcallback_t cb, void *arg)
Associates a callback to a port/pad.
void palWriteBus(const IOBus *bus, ioportmask_t bits)
Write to an I/O bus.
void palSetLineCallbackI(ioline_t line, palcallback_t cb, void *arg)
Associates a callback to a line.
msg_t palWaitLineTimeout(ioline_t line, sysinterval_t timeout)
Waits for an edge on the specified line.
msg_t palWaitPadTimeout(ioportid_t port, iopadid_t pad, sysinterval_t timeout)
Waits for an edge on the specified port/pad.
msg_t palWaitPadTimeoutS(ioportid_t port, iopadid_t pad, sysinterval_t timeout)
Waits for an edge on the specified port/pad.
uint32_t ioportid_t
Port Identifier.
ioportmask_t palReadBus(const IOBus *bus)
Read from an I/O bus.
uint32_t ioportmask_t
Digital I/O port sized unsigned type.
msg_t palWaitLineTimeoutS(ioline_t line, sysinterval_t timeout)
Waits for an edge on the specified line.
void(* palcallback_t)(void *arg)
Type of a PAL event callback.
uint32_t iomode_t
Digital I/O modes.
void palSetBusMode(const IOBus *bus, iomode_t mode)
Programs a bus with the specified mode.
uint32_t iopadid_t
Type of an pad identifier.
uint32_t ioline_t
Type of an I/O line.
uint64_t sysinterval_t
Type of time interval.
PLATFORM PAL subsystem low level driver header.
uint_fast8_t offset
Offset, within the port, of the least significant bit of the bus.
ioportid_t portid
Port identifier.
ioportmask_t mask
Bus mask aligned to port bit 0.
Type of a PAL event record.
void * arg
Event callback argument.
palcallback_t cb
Event callback.
threads_queue_t threads
Threads queued for an event.