Go to the documentation of this file.
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)
523 #if !defined(pal_lld_writegroup) || defined(__DOXYGEN__)
524 #define palWriteGroup(port, mask, offset, bits) \
525 palWritePort(port, (palReadLatch(port) & ~((mask) << (offset))) | \
526 (((bits) & (mask)) << (offset)))
528 #define palWriteGroup(port, mask, offset, bits) \
529 pal_lld_writegroup(port, mask, offset, bits)
550 #if !defined(pal_lld_setgroupmode) || defined(__DOXYGEN__)
551 #define palSetGroupMode(port, mask, offset, mode) \
559 #define palSetGroupMode(port, mask, offset, mode) \
560 pal_lld_setgroupmode(port, mask, offset, mode)
575 #if !defined(pal_lld_readpad) || defined(__DOXYGEN__)
576 #define palReadPad(port, pad) ((palReadPort(port) >> (pad)) & 1U)
578 #define palReadPad(port, pad) pal_lld_readpad(port, pad)
596 #if !defined(pal_lld_writepad) || defined(__DOXYGEN__)
597 #define palWritePad(port, pad, bit) \
598 palWritePort(port, (palReadLatch(port) & ~PAL_PORT_BIT(pad)) | \
599 (((bit) & 1U) << pad))
601 #define palWritePad(port, pad, bit) pal_lld_writepad(port, pad, bit)
617 #if !defined(pal_lld_setpad) || defined(__DOXYGEN__)
618 #define palSetPad(port, pad) palSetPort(port, PAL_PORT_BIT(pad))
620 #define palSetPad(port, pad) pal_lld_setpad(port, pad)
636 #if !defined(pal_lld_clearpad) || defined(__DOXYGEN__)
637 #define palClearPad(port, pad) palClearPort(port, PAL_PORT_BIT(pad))
639 #define palClearPad(port, pad) pal_lld_clearpad(port, pad)
655 #if !defined(pal_lld_togglepad) || defined(__DOXYGEN__)
656 #define palTogglePad(port, pad) palTogglePort(port, PAL_PORT_BIT(pad))
658 #define palTogglePad(port, pad) pal_lld_togglepad(port, pad)
677 #if !defined(pal_lld_setpadmode) || defined(__DOXYGEN__)
678 #define palSetPadMode(port, pad, mode) \
679 palSetGroupMode(port, PAL_PORT_BIT(pad), 0U, mode)
681 #define palSetPadMode(port, pad, mode) pal_lld_setpadmode(port, pad, mode)
695 #if !defined(pal_lld_readline) || defined(__DOXYGEN__)
696 #define palReadLine(line) palReadPad(PAL_PORT(line), PAL_PAD(line))
698 #define palReadLine(line) pal_lld_readline(line)
715 #if !defined(pal_lld_writeline) || defined(__DOXYGEN__)
716 #define palWriteLine(line, bit) palWritePad(PAL_PORT(line), PAL_PAD(line), bit)
718 #define palWriteLine(line, bit) pal_lld_writeline(line, bit)
733 #if !defined(pal_lld_setline) || defined(__DOXYGEN__)
734 #define palSetLine(line) palSetPad(PAL_PORT(line), PAL_PAD(line))
736 #define palSetLine(line) pal_lld_setline(line)
751 #if !defined(pal_lld_clearline) || defined(__DOXYGEN__)
752 #define palClearLine(line) palClearPad(PAL_PORT(line), PAL_PAD(line))
754 #define palClearLine(line) pal_lld_clearline(line)
769 #if !defined(pal_lld_toggleline) || defined(__DOXYGEN__)
770 #define palToggleLine(line) palTogglePad(PAL_PORT(line), PAL_PAD(line))
772 #define palToggleLine(line) pal_lld_toggleline(line)
788 #if !defined(pal_lld_setlinemode) || defined(__DOXYGEN__)
789 #define palSetLineMode(line, mode) \
790 palSetPadMode(PAL_PORT(line), PAL_PAD(line), mode)
792 #define palSetLineMode(line, mode) pal_lld_setlinemode(line, mode)
795 #if (PAL_USE_CALLBACKS == TRUE) || (PAL_USE_WAIT == TRUE) || \
807 #if !defined(pal_lld_enablepadevent) || defined(__DOXYGEN__)
808 #define palEnablePadEventI(port, pad, mode)
810 #define palEnablePadEventI(port, pad, mode) \
811 pal_lld_enablepadevent(port, pad, mode)
823 #if !defined(pal_lld_disablepadevent) || defined(__DOXYGEN__)
824 #define palDisablePadEventI(port, pad)
826 #define palDisablePadEventI(port, pad) \
827 pal_lld_disablepadevent(port, pad)
840 #define palEnablePadEvent(port, pad, mode) \
843 palEnablePadEventI(port, pad, mode); \
856 #define palDisablePadEvent(port, pad) \
859 palDisablePadEventI(port, pad); \
872 #if !defined(pal_lld_enablelineevent) || defined(__DOXYGEN__)
873 #define palEnableLineEventI(line, mode) \
874 palEnablePadEventI(PAL_PORT(line), PAL_PAD(line), mode)
876 #define palEnableLineEventI(line, mode) \
877 pal_lld_enablelineevent(line, mode)
888 #if !defined(pal_lld_disablelineevent) || defined(__DOXYGEN__)
889 #define palDisableLineEventI(line) \
890 palDisablePadEventI(PAL_PORT(line), PAL_PAD(line))
892 #define palDisableLineEventI(line) pal_lld_disablelineevent(line)
904 #define palEnableLineEvent(line, mode) \
907 palEnableLineEventI(line, mode); \
919 #define palDisableLineEvent(line) \
922 palDisableLineEventI(line); \
937 #if !defined(pal_lld_ispadeventenabled) || defined(__DOXYGEN__)
938 #define palIsPadEventEnabledX(port, pad) false
940 #define palIsPadEventEnabledX(port, pad) \
941 pal_lld_ispadeventenabled(port, pad)
954 #if !defined(pal_lld_islineeventenabled) || defined(__DOXYGEN__)
955 #define palIsLineEventEnabledX(line) \
956 pal_lld_ispadeventenabled(PAL_PORT(line), PAL_PAD(line))
958 #define palIsLineEventEnabledX(line) \
959 pal_lld_islineeventenabled(line)
964 #if (PAL_USE_CALLBACKS == TRUE) || defined(__DOXYGEN__)
975 #define palSetPadCallback(port, pad, cb, arg) \
978 palSetPadCallbackI(port, pad, cb, arg); \
991 #define palSetLineCallback(line, cb, arg) \
994 palSetLineCallbackI(line, cb, arg); \
1011 #if (PAL_USE_CALLBACKS == TRUE) || defined(__DOXYGEN__)
1016 #if (PAL_USE_WAIT == TRUE) || defined(__DOXYGEN__)
uint32_t ioportid_t
Port Identifier.
ioportid_t portid
Port identifier.
uint32_t iopadid_t
Type of an pad identifier.
uint32_t iomode_t
Digital I/O modes.
msg_t palWaitPadTimeout(ioportid_t port, iopadid_t pad, sysinterval_t timeout)
Waits for an edge on the specified port/pad.
void palSetPadCallbackI(ioportid_t port, iopadid_t pad, palcallback_t cb, void *arg)
Associates a callback to a port/pad.
uint32_t ioportmask_t
Digital I/O port sized unsigned type.
void palSetBusMode(const IOBus *bus, iomode_t mode)
Programs a bus with the specified mode.
void * arg
Event callback argument.
palcallback_t cb
Event callback.
msg_t palWaitLineTimeoutS(ioline_t line, sysinterval_t timeout)
Waits for an edge on the specified line.
ioportmask_t palReadBus(const IOBus *bus)
Read from an I/O bus.
void palWriteBus(const IOBus *bus, ioportmask_t bits)
Write to an I/O bus.
uint32_t ioline_t
Type of an I/O line.
msg_t palWaitPadTimeoutS(ioportid_t port, iopadid_t pad, sysinterval_t timeout)
Waits for an edge on the specified port/pad.
uint64_t sysinterval_t
Type of time interval.
threads_queue_t threads
Threads queued for an event.
PLATFORM PAL subsystem low level driver header.
Type of a PAL event record.
void(* palcallback_t)(void *arg)
Type of a PAL event callback.
void palSetLineCallbackI(ioline_t line, palcallback_t cb, void *arg)
Associates a callback to a line.
ioportmask_t mask
Bus mask aligned to port bit 0.
uint_fast8_t offset
Offset, within the port, of the least significant bit of the bus.
msg_t palWaitLineTimeout(ioline_t line, sysinterval_t timeout)
Waits for an edge on the specified line.