From d094734b02d2eb967fa3ce77a8deb41800854596 Mon Sep 17 00:00:00 2001 From: Shuanglei Tao Date: Fri, 21 Feb 2025 22:28:33 +0800 Subject: [PATCH] cleanup driver code --- EPD/EPD_4in2b_V2.c | 192 ----------------------------------- EPD/{EPD_4in2.c => UC8176.c} | 48 ++++++++- Keil/EPD.uvprojx | 18 +--- Makefile | 3 +- 4 files changed, 52 insertions(+), 209 deletions(-) delete mode 100644 EPD/EPD_4in2b_V2.c rename EPD/{EPD_4in2.c => UC8176.c} (81%) diff --git a/EPD/EPD_4in2b_V2.c b/EPD/EPD_4in2b_V2.c deleted file mode 100644 index e8018ac..0000000 --- a/EPD/EPD_4in2b_V2.c +++ /dev/null @@ -1,192 +0,0 @@ -/***************************************************************************** -* | File : EPD_4in2b_V2.c -* | Author : Waveshare team -* | Function : 4.2inch e-paper b V2 -* | Info : -*---------------- -* | This version: V1.0 -* | Date : 2020-11-27 -* ----------------------------------------------------------------------------- -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documnetation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# -******************************************************************************/ -#include "EPD_driver.h" - -// Display resolution -#define EPD_4IN2B_V2_WIDTH 400 -#define EPD_4IN2B_V2_HEIGHT 300 - -/****************************************************************************** -function : Software reset -parameter: -******************************************************************************/ -static void EPD_4IN2B_V2_Reset(void) -{ - DEV_Digital_Write(EPD_RST_PIN, 1); - DEV_Delay_ms(200); - DEV_Digital_Write(EPD_RST_PIN, 0); - DEV_Delay_ms(2); - DEV_Digital_Write(EPD_RST_PIN, 1); - DEV_Delay_ms(200); -} - -/****************************************************************************** -function : Wait until the busy_pin goes LOW -parameter: -******************************************************************************/ -void EPD_4IN2B_V2_ReadBusy(void) -{ - do{ - EPD_WriteCommand(0x71); - DEV_Delay_ms(50); - }while(!(DEV_Digital_Read(EPD_BUSY_PIN))); - DEV_Delay_ms(50); -} - -void EPD_4IN2B_V2_PowerOn(void) -{ - EPD_WriteCommand(0x04); - EPD_4IN2B_V2_ReadBusy(); -} - -void EPD_4IN2B_V2_PowerOff(void) -{ - EPD_WriteCommand(0x02); - EPD_4IN2B_V2_ReadBusy(); -} - -/****************************************************************************** -function : Turn On Display -parameter: -******************************************************************************/ -void EPD_4IN2B_V2_Refresh(void) -{ - EPD_4IN2B_V2_PowerOn(); - EPD_WriteCommand(0x12); // DISPLAY_REFRESH - DEV_Delay_ms(100); - EPD_4IN2B_V2_ReadBusy(); - EPD_4IN2B_V2_PowerOff(); -} - -/****************************************************************************** -function : Initialize the e-Paper register -parameter: -******************************************************************************/ -void EPD_4IN2B_V2_Init(void) -{ - EPD_4IN2B_V2_Reset(); - - EPD_WriteCommand(0x00); - EPD_WriteByte(0x0f); -} - -/****************************************************************************** -function : Clear screen -parameter: -******************************************************************************/ -void EPD_4IN2B_V2_Clear(void) -{ - UWORD Width, Height; - Width = (EPD_4IN2B_V2_WIDTH % 8 == 0)? (EPD_4IN2B_V2_WIDTH / 8 ): (EPD_4IN2B_V2_WIDTH / 8 + 1); - Height = EPD_4IN2B_V2_HEIGHT; - - EPD_WriteCommand(0x10); - for (UWORD j = 0; j < Height; j++) { - for (UWORD i = 0; i < Width; i++) { - EPD_WriteByte(0xFF); - } - } - - EPD_WriteCommand(0x13); - for (UWORD j = 0; j < Height; j++) { - for (UWORD i = 0; i < Width; i++) { - EPD_WriteByte(0xFF); - } - } - - EPD_4IN2B_V2_Refresh(); -} - -static void _setPartialRamArea(UWORD x, UWORD y, UWORD w, UWORD h) -{ - UWORD xe = (x + w - 1) | 0x0007; // byte boundary inclusive (last byte) - UWORD ye = y + h - 1; - x &= 0xFFF8; // byte boundary - xe |= 0x0007; // byte boundary - EPD_WriteCommand(0x90); // partial window - EPD_WriteByte(x / 256); - EPD_WriteByte(x % 256); - EPD_WriteByte(xe / 256); - EPD_WriteByte(xe % 256); - EPD_WriteByte(y / 256); - EPD_WriteByte(y % 256); - EPD_WriteByte(ye / 256); - EPD_WriteByte(ye % 256); - EPD_WriteByte(0x00); // distortion on right half -} - -void EPD_4IN2B_V2_Write_Image(UBYTE *black, UBYTE *color, UWORD x, UWORD y, UWORD w, UWORD h) -{ - UWORD wb = (w + 7) / 8; // width bytes, bitmaps are padded - x -= x % 8; // byte boundary - w = wb * 8; // byte boundary - if (x + w > EPD_4IN2B_V2_WIDTH || y + h > EPD_4IN2B_V2_HEIGHT) return; - EPD_WriteCommand(0x91); // partial in - _setPartialRamArea(x, y, w, h); - EPD_WriteCommand(0x10); - for (UWORD i = 0; i < h; i++) { - for (UWORD j = 0; j < w / 8; j++) { - EPD_WriteByte(black ? black[j + i * wb] : 0xFF); - } - } - EPD_WriteCommand(0x13); - for (UWORD i = 0; i < h; i++) { - for (UWORD j = 0; j < w / 8; j++) { - EPD_WriteByte(color ? color[j + i * wb] : 0xFF); - } - } - EPD_WriteCommand(0x92); // partial out -} - -/****************************************************************************** -function : Enter sleep mode -parameter: -******************************************************************************/ -void EPD_4IN2B_V2_Sleep(void) -{ - EPD_4IN2B_V2_PowerOff(); - - EPD_WriteCommand(0X07); // deep sleep - EPD_WriteByte(0xA5); -} - -const epd_driver_t epd_driver_4in2bv2 = { - .id = EPD_DRIVER_4IN2B_V2, - .width = EPD_4IN2B_V2_WIDTH, - .height = EPD_4IN2B_V2_HEIGHT, - .init = EPD_4IN2B_V2_Init, - .clear = EPD_4IN2B_V2_Clear, - .send_command = EPD_WriteCommand, - .send_byte = EPD_WriteByte, - .send_data = EPD_WriteData, - .write_image = EPD_4IN2B_V2_Write_Image, - .refresh = EPD_4IN2B_V2_Refresh, - .sleep = EPD_4IN2B_V2_Sleep, -}; diff --git a/EPD/EPD_4in2.c b/EPD/UC8176.c similarity index 81% rename from EPD/EPD_4in2.c rename to EPD/UC8176.c index 33bb210..7238282 100644 --- a/EPD/EPD_4in2.c +++ b/EPD/UC8176.c @@ -101,6 +101,14 @@ void EPD_4IN2_Init(void) EPD_WriteByte(0x97); // LUTB=0 LUTW=1 interval=10 } +void EPD_4IN2B_V2_Init(void) +{ + EPD_4IN2_Reset(); + + EPD_WriteCommand(0x00); + EPD_WriteByte(0x0f); +} + /****************************************************************************** function : Clear screen parameter: @@ -133,6 +141,7 @@ static void _setPartialRamArea(UWORD x, UWORD y, UWORD w, UWORD h) uint16_t xe = (x + w - 1) | 0x0007; // byte boundary inclusive (last byte) uint16_t ye = y + h - 1; x &= 0xFFF8; // byte boundary + xe |= 0x0007; // byte boundary EPD_WriteCommand(0x90); // partial window EPD_WriteByte(x / 256); EPD_WriteByte(x % 256); @@ -162,6 +171,29 @@ void EPD_4IN2_Write_Image(UBYTE *black, UBYTE *color, UWORD x, UWORD y, UWORD w, EPD_WriteCommand(0x92); // partial out } +void EPD_4IN2B_V2_Write_Image(UBYTE *black, UBYTE *color, UWORD x, UWORD y, UWORD w, UWORD h) +{ + UWORD wb = (w + 7) / 8; // width bytes, bitmaps are padded + x -= x % 8; // byte boundary + w = wb * 8; // byte boundary + if (x + w > EPD_4IN2_WIDTH || y + h > EPD_4IN2_HEIGHT) return; + EPD_WriteCommand(0x91); // partial in + _setPartialRamArea(x, y, w, h); + EPD_WriteCommand(0x10); + for (UWORD i = 0; i < h; i++) { + for (UWORD j = 0; j < w / 8; j++) { + EPD_WriteByte(black ? black[j + i * wb] : 0xFF); + } + } + EPD_WriteCommand(0x13); + for (UWORD i = 0; i < h; i++) { + for (UWORD j = 0; j < w / 8; j++) { + EPD_WriteByte(color ? color[j + i * wb] : 0xFF); + } + } + EPD_WriteCommand(0x92); // partial out +} + /****************************************************************************** function : Enter sleep mode parameter: @@ -170,7 +202,7 @@ void EPD_4IN2_Sleep(void) { EPD_4IN2_PowerOff(); - EPD_WriteCommand(0x07); // deep sleep + EPD_WriteCommand(0x07); EPD_WriteByte(0XA5); } @@ -187,3 +219,17 @@ const epd_driver_t epd_driver_4in2 = { .refresh = EPD_4IN2_Refresh, .sleep = EPD_4IN2_Sleep, }; + +const epd_driver_t epd_driver_4in2bv2 = { + .id = EPD_DRIVER_4IN2B_V2, + .width = EPD_4IN2_WIDTH, + .height = EPD_4IN2_HEIGHT, + .init = EPD_4IN2B_V2_Init, + .clear = EPD_4IN2_Clear, + .send_command = EPD_WriteCommand, + .send_byte = EPD_WriteByte, + .send_data = EPD_WriteData, + .write_image = EPD_4IN2B_V2_Write_Image, + .refresh = EPD_4IN2_Refresh, + .sleep = EPD_4IN2_Sleep, +}; diff --git a/Keil/EPD.uvprojx b/Keil/EPD.uvprojx index 25801a0..991ea0f 100644 --- a/Keil/EPD.uvprojx +++ b/Keil/EPD.uvprojx @@ -410,14 +410,9 @@ ..\EPD\EPD_driver.c - EPD_4in2.c + UC8176.c 1 - ..\EPD\EPD_4in2.c - - - EPD_4in2b_V2.c - 1 - ..\EPD\EPD_4in2b_V2.c + ..\EPD\UC8176.c @@ -1002,14 +997,9 @@ ..\EPD\EPD_driver.c - EPD_4in2.c + UC8176.c 1 - ..\EPD\EPD_4in2.c - - - EPD_4in2b_V2.c - 1 - ..\EPD\EPD_4in2b_V2.c + ..\EPD\UC8176.c diff --git a/Makefile b/Makefile index a48e27f..b776210 100644 --- a/Makefile +++ b/Makefile @@ -34,8 +34,7 @@ SRC_FILES += \ $(SDK_ROOT)/components/toolchain/system_nrf51.c \ $(SDK_ROOT)/components/softdevice/common/softdevice_handler/softdevice_handler.c \ $(PROJ_DIR)/main.c \ - $(PROJ_DIR)/EPD/EPD_4in2.c \ - $(PROJ_DIR)/EPD/EPD_4in2b_V2.c \ + $(PROJ_DIR)/EPD/UC8176.c \ $(PROJ_DIR)/EPD/EPD_driver.c \ $(PROJ_DIR)/EPD/EPD_ble.c \ $(PROJ_DIR)/GUI/Calendar.c \