166 lines
5.1 KiB
C
166 lines
5.1 KiB
C
/*
|
|
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/>.
|
|
*/
|
|
|
|
/**
|
|
* @addtogroup Serial
|
|
* @{
|
|
*/
|
|
|
|
#ifndef _SERIAL_H_
|
|
#define _SERIAL_H_
|
|
|
|
/** No pending conditions.*/
|
|
#define SD_NO_ERROR 0
|
|
/** Connection happened.*/
|
|
#define SD_CONNECTED 1
|
|
/** Disconnection happened.*/
|
|
#define SD_DISCONNECTED 2
|
|
/** Parity error happened.*/
|
|
#define SD_PARITY_ERROR 4
|
|
/** Framing error happened.*/
|
|
#define SD_FRAMING_ERROR 8
|
|
/** Overflow happened.*/
|
|
#define SD_OVERRUN_ERROR 16
|
|
/** Break detected.*/
|
|
#define SD_BREAK_DETECTED 32
|
|
|
|
/** Serial Driver condition flags type.*/
|
|
typedef uint16_t dflags_t;
|
|
|
|
#ifdef CH_USE_SERIAL_FULLDUPLEX
|
|
|
|
/**
|
|
* Full Duplex Serial Driver main structure.
|
|
*/
|
|
typedef struct {
|
|
|
|
/** Input queue. Incoming data can be read from this queue by using the
|
|
* queues APIs.*/
|
|
Queue sd_iqueue;
|
|
/** Data Available @p EventSource. This event is generated when some incoming
|
|
* data is inserted in the Input @p Queue.*/
|
|
EventSource sd_ievent;
|
|
|
|
/** Output queue. Outgoing data can be written to this Output @p Queue by
|
|
* using the queues APIs.*/
|
|
Queue sd_oqueue;
|
|
/** Data Transmitted @p EventSource. This event is generated when the
|
|
* Output @p Queue is empty.*/
|
|
EventSource sd_oevent;
|
|
|
|
/** I/O driver status flags. This field should not be read directly but
|
|
* the @p chFDDGetAndClearFlags() funtion should be used instead.*/
|
|
dflags_t sd_flags;
|
|
/** Status Change @p EventSource. This event is generated when a
|
|
* condition flag was changed.*/
|
|
EventSource sd_sevent;
|
|
} FullDuplexDriver;
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
void chFDDInit(FullDuplexDriver *sd,
|
|
uint8_t *ib, size_t isize, qnotify_t inotify,
|
|
uint8_t *ob, size_t osize, qnotify_t onotify);
|
|
void chFDDIncomingDataI(FullDuplexDriver *sd, uint8_t b);
|
|
msg_t chFDDRequestDataI(FullDuplexDriver *sd);
|
|
void chFDDAddFlagsI(FullDuplexDriver *sd, dflags_t mask);
|
|
dflags_t chFDDGetAndClearFlags(FullDuplexDriver *sd);
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
/** @see chIQRead()*/
|
|
#define chFDDRead(sd, b, n) \
|
|
chIQRead(&(sd)->sd_iqueue, b, n)
|
|
|
|
/** @see chOQWrite()*/
|
|
#define chFDDWrite(sd, b, n) \
|
|
chOQWrite(&(sd)->sd_oqueue, b, n)
|
|
|
|
/** @see chIQGet()*/
|
|
#define chFDDGet(sd) \
|
|
chIQGet(&(sd)->sd_iqueue)
|
|
|
|
/** @see chIQGetTimeout()*/
|
|
#define chFDDGetTimeout(sd, t) \
|
|
chIQGetTimeout(&(sd)->sd_iqueue, t)
|
|
|
|
/** @see chOQPut()*/
|
|
#define chFDDPut(sd, b) \
|
|
chOQPut(&(sd)->sd_oqueue, b)
|
|
|
|
#endif /* CH_USE_SERIAL_FULLDUPLEX */
|
|
|
|
#ifdef CH_USE_SERIAL_HALFDUPLEX
|
|
|
|
/**
|
|
* Full Duplex Serial Driver main structure.
|
|
*/
|
|
typedef struct {
|
|
|
|
/** Data queue. Transmit/receive @p HalfDuplexQueue.*/
|
|
HalfDuplexQueue sd_queue;
|
|
/** Data Available @p EventSource. This event is generated when some
|
|
* incoming data is inserted in the receive queue.*/
|
|
EventSource sd_ievent;
|
|
/** Data Transmitted @p EventSource. This event is generated when the
|
|
* transmission queue is empty and the driver can either transmit more
|
|
* data or enter receive mode.*/
|
|
EventSource sd_oevent;
|
|
/** I/O driver status flags. This field should not be read directly but
|
|
* the @p chHDDGetAndClearFlags() funtion should be used
|
|
* instead.*/
|
|
dflags_t sd_flags;
|
|
/** Status Change Event Source. This event is generated when a condition
|
|
* flag was changed.*/
|
|
EventSource sd_sevent;
|
|
} HalfDuplexDriver;
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
void chHDDInit(HalfDuplexDriver *sd, uint8_t *b, size_t size,
|
|
qnotify_t inotify, qnotify_t onotify);
|
|
void chHDDIncomingDataI(HalfDuplexDriver *sd, uint8_t b);
|
|
msg_t chHDDRequestDataI(HalfDuplexDriver *sd);
|
|
void chHDDAddFlagsI(HalfDuplexDriver *sd, dflags_t mask);
|
|
dflags_t chHDDGetAndClearFlags(HalfDuplexDriver *sd);
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
/** @see chHDQGetReceive()*/
|
|
#define chHDDGetReceive(sd) \
|
|
chHDQGetReceive(&(sd)->sd_queue)
|
|
|
|
/** @see chHDQGetReceiveTimeout()*/
|
|
#define chHDDGetReceiveTimeout(sd, t) \
|
|
chHDQGetReceiveTimeout(&(sd)->sd_queue, t)
|
|
|
|
/** @see chHDQPutTransmit()*/
|
|
#define chHDDPutTransmit(sd, b) \
|
|
chHDQPutTransmit(&(sd)->sd_queue, b)
|
|
|
|
#endif /* CH_USE_SERIAL_HALFDUPLEX */
|
|
|
|
#endif /* _SERIAL_H_ */
|
|
|
|
/** @} */
|