Skip to content

Commit ae9acd8

Browse files
author
Larry Bank
committed
Added Linux it8951 support
1 parent 7c89ff0 commit ae9acd8

3 files changed

Lines changed: 169 additions & 26 deletions

File tree

src/FastEPD.inl

Lines changed: 92 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1908,19 +1908,19 @@ void bbepInitLights(FASTEPDSTATE *pState, uint8_t led1, uint8_t led2)
19081908
void it8951WaitForReady(FASTEPDSTATE *pState)
19091909
{
19101910
const uint32_t start = millis();
1911-
while (gpio_get_level((gpio_num_t)pState->u8Busy) == LOW) {
1911+
while (digitalRead(pState->u8Busy) == LOW) {
19121912
if (millis() - start > 3000) {
19131913
// Serial-only — HRDY timeouts are expected during the multi-attempt probe sequence
19141914
//Serial.println("HRDY timeout");
19151915
break;
19161916
}
1917-
vTaskDelay(pdMS_TO_TICKS(1));
1917+
vTaskDelay(10);
19181918
}
19191919
} /* it8951WaitForReady() */
19201920

19211921
void it8951WriteNData(FASTEPDSTATE *pState, const uint16_t *buf, uint32_t word_count) {
1922-
#ifdef ARDUINO
19231922
gpio_set_level((gpio_num_t)pState->u8CS, LOW);
1923+
#ifdef ARDUINO
19241924
SPI.beginTransaction(SPISettings(pState->spi_frequency, MSBFIRST, SPI_MODE0));
19251925
//it8951GetSystemInfo(pState);
19261926
it8951WaitForReady(pState);
@@ -1930,34 +1930,49 @@ void it8951WriteNData(FASTEPDSTATE *pState, const uint16_t *buf, uint32_t word_c
19301930
SPI.transfer16(buf[i]);
19311931
}
19321932
SPI.endTransaction();
1933-
gpio_set_level((gpio_num_t)pState->u8CS, HIGH);
1933+
#elif defined (__LINUX__)
1934+
it8951WaitForReady(pState);
1935+
for (uint32_t i = 0; i < word_count; i++) {
1936+
linux_spi_write16(buf[i], pState->spi_frequency);
1937+
}
19341938
#endif // ARDUINO
1939+
gpio_set_level((gpio_num_t)pState->u8CS, HIGH);
19351940
} /* i8951WriteNData() */
19361941

19371942
void it8951WriteData(FASTEPDSTATE *pState, uint16_t data) {
1938-
#ifdef ARDUINO
19391943
gpio_set_level((gpio_num_t)pState->u8CS, LOW);
1944+
#ifdef ARDUINO
19401945
SPI.beginTransaction(SPISettings(pState->spi_frequency, MSBFIRST, SPI_MODE0));
19411946
it8951WaitForReady(pState);
19421947
SPI.transfer16(0x0000); // data preamble
19431948
it8951WaitForReady(pState);
19441949
SPI.transfer16(data);
19451950
SPI.endTransaction();
1951+
#elif defined (__LINUX__)
1952+
it8951WaitForReady(pState);
1953+
linux_spi_write16(0, pState->spi_frequency);
1954+
it8951WaitForReady(pState);
1955+
linux_spi_write16(data, pState->spi_frequency);
1956+
#endif
19461957
gpio_set_level((gpio_num_t)pState->u8CS, HIGH);
1947-
#endif // ARDUINO
19481958
} /* it8951WriteData() */
19491959

19501960
void it8951WriteCmdCode(FASTEPDSTATE *pState, uint16_t cmd) {
1951-
#ifdef ARDUINO
19521961
gpio_set_level((gpio_num_t)pState->u8CS, LOW);
1962+
#ifdef ARDUINO
19531963
SPI.beginTransaction(SPISettings(pState->spi_frequency, MSBFIRST, SPI_MODE0));
19541964
it8951WaitForReady(pState);
19551965
SPI.transfer16(0x6000); // command preamble
19561966
it8951WaitForReady(pState);
19571967
SPI.transfer16(cmd);
19581968
SPI.endTransaction();
1969+
#elif defined(__LINUX__)
1970+
it8951WaitForReady(pState);
1971+
linux_spi_write16(0x6000, pState->spi_frequency);
1972+
it8951WaitForReady(pState);
1973+
linux_spi_write16(cmd, pState->spi_frequency);
1974+
#endif
19591975
gpio_set_level((gpio_num_t)pState->u8CS, HIGH);
1960-
#endif // ARDUINO
19611976
} /* it8951WriteCmdCode() */
19621977

19631978
void it8951SendCmdArg(FASTEPDSTATE *pState, uint16_t cmd, uint16_t *args, uint16_t num_args)
@@ -1976,26 +1991,31 @@ void it8951WriteVcom(FASTEPDSTATE *pState, uint16_t selector, uint16_t value)
19761991
}
19771992

