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

Fix inverted bit-banged USART logic in the AVRISP project for PDI programming....

Fix inverted bit-banged USART logic in the AVRISP project for PDI programming. Add a delay to the clock toggling in the AVRISP project to ensure that the programming speed does not exceed 10MHz under any conditions to satisfy the limits in the datasheet for all target voltages. Fix incorrect pin being used as the DATA in in PDI programming mode.
parent e4cfd520
...@@ -338,7 +338,7 @@ ...@@ -338,7 +338,7 @@
*/ */
static inline void Endpoint_SetEndpointDirection(uint8_t DirectionMask); static inline void Endpoint_SetEndpointDirection(uint8_t DirectionMask);
#else #else
#if defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) || defined(__DOXYGEN__) #if defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
#define Endpoint_BytesInEndpoint() UEBCX #define Endpoint_BytesInEndpoint() UEBCX
#elif defined(USB_SERIES_4_AVR) #elif defined(USB_SERIES_4_AVR)
#define Endpoint_BytesInEndpoint() (((uint16_t)UEBCHX << 8) | UEBCLX) #define Endpoint_BytesInEndpoint() (((uint16_t)UEBCHX << 8) | UEBCLX)
......
...@@ -56,6 +56,7 @@ ...@@ -56,6 +56,7 @@
* - Fixed TeensyHID bootloader not properly shutting down the USB interface to trigger a disconnection on the host before resetting * - Fixed TeensyHID bootloader not properly shutting down the USB interface to trigger a disconnection on the host before resetting
* - Fixed MassStorageHost Class driver demo not having USB_STREAM_TIMEOUT_MS compile time option set properly to prevent slow * - Fixed MassStorageHost Class driver demo not having USB_STREAM_TIMEOUT_MS compile time option set properly to prevent slow
* devices from timing out the data pipes * devices from timing out the data pipes
* - Fixed the definition of the Endpoint_BytesInEndpoint() macro for the U4 parts
* *
* \section Sec_ChangeLog091122 Version 091122 * \section Sec_ChangeLog091122 Version 091122
* *
......
...@@ -110,9 +110,7 @@ static void PDIProtocol_EnterXPROGMode(void) ...@@ -110,9 +110,7 @@ static void PDIProtocol_EnterXPROGMode(void)
/* Must hold DATA line high for at least 90nS to enable PDI interface */ /* Must hold DATA line high for at least 90nS to enable PDI interface */
PDIDATA_LINE_PORT |= PDIDATA_LINE_MASK; PDIDATA_LINE_PORT |= PDIDATA_LINE_MASK;
asm volatile ("NOP"::); asm volatile ("NOP"::);
#if (F_CPU > 8000000)
asm volatile ("NOP"::); asm volatile ("NOP"::);
#endif
/* Toggle CLOCK line 16 times within 100uS of the original 90nS timeout to keep PDI interface enabled */ /* Toggle CLOCK line 16 times within 100uS of the original 90nS timeout to keep PDI interface enabled */
for (uint8_t i = 0; i < 16; i++) for (uint8_t i = 0; i < 16; i++)
...@@ -120,7 +118,7 @@ static void PDIProtocol_EnterXPROGMode(void) ...@@ -120,7 +118,7 @@ static void PDIProtocol_EnterXPROGMode(void)
/* Enable access to the XPROG NVM bus by sending the documented NVM access key to the device */ /* Enable access to the XPROG NVM bus by sending the documented NVM access key to the device */
PDITarget_SendByte(PDI_CMD_KEY); PDITarget_SendByte(PDI_CMD_KEY);
for (uint8_t i = 0; i < 8; i++) for (uint8_t i = 0; i < sizeof(PDI_NVMENABLE_KEY); i++)
PDITarget_SendByte(PDI_NVMENABLE_KEY[i]); PDITarget_SendByte(PDI_NVMENABLE_KEY[i]);
/* Read out the STATUS register to check that NVM access was successfully enabled */ /* Read out the STATUS register to check that NVM access was successfully enabled */
......
...@@ -52,9 +52,9 @@ void PDITarget_SendByte(uint8_t Byte) ...@@ -52,9 +52,9 @@ void PDITarget_SendByte(uint8_t Byte)
for (uint8_t i = 0; i < 8; i++) for (uint8_t i = 0; i < 8; i++)
{ {
if (Byte & 0x01) if (Byte & 0x01)
PDIDATA_LINE_PORT |= PDIDATA_LINE_MASK;
else
PDIDATA_LINE_PORT &= ~PDIDATA_LINE_MASK; PDIDATA_LINE_PORT &= ~PDIDATA_LINE_MASK;
else
PDIDATA_LINE_PORT |= PDIDATA_LINE_MASK;
Byte >>= 1; Byte >>= 1;
......
...@@ -65,7 +65,7 @@ ...@@ -65,7 +65,7 @@
#define PDIDATA_LINE_PORT PORTB #define PDIDATA_LINE_PORT PORTB
#define PDIDATA_LINE_DDR DDRB #define PDIDATA_LINE_DDR DDRB
#define PDIDATA_LINE_PIN PINB #define PDIDATA_LINE_PIN PINB
#define PDIDATA_LINE_MASK (1 << 2) #define PDIDATA_LINE_MASK (1 << 3)
#define PDICLOCK_LINE_PORT RESET_LINE_PORT #define PDICLOCK_LINE_PORT RESET_LINE_PORT
#define PDICLOCK_LINE_DDR RESET_LINE_DDR #define PDICLOCK_LINE_DDR RESET_LINE_DDR
...@@ -91,7 +91,9 @@ ...@@ -91,7 +91,9 @@
#define PDI_NVMENABLE_KEY (uint8_t[]){0x12, 0x89, 0xAB, 0x45, 0xCD, 0xD8, 0x88, 0xFF} #define PDI_NVMENABLE_KEY (uint8_t[]){0x12, 0x89, 0xAB, 0x45, 0xCD, 0xD8, 0x88, 0xFF}
#define TOGGLE_PDI_CLOCK MACROS{ PDICLOCK_LINE_PORT ^= PDICLOCK_LINE_MASK; \ #define TOGGLE_PDI_CLOCK MACROS{ PDICLOCK_LINE_PORT ^= PDICLOCK_LINE_MASK; \
PDICLOCK_LINE_PORT ^= PDICLOCK_LINE_MASK; }MACROE asm volatile ("NOP" ::); \
PDICLOCK_LINE_PORT ^= PDICLOCK_LINE_MASK; \
asm volatile ("NOP" ::); }MACROE
/* Function Prototypes: */ /* Function Prototypes: */
void PDITarget_SendByte(uint8_t Byte); void PDITarget_SendByte(uint8_t Byte);
......
...@@ -60,7 +60,7 @@ ...@@ -60,7 +60,7 @@
# MCU name # MCU name
MCU = at90usb1287 MCU = at90usb162
# Target board (see library "Board Types" documentation, USER or blank for projects not requiring # Target board (see library "Board Types" documentation, USER or blank for projects not requiring
......
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