aboutsummaryrefslogtreecommitdiffstats
path: root/LUFA/Drivers/Peripheral
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2011-02-19 18:37:22 +0000
committerDean Camera <dean@fourwalledcubicle.com>2011-02-19 18:37:22 +0000
commit3d4d8e7f628f9dc9981242f69b097333faa9940d (patch)
treecb05a02ad225b632d2d345da362687c9d199061a /LUFA/Drivers/Peripheral
parent100a197d0efa177b9f514cbf5292a6a333b03de9 (diff)
downloadlufa-3d4d8e7f628f9dc9981242f69b097333faa9940d.tar.gz
lufa-3d4d8e7f628f9dc9981242f69b097333faa9940d.tar.bz2
lufa-3d4d8e7f628f9dc9981242f69b097333faa9940d.zip
Add new ARCH option to the makefiles to (eventually) specify the target device architecture. Update non-usb peripheral drivers to reflect future multiple architecture support.
Diffstat (limited to 'LUFA/Drivers/Peripheral')
-rw-r--r--LUFA/Drivers/Peripheral/ADC.h29
-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.h239
-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.h251
-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.h197
-rw-r--r--LUFA/Drivers/Peripheral/Serial.h216
-rw-r--r--LUFA/Drivers/Peripheral/TWI.h34
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