From bc8cf3b160b04c6d2cfa844abca76131c13c98db Mon Sep 17 00:00:00 2001 From: Shuanglei Tao Date: Sat, 7 Jun 2025 10:58:00 +0800 Subject: [PATCH] fix write image command --- EPD/EPD_driver.h | 3 +-- EPD/EPD_service.c | 6 +----- EPD/JD79668.c | 10 ++++++++-- EPD/SSD1619.c | 15 +++++++++++++-- EPD/UC8176.c | 15 +++++++++++++-- 5 files changed, 36 insertions(+), 13 deletions(-) diff --git a/EPD/EPD_driver.h b/EPD/EPD_driver.h index 2f0100a..64adcbf 100644 --- a/EPD/EPD_driver.h +++ b/EPD/EPD_driver.h @@ -33,12 +33,11 @@ typedef struct void (*init)(); /**< Initialize the e-Paper register */ void (*clear)(bool refresh); /**< Clear screen */ void (*write_image)(uint8_t *black, uint8_t *color, uint16_t x, uint16_t y, uint16_t w, uint16_t h); /**< write image */ + void (*write_ram)(bool begin, bool black, uint8_t *data, uint8_t len); /* write data to epd ram */ void (*refresh)(void); /**< Sends the image buffer in RAM to e-Paper and displays */ void (*sleep)(void); /**< Enter sleep mode */ int8_t (*read_temp)(void); /**< Read temperature from driver chip */ void (*force_temp)(int8_t value); /**< Force temperature (will trigger OTP LUT switch) */ - uint8_t cmd_write_ram1; /**< Command to write black ram */ - uint8_t cmd_write_ram2; /**< Command to write red ram */ } epd_driver_t; typedef enum diff --git a/EPD/EPD_service.c b/EPD/EPD_service.c index a55f918..80fb9cd 100644 --- a/EPD/EPD_service.c +++ b/EPD/EPD_service.c @@ -161,11 +161,7 @@ static void epd_service_on_write(ble_epd_t * p_epd, uint8_t * p_data, uint16_t l case EPD_CMD_WRITE_IMAGE: // MSB=0000: ram begin, LSB=1111: black if (length < 3) return; - if ((p_data[1] >> 4) == 0x00) { - bool black = (p_data[1] & 0x0F) == 0x0F; - EPD_WriteCmd(black ? p_epd->epd->drv->cmd_write_ram1 : p_epd->epd->drv->cmd_write_ram2); - } - EPD_WriteData(&p_data[2], length - 2); + p_epd->epd->drv->write_ram((p_data[1] >> 4) == 0x00, (p_data[1] & 0x0F) == 0x0F, &p_data[2], length - 2); break; case EPD_CMD_SET_CONFIG: diff --git a/EPD/JD79668.c b/EPD/JD79668.c index f7f4ecc..c51fb69 100644 --- a/EPD/JD79668.c +++ b/EPD/JD79668.c @@ -172,6 +172,13 @@ void JD79668_Write_Image(uint8_t *black, uint8_t *color, uint16_t x, uint16_t y, } } +void JD79668_Wite_Ram(bool begin, bool black, uint8_t *data, uint8_t len) +{ + if (begin) + EPD_WriteCmd(CMD_DTM); + EPD_WriteData(data, len); +} + void JD79668_Sleep(void) { JD79668_PowerOff(); @@ -183,12 +190,11 @@ static epd_driver_t epd_drv_JD79668 = { .init = JD79668_Init, .clear = JD79668_Clear, .write_image = JD79668_Write_Image, + .write_ram = JD79668_Wite_Ram, .refresh = JD79668_Refresh, .sleep = JD79668_Sleep, .read_temp = JD79668_Read_Temp, .force_temp = JD79668_Force_Temp, - .cmd_write_ram1 = CMD_DTM, - .cmd_write_ram2 = CMD_DTM, }; // JD79668 400x300 Black/White/Red/Yellow diff --git a/EPD/SSD1619.c b/EPD/SSD1619.c index 1727ba9..c5ad0d4 100644 --- a/EPD/SSD1619.c +++ b/EPD/SSD1619.c @@ -186,6 +186,18 @@ void SSD1619_Write_Image(uint8_t *black, uint8_t *color, uint16_t x, uint16_t y, } } +void SSD1619_Wite_Ram(bool begin, bool black, uint8_t *data, uint8_t len) +{ + if (begin) { + epd_model_t *EPD = epd_get(); + if (EPD->color == BWR) + EPD_WriteCmd(black ? CMD_WRITE_RAM1 : CMD_WRITE_RAM2); + else + EPD_WriteCmd(CMD_WRITE_RAM1); + } + EPD_WriteData(data, len); +} + void SSD1619_Sleep(void) { EPD_Write(CMD_SLEEP_MODE, 0x01); @@ -196,12 +208,11 @@ static epd_driver_t epd_drv_ssd1619 = { .init = SSD1619_Init, .clear = SSD1619_Clear, .write_image = SSD1619_Write_Image, + .write_ram = SSD1619_Wite_Ram, .refresh = SSD1619_Refresh, .sleep = SSD1619_Sleep, .read_temp = SSD1619_Read_Temp, .force_temp = SSD1619_Force_Temp, - .cmd_write_ram1 = CMD_WRITE_RAM1, - .cmd_write_ram2 = CMD_WRITE_RAM2, }; // SSD1619 400x300 Black/White/Red diff --git a/EPD/UC8176.c b/EPD/UC8176.c index 92c534e..3ecec05 100644 --- a/EPD/UC8176.c +++ b/EPD/UC8176.c @@ -207,6 +207,18 @@ void UC8176_Write_Image(uint8_t *black, uint8_t *color, uint16_t x, uint16_t y, EPD_WriteCmd(CMD_PTOUT); // partial out } +void UC8176_Wite_Ram(bool begin, bool black, uint8_t *data, uint8_t len) +{ + if (begin) { + epd_model_t *EPD = epd_get(); + if (EPD->color == BWR) + EPD_WriteCmd(black ? CMD_DTM1 : CMD_DTM2); + else + EPD_WriteCmd(CMD_DTM2); + } + EPD_WriteData(data, len); +} + void UC8176_Sleep(void) { UC8176_PowerOff(); @@ -219,12 +231,11 @@ static epd_driver_t epd_drv_uc8176 = { .init = UC8176_Init, .clear = UC8176_Clear, .write_image = UC8176_Write_Image, + .write_ram = UC8176_Wite_Ram, .refresh = UC8176_Refresh, .sleep = UC8176_Sleep, .read_temp = UC8176_Read_Temp, .force_temp = UC8176_Force_Temp, - .cmd_write_ram1 = CMD_DTM1, - .cmd_write_ram2 = CMD_DTM2, }; // UC8176 400x300 Black/White