git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@1177 35acf78f-673a-0410-8e92-d51de3d6d3f4

This commit is contained in:
gdisirio 2009-09-24 16:18:37 +00:00
parent 326cac91c2
commit 1a62b44848
4 changed files with 258 additions and 7 deletions

View File

@ -27,11 +27,17 @@
#include <ch.h> #include <ch.h>
#include <mac.h> #include <mac.h>
/**
* @brief Transmit descriptors counter semaphore.
*/
static Semaphore tdsem;
/** /**
* @brief MAC Driver initialization. * @brief MAC Driver initialization.
*/ */
void macInit(void) { void macInit(void) {
chSemInit(&tdsem, MAC_TRANSMIT_DESCRIPTORS);
mac_lld_init(); mac_lld_init();
} }
@ -40,25 +46,88 @@ void macInit(void) {
* *
* @param[in] p pointer to a six bytes buffer containing the MAC address. If * @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 * 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) { void macSetAddress(uint8_t *p) {
mac_lld_set_address(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();
} }
void macReleaseTransmissionDescriptor(MACTransmissionDescriptor *dp) { /**
* @brief Stops the I/O activity.
*/
void macStop(void) {
max_lld_stop();
chSemReset(&tdsem, MAC_TRANSMIT_DESCRIPTORS);
} }
void macSetTransmitSequentialData(MACTransmissionDescriptor *dp, /**
uint8_t *buf, * @brief Allocates a transmission descriptor.
size_t size) { * @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;
}
/**
* @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();
}
/**
* @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);
} }
/** @} */ /** @} */

View File

@ -18,7 +18,7 @@
*/ */
/** /**
* @file serial.h * @file mac.h
* @brief MAC Driver macros and structures. * @brief MAC Driver macros and structures.
* @addtogroup MAC * @addtogroup MAC
* @{ * @{
@ -27,10 +27,20 @@
#ifndef _MAC_H_ #ifndef _MAC_H_
#define _MAC_H_ #define _MAC_H_
#include "mac_lld.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
void macInit(void); 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 #ifdef __cplusplus
} }
#endif #endif

101
os/io/templates/mac_lld.c Normal file
View File

@ -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 <http://www.gnu.org/licenses/>.
*/
/**
* @file templates/mac_lld.c
* @brief MAC Driver subsystem low level driver source template
* @addtogroup MAC_LLD
* @{
*/
#include <ch.h>
#include <mac_lld.h>
/**
* @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) {
}
/** @} */

71
os/io/templates/mac_lld.h Normal file
View File

@ -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 <http://www.gnu.org/licenses/>.
*/
/**
* @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_ */
/** @} */