33
33
*
34
34
*/
35
35
36
- #ifdef __AVR__
37
- #include < avr/pgmspace.h>
38
- #elif defined(ESP8266) || defined(ESP32)
39
- #include < pgmspace.h>
40
- #else
41
- #define pgm_read_byte (addr ) \
42
- (*(const unsigned char *)(addr)) // /< read bytes from program memory
43
- #endif
44
-
45
- #if !defined(__ARM_ARCH) && !defined(ENERGIA) && !defined(ESP8266) && \
46
- !defined(ESP32) && !defined(__arc__)
47
- #include < util/delay.h>
48
- #endif
49
-
50
- #include < stdlib.h>
51
-
52
36
#include " Adafruit_EPD.h"
53
- #include " Adafruit_GFX.h"
54
- #include < SPI.h>
37
+ #include < stdlib.h>
55
38
56
39
bool Adafruit_EPD::_isInTransaction = false ;
57
40
@@ -77,15 +60,19 @@ Adafruit_EPD::Adafruit_EPD(int width, int height, int8_t spi_mosi,
77
60
_cs_pin = CS;
78
61
_reset_pin = RST;
79
62
_dc_pin = DC;
80
- _sclk_pin = spi_clock;
81
- _sid_pin = spi_mosi;
82
63
_busy_pin = BUSY;
83
64
if (SRCS >= 0 ) {
84
65
use_sram = true ;
85
66
} else {
86
67
use_sram = false ;
87
68
}
88
- hwSPI = false ;
69
+
70
+ spi_dev = new Adafruit_SPIDevice (CS, spi_clock, spi_miso, spi_mosi,
71
+ 4000000 , // frequency
72
+ SPI_BITORDER_MSBFIRST, // bit order
73
+ SPI_MODE0 // data mode
74
+ );
75
+
89
76
singleByteTxns = false ;
90
77
buffer1_size = buffer2_size = 0 ;
91
78
buffer1_addr = buffer2_addr = 0 ;
@@ -120,7 +107,13 @@ Adafruit_EPD::Adafruit_EPD(int width, int height, int8_t DC, int8_t RST,
120
107
} else {
121
108
use_sram = false ;
122
109
}
123
- hwSPI = true ;
110
+
111
+ spi_dev = new Adafruit_SPIDevice (CS,
112
+ 4000000 , // frequency
113
+ SPI_BITORDER_MSBFIRST, // bit order
114
+ SPI_MODE0, // data mode
115
+ _spi);
116
+
124
117
singleByteTxns = false ;
125
118
buffer1_size = buffer2_size = 0 ;
126
119
buffer1_addr = buffer2_addr = 0 ;
@@ -163,31 +156,18 @@ void Adafruit_EPD::begin(bool reset) {
163
156
// set pin directions
164
157
pinMode (_dc_pin, OUTPUT);
165
158
pinMode (_cs_pin, OUTPUT);
166
- #ifdef HAVE_PORTREG
167
- csport = portOutputRegister (digitalPinToPort (_cs_pin));
168
- cspinmask = digitalPinToBitMask (_cs_pin);
169
- dcport = portOutputRegister (digitalPinToPort (_dc_pin));
170
- dcpinmask = digitalPinToBitMask (_dc_pin);
159
+
160
+ #if defined(BUSIO_USE_FAST_PINIO)
161
+ csPort = (BusIO_PortReg *)portOutputRegister (digitalPinToPort (_cs_pin));
162
+ csPinMask = digitalPinToBitMask (_cs_pin);
163
+ dcPort = (BusIO_PortReg *)portOutputRegister (digitalPinToPort (_dc_pin));
164
+ dcPinMask = digitalPinToBitMask (_dc_pin);
171
165
#endif
172
166
173
167
csHigh ();
174
168
175
- if (!hwSPI) {
176
- Serial.println (" softserial" );
177
- // set pins for software-SPI
178
- pinMode (_sid_pin, OUTPUT);
179
- pinMode (_sclk_pin, OUTPUT);
180
- #ifdef HAVE_PORTREG
181
- clkport = portOutputRegister (digitalPinToPort (_sclk_pin));
182
- clkpinmask = digitalPinToBitMask (_sclk_pin);
183
- mosiport = portOutputRegister (digitalPinToPort (_sid_pin));
184
- mosipinmask = digitalPinToBitMask (_sid_pin);
185
- #endif
186
- } else {
187
- _spi->begin ();
188
- #ifndef SPI_HAS_TRANSACTION
189
- _spi->setClockDivider (4 );
190
- #endif
169
+ if (!spi_dev->begin ()) {
170
+ return ;
191
171
}
192
172
193
173
Serial.println (" hard reset" );
@@ -582,35 +562,14 @@ void Adafruit_EPD::EPD_data(uint8_t data) {
582
562
uint8_t Adafruit_EPD::SPItransfer (uint8_t d) {
583
563
// Serial.print("-> 0x"); Serial.println((byte)d, HEX);
584
564
585
- if (hwSPI) {
586
- if (singleByteTxns) {
587
- uint8_t b;
588
- csLow ();
589
- b = _spi->transfer (d);
590
- csHigh ();
591
- return b;
592
- } else
593
- return _spi->transfer (d);
565
+ if (singleByteTxns) {
566
+ uint8_t b;
567
+ csLow ();
568
+ b = spi_dev->transfer (d);
569
+ csHigh ();
570
+ return b;
594
571
} else {
595
- // TODO: return read data for software SPI
596
- for (uint8_t bit = 0x80 ; bit; bit >>= 1 ) {
597
- #ifdef HAVE_PORTREG
598
- *clkport &= ~clkpinmask;
599
- if (d & bit)
600
- *mosiport |= mosipinmask;
601
- else
602
- *mosiport &= ~mosipinmask;
603
- *clkport |= clkpinmask;
604
- #else
605
- digitalWrite (_sclk_pin, LOW);
606
- if (d & bit)
607
- digitalWrite (_sid_pin, HIGH);
608
- else
609
- digitalWrite (_sid_pin, LOW);
610
- digitalWrite (_sclk_pin, HIGH);
611
- #endif
612
- }
613
- return 0 ;
572
+ return spi_dev->transfer (d);
614
573
}
615
574
}
616
575
@@ -620,15 +579,15 @@ uint8_t Adafruit_EPD::SPItransfer(uint8_t d) {
620
579
*/
621
580
/* *************************************************************************/
622
581
void Adafruit_EPD::csHigh () {
623
- #ifdef SPI_HAS_TRANSACTION
624
- _spi->endTransaction ();
625
- _isInTransaction = false ;
626
- #endif
627
- #ifdef HAVE_PORTREG
628
- *csport |= cspinmask;
582
+
583
+ #ifdef BUSIO_USE_FAST_PINIO
584
+ *csPort |= csPinMask;
629
585
#else
630
586
digitalWrite (_cs_pin, HIGH);
631
587
#endif
588
+
589
+ spi_dev->endTransaction ();
590
+ _isInTransaction = false ;
632
591
}
633
592
634
593
/* *************************************************************************/
@@ -637,14 +596,11 @@ void Adafruit_EPD::csHigh() {
637
596
*/
638
597
/* *************************************************************************/
639
598
void Adafruit_EPD::csLow () {
640
- #ifdef SPI_HAS_TRANSACTION
641
- if (!_isInTransaction) {
642
- _spi->beginTransaction (SPISettings (4000000 , MSBFIRST, SPI_MODE0));
643
- _isInTransaction = true ;
644
- }
645
- #endif
646
- #ifdef HAVE_PORTREG
647
- *csport &= ~cspinmask;
599
+ spi_dev->beginTransaction ();
600
+ _isInTransaction = true ;
601
+
602
+ #ifdef BUSIO_USE_FAST_PINIO
603
+ *csPort &= ~csPinMask;
648
604
#else
649
605
digitalWrite (_cs_pin, LOW);
650
606
#endif
@@ -656,8 +612,8 @@ void Adafruit_EPD::csLow() {
656
612
*/
657
613
/* *************************************************************************/
658
614
void Adafruit_EPD::dcHigh () {
659
- #ifdef HAVE_PORTREG
660
- *dcport |= dcpinmask ;
615
+ #ifdef BUSIO_USE_FAST_PINIO
616
+ *dcPort |= dcPinMask ;
661
617
#else
662
618
digitalWrite (_dc_pin, HIGH);
663
619
#endif
@@ -669,8 +625,8 @@ void Adafruit_EPD::dcHigh() {
669
625
*/
670
626
/* *************************************************************************/
671
627
void Adafruit_EPD::dcLow () {
672
- #ifdef HAVE_PORTREG
673
- *dcport &= ~dcpinmask ;
628
+ #ifdef BUSIO_USE_FAST_PINIO
629
+ *dcPort &= ~dcPinMask ;
674
630
#else
675
631
digitalWrite (_dc_pin, LOW);
676
632
#endif
0 commit comments