projects
/
pub
/
lufa.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Slightly speed up software USART in the AVRISP project - faster parity computation...
[pub/lufa.git]
/
Projects
/
AVRISP
/
Lib
/
PDITarget.c
diff --git
a/Projects/AVRISP/Lib/PDITarget.c
b/Projects/AVRISP/Lib/PDITarget.c
index
a8fe21e
..
e21942a
100644
(file)
--- a/
Projects/AVRISP/Lib/PDITarget.c
+++ b/
Projects/AVRISP/Lib/PDITarget.c
@@
-70,8
+70,10
@@
ISR(TIMER1_COMPA_vect, ISR_BLOCK)
if ((SoftUSART_BitCount == BITS_IN_FRAME) && (BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK))
\r
return;
\r
\r
if ((SoftUSART_BitCount == BITS_IN_FRAME) && (BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK))
\r
return;
\r
\r
+ /* Shift in the bit one less than the frame size in position, so that the start bit will eventually
\r
+ * be discarded leaving the data to be byte-aligned for quick access */
\r
if (BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK)
\r
if (BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK)
\r
- SoftUSART_Data |= (1 <<
BITS_IN_FRAME
);
\r
+ SoftUSART_Data |= (1 <<
(BITS_IN_FRAME - 1)
);
\r
\r
SoftUSART_Data >>= 1;
\r
SoftUSART_BitCount--;
\r
\r
SoftUSART_Data >>= 1;
\r
SoftUSART_BitCount--;
\r
@@
-82,6
+84,7
@@
ISR(TIMER1_COMPA_vect, ISR_BLOCK)
if (!IsSending)
\r
return;
\r
\r
if (!IsSending)
\r
return;
\r
\r
+ /* Set the data line to the next bit value */
\r
if (SoftUSART_Data & 0x01)
\r
BITBANG_PDIDATA_PORT |= BITBANG_PDIDATA_MASK;
\r
else
\r
if (SoftUSART_Data & 0x01)
\r
BITBANG_PDIDATA_PORT |= BITBANG_PDIDATA_MASK;
\r
else
\r
@@
-196,17
+199,20
@@
void PDITarget_SendByte(uint8_t Byte)
bool EvenParityBit = false;
\r
uint8_t ParityData = Byte;
\r
\r
bool EvenParityBit = false;
\r
uint8_t ParityData = Byte;
\r
\r
- /* Compute Even parity bit */
\r
-
for (uint8_t i = 0; i < 8; i++
)
\r
+ /* Compute Even parity
- while a bit is still set, chop off lowest bit and toggle parity
bit */
\r
+
while (ParityData
)
\r
{
\r
{
\r
- EvenParityBit ^=
ParityData & 0x01
;
\r
- ParityData
>>= 1
;
\r
+ EvenParityBit ^=
true
;
\r
+ ParityData
&= (ParityData - 1)
;
\r
}
\r
\r
}
\r
\r
+ /* Calculate the new USART frame data here while while we wait for a previous byte (if any) to finish sending */
\r
+ uint16_t NewUSARTData = ((1 << 11) | (1 << 10) | ((uint16_t)EvenParityBit << 9) | ((uint16_t)Byte << 1) | (0 << 0));
\r
+
\r
while (SoftUSART_BitCount);
\r
\r
/* Data shifted out LSB first, START DATA PARITY STOP STOP */
\r
while (SoftUSART_BitCount);
\r
\r
/* Data shifted out LSB first, START DATA PARITY STOP STOP */
\r
- SoftUSART_Data =
((uint16_t)EvenParityBit << 9) | ((uint16_t)Byte << 1) | (1 << 10) | (1 << 11)
;
\r
+ SoftUSART_Data =
NewUSARTData
;
\r
SoftUSART_BitCount = BITS_IN_FRAME;
\r
#endif
\r
}
\r
SoftUSART_BitCount = BITS_IN_FRAME;
\r
#endif
\r
}
\r
@@
-253,7
+259,7
@@
uint8_t PDITarget_ReceiveByte(void)
while (SoftUSART_BitCount);
\r
\r
/* Throw away the start, parity and stop bits to leave only the data */
\r
while (SoftUSART_BitCount);
\r
\r
/* Throw away the start, parity and stop bits to leave only the data */
\r
- return (uint8_t)
(SoftUSART_Data >> 1)
;
\r
+ return (uint8_t)
SoftUSART_Data
;
\r
#endif
\r
}
\r
\r
#endif
\r
}
\r
\r