Commit 9a5ae36a authored by Dean Camera's avatar Dean Camera
Browse files

Software PDI mode breaks unless the software USART has 100 cycles between bits.

parent 7d51e51c
...@@ -147,7 +147,7 @@ int main(void) ...@@ -147,7 +147,7 @@ int main(void)
(ReportItem->Attributes.Usage.Usage == USAGE_SCROLL_WHEEL) && (ReportItem->Attributes.Usage.Usage == USAGE_SCROLL_WHEEL) &&
(ReportItem->ItemType == REPORT_ITEM_TYPE_In)) (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) if (WheelDelta)
LEDMask = (LEDS_LED1 | LEDS_LED2 | ((WheelDelta > 0) ? LEDS_LED3 : LEDS_LED4)); LEDMask = (LEDS_LED1 | LEDS_LED2 | ((WheelDelta > 0) ? LEDS_LED3 : LEDS_LED4));
...@@ -157,7 +157,7 @@ int main(void) ...@@ -157,7 +157,7 @@ int main(void)
(ReportItem->Attributes.Usage.Usage == USAGE_Y)) && (ReportItem->Attributes.Usage.Usage == USAGE_Y)) &&
(ReportItem->ItemType == REPORT_ITEM_TYPE_In)) (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) if (ReportItem->Attributes.Usage.Usage == USAGE_X)
{ {
......
...@@ -80,15 +80,14 @@ bool Pipe_IsEndpointBound(const uint8_t EndpointAddress) ...@@ -80,15 +80,14 @@ bool Pipe_IsEndpointBound(const uint8_t EndpointAddress)
Pipe_SelectPipe(PNum); Pipe_SelectPipe(PNum);
uint8_t PipeToken = Pipe_GetPipeToken(); uint8_t PipeToken = Pipe_GetPipeToken();
bool PipeTokenCorrect = true;
if (PipeToken != PIPE_TOKEN_SETUP) 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) if (Pipe_IsConfigured() && PipeTokenCorrect && (Pipe_BoundEndpointNumber() == (EndpointAddress & PIPE_EPNUM_MASK)))
{
return true; return true;
} }
}
Pipe_SelectPipe(PrevPipeNumber); Pipe_SelectPipe(PrevPipeNumber);
return false; return false;
......
...@@ -27,8 +27,6 @@ ...@@ -27,8 +27,6 @@
* - Fixed ADC routines not correctly returning the last result when multiple channels were read * - 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 * - Fixed ADC routines failing to read the extended channels (Channels 8 to 13, Internal Temperature Sensor) on the
* U4 series USB AVR parts * 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 * \section Sec_ChangeLog100219 Version 100219
* *
......
...@@ -65,7 +65,7 @@ static void TINYNVM_SendReadNVMRegister(const uint8_t Address) ...@@ -65,7 +65,7 @@ static void TINYNVM_SendReadNVMRegister(const uint8_t Address)
*/ */
static void TINYNVM_SendWriteNVMRegister(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 */ * two bits of the 6-bit address are shifted left once */
XPROGTarget_SendByte(TPI_CMD_SOUT | ((Address & 0x30) << 1) | (Address & 0x0F)); XPROGTarget_SendByte(TPI_CMD_SOUT | ((Address & 0x30) << 1) | (Address & 0x0F));
} }
......
...@@ -176,10 +176,6 @@ static void XPROGProtocol_LeaveXPROGMode(void) ...@@ -176,10 +176,6 @@ static void XPROGProtocol_LeaveXPROGMode(void)
XPROGTarget_SendByte(PDI_CMD_STCS | PDI_RESET_REG); XPROGTarget_SendByte(PDI_CMD_STCS | PDI_RESET_REG);
XPROGTarget_SendByte(0x00); 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(); XPROGTarget_DisableTargetPDI();
} }
else else
......
...@@ -162,7 +162,7 @@ void XPROGTarget_EnableTargetPDI(void) ...@@ -162,7 +162,7 @@ void XPROGTarget_EnableTargetPDI(void)
/* Set up the synchronous USART for XMEGA communications - /* Set up the synchronous USART for XMEGA communications -
8 data bits, even parity, 2 stop bits */ 8 data bits, even parity, 2 stop bits */
UBRR1 = (F_CPU / 500000UL); UBRR1 = (F_CPU / XPROG_HARDWARE_SPEED);
UCSR1B = (1 << TXEN1); UCSR1B = (1 << TXEN1);
UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1); UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1);
#else #else
...@@ -203,7 +203,7 @@ void XPROGTarget_EnableTargetTPI(void) ...@@ -203,7 +203,7 @@ void XPROGTarget_EnableTargetTPI(void)
/* Set up the synchronous USART for TINY communications - /* Set up the synchronous USART for TINY communications -
8 data bits, even parity, 2 stop bits */ 8 data bits, even parity, 2 stop bits */
UBRR1 = (F_CPU / 500000UL); UBRR1 = (F_CPU / XPROG_HARDWARE_SPEED);
UCSR1B = (1 << TXEN1); UCSR1B = (1 << TXEN1);
UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1); UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1);
#else #else
...@@ -239,16 +239,18 @@ void XPROGTarget_DisableTargetPDI(void) ...@@ -239,16 +239,18 @@ void XPROGTarget_DisableTargetPDI(void)
/* Tristate all pins */ /* Tristate all pins */
DDRD &= ~((1 << 5) | (1 << 3)); DDRD &= ~((1 << 5) | (1 << 3));
PORTD &= ~((1 << 3) | (1 << 2)); PORTD &= ~((1 << 5) | (1 << 3) | (1 << 2));
#else #else
/* Turn off software USART management timer */ /* Turn off software USART management timer */
TCCR1B = 0; TCCR1B = 0;
/* Tristate all pins */ /* Set DATA and CLOCK lines to inputs */
BITBANG_PDIDATA_DDR &= ~BITBANG_PDIDATA_MASK; BITBANG_PDIDATA_DDR &= ~BITBANG_PDIDATA_MASK;
BITBANG_PDICLOCK_DDR &= ~BITBANG_PDICLOCK_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_PDIDATA_PORT &= ~BITBANG_PDIDATA_MASK;
BITBANG_PDICLOCK_PORT &= ~BITBANG_PDICLOCK_MASK;
#endif #endif
} }
......
...@@ -80,8 +80,11 @@ ...@@ -80,8 +80,11 @@
#define BITBANG_TPICLOCK_MASK (1 << 1) #define BITBANG_TPICLOCK_MASK (1 << 1)
#endif #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 */ /** 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 */ /** Total number of bits in a single USART frame */
#define BITS_IN_USART_FRAME 12 #define BITS_IN_USART_FRAME 12
......
...@@ -66,7 +66,7 @@ MCU = at90usb1287 ...@@ -66,7 +66,7 @@ MCU = at90usb1287
# Target board (see library "Board Types" documentation, NONE for projects not requiring # 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 # LUFA board drivers). If USER is selected, put custom board drivers in a directory called
# "Board" inside the application directory. # "Board" inside the application directory.
BOARD = XPLAIN BOARD = USBKEY
# Processor frequency. # Processor frequency.
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment