From 9a5ae36a4f62e0cda37972401c61727c6804a985 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Wed, 17 Mar 2010 11:48:39 +0000 Subject: Software PDI mode breaks unless the software USART has 100 cycles between bits. --- .../ClassDriver/MouseHostWithParser/MouseHostWithParser.c | 4 ++-- LUFA/Drivers/USB/LowLevel/Pipe.c | 9 ++++----- LUFA/ManPages/ChangeLog.txt | 2 -- Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c | 2 +- Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c | 4 ---- Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c | 12 +++++++----- Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h | 7 +++++-- Projects/AVRISP-MKII/makefile | 2 +- 8 files changed, 20 insertions(+), 22 deletions(-) diff --git a/Demos/Host/ClassDriver/MouseHostWithParser/MouseHostWithParser.c b/Demos/Host/ClassDriver/MouseHostWithParser/MouseHostWithParser.c index b6411858a..6339a9239 100644 --- a/Demos/Host/ClassDriver/MouseHostWithParser/MouseHostWithParser.c +++ b/Demos/Host/ClassDriver/MouseHostWithParser/MouseHostWithParser.c @@ -147,7 +147,7 @@ int main(void) (ReportItem->Attributes.Usage.Usage == USAGE_SCROLL_WHEEL) && (ReportItem->ItemType == REPORT_ITEM_TYPE_In)) { - int16_t WheelDelta = (int16_t)(ReportItem->Value << (16 - ReportItem->Attributes.BitSize)); + int16_t WheelDelta = HID_ALIGN_DATA(ReportItem->Value, int16_t); if (WheelDelta) LEDMask = (LEDS_LED1 | LEDS_LED2 | ((WheelDelta > 0) ? LEDS_LED3 : LEDS_LED4)); @@ -157,7 +157,7 @@ int main(void) (ReportItem->Attributes.Usage.Usage == USAGE_Y)) && (ReportItem->ItemType == REPORT_ITEM_TYPE_In)) { - int16_t DeltaMovement = (int16_t)(ReportItem->Value << (16 - ReportItem->Attributes.BitSize)); + int16_t DeltaMovement = HID_ALIGN_DATA(ReportItem->Value, int16_t); if (ReportItem->Attributes.Usage.Usage == USAGE_X) { diff --git a/LUFA/Drivers/USB/LowLevel/Pipe.c b/LUFA/Drivers/USB/LowLevel/Pipe.c index 78c82e8c4..8784bea0c 100644 --- a/LUFA/Drivers/USB/LowLevel/Pipe.c +++ b/LUFA/Drivers/USB/LowLevel/Pipe.c @@ -80,14 +80,13 @@ bool Pipe_IsEndpointBound(const uint8_t EndpointAddress) Pipe_SelectPipe(PNum); uint8_t PipeToken = Pipe_GetPipeToken(); + bool PipeTokenCorrect = true; if (PipeToken != PIPE_TOKEN_SETUP) - PipeToken = (PipeToken == ((EndpointAddress & PIPE_EPDIR_MASK) ? PIPE_TOKEN_IN : PIPE_TOKEN_OUT)); + PipeTokenCorrect = (PipeToken == ((EndpointAddress & PIPE_EPDIR_MASK) ? PIPE_TOKEN_IN : PIPE_TOKEN_OUT)); - if (Pipe_IsConfigured() && (Pipe_BoundEndpointNumber() == (EndpointAddress & PIPE_EPNUM_MASK)) && PipeToken) - { - return true; - } + if (Pipe_IsConfigured() && PipeTokenCorrect && (Pipe_BoundEndpointNumber() == (EndpointAddress & PIPE_EPNUM_MASK))) + return true; } Pipe_SelectPipe(PrevPipeNumber); diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt index b776175d6..8ce9f2240 100644 --- a/LUFA/ManPages/ChangeLog.txt +++ b/LUFA/ManPages/ChangeLog.txt @@ -27,8 +27,6 @@ * - Fixed ADC routines not correctly returning the last result when multiple channels were read * - Fixed ADC routines failing to read the extended channels (Channels 8 to 13, Internal Temperature Sensor) on the * U4 series USB AVR parts - * - Fixed PDI programming mode in the AVRISP programmer project not exiting programming mode correctly (clear target - * Reset key twice, possible silicon bug?) * * \section Sec_ChangeLog100219 Version 100219 * diff --git a/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c b/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c index a894793c7..c0f04c6bd 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c +++ b/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c @@ -65,7 +65,7 @@ static void TINYNVM_SendReadNVMRegister(const uint8_t Address) */ static void TINYNVM_SendWriteNVMRegister(const uint8_t Address) { - /* The TPI command for writing to the I/O space uses weird addressing, where the I/O address's upper + /* The TPI command for reading from the I/O space uses strange addressing, where the I/O address's upper * two bits of the 6-bit address are shifted left once */ XPROGTarget_SendByte(TPI_CMD_SOUT | ((Address & 0x30) << 1) | (Address & 0x0F)); } diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c index 08936a202..07dce5011 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c +++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c @@ -175,10 +175,6 @@ static void XPROGProtocol_LeaveXPROGMode(void) /* Clear the RESET key in the RESET PDI register to allow the XMEGA to run */ XPROGTarget_SendByte(PDI_CMD_STCS | PDI_RESET_REG); XPROGTarget_SendByte(0x00); - - /* Clear /RESET key twice (for some reason this needs to be done twice to take effect) */ - XPROGTarget_SendByte(PDI_CMD_STCS | PDI_RESET_REG); - XPROGTarget_SendByte(0x00); XPROGTarget_DisableTargetPDI(); } diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c index 3a74e1531..15467fe84 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c +++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c @@ -162,7 +162,7 @@ void XPROGTarget_EnableTargetPDI(void) /* Set up the synchronous USART for XMEGA communications - 8 data bits, even parity, 2 stop bits */ - UBRR1 = (F_CPU / 500000UL); + UBRR1 = (F_CPU / XPROG_HARDWARE_SPEED); UCSR1B = (1 << TXEN1); UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1); #else @@ -203,7 +203,7 @@ void XPROGTarget_EnableTargetTPI(void) /* Set up the synchronous USART for TINY communications - 8 data bits, even parity, 2 stop bits */ - UBRR1 = (F_CPU / 500000UL); + UBRR1 = (F_CPU / XPROG_HARDWARE_SPEED); UCSR1B = (1 << TXEN1); UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1); #else @@ -239,16 +239,18 @@ void XPROGTarget_DisableTargetPDI(void) /* Tristate all pins */ DDRD &= ~((1 << 5) | (1 << 3)); - PORTD &= ~((1 << 3) | (1 << 2)); + PORTD &= ~((1 << 5) | (1 << 3) | (1 << 2)); #else /* Turn off software USART management timer */ TCCR1B = 0; - /* Tristate all pins */ + /* Set DATA and CLOCK lines to inputs */ BITBANG_PDIDATA_DDR &= ~BITBANG_PDIDATA_MASK; BITBANG_PDICLOCK_DDR &= ~BITBANG_PDICLOCK_MASK; - BITBANG_PDICLOCK_PORT &= ~BITBANG_PDICLOCK_MASK; + + /* Tristate DATA and CLOCK lines */ BITBANG_PDIDATA_PORT &= ~BITBANG_PDIDATA_MASK; + BITBANG_PDICLOCK_PORT &= ~BITBANG_PDICLOCK_MASK; #endif } diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h index 0c54ad4cf..7166c1023 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h +++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h @@ -58,7 +58,7 @@ /* Defines: */ #if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1)) #define XPROG_VIA_HARDWARE_USART - #else + #else #define BITBANG_PDIDATA_PORT PORTB #define BITBANG_PDIDATA_DDR DDRB #define BITBANG_PDIDATA_PIN PINB @@ -80,8 +80,11 @@ #define BITBANG_TPICLOCK_MASK (1 << 1) #endif + /** Serial carrier TPI/PDI speed when hardware TPI/PDI mode is used */ + #define XPROG_HARDWARE_SPEED 500000 + /** Number of cycles between each clock when software USART mode is used */ - #define BITS_BETWEEN_USART_CLOCKS 80 + #define BITS_BETWEEN_USART_CLOCKS 100 /** Total number of bits in a single USART frame */ #define BITS_IN_USART_FRAME 12 diff --git a/Projects/AVRISP-MKII/makefile b/Projects/AVRISP-MKII/makefile index b2c139cec..b0b26c24c 100644 --- a/Projects/AVRISP-MKII/makefile +++ b/Projects/AVRISP-MKII/makefile @@ -66,7 +66,7 @@ MCU = at90usb1287 # Target board (see library "Board Types" documentation, NONE for projects not requiring # LUFA board drivers). If USER is selected, put custom board drivers in a directory called # "Board" inside the application directory. -BOARD = XPLAIN +BOARD = USBKEY # Processor frequency. -- cgit v1.2.3