diff options
author | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2009-06-04 13:20:43 +0000 |
---|---|---|
committer | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2009-06-04 13:20:43 +0000 |
commit | 9659a679baf31f9890d941c4e25617a7ca70756f (patch) | |
tree | a752504a11d6dbf6fc7ba0a32987e6078c365a23 /src | |
parent | 9148fd36b23a5ffcdd2f358627370a697fb49cef (diff) | |
download | ChibiOS-9659a679baf31f9890d941c4e25617a7ca70756f.tar.gz ChibiOS-9659a679baf31f9890d941c4e25617a7ca70756f.tar.bz2 ChibiOS-9659a679baf31f9890d941c4e25617a7ca70756f.zip |
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@1018 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'src')
-rw-r--r-- | src/include/ioports.h | 163 |
1 files changed, 134 insertions, 29 deletions
diff --git a/src/include/ioports.h b/src/include/ioports.h index 5fd330d51..8dd608fbe 100644 --- a/src/include/ioports.h +++ b/src/include/ioports.h @@ -67,33 +67,33 @@ typedef struct { } IOBus;
/**
- * @brief Writes a bits mask on a I/O port.
+ * @brief Reads an I/O port.
*
* @param[in] port the port identifier
- * @param[in] bits the bits to be written on the specified port
+ * @return The port logical states.
*
- * @note The default implementation does nothing except computing the
- * parameters eventual side effects.
+ * @note The default implementation always return zero and computes the
+ * parameter eventual side effects.
*/
-#if !defined(ioport_write_lld) || defined(__DOXYGEN__)
-#define chPortWrite(port, bits) ((void)(port), (void)(bits))
+#if !defined(ioport_read_lld) || defined(__DOXYGEN__)
+#define chPortRead(port) ((void)(port), 0)
#else
-#define chPortWrite(port, bits) ioport_write_lld(port, bits)
+#define chPortRead(port) ioport_read_lld(port)
#endif
/**
- * @brief Reads an I/O port.
+ * @brief Writes a bits mask on a I/O port.
*
* @param[in] port the port identifier
- * @return the port bits
+ * @param[in] bits the bits to be written on the specified port
*
- * @note The default implementation always return zero and computes the
- * parameter eventual side effects.
+ * @note The default implementation does nothing except computing the
+ * parameters eventual side effects.
*/
-#if !defined(ioport_read_lld) || defined(__DOXYGEN__)
-#define chPortRead(port) ((void)(port), 0)
+#if !defined(ioport_write_lld) || defined(__DOXYGEN__)
+#define chPortWrite(port, bits) ((void)(port), (void)(bits))
#else
-#define chPortRead(port) ioport_read_lld(port)
+#define chPortWrite(port, bits) ioport_write_lld(port, bits)
#endif
/**
@@ -105,7 +105,7 @@ typedef struct { * @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 atomical and not necessarily
+ * @note The default implementation is non atomic and not necessarily
* optimal. Low level drivers may optimize the function by using
* specific hardware or coding.
*/
@@ -127,7 +127,7 @@ typedef struct { * @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 atomical and not necessarily
+ * @note The default implementation is non atomic and not necessarily
* optimal. Low level drivers may optimize the function by using
* specific hardware or coding.
*/
@@ -149,7 +149,7 @@ typedef struct { * @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 atomical and not necessarily
+ * @note The default implementation is non atomic and not necessarily
* optimal. Low level drivers may optimize the function by using
* specific hardware or coding.
*/
@@ -163,6 +163,27 @@ typedef struct { #endif
/**
+ * @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 logical states.
+ *
+ * @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 not necessarily optimal. Low level drivers
+ * may optimize the function by using specific hardware or coding.
+ * @note The default implementation evaluates the parameter three times, be
+ * careful with side effects.
+ */
+#if !defined(ioport_readbus_lld) || defined(__DOXYGEN__)
+#define chPortReadBus(bus) \
+ ((chPortRead((bus)->bus_port) >> (bus)->bus_offset) & (bus)->bus_mask)
+#else
+#define chPortReadBus(bus) ioport_readbus_lld(bus)
+#endif
+
+/**
* @brief Writes a value on an I/O bus.
*
* @param[in] bus the I/O bus, pointer to a @p IOBus structure
@@ -172,7 +193,7 @@ typedef struct { * @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 atomical and not necessarily
+ * @note The default implementation is non atomic and not necessarily
* optimal. Low level drivers may optimize the function by using
* specific hardware or coding.
*/
@@ -187,24 +208,108 @@ typedef struct { #endif
/**
- * @brief Reads a value from an I/O bus. + * @brief Reads an input pad logical state.
*
- * @param[in] bus the I/O bus, pointer to a @p IOBus structure
- * @return the bus bits
+ * @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 The default implementation not necessarily optimal. Low level drivers
+ * may optimize the function by using specific hardware or coding.
+ * @note The default implementation internally uses the @p chPortRead().
+ */
+#if !defined(ioport_readpad_lld) || defined(__DOXYGEN__)
+#define chPortReadPad(port, pad) ((chPortRead(port) >> (pad)) & 1)
+#else
+#define chPortReadPad(port, pad) ioport_readpad_lld(port, pad)
+#endif
+
+/**
+ * @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] value the logical value, the value must be @p 0 or @p 1
*
* @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 not necessarily optimal. Low level drivers
- * may optimize the function by using specific hardware or coding.
- * @note The default implementation evaluates the parameter three times, be
- * careful with side effects.
+ * @note The default implementation is non atomic and not necessarily
+ * optimal. Low level drivers may optimize the function by using
+ * specific hardware or coding.
+ * @note The default implementation internally uses the @p chPortRead() and
+ * @p chPortWrite().
*/
-#if !defined(ioport_readbus_lld) || defined(__DOXYGEN__)
-#define chPortReadBus(bus) \
- ((chPortRead((bus)->bus_port) >> (bus)->bus_offset) & (bus)->bus_mask)
+#if !defined(ioport_writepad_lld) || defined(__DOXYGEN__)
+#define chPortWritePad(port, pad, value) {
+ ioport_t p = (port); \
+ chPortWrite(p, (chPortRead(p) & ~IOPORT_BIT(pad)) | \
+ ((value & 1) << pad)); \
+}
#else
-#define chPortReadBus(bus) ioport_readbus_lld(bus)
+#define chPortWritePad(port, pad, value) ioport_writepad_lld(port, pad, value)
+#endif
+
+/**
+ * @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 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.
+ * @note The default implementation internally uses the @p chPortSet().
+ */
+#if !defined(ioport_setpad_lld) || defined(__DOXYGEN__)
+#define chPortSetPad(port, pad) chPortSet(port, IOPORT_BIT(pad))
+#else
+#define chPortSetPad(port, pad) ioport_setpad_lld(port, pad)
+#endif
+
+/**
+ * @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 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.
+ * @note The default implementation internally uses the @p chPortClear().
+ */
+#if !defined(ioport_clearpad_lld) || defined(__DOXYGEN__)
+#define chPortClearPad(port, pad) chPortClear(port, IOPORT_BIT(pad))
+#else
+#define chPortClearPad(port, pad) ioport_clearpad_lld(port, pad)
+#endif
+
+/**
+ * @brief Toggles a pad logical state.
+ *
+ * @param[in] port the port identifier
+ * @param[in] pad the pad number within the port
+ *
+ * @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.
+ * @note The default implementation internally uses the @p chPortToggle().
+ */
+#if !defined(ioport_togglepad_lld) || defined(__DOXYGEN__)
+#define chPortTogglePad(port, pad) ioport_toggle_lld(port, IOPORT_BIT(pad))
+#else
+#define chPortTogglePad(port, pad) ioport_togglepad_lld(port, pad)
#endif
#endif /* _IOPORTS_H_ */
|