aboutsummaryrefslogtreecommitdiffstats
path: root/Projects/AVRISP-MKII/Lib/XPROG
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2011-05-29 12:41:14 +0000
committerDean Camera <dean@fourwalledcubicle.com>2011-05-29 12:41:14 +0000
commitea922c98d187eb74c31535afa3334ead5bd50526 (patch)
tree0add2892e10e4686e555ddf1d98c9110ebb4ba9f /Projects/AVRISP-MKII/Lib/XPROG
parentcc9b190919abbc567cd179b31afeef565efb1f17 (diff)
downloadlufa-ea922c98d187eb74c31535afa3334ead5bd50526.tar.gz
lufa-ea922c98d187eb74c31535afa3334ead5bd50526.tar.bz2
lufa-ea922c98d187eb74c31535afa3334ead5bd50526.zip
Added new incomplete AudioInputHost Host LowLevel demo.
Added missing Audio class control request definitions. Added support for the Audio class GET STATUS request so that it is correctly ACKed when sent by the host.
Diffstat (limited to 'Projects/AVRISP-MKII/Lib/XPROG')
-rw-r--r--Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.h13
-rw-r--r--Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.h13
-rw-r--r--Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c20
-rw-r--r--Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.h14
-rw-r--r--Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c181
-rw-r--r--Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h11
6 files changed, 154 insertions, 98 deletions
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.h b/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.h
index b2b37e916..089341592 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.h
+++ b/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.h
@@ -37,12 +37,17 @@
#define _TINY_NVM_
/* Includes: */
- #include <avr/io.h>
- #include <avr/interrupt.h>
- #include <stdbool.h>
-
#include <LUFA/Common/Common.h>
+ #if (ARCH == ARCH_AVR8)
+ #include <avr/io.h>
+ #include <avr/interrupt.h>
+ #elif (ARCH == ARCH_UC3)
+ #include <avr32/io.h>
+ #endif
+
+ #include <stdbool.h>
+
#include "XPROGProtocol.h"
#include "XPROGTarget.h"
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.h b/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.h
index 48fa8eb96..11f79326b 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.h
+++ b/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.h
@@ -37,12 +37,17 @@
#define _XMEGA_NVM_
/* Includes: */
- #include <avr/io.h>
- #include <avr/interrupt.h>
- #include <stdbool.h>
-
#include <LUFA/Common/Common.h>
+ #if (ARCH == ARCH_AVR8)
+ #include <avr/io.h>
+ #include <avr/interrupt.h>
+ #elif (ARCH == ARCH_UC3)
+ #include <avr32/io.h>
+ #endif
+
+ #include <stdbool.h>
+
#include "XPROGProtocol.h"
#include "XPROGTarget.h"
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c
index 72cc53636..778a7df9b 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c
+++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c
@@ -60,7 +60,7 @@ void XPROGProtocol_SetMode(void)
struct
{
uint8_t Protocol;
- } SetMode_XPROG_Params;
+ } ATTR_PACKED SetMode_XPROG_Params;
Endpoint_Read_Stream_LE(&SetMode_XPROG_Params, sizeof(SetMode_XPROG_Params), NULL);
@@ -163,10 +163,10 @@ static void XPROGProtocol_Erase(void)
{
uint8_t MemoryType;
uint32_t Address;
- } Erase_XPROG_Params;
+ } ATTR_PACKED Erase_XPROG_Params;
Endpoint_Read_Stream_LE(&Erase_XPROG_Params, sizeof(Erase_XPROG_Params), NULL);
- Erase_XPROG_Params.Address = SwapEndian_32(Erase_XPROG_Params.Address);
+ Erase_XPROG_Params.Address = be32_to_cpu(Erase_XPROG_Params.Address);
Endpoint_ClearOUT();
Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPNUM);
@@ -242,12 +242,12 @@ static void XPROGProtocol_WriteMemory(void)
uint32_t Address;
uint16_t Length;
uint8_t ProgData[256];
- } WriteMemory_XPROG_Params;
+ } ATTR_PACKED WriteMemory_XPROG_Params;
Endpoint_Read_Stream_LE(&WriteMemory_XPROG_Params, (sizeof(WriteMemory_XPROG_Params) -
sizeof(WriteMemory_XPROG_Params).ProgData), NULL);
- WriteMemory_XPROG_Params.Address = SwapEndian_32(WriteMemory_XPROG_Params.Address);
- WriteMemory_XPROG_Params.Length = SwapEndian_16(WriteMemory_XPROG_Params.Length);
+ WriteMemory_XPROG_Params.Address = be32_to_cpu(WriteMemory_XPROG_Params.Address);
+ WriteMemory_XPROG_Params.Length = be16_to_cpu(WriteMemory_XPROG_Params.Length);
Endpoint_Read_Stream_LE(&WriteMemory_XPROG_Params.ProgData, WriteMemory_XPROG_Params.Length, NULL);
// The driver will terminate transfers that are a round multiple of the endpoint bank in size with a ZLP, need
@@ -335,11 +335,11 @@ static void XPROGProtocol_ReadMemory(void)
uint8_t MemoryType;
uint32_t Address;
uint16_t Length;
- } ReadMemory_XPROG_Params;
+ } ATTR_PACKED ReadMemory_XPROG_Params;
Endpoint_Read_Stream_LE(&ReadMemory_XPROG_Params, sizeof(ReadMemory_XPROG_Params), NULL);
- ReadMemory_XPROG_Params.Address = SwapEndian_32(ReadMemory_XPROG_Params.Address);
- ReadMemory_XPROG_Params.Length = SwapEndian_16(ReadMemory_XPROG_Params.Length);
+ ReadMemory_XPROG_Params.Address = be32_to_cpu(ReadMemory_XPROG_Params.Address);
+ ReadMemory_XPROG_Params.Length = be16_to_cpu(ReadMemory_XPROG_Params.Length);
Endpoint_ClearOUT();
Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPNUM);
@@ -380,7 +380,7 @@ static void XPROGProtocol_ReadCRC(void)
struct
{
uint8_t CRCType;
- } ReadCRC_XPROG_Params;
+ } ATTR_PACKED ReadCRC_XPROG_Params;
Endpoint_Read_Stream_LE(&ReadCRC_XPROG_Params, sizeof(ReadCRC_XPROG_Params), NULL);
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.h b/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.h
index d637c79ea..9c7986e55 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.h
+++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.h
@@ -37,12 +37,18 @@
#define _XPROG_PROTOCOL_
/* Includes: */
- #include <avr/io.h>
- #include <util/delay.h>
- #include <stdio.h>
-
+ #include <LUFA/Common/Common.h>
#include <LUFA/Drivers/USB/USB.h>
+ #if (ARCH == ARCH_AVR8)
+ #include <avr/io.h>
+ #elif (ARCH == ARCH_UC3)
+ #include <avr32/io.h>
+ #endif
+
+ #include <stdbool.h>
+ #include <stdio.h>
+
#include "../V2Protocol.h"
#include "XMEGANVM.h"
#include "TINYNVM.h"
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c
index 0a2dee73b..70e49f7c6 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c
+++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c
@@ -46,18 +46,22 @@ void XPROGTarget_EnableTargetPDI(void)
{
IsSending = false;
- /* Set Tx and XCK as outputs, Rx as input */
- DDRD |= (1 << 5) | (1 << 3);
- DDRD &= ~(1 << 2);
-
- /* Set DATA line high for at least 90ns to disable /RESET functionality */
- PORTD |= (1 << 3);
- _delay_us(1);
-
- /* Set up the synchronous USART for XMEGA communications - 8 data bits, even parity, 2 stop bits */
- UBRR1 = ((F_CPU / 2 / XPROG_HARDWARE_SPEED) - 1);
- UCSR1B = (1 << TXEN1);
- UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1);
+ #if (ARCH == ARCH_AVR8)
+ /* Set Tx and XCK as outputs, Rx as input */
+ DDRD |= (1 << 5) | (1 << 3);
+ DDRD &= ~(1 << 2);
+
+ /* Set DATA line high for at least 90ns to disable /RESET functionality */
+ PORTD |= (1 << 3);
+ Delay_MS(1);
+
+ /* Set up the synchronous USART for XMEGA communications - 8 data bits, even parity, 2 stop bits */
+ UBRR1 = ((F_CPU / 2 / XPROG_HARDWARE_SPEED) - 1);
+ UCSR1B = (1 << TXEN1);
+ UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1);
+ #elif (ARCH == ARCH_UC3)
+ // TODO: FIXME
+ #endif
/* Send two IDLEs of 12 bits each to enable PDI interface (need at least 16 idle bits) */
XPROGTarget_SendIdle();
@@ -69,19 +73,23 @@ void XPROGTarget_EnableTargetTPI(void)
{
IsSending = false;
- /* Set /RESET line low for at least 400ns to enable TPI functionality */
- AUX_LINE_DDR |= AUX_LINE_MASK;
- AUX_LINE_PORT &= ~AUX_LINE_MASK;
- _delay_us(1);
+ #if (ARCH == ARCH_AVR8)
+ /* Set /RESET line low for at least 400ns to enable TPI functionality */
+ AUX_LINE_DDR |= AUX_LINE_MASK;
+ AUX_LINE_PORT &= ~AUX_LINE_MASK;
+ Delay_MS(1);
- /* Set Tx and XCK as outputs, Rx as input */
- DDRD |= (1 << 5) | (1 << 3);
- DDRD &= ~(1 << 2);
+ /* Set Tx and XCK as outputs, Rx as input */
+ DDRD |= (1 << 5) | (1 << 3);
+ DDRD &= ~(1 << 2);
- /* Set up the synchronous USART for TINY communications - 8 data bits, even parity, 2 stop bits */
- UBRR1 = ((F_CPU / 2 / XPROG_HARDWARE_SPEED) - 1);
- UCSR1B = (1 << TXEN1);
- UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1);
+ /* Set up the synchronous USART for TINY communications - 8 data bits, even parity, 2 stop bits */
+ UBRR1 = ((F_CPU / 2 / XPROG_HARDWARE_SPEED) - 1);
+ UCSR1B = (1 << TXEN1);
+ UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1);
+ #elif (ARCH == ARCH_UC3)
+ // TODO: FIXME
+ #endif
/* Send two IDLEs of 12 bits each to enable TPI interface (need at least 16 idle bits) */
XPROGTarget_SendIdle();
@@ -94,14 +102,18 @@ void XPROGTarget_DisableTargetPDI(void)
/* Switch to Rx mode to ensure that all pending transmissions are complete */
XPROGTarget_SetRxMode();
- /* Turn off receiver and transmitter of the USART, clear settings */
- UCSR1A = ((1 << TXC1) | (1 << RXC1));
- UCSR1B = 0;
- UCSR1C = 0;
-
- /* Tristate all pins */
- DDRD &= ~((1 << 5) | (1 << 3));
- PORTD &= ~((1 << 5) | (1 << 3) | (1 << 2));
+ #if (ARCH == ARCH_AVR8)
+ /* Turn off receiver and transmitter of the USART, clear settings */
+ UCSR1A = ((1 << TXC1) | (1 << RXC1));
+ UCSR1B = 0;
+ UCSR1C = 0;
+
+ /* Tristate all pins */
+ DDRD &= ~((1 << 5) | (1 << 3));
+ PORTD &= ~((1 << 5) | (1 << 3) | (1 << 2));
+ #elif (ARCH == ARCH_UC3)
+ // TODO: FIXME
+ #endif
}
/** Disables the target's TPI interface, exits programming mode and starts the target's application. */
@@ -110,18 +122,22 @@ void XPROGTarget_DisableTargetTPI(void)
/* Switch to Rx mode to ensure that all pending transmissions are complete */
XPROGTarget_SetRxMode();
- /* Turn off receiver and transmitter of the USART, clear settings */
- UCSR1A |= (1 << TXC1) | (1 << RXC1);
- UCSR1B = 0;
- UCSR1C = 0;
-
- /* Set all USART lines as inputs, tristate */
- DDRD &= ~((1 << 5) | (1 << 3));
- PORTD &= ~((1 << 5) | (1 << 3) | (1 << 2));
-
- /* Tristate target /RESET line */
- AUX_LINE_DDR &= ~AUX_LINE_MASK;
- AUX_LINE_PORT &= ~AUX_LINE_MASK;
+ #if (ARCH == ARCH_AVR8)
+ /* Turn off receiver and transmitter of the USART, clear settings */
+ UCSR1A |= (1 << TXC1) | (1 << RXC1);
+ UCSR1B = 0;
+ UCSR1C = 0;
+
+ /* Set all USART lines as inputs, tristate */
+ DDRD &= ~((1 << 5) | (1 << 3));
+ PORTD &= ~((1 << 5) | (1 << 3) | (1 << 2));
+
+ /* Tristate target /RESET line */
+ AUX_LINE_DDR &= ~AUX_LINE_MASK;
+ AUX_LINE_PORT &= ~AUX_LINE_MASK;
+ #elif (ARCH == ARCH_UC3)
+ // TODO: FIXME
+ #endif
}
/** Sends a byte via the USART.
@@ -134,10 +150,14 @@ void XPROGTarget_SendByte(const uint8_t Byte)
if (!(IsSending))
XPROGTarget_SetTxMode();
- /* Wait until there is space in the hardware Tx buffer before writing */
- while (!(UCSR1A & (1 << UDRE1)));
- UCSR1A |= (1 << TXC1);
- UDR1 = Byte;
+ #if (ARCH == ARCH_AVR8)
+ /* Wait until there is space in the hardware Tx buffer before writing */
+ while (!(UCSR1A & (1 << UDRE1)));
+ UCSR1A |= (1 << TXC1);
+ UDR1 = Byte;
+ #elif (ARCH == ARCH_UC3)
+ // TODO: FIXME
+ #endif
}
/** Receives a byte via the software USART, blocking until data is received.
@@ -150,10 +170,15 @@ uint8_t XPROGTarget_ReceiveByte(void)
if (IsSending)
XPROGTarget_SetRxMode();
- /* Wait until a byte has been received before reading */
- while (!(UCSR1A & (1 << RXC1)) && !(TimeoutExpired));
+ #if (ARCH == ARCH_AVR8)
+ /* Wait until a byte has been received before reading */
+ while (!(UCSR1A & (1 << RXC1)) && !(TimeoutExpired));
- return UDR1;
+ return UDR1;
+ #elif (ARCH == ARCH_UC3)
+ // TODO: FIXME
+ return 0;
+ #endif
}
/** Sends an IDLE via the USART to the attached target, consisting of a full frame of idle bits. */
@@ -163,40 +188,52 @@ void XPROGTarget_SendIdle(void)
if (!(IsSending))
XPROGTarget_SetTxMode();
- /* Need to do nothing for a full frame to send an IDLE */
- for (uint8_t i = 0; i < BITS_IN_USART_FRAME; i++)
- {
- /* Wait for a full cycle of the clock */
- while (PIND & (1 << 5));
- while (!(PIND & (1 << 5)));
- }
+ #if (ARCH == ARCH_AVR8)
+ /* Need to do nothing for a full frame to send an IDLE */
+ for (uint8_t i = 0; i < BITS_IN_USART_FRAME; i++)
+ {
+ /* Wait for a full cycle of the clock */
+ while (PIND & (1 << 5));
+ while (!(PIND & (1 << 5)));
+ }
+ #elif (ARCH == ARCH_UC3)
+ // TODO: FIXME
+ #endif
}
static void XPROGTarget_SetTxMode(void)
{
- /* Wait for a full cycle of the clock */
- while (PIND & (1 << 5));
- while (!(PIND & (1 << 5)));
+ #if (ARCH == ARCH_AVR8)
+ /* Wait for a full cycle of the clock */
+ while (PIND & (1 << 5));
+ while (!(PIND & (1 << 5)));
- PORTD |= (1 << 3);
- DDRD |= (1 << 3);
+ PORTD |= (1 << 3);
+ DDRD |= (1 << 3);
- UCSR1B &= ~(1 << RXEN1);
- UCSR1B |= (1 << TXEN1);
+ UCSR1B &= ~(1 << RXEN1);
+ UCSR1B |= (1 << TXEN1);
+ #elif (ARCH == ARCH_UC3)
+ // TODO: FIXME
+ #endif
IsSending = true;
}
static void XPROGTarget_SetRxMode(void)
{
- while (!(UCSR1A & (1 << TXC1)));
- UCSR1A |= (1 << TXC1);
-
- UCSR1B &= ~(1 << TXEN1);
- UCSR1B |= (1 << RXEN1);
-
- DDRD &= ~(1 << 3);
- PORTD &= ~(1 << 3);
+ #if (ARCH == ARCH_AVR8)
+ while (!(UCSR1A & (1 << TXC1)));
+ UCSR1A |= (1 << TXC1);
+
+ UCSR1B &= ~(1 << TXEN1);
+ UCSR1B |= (1 << RXEN1);
+
+ DDRD &= ~(1 << 3);
+ PORTD &= ~(1 << 3);
+ #elif (ARCH == ARCH_UC3)
+ // TODO: FIXME
+ #endif
IsSending = false;
}
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h
index ebc563933..e2194b3fe 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h
+++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h
@@ -37,12 +37,15 @@
#define _XPROG_TARGET_
/* Includes: */
- #include <avr/io.h>
- #include <avr/interrupt.h>
- #include <stdbool.h>
-
#include <LUFA/Common/Common.h>
+ #if (ARCH == ARCH_AVR8)
+ #include <avr/io.h>
+ #include <avr/interrupt.h>
+ #elif (ARCH == ARCH_UC3)
+ #include <avr32/io.h>
+ #endif
+
#include "../V2Protocol.h"
#include "XPROGProtocol.h"