From c24027f3b5f1ca7bceababc82ea5b897b18dbac1 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Tue, 23 Feb 2010 01:03:27 +0000 Subject: [PATCH] Fixed software PDI/TPI programming mode in the AVRISP project not correctly toggling just the clock pin. Fix broken AVR8 Serial peripheral driver. --- LUFA/Common/Common.h | 2 +- LUFA/Drivers/Peripheral/AVR32/SPI.h | 1 + LUFA/Drivers/Peripheral/AVR8/SPI.h | 1 + LUFA/Drivers/Peripheral/AVR8/Serial.h | 26 ++++++++++++++++---- LUFA/Drivers/Peripheral/AVR8/TWI.h | 2 +- LUFA/ManPages/ChangeLog.txt | 4 +-- Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c | 4 +-- 7 files changed, 29 insertions(+), 11 deletions(-) diff --git a/LUFA/Common/Common.h b/LUFA/Common/Common.h index 04480d5143..67bbb9295b 100644 --- a/LUFA/Common/Common.h +++ b/LUFA/Common/Common.h @@ -62,7 +62,7 @@ #include "Atomic.h" - #define PROGMEM + #define PROGMEM const #else #include #endif diff --git a/LUFA/Drivers/Peripheral/AVR32/SPI.h b/LUFA/Drivers/Peripheral/AVR32/SPI.h index e07eb6c76f..b7484799a1 100644 --- a/LUFA/Drivers/Peripheral/AVR32/SPI.h +++ b/LUFA/Drivers/Peripheral/AVR32/SPI.h @@ -51,6 +51,7 @@ #define __SPI_AVR32_H__ /* Includes: */ + #include #include /* Preprocessor Checks: */ diff --git a/LUFA/Drivers/Peripheral/AVR8/SPI.h b/LUFA/Drivers/Peripheral/AVR8/SPI.h index 3440cc9f10..f466162beb 100644 --- a/LUFA/Drivers/Peripheral/AVR8/SPI.h +++ b/LUFA/Drivers/Peripheral/AVR8/SPI.h @@ -51,6 +51,7 @@ #define __SPI_AVR8_H__ /* Includes: */ + #include #include /* Preprocessor Checks: */ diff --git a/LUFA/Drivers/Peripheral/AVR8/Serial.h b/LUFA/Drivers/Peripheral/AVR8/Serial.h index 282528bb0e..0421dea739 100644 --- a/LUFA/Drivers/Peripheral/AVR8/Serial.h +++ b/LUFA/Drivers/Peripheral/AVR8/Serial.h @@ -80,7 +80,7 @@ */ static inline bool Serial_IsCharReceived(void); #else - #define Serial_IsCharReceived() /* TODO */ + #define Serial_IsCharReceived() ((UCSR1A & (1 << RXC1)) ? true : false) #endif /* Inline Functions: */ @@ -92,13 +92,27 @@ */ static inline void Serial_Init(const uint32_t BaudRate, const bool DoubleSpeed) { - // TODO + UCSR1A = (DoubleSpeed ? (1 << U2X1) : 0); + UCSR1B = ((1 << TXEN1) | (1 << RXEN1)); + UCSR1C = ((1 << UCSZ11) | (1 << UCSZ10)); + + DDRD |= (1 << 3); + PORTD |= (1 << 2); + + UBRR1 = (DoubleSpeed ? SERIAL_2X_UBBRVAL(BaudRate) : SERIAL_UBBRVAL(BaudRate)); } /** Turns off the USART driver, disabling and returning used hardware to their default configuration. */ static inline void Serial_ShutDown(void) { - // TODO + UCSR1A = 0; + UCSR1B = 0; + UCSR1C = 0; + + DDRD &= ~(1 << 3); + PORTD &= ~(1 << 2); + + UBRR1 = 0; } /** Transmits a given byte through the USART. @@ -107,7 +121,8 @@ */ static inline void Serial_TxByte(const char DataByte) { - // TODO + while (!(UCSR1A & (1 << UDRE1))); + UDR1 = DataByte; } /** Receives a byte from the USART. @@ -116,7 +131,8 @@ */ static inline uint8_t Serial_RxByte(void) { - // TODO + while (!(UCSR1A & (1 << RXC1))); + return UDR1; } /* Disable C linkage for C++ Compilers: */ diff --git a/LUFA/Drivers/Peripheral/AVR8/TWI.h b/LUFA/Drivers/Peripheral/AVR8/TWI.h index 673f1b0711..d169b8230e 100644 --- a/LUFA/Drivers/Peripheral/AVR8/TWI.h +++ b/LUFA/Drivers/Peripheral/AVR8/TWI.h @@ -37,7 +37,7 @@ */ /** \ingroup Group_TWI - * @defgroup Group_TWI_AVR8 Series U4, U6 and U7 Model TWI Driver + * @defgroup Group_TWI_AVR8 8-Bit AVR TWI Driver * * Master mode TWI driver for the 8-Bit AVRs containing a hardware TWI module. * diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt index f05ace33d3..ad43258c36 100644 --- a/LUFA/ManPages/ChangeLog.txt +++ b/LUFA/ManPages/ChangeLog.txt @@ -9,7 +9,7 @@ * \section Sec_ChangeLogXXXXXX Version XXXXXX * * New: - * - (None) + * - Added support for the UC3B0256 AVR32 microcontroller * * Changed: * - AVRISP programmer project now has a more robust timeout system, allowing for a doubling of the software USART speed @@ -17,7 +17,7 @@ * - Increased the speed of both software and hardware TPI/PDI programming modes of the AVRISP project * * Fixed: - * - (None) + * - Fixed software PDI/TPI programming mode in the AVRISP project not correctly toggling just the clock pin * * \section Sec_ChangeLog100219 Version 100219 * diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c index f1bb45a294..957084c0b1 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c +++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c @@ -53,7 +53,7 @@ volatile uint16_t SoftUSART_Data; ISR(TIMER1_COMPA_vect, ISR_BLOCK) { /* Toggle CLOCK pin in a single cycle (see AVR datasheet) */ - BITBANG_PDICLOCK_PIN |= BITBANG_PDICLOCK_MASK; + BITBANG_PDICLOCK_PIN = BITBANG_PDICLOCK_MASK; /* If not sending or receiving, just exit */ if (!(SoftUSART_BitCount)) @@ -103,7 +103,7 @@ ISR(TIMER1_COMPA_vect, ISR_BLOCK) ISR(TIMER1_CAPT_vect, ISR_BLOCK) { /* Toggle CLOCK pin in a single cycle (see AVR datasheet) */ - BITBANG_TPICLOCK_PIN |= BITBANG_TPICLOCK_MASK; + BITBANG_TPICLOCK_PIN = BITBANG_TPICLOCK_MASK; /* If not sending or receiving, just exit */ if (!(SoftUSART_BitCount))