Skip to content

Commit 713493d

Browse files
authored
Merge pull request #26 from adafruit/busio
Busio
2 parents 69038bd + 80a0127 commit 713493d

File tree

2 files changed

+60
-134
lines changed

2 files changed

+60
-134
lines changed

Adafruit_EPD.cpp

Lines changed: 45 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -33,25 +33,8 @@
3333
*
3434
*/
3535

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-
5236
#include "Adafruit_EPD.h"
53-
#include "Adafruit_GFX.h"
54-
#include <SPI.h>
37+
#include <stdlib.h>
5538

5639
bool Adafruit_EPD::_isInTransaction = false;
5740

@@ -77,15 +60,19 @@ Adafruit_EPD::Adafruit_EPD(int width, int height, int8_t spi_mosi,
7760
_cs_pin = CS;
7861
_reset_pin = RST;
7962
_dc_pin = DC;
80-
_sclk_pin = spi_clock;
81-
_sid_pin = spi_mosi;
8263
_busy_pin = BUSY;
8364
if (SRCS >= 0) {
8465
use_sram = true;
8566
} else {
8667
use_sram = false;
8768
}
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+
8976
singleByteTxns = false;
9077
buffer1_size = buffer2_size = 0;
9178
buffer1_addr = buffer2_addr = 0;
@@ -120,7 +107,13 @@ Adafruit_EPD::Adafruit_EPD(int width, int height, int8_t DC, int8_t RST,
120107
} else {
121108
use_sram = false;
122109
}
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+
124117
singleByteTxns = false;
125118
buffer1_size = buffer2_size = 0;
126119
buffer1_addr = buffer2_addr = 0;
@@ -163,31 +156,18 @@ void Adafruit_EPD::begin(bool reset) {
163156
// set pin directions
164157
pinMode(_dc_pin, OUTPUT);
165158
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);
171165
#endif
172166

173167
csHigh();
174168

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;
191171
}
192172

193173
Serial.println("hard reset");
@@ -582,35 +562,14 @@ void Adafruit_EPD::EPD_data(uint8_t data) {
582562
uint8_t Adafruit_EPD::SPItransfer(uint8_t d) {
583563
// Serial.print("-> 0x"); Serial.println((byte)d, HEX);
584564

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;
594571
} 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);
614573
}
615574
}
616575

@@ -620,15 +579,15 @@ uint8_t Adafruit_EPD::SPItransfer(uint8_t d) {
620579
*/
621580
/**************************************************************************/
622581
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;
629585
#else
630586
digitalWrite(_cs_pin, HIGH);
631587
#endif
588+
589+
spi_dev->endTransaction();
590+
_isInTransaction = false;
632591
}
633592

