From c24027f3b5f1ca7bceababc82ea5b897b18dbac1 Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
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 04480d514..67bbb9295 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 <avr/io.h>
 		#endif
diff --git a/LUFA/Drivers/Peripheral/AVR32/SPI.h b/LUFA/Drivers/Peripheral/AVR32/SPI.h
index e07eb6c76..b7484799a 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 <avr32/io.h>
 		#include <stdbool.h>
 
 	/* Preprocessor Checks: */
diff --git a/LUFA/Drivers/Peripheral/AVR8/SPI.h b/LUFA/Drivers/Peripheral/AVR8/SPI.h
index 3440cc9f1..f466162be 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 <avr/io.h>
 		#include <stdbool.h>
 
 	/* Preprocessor Checks: */
diff --git a/LUFA/Drivers/Peripheral/AVR8/Serial.h b/LUFA/Drivers/Peripheral/AVR8/Serial.h
index 282528bb0..0421dea73 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 673f1b071..d169b8230 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 f05ace33d..ad43258c3 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -9,7 +9,7 @@
   *  \section Sec_ChangeLogXXXXXX Version XXXXXX
   *
   *  <b>New:</b>
-  *  - (None)
+  *  - Added support for the UC3B0256 AVR32 microcontroller
   *
   *  <b>Changed:</b>
   *  - 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
   *
   *  <b>Fixed:</b>
-  *  - (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 f1bb45a29..957084c0b 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))
-- 
GitLab