Skip to content

Commit 4414b00

Browse files
committed
Changed I2C to allow optional bit bang mode
1 parent d39a78d commit 4414b00

5 files changed

Lines changed: 35 additions & 32 deletions

File tree

library.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name=FastEPD
2-
version=1.4.2
2+
version=1.4.3
33
author=Larry Bank
44
maintainer=Larry Bank
55
sentence=A frustration-free e-paper library for parallel eink panels.

src/FastEPD.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,11 @@ uint8_t FASTEPD::ioRead(uint8_t u8Pin)
184184
return val;
185185
}
186186

187+
void FASTEPD::setBitBang(bool bBitBang)
188+
{
189+
_state.bit_bang = (uint8_t)bBitBang;
190+
} /* setBitBang() */
191+
187192
void FASTEPD::setItalic(bool bItalic)
188193
{
189194
_state.italic = (uint8_t)bItalic;

src/FastEPD.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ typedef struct tag_fastepdstate
192192
{
193193
int iPanelType;
194194
uint8_t wrap, last_error, pwr_on, mode;
195-
uint8_t shift_data, anti_alias, italic;
195+
uint8_t shift_data, anti_alias, italic, bit_bang;
196196
uint8_t u8LED1, u8LED2;
197197
int iCursorX, iCursorY;
198198
int width, height, native_width, native_height;
@@ -270,6 +270,7 @@ class FASTEPD
270270
int loadG5Image(const uint8_t *pG5, int x, int y, int iFG, int iBG, float fScale = 1.0f);
271271
void setFont(int iFont);
272272
void setItalic(bool bItalic);
273+
void setBitBang(bool bBitBang);
273274
void setFont(const void *pFont, bool bAntiAliased = false);
274275
void drawLine(int x1, int y1, int x2, int y2, int iColor);
275276
void drawPixel(int x, int y, uint8_t color);

src/FastEPD.inl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -982,7 +982,7 @@ int EPDiyV7IOInit(void *pBBEP)
982982
// if (pState->panelDef.ioOE < 0x100) bbepPinMode(pState->panelDef.ioOE, OUTPUT);
983983
bbepPinMode(pState->panelDef.ioLE, OUTPUT);
984984
bbepPinMode(pState->panelDef.ioCL, OUTPUT);
985-
bbepI2CInit((uint8_t)pState->panelDef.ioSDA, (uint8_t)pState->panelDef.ioSCL);
985+
bbepI2CInit((uint8_t)pState->panelDef.ioSDA, (uint8_t)pState->panelDef.ioSCL, pState->bit_bang);
986986
memset(ioRegs, 0, sizeof(ioRegs)); // copy of IO expander registers
987987
for (int i=8; i<14; i++) { // set lower 6 bits as outputs
988988
bbepPCA9535PinMode(i, OUTPUT);
@@ -1018,7 +1018,7 @@ int EPDiyV7RAWIOInit(void *pBBEP)
10181018
int epdInkyIOInit(void *pBBEP)
10191019
{
10201020
FASTEPDSTATE *pState = (FASTEPDSTATE *)pBBEP;
1021-
bbepI2CInit((uint8_t)pState->panelDef.ioSDA, (uint8_t)pState->panelDef.ioSCL);
1021+
bbepI2CInit((uint8_t)pState->panelDef.ioSDA, (uint8_t)pState->panelDef.ioSCL, pState->bit_bang);
10221022
bbepPinMode(pState->panelDef.ioPWR, OUTPUT);
10231023
bbepPinMode(pState->panelDef.ioSPV, OUTPUT);
10241024
bbepPinMode(pState->panelDef.ioCKV, OUTPUT);
@@ -1044,7 +1044,7 @@ int Inkplate6PlusIOInit(void *pBBEP)
10441044
bbepPinMode(pState->panelDef.ioSPH, OUTPUT);
10451045
bbepPinMode(pState->panelDef.ioLE, OUTPUT);
10461046
bbepPinMode(pState->panelDef.ioCL, OUTPUT);
1047-
bbepI2CInit((uint8_t)pState->panelDef.ioSDA, (uint8_t)pState->panelDef.ioSCL);
1047+
bbepI2CInit((uint8_t)pState->panelDef.ioSDA, (uint8_t)pState->panelDef.ioSCL, pState->bit_bang);
10481048
bbepMCP23017Init();
10491049
bbepMCPPinMode(pState->panelDef.ioShiftMask, OUTPUT); // VCOM
10501050
bbepMCPPinMode(pState->panelDef.ioPWR, OUTPUT); // PWRUP
@@ -1065,7 +1065,7 @@ int Inkplate6PlusIOInit(void *pBBEP)
10651065
int Inkplate5V2IOInit(void *pBBEP)
10661066
{
10671067
FASTEPDSTATE *pState = (FASTEPDSTATE *)pBBEP;
1068-
bbepI2CInit((uint8_t)pState->panelDef.ioSDA, (uint8_t)pState->panelDef.ioSCL);
1068+
bbepI2CInit((uint8_t)pState->panelDef.ioSDA, (uint8_t)pState->panelDef.ioSCL, pState->bit_bang);
10691069
bbepPCAL6416Init();
10701070
bbepPCALDigitalWrite(9, LOW);
10711071
bbepPinMode(pState->panelDef.ioCKV, OUTPUT);

src/arduino_io.inl

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,10 @@
2222
#define __BB_EP_IO__
2323

2424
// Since the Espressif I2C driver seems to corrupt memory with it's frequent allocs and frees, use bit banging
25-
#define BIT_BANG
2625

27-
#ifdef BIT_BANG
2826
static uint8_t u8SDA_Pin, u8SCL_Pin;
27+
static uint8_t bBitBang;
2928
static int iDelay = 0; //1;
30-
#endif
3129
#include <freertos/FreeRTOS.h>
3230
#include <freertos/task.h>
3331
#include "rom/ets_sys.h"
@@ -91,7 +89,6 @@ void bbepPinMode(int iPin, int iMode)
9189
gpio_config(&io_conf); //configure GPIO with the given settings
9290
} /* bbepPinMode() */
9391

94-
#ifdef BIT_BANG
9592
uint8_t SDA_READ(void)
9693
{
9794
return gpio_get_level((gpio_num_t)u8SDA_Pin);
@@ -257,24 +254,24 @@ uint8_t b = 0;
257254
i2cEnd();
258255
return response;
259256
} /* I2CTest() */
260-
#endif // BIT_BANG
261257
//
262258
// Initialize the Wire library on the given SDA/SCL GPIOs
263259
//
264-
int bbepI2CInit(uint8_t sda, uint8_t scl)
260+
int bbepI2CInit(uint8_t sda, uint8_t scl, int bb)
265261
{
266-
#ifdef BIT_BANG
267-
u8SDA_Pin = sda;
268-
u8SCL_Pin = scl;
262+
bBitBang = bb;
263+
if (bBitBang) {
264+
u8SDA_Pin = sda;
265+
u8SCL_Pin = scl;
269266
// if (iSpeed >= 400000) iDelay = 1;
270267
// else if (iSpeed >= 100000) iDelay = 10;
271268
// else iDelay = 20;
272-
#else
269+
} else {
273270
#ifdef ARDUINO
274-
Wire.end();
275-
Wire.begin(sda, scl);
276-
Wire.setClock(400000);
277-
Wire.setTimeout(100);
271+
Wire.end();
272+
Wire.begin(sda, scl);
273+
Wire.setClock(400000);
274+
Wire.setTimeout(100);
278275
#else
279276
i2c_config_t conf;
280277
ESP_ERROR_CHECK(i2c_driver_delete());
@@ -287,17 +284,17 @@ int bbepI2CInit(uint8_t sda, uint8_t scl)
287284
conf.clk_flags = 0;
288285
ESP_ERROR_CHECK(i2c_param_config(I2C_NUM_0, &conf));
289286
ESP_ERROR_CHECK(i2c_driver_install(I2C_NUM_0, I2C_MODE_MASTER, 0, 0, 0));
290-
#endif
291-
#endif // BIT_BANG
287+
#endif // ARDUINO
288+
} // !BitBang
292289
return BBEP_SUCCESS;
293290
} /* bbepI2CInit() */
294291

295292
int bbepI2CWrite(unsigned char iAddr, unsigned char *pData, int iLen)
296293
{
297-
#ifdef BIT_BANG
298-
I2CWrite(iAddr, pData, iLen);
299-
return 1;
300-
#else
294+
if (bBitBang) {
295+
I2CWrite(iAddr, pData, iLen);
296+
return 1;
297+
} else {
301298
#ifdef ARDUINO
302299
int rc = 0;
303300
Wire.beginTransmission(iAddr);
@@ -316,16 +313,16 @@ int bbepI2CWrite(unsigned char iAddr, unsigned char *pData, int iLen)
316313
esp_err_t ret = i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000 / portTICK_PERIOD_MS);
317314
i2c_cmd_link_delete(cmd);
318315
return (ret == ESP_OK);
319-
#endif
320-
#endif // BIT_BANG
316+
#endif // ARDUINO
317+
} // !BitBang
321318
}
322319

323320
int bbepI2CRead(unsigned char iAddr, unsigned char *pData, int iLen)
324321
{
325322
int i = 0;
326-
#ifdef BIT_BANG
323+
if (bBitBang) {
327324
i = I2CRead(iAddr, pData, iLen);
328-
#else
325+
} else {
329326
#ifdef ARDUINO
330327
Wire.requestFrom(iAddr, (unsigned char)iLen);
331328
while (i < iLen && Wire.available()) {
@@ -350,8 +347,8 @@ int i = 0;
350347
i = iLen;
351348
}
352349
i2c_cmd_link_delete(cmd);
353-
#endif
354-
#endif // BIT_BANG
350+
#endif // ARDUINO
351+
} // !BitBang
355352
return i;
356353
}
357354
int bbepI2CReadRegister(unsigned char iAddr, unsigned char u8Register, unsigned char *pData, int iLen)

0 commit comments

Comments
 (0)