1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-06-15 00:02:49 +03:00

Merge pull request #1930 from WereCatf/master

Speed up writePattern() a bit more
This commit is contained in:
Ivan Grokhotkov
2016-04-18 11:03:02 +03:00

View File

@ -364,21 +364,47 @@ 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;
if((repeat * size) <= 64){
repeatRem = repeat * size;
r = repeat;
while(r--){ while(r--){
dataPtr = data; dataPtr = data;
for(uint8_t i=0; i<size; i++){ for(i=0; i<size; i++){
*bufferPtr = *dataPtr; *bufferPtr = *dataPtr;
bufferPtr++; bufferPtr++;
dataPtr++; dataPtr++;
} }
} }
fifoPtr = &SPI1W0; r = repeatRem;
for(uint8_t i=0; i<16; i++){ 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 = buffer[i];
fifoPtr++; fifoPtr++;
} }
@ -386,14 +412,14 @@ void SPIClass::writePattern(uint8_t * data, uint8_t size, uint32_t repeat) {
r = 64 / size; r = 64 / size;
SPI1U = SPIUMOSI | SPIUSSE; SPI1U = SPIUMOSI | SPIUSSE;
//Fill fifo with data
setDataBits(r * size * 8); setDataBits(r * size * 8);
while(repeat--){ while(repeat--){
SPI1CMD |= SPIBUSY; SPI1CMD |= SPIBUSY;
while(SPI1CMD & SPIBUSY) {} while(SPI1CMD & SPIBUSY) {}
} }
}
setDataBits(repeatRem * size * 8); //End orig
setDataBits(repeatRem * 8);
SPI1CMD |= SPIBUSY; SPI1CMD |= SPIBUSY;
while(SPI1CMD & SPIBUSY) {} while(SPI1CMD & SPIBUSY) {}