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 154 #if (PAL_USE_WAIT == TRUE) || defined(__DOXYGEN__) 160 #if (PAL_USE_CALLBACKS == TRUE) || defined(__DOXYGEN__) 209 #if !defined(PAL_PORT_BIT) || defined(__DOXYGEN__) 210 #define PAL_PORT_BIT(n) ((ioportmask_t)(1U << (n))) 220 #if !defined(PAL_GROUP_MASK) || defined(__DOXYGEN__) 221 #define PAL_GROUP_MASK(width) ((ioportmask_t)(1U << (width)) - 1U) 234 #define _IOBUS_DATA(name, port, width, offset) \ 235 {port, PAL_GROUP_MASK(width), offset} 245 #define IOBUS_DECL(name, port, width, offset) \ 246 IOBus name = _IOBUS_DATA(name, port, width, offset) 248 #if (PAL_USE_CALLBACKS == TRUE) || (PAL_USE_WAIT == TRUE) || \ 254 #if ((PAL_USE_CALLBACKS == TRUE) && (PAL_USE_WAIT == TRUE)) || \ 263 #define _pal_init_event(e) \ 265 osalThreadQueueObjectInit(&_pal_events[e].threads); \ 266 _pal_events[e].cb = NULL; \ 267 _pal_events[e].arg = NULL; \ 271 #if (PAL_USE_CALLBACKS == TRUE) && (PAL_USE_WAIT == FALSE) 272 #define _pal_init_event(e) \ 274 _pal_events[e].cb = NULL; \ 275 _pal_events[e].arg = NULL; \ 279 #if (PAL_USE_CALLBACKS == FALSE) && (PAL_USE_WAIT == TRUE) 280 #define _pal_init_event(e) \ 282 osalThreadQueueObjectInit(&_pal_events[e].threads); \ 286 #if ((PAL_USE_CALLBACKS == TRUE) && (PAL_USE_WAIT == TRUE)) || defined(__DOXYGEN__) 294 #define _pal_clear_event(e) \ 296 osalThreadDequeueAllI(&_pal_events[pad].threads, MSG_RESET); \ 297 _pal_events[e].cb = NULL; \ 298 _pal_events[e].arg = NULL; \ 302 #if (PAL_USE_CALLBACKS == TRUE) && (PAL_USE_WAIT == FALSE) 303 #define _pal_clear_event(e) \ 305 _pal_events[e].cb = NULL; \ 306 _pal_events[e].arg = NULL; \ 310 #if (PAL_USE_CALLBACKS == FALSE) && (PAL_USE_WAIT == TRUE) 311 #define _pal_clear_event(e) \ 313 osalThreadDequeueAllI(&_pal_events[pad].threads, MSG_RESET); \ 326 #if ((PAL_USE_CALLBACKS == TRUE) && (PAL_USE_WAIT == TRUE)) || \ 328 #define _pal_isr_code(e) do { \ 329 if (_pal_events[e].cb != NULL) { \ 330 _pal_events[e].cb(_pal_events[e].arg); \ 332 osalSysLockFromISR(); \ 333 osalThreadDequeueAllI(&_pal_events[e].threads, MSG_OK); \ 334 osalSysUnlockFromISR(); \ 338 #if (PAL_USE_CALLBACKS == TRUE) && (PAL_USE_WAIT == FALSE) 339 #define _pal_isr_code(e) do { \ 340 if (_pal_events[e].cb != NULL) { \ 341 _pal_events[e].cb(_pal_events[e].arg); \ 346 #if ((PAL_USE_CALLBACKS == FALSE) && (PAL_USE_WAIT == TRUE)) || \ 348 #define _pal_isr_code(e) do { \ 349 osalSysLockFromISR(); \ 350 osalThreadDequeueAllI(&_pal_events[e].threads, MSG_OK); \ 351 osalSysUnlockFromISR(); \ 369 #if defined(PAL_NEW_INIT) || defined(__DOXYGEN__) 370 #define palInit() pal_lld_init() 372 #define palInit(config) pal_lld_init(config) 384 #if !defined(pal_lld_readport) || defined(__DOXYGEN__) 385 #define palReadPort(port) ((void)(port), 0U) 387 #define palReadPort(port) pal_lld_readport(port) 401 #if !defined(pal_lld_readlatch) || defined(__DOXYGEN__) 402 #define palReadLatch(port) ((void)(port), 0U) 404 #define palReadLatch(port) pal_lld_readlatch(port) 416 #if !defined(pal_lld_writeport) || defined(__DOXYGEN__) 417 #define palWritePort(port, bits) ((void)(port), (void)(bits)) 419 #define palWritePort(port, bits) pal_lld_writeport(port, bits) 435 #if !defined(pal_lld_setport) || defined(__DOXYGEN__) 436 #define palSetPort(port, bits) \ 437 palWritePort(port, palReadLatch(port) | (bits)) 439 #define palSetPort(port, bits) pal_lld_setport(port, bits) 455 #if !defined(pal_lld_clearport) || defined(__DOXYGEN__) 456 #define palClearPort(port, bits) \ 457 palWritePort(port, palReadLatch(port) & ~(bits)) 459 #define palClearPort(port, bits) pal_lld_clearport(port, bits) 475 #if !defined(pal_lld_toggleport) || defined(__DOXYGEN__) 476 #define palTogglePort(port, bits) \ 477 palWritePort(port, palReadLatch(port) ^ (bits)) 479 #define palTogglePort(port, bits) pal_lld_toggleport(port, bits) 494 #if !defined(pal_lld_readgroup) || defined(__DOXYGEN__) 495 #define palReadGroup(port, mask, offset) \ 496 ((palReadPort(port) >> (offset)) & (mask)) 498 #define palReadGroup(port, mask, offset) pal_lld_readgroup(port, mask, offset) 518 #if !defined(pal_lld_writegroup) || defined(__DOXYGEN__) 519 #define palWriteGroup(port, mask, offset, bits) \ 520 palWritePort(port, (palReadLatch(port) & ~((mask) << (offset))) | \ 521 (((bits) & (mask)) << (offset))) 523 #define palWriteGroup(port, mask, offset, bits) \ 524 pal_lld_writegroup(port, mask, offset, bits) 545 #if !defined(pal_lld_setgroupmode) || defined(__DOXYGEN__) 546 #define palSetGroupMode(port, mask, offset, mode) 548 #define palSetGroupMode(port, mask, offset, mode) \ 549 pal_lld_setgroupmode(port, mask, offset, mode) 564 #if !defined(pal_lld_readpad) || defined(__DOXYGEN__) 565 #define palReadPad(port, pad) ((palReadPort(port) >> (pad)) & 1U) 567 #define palReadPad(port, pad) pal_lld_readpad(port, pad) 585 #if !defined(pal_lld_writepad) || defined(__DOXYGEN__) 586 #define palWritePad(port, pad, bit) \ 587 palWritePort(port, (palReadLatch(port) & ~PAL_PORT_BIT(pad)) | \ 588 (((bit) & 1U) << pad)) 590 #define palWritePad(port, pad, bit) pal_lld_writepad(port, pad, bit) 606 #if !defined(pal_lld_setpad) || defined(__DOXYGEN__) 607 #define palSetPad(port, pad) palSetPort(port, PAL_PORT_BIT(pad)) 609 #define palSetPad(port, pad) pal_lld_setpad(port, pad) 625 #if !defined(pal_lld_clearpad) || defined(__DOXYGEN__) 626 #define palClearPad(port, pad) palClearPort(port, PAL_PORT_BIT(pad)) 628 #define palClearPad(port, pad) pal_lld_clearpad(port, pad) 644 #if !defined(pal_lld_togglepad) || defined(__DOXYGEN__) 645 #define palTogglePad(port, pad) palTogglePort(port, PAL_PORT_BIT(pad)) 647 #define palTogglePad(port, pad) pal_lld_togglepad(port, pad) 666 #if !defined(pal_lld_setpadmode) || defined(__DOXYGEN__) 667 #define palSetPadMode(port, pad, mode) \ 668 palSetGroupMode(port, PAL_PORT_BIT(pad), 0U, mode) 670 #define palSetPadMode(port, pad, mode) pal_lld_setpadmode(port, pad, mode) 684 #if !defined(pal_lld_readline) || defined(__DOXYGEN__) 685 #define palReadLine(line) palReadPad(PAL_PORT(line), PAL_PAD(line)) 687 #define palReadLine(line) pal_lld_readline(line) 704 #if !defined(pal_lld_writeline) || defined(__DOXYGEN__) 705 #define palWriteLine(line, bit) palWritePad(PAL_PORT(line), PAL_PAD(line), bit) 707 #define palWriteLine(line, bit) pal_lld_writeline(line, bit) 722 #if !defined(pal_lld_setline) || defined(__DOXYGEN__) 723 #define palSetLine(line) palSetPad(PAL_PORT(line), PAL_PAD(line)) 725 #define palSetLine(line) pal_lld_setline(line) 740 #if !defined(pal_lld_clearline) || defined(__DOXYGEN__) 741 #define palClearLine(line) palClearPad(PAL_PORT(line), PAL_PAD(line)) 743 #define palClearLine(line) pal_lld_clearline(line) 758 #if !defined(pal_lld_toggleline) || defined(__DOXYGEN__) 759 #define palToggleLine(line) palTogglePad(PAL_PORT(line), PAL_PAD(line)) 761 #define palToggleLine(line) pal_lld_toggleline(line) 777 #if !defined(pal_lld_setlinemode) || defined(__DOXYGEN__) 778 #define palSetLineMode(line, mode) \ 779 palSetPadMode(PAL_PORT(line), PAL_PAD(line), mode) 781 #define palSetLineMode(line, mode) pal_lld_setlinemode(line, mode) 784 #if (PAL_USE_CALLBACKS == TRUE) || (PAL_USE_WAIT == TRUE) || \ 796 #if !defined(pal_lld_enablepadevent) || defined(__DOXYGEN__) 797 #define palEnablePadEventI(port, pad, mode) 799 #define palEnablePadEventI(port, pad, mode) \ 800 pal_lld_enablepadevent(port, pad, mode) 812 #if !defined(pal_lld_disablepadevent) || defined(__DOXYGEN__) 813 #define palDisablePadEventI(port, pad) 815 #define palDisablePadEventI(port, pad) \ 816 pal_lld_disablepadevent(port, pad) 829 #define palEnablePadEvent(port, pad, mode) \ 832 palEnablePadEventI(port, pad, mode); \ 845 #define palDisablePadEvent(port, pad) \ 848 palDisablePadEventI(port, pad); \ 861 #if !defined(pal_lld_enablelineevent) || defined(__DOXYGEN__) 862 #define palEnableLineEventI(line, mode) \ 863 palEnablePadEventI(PAL_PORT(line), PAL_PAD(line), mode) 865 #define palEnableLineEventI(line, mode) \ 866 pal_lld_enablelineevent(line, mode) 877 #if !defined(pal_lld_disablelineevent) || defined(__DOXYGEN__) 878 #define palDisableLineEventI(line) \ 879 palDisablePadEventI(PAL_PORT(line), PAL_PAD(line)) 881 #define palDisableLineEventI(line) pal_lld_disablelineevent(line) 893 #define palEnableLineEvent(line, mode) \ 896 palEnableLineEventI(line, mode); \ 908 #define palDisableLineEvent(line) \ 911 palDisableLineEventI(line); \ 917 #if (PAL_USE_CALLBACKS == TRUE) || defined(__DOXYGEN__) 928 #define palSetPadCallback(port, pad, cb, arg) \ 931 palSetPadCallbackI(port, pad, cb, arg); \ 944 #define palSetLineCallback(line, cb, arg) \ 947 palSetLineCallbackI(line, cb, arg); \ 964 #if (PAL_USE_CALLBACKS == TRUE) || defined(__DOXYGEN__) 969 #if (PAL_USE_WAIT == TRUE) || defined(__DOXYGEN__) ioportmask_t mask
Bus mask aligned to port bit 0.
Type of a PAL event record.
uint32_t ioportmask_t
Digital I/O port sized unsigned type.
uint64_t sysinterval_t
Type of time interval.
uint32_t iopadid_t
Type of an pad identifier.
palcallback_t cb
Event callback.
uint32_t ioline_t
Type of an I/O line.
ioportid_t portid
Port identifier.
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.
ioportmask_t palReadBus(const IOBus *bus)
Read from an I/O bus.
uint32_t ioportid_t
Port Identifier.
void palSetLineCallbackI(ioline_t line, palcallback_t cb, void *arg)
Associates a callback to a line.
uint_fast8_t offset
Offset, within the port, of the least significant bit of the bus.
msg_t palWaitPadTimeoutS(ioportid_t port, iopadid_t pad, sysinterval_t timeout)
Waits for an edge on the specified port/pad.
void * arg
Event callback argument.
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.
msg_t palWaitLineTimeoutS(ioline_t line, sysinterval_t timeout)
Waits for an edge on the specified line.
void palSetBusMode(const IOBus *bus, iomode_t mode)
Programs a bus with the specified mode.
uint32_t iomode_t
Digital I/O modes.
PLATFORM PAL subsystem low level driver header.
threads_queue_t threads
Threads queued for an event.
void(* palcallback_t)(void *arg)
Type of a PAL event callback.