123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451 |
- /*
- ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- */
- /**
- * @file hal_pal_lld.h
- * @brief PLATFORM PAL subsystem low level driver header.
- *
- * @addtogroup PAL
- * @{
- */
- #ifndef HAL_PAL_LLD_H
- #define HAL_PAL_LLD_H
- #if (HAL_USE_PAL == TRUE) || defined(__DOXYGEN__)
- /*===========================================================================*/
- /* Unsupported modes and specific modes */
- /*===========================================================================*/
- /* Specifies palInit() without parameter, required until all platforms will
- be updated to the new style.*/
- #define PAL_NEW_INIT
- /*===========================================================================*/
- /* I/O Ports Types and constants. */
- /*===========================================================================*/
- /**
- * @name Port related definitions
- * @{
- */
- /**
- * @brief Width, in bits, of an I/O port.
- */
- #define PAL_IOPORTS_WIDTH 16U
- /**
- * @brief Whole port mask.
- * @details This macro specifies all the valid bits into a port.
- */
- #define PAL_WHOLE_PORT ((ioportmask_t)0xFFFFU)
- /** @} */
- /**
- * @name Line handling macros
- * @{
- */
- /**
- * @brief Forms a line identifier.
- * @details A port/pad pair are encoded into an @p ioline_t type. The encoding
- * of this type is platform-dependent.
- */
- #define PAL_LINE(port, pad) \
- ((ioline_t)((uint32_t)(port)) | ((uint32_t)(pad)))
- /**
- * @brief Decodes a port identifier from a line identifier.
- */
- #define PAL_PORT(line) \
- ((stm32_gpio_t *)(((uint32_t)(line)) & 0xFFFFFFF0U))
- /**
- * @brief Decodes a pad identifier from a line identifier.
- */
- #define PAL_PAD(line) \
- ((uint32_t)((uint32_t)(line) & 0x0000000FU))
- /**
- * @brief Value identifying an invalid line.
- */
- #define PAL_NOLINE 0U
- /** @} */
- /**
- * @brief Generic I/O ports static initializer.
- * @details An instance of this structure must be passed to @p palInit() at
- * system startup time in order to initialized the digital I/O
- * subsystem. This represents only the initial setup, specific pads
- * or whole ports can be reprogrammed at later time.
- * @note Implementations may extend this structure to contain more,
- * architecture dependent, fields.
- */
- typedef struct {
- } PALConfig;
- /**
- * @brief Digital I/O port sized unsigned type.
- */
- typedef uint32_t ioportmask_t;
- /**
- * @brief Digital I/O modes.
- */
- typedef uint32_t iomode_t;
- /**
- * @brief Type of an I/O line.
- */
- typedef uint32_t ioline_t;
- /**
- * @brief Port Identifier.
- * @details This type can be a scalar or some kind of pointer, do not make
- * any assumption about it, use the provided macros when populating
- * variables of this type.
- */
- typedef uint32_t ioportid_t;
- /**
- * @brief Type of an pad identifier.
- */
- typedef uint32_t iopadid_t;
- /*===========================================================================*/
- /* I/O Ports Identifiers. */
- /*===========================================================================*/
- /**
- * @brief First I/O port identifier.
- * @details Low level drivers can define multiple ports, it is suggested to
- * use this naming convention.
- */
- #define IOPORT1 0
- /*===========================================================================*/
- /* Implementation, some of the following macros could be implemented as */
- /* functions, if so please put them in pal_lld.c. */
- /*===========================================================================*/
- /**
- * @brief Low level PAL subsystem initialization.
- *
- * @notapi
- */
- #define pal_lld_init() _pal_lld_init()
- /**
- * @brief Reads the physical I/O port states.
- *
- * @param[in] port port identifier
- * @return The port bits.
- *
- * @notapi
- */
- #define pal_lld_readport(port) 0U
- /**
- * @brief Reads the output latch.
- * @details The purpose of this function is to read back the latched output
- * value.
- *
- * @param[in] port port identifier
- * @return The latched logical states.
- *
- * @notapi
- */
- #define pal_lld_readlatch(port) 0U
- /**
- * @brief Writes a bits mask on a I/O port.
- *
- * @param[in] port port identifier
- * @param[in] bits bits to be written on the specified port
- *
- * @notapi
- */
- #define pal_lld_writeport(port, bits) \
- do { \
- (void)port; \
- (void)bits; \
- } while (false)
- /**
- * @brief Sets a bits mask on a I/O port.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] bits bits to be ORed on the specified port
- *
- * @notapi
- */
- #define pal_lld_setport(port, bits) \
- do { \
- (void)port; \
- (void)bits; \
- } while (false)
- /**
- * @brief Clears a bits mask on a I/O port.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] bits bits to be cleared on the specified port
- *
- * @notapi
- */
- #define pal_lld_clearport(port, bits) \
- do { \
- (void)port; \
- (void)bits; \
- } while (false)
- /**
- * @brief Toggles a bits mask on a I/O port.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] bits bits to be XORed on the specified port
- *
- * @notapi
- */
- #define pal_lld_toggleport(port, bits) \
- do { \
- (void)port; \
- (void)bits; \
- } while (false)
- /**
- * @brief Reads a group of bits.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] mask group mask
- * @param[in] offset group bit offset within the port
- * @return The group logical states.
- *
- * @notapi
- */
- #define pal_lld_readgroup(port, mask, offset) 0U
- /**
- * @brief Writes a group of bits.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] mask group mask
- * @param[in] offset group bit offset within the port
- * @param[in] bits bits to be written. Values exceeding the group width
- * are masked.
- *
- * @notapi
- */
- #define pal_lld_writegroup(port, mask, offset, bits) \
- do { \
- (void)port; \
- (void)mask; \
- (void)offset; \
- (void)bits; \
- } while (false)
- /**
- * @brief Pads group mode setup.
- * @details This function programs a pads group belonging to the same port
- * with the specified mode.
- * @note Programming an unknown or unsupported mode is silently ignored.
- *
- * @param[in] port port identifier
- * @param[in] mask group mask
- * @param[in] offset group bit offset within the port
- * @param[in] mode group mode
- *
- * @notapi
- */
- #define pal_lld_setgroupmode(port, mask, offset, mode) \
- _pal_lld_setgroupmode(port, mask << offset, mode)
- /**
- * @brief Reads a logical state from an I/O pad.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] pad pad number within the port
- * @return The logical state.
- * @retval PAL_LOW low logical state.
- * @retval PAL_HIGH high logical state.
- *
- * @notapi
- */
- #define pal_lld_readpad(port, pad) PAL_LOW
- /**
- * @brief Writes a logical state on an output pad.
- * @note This function is not meant to be invoked directly by the
- * application code.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] pad pad number within the port
- * @param[in] bit logical value, the value must be @p PAL_LOW or
- * @p PAL_HIGH
- *
- * @notapi
- */
- #define pal_lld_writepad(port, pad, bit) \
- do { \
- (void)port; \
- (void)pad; \
- (void)bit; \
- } while (false)
- /**
- * @brief Sets a pad logical state to @p PAL_HIGH.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] pad pad number within the port
- *
- * @notapi
- */
- #define pal_lld_setpad(port, pad) \
- do { \
- (void)port; \
- (void)pad; \
- } while (false)
- /**
- * @brief Clears a pad logical state to @p PAL_LOW.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] pad pad number within the port
- *
- * @notapi
- */
- #define pal_lld_clearpad(port, pad) \
- do { \
- (void)port; \
- (void)pad; \
- } while (false)
- /**
- * @brief Toggles a pad logical state.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- *
- * @param[in] port port identifier
- * @param[in] pad pad number within the port
- *
- * @notapi
- */
- #define pal_lld_togglepad(port, pad) \
- do { \
- (void)port; \
- (void)pad; \
- } while (false)
- /**
- * @brief Pad mode setup.
- * @details This function programs a pad with the specified mode.
- * @note The @ref PAL provides a default software implementation of this
- * functionality, implement this function if can optimize it by using
- * special hardware functionalities or special coding.
- * @note Programming an unknown or unsupported mode is silently ignored.
- *
- * @param[in] port port identifier
- * @param[in] pad pad number within the port
- * @param[in] mode pad mode
- *
- * @notapi
- */
- #define pal_lld_setpadmode(port, pad, mode) \
- do { \
- (void)port; \
- (void)pad; \
- (void)mode; \
- } while (false)
- /**
- * @brief Returns a PAL event structure associated to a pad.
- *
- * @param[in] port port identifier
- * @param[in] pad pad number within the port
- *
- * @notapi
- */
- #define pal_lld_get_pad_event(port, pad) \
- &_pal_events[0]; (void)(port); (void)pad
- /**
- * @brief Returns a PAL event structure associated to a line.
- *
- * @param[in] line line identifier
- *
- * @notapi
- */
- #define pal_lld_get_line_event(line) \
- &_pal_events[0]; (void)line
- #if !defined(__DOXYGEN__)
- #if (PAL_USE_WAIT == TRUE) || (PAL_USE_CALLBACKS == TRUE)
- extern palevent_t _pal_events[1];
- #endif
- #endif
- #ifdef __cplusplus
- extern "C" {
- #endif
- void _pal_lld_init(void);
- void _pal_lld_setgroupmode(ioportid_t port,
- ioportmask_t mask,
- iomode_t mode);
- #ifdef __cplusplus
- }
- #endif
- #endif /* HAL_USE_PAL == TRUE */
- #endif /* HAL_PAL_LLD_H */
- /** @} */
|