forked from mfulz_github/qmk_firmware
More speed and quality improvements to the software USART in the AVRISP project.
This commit is contained in:
parent
f0b4d79629
commit
021b1b567e
|
@ -48,23 +48,7 @@ void NVMTarget_SendNVMRegAddress(uint8_t Register)
|
||||||
uint32_t Address = XPROG_Param_NVMBase | Register;
|
uint32_t Address = XPROG_Param_NVMBase | Register;
|
||||||
|
|
||||||
/* Send the calculated 32-bit address to the target, LSB first */
|
/* Send the calculated 32-bit address to the target, LSB first */
|
||||||
PDITarget_SendByte(Address & 0xFF);
|
NVMTarget_SendAddress(Address);
|
||||||
PDITarget_SendByte(Address >> 8);
|
|
||||||
PDITarget_SendByte(Address >> 16);
|
|
||||||
PDITarget_SendByte(Address >> 24);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Sends the given 32-bit absolute address to the target.
|
|
||||||
*
|
|
||||||
* \param[in] AbsoluteAddress Absolute address to send to the target
|
|
||||||
*/
|
|
||||||
void NVMTarget_SendAddress(uint32_t AbsoluteAddress)
|
|
||||||
{
|
|
||||||
/* Send the given 32-bit address to the target, LSB first */
|
|
||||||
PDITarget_SendByte(AbsoluteAddress & 0xFF);
|
|
||||||
PDITarget_SendByte(AbsoluteAddress >> 8);
|
|
||||||
PDITarget_SendByte(AbsoluteAddress >> 16);
|
|
||||||
PDITarget_SendByte(AbsoluteAddress >> 24);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Waits while the target's NVM controller is busy performing an operation, exiting if the
|
/** Waits while the target's NVM controller is busy performing an operation, exiting if the
|
||||||
|
|
|
@ -105,6 +105,20 @@
|
||||||
#define NVM_CMD_ERASEWRITEEEPROMPAGE 0x35
|
#define NVM_CMD_ERASEWRITEEEPROMPAGE 0x35
|
||||||
#define NVM_CMD_READEEPROM 0x06
|
#define NVM_CMD_READEEPROM 0x06
|
||||||
|
|
||||||
|
/* Inline Functions: */
|
||||||
|
/** Sends the given 32-bit absolute address to the target.
|
||||||
|
*
|
||||||
|
* \param[in] AbsoluteAddress Absolute address to send to the target
|
||||||
|
*/
|
||||||
|
static inline void NVMTarget_SendAddress(uint32_t AbsoluteAddress)
|
||||||
|
{
|
||||||
|
/* Send the given 32-bit address to the target, LSB first */
|
||||||
|
PDITarget_SendByte(AbsoluteAddress & 0xFF);
|
||||||
|
PDITarget_SendByte(AbsoluteAddress >> 8);
|
||||||
|
PDITarget_SendByte(AbsoluteAddress >> 16);
|
||||||
|
PDITarget_SendByte(AbsoluteAddress >> 24);
|
||||||
|
}
|
||||||
|
|
||||||
/* Function Prototypes: */
|
/* Function Prototypes: */
|
||||||
void NVMTarget_SendNVMRegAddress(uint8_t Register);
|
void NVMTarget_SendNVMRegAddress(uint8_t Register);
|
||||||
void NVMTarget_SendAddress(uint32_t AbsoluteAddress);
|
void NVMTarget_SendAddress(uint32_t AbsoluteAddress);
|
||||||
|
|
|
@ -196,19 +196,18 @@ void PDITarget_SendByte(uint8_t Byte)
|
||||||
IsSending = true;
|
IsSending = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EvenParityBit = false;
|
/* Calculate the new USART frame data here while while we wait for a previous byte (if any) to finish sending */
|
||||||
uint8_t ParityData = Byte;
|
uint16_t NewUSARTData = ((1 << 11) | (1 << 10) | (0 << 9) | ((uint16_t)Byte << 1) | (0 << 0));
|
||||||
|
|
||||||
/* Compute Even parity - while a bit is still set, chop off lowest bit and toggle parity bit */
|
/* Compute Even parity - while a bit is still set, chop off lowest bit and toggle parity bit */
|
||||||
|
uint8_t ParityData = Byte;
|
||||||
while (ParityData)
|
while (ParityData)
|
||||||
{
|
{
|
||||||
EvenParityBit ^= true;
|
NewUSARTData ^= (1 << 9);
|
||||||
ParityData &= (ParityData - 1);
|
ParityData &= (ParityData - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Calculate the new USART frame data here while while we wait for a previous byte (if any) to finish sending */
|
/* Wait until transmitter is idle before writing new data */
|
||||||
uint16_t NewUSARTData = ((1 << 11) | (1 << 10) | ((uint16_t)EvenParityBit << 9) | ((uint16_t)Byte << 1) | (0 << 0));
|
|
||||||
|
|
||||||
while (SoftUSART_BitCount);
|
while (SoftUSART_BitCount);
|
||||||
|
|
||||||
/* Data shifted out LSB first, START DATA PARITY STOP STOP */
|
/* Data shifted out LSB first, START DATA PARITY STOP STOP */
|
||||||
|
@ -258,7 +257,7 @@ uint8_t PDITarget_ReceiveByte(void)
|
||||||
SoftUSART_BitCount = BITS_IN_FRAME;
|
SoftUSART_BitCount = BITS_IN_FRAME;
|
||||||
while (SoftUSART_BitCount);
|
while (SoftUSART_BitCount);
|
||||||
|
|
||||||
/* Throw away the start, parity and stop bits to leave only the data */
|
/* Throw away the parity and stop bits to leave only the data (start bit is already discarded) */
|
||||||
return (uint8_t)SoftUSART_Data;
|
return (uint8_t)SoftUSART_Data;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -280,7 +279,7 @@ void PDITarget_SendBreak(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Need to do nothing for a full frame to send a BREAK */
|
/* Need to do nothing for a full frame to send a BREAK */
|
||||||
for (uint8_t i = 0; i <= BITS_IN_FRAME; i++)
|
for (uint8_t i = 0; i < BITS_IN_FRAME; i++)
|
||||||
{
|
{
|
||||||
/* Wait for a full cycle of the clock */
|
/* Wait for a full cycle of the clock */
|
||||||
while (PIND & (1 << 5));
|
while (PIND & (1 << 5));
|
||||||
|
|
|
@ -54,17 +54,7 @@
|
||||||
|
|
||||||
/* Defines: */
|
/* Defines: */
|
||||||
#if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))
|
#if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))
|
||||||
// #define PDI_VIA_HARDWARE_USART
|
#define PDI_VIA_HARDWARE_USART
|
||||||
|
|
||||||
#define BITBANG_PDIDATA_PORT PORTD
|
|
||||||
#define BITBANG_PDIDATA_DDR DDRD
|
|
||||||
#define BITBANG_PDIDATA_PIN PIND
|
|
||||||
#define BITBANG_PDIDATA_MASK (1 << 3)
|
|
||||||
|
|
||||||
#define BITBANG_PDICLOCK_PORT PORTD
|
|
||||||
#define BITBANG_PDICLOCK_DDR DDRD
|
|
||||||
#define BITBANG_PDICLOCK_PIN PIND
|
|
||||||
#define BITBANG_PDICLOCK_MASK (1 << 5)
|
|
||||||
#else
|
#else
|
||||||
#define BITBANG_PDIDATA_PORT PORTB
|
#define BITBANG_PDIDATA_PORT PORTB
|
||||||
#define BITBANG_PDIDATA_DDR DDRB
|
#define BITBANG_PDIDATA_DDR DDRB
|
||||||
|
|
|
@ -66,7 +66,7 @@ MCU = at90usb1287
|
||||||
# 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
|
||||||
# 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