From 600cf9a77d21f4d3a56a7cbfa5f1132b05913f74 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Sun, 7 Jun 2009 14:50:14 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@1021 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- src/lib/pal.c | 7 +- src/lib/pal.h | 24 ++++ src/templates/ioports_lld.h | 156 -------------------------- src/templates/pal_lld.h | 260 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 289 insertions(+), 158 deletions(-) delete mode 100644 src/templates/ioports_lld.h create mode 100644 src/templates/pal_lld.h (limited to 'src') diff --git a/src/lib/pal.c b/src/lib/pal.c index 045c35c20..abe3db3f6 100644 --- a/src/lib/pal.c +++ b/src/lib/pal.c @@ -24,6 +24,9 @@ * @{ */ +#include +#include + /** * @brief Read from an I/O bus. * @@ -42,7 +45,7 @@ ioportmask_t palReadBus(IOBus *bus) { chDbgCheck((bus != NULL) && (bus->bus_offset > PAL_IOPORTS_WIDTH), "palReadBus"); - return palReadGroup(bus->bus_port, bus->bus_mask, bus->bus_offset); + return palReadGroup(bus->bus_portid, bus->bus_mask, bus->bus_offset); } /** @@ -64,7 +67,7 @@ void palWriteBus(IOBus *bus, ioportmask_t bits) { chDbgCheck((bus != NULL) && (bus->bus_offset > PAL_IOPORTS_WIDTH), "palWriteBus"); - palWriteBus(bus->bus_port, bus->bus_mask, bus->bus_offset, bits); + palWriteGroup(bus->bus_portid, bus->bus_mask, bus->bus_offset, bits); } /** @} */ diff --git a/src/lib/pal.h b/src/lib/pal.h index cac306c43..72f824aab 100644 --- a/src/lib/pal.h +++ b/src/lib/pal.h @@ -60,6 +60,30 @@ */ #define PAL_GROUP_MASK(width) ((ioportmask_t)(1 << (width)) - 1) +/** + * @brief Data part of a static I/O bus initializer. + * @details This macro should be used when statically initializing an I/O bus + * that is part of a bigger structure. + * + * @param name the name of the IOBus variable + * @param port the I/O port descriptor + * @param width the bus width in bits + * @param offset the bus bit offset within the port + */ +#define _IOBUS_DATA(name, port, width, offset) \ + {port, PAL_GROUP_MASK(width), offset} + +/** + * @brief Static I/O bus initializer. + * + * @param name the name of the IOBus variable + * @param port the I/O port descriptor + * @param width the bus width in bits + * @param offset the bus bit offset within the port + */ +#define IOBUS_DECL(name, port, width, offset) \ + IOBus name = _IOBUS_DATA(name, port, width, offset) + /** * @brief I/O bus descriptor. * @details This structure describes a group of contiguous digital I/O lines diff --git a/src/templates/ioports_lld.h b/src/templates/ioports_lld.h deleted file mode 100644 index dff095e75..000000000 --- a/src/templates/ioports_lld.h +++ /dev/null @@ -1,156 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file src/templates/ioports_lld.h - * @brief I/O ports low level driver template - * @addtogroup IOPortsLLD - * @{ - */ - -#ifndef _IOPORTS_LLD_H_ -#define _IOPORTS_LLD_H_ - -/*===========================================================================*/ -/* I/O Ports Types and constants. */ -/*===========================================================================*/ - -/** - * @brief Width, in bits, of an I/O port. - */ -#define IOPORTS_WIDTH 32 - -/** - * @brief Digital I/O port sized unsigned type. - */ -typedef uint32_t ioportmask_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; - -/*===========================================================================*/ -/* I/O Ports Identifiers. */ -/*===========================================================================*/ - -/** - * @brief First I/O port identifier. - * @details Low level drivers can define multiple ports, please use this - * naming convention. - */ -#define IOPORT_A 0 - -/*===========================================================================*/ -/* Implementation, some of the following macros could be implemented as */ -/* functions, please put them in a file named ioports_lld.c if so. */ -/*===========================================================================*/ - -/** - * @brief I/O ports subsystem initialization. - * - * @note This function is not invoked by a system API, it should be invoked - * from the system initialization code. - */ -#define ioport_init_lld() - -/** - * @brief Writes a bits mask on a I/O port. - * - * @param[in] port the port identifier - * @param[in] bits the bits to be written on the specified port - * - * @note This function is not meant to be invoked directly by the application - * code. - */ -#define ioport_write_lld(port, bits) - -/** - * @brief Reads an I/O port. - * - * @param[in] port the port identifier - * @return the port bits - * - * @note This function is not meant to be invoked directly by the application - * code. - */ -#define ioport_read_lld(port) - -/** - * @brief Sets a bits mask on a I/O port. - * - * @param[in] port the port identifier - * @param[in] bits the bits to be ORed on the specified port - * - * @note This function is not meant to be invoked directly by the application - * code. - */ -#define ioport_set_lld(port, bits) - -/** - * @brief Clears a bits mask on a I/O port. - * - * @param[in] port the port identifier - * @param[in] bits the bits to be cleared on the specified port - * - * @note This function is not meant to be invoked directly by the application - * code. - */ -#define ioport_clear_lld(port, bits) - -/** - * @brief Toggles a bits mask on a I/O port. - * - * @param[in] port the port identifier - * @param[in] bits the bits to be XORed on the specified port - * - * @note This function is not meant to be invoked directly by the application - * code. - */ -#define ioport_toggle_lld(port, bits) - -/** - * @brief Writes a value on an I/O bus. - * - * @param[in] bus the I/O bus, pointer to a @p IOBus structure - * @param[in] bits the bits to be written on the I/O bus. Values exceeding - * the bus width are masked so most significant bits are lost. - * - * @note This function is not meant to be invoked directly by the application - * code. - */ -#define ioport_writebus_lld(bus, bits) - -/** - * @brief Reads a value from an I/O bus. - * - * @param[in] bus the I/O bus, pointer to a @p IOBus structure - * @return the bus bits - * - * @note This function is not meant to be invoked directly by the application - * code. - */ -#define ioport_readbus_lld(bus) - -#endif /* _IOPORTS_LLD_H_ */ - -/** @} */ diff --git a/src/templates/pal_lld.h b/src/templates/pal_lld.h new file mode 100644 index 000000000..d9e492c0b --- /dev/null +++ b/src/templates/pal_lld.h @@ -0,0 +1,260 @@ +/* + ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio. + + This file is part of ChibiOS/RT. + + ChibiOS/RT is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/RT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file src/templates/pal_lld.h + * @brief @ref PAL subsystem low level driver template + * @addtogroup PAL_LLD + * @{ + */ + +#ifndef _PAL_LLD_H_ +#define _PAL_LLD_H_ + +/*===========================================================================*/ +/* I/O Ports Types and constants. */ +/*===========================================================================*/ + +/** + * @brief Width, in bits, of an I/O port. + */ +#define PAL_IOPORTS_WIDTH 32 + +/** + * @brief Digital I/O port sized unsigned type. + */ +typedef uint32_t ioportmask_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; + +/*===========================================================================*/ +/* 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 IOPORT_A 0 + +/*===========================================================================*/ +/* Implementation, some of the following macros could be implemented as */ +/* functions, if so please put them in a file named pal_lld.c. */ +/*===========================================================================*/ + +/** + * @brief Low level PAL subsystem initialization. + */ +#define pal_lld_init() + +/** + * @brief Reads the physical I/O port states. + * + * @param[in] port the port identifier + * @return The port bits. + * + * @note This function is not meant to be invoked directly by the application + * code. + */ +#define pal_lld_readport(port) + +/** + * @brief Reads the output latch. + * @details The purpose of this function is to read back the latched output + * value. + * + * @param[in] port the port identifier + * @return The latched logical states. + * + * @note This function is not meant to be invoked directly by the application + * code. + */ +#define pal_lld_readlatch(port) + +/** + * @brief Writes a bits mask on a I/O port. + * + * @param[in] port the port identifier + * @param[in] bits the bits to be written on the specified port + * + * @note This function is not meant to be invoked directly by the application + * code. + */ +#define pal_lld_writeport(port, bits) + +/** + * @brief Sets a bits mask on a I/O port. + * + * @param[in] port the port identifier + * @param[in] bits the bits to be ORed on the specified port + * + * @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. + */ +#define pal_lld_setport(port, bits) + +/** + * @brief Clears a bits mask on a I/O port. + * + * @param[in] port the port identifier + * @param[in] bits the bits to be cleared on the specified port + * + * @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. + */ +#define pal_lld_clearport(port, bits) + +/** + * @brief Toggles a bits mask on a I/O port. + * + * @param[in] port the port identifier + * @param[in] bits the bits to be XORed on the specified port + * + * @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. + */ +#define pal_lld_toggleport(port, bits) + +/** + * @brief Reads a group of bits. + * + * @param[in] port the port identifier + * @param[in] mask the group mask + * @param[in] offset the group bit offset within the port + * @return The group logical states. + * + * @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. + */ +#define pal_lld_readgroup(port, mask, offset) + +/** + * @brief Writes a group of bits. + * + * @param[in] port the port identifier + * @param[in] mask the group mask + * @param[in] offset the group bit offset within the port + * @param[in] bits the bits to be written. Values exceeding the group width + * are masked. + * @return The group logical states. + * + * @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. + */ +#define pal_lld_writegroup(port, mask, offset, bits) + +/** + * @brief Reads a logical state from an I/O pad. + * + * @param[in] port the port identifier + * @param[in] pad the pad number within the port + * @return The logical state. + * @retval 0 low logical state. + * @retval 1 high logical state. + * + * @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. + */ +#define pal_lld_readpad(port, pad) + +/** + * @brief Writes a logical state on an output pad. + * + * @param[in] port the port identifier + * @param[in] pad the pad number within the port + * @param[out] bit the logical value, the value must be @p 0 or @p 1 + * + * @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. + */ +#define pal_lld_writepad(port, pad, bit) + +/** + * @brief Sets a pad logical state to @p 1. + * + * @param[in] port the port identifier + * @param[in] pad the pad number within the port + * + * @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. + */ +#define pal_lld_setpad(port, pad) + +/** + * @brief Clears a pad logical state to @p 0. + * + * @param[in] port the port identifier + * @param[in] pad the pad number within the port + * + * @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. + */ +#define pal_lld_clearpad(port, pad) + +/** + * @brief Toggles a pad logical state. + * + * @param[in] port the port identifier + * @param[in] pad the pad number within the port + * + * @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. + */ +#define pal_lld_togglepad(port, pad) + +#endif /* _PAL_LLD_H_ */ + +/** @} */ -- cgit v1.2.3