ChibiOS/RT Architecture - Reference Manual - Guides |
00001 /* 00002 ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio. 00003 00004 This file is part of ChibiOS/RT. 00005 00006 ChibiOS/RT is free software; you can redistribute it and/or modify 00007 it under the terms of the GNU General Public License as published by 00008 the Free Software Foundation; either version 3 of the License, or 00009 (at your option) any later version. 00010 00011 ChibiOS/RT is distributed in the hope that it will be useful, 00012 but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 GNU General Public License for more details. 00015 00016 You should have received a copy of the GNU General Public License 00017 along with this program. If not, see <http://www.gnu.org/licenses/>. 00018 00019 --- 00020 00021 A special exception to the GPL can be applied should you wish to distribute 00022 a combined work that includes ChibiOS/RT, without being obliged to provide 00023 the source code for any proprietary components. See the file exception.txt 00024 for full details of how and when the exception can be applied. 00025 */ 00026 00027 /** 00028 * @file pal.c 00029 * @brief I/O Ports Abstraction Layer code. 00030 * 00031 * @addtogroup PAL 00032 * @{ 00033 */ 00034 00035 #include "ch.h" 00036 #include "hal.h" 00037 00038 #if CH_HAL_USE_PAL || defined(__DOXYGEN__) 00039 00040 /*===========================================================================*/ 00041 /* Driver exported variables. */ 00042 /*===========================================================================*/ 00043 00044 /*===========================================================================*/ 00045 /* Driver local variables. */ 00046 /*===========================================================================*/ 00047 00048 /*===========================================================================*/ 00049 /* Driver local functions. */ 00050 /*===========================================================================*/ 00051 00052 /*===========================================================================*/ 00053 /* Driver exported functions. */ 00054 /*===========================================================================*/ 00055 00056 /** 00057 * @brief Read from an I/O bus. 00058 * @note The operation is not guaranteed to be atomic on all the 00059 * architectures, for atomicity and/or portability reasons you may 00060 * need to enclose port I/O operations between @p chSysLock() and 00061 * @p chSysUnlock(). 00062 * @note The function internally uses the @p palReadGroup() macro. The use 00063 * of this function is preferred when you value code size, readability 00064 * and error checking over speed. 00065 * 00066 * @param[in] bus the I/O bus, pointer to a @p IOBus structure 00067 * @return The bus logical states. 00068 */ 00069 ioportmask_t palReadBus(IOBus *bus) { 00070 00071 chDbgCheck((bus != NULL) && 00072 (bus->bus_offset > PAL_IOPORTS_WIDTH), "palReadBus"); 00073 00074 return palReadGroup(bus->bus_portid, bus->bus_mask, bus->bus_offset); 00075 } 00076 00077 /** 00078 * @brief Write to an I/O bus. 00079 * @note The operation is not guaranteed to be atomic on all the 00080 * architectures, for atomicity and/or portability reasons you may 00081 * need to enclose port I/O operations between @p chSysLock() and 00082 * @p chSysUnlock(). 00083 * @note The default implementation is non atomic and not necessarily 00084 * optimal. Low level drivers may optimize the function by using 00085 * specific hardware or coding. 00086 * 00087 * @param[in] bus the I/O bus, pointer to a @p IOBus structure 00088 * @param[in] bits the bits to be written on the I/O bus. Values exceeding 00089 * the bus width are masked so most significant bits are 00090 * lost. 00091 */ 00092 void palWriteBus(IOBus *bus, ioportmask_t bits) { 00093 00094 chDbgCheck((bus != NULL) && 00095 (bus->bus_offset > PAL_IOPORTS_WIDTH), "palWriteBus"); 00096 00097 palWriteGroup(bus->bus_portid, bus->bus_mask, bus->bus_offset, bits); 00098 } 00099 00100 /** 00101 * @brief Programs a bus with the specified mode. 00102 * @note The operation is not guaranteed to be atomic on all the 00103 * architectures, for atomicity and/or portability reasons you may 00104 * need to enclose port I/O operations between @p chSysLock() and 00105 * @p chSysUnlock(). 00106 * @note The default implementation is non atomic and not necessarily 00107 * optimal. Low level drivers may optimize the function by using 00108 * specific hardware or coding. 00109 * 00110 * @param[in] bus the I/O bus, pointer to a @p IOBus structure 00111 * @param[in] mode the mode 00112 */ 00113 void palSetBusMode(IOBus *bus, uint_fast8_t mode) { 00114 00115 chDbgCheck((bus != NULL) && 00116 (bus->bus_offset > PAL_IOPORTS_WIDTH), "palSetBusMode"); 00117 00118 palSetGroupMode(bus->bus_portid, bus->bus_mask, mode); 00119 } 00120 00121 #endif /* CH_HAL_USE_PAL */ 00122 00123 /** @} */