diff options
Diffstat (limited to 'LUFA/Drivers/Peripheral')
-rw-r--r-- | LUFA/Drivers/Peripheral/ADC.h | 29 | ||||
-rw-r--r-- | LUFA/Drivers/Peripheral/AVR8/ADC.h (renamed from LUFA/Drivers/Peripheral/AVRU4U6U7/ADC.h) | 19 | ||||
-rw-r--r-- | LUFA/Drivers/Peripheral/AVR8/SPI.h | 239 | ||||
-rw-r--r-- | LUFA/Drivers/Peripheral/AVR8/Serial.c (renamed from LUFA/Drivers/Peripheral/Serial.c) | 1 | ||||
-rw-r--r-- | LUFA/Drivers/Peripheral/AVR8/Serial.h | 251 | ||||
-rw-r--r-- | LUFA/Drivers/Peripheral/AVR8/TWI.c (renamed from LUFA/Drivers/Peripheral/TWI.c) | 1 | ||||
-rw-r--r-- | LUFA/Drivers/Peripheral/AVR8/TWI.h (renamed from LUFA/Drivers/Peripheral/AVRU4U6U7/TWI.h) | 25 | ||||
-rw-r--r-- | LUFA/Drivers/Peripheral/SPI.h | 197 | ||||
-rw-r--r-- | LUFA/Drivers/Peripheral/Serial.h | 216 | ||||
-rw-r--r-- | LUFA/Drivers/Peripheral/TWI.h | 34 |
10 files changed, 592 insertions, 420 deletions
diff --git a/LUFA/Drivers/Peripheral/ADC.h b/LUFA/Drivers/Peripheral/ADC.h index ec58e52da..29e32a83c 100644 --- a/LUFA/Drivers/Peripheral/ADC.h +++ b/LUFA/Drivers/Peripheral/ADC.h @@ -31,22 +31,23 @@ /** \file * \brief Master include file for the ADC peripheral driver. * - * This file is the master dispatch header file for the device-specific ADC driver, for AVRs containing an ADC. + * This file is the master dispatch header file for the device-specific ADC driver, for microcontrollers + * containing an ADC. * * User code should include this file, which will in turn include the correct ADC driver header file for the - * currently selected AVR model. + * currently selected architecture and microcontroller model. */ /** \ingroup Group_PeripheralDrivers - * @defgroup Group_ADC ADC Driver - LUFA/Drivers/Peripheral/ADC.h + * \defgroup Group_ADC ADC Driver - LUFA/Drivers/Peripheral/ADC.h * * \section Sec_Dependencies Module Source Dependencies * The following files must be built with any user project that uses this module: * - None * * \section Sec_ModDescription Module Description - * Hardware ADC driver. This module provides an easy to use driver for the hardware - * ADC present on many AVR models, for the conversion of analogue signals into the + * Hardware ADC driver. This module provides an easy to use driver for the hardware ADC + * present on many microcontrollers, for the conversion of analogue signals into the * digital domain. * * \note The exact API for this driver may vary depending on the target used - see @@ -57,18 +58,18 @@ #define __ADC_H__ /* Macros: */ - #if !defined(__DOXYGEN__) - #define __INCLUDE_FROM_ADC_H - #endif + #if !defined(__DOXYGEN__) + #define __INCLUDE_FROM_ADC_H + #endif + + /* Includes: */ + #include "../../Common/Common.h" /* Includes: */ - #if (defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || \ - defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB647__) || \ - defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || \ - defined(__AVR_ATmega32U6__)) - #include "AVRU4U6U7/ADC.h" + #if (ARCH == ARCH_AVR8) + #include "AVR8/ADC.h" #else - #error "ADC is not available for the currently selected AVR model." + #error The ADC peripheral driver is not currently available for your selected architecture. #endif #endif diff --git a/LUFA/Drivers/Peripheral/AVRU4U6U7/ADC.h b/LUFA/Drivers/Peripheral/AVR8/ADC.h index ddeb53aa3..99f70d14b 100644 --- a/LUFA/Drivers/Peripheral/AVRU4U6U7/ADC.h +++ b/LUFA/Drivers/Peripheral/AVR8/ADC.h @@ -29,7 +29,7 @@ */ /** \file - * \brief ADC peripheral driver for the U7, U6 and U4 USB AVRs. + * \brief ADC Peripheral Driver (AVR8) * * On-chip Analogue-to-Digital converter (ADC) driver for supported U4, U6 and U7 model AVRs that contain an ADC * peripheral internally. @@ -39,8 +39,9 @@ */ /** \ingroup Group_ADC - * @defgroup Group_ADC_AVRU4U6U7 Series U4, U6 and U7 Model ADC Driver + * \defgroup Group_ADC_AVR8 ADC Peripheral Driver (AVR8) * + * \section Sec_ModDescription Module Description * On-chip Analogue-to-Digital converter (ADC) driver for supported U4, U6 and U7 model AVRs that contain an ADC * peripheral internally. * @@ -71,15 +72,12 @@ * @{ */ -#ifndef __ADC_AVRU4U6U7_H__ -#define __ADC_AVRU4U6U7_H__ +#ifndef __ADC_AVR8_H__ +#define __ADC_AVR8_H__ /* Includes: */ #include "../../../Common/Common.h" - #include <avr/io.h> - #include <stdbool.h> - /* Enable C linkage for C++ Compilers: */ #if defined(__cplusplus) extern "C" { @@ -90,6 +88,13 @@ #error Do not include this file directly. Include LUFA/Drivers/Peripheral/ADC.h instead. #endif + #if !(defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || \ + defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB647__) || \ + defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || \ + defined(__AVR_ATmega32U6__)) + #error The ADC peripheral driver is not currently available for your selected microcontroller model. + #endif + /* Private Interface - For use in library only: */ #if !defined(__DOXYGEN__) /* Macros: */ diff --git a/LUFA/Drivers/Peripheral/AVR8/SPI.h b/LUFA/Drivers/Peripheral/AVR8/SPI.h new file mode 100644 index 000000000..d800fca1a --- /dev/null +++ b/LUFA/Drivers/Peripheral/AVR8/SPI.h @@ -0,0 +1,239 @@ +/* + 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 SPI Peripheral Driver (AVR8) + * + * On-chip SPI driver for the 8-bit AVR microcontrollers. + * + * \note This file should not be included directly. It is automatically included as needed by the SPI driver + * dispatch header located in LUFA/Drivers/Peripheral/SPI.h. + */ + +/** \ingroup Group_SPI + * \defgroup Group_SPI_AVR8 SPI Peripheral Driver (AVR8) + * + * \section Sec_ModDescription Module Description + * Driver for the hardware SPI port available on most 8-bit AVR microcontroller models. This + * module provides an easy to use driver for the setup and transfer of data over the + * AVR's SPI port. + * + * \note This file should not be included directly. It is automatically included as needed by the SPI driver + * dispatch header located in LUFA/Drivers/Peripheral/SPI.h. + * + * \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 SPI driver before first use + * SPI_Init(SPI_SPEED_FCPU_DIV_2 | SPI_ORDER_MSB_FIRST | SPI_SCK_LEAD_FALLING | + * SPI_SAMPLE_TRAILING | SPI_MODE_MASTER); + * + * // Send several bytes, ignoring the returned data + * SPI_SendByte(0x01); + * SPI_SendByte(0x02); + * SPI_SendByte(0x03); + * + * // Receive several bytes, sending a dummy 0x00 byte each time + * uint8_t Byte1 = SPI_ReceiveByte(); + * uint8_t Byte2 = SPI_ReceiveByte(); + * uint8_t Byte3 = SPI_ReceiveByte(); + * + * // Send a byte, and store the received byte from the same transaction + * uint8_t ResponseByte = SPI_TransferByte(0xDC); + * \endcode + * + * @{ + */ + +#ifndef __SPI_AVR8_H__ +#define __SPI_AVR8_H__ + + /* Includes: */ + #include "../../../Common/Common.h" + + /* Enable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + extern "C" { + #endif + + /* Preprocessor Checks: */ + #if !defined(__INCLUDE_FROM_SPI_H) + #error Do not include this file directly. Include LUFA/Drivers/Peripheral/SPI.h instead. + #endif + + /* Private Interface - For use in library only: */ + #if !defined(__DOXYGEN__) + /* Macros: */ + #define SPI_USE_DOUBLESPEED (1 << SPE) + #endif + + /* Public Interface - May be used in end-application: */ + /* Macros: */ + /** \name SPI Prescaler Configuration Masks */ + //@{ + /** SPI prescaler mask for \c SPI_Init(). Divides the system clock by a factor of 2. */ + #define SPI_SPEED_FCPU_DIV_2 SPI_USE_DOUBLESPEED + + /** SPI prescaler mask for \c SPI_Init(). Divides the system clock by a factor of 4. */ + #define SPI_SPEED_FCPU_DIV_4 0 + + /** SPI prescaler mask for \c SPI_Init(). Divides the system clock by a factor of 8. */ + #define SPI_SPEED_FCPU_DIV_8 (SPI_USE_DOUBLESPEED | (1 << SPR0)) + + /** SPI prescaler mask for \c SPI_Init(). Divides the system clock by a factor of 16. */ + #define SPI_SPEED_FCPU_DIV_16 (1 << SPR0) + + /** SPI prescaler mask for \c SPI_Init(). Divides the system clock by a factor of 32. */ + #define SPI_SPEED_FCPU_DIV_32 (SPI_USE_DOUBLESPEED | (1 << SPR1)) + + /** SPI prescaler mask for \c SPI_Init(). Divides the system clock by a factor of 64. */ + #define SPI_SPEED_FCPU_DIV_64 (SPI_USE_DOUBLESPEED | (1 << SPR1) | (1 << SPR0)) + + /** SPI prescaler mask for \c SPI_Init(). Divides the system clock by a factor of 128. */ + #define SPI_SPEED_FCPU_DIV_128 ((1 << SPR1) | (1 << SPR0)) + //@} + + /** \name SPI SCK Polarity Configuration Masks */ + //@{ + /** SPI clock polarity mask for \c SPI_Init(). Indicates that the SCK should lead on the rising edge. */ + #define SPI_SCK_LEAD_RISING (0 << CPOL) + + /** SPI clock polarity mask for \c SPI_Init(). Indicates that the SCK should lead on the falling edge. */ + #define SPI_SCK_LEAD_FALLING (1 << CPOL) + //@} + + /** \name SPI Sample Edge Configuration Masks */ + //@{ + /** SPI data sample mode mask for \c SPI_Init(). Indicates that the data should sampled on the leading edge. */ + #define SPI_SAMPLE_LEADING (0 << CPHA) + + /** SPI data sample mode mask for \c SPI_Init(). Indicates that the data should be sampled on the trailing edge. */ + #define SPI_SAMPLE_TRAILING (1 << CPHA) + //@} + + /** \name SPI Data Ordering Configuration Masks */ + //@{ + /** SPI data order mask for \c SPI_Init(). Indicates that data should be shifted out MSB first. */ + #define SPI_ORDER_MSB_FIRST (0 << DORD) + + /** SPI data order mask for \c SPI_Init(). Indicates that data should be shifted out MSB first. */ + #define SPI_ORDER_LSB_FIRST (1 << DORD) + //@} + + /** \name SPI Mode Configuration Masks */ + //@{ + /** SPI mode mask for \c SPI_Init(). Indicates that the SPI interface should be initialized into slave mode. */ + #define SPI_MODE_SLAVE (0 << MSTR) + + /** SPI mode mask for \c SPI_Init(). Indicates that the SPI interface should be initialized into master mode. */ + #define SPI_MODE_MASTER (1 << MSTR) + //@} + + /* Inline Functions: */ + /** Initialises the SPI subsystem, ready for transfers. Must be called before calling any other + * SPI routines. + * + * \param[in] SPIOptions SPI Options, a mask consisting of one of each of the \c SPI_SPEED_*, + * \c SPI_SCK_*, \c SPI_SAMPLE_*, \c SPI_ORDER_* and \c SPI_MODE_* masks. + */ + static inline void SPI_Init(const uint8_t SPIOptions) + { + DDRB |= ((1 << 1) | (1 << 2)); + DDRB &= ~((1 << 0) | (1 << 3)); + PORTB |= ((1 << 0) | (1 << 3)); + + SPCR = ((1 << SPE) | SPIOptions); + + if (SPIOptions & SPI_USE_DOUBLESPEED) + SPSR |= (1 << SPI2X); + else + SPSR &= ~(1 << SPI2X); + } + + /** Turns off the SPI driver, disabling and returning used hardware to their default configuration. */ + static inline void SPI_Disable(void) + { + DDRB &= ~((1 << 1) | (1 << 2)); + PORTB &= ~((1 << 0) | (1 << 3)); + + SPCR = 0; + SPSR = 0; + } + + /** Sends and receives a byte through the SPI interface, blocking until the transfer is complete. + * + * \param[in] Byte Byte to send through the SPI interface. + * + * \return Response byte from the attached SPI device. + */ + static inline uint8_t SPI_TransferByte(const uint8_t Byte) ATTR_ALWAYS_INLINE; + static inline uint8_t SPI_TransferByte(const uint8_t Byte) + { + SPDR = Byte; + while (!(SPSR & (1 << SPIF))); + return SPDR; + } + + /** Sends a byte through the SPI interface, blocking until the transfer is complete. The response + * byte sent to from the attached SPI device is ignored. + * + * \param[in] Byte Byte to send through the SPI interface. + */ + static inline void SPI_SendByte(const uint8_t Byte) ATTR_ALWAYS_INLINE; + static inline void SPI_SendByte(const uint8_t Byte) + { + SPDR = Byte; + while (!(SPSR & (1 << SPIF))); + } + + /** Sends a dummy byte through the SPI interface, blocking until the transfer is complete. The response + * byte from the attached SPI device is returned. + * + * \return The response byte from the attached SPI device. + */ + static inline uint8_t SPI_ReceiveByte(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; + static inline uint8_t SPI_ReceiveByte(void) + { + SPDR = 0x00; + while (!(SPSR & (1 << SPIF))); + return SPDR; + } + + /* Disable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + } + #endif + +#endif + +/** @} */ + diff --git a/LUFA/Drivers/Peripheral/Serial.c b/LUFA/Drivers/Peripheral/AVR8/Serial.c index 99af2000c..3a8312d85 100644 --- a/LUFA/Drivers/Peripheral/Serial.c +++ b/LUFA/Drivers/Peripheral/AVR8/Serial.c @@ -28,6 +28,7 @@ this software. */ +#define __INCLUDE_FROM_SERIAL_C #include "Serial.h" FILE USARTSerialStream; diff --git a/LUFA/Drivers/Peripheral/AVR8/Serial.h b/LUFA/Drivers/Peripheral/AVR8/Serial.h new file mode 100644 index 000000000..bb9ba856e --- /dev/null +++ b/LUFA/Drivers/Peripheral/AVR8/Serial.h @@ -0,0 +1,251 @@ +/* + 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 Serial USART Peripheral Driver (AVR8) + * + * On-chip serial USART driver for the 8-bit AVR microcontrollers. + * + * \note This file should not be included directly. It is automatically included as needed by the USART driver + * dispatch header located in LUFA/Drivers/Peripheral/Serial.h. + */ + +/** \ingroup Group_Serial + * \defgroup Group_Serial_AVR8 Serial USART Peripheral Driver (AVR8) + * + * \section Sec_ModDescription Module Description + * On-chip serial USART driver for the 8-bit AVR microcontrollers. + * + * \note This file should not be included directly. It is automatically included as needed by the ADC driver + * dispatch header located in LUFA/Drivers/Peripheral/Serial.h. + * + * \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 USART driver before first use, with 9600 baud (and no double-speed mode) + * Serial_Init(9600, false); + * + * // Send a string through the USART + * Serial_TxString("Test String\r\n"); + * + * // Receive a byte through the USART + * uint8_t DataByte = Serial_RxByte(); + * \endcode + * + * @{ + */ + +#ifndef __SERIAL_AVR8_H__ +#define __SERIAL_AVR8_H__ + + /* Includes: */ + #include "../../../Common/Common.h" + #include "../../Misc/TerminalCodes.h" + + #include <stdio.h> + + /* Enable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + extern "C" { + #endif + + /* Preprocessor Checks: */ + #if !defined(__INCLUDE_FROM_SERIAL_H) && !defined(__INCLUDE_FROM_SERIAL_C) + #error Do not include this file directly. Include LUFA/Drivers/Peripheral/Serial.h instead. + #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 + * not set. + */ + #define SERIAL_UBBRVAL(baud) ((((F_CPU / 16) + (baud / 2)) / (baud)) - 1) + + /** Macro for calculating the baud value from a given baud rate when the U2X (double speed) bit is + * set. + */ + #define SERIAL_2X_UBBRVAL(baud) ((((F_CPU / 8) + (baud / 2)) / (baud)) - 1) + + /* Function Prototypes: */ + /** Transmits a given string located in program space (FLASH) through the USART. + * + * \param[in] FlashStringPtr Pointer to a string located in program space. + */ + 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_SendString(const char* StringPtr) ATTR_NON_NULL_PTR_ARG(1); + + /** Transmits a given buffer located in SRAM memory through the USART. + * + * \param[in] Buffer Pointer to a buffer containing the data to send. + * \param[in] Length Length of the data to send, in bytes. + */ + void Serial_SendData(const uint8_t* Buffer, uint16_t Length) 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. + * + * \param[in] BaudRate Serial baud rate, in bits per second. + * \param[in] DoubleSpeed Enables double speed mode when set, halving the sample time to double the baud rate. + */ + static inline void Serial_Init(const uint32_t BaudRate, + const bool DoubleSpeed) + { + UBRR1 = (DoubleSpeed ? SERIAL_2X_UBBRVAL(BaudRate) : SERIAL_UBBRVAL(BaudRate)); + + UCSR1C = ((1 << UCSZ11) | (1 << UCSZ10)); + UCSR1A = (DoubleSpeed ? (1 << U2X1) : 0); + UCSR1B = ((1 << TXEN1) | (1 << RXEN1)); + + DDRD |= (1 << 3); + PORTD |= (1 << 2); + } + + /** Turns off the USART driver, disabling and returning used hardware to their default configuration. */ + static inline void Serial_Disable(void) + { + UCSR1B = 0; + UCSR1A = 0; + UCSR1C = 0; + + UBRR1 = 0; + + DDRD &= ~(1 << 3); + 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. + */ + static inline bool Serial_IsCharReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline bool Serial_IsCharReceived(void) + { + return ((UCSR1A & (1 << RXC1)) ? true : false); + } + + /** Transmits a given byte through the USART. + * + * \param[in] DataByte Byte to transmit through the USART. + */ + 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 the next byte from the USART. + * + * \return Next byte received from the USART, or a negative value if no byte has been received. + */ + static inline int16_t Serial_ReceiveByte(void) ATTR_ALWAYS_INLINE; + static inline int16_t Serial_ReceiveByte(void) + { + if (!(Serial_IsCharReceived())) + return -1; + + return UDR1; + } + + /* Disable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + } + #endif + +#endif + +/** @} */ + diff --git a/LUFA/Drivers/Peripheral/TWI.c b/LUFA/Drivers/Peripheral/AVR8/TWI.c index 2f4e4ed42..b5f258dd3 100644 --- a/LUFA/Drivers/Peripheral/TWI.c +++ b/LUFA/Drivers/Peripheral/AVR8/TWI.c @@ -5,6 +5,7 @@ www.lufa-lib.org */ +#define __INCLUDE_FROM_TWI_C #include "TWI.h" uint8_t TWI_StartTransmission(const uint8_t SlaveAddress, diff --git a/LUFA/Drivers/Peripheral/AVRU4U6U7/TWI.h b/LUFA/Drivers/Peripheral/AVR8/TWI.h index c8293f5ac..e03423385 100644 --- a/LUFA/Drivers/Peripheral/AVRU4U6U7/TWI.h +++ b/LUFA/Drivers/Peripheral/AVR8/TWI.h @@ -29,18 +29,19 @@ */ /** \file - * \brief TWI peripheral driver for the U7, U6 and U4 USB AVRs. + * \brief TWI Peripheral Driver (AVR8) * - * Master mode TWI driver for the AT90USB1287, AT90USB1286, AT90USB647, AT90USB646, ATMEGA16U4 and ATMEGA32U4 AVRs. + * On-chip TWI driver for the 8-bit AVR microcontrollers. * * \note This file should not be included directly. It is automatically included as needed by the TWI driver * dispatch header located in LUFA/Drivers/Peripheral/TWI.h. */ /** \ingroup Group_TWI - * @defgroup Group_TWI_AVRU4U6U7 Series U4, U6 and U7 Model TWI Driver + * \defgroup Group_TWI_AVR8 TWI Peripheral Driver (AVR8) * - * Master mode TWI driver for the AT90USB1287, AT90USB1286, AT90USB647, AT90USB646, ATMEGA16U4 and ATMEGA32U4 AVRs. + * \section Sec_ModDescription Module Description + * Master mode TWI driver for the 8-bit AVR microcontrollers which contain a hardware TWI module. * * \note This file should not be included directly. It is automatically included as needed by the TWI driver * dispatch header located in LUFA/Drivers/Peripheral/TWI.h. @@ -111,17 +112,14 @@ * @{ */ -#ifndef __TWI_AVRU4U6U7_H__ -#define __TWI_AVRU4U6U7_H__ +#ifndef __TWI_AVR8_H__ +#define __TWI_AVR8_H__ /* Includes: */ #include "../../../Common/Common.h" - #include <avr/io.h> - #include <stdbool.h> #include <stdio.h> #include <util/twi.h> - #include <util/delay.h> /* Enable C linkage for C++ Compilers: */ #if defined(__cplusplus) @@ -129,10 +127,17 @@ #endif /* Preprocessor Checks: */ - #if !defined(__INCLUDE_FROM_TWI_H) + #if !defined(__INCLUDE_FROM_TWI_H) && !defined(__INCLUDE_FROM_TWI_C) #error Do not include this file directly. Include LUFA/Drivers/Peripheral/TWI.h instead. #endif + #if !(defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || \ + defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB647__) || \ + defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || \ + defined(__AVR_ATmega32U6__)) + #error The TWI peripheral driver is not currently available for your selected microcontroller model. + #endif + /* Public Interface - May be used in end-application: */ /* Macros: */ /** TWI slave device address mask for a read session. Mask with a slave device base address to obtain diff --git a/LUFA/Drivers/Peripheral/SPI.h b/LUFA/Drivers/Peripheral/SPI.h index 0b8b17e1d..9b967e0cd 100644 --- a/LUFA/Drivers/Peripheral/SPI.h +++ b/LUFA/Drivers/Peripheral/SPI.h @@ -31,201 +31,44 @@ /** \file * \brief Master include file for the SPI peripheral driver. * - * Hardware SPI subsystem driver for the supported USB AVRs models. + * This file is the master dispatch header file for the device-specific SPI driver, for microcontrollers + * containing a hardware SPI. + * + * User code should include this file, which will in turn include the correct SPI driver header file for the + * currently selected architecture and microcontroller model. */ /** \ingroup Group_PeripheralDrivers - * @defgroup Group_SPI SPI Driver - LUFA/Drivers/Peripheral/SPI.h + * \defgroup Group_SPI SPI Driver - LUFA/Drivers/Peripheral/SPI.h * * \section Sec_Dependencies Module Source Dependencies * The following files must be built with any user project that uses this module: * - None * * \section Sec_ModDescription Module Description - * Driver for the hardware SPI port available on most AVR models. This module provides - * an easy to use driver for the setup of and transfer of data over the AVR's SPI port. - * - * \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 SPI driver before first use - * SPI_Init(SPI_SPEED_FCPU_DIV_2 | SPI_ORDER_MSB_FIRST | SPI_SCK_LEAD_FALLING | - * SPI_SAMPLE_TRAILING | SPI_MODE_MASTER); - * - * // Send several bytes, ignoring the returned data - * SPI_SendByte(0x01); - * SPI_SendByte(0x02); - * SPI_SendByte(0x03); + * Hardware SPI driver. This module provides an easy to use driver for the setup and transfer of data over + * the selected architecture and microcontroller model's SPI port. * - * // Receive several bytes, sending a dummy 0x00 byte each time - * uint8_t Byte1 = SPI_ReceiveByte(); - * uint8_t Byte2 = SPI_ReceiveByte(); - * uint8_t Byte3 = SPI_ReceiveByte(); - * - * // Send a byte, and store the received byte from the same transaction - * uint8_t ResponseByte = SPI_TransferByte(0xDC); - * \endcode - * - * @{ + * \note The exact API for this driver may vary depending on the target used - see + * individual target module documentation for the API specific to your target processor. */ #ifndef __SPI_H__ #define __SPI_H__ - /* Includes: */ - #include <stdbool.h> - - /* Enable C linkage for C++ Compilers: */ - #if defined(__cplusplus) - extern "C" { + /* Macros: */ + #if !defined(__DOXYGEN__) + #define __INCLUDE_FROM_SPI_H #endif - /* Private Interface - For use in library only: */ - #if !defined(__DOXYGEN__) - /* Macros: */ - #define SPI_USE_DOUBLESPEED (1 << SPE) - #endif - - /* Public Interface - May be used in end-application: */ - /* Macros: */ - /** \name SPI Prescaler Configuration Masks */ - //@{ - /** SPI prescaler mask for \c SPI_Init(). Divides the system clock by a factor of 2. */ - #define SPI_SPEED_FCPU_DIV_2 SPI_USE_DOUBLESPEED - - /** SPI prescaler mask for \c SPI_Init(). Divides the system clock by a factor of 4. */ - #define SPI_SPEED_FCPU_DIV_4 0 - - /** SPI prescaler mask for \c SPI_Init(). Divides the system clock by a factor of 8. */ - #define SPI_SPEED_FCPU_DIV_8 (SPI_USE_DOUBLESPEED | (1 << SPR0)) - - /** SPI prescaler mask for \c SPI_Init(). Divides the system clock by a factor of 16. */ - #define SPI_SPEED_FCPU_DIV_16 (1 << SPR0) - - /** SPI prescaler mask for \c SPI_Init(). Divides the system clock by a factor of 32. */ - #define SPI_SPEED_FCPU_DIV_32 (SPI_USE_DOUBLESPEED | (1 << SPR1)) - - /** SPI prescaler mask for \c SPI_Init(). Divides the system clock by a factor of 64. */ - #define SPI_SPEED_FCPU_DIV_64 (SPI_USE_DOUBLESPEED | (1 << SPR1) | (1 << SPR0)) - - /** SPI prescaler mask for \c SPI_Init(). Divides the system clock by a factor of 128. */ - #define SPI_SPEED_FCPU_DIV_128 ((1 << SPR1) | (1 << SPR0)) - //@} - - /** \name SPI SCK Polarity Configuration Masks */ - //@{ - /** SPI clock polarity mask for \c SPI_Init(). Indicates that the SCK should lead on the rising edge. */ - #define SPI_SCK_LEAD_RISING (0 << CPOL) - - /** SPI clock polarity mask for \c SPI_Init(). Indicates that the SCK should lead on the falling edge. */ - #define SPI_SCK_LEAD_FALLING (1 << CPOL) - //@} - - /** \name SPI Sample Edge Configuration Masks */ - //@{ - /** SPI data sample mode mask for \c SPI_Init(). Indicates that the data should sampled on the leading edge. */ - #define SPI_SAMPLE_LEADING (0 << CPHA) - - /** SPI data sample mode mask for \c SPI_Init(). Indicates that the data should be sampled on the trailing edge. */ - #define SPI_SAMPLE_TRAILING (1 << CPHA) - //@} - - /** \name SPI Data Ordering Configuration Masks */ - //@{ - /** SPI data order mask for \c SPI_Init(). Indicates that data should be shifted out MSB first. */ - #define SPI_ORDER_MSB_FIRST (0 << DORD) - - /** SPI data order mask for \c SPI_Init(). Indicates that data should be shifted out MSB first. */ - #define SPI_ORDER_LSB_FIRST (1 << DORD) - //@} - - /** \name SPI Mode Configuration Masks */ - //@{ - /** SPI mode mask for \c SPI_Init(). Indicates that the SPI interface should be initialized into slave mode. */ - #define SPI_MODE_SLAVE (0 << MSTR) - - /** SPI mode mask for \c SPI_Init(). Indicates that the SPI interface should be initialized into master mode. */ - #define SPI_MODE_MASTER (1 << MSTR) - //@} - - /* Inline Functions: */ - /** Initialises the SPI subsystem, ready for transfers. Must be called before calling any other - * SPI routines. - * - * \param[in] SPIOptions SPI Options, a mask consisting of one of each of the \c SPI_SPEED_*, - * \c SPI_SCK_*, \c SPI_SAMPLE_*, \c SPI_ORDER_* and \c SPI_MODE_* masks. - */ - static inline void SPI_Init(const uint8_t SPIOptions) - { - DDRB |= ((1 << 1) | (1 << 2)); - DDRB &= ~((1 << 0) | (1 << 3)); - PORTB |= ((1 << 0) | (1 << 3)); - - SPCR = ((1 << SPE) | SPIOptions); - - if (SPIOptions & SPI_USE_DOUBLESPEED) - SPSR |= (1 << SPI2X); - else - SPSR &= ~(1 << SPI2X); - } - - /** Turns off the SPI driver, disabling and returning used hardware to their default configuration. */ - static inline void SPI_Disable(void) - { - DDRB &= ~((1 << 1) | (1 << 2)); - PORTB &= ~((1 << 0) | (1 << 3)); - - SPCR = 0; - SPSR = 0; - } - - /** Sends and receives a byte through the SPI interface, blocking until the transfer is complete. - * - * \param[in] Byte Byte to send through the SPI interface. - * - * \return Response byte from the attached SPI device. - */ - static inline uint8_t SPI_TransferByte(const uint8_t Byte) ATTR_ALWAYS_INLINE; - static inline uint8_t SPI_TransferByte(const uint8_t Byte) - { - SPDR = Byte; - while (!(SPSR & (1 << SPIF))); - return SPDR; - } - - /** Sends a byte through the SPI interface, blocking until the transfer is complete. The response - * byte sent to from the attached SPI device is ignored. - * - * \param[in] Byte Byte to send through the SPI interface. - */ - static inline void SPI_SendByte(const uint8_t Byte) ATTR_ALWAYS_INLINE; - static inline void SPI_SendByte(const uint8_t Byte) - { - SPDR = Byte; - while (!(SPSR & (1 << SPIF))); - } - - /** Sends a dummy byte through the SPI interface, blocking until the transfer is complete. The response - * byte from the attached SPI device is returned. - * - * \return The response byte from the attached SPI device. - */ - static inline uint8_t SPI_ReceiveByte(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; - static inline uint8_t SPI_ReceiveByte(void) - { - SPDR = 0x00; - while (!(SPSR & (1 << SPIF))); - return SPDR; - } + /* Includes: */ + #include "../../Common/Common.h" - /* Disable C linkage for C++ Compilers: */ - #if defined(__cplusplus) - } + /* Includes: */ + #if (ARCH == ARCH_AVR8) + #include "AVR8/SPI.h" + #else + #error The SPI peripheral driver is not currently available for your selected architecture. #endif #endif - -/** @} */ - diff --git a/LUFA/Drivers/Peripheral/Serial.h b/LUFA/Drivers/Peripheral/Serial.h index e7c2fa065..0c6cd86bf 100644 --- a/LUFA/Drivers/Peripheral/Serial.h +++ b/LUFA/Drivers/Peripheral/Serial.h @@ -31,218 +31,44 @@ /** \file * \brief Master include file for the USART peripheral driver. * - * Driver for the USART subsystem on supported USB AVRs. + * This file is the master dispatch header file for the device-specific USART driver, for microcontrollers + * containing a hardware USART. + * + * User code should include this file, which will in turn include the correct ADC driver header file for the + * currently selected architecture and microcontroller model. */ /** \ingroup Group_PeripheralDrivers - * @defgroup Group_Serial Serial USART Driver - LUFA/Drivers/Peripheral/Serial.h + * \defgroup Group_Serial Serial USART Driver - LUFA/Drivers/Peripheral/Serial.h * * \section Sec_Dependencies Module Source Dependencies * The following files must be built with any user project that uses this module: - * - LUFA/Drivers/Peripheral/Serial.c <i>(Makefile source module name: LUFA_SRC_SERIAL)</i> + * - LUFA/Drivers/Peripheral/$(ARCH)/Serial.c <i>(Makefile source module name: LUFA_SRC_SERIAL)</i> * * \section Sec_ModDescription Module Description - * Hardware serial USART driver. This module provides an easy to use driver for - * the setup of and transfer of data over the AVR's USART port. - * - * \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 USART driver before first use, with 9600 baud (and no double-speed mode) - * Serial_Init(9600, false); - * - * // Send a string through the USART - * Serial_TxString("Test String\r\n"); + * Hardware serial USART driver. This module provides an easy to use driver for the setup and transfer + * of data over the selected architecture and microcontroller model's USART port. * - * // Receive a byte through the USART - * uint8_t DataByte = Serial_RxByte(); - * \endcode - * - * @{ + * \note The exact API for this driver may vary depending on the target used - see + * individual target module documentation for the API specific to your target processor. */ #ifndef __SERIAL_H__ #define __SERIAL_H__ - /* Includes: */ - #include <avr/io.h> - #include <avr/pgmspace.h> - #include <stdbool.h> - #include <stdio.h> - - #include "../../Common/Common.h" - #include "../Misc/TerminalCodes.h" - - /* Enable C linkage for C++ Compilers: */ - #if defined(__cplusplus) - extern "C" { + /* Macros: */ + #if !defined(__DOXYGEN__) + #define __INCLUDE_FROM_SERIAL_H #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 - * not set. - */ - #define SERIAL_UBBRVAL(baud) ((((F_CPU / 16) + (baud / 2)) / (baud)) - 1) - - /** Macro for calculating the baud value from a given baud rate when the U2X (double speed) bit is - * set. - */ - #define SERIAL_2X_UBBRVAL(baud) ((((F_CPU / 8) + (baud / 2)) / (baud)) - 1) - - /* Function Prototypes: */ - /** Transmits a given string located in program space (FLASH) through the USART. - * - * \param[in] FlashStringPtr Pointer to a string located in program space. - */ - 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_SendString(const char* StringPtr) ATTR_NON_NULL_PTR_ARG(1); - - /** Transmits a given buffer located in SRAM memory through the USART. - * - * \param[in] Buffer Pointer to a buffer containing the data to send. - * \param[in] Length Length of the data to send, in bytes. - */ - void Serial_SendData(const uint8_t* Buffer, uint16_t Length) 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. - * - * \param[in] BaudRate Serial baud rate, in bits per second. - * \param[in] DoubleSpeed Enables double speed mode when set, halving the sample time to double the baud rate. - */ - static inline void Serial_Init(const uint32_t BaudRate, - const bool DoubleSpeed) - { - UBRR1 = (DoubleSpeed ? SERIAL_2X_UBBRVAL(BaudRate) : SERIAL_UBBRVAL(BaudRate)); - - UCSR1C = ((1 << UCSZ11) | (1 << UCSZ10)); - UCSR1A = (DoubleSpeed ? (1 << U2X1) : 0); - UCSR1B = ((1 << TXEN1) | (1 << RXEN1)); - - DDRD |= (1 << 3); - PORTD |= (1 << 2); - } - - /** Turns off the USART driver, disabling and returning used hardware to their default configuration. */ - static inline void Serial_Disable(void) - { - UCSR1B = 0; - UCSR1A = 0; - UCSR1C = 0; - - UBRR1 = 0; - - DDRD &= ~(1 << 3); - 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. - */ - static inline bool Serial_IsCharReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; - static inline bool Serial_IsCharReceived(void) - { - return ((UCSR1A & (1 << RXC1)) ? true : false); - } - - /** Transmits a given byte through the USART. - * - * \param[in] DataByte Byte to transmit through the USART. - */ - 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 the next byte from the USART. - * - * \return Next byte received from the USART, or a negative value if no byte has been received. - */ - static inline int16_t Serial_ReceiveByte(void) ATTR_ALWAYS_INLINE; - static inline int16_t Serial_ReceiveByte(void) - { - if (!(Serial_IsCharReceived())) - return -1; - - return UDR1; - } + /* Includes: */ + #include "../../Common/Common.h" - /* Disable C linkage for C++ Compilers: */ - #if defined(__cplusplus) - } + /* Includes: */ + #if (ARCH == ARCH_AVR8) + #include "AVR8/Serial.h" + #else + #error The Serial peripheral driver is not currently available for your selected architecture. #endif #endif - -/** @} */ - diff --git a/LUFA/Drivers/Peripheral/TWI.h b/LUFA/Drivers/Peripheral/TWI.h index 6e68bde0e..e7eb850e3 100644 --- a/LUFA/Drivers/Peripheral/TWI.h +++ b/LUFA/Drivers/Peripheral/TWI.h @@ -31,23 +31,23 @@ /** \file * \brief Master include file for the TWI peripheral driver. * - * This file is the master dispatch header file for the device-specific ADC driver, for AVRs containing an ADC. + * This file is the master dispatch header file for the device-specific SPI driver, for microcontrollers + * containing a hardware TWI. * - * User code should include this file, which will in turn include the correct ADC driver header file for the - * currently selected AVR model. + * User code should include this file, which will in turn include the correct TWI driver header file for the + * currently selected architecture and microcontroller model. */ /** \ingroup Group_PeripheralDrivers - * @defgroup Group_TWI TWI Driver - LUFA/Drivers/Peripheral/TWI.h + * \defgroup Group_TWI TWI Driver - LUFA/Drivers/Peripheral/TWI.h * * \section Sec_Dependencies Module Source Dependencies * The following files must be built with any user project that uses this module: - * - LUFA/Drivers/Peripheral/TWI.c <i>(Makefile source module name: LUFA_SRC_TWI)</i> - * + * - LUFA/Drivers/Peripheral/$(ARCH)TWI.c <i>(Makefile source module name: LUFA_SRC_TWI)</i> * * \section Sec_ModDescription Module Description - * Master Mode Hardware TWI driver. This module provides an easy to use driver for the hardware - * TWI present on many AVR models, for the transmission and reception of data on a TWI bus. + * Hardware TWI driver. This module provides an easy to use driver for the setup and transfer of data over + * the selected architecture and microcontroller model's TWI bus port. * * \note The exact API for this driver may vary depending on the target used - see * individual target module documentation for the API specific to your target processor. @@ -57,18 +57,18 @@ #define __TWI_H__ /* Macros: */ - #if !defined(__DOXYGEN__) - #define __INCLUDE_FROM_TWI_H - #endif + #if !defined(__DOXYGEN__) + #define __INCLUDE_FROM_TWI_H + #endif + + /* Includes: */ + #include "../../Common/Common.h" /* Includes: */ - #if (defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || \ - defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB647__) || \ - defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || \ - defined(__AVR_ATmega32U6__)) - #include "AVRU4U6U7/TWI.h" + #if (ARCH == ARCH_AVR8) + #include "AVR8/TWI.h" #else - #error "TWI is not available for the currently selected AVR model." + #error The TWI peripheral driver is not currently available for your selected architecture. #endif #endif |