From df884532ac77d69053c65665e8745f0b09284c79 Mon Sep 17 00:00:00 2001 From: Jochen Keil <1392715+jchnkl@users.noreply.github.com> Date: Tue, 4 May 2021 23:18:17 +0200 Subject: [PATCH] Performance improvements Apply the same technique from #104 and #130 to the C library. The low level lib provides a function to send byte arrays instead of single bytes. Where possible loops and multiple single byte send calls were replaced with this function. --- .../c/lib/e-Paper/EPD_2in13_V2.c | 134 +++++++++++------- 1 file changed, 82 insertions(+), 52 deletions(-) diff --git a/RaspberryPi_JetsonNano/c/lib/e-Paper/EPD_2in13_V2.c b/RaspberryPi_JetsonNano/c/lib/e-Paper/EPD_2in13_V2.c index d00b5b0..6c9e287 100644 --- a/RaspberryPi_JetsonNano/c/lib/e-Paper/EPD_2in13_V2.c +++ b/RaspberryPi_JetsonNano/c/lib/e-Paper/EPD_2in13_V2.c @@ -128,6 +128,19 @@ static void EPD_2IN13_V2_SendData(UBYTE Data) DEV_Digital_Write(EPD_CS_PIN, 1); } +/****************************************************************************** +function : send data +parameter: + Data : Write data +******************************************************************************/ +static void EPD_2IN13_V2_SendData_nByte(uint8_t *pData, uint32_t len) +{ + DEV_Digital_Write(EPD_DC_PIN, 1); + DEV_Digital_Write(EPD_CS_PIN, 0); + DEV_SPI_Write_nByte(pData, len); + DEV_Digital_Write(EPD_CS_PIN, 1); +} + /****************************************************************************** function : Wait until the busy_pin goes LOW parameter: @@ -170,9 +183,10 @@ parameter: ******************************************************************************/ void EPD_2IN13_V2_Init(UBYTE Mode) { - UBYTE count; EPD_2IN13_V2_Reset(); + uint8_t data[7]; + if(Mode == EPD_2IN13_V2_FULL) { EPD_2IN13_V2_ReadBusy(); EPD_2IN13_V2_SendCommand(0x12); // soft reset @@ -183,23 +197,26 @@ void EPD_2IN13_V2_Init(UBYTE Mode) EPD_2IN13_V2_SendCommand(0x7E); //set digital block control EPD_2IN13_V2_SendData(0x3B); + data[0] = 0xF9; + data[1] = 0x00; + data[2] = 0x00; EPD_2IN13_V2_SendCommand(0x01); //Driver output control - EPD_2IN13_V2_SendData(0xF9); - EPD_2IN13_V2_SendData(0x00); - EPD_2IN13_V2_SendData(0x00); + EPD_2IN13_V2_SendData_nByte(&data[0], 3); EPD_2IN13_V2_SendCommand(0x11); //data entry mode EPD_2IN13_V2_SendData(0x01); + data[0] = 0x00; + data[1] = 0x0F; EPD_2IN13_V2_SendCommand(0x44); //set Ram-X address start/end position - EPD_2IN13_V2_SendData(0x00); - EPD_2IN13_V2_SendData(0x0F); //0x0C-->(15+1)*8=128 + EPD_2IN13_V2_SendData_nByte(&data[0], 2); + data[0] = 0xF9; + data[1] = 0x00; + data[2] = 0x00; + data[3] = 0x00; EPD_2IN13_V2_SendCommand(0x45); //set Ram-Y address start/end position - EPD_2IN13_V2_SendData(0xF9); //0xF9-->(249+1)=250 - EPD_2IN13_V2_SendData(0x00); - EPD_2IN13_V2_SendData(0x00); - EPD_2IN13_V2_SendData(0x00); + EPD_2IN13_V2_SendData_nByte(&data[0], 4); EPD_2IN13_V2_SendCommand(0x3C); //BorderWavefrom EPD_2IN13_V2_SendData(0x03); @@ -210,10 +227,11 @@ void EPD_2IN13_V2_Init(UBYTE Mode) EPD_2IN13_V2_SendCommand(0x03); EPD_2IN13_V2_SendData(EPD_2IN13_V2_lut_full_update[70]); + data[0] = EPD_2IN13_V2_lut_full_update[71]; + data[1] = EPD_2IN13_V2_lut_full_update[72]; + data[2] = EPD_2IN13_V2_lut_full_update[73]; EPD_2IN13_V2_SendCommand(0x04); // - EPD_2IN13_V2_SendData(EPD_2IN13_V2_lut_full_update[71]); - EPD_2IN13_V2_SendData(EPD_2IN13_V2_lut_full_update[72]); - EPD_2IN13_V2_SendData(EPD_2IN13_V2_lut_full_update[73]); + EPD_2IN13_V2_SendData_nByte(&data[0], 3); EPD_2IN13_V2_SendCommand(0x3A); //Dummy Line EPD_2IN13_V2_SendData(EPD_2IN13_V2_lut_full_update[74]); @@ -221,15 +239,14 @@ void EPD_2IN13_V2_Init(UBYTE Mode) EPD_2IN13_V2_SendData(EPD_2IN13_V2_lut_full_update[75]); EPD_2IN13_V2_SendCommand(0x32); - for(count = 0; count < 70; count++) { - EPD_2IN13_V2_SendData(EPD_2IN13_V2_lut_full_update[count]); - } + EPD_2IN13_V2_SendData_nByte((uint8_t*)&EPD_2IN13_V2_lut_full_update[0], 70); EPD_2IN13_V2_SendCommand(0x4E); // set RAM x address count to 0; EPD_2IN13_V2_SendData(0x00); + data[0] = 0xF9; + data[1] = 0x00; EPD_2IN13_V2_SendCommand(0x4F); // set RAM y address count to 0X127; - EPD_2IN13_V2_SendData(0xF9); - EPD_2IN13_V2_SendData(0x00); + EPD_2IN13_V2_SendData_nByte(&data[0], 2); EPD_2IN13_V2_ReadBusy(); } else if(Mode == EPD_2IN13_V2_PART) { EPD_2IN13_V2_SendCommand(0x2C); //VCOM Voltage @@ -238,18 +255,17 @@ void EPD_2IN13_V2_Init(UBYTE Mode) EPD_2IN13_V2_ReadBusy(); EPD_2IN13_V2_SendCommand(0x32); - for(count = 0; count < 70; count++) { - EPD_2IN13_V2_SendData(EPD_2IN13_V2_lut_partial_update[count]); - } + EPD_2IN13_V2_SendData_nByte((uint8_t*)&EPD_2IN13_V2_lut_partial_update[0], 70); + data[0] = 0x00; + data[1] = 0x00; + data[2] = 0x00; + data[3] = 0x00; + data[4] = 0x40; + data[5] = 0x00; + data[6] = 0x00; EPD_2IN13_V2_SendCommand(0x37); - EPD_2IN13_V2_SendData(0x00); - EPD_2IN13_V2_SendData(0x00); - EPD_2IN13_V2_SendData(0x00); - EPD_2IN13_V2_SendData(0x00); - EPD_2IN13_V2_SendData(0x40); - EPD_2IN13_V2_SendData(0x00); - EPD_2IN13_V2_SendData(0x00); + EPD_2IN13_V2_SendData_nByte(&data[0], 7); EPD_2IN13_V2_SendCommand(0x22); EPD_2IN13_V2_SendData(0xC0); @@ -273,13 +289,15 @@ void EPD_2IN13_V2_Clear(void) UWORD Width, Height; Width = (EPD_2IN13_V2_WIDTH % 8 == 0)? (EPD_2IN13_V2_WIDTH / 8 ): (EPD_2IN13_V2_WIDTH / 8 + 1); Height = EPD_2IN13_V2_HEIGHT; + uint32_t len = Height * Width; + uint8_t data[len]; + + for (UWORD n = 0; n < len; n++) { + data[n] = 0xFF; + } EPD_2IN13_V2_SendCommand(0x24); - for (UWORD j = 0; j < Height; j++) { - for (UWORD i = 0; i < Width; i++) { - EPD_2IN13_V2_SendData(0XFF); - } - } + EPD_2IN13_V2_SendData_nByte(&data[0], len); EPD_2IN13_V2_TurnOnDisplay(); } @@ -293,13 +311,17 @@ void EPD_2IN13_V2_Display(UBYTE *Image) UWORD Width, Height; Width = (EPD_2IN13_V2_WIDTH % 8 == 0)? (EPD_2IN13_V2_WIDTH / 8 ): (EPD_2IN13_V2_WIDTH / 8 + 1); Height = EPD_2IN13_V2_HEIGHT; + uint32_t len = Height * Width; + uint8_t data[len]; - EPD_2IN13_V2_SendCommand(0x24); - for (UWORD j = 0; j < Height; j++) { + for (UWORD j = 0, n = 0; j < Height; j++) { for (UWORD i = 0; i < Width; i++) { - EPD_2IN13_V2_SendData(Image[i + j * Width]); + data[n++] = Image[i + j * Width]; } } + + EPD_2IN13_V2_SendCommand(0x24); + EPD_2IN13_V2_SendData_nByte(&data[0], len); EPD_2IN13_V2_TurnOnDisplay(); } @@ -313,22 +335,25 @@ void EPD_2IN13_V2_DisplayPartBaseImage(UBYTE *Image) UWORD Width, Height; Width = (EPD_2IN13_V2_WIDTH % 8 == 0)? (EPD_2IN13_V2_WIDTH / 8 ): (EPD_2IN13_V2_WIDTH / 8 + 1); Height = EPD_2IN13_V2_HEIGHT; + uint32_t len = Height * Width; + uint8_t data24[len]; + uint8_t data26[len]; + + for (UWORD j = 0, n = 0; j < Height; j++) { + for (UWORD i = 0; i < Width; i++) { + int addr = i + j * Width; + data24[n] = Image[addr]; + data26[n] = Image[addr]; + n = n + 1; + } + } - UDOUBLE Addr = 0; EPD_2IN13_V2_SendCommand(0x24); - for (UWORD j = 0; j < Height; j++) { - for (UWORD i = 0; i < Width; i++) { - Addr = i + j * Width; - EPD_2IN13_V2_SendData(Image[Addr]); - } - } + EPD_2IN13_V2_SendData_nByte(&data24[0], len); + EPD_2IN13_V2_SendCommand(0x26); - for (UWORD j = 0; j < Height; j++) { - for (UWORD i = 0; i < Width; i++) { - Addr = i + j * Width; - EPD_2IN13_V2_SendData(Image[Addr]); - } - } + EPD_2IN13_V2_SendData_nByte(&data26[0], len); + EPD_2IN13_V2_TurnOnDisplay(); } @@ -338,13 +363,18 @@ void EPD_2IN13_V2_DisplayPart(UBYTE *Image) UWORD Width, Height; Width = (EPD_2IN13_V2_WIDTH % 8 == 0)? (EPD_2IN13_V2_WIDTH / 8 ): (EPD_2IN13_V2_WIDTH / 8 + 1); Height = EPD_2IN13_V2_HEIGHT; - EPD_2IN13_V2_SendCommand(0x24); - for (UWORD j = 0; j < Height; j++) { + uint32_t len = Height * Width; + uint8_t data[len]; + + for (UWORD j = 0, n = 0; j < Height; j++) { for (UWORD i = 0; i < Width; i++) { - EPD_2IN13_V2_SendData(Image[i + j * Width]); + data[n++] = Image[i + j * Width]; } } + EPD_2IN13_V2_SendCommand(0x24); + EPD_2IN13_V2_SendData_nByte(&data[0], len); + EPD_2IN13_V2_TurnOnDisplayPart(); }