mirror of
https://github.com/esp8266/Arduino.git
synced 2025-06-13 13:01:55 +03:00
Merge pull request #1930 from WereCatf/master
Speed up writePattern() a bit more
This commit is contained in:
@ -364,36 +364,62 @@ void SPIClass::writePattern(uint8_t * data, uint8_t size, uint32_t repeat) {
|
|||||||
uint8_t *bufferPtr=(uint8_t *)&buffer;
|
uint8_t *bufferPtr=(uint8_t *)&buffer;
|
||||||
uint8_t *dataPtr = data;
|
uint8_t *dataPtr = data;
|
||||||
volatile uint32_t * fifoPtr = &SPI1W0;
|
volatile uint32_t * fifoPtr = &SPI1W0;
|
||||||
uint8_t r = 64 / size;
|
uint8_t r;
|
||||||
uint32_t repeatRem = repeat % r;
|
uint32_t repeatRem;
|
||||||
repeat = repeat / r;
|
uint8_t i;
|
||||||
|
|
||||||
while(r--){
|
if((repeat * size) <= 64){
|
||||||
dataPtr = data;
|
repeatRem = repeat * size;
|
||||||
for(uint8_t i=0; i<size; i++){
|
r = repeat;
|
||||||
*bufferPtr = *dataPtr;
|
while(r--){
|
||||||
bufferPtr++;
|
dataPtr = data;
|
||||||
dataPtr++;
|
for(i=0; i<size; i++){
|
||||||
|
*bufferPtr = *dataPtr;
|
||||||
|
bufferPtr++;
|
||||||
|
dataPtr++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
r = repeatRem;
|
||||||
|
if(r & 3) r = r / 4 + 1;
|
||||||
|
else r = r / 4;
|
||||||
|
for(i=0; i<r; i++){
|
||||||
|
*fifoPtr = buffer[i];
|
||||||
|
fifoPtr++;
|
||||||
|
}
|
||||||
|
SPI1U = SPIUMOSI | SPIUSSE;
|
||||||
|
} else {
|
||||||
|
//Orig
|
||||||
|
r = 64 / size;
|
||||||
|
repeatRem = repeat % r * size;
|
||||||
|
repeat = repeat / r;
|
||||||
|
|
||||||
|
while(r--){
|
||||||
|
dataPtr = data;
|
||||||
|
for(i=0; i<size; i++){
|
||||||
|
*bufferPtr = *dataPtr;
|
||||||
|
bufferPtr++;
|
||||||
|
dataPtr++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Fill fifo with data
|
||||||
|
for(i=0; i<16; i++){
|
||||||
|
*fifoPtr = buffer[i];
|
||||||
|
fifoPtr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = 64 / size;
|
||||||
|
|
||||||
|
SPI1U = SPIUMOSI | SPIUSSE;
|
||||||
|
setDataBits(r * size * 8);
|
||||||
|
while(repeat--){
|
||||||
|
SPI1CMD |= SPIBUSY;
|
||||||
|
while(SPI1CMD & SPIBUSY) {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//End orig
|
||||||
fifoPtr = &SPI1W0;
|
setDataBits(repeatRem * 8);
|
||||||
for(uint8_t i=0; i<16; i++){
|
|
||||||
*fifoPtr = buffer[i];
|
|
||||||
fifoPtr++;
|
|
||||||
}
|
|
||||||
|
|
||||||
r = 64 / size;
|
|
||||||
|
|
||||||
SPI1U = SPIUMOSI | SPIUSSE;
|
|
||||||
//Fill fifo with data
|
|
||||||
setDataBits(r * size * 8);
|
|
||||||
while(repeat--){
|
|
||||||
SPI1CMD |= SPIBUSY;
|
|
||||||
while(SPI1CMD & SPIBUSY) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
setDataBits(repeatRem * size * 8);
|
|
||||||
SPI1CMD |= SPIBUSY;
|
SPI1CMD |= SPIBUSY;
|
||||||
while(SPI1CMD & SPIBUSY) {}
|
while(SPI1CMD & SPIBUSY) {}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user