diff options
Diffstat (limited to 'os/hal/platforms/LPC43xx/pal_lld.c')
-rw-r--r-- | os/hal/platforms/LPC43xx/pal_lld.c | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/os/hal/platforms/LPC43xx/pal_lld.c b/os/hal/platforms/LPC43xx/pal_lld.c new file mode 100644 index 000000000..321b0fe1a --- /dev/null +++ b/os/hal/platforms/LPC43xx/pal_lld.c @@ -0,0 +1,171 @@ +/* + ChibiOS/RT - Copyright (C) 2006-2013 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. +*/ + +/* + This file has been contributed by: + Marcin Jokel. +*/ + +/** + * @file LPC43xx/pal_lld.c + * @brief LPC43xx GPIO low level driver code. + * + * @addtogroup PAL + * @{ + */ + +#include "ch.h" +#include "hal.h" + +#if HAL_USE_PAL || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Driver exported variables. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver local variables and types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver local functions. */ +/*===========================================================================*/ + +static void initgpio(ioportid_t port, const lpc_gpio_setup_t *config) { + + LPC_GPIO_PORT->DIR[port] = config->dir; + LPC_GPIO_PORT->MASK[port] = 0; + LPC_GPIO_PORT->PIN[port] = config->data; +} + +/*===========================================================================*/ +/* Driver interrupt handlers. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver exported functions. */ +/*===========================================================================*/ +/** + * @brief LPC43xx I/O ports configuration. + * @details GPIO unit registers initialization. + * + * @param[in] config the LPC43xx ports configuration + * + * @notapi + */ +void _pal_lld_init(const PALConfig *config) { + + initgpio(GPIO0, &config->P0); + initgpio(GPIO1, &config->P1); + initgpio(GPIO2, &config->P2); + initgpio(GPIO3, &config->P3); +#if LPC_HAS_GPIO4 + initgpio(GPIO4, &config->P4); +#endif + initgpio(GPIO5, &config->P5); + +#if LPC_HAS_GPIO6 + initgpio(GPIO6, &config->P6); +#endif + +#if LPC_HAS_GPIO7 + initgpio(GPIO7, &config->P7); +#endif +} + +/** + * @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 + */ +uint32_t _pal_lld_readgroup(ioportid_t port, + ioportmask_t mask, + uint32_t offset) { + + uint32_t p; + + LPC_GPIO_PORT->MASK[port] = ~((mask) << offset); + p = LPC_GPIO_PORT->MPIN[port]; + LPC_GPIO_PORT->MASK[port] = 0; + return p; +} + +/** + * @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 + */ +void _pal_lld_writegroup(ioportid_t port, + ioportmask_t mask, + uint32_t offset, + uint32_t bits) { + + LPC_GPIO_PORT->MASK[port] = ~((mask) << offset); + LPC_GPIO_PORT->MPIN[port] = bits; + LPC_GPIO_PORT->MASK[port] = 0; +} +/** + * @brief Pads mode setup. + * @details This function programs a pads group belonging to the same port + * with the specified mode. + * @note @p PAL_MODE_UNCONNECTED is implemented as push pull output with + * high state. + * @note This function does not alter the @p PINSELx registers. Alternate + * functions setup must be handled by device-specific code. + * + * @param[in] port the port identifier + * @param[in] mask the group mask + * @param[in] mode the mode + * + * @notapi + */ +void _pal_lld_setgroupmode(ioportid_t port, + ioportmask_t mask, + iomode_t mode) { + + switch (mode) { + case PAL_MODE_RESET: + case PAL_MODE_INPUT: + LPC_GPIO_PORT->DIR[port] &= ~mask; + break; + case PAL_MODE_UNCONNECTED: + palSetPort(port, PAL_WHOLE_PORT); + case PAL_MODE_OUTPUT_PUSHPULL: + LPC_GPIO_PORT->DIR[port] |= mask; + break; + } +} + +#endif /* HAL_USE_PAL */ + +/** @} */ |