Skip to content

Commit cc79fcd

Browse files
committed
simplify epd driver api
1 parent 27406c5 commit cc79fcd

10 files changed

+332
-309
lines changed

EPD/EPD_config.c

+10-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ void epd_config_load(epd_config_t *cfg)
3434
fds_record_desc_t record_desc;
3535
fds_find_token_t ftok;
3636

37-
memset(cfg, 0xFF, sizeof(epd_config_t));
37+
memset(cfg, EPD_CONFIG_EMPTY, sizeof(epd_config_t));
3838
memset(&ftok, 0x00, sizeof(fds_find_token_t));
3939

4040
if (fds_record_find(CONFIG_FILE_ID, CONFIG_REC_KEY, &record_desc, &ftok) != NRF_SUCCESS) {
@@ -99,3 +99,12 @@ void epd_config_save(epd_config_t *cfg)
9999
NRF_LOG_ERROR("epd_config_save: record write/update failed!\n");
100100
}
101101
}
102+
103+
bool epd_config_empty(epd_config_t *cfg)
104+
{
105+
for (uint8_t i = 0; i < EPD_CONFIG_SIZE; i++) {
106+
if (((uint8_t *)cfg)[i] != EPD_CONFIG_EMPTY)
107+
return false;
108+
}
109+
return true;
110+
}

EPD/EPD_config.h

+10-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
#ifndef EPD_CONFIG_H__
2+
#define EPD_CONFIG_H__
3+
#include <stdbool.h>
14
#include <stdint.h>
25

36
typedef struct
@@ -9,13 +12,19 @@ typedef struct
912
uint8_t rst_pin;
1013
uint8_t busy_pin;
1114
uint8_t bs_pin;
12-
uint8_t driver_id;
15+
uint8_t model_id;
1316
uint8_t wakeup_pin;
1417
uint8_t led_pin;
1518
uint8_t en_pin;
1619
} epd_config_t;
1720

21+
#define EPD_CONFIG_SIZE (sizeof(epd_config_t) / sizeof(uint8_t))
22+
#define EPD_CONFIG_EMPTY 0xFF
23+
1824
void epd_config_init(epd_config_t *cfg);
1925
void epd_config_load(epd_config_t *cfg);
2026
void epd_config_clear(epd_config_t *cfg);
2127
void epd_config_save(epd_config_t *cfg);
28+
bool epd_config_empty(epd_config_t *cfg);
29+
30+
#endif

EPD/EPD_driver.c

+78-82
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
2323

24+
// GPIO Pins
2425
uint32_t EPD_MOSI_PIN = 5;
2526
uint32_t EPD_SCLK_PIN = 8;
2627
uint32_t EPD_CS_PIN = 9;
@@ -31,6 +32,13 @@ uint32_t EPD_BS_PIN = 13;
3132
uint32_t EPD_EN_PIN = 0xFF;
3233
uint32_t EPD_LED_PIN = 0xFF;
3334

35+
// Display resolution
36+
uint16_t EPD_WIDTH = 400;
37+
uint16_t EPD_HEIGHT = 300;
38+
39+
// BWR mode
40+
bool EPD_BWR_MODE = true;
41+
3442
// Arduino like function wrappers
3543

3644
void pinMode(uint32_t pin, uint32_t mode)
@@ -82,50 +90,13 @@ void delay(uint32_t ms)
8290
nrf_delay_ms(ms);
8391
}
8492

85-
// GPIO
86-
void DEV_Module_Init(void)
87-
{
88-
pinMode(EPD_CS_PIN, OUTPUT);
89-
pinMode(EPD_DC_PIN, OUTPUT);
90-
pinMode(EPD_RST_PIN, OUTPUT);
91-
pinMode(EPD_BUSY_PIN, INPUT);
92-
93-
if (EPD_EN_PIN != 0xFF) {
94-
pinMode(EPD_EN_PIN, OUTPUT);
95-
digitalWrite(EPD_EN_PIN, HIGH);
96-
}
97-
98-
pinMode(EPD_BS_PIN, OUTPUT);
99-
digitalWrite(EPD_BS_PIN, LOW);
100-
101-
digitalWrite(EPD_DC_PIN, LOW);
102-
digitalWrite(EPD_CS_PIN, LOW);
103-
digitalWrite(EPD_RST_PIN, HIGH);
104-
105-
if (EPD_LED_PIN != 0xFF) {
106-
pinMode(EPD_LED_PIN, OUTPUT);
107-
EPD_LED_ON();
108-
}
109-
}
110-
111-
void DEV_Module_Exit(void)
112-
{
113-
digitalWrite(EPD_DC_PIN, LOW);
114-
digitalWrite(EPD_CS_PIN, LOW);
115-
digitalWrite(EPD_RST_PIN, LOW);
116-
117-
DEV_SPI_Exit();
118-
119-
EPD_LED_OFF();
120-
}
121-
12293
// Hardware SPI (write only)
12394

