Skip to content

Commit c1e5056

Browse files
Merge pull request #360 from Daft-Freak/patch-1
Call spi_write_blocking directly for RP2040
2 parents 5bbee15 + cda80a2 commit c1e5056

File tree

1 file changed

+33
-1
lines changed

1 file changed

+33
-1
lines changed

Adafruit_SPITFT.cpp

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1021,6 +1021,21 @@ void Adafruit_SPITFT::writePixels(uint16_t *colors, uint32_t len, bool block,
10211021
swapBytes(colors, len); // big-to-little endian to restore pixel buffer
10221022
}
10231023

1024+
return;
1025+
#elif defined(ARDUINO_ARCH_RP2040)
1026+
spi_inst_t *pi_spi = hwspi._spi == &SPI ? spi0 : spi1;
1027+
1028+
if (!bigEndian) {
1029+
// switch to 16-bit writes
1030+
hw_write_masked(&spi_get_hw(pi_spi)->cr0, 15 << SPI_SSPCR0_DSS_LSB,
1031+
SPI_SSPCR0_DSS_BITS);
1032+
spi_write16_blocking(pi_spi, colors, len);
1033+
// switch back to 8-bit
1034+
hw_write_masked(&spi_get_hw(pi_spi)->cr0, 7 << SPI_SSPCR0_DSS_LSB,
1035+
SPI_SSPCR0_DSS_BITS);
1036+
} else {
1037+
spi_write_blocking(pi_spi, (uint8_t *)colors, len * 2);
1038+
}
10241039
return;
10251040
#elif defined(USE_SPI_DMA) && \
10261041
(defined(__SAMD51__) || defined(ARDUINO_SAMD_ZERO))
@@ -1326,7 +1341,13 @@ void Adafruit_SPITFT::writeColor(uint16_t color, uint32_t len) {
13261341
hwspi._spi->write(lo);
13271342
}
13281343
} while (len);
1329-
#else // !ESP8266
1344+
#elif defined(ARDUINO_ARCH_RP2040)
1345+
spi_inst_t *pi_spi = hwspi._spi == &SPI ? spi0 : spi1;
1346+
color = __builtin_bswap16(color);
1347+
1348+
while (len--)
1349+
spi_write_blocking(pi_spi, (uint8_t *)&color, 2);
1350+
#else // !ESP8266 && !ARDUINO_ARCH_RP2040
13301351
while (len--) {
13311352
#if defined(__AVR__)
13321353
AVR_WRITESPI(hi);
@@ -2079,6 +2100,9 @@ void Adafruit_SPITFT::spiWrite(uint8_t b) {
20792100
AVR_WRITESPI(b);
20802101
#elif defined(ESP8266) || defined(ESP32)
20812102
hwspi._spi->write(b);
2103+
#elif defined(ARDUINO_ARCH_RP2040)
2104+
spi_inst_t *pi_spi = hwspi._spi == &SPI ? spi0 : spi1;
2105+
spi_write_blocking(pi_spi, &b, 1);
20822106
#else
20832107
hwspi._spi->transfer(b);
20842108
#endif
@@ -2385,6 +2409,10 @@ void Adafruit_SPITFT::SPI_WRITE16(uint16_t w) {
23852409
AVR_WRITESPI(w);
23862410
#elif defined(ESP8266) || defined(ESP32)
23872411
hwspi._spi->write16(w);
2412+
#elif defined(ARDUINO_ARCH_RP2040)
2413+
spi_inst_t *pi_spi = hwspi._spi == &SPI ? spi0 : spi1;
2414+
w = __builtin_bswap16(w);
2415+
spi_write_blocking(pi_spi, (uint8_t *)&w, 2);
23882416
#else
23892417
// MSB, LSB because TFTs are generally big-endian
23902418
hwspi._spi->transfer(w >> 8);
@@ -2437,6 +2465,10 @@ void Adafruit_SPITFT::SPI_WRITE32(uint32_t l) {
24372465
AVR_WRITESPI(l);
24382466
#elif defined(ESP8266) || defined(ESP32)
24392467
hwspi._spi->write32(l);
2468+
#elif defined(ARDUINO_ARCH_RP2040)
2469+
spi_inst_t *pi_spi = hwspi._spi == &SPI ? spi0 : spi1;
2470+
l = __builtin_bswap32(l);
2471+
spi_write_blocking(pi_spi, (uint8_t *)&l, 4);
24402472
#else
24412473
hwspi._spi->transfer(l >> 24);
24422474
hwspi._spi->transfer(l >> 16);

0 commit comments

Comments
 (0)