634593
/**************************************************************************/
@@ -637,14 +596,11 @@ void Adafruit_EPD::csHigh() {
637596
*/
638597
/**************************************************************************/
639598
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;
648604
#else
649605
digitalWrite(_cs_pin, LOW);
650606
#endif
@@ -656,8 +612,8 @@ void Adafruit_EPD::csLow() {
656612
*/
657613
/**************************************************************************/
658614
void Adafruit_EPD::dcHigh() {
659-
#ifdef HAVE_PORTREG
660-
*dcport |= dcpinmask;
615+
#ifdef BUSIO_USE_FAST_PINIO
616+
*dcPort |= dcPinMask;
661617
#else
662618
digitalWrite(_dc_pin, HIGH);
663619
#endif
@@ -669,8 +625,8 @@ void Adafruit_EPD::dcHigh() {
669625
*/
670626
/**************************************************************************/
671627
void Adafruit_EPD::dcLow() {
672-
#ifdef HAVE_PORTREG
673-
*dcport &= ~dcpinmask;
628+
#ifdef BUSIO_USE_FAST_PINIO
629+
*dcPort &= ~dcPinMask;
674630
#else
675631
digitalWrite(_dc_pin, LOW);
676632
#endif

Adafruit_EPD.h

Lines changed: 15 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -20,40 +20,13 @@
2020
#ifndef _Adafruit_EPD_H_
2121
#define _Adafruit_EPD_H_
2222

23-
#if ARDUINO >= 100
24-
#include "Arduino.h"
25-
#else
26-
#include "WProgram.h"
27-
#endif
28-
2923
//#define EPD_DEBUG
3024

3125
#define RAMBUFSIZE 64 ///< size of the ram buffer
3226

33-
#if defined(__SAM3X8E__)
34-
typedef volatile RwReg PortReg; ///< a port register for fast access
35-
typedef uint32_t PortMask; ///< a port register mask for your pin
36-
#define HAVE_PORTREG
37-
#elif defined(ARDUINO_ARCH_SAMD)
38-
// not supported
39-
#elif defined(ESP8266) || defined(ESP32) || defined(ARDUINO_STM32_FEATHER) || \
40-
defined(__arc__)
41-
typedef volatile uint32_t PortReg; ///< a port register for fast access
42-
typedef uint32_t PortMask; ///< a port register mask for your pin
43-
#elif defined(__AVR__)
44-
typedef volatile uint8_t PortReg; ///< a port register for fast access
45-
typedef uint8_t PortMask; ///< a port register mask for your pin
46-
#define HAVE_PORTREG
47-
#else
48-
// chances are its 32 bit so assume that
49-
typedef volatile uint32_t PortReg; ///< a port register for fast access
50-
typedef uint32_t PortMask; ///< a port register mask for your pin
51-
#endif
52-
5327
#include "Adafruit_MCPSRAM.h"
54-
5528
#include <Adafruit_GFX.h>
56-
#include <SPI.h>
29+
#include <Adafruit_SPIDevice.h>
5730

5831
/**************************************************************************/
5932
/*!
@@ -142,14 +115,15 @@ class Adafruit_EPD : public Adafruit_GFX {
142115
virtual void powerDown(void) = 0;
143116
void hardwareReset(void);
144117

145-
int8_t _sid_pin, ///< sid pin
146-
_sclk_pin, ///< serial clock pin
147-
_dc_pin, ///< data/command pin
148-
_reset_pin, ///< reset pin
149-
_cs_pin, ///< chip select pin
150-
_busy_pin; ///< busy pin
151-
SPIClass *_spi = NULL; ///< SPI object
152-
static bool _isInTransaction; ///< true if SPI bus is in trasnfer state
118+
int8_t _sid_pin, ///< sid pin
119+
_sclk_pin, ///< serial clock pin
120+
_dc_pin, ///< data/command pin
121+
_reset_pin, ///< reset pin
122+
_cs_pin, ///< chip select pin
123+
_busy_pin; ///< busy pin
124+
SPIClass *_spi = NULL; ///< SPI object
125+
Adafruit_SPIDevice *spi_dev = NULL; ///< SPI object
126+
static bool _isInTransaction; ///< true if SPI bus is in trasnfer state
153127
bool singleByteTxns; ///< if true CS will go high after every data byte
154128
///< transferred
155129
Adafruit_MCPSRAM sram; ///< the ram chip object if using off-chip ram
@@ -179,16 +153,12 @@ class Adafruit_EPD : public Adafruit_GFX {
179153

180154
bool use_sram; ///< true if we are using an SRAM chip as a framebuffer
181155
bool hwSPI; ///< true if using hardware SPI
182-
#ifdef HAVE_PORTREG
183-
PortReg *mosiport, ///< mosi port register
184-
*clkport, ///< serial clock port register
185-
*csport, ///< chip select port register
186-
*dcport; ///< data/command port register
187-
PortMask mosipinmask, ///< mosi pin mask
188-
clkpinmask, ///< serial clock pin mask
189-
cspinmask, ///< chip select pin mask
190-
dcpinmask; ///< data / command pin mask
156+
157+
#if defined(BUSIO_USE_FAST_PINIO)
158+
BusIO_PortReg *csPort, *dcPort;
159+
BusIO_PortMask csPinMask, dcPinMask;
191160
#endif
161+
192162
void csLow();
193163
void csHigh();
194164
void dcHigh();

0 commit comments

Comments
 (0)