12495
#define SPI_INSTANCE 0 /**< SPI instance index. */
12596
static const nrf_drv_spi_t spi = NRF_DRV_SPI_INSTANCE(SPI_INSTANCE); /**< SPI instance. */
12697
static bool spi_initialized = false;
12798

128-
void DEV_SPI_Init(void)
99+
static void EPD_SPI_Init(void)
129100
{
130101
if (spi_initialized) return;
131102
nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
@@ -140,30 +111,30 @@ void DEV_SPI_Init(void)
140111
spi_initialized = true;
141112
}
142113

143-
void DEV_SPI_Exit(void)
114+
static void EPD_SPI_Uninit(void)
144115
{
145116
if (!spi_initialized) return;
146117
nrf_drv_spi_uninit(&spi);
147118
spi_initialized = false;
148119
}
149120

150-
void DEV_SPI_WriteByte(uint8_t value)
121+
void EPD_SPI_WriteByte(uint8_t value)
151122
{
152-
DEV_SPI_Init();
123+
EPD_SPI_Init();
153124
APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, &value, 1, NULL, 0));
154125
}
155126

156-
void DEV_SPI_WriteBytes(uint8_t *value, uint8_t len)
127+
void EPD_SPI_WriteBytes(uint8_t *value, uint8_t len)
157128
{
158-
DEV_SPI_Init();
129+
EPD_SPI_Init();
159130
APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, value, len, NULL, 0));
160131
}
161132

162133

163134
// Software SPI (read / write)
164-
void DEV_SPI_WriteByte_SW(uint8_t data)
135+
void EPD_SPI_WriteByte_SW(uint8_t data)
165136
{
166-
DEV_SPI_Exit();
137+
EPD_SPI_Uninit();
167138
pinMode(EPD_MOSI_PIN, OUTPUT);
168139
digitalWrite(EPD_CS_PIN, LOW);
169140
for (int i = 0; i < 8; i++)
@@ -178,9 +149,9 @@ void DEV_SPI_WriteByte_SW(uint8_t data)
178149
digitalWrite(EPD_CS_PIN, HIGH);
179150
}
180151

181-
uint8_t DEV_SPI_ReadByte_SW(void)
152+
uint8_t EPD_SPI_ReadByte_SW(void)
182153
{
183-
DEV_SPI_Exit();
154+
EPD_SPI_Uninit();
184155
uint8_t j = 0xff;
185156
pinMode(EPD_MOSI_PIN, INPUT);
186157
digitalWrite(EPD_CS_PIN, LOW);
@@ -202,42 +173,42 @@ void EPD_WriteCommand_SW(uint8_t Reg)
202173
{
203174
digitalWrite(EPD_DC_PIN, LOW);
204175
digitalWrite(EPD_CS_PIN, LOW);
205-
DEV_SPI_WriteByte_SW(Reg);
176+
EPD_SPI_WriteByte_SW(Reg);
206177
digitalWrite(EPD_CS_PIN, HIGH);
207178
}
208179

209180
void EPD_WriteByte_SW(uint8_t Data)
210181
{
211182
digitalWrite(EPD_DC_PIN, HIGH);
212183
digitalWrite(EPD_CS_PIN, LOW);
213-
DEV_SPI_WriteByte_SW(Data);
184+
EPD_SPI_WriteByte_SW(Data);
214185
digitalWrite(EPD_CS_PIN, HIGH);
215186
}
216187

217188
uint8_t EPD_ReadByte_SW(void)
218189
{
219190
digitalWrite(EPD_DC_PIN, HIGH);
220-
return DEV_SPI_ReadByte_SW();
191+
return EPD_SPI_ReadByte_SW();
221192
}
222193

223194

224195
// Hardware SPI
225196
void EPD_WriteCommand(uint8_t Reg)
226197
{
227198
digitalWrite(EPD_DC_PIN, LOW);
228-
DEV_SPI_WriteByte(Reg);
199+
EPD_SPI_WriteByte(Reg);
229200
}
230201

231202
void EPD_WriteByte(uint8_t Data)
232203
{
233204
digitalWrite(EPD_DC_PIN, HIGH);
234-
DEV_SPI_WriteByte(Data);
205+
EPD_SPI_WriteByte(Data);
235206
}
236207

237208
void EPD_WriteData(uint8_t *Data, uint8_t Len)
238209
{
239210
digitalWrite(EPD_DC_PIN, HIGH);
240-
DEV_SPI_WriteBytes(Data, Len);
211+
EPD_SPI_WriteBytes(Data, Len);
241212
}
242213

243214
void EPD_Reset(uint32_t value, uint16_t duration)
@@ -266,6 +237,44 @@ void EPD_WaitBusy(uint32_t value, uint16_t timeout)
266237
NRF_LOG_DEBUG("[EPD]: busy release\n");
267238
}
268239