19781993
uint16_t it8951ReadData(FASTEPDSTATE *pState) {
1979-
#ifdef ARDUINO
1994+
uint16_t data = 0;
19801995
gpio_set_level((gpio_num_t)pState->u8CS, LOW);
1996+
#ifdef ARDUINO
19811997
SPI.beginTransaction(SPISettings(pState->spi_frequency, MSBFIRST, SPI_MODE0));
19821998
it8951WaitForReady(pState);
19831999
SPI.transfer16(0x1000); // read preamble
19842000
SPI.transfer16(0); // dummy read
19852001
it8951WaitForReady(pState);
1986-
const uint16_t data = SPI.transfer16(0);
2002+
data = SPI.transfer16(0);
19872003
SPI.endTransaction();
2004+
#elif defined (__LINUX__)
2005+
it8951WaitForReady(pState);
2006+
linux_spi_write16(0x1000, pState->spi_frequency); // read preamble
2007+
linux_spi_write16(0, pState->spi_frequency); // dummy write
2008+
it8951WaitForReady(pState);
2009+
data = linux_spi_read16(pState->spi_frequency);
2010+
#endif
19882011
gpio_set_level((gpio_num_t)pState->u8CS, HIGH);
19892012
return data;
1990-
#else
1991-
return 0;
1992-
#endif
19932013
} /* it8951ReadData() */
19942014

19952015
void it8951ReadNData(FASTEPDSTATE *pState, uint16_t *buf, uint32_t word_count)
19962016
{
1997-
#ifdef ARDUINO
19982017
gpio_set_level((gpio_num_t)pState->u8CS, LOW);
2018+
#ifdef ARDUINO
19992019
SPI.beginTransaction(SPISettings(pState->spi_frequency, MSBFIRST, SPI_MODE0));
20002020
it8951WaitForReady(pState);
20012021
SPI.transfer16(0x1000); // read preamble
@@ -2006,8 +2026,17 @@ void it8951ReadNData(FASTEPDSTATE *pState, uint16_t *buf, uint32_t word_count)
20062026
buf[i] = SPI.transfer16(0);
20072027
}
20082028
SPI.endTransaction();
2009-
gpio_set_level((gpio_num_t)pState->u8CS, HIGH);
2029+
#elif defined (__LINUX__)
2030+
it8951WaitForReady(pState);
2031+
linux_spi_write16(0x1000, pState->spi_frequency); // read preamble
2032+
it8951WaitForReady(pState);
2033+
linux_spi_write16(0, pState->spi_frequency); // dummy write
2034+
it8951WaitForReady(pState);
2035+
for (uint32_t i=0; i<word_count; i++) {
2036+
buf[i] = linux_spi_read16(pState->spi_frequency);
2037+
}
20102038
#endif // ARDUINO
2039+
gpio_set_level((gpio_num_t)pState->u8CS, HIGH);
20112040
} /* it8951ReadNData() */
20122041

20132042
uint16_t it8951ReadReg(FASTEPDSTATE *pState, uint16_t addr)
@@ -2032,7 +2061,7 @@ void it8951WaitForLUTReady(FASTEPDSTATE *pState) {
20322061
break;
20332062
}
20342063
//yield();
2035-
vTaskDelay(pdMS_TO_TICKS(10));
2064+
vTaskDelay(100);
20362065
}
20372066
} /* it8951WaitForLUTReady() */
20382067

@@ -2117,7 +2146,6 @@ IT8951DevInfo dev_info_;
21172146

