diff options
Diffstat (limited to 'LUFA/Drivers/Peripheral')
-rw-r--r-- | LUFA/Drivers/Peripheral/Serial.c | 37 | ||||
-rw-r--r-- | LUFA/Drivers/Peripheral/Serial.h | 83 | ||||
-rw-r--r-- | LUFA/Drivers/Peripheral/SerialStream.c | 54 | ||||
-rw-r--r-- | LUFA/Drivers/Peripheral/SerialStream.h | 139 |
4 files changed, 104 insertions, 209 deletions
diff --git a/LUFA/Drivers/Peripheral/Serial.c b/LUFA/Drivers/Peripheral/Serial.c index d2078c92c..d9d946e36 100644 --- a/LUFA/Drivers/Peripheral/Serial.c +++ b/LUFA/Drivers/Peripheral/Serial.c @@ -30,24 +30,53 @@ #include "Serial.h" -void Serial_TxString_P(const char* FlashStringPtr) +FILE USARTSerialStream; + +int Serial_putchar(char DataByte, + FILE *Stream) +{ + (void)Stream; + + Serial_SendByte(DataByte); + return 0; +} + +int Serial_getchar(FILE *Stream) +{ + (void)Stream; + + if (!(Serial_IsCharReceived())) + return _FDEV_EOF; + + return Serial_ReceiveByte(); +} + +int Serial_getchar_Blocking(FILE *Stream) +{ + (void)Stream; + + while (!(Serial_IsCharReceived())); + return Serial_ReceiveByte(); +} + +void Serial_SendString_P(const char* FlashStringPtr) { uint8_t CurrByte; while ((CurrByte = pgm_read_byte(FlashStringPtr)) != 0x00) { - Serial_TxByte(CurrByte); + Serial_SendByte(CurrByte); FlashStringPtr++; } } -void Serial_TxString(const char* StringPtr) +void Serial_SendString(const char* StringPtr) { uint8_t CurrByte; while ((CurrByte = *StringPtr) != 0x00) { - Serial_TxByte(CurrByte); + Serial_SendByte(CurrByte); StringPtr++; } } diff --git a/LUFA/Drivers/Peripheral/Serial.h b/LUFA/Drivers/Peripheral/Serial.h index 7b3659ca0..58c570eab 100644 --- a/LUFA/Drivers/Peripheral/Serial.h +++ b/LUFA/Drivers/Peripheral/Serial.h @@ -70,6 +70,7 @@ #include <avr/io.h> #include <avr/pgmspace.h> #include <stdbool.h> + #include <stdio.h> #include "../../Common/Common.h" #include "../Misc/TerminalCodes.h" @@ -79,6 +80,18 @@ extern "C" { #endif + /* Private Interface - For use in library only: */ + #if !defined(__DOXYGEN__) + /* External Variables: */ + extern FILE USARTSerialStream; + + /* Function Prototypes: */ + int Serial_putchar(char DataByte, + FILE *Stream); + int Serial_getchar(FILE *Stream); + int Serial_getchar_Blocking(FILE *Stream); + #endif + /* Public Interface - May be used in end-application: */ /* Macros: */ /** Macro for calculating the baud value from a given baud rate when the U2X (double speed) bit is @@ -96,14 +109,14 @@ * * \param[in] FlashStringPtr Pointer to a string located in program space. */ - void Serial_TxString_P(const char* FlashStringPtr) ATTR_NON_NULL_PTR_ARG(1); + void Serial_SendString_P(const char* FlashStringPtr) ATTR_NON_NULL_PTR_ARG(1); /** Transmits a given string located in SRAM memory through the USART. * * \param[in] StringPtr Pointer to a string located in SRAM space. */ - void Serial_TxString(const char* StringPtr) ATTR_NON_NULL_PTR_ARG(1); - + void Serial_SendString(const char* StringPtr) ATTR_NON_NULL_PTR_ARG(1); + /* Inline Functions: */ /** Initializes the USART, ready for serial data transmission and reception. This initializes the interface to * standard 8-bit, no parity, 1 stop bit settings suitable for most applications. @@ -137,6 +150,52 @@ PORTD &= ~(1 << 2); } + /** Creates a standard character stream from the USART so that it can be used with all the regular functions + * in the avr-libc \c <stdio.h> library that accept a \c FILE stream as a destination (e.g. \c fprintf). The created + * stream is bidirectional and can be used for both input and output functions. + * + * Reading data from this stream is non-blocking, i.e. in most instances, complete strings cannot be read in by a single + * fetch, as the endpoint will not be ready at some point in the transmission, aborting the transfer. However, this may + * be used when the read data is processed byte-per-bye (via \c getc()) or when the user application will implement its own + * line buffering. + * + * \param[in,out] Stream Pointer to a FILE structure where the created stream should be placed, if \c NULL stdio + * and stdin will be configured to use the USART. + * + * \pre The USART must first be configured via a call to \ref Serial_Init() before the stream is used. + */ + static inline void Serial_CreateStream(FILE* Stream) + { + if (!(Stream)) + { + Stream = &USARTSerialStream; + stdin = Stream; + stdout = Stream; + } + + *Stream = (FILE)FDEV_SETUP_STREAM(Serial_putchar, Serial_getchar, _FDEV_SETUP_RW); + } + + /** Identical to \ref Serial_CreateStream(), except that reads are blocking until the calling stream function terminates + * the transfer. + * + * \param[in,out] Stream Pointer to a FILE structure where the created stream should be placed, if \c NULL stdio + * and stdin will be configured to use the USART. + * + * \pre The USART must first be configured via a call to \ref Serial_Init() before the stream is used. + */ + static inline void Serial_CreateBlockingStream(FILE* Stream) + { + if (!(Stream)) + { + Stream = &USARTSerialStream; + stdin = Stream; + stdout = Stream; + } + + *Stream = (FILE)FDEV_SETUP_STREAM(Serial_putchar, Serial_getchar_Blocking, _FDEV_SETUP_RW); + } + /** Indicates whether a character has been received through the USART. * * \return Boolean \c true if a character has been received, \c false otherwise. @@ -151,23 +210,23 @@ * * \param[in] DataByte Byte to transmit through the USART. */ - static inline void Serial_TxByte(const char DataByte) ATTR_ALWAYS_INLINE; - static inline void Serial_TxByte(const char DataByte) + static inline void Serial_SendByte(const char DataByte) ATTR_ALWAYS_INLINE; + static inline void Serial_SendByte(const char DataByte) { while (!(UCSR1A & (1 << UDRE1))); UDR1 = DataByte; } - /** Receives a byte from the USART. This function blocks until a byte has been - * received; if non-blocking behaviour is required, test for a received character - * beforehand with \ref Serial_IsCharReceived(). + /** Receives the next byte from the USART. * - * \return Byte received from the USART. + * \return Next byte received from the USART, or a negative value if no byte has been received. */ - static inline char Serial_RxByte(void) ATTR_ALWAYS_INLINE; - static inline char Serial_RxByte(void) + static inline int16_t Serial_ReceiveByte(void) ATTR_ALWAYS_INLINE; + static inline int16_t Serial_ReceiveByte(void) { - while (!(UCSR1A & (1 << RXC1))); + if (!(Serial_IsCharReceived())) + return -1; + return UDR1; } diff --git a/LUFA/Drivers/Peripheral/SerialStream.c b/LUFA/Drivers/Peripheral/SerialStream.c deleted file mode 100644 index de800549e..000000000 --- a/LUFA/Drivers/Peripheral/SerialStream.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2011. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -#define __INCLUDE_FROM_SERIALSTREAM_C -#include "SerialStream.h" - -FILE USARTStream = FDEV_SETUP_STREAM(SerialStream_TxByte, SerialStream_RxByte, _FDEV_SETUP_RW); - -static int SerialStream_TxByte(char DataByte, - FILE *Stream) -{ - (void)Stream; - - Serial_TxByte(DataByte); - return 0; -} - -static int SerialStream_RxByte(FILE *Stream) -{ - (void)Stream; - - if (!(Serial_IsCharReceived())) - return _FDEV_EOF; - - return Serial_RxByte(); -} - diff --git a/LUFA/Drivers/Peripheral/SerialStream.h b/LUFA/Drivers/Peripheral/SerialStream.h deleted file mode 100644 index cf376e98a..000000000 --- a/LUFA/Drivers/Peripheral/SerialStream.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2011. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * \brief Standard avr-libc character stream driver for the USART. - * - * Serial stream driver for the USART subsystem on supported USB AVRs. This makes use of the functions in the - * regular USART driver (see \ref Group_Serial), but allows the avr-libc standard stream functions (\c printf, - * \c puts, etc.) to work with the - * USART. - */ - -/** \ingroup Group_PeripheralDrivers - * @defgroup Group_SerialStream Serial Stream Driver - LUFA/Drivers/Peripheral/SerialStream.h - * - * \section Sec_Dependencies Module Source Dependencies - * The following files must be built with any user project that uses this module: - * - LUFA/Drivers/Peripheral/SerialStream.c <i>(Makefile source module name: LUFA_SRC_SERIALSTREAM)</i> - * - * \section Sec_ModDescription Module Description - * Serial stream driver for the USART subsystem on supported USB AVRs. This makes use of the functions in the - * regular USART driver (see \ref Group_Serial), but allows the avr-libc standard stream functions (\c printf, - * \c puts, etc.) to work with the USART. Upon configuration, this will redirect the \c stdin standard input - * and \c stdout output streams to the USART. - * - * \section Sec_ExampleUsage Example Usage - * The following snippet is an example of how this module may be used within a typical - * application. - * - * \code - * // Initialise the Serial Stream driver before first use, with 9600 baud (and no double-speed mode) - * SerialStream_Init(9600, false); - * - * // Write a string to the USART via the implicit stdout stream - * printf("Test String using stdout\r\n"); - * - * // Write a string to the USART via the explicit USART stream - * fprintf(&USARTStream, "Test String using explicit stream handle\r\n"); - * - * // Read in an integer from the USART using the implicit stdin stream - * uint16_t TestValue; - * scanf("%d", &TestValue); - * \endcode - * - * @{ - */ - -#ifndef __SERIAL_STREAM_H__ -#define __SERIAL_STREAM_H__ - - /* Includes: */ - #include <avr/io.h> - #include <stdio.h> - - #include "Serial.h" - - /* Enable C linkage for C++ Compilers: */ - #if defined(__cplusplus) - extern "C" { - #endif - - /* Private Interface - For use in library only: */ - #if !defined(__DOXYGEN__) - /* Function Prototypes: */ - #if defined(__INCLUDE_FROM_SERIALSTREAM_C) - static int SerialStream_TxByte(char DataByte, - FILE *Stream) ATTR_NON_NULL_PTR_ARG(2); - static int SerialStream_RxByte(FILE *Stream) ATTR_NON_NULL_PTR_ARG(1); - #endif - #endif - - /* Public Interface - May be used in end-application: */ - /* External Variables: */ - /** Named stream for the USART, once \ref SerialStream_Init() has been called. This may be used with the - * file based stream functions (fprintf, fscanf, etc.) that require a handle to the stream rather than - * using the stdin and stdout named streams. - */ - extern FILE USARTStream; - - /* Inline Functions: */ - /** Initialises the serial stream (and regular USART driver) so that both the stream and regular - * USART driver functions can be used. Must be called before any stream or regular USART functions. - * - * \param[in] BaudRate Baud rate to configure the USART to. - * \param[in] DoubleSpeed Enables double speed mode when set, halving the sample time to double the baud rate. - */ - static inline void SerialStream_Init(const uint32_t BaudRate, - const bool DoubleSpeed) - { - Serial_Init(BaudRate, DoubleSpeed); - - stdout = &USARTStream; - stdin = &USARTStream; - } - - /** Turns off the serial stream (and regular USART driver), disabling and returning used hardware to - * their default configuration. - */ - static inline void SerialStream_ShutDown(void) - { - Serial_ShutDown(); - } - - /* Disable C linkage for C++ Compilers: */ - #if defined(__cplusplus) - } - #endif - -#endif - -/** @} */ - |