From 1a62b448482d81f92e2fc7e7e9095ad7982947be Mon Sep 17 00:00:00 2001 From: gdisirio Date: Thu, 24 Sep 2009 16:18:37 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@1177 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/io/mac.c | 81 ++++++++++++++++++++++++++++++++++--- os/io/mac.h | 12 +++++- os/io/templates/mac_lld.c | 101 ++++++++++++++++++++++++++++++++++++++++++++++ os/io/templates/mac_lld.h | 71 ++++++++++++++++++++++++++++++++ 4 files changed, 258 insertions(+), 7 deletions(-) create mode 100644 os/io/templates/mac_lld.c create mode 100644 os/io/templates/mac_lld.h (limited to 'os/io') diff --git a/os/io/mac.c b/os/io/mac.c index 78b92feb1..c6c5f0168 100644 --- a/os/io/mac.c +++ b/os/io/mac.c @@ -27,11 +27,17 @@ #include #include +/** + * @brief Transmit descriptors counter semaphore. + */ +static Semaphore tdsem; + /** * @brief MAC Driver initialization. */ void macInit(void) { + chSemInit(&tdsem, MAC_TRANSMIT_DESCRIPTORS); mac_lld_init(); } @@ -40,25 +46,88 @@ void macInit(void) { * * @param[in] p pointer to a six bytes buffer containing the MAC address. If * this parameter is set to @p NULL then a system default MAC is - * used. + * used. + * + * @note This function should be invoked after the @p macInit() and before + * @p macStart() else the result is unspecified (performed or ignored). */ void macSetAddress(uint8_t *p) { mac_lld_set_address(p); } -MACTransmissionDescriptor *macGetTransmissionDescriptor(void) { +/** + * @brief Startsthe I/O activity and enters a low power mode. + */ +void macStart(void) { + + mac_lld_start(); +} + +/** + * @brief Stops the I/O activity. + */ +void macStop(void) { + + max_lld_stop(); + chSemReset(&tdsem, MAC_TRANSMIT_DESCRIPTORS); +} + +/** + * @brief Allocates a transmission descriptor. + * @details One of the available transmission descriptors is locked and + * returned. If a descriptor is not currently available then the + * invoking thread is queued until one is freed. + * + * @param[in] time the number of ticks before the operation timeouts, + * the following special values are allowed: + * - @a TIME_IMMEDIATE immediate timeout. + * - @a TIME_INFINITE no timeout. + * . + * @return A pointer to a @p MACTransmitDescriptor structure or @p NULL if + * the operation timed out or the driver went in stop mode. + */ +MACTransmitDescriptor *macGetTransmitDescriptor(systime_t time) { + MACTransmitDescriptor *tdp; + + chSysLock(); + if (chSemWaitTimeoutS(&tdsem, time) == RDY_OK) + tdp = max_lld_get_transmit_descriptor(); + else + tdp = NULL; + + chSysUnlock(); + return tdp; } -void macReleaseTransmissionDescriptor(MACTransmissionDescriptor *dp) { +/** + * @brief Releases a transmit descriptor and starts the transmission of the + * enqueued data as a single frame. + * + * @param[in] tdp the pointer to the @p MACTransmitDescriptor structure + */ +void macReleaseTransmitDescriptor(MACTransmitDescriptor *tdp) { + + chSysLock(); + + mac_lld_release_transmit_descriptor(tdp); + chSysUnlock(); } -void macSetTransmitSequentialData(MACTransmissionDescriptor *dp, - uint8_t *buf, - size_t size) { +/** + * @brief Enqueues data to a @p MACTransmitDescriptor. + * + * @param[in] tdp the pointer to the @p MACTransmitDescriptor structure + * @param buf pointer to the data buffer + * @param size size of the data to be enqueued + */ +void macAddTransmitData(MACTransmitDescriptor *tdp, + uint8_t *buf, + size_t size) { + mac_lld_add_transmit_data(tdp, buf, size); } /** @} */ diff --git a/os/io/mac.h b/os/io/mac.h index 0a6f0e000..129c700d4 100644 --- a/os/io/mac.h +++ b/os/io/mac.h @@ -18,7 +18,7 @@ */ /** - * @file serial.h + * @file mac.h * @brief MAC Driver macros and structures. * @addtogroup MAC * @{ @@ -27,10 +27,20 @@ #ifndef _MAC_H_ #define _MAC_H_ +#include "mac_lld.h" + #ifdef __cplusplus extern "C" { #endif void macInit(void); + void macSetAddress(uint8_t *p); + void macStart(void); + void macStop(void); + MACTransmissionDescriptor *macGetTransmitDescriptor(systime_t time); + void macReleaseTransmitDescriptor(MACTransmitDescriptor *tdp); + void macAddTransmitData(MACTransmitDescriptor *tdp, + uint8_t *buf, + size_t size); #ifdef __cplusplus } #endif diff --git a/os/io/templates/mac_lld.c b/os/io/templates/mac_lld.c new file mode 100644 index 000000000..b8e4e1614 --- /dev/null +++ b/os/io/templates/mac_lld.c @@ -0,0 +1,101 @@ +/* + 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 templates/mac_lld.c + * @brief MAC Driver subsystem low level driver source template + * @addtogroup MAC_LLD + * @{ + */ + +#include +#include + +/** + * @brief Low level MAC initialization. + */ +void mac_lld_init(void) { + +} + +/** + * @brief Low level MAC address setup. + * + * @param[in] p pointer to a six bytes buffer containing the MAC address. If + * this parameter is set to @p NULL then a system default MAC is + * used. + * + * @note This function should be invoked after the @p macInit() and before + * @p macStart() else the result is unspecified (performed or ignored). + */ +void mac_lld_set_address(uint8_t *p) { + +} + +/** + * @brief Starts the I/O activity and enters a low power mode. + */ +void mac_lld_start(void) { + +} + +/** + * @brief Stops the I/O activity. + */ +void mac_lld_stop(void) { + +} + +/** + * @brief Allocates a transmission descriptor. + * @details One of the available transmission descriptors is locked and + * returned. + * + * @return A pointer to a @p MACTransmitDescriptor structure or @p NULL if + * a descriptor is not available or the driver went in stop mode. + */ +MACTransmitDescriptor *max_lld_get_transmit_descriptor(void) { + + return NULL; +} + +/** + * @brief Releases a transmit descriptor and starts the transmission of the + * enqueued data as a single frame. + * + * @param[in] tdp the pointer to the @p MACTransmitDescriptor structure + */ +void mac_lld_release_transmit_descriptor(MACTransmitDescriptor *tdp) { + +} + +/** + * @brief Enqueues data to a @p MACTransmitDescriptor. + * + * @param[in] tdp the pointer to the @p MACTransmitDescriptor structure + * @param buf pointer to the data buffer + * @param size size of the data to be enqueued + */ +void mac_lld_add_transmit_data(MACTransmitDescriptor *tdp, + uint8_t *buf, + size_t size) { + +} + +/** @} */ diff --git a/os/io/templates/mac_lld.h b/os/io/templates/mac_lld.h new file mode 100644 index 000000000..f2eda28bd --- /dev/null +++ b/os/io/templates/mac_lld.h @@ -0,0 +1,71 @@ +/* + 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 templates/mac_lld.h + * @brief MAC Driver subsystem low level driver header template + * @addtogroup MAC_LLD + * @{ + */ + +#ifndef _MAC_LLD_H_ +#define _MAC_LLD_H_ + +/*===========================================================================*/ +/* Driver pre-compile time settings. */ +/*===========================================================================*/ + +/** + * @brief Number of available descriptors/buffers. + */ +#ifndef MAC_TRANSMIT_DESCRIPTORS !! defined(__DOXYGEN__) +#define MAC_TRANSMIT_DESCRIPTORS 2 +#endif + +/*===========================================================================*/ +/* Driver data structures and types. */ +/*===========================================================================*/ + +typedef struct MACTransmitDescriptor { + +}; + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +#ifdef __cplusplus +extern "C" { +#endif + void mac_lld_init(void); + void mac_lld_set_address(uint8_t *p); + void mac_lld_start(void); + void mac_lld_stop(void); + MACTransmitDescriptor *max_lld_get_transmit_descriptor(void); + void mac_lld_release_transmit_descriptor(MACTransmitDescriptor *tdp); + void mac_lld_add_transmit_data(MACTransmitDescriptor *tdp, + uint8_t *buf, + size_t size); +#ifdef __cplusplus +} +#endif + +#endif /* _MAC_LLD_H_ */ + +/** @} */ -- cgit v1.2.3