21182147
void it8951WriteFramebuffer1Bit(FASTEPDSTATE *pState)
21192148
{
2120-
#ifdef ARDUINO
21212149
uint8_t *s;
21222150
int iPitch;
21232151

@@ -2130,9 +2158,14 @@ int iPitch;
21302158

21312159
//Serial.println("About to start data");
21322160
gpio_set_level((gpio_num_t)pState->u8CS, LOW);
2161+
#ifdef ARDUINO
21332162
SPI.beginTransaction(SPISettings(pState->spi_frequency, MSBFIRST, SPI_MODE0));
21342163
it8951WaitForReady(pState);
21352164
SPI.transfer16(0x0000); // data preamble
2165+
#elif defined (__LINUX__)
2166+
it8951WaitForReady(pState);
2167+
linux_spi_write16(0, pState->spi_frequency);
2168+
#endif
21362169
it8951WaitForReady(pState);
21372170

21382171
s = pState->pCurrent;
@@ -2143,16 +2176,26 @@ int iPitch;
21432176
for (int x = 0; x<iPitch; x++) {
21442177
d[iPitch - 1 - x] = s[x];
21452178
}
2179+
#ifdef ARDUINO
21462180
SPI.writeBytes(d, iPitch);
2181+
#elif defined(__LINUX__)
2182+
linux_spi_write(d, iPitch, pState->spi_frequency);
2183+
#endif
21472184
} else {
2185+
#ifdef ARDUINO
21482186
SPI.writeBytes(s, iPitch);
2187+
#elif defined(__LINUX__)
2188+
linux_spi_write(s, iPitch, pState->spi_frequency);
2189+
#endif
21492190
}
21502191
if ((y & 0x07) == 0) {
21512192
yield();
21522193
}
21532194
s += iPitch;
21542195
}
2196+
#ifdef ARDUINO
21552197
SPI.endTransaction();
2198+
#endif
21562199
gpio_set_level((gpio_num_t)pState->u8CS, HIGH);
21572200
//Serial.println("Data sent");
21582201
// finish the operation
@@ -2162,12 +2205,10 @@ int iPitch;
21622205
IT8951EinkPower(pState, 0);
21632206

21642207
//Serial.println("finish update");
2165-
#endif // ARDUINO
21662208
} /* it8951WriteFramebuffer1Bit() */
21672209

21682210
void it8951WriteFramebuffer4Bit(FASTEPDSTATE *pState)
21692211
{
2170-
#ifdef ARDUINO
21712212
uint8_t *s;
21722213
int iPitch;
21732214

@@ -2182,9 +2223,13 @@ int iPitch;
21822223

21832224

21842225
gpio_set_level((gpio_num_t)pState->u8CS, LOW);
2185-
SPI.beginTransaction(SPISettings(pState->spi_frequency, MSBFIRST, SPI_MODE0));
21862226
it8951WaitForReady(pState);
2227+
#ifdef ARDUINO
2228+
SPI.beginTransaction(SPISettings(pState->spi_frequency, MSBFIRST, SPI_MODE0));
21872229
SPI.transfer16(0x0000); // data preamble
2230+
#elif defined(__LINUX__)
2231+
linux_spi_write16(0, pState->spi_frequency);
2232+
#endif
21882233
it8951WaitForReady(pState);
21892234

21902235
s = pState->pCurrent;
@@ -2195,28 +2240,35 @@ int iPitch;
21952240
for (int x = 0; x<iPitch; x++) {
21962241
d[iPitch - 1 - x] = (s[x] >> 4) | (s[x] << 4);
21972242
}
2243+
#ifdef ARDUINO
21982244
SPI.writeBytes(d, iPitch);
2245+
#elif defined(__LINUX__)
2246+
linux_spi_write(d, iPitch, pState->spi_frequency);
2247+
#endif
21992248
} else {
2249+
#ifdef ARDUINO
22002250
SPI.writeBytes(s, iPitch);
2251+
#elif defined(__LINUX__)
2252+
linux_spi_write(s, iPitch, pState->spi_frequency);
2253+
#endif
22012254
}
22022255
if ((y & 0x07) == 0) {
22032256
yield();
22042257
}
22052258
s += iPitch;
22062259
}
2207-
2260+
#ifdef ARDUINO
22082261
SPI.endTransaction();
2262+
#endif
22092263
gpio_set_level((gpio_num_t)pState->u8CS, HIGH);
22102264
it8951WriteCmdCode(pState, IT8951_TCON_LD_IMG_END);
22112265
it8951DisplayArea(pState, 0, 0, pState->native_width, pState->native_height, 2);
22122266
it8951WaitForReady(pState);
22132267
IT8951EinkPower(pState, 0);
2214-
#endif // ARDUINO
22152268
} /* it8951WriteFramebuffer4Bit() */
22162269