240+
// GPIO
241+
void EPD_GPIO_Init(void)
242+
{
243+
pinMode(EPD_CS_PIN, OUTPUT);
244+
pinMode(EPD_DC_PIN, OUTPUT);
245+
pinMode(EPD_RST_PIN, OUTPUT);
246+
pinMode(EPD_BUSY_PIN, INPUT);
247+
248+
if (EPD_EN_PIN != 0xFF) {
249+
pinMode(EPD_EN_PIN, OUTPUT);
250+
digitalWrite(EPD_EN_PIN, HIGH);
251+
}
252+
253+
pinMode(EPD_BS_PIN, OUTPUT);
254+
digitalWrite(EPD_BS_PIN, LOW);
255+
256+
EPD_SPI_Init();
257+
258+
digitalWrite(EPD_DC_PIN, LOW);
259+
digitalWrite(EPD_CS_PIN, LOW);
260+
digitalWrite(EPD_RST_PIN, HIGH);
261+
262+
if (EPD_LED_PIN != 0xFF) {
263+
pinMode(EPD_LED_PIN, OUTPUT);
264+
EPD_LED_ON();
265+
}
266+
}
267+
268+
void EPD_GPIO_Uninit(void)
269+
{
270+
digitalWrite(EPD_DC_PIN, LOW);
271+
digitalWrite(EPD_CS_PIN, LOW);
272+
digitalWrite(EPD_RST_PIN, LOW);
273+
274+
EPD_SPI_Uninit();
275+
276+
EPD_LED_OFF();
277+
}
269278

270279
// lED
271280
void EPD_LED_ON(void)
@@ -286,41 +295,28 @@ void EPD_LED_TOGGLE(void)
286295
nrf_gpio_pin_toggle(EPD_LED_PIN);
287296
}
288297

298+
// EPD models
299+
extern epd_model_t epd_4in2;
300+
extern epd_model_t epd_4in2bv2;
289301

290-
extern epd_driver_t epd_driver_4in2;
291-
extern epd_driver_t epd_driver_4in2bv2;
292-
293-
/** EPD drivers */
294-
static epd_driver_t *epd_drivers[] = {
295-
&epd_driver_4in2, // UC8176: 4.2 inch, BW
296-
&epd_driver_4in2bv2, // UC8176: 4.2 inch, BWR
302+
static epd_model_t *epd_models[] = {
303+
&epd_4in2,
304+
&epd_4in2bv2,
297305
};
298306

299-
/**< current EPD driver */
300-
static epd_driver_t *m_driver = NULL;
301-
302-
epd_driver_t *epd_driver_get(void)
307+
static epd_model_t *epd_model_get(epd_model_id_t id)
303308
{
304-
if (m_driver == NULL)
305-
m_driver = epd_drivers[0];
306-
return m_driver;
307-
}
308-
309-
epd_driver_t *epd_driver_by_id(uint8_t id)
310-
{
311-
for (uint8_t i = 0; i < ARRAY_SIZE(epd_drivers); i++) {
312-
if (epd_drivers[i]->id == id)
313-
return epd_drivers[i];
309+
for (uint8_t i = 0; i < ARRAY_SIZE(epd_models); i++) {
310+
if (epd_models[i]->id == id) {
311+
return epd_models[i];
312+
}
314313
}
315-
return NULL;
314+
return epd_models[0];
316315
}
317316

318-
bool epd_driver_set(uint8_t id)
317+
epd_driver_t *epd_model_init(epd_model_id_t id)
319318
{
320-
epd_driver_t *driver = epd_driver_by_id(id);
321-
if (driver ) {
322-
m_driver = driver;
323-
return true;
324-
}
325-
return false;
319+
epd_model_t *model = epd_model_get(id);
320+
model->drv->init(model->res, model->bwr);
321+
return model->drv;
326322
}

0 commit comments

Comments
 (0)