forked from mfulz_github/qmk_firmware
Software PDI mode breaks unless the software USART has 100 cycles between bits.
This commit is contained in:
parent
7d51e51c79
commit
9a5ae36a4f
|
@ -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)
|
||||||
(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,14 +80,13 @@ 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);
|
||||||
|
|
|
@ -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)
|
||||||
*/
|
*/
|
||||||
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));
|
||||||
}
|
}
|
||||||
|
|
|
@ -175,10 +175,6 @@ static void XPROGProtocol_LeaveXPROGMode(void)
|
||||||
/* Clear the RESET key in the RESET PDI register to allow the XMEGA to run */
|
/* 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(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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
/* 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)
|
||||||
|
|
||||||
/* 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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,7 +58,7 @@
|
||||||
/* Defines: */
|
/* Defines: */
|
||||||
#if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))
|
#if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))
|
||||||
#define XPROG_VIA_HARDWARE_USART
|
#define XPROG_VIA_HARDWARE_USART
|
||||||
#else
|
#else
|
||||||
#define BITBANG_PDIDATA_PORT PORTB
|
#define BITBANG_PDIDATA_PORT PORTB
|
||||||
#define BITBANG_PDIDATA_DDR DDRB
|
#define BITBANG_PDIDATA_DDR DDRB
|
||||||
#define BITBANG_PDIDATA_PIN PINB
|
#define BITBANG_PDIDATA_PIN PINB
|
||||||
|
@ -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
|
||||||
# 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.
|
||||||
|
|
Loading…
Reference in New Issue