22172270
void it8951WriteFramebuffer2Bit(FASTEPDSTATE *pState)
22182271
{
2219-
#ifdef ARDUINO
22202272
uint8_t *s;
22212273
int iPitch;
22222274

@@ -2229,11 +2281,14 @@ int iPitch;
22292281

22302282
it8951LoadImgAreaStart(pState, (pState->iFlags & BB_PANEL_FLAG_MIRROR_X) ? IT8951_LDIMG_B_ENDIAN : IT8951_LDIMG_L_ENDIAN, IT8951_2BPP, 0, 0, 0, pState->native_width, pState->native_height);
22312283

2232-
22332284
gpio_set_level((gpio_num_t)pState->u8CS, LOW);
2234-
SPI.beginTransaction(SPISettings(pState->spi_frequency, MSBFIRST, SPI_MODE0));
22352285
it8951WaitForReady(pState);
2286+
#ifdef ARDUINO
2287+
SPI.beginTransaction(SPISettings(pState->spi_frequency, MSBFIRST, SPI_MODE0));
22362288
SPI.transfer16(0x0000); // data preamble
2289+
#elif defined(__LINUX__)
2290+
linux_spi_write16(0, pState->spi_frequency);
2291+
#endif
22372292
it8951WaitForReady(pState);
22382293

22392294
s = pState->pCurrent;
@@ -2245,23 +2300,32 @@ int iPitch;
22452300
uint8_t a = s[x];
22462301
d[iPitch - 1 - x] = (a >> 6) | ((a >> 2) & 0xc) | ((a & 0xc) << 2) | ((a & 3) << 6);
22472302
}
2303+
#ifdef ARDUINO
22482304
SPI.writeBytes(d, iPitch);
2305+
#elif defined(__LINUX__)
2306+
linux_spi_write(d, iPitch, pState->spi_frequency);
2307+
#endif
22492308
} else {
2309+
#ifdef ARDUINO
22502310
SPI.writeBytes(s, iPitch);
2311+
#elif defined(__LINUX__)
2312+
linux_spi_write(s, iPitch, pState->spi_frequency);
2313+
#endif
22512314
}
22522315
if ((y & 0x07) == 0) {
22532316
yield();
22542317
}
22552318
s += iPitch;
22562319
}
22572320

2321+
#ifdef ARDUINO
22582322
SPI.endTransaction();
2323+
#endif
22592324
gpio_set_level((gpio_num_t)pState->u8CS, HIGH);
22602325
it8951WriteCmdCode(pState, IT8951_TCON_LD_IMG_END);
22612326
it8951DisplayArea(pState, 0, 0, pState->native_width, pState->native_height, 2);
22622327
it8951WaitForReady(pState);
22632328
IT8951EinkPower(pState, 0);
2264-
#endif // ARDUINO
22652329
} /* it8951WriteFramebuffer2Bit() */
22662330

22672331
//
@@ -2287,6 +2351,8 @@ int bbepInitIT8951(FASTEPDSTATE *pState, uint8_t u8MOSI, uint8_t u8MISO, uint8_t
22872351
gpio_set_level((gpio_num_t)u8ITE_EN, HIGH);
22882352
#ifdef ARDUINO
22892353
SPI.begin(u8CLK, u8MISO, u8MOSI, -1);
2354+
#else
2355+
linux_spi_init(u8MISO, u8MOSI, u8CLK);
22902356
#endif // ARDUINO
22912357
pState->spi_frequency = IT8951_SPI_PROBE_FREQUENCY;
22922358

src/arduino_io.inl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,12 @@ uint8_t b = 0;
257257
i2cEnd();
258258
return response;
259259
} /* I2CTest() */
260+
#ifdef ESP_IDF_VERSION
261+
uint8_t digitalRead(uint8_t pin)
262+
{
263+
return (uint8_t)gpio_get_level((gpio_num_t)pin);
264+
} /* digitalRead() */
265+
#endif // ESP-IDF
260266
//
261267
// Initialize the Wire library on the given SDA/SCL GPIOs
262268
//

0 commit comments

Comments
 (0)