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.
This commit is contained in:
Jochen Keil 2021-05-04 23:18:17 +02:00
commit df884532ac

View file

@ -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();
}