From 8183016f1cb574d923c83eab468ca37617051d78 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Sun, 21 Jun 2009 09:35:39 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@1043 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- src/lib/pal.c | 13 +++++++++++++ src/lib/pal.h | 35 ++++++++++++++++++++++++++++------- src/templates/pal_lld.h | 41 +++++++++++++++++++++++++++++++++++------ 3 files changed, 76 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/lib/pal.c b/src/lib/pal.c index 95ab43883..4dec01589 100644 --- a/src/lib/pal.c +++ b/src/lib/pal.c @@ -70,6 +70,19 @@ void palWriteBus(IOBus *bus, ioportmask_t bits) { palWriteGroup(bus->bus_portid, bus->bus_mask, bus->bus_offset, bits); } +/** + * @brief Programs a bus with the specified mode. + * + * @param[in] bus the I/O bus, pointer to a @p IOBus structure + * @param[in] mode the mode + * + * @note The operation is not guaranteed to be atomic on all the architectures, + * for atomicity and/or portability reasons you may need to enclose port + * I/O operations between @p chSysLock() and @p chSysUnlock(). + * @note The default implementation is non atomic and not necessarily + * optimal. Low level drivers may optimize the function by using + * specific hardware or coding. + */ void palSetBusMode(IOBus *bus, uint_fast8_t mode) { chDbgCheck((bus != NULL) && diff --git a/src/lib/pal.h b/src/lib/pal.h index 96ed8c312..c45a801e6 100644 --- a/src/lib/pal.h +++ b/src/lib/pal.h @@ -296,6 +296,24 @@ typedef struct { pal_lld_writegroup(port, mask, offset, bits) #endif + +/** + * @brief Pads group mode setup. + * @details This function programs a pads group belonging to the same port + * with the specified mode. + * + * @param[in] port the port identifier + * @param[in] mask the group mask + * @param[in] mode the setup mode + * + * @note Programming an unknown or unsupported mode is silently ignored. + */ +#if !defined(pal_lld_setgroupmode) || defined(__DOXYGEN__) +#define palSetGroupMode(port, mask, mode) +#else +#define palSetGroupMode(port, mask, mode) pal_lld_setgroupmode(port, mask, mode) +#endif + /** * @brief Reads an input pad logical state. * @@ -400,21 +418,24 @@ typedef struct { #define palTogglePad(port, pad) pal_lld_togglepad(port, pad) #endif + /** - * @brief Pads mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. + * @brief Pad mode setup. + * @details This function programs a pad with the specified mode. * * @param[in] port the port identifier - * @param[in] mask the group mask + * @param[in] pad the pad number within the port * @param[in] mode the setup mode * + * @note The default implementation not necessarily optimal. Low level drivers + * may optimize the function by using specific hardware or coding. * @note Programming an unknown or unsupported mode is silently ignored. */ -#if !defined(pal_lld_setmode) || defined(__DOXYGEN__) -#define palSetMode(port, mask, mode) +#if !defined(pal_lld_setpadmode) || defined(__DOXYGEN__) +#define palSetPadMode(port, pad, mode) \ + palSetGroupMode(port, PAL_PORT_BIT(pad), mode) #else -#define palSetMode(port, mask, mode) pal_lld_setmode(port, mask, mode) +#define palSetPadMode(port, pad, mode) pal_lld_setpadmode(port, pad, mode) #endif #ifdef __cplusplus diff --git a/src/templates/pal_lld.h b/src/templates/pal_lld.h index 48c91811c..96cfe872d 100644 --- a/src/templates/pal_lld.h +++ b/src/templates/pal_lld.h @@ -186,6 +186,21 @@ typedef uint32_t ioportid_t; */ #define pal_lld_writegroup(port, mask, offset, bits) +/** + * @brief Pads group mode setup. + * @details This function programs a pads group belonging to the same port + * with the specified mode. + * + * @param[in] port the port identifier + * @param[in] mask the group mask + * @param[in] mode the mode + * + * @note This function is not meant to be invoked directly by the application + * code. + * @note Programming an unknown or unsupported mode is silently ignored. + */ +#define pal_lld_setgroupmode(port, mask, mode) + /** * @brief Reads a logical state from an I/O pad. * @@ -261,18 +276,32 @@ typedef uint32_t ioportid_t; #define pal_lld_togglepad(port, pad) /** - * @brief Pads mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. + * @brief Pad mode setup. + * @details This function programs a pad with the specified mode. * * @param[in] port the port identifier - * @param[in] mask the group mask - * @param[in] mode the setup mode + * @param[in] pad the pad number within the port + * @param[in] mode the mode * * @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. + * @note Programming an unknown or unsupported mode is silently ignored. */ -#define pal_lld_setmode(port, mask, mode) +#define pal_lld_setpadmode(port, pad, mode) + +#ifdef __cplusplus +extern "C" { +#endif + ioportmask_t palReadBus(IOBus *bus); + void palWriteBus(IOBus *bus, ioportmask_t bits); + void palSetBusMode(IOBus *bus, uint_fast8_t mode); +#ifdef __cplusplus +} +#endif + #endif /* _PAL_LLD_H_ */ -- cgit v1.2.3