Skip to content

Commit ebcbc7b

Browse files
committed
Add support for rtc, microSD, networkController and more
1 parent d5bdf50 commit ebcbc7b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+1933
-174
lines changed

src/Inkplate.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,13 @@
2424
#include "Wire.h"
2525
#include "SPI.h"
2626
#include "graphics/Graphics.h"
27-
//#include "include/System.h"
28-
//#include "libs/SdFat/SdFat.h"
27+
#include "system/NetworkController/NetworkController.h"
2928
#include "system/defines.h"
3029
#include "system/InkplateBoards.h"
3130
#include "boardSelect.h"
3231

33-
//extern SPIClass spi2;
34-
//extern SdFat sd;
3532

36-
class Inkplate : public Graphics, public InkplateBoardClass
33+
class Inkplate : public Graphics, public InkplateBoardClass, public NetworkController
3734
{
3835
public:
3936
Inkplate(uint8_t mode);

src/boards/Inkplate10/Inkplate10Driver.cpp

Lines changed: 202 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#include "Inkplate10Driver.h"
2-
#include "../../system/defines.h"
2+
3+
SPIClass spi2(2);
4+
SdFat sd(&spi2);
35

46
/**
57
* @brief begin function initialize Inkplate object with predefined
@@ -15,24 +17,26 @@
1517
*/
1618
int EPDDriver::initDriver(Inkplate *_inkplatePtr)
1719
{
20+
// If the driver was already initialized, skip current initialization
1821
if (_beginDone == 1)
1922
return 0;
20-
internalIO.beginIO(0x20);
21-
externalIO.beginIO(0x21);
2223

23-
internalIO.digitalWriteIO( 9, LOW);
24+
internalIO.begin(IO_INT_ADDR);
25+
externalIO.begin(IO_EXT_ADDR);
26+
27+
internalIO.digitalWrite( 9, LOW);
2428

2529

2630
memset(internalIO._ioExpanderRegs, 0, 22);
2731
memset(externalIO._ioExpanderRegs, 0, 22);
2832

29-
internalIO.pinModeIO( VCOM, OUTPUT);
30-
internalIO.pinModeIO( PWRUP, OUTPUT);
31-
internalIO.pinModeIO( WAKEUP, OUTPUT);
32-
internalIO.pinModeIO( GPIO0_ENABLE, OUTPUT);
33-
internalIO.digitalWriteIO( GPIO0_ENABLE, 1);
33+
internalIO.pinMode( VCOM, OUTPUT);
34+
internalIO.pinMode( PWRUP, OUTPUT);
35+
internalIO.pinMode( WAKEUP, OUTPUT);
36+
internalIO.pinMode( GPIO0_ENABLE, OUTPUT);
37+
internalIO.digitalWrite( GPIO0_ENABLE, 1);
3438

35-
internalIO.digitalWriteIO( WAKEUP, 1);
39+
internalIO.digitalWrite( WAKEUP, 1);
3640
WAKEUP_SET;
3741
delay(1);
3842
Wire.beginTransmission(0x48);
@@ -43,7 +47,7 @@ int EPDDriver::initDriver(Inkplate *_inkplatePtr)
4347
Wire.write(0B00000000); // Power down delay (6mS per rail)
4448
Wire.endTransmission();
4549
delay(1);
46-
internalIO.digitalWriteIO( WAKEUP, 0);
50+
internalIO.digitalWrite( WAKEUP, 0);
4751
WAKEUP_CLEAR;
4852

4953
// Set all pins of seconds I/O expander to outputs, low.
@@ -56,16 +60,16 @@ int EPDDriver::initDriver(Inkplate *_inkplatePtr)
5660

5761
for(int i = 0; i < 15; i++)
5862
{
59-
externalIO.pinModeIO( i, OUTPUT);
60-
externalIO.digitalWriteIO( i, LOW);
63+
externalIO.pinMode( i, OUTPUT);
64+
externalIO.digitalWrite( i, LOW);
6165
}
6266

6367
// For same reason, unused pins of first I/O expander have to be also set as
6468
// outputs, low.
65-
internalIO.pinModeIO( 14, OUTPUT);
66-
internalIO.pinModeIO( 15, OUTPUT);
67-
internalIO.digitalWriteIO( 14, LOW);
68-
internalIO.digitalWriteIO( 15, LOW);
69+
internalIO.pinMode( 14, OUTPUT);
70+
internalIO.pinMode( 15, OUTPUT);
71+
internalIO.digitalWrite( 14, LOW);
72+
internalIO.digitalWrite( 15, LOW);
6973

7074
// Set SPI pins to input to reduce power consumption in deep sleep
7175
pinMode(12, INPUT);
@@ -74,16 +78,16 @@ int EPDDriver::initDriver(Inkplate *_inkplatePtr)
7478
pinMode(15, INPUT);
7579

7680
// And also disable uSD card supply
77-
internalIO.pinModeIO( SD_PMOS_PIN, INPUT);
81+
internalIO.pinMode( SD_PMOS_PIN, INPUT);
7882

7983
// CONTROL PINS
8084
pinMode(0, OUTPUT);
8185
pinMode(2, OUTPUT);
8286
pinMode(32, OUTPUT);
8387
pinMode(33, OUTPUT);
84-
internalIO.pinModeIO( OE, OUTPUT);
85-
internalIO.pinModeIO( GMOD, OUTPUT);
86-
internalIO.pinModeIO( SPV, OUTPUT);
88+
internalIO.pinMode( OE, OUTPUT);
89+
internalIO.pinMode( GMOD, OUTPUT);
90+
internalIO.pinMode( SPV, OUTPUT);
8791

8892
// DATA PINS
8993
pinMode(4, OUTPUT); // D0
@@ -95,16 +99,17 @@ int EPDDriver::initDriver(Inkplate *_inkplatePtr)
9599
pinMode(26, OUTPUT);
96100
pinMode(27, OUTPUT); // D7
97101

98-
internalIO.pinModeIO( 10, OUTPUT);
99-
internalIO.pinModeIO( 11, OUTPUT);
100-
internalIO.pinModeIO( 12, OUTPUT);
101-
internalIO.digitalWriteIO( 10, LOW);
102-
internalIO.digitalWriteIO( 11, LOW);
103-
internalIO.digitalWriteIO( 12, LOW);
102+
internalIO.pinMode( 10, OUTPUT);
103+
internalIO.pinMode( 11, OUTPUT);
104+
internalIO.pinMode( 12, OUTPUT);
105+
internalIO.digitalWrite( 10, LOW);
106+
internalIO.digitalWrite( 11, LOW);
107+
internalIO.digitalWrite( 12, LOW);
104108
// Battery voltage Switch MOSFET
105-
internalIO.pinModeIO( 9, OUTPUT);
106-
internalIO.digitalWriteIO( 9, LOW);
109+
internalIO.pinMode( 9, OUTPUT);
110+
internalIO.digitalWrite( 9, LOW);
107111

112+
// Initialize all the framebuffers
108113
DMemoryNew = (uint8_t *)ps_malloc(E_INK_WIDTH * E_INK_HEIGHT / 8);
109114
_partial = (uint8_t *)ps_malloc(E_INK_WIDTH * E_INK_HEIGHT / 8);
110115
_pBuffer = (uint8_t *)ps_malloc(E_INK_WIDTH * E_INK_HEIGHT / 4);
@@ -116,6 +121,7 @@ int EPDDriver::initDriver(Inkplate *_inkplatePtr)
116121
{
117122
return 0;
118123
}
124+
// Set all the framebuffers to White at start
119125
memset(DMemoryNew, 0, E_INK_WIDTH * E_INK_HEIGHT / 8);
120126
memset(_partial, 0, E_INK_WIDTH * E_INK_HEIGHT / 8);
121127
memset(_pBuffer, 0, E_INK_WIDTH * E_INK_HEIGHT / 4);
@@ -127,6 +133,11 @@ int EPDDriver::initDriver(Inkplate *_inkplatePtr)
127133
return 1;
128134
}
129135

136+
137+
/**
138+
* @brief Calculates the values of the lookup table to
139+
* speed up rendering
140+
*/
130141
void EPDDriver::calculateLUTs()
131142
{
132143
for (int j = 0; j < 9; ++j)
@@ -584,9 +595,9 @@ void EPDDriver::pinsAsOutputs()
584595
pinMode(2, OUTPUT);
585596
pinMode(32, OUTPUT);
586597
pinMode(33, OUTPUT);
587-
internalIO.pinModeIO( OE, OUTPUT);
588-
internalIO.pinModeIO( GMOD, OUTPUT);
589-
internalIO.pinModeIO( SPV, OUTPUT);
598+
internalIO.pinMode( OE, OUTPUT);
599+
internalIO.pinMode( GMOD, OUTPUT);
600+
internalIO.pinMode( SPV, OUTPUT);
590601
pinMode(0, OUTPUT);
591602
pinMode(4, OUTPUT);
592603
pinMode(5, OUTPUT);
@@ -631,9 +642,9 @@ void EPDDriver::pinsZstate()
631642
pinMode(2, INPUT);
632643
pinMode(32, INPUT);
633644
pinMode(33, INPUT);
634-
internalIO.pinModeIO(OE, INPUT);
635-
internalIO.pinModeIO(GMOD, INPUT);
636-
internalIO.pinModeIO(SPV, INPUT);
645+
internalIO.pinMode(OE, INPUT);
646+
internalIO.pinMode(GMOD, INPUT);
647+
internalIO.pinMode(SPV, INPUT);
637648

638649
// Set up the EPD Data and CL pins for I2S .
639650
pinMode(0, INPUT);
@@ -717,4 +728,159 @@ void EPDDriver::hscan_start(uint32_t _d)
717728
uint8_t EPDDriver::getDisplayMode()
718729
{
719730
return _displayMode;
720-
}
731+
}
732+
733+
/**
734+
* @brief sdCardInit initializes sd card trough SPI
735+
*
736+
* @return 0 if failed to initialise, 1 if successful
737+
*/
738+
int16_t EPDDriver::sdCardInit()
739+
{
740+
internalIO.pinMode(SD_PMOS_PIN, OUTPUT);
741+
internalIO.digitalWrite(SD_PMOS_PIN, LOW);
742+
delay(50);
743+
spi2.begin(14, 12, 13, 15);
744+
setSdCardOk(sd.begin(15, SD_SCK_MHZ(25)));
745+
return getSdCardOk();
746+
}
747+
748+
/**
749+
* @brief sdCardSleep turns off the P-MOS which powers the sd card to save energy in deep sleep
750+
*/
751+
void EPDDriver::sdCardSleep()
752+
{
753+
// Set SPI pins to input to reduce power consumption in deep sleep
754+
pinMode(12, INPUT);
755+
pinMode(13, INPUT);
756+
pinMode(14, INPUT);
757+
pinMode(15, INPUT);
758+
759+
// And also disable uSD card supply
760+
internalIO.pinMode( SD_PMOS_PIN, INPUT);
761+
}
762+
763+
/**
764+
* @brief getSdFat gets sd card object
765+
*
766+
* @return sd card class object
767+
*/
768+
SdFat EPDDriver::getSdFat()
769+
{
770+
return sd;
771+
}
772+
773+
/**
774+
* @brief getSPIptr gets SPI class object pointer
775+
*
776+
* @return SPI class object
777+
*/
778+
SPIClass *EPDDriver::getSPIptr()
779+
{
780+
return &spi2;
781+
}
782+
783+
/**
784+
* @brief setSdCardOk sets sd card OK status
785+
*
786+
* @param int16_t s
787+
* sd card OK status, can be 1 or 0
788+
*/
789+
void EPDDriver::setSdCardOk(int16_t s)
790+
{
791+
_sdCardOk = s;
792+
}
793+
794+
795+
/**
796+
* @brief setSdCardOk gets sd card OK status
797+
*
798+
* @return sd card OK status, can be 1 or 0
799+
*/
800+
int16_t EPDDriver::getSdCardOk()
801+
{
802+
return _sdCardOk;
803+
}
804+
805+
806+
807+
/**
808+
* @brief readBattery reads voltage of the battery
809+
*
810+
* @return returns battery voltage value
811+
*/
812+
double EPDDriver::readBattery()
813+
{
814+
// Read the pin on the battery MOSFET. If is high, that means is older version of the board
815+
// that uses PMOS only. If it's low, newer board with both PMOS and NMOS.
816+
internalIO.pinMode(9, INPUT);
817+
int state = internalIO.digitalRead(9);
818+
internalIO.pinMode(9, OUTPUT);
819+
820+
// If the input is pulled high, it's PMOS only.
821+
// If it's pulled low, it's PMOS and NMOS.
822+
if (state)
823+
{
824+
internalIO.digitalWrite(9, LOW);
825+
}
826+
else
827+
{
828+
internalIO.digitalWrite(9, HIGH);
829+
}
830+
831+
// Wait a little bit after a MOSFET enable.
832+
delay(5);
833+
834+
// Set to the highest resolution and read the voltage.
835+
analogReadResolution(12);
836+
int adc = analogReadMilliVolts(35);
837+
838+
// Turn off the MOSFET (and voltage divider).
839+
if(state)
840+
{
841+
internalIO.digitalWrite(9, HIGH);
842+
}
843+
else
844+
{
845+
internalIO.digitalWrite(9, LOW);
846+
}
847+
848+
// Calculate the voltage at the battery terminal (voltage is divided in half by voltage divider).
849+
return (double(adc) * 2.0 / 1000);
850+
}
851+
852+
/**
853+
* @brief readTemperature reads panel temperature
854+
*
855+
* @return returns temperature in range from -10 to 85 degree C with
856+
* accuracy of +-1 in range from 0 to 50
857+
*/
858+
int8_t EPDDriver::readTemperature()
859+
{
860+
int8_t temp;
861+
if (getPanelState() == 0)
862+
{
863+
WAKEUP_SET;
864+
PWRUP_SET;
865+
delay(5);
866+
}
867+
Wire.beginTransmission(0x48);
868+
Wire.write(0x0D);
869+
Wire.write(B10000000);
870+
Wire.endTransmission();
871+
delay(5);
872+
873+
Wire.beginTransmission(0x48);
874+
Wire.write(0x00);
875+
Wire.endTransmission();
876+
877+
Wire.requestFrom(0x48, 1);
878+
temp = Wire.read();
879+
if (getPanelState() == 0)
880+
{
881+
PWRUP_CLEAR;
882+
WAKEUP_CLEAR;
883+
delay(5);
884+
}
885+
return temp;
886+
}

0 commit comments

Comments
 (0)