瀏覽代碼

Fix file loss caused by program version update

shhds 2 年之前
父節點
當前提交
7621f7d4cf

+ 3 - 0
RaspberryPi_JetsonNano/c/Makefile

@@ -105,6 +105,9 @@ else ifeq ($(EPD), epd2in13bV4)
 else ifeq ($(EPD), epd2in13d)
 	OBJ_C_EPD = ${DIR_EPD}/EPD_2in13d.c
 	OBJ_C_Examples = ${DIR_Examples}/EPD_2in13d_test.c
+else ifeq ($(EPD), epd2in13g)
+	OBJ_C_EPD = ${DIR_EPD}/EPD_2in13g.c
+	OBJ_C_Examples = ${DIR_Examples}/EPD_2in13g_test.c
 else ifeq ($(EPD), epd3in52)
 	OBJ_C_EPD = ${DIR_EPD}/EPD_3in52.c
 	OBJ_C_Examples = ${DIR_Examples}/EPD_3in52_test.c

+ 162 - 0
RaspberryPi_JetsonNano/c/examples/EPD_2in13g_test.c

@@ -0,0 +1,162 @@
+/*****************************************************************************
+* | File      	:   EPD_2in13g_test.c
+* | Author      :   Waveshare team
+* | Function    :   2inch13 e-paper (G) test demo
+* | Info        :
+*----------------
+* |	This version:   V1.0
+* | Date        :   2023-05-29
+* | Info        :
+#
+# 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_Test.h"
+#include "EPD_2in13g.h"
+#include "time.h"
+
+int EPD_2in13g_test(void)
+{
+    printf("EPD_2IN13G_test Demo\r\n");
+    if(DEV_Module_Init()!=0){
+        return -1;
+    }
+
+    printf("e-Paper Init and Clear...\r\n");
+    EPD_2IN13G_Init();
+
+	struct timespec start={0,0}, finish={0,0}; 
+    clock_gettime(CLOCK_REALTIME, &start);
+    EPD_2IN13G_Clear(EPD_2IN13G_WHITE); // White
+    clock_gettime(CLOCK_REALTIME, &finish);
+    printf("%ld S\r\n", finish.tv_sec-start.tv_sec);	
+    DEV_Delay_ms(2000);
+
+    //Create a new image cache
+    UBYTE *BlackImage;
+    UWORD Imagesize = ((EPD_2IN13G_WIDTH % 4 == 0)? (EPD_2IN13G_WIDTH / 4 ): (EPD_2IN13G_WIDTH / 4 + 1)) * EPD_2IN13G_HEIGHT;
+    if((BlackImage = (UBYTE *)malloc(Imagesize)) == NULL) {
+        printf("Failed to apply for black memory...\r\n");
+        return -1;
+    }
+    printf("Paint_NewImage\r\n");
+    Paint_NewImage(BlackImage, EPD_2IN13G_WIDTH, EPD_2IN13G_HEIGHT, 0, EPD_2IN13G_WHITE);
+    Paint_SetScale(4);
+
+#if 1   // show bmp
+    printf("show BMP-----------------\r\n");
+    Paint_SelectImage(BlackImage);
+    GUI_ReadBmp_RGB_4Color("./pic/2in13g.bmp", 0, 0);
+    EPD_2IN13G_Display(BlackImage);
+    DEV_Delay_ms(2000);
+#endif
+
+#if 1   // Drawing on the image
+    Paint_NewImage(BlackImage, EPD_2IN13G_WIDTH, EPD_2IN13G_HEIGHT, 90, EPD_2IN13G_WHITE);
+    Paint_SetScale(4);
+    //1.Select Image
+    printf("SelectImage:BlackImage\r\n");
+    Paint_SelectImage(BlackImage);
+    Paint_Clear(EPD_2IN13G_WHITE);
+
+    // 2.Drawing on the image
+    printf("Drawing:BlackImage\r\n");
+    Paint_DrawPoint(10, 80, EPD_2IN13G_RED, DOT_PIXEL_1X1, DOT_STYLE_DFT);
+    Paint_DrawPoint(10, 90, EPD_2IN13G_YELLOW, DOT_PIXEL_2X2, DOT_STYLE_DFT);
+    Paint_DrawPoint(10, 100, EPD_2IN13G_BLACK, DOT_PIXEL_3X3, DOT_STYLE_DFT);
+    Paint_DrawLine(20, 70, 70, 120, EPD_2IN13G_RED, DOT_PIXEL_1X1, LINE_STYLE_SOLID);
+    Paint_DrawLine(70, 70, 20, 120, EPD_2IN13G_RED, DOT_PIXEL_1X1, LINE_STYLE_SOLID);
+    Paint_DrawRectangle(20, 70, 70, 120, EPD_2IN13G_YELLOW, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);
+    Paint_DrawRectangle(80, 70, 130, 120, EPD_2IN13G_YELLOW, DOT_PIXEL_1X1, DRAW_FILL_FULL);
+    Paint_DrawCircle(45, 95, 20, EPD_2IN13G_BLACK, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);
+    Paint_DrawCircle(105, 95, 20, EPD_2IN13G_BLACK, DOT_PIXEL_1X1, DRAW_FILL_FULL);
+    Paint_DrawLine(85, 95, 125, 95, EPD_2IN13G_RED, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);
+    Paint_DrawLine(105, 75, 105, 115, EPD_2IN13G_YELLOW, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);
+    Paint_DrawString_EN(0, 0, "Red,yellow,white,black", &Font16, EPD_2IN13G_RED, EPD_2IN13G_YELLOW);
+    Paint_DrawString_EN(0, 16, "Four color e-Paper", &Font12, EPD_2IN13G_YELLOW, EPD_2IN13G_BLACK);
+    Paint_DrawString_CN(120, 28, "΢ѩµç×Ó", &Font24CN, EPD_2IN13G_RED, EPD_2IN13G_WHITE);
+    Paint_DrawNum(0, 28, 123456, &Font12, EPD_2IN13G_RED, EPD_2IN13G_WHITE);
+
+    printf("EPD_Display\r\n");
+    EPD_2IN13G_Display(BlackImage);
+    DEV_Delay_ms(3000);
+#endif
+
+    Paint_NewImage(BlackImage, EPD_2IN13G_WIDTH, EPD_2IN13G_HEIGHT, 0, EPD_2IN13G_WHITE);
+    Paint_SetScale(4);
+
+#if 1   // Drawing on the image
+    //1.Select Image
+    printf("SelectImage:BlackImage\r\n");
+    Paint_SelectImage(BlackImage);
+    Paint_Clear(EPD_2IN13G_WHITE);
+
+    // 2.Drawing on the image
+    printf("Drawing:BlackImage\r\n");
+    Paint_DrawRectangle(1, 1, EPD_2IN13G_WIDTH, EPD_2IN13G_HEIGHT/4, EPD_2IN13G_RED, DOT_PIXEL_1X1, DRAW_FILL_FULL);
+    Paint_DrawRectangle(1, EPD_2IN13G_HEIGHT/4, EPD_2IN13G_WIDTH, EPD_2IN13G_HEIGHT/2, EPD_2IN13G_YELLOW, DOT_PIXEL_1X1, DRAW_FILL_FULL);
+    Paint_DrawRectangle(1, EPD_2IN13G_HEIGHT/2, EPD_2IN13G_WIDTH, 3*EPD_2IN13G_HEIGHT/4, EPD_2IN13G_BLACK, DOT_PIXEL_1X1, DRAW_FILL_FULL);
+
+    printf("EPD_Display\r\n");
+    EPD_2IN13G_Display(BlackImage);
+    DEV_Delay_ms(3000);
+#endif
+
+#if 1   // Drawing on the image
+    //1.Select Image
+    printf("SelectImage:BlackImage\r\n");
+    Paint_SelectImage(BlackImage);
+    Paint_Clear(EPD_2IN13G_WHITE);
+
+    int hNumber, hWidth, vNumber, vWidth;
+    hNumber = 20;
+	hWidth = EPD_2IN13G_HEIGHT/hNumber;
+    vNumber = 8;
+	vWidth = EPD_2IN13G_WIDTH/vNumber;
+
+    // 2.Drawing on the image
+    printf("Drawing:BlackImage\r\n");
+	for(int i=0; i<hNumber; i++) {  // horizontal
+		Paint_DrawRectangle(1, 1+i*hWidth, EPD_2IN13G_WIDTH, hWidth*(1+i), EPD_2IN13G_BLACK + (i % 2), DOT_PIXEL_1X1, DRAW_FILL_FULL);
+	}
+	for(int i=0; i<vNumber; i++) {  // vertical
+        if(i%2) {
+            Paint_DrawRectangle(1+i*vWidth, 1, vWidth*(i+1), EPD_2IN13G_HEIGHT, EPD_2IN13G_YELLOW + (i/2%2), DOT_PIXEL_1X1, DRAW_FILL_FULL);
+        }
+	}
+    printf("EPD_Display\r\n");
+    EPD_2IN13G_Display(BlackImage);
+    DEV_Delay_ms(3000);
+#endif
+
+    printf("Clear...\r\n");
+    EPD_2IN13G_Clear(EPD_2IN13G_WHITE);
+
+    printf("Goto Sleep...\r\n");
+    EPD_2IN13G_Sleep();
+    free(BlackImage);
+    BlackImage = NULL;
+    DEV_Delay_ms(2000);//important, at least 2s
+    // close 5V
+    printf("close 5V, Module enters 0 power consumption ...\r\n");
+    DEV_Module_Exit();
+    
+    return 0;
+}
+

+ 1 - 0
RaspberryPi_JetsonNano/c/examples/EPD_Test.h

@@ -76,6 +76,7 @@ int EPD_2in13bc_test(void);
 int EPD_2in13b_V3_test(void);
 int EPD_2in13b_V4_test(void);
 int EPD_2in13d_test(void);
+int EPD_2in13g_test(void);
 
 int EPD_3in52_test(void);
 

+ 3 - 0
RaspberryPi_JetsonNano/c/examples/main.c

@@ -114,6 +114,9 @@ int main(void)
     
 #elif epd2in13d
     EPD_2in13d_test();
+
+#elif epd2in13g
+    EPD_2in13g_test();
     
 #elif epd3in52
     EPD_3in52_test();

+ 10 - 0
RaspberryPi_JetsonNano/c/lib/GUI/GUI_BMPfile.c

@@ -422,6 +422,16 @@ UBYTE GUI_ReadBmp_RGB_4Color(const char *path, UWORD Xstart, UWORD Ystart)
 				Image[x+(y* bmpInfoHeader.biWidth )] =  3;//Red
 			}
         }
+        if(bmpInfoHeader.biWidth % 4 != 0)
+        {
+            for (UWORD i = 0; i < (bmpInfoHeader.biWidth % 4); i++)
+            {
+                if(fread((char *)Rdata, 1, 1, fp) != 1) {
+                perror("get bmpdata:\r\n");
+                break;
+                }
+            }
+        }
     }
     fclose(fp);
    

+ 237 - 0
RaspberryPi_JetsonNano/c/lib/e-Paper/EPD_2in13g.c

@@ -0,0 +1,237 @@
+/*****************************************************************************
+* | File      	:   EPD_2in13g.c
+* | Author      :   Waveshare team
+* | Function    :   2inch13 e-paper (G)
+* | Info        :
+*----------------
+* |	This version:   V1.0
+* | Date        :   2023-05-29
+* | Info        :
+* -----------------------------------------------------------------------------
+#
+# 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_2in13g.h"
+#include "Debug.h" 
+
+UWORD Source_BITS = EPD_2IN13G_WIDTH;
+UWORD Gate_BITS = EPD_2IN13G_HEIGHT;
+
+/******************************************************************************
+function :	Software reset
+parameter:
+******************************************************************************/
+static void EPD_2IN13G_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 :	send command
+parameter:
+     Reg : Command register
+******************************************************************************/
+static void EPD_2IN13G_SendCommand(UBYTE Reg)
+{
+    DEV_Digital_Write(EPD_DC_PIN, 0);
+    DEV_Digital_Write(EPD_CS_PIN, 0);   
+    DEV_SPI_WriteByte(Reg);
+    DEV_Digital_Write(EPD_CS_PIN, 1);
+}
+
+/******************************************************************************
+function :	send data
+parameter:
+    Data : Write data
+******************************************************************************/
+static void EPD_2IN13G_SendData(UBYTE Data)
+{
+    DEV_Digital_Write(EPD_DC_PIN, 1);
+    DEV_Digital_Write(EPD_CS_PIN, 0);
+    DEV_SPI_WriteByte(Data);
+    DEV_Digital_Write(EPD_CS_PIN, 1);
+}
+
+/******************************************************************************
+function :	Wait until the busy_pin goes HIGH
+parameter:
+******************************************************************************/
+void EPD_2IN13G_ReadBusy(void)
+{
+    Debug("e-Paper busy\r\n");
+    DEV_Delay_ms(100);
+    while(DEV_Digital_Read(EPD_BUSY_PIN) != 1) {      //HIGH: idle, LOW: busy
+        DEV_Delay_ms(100);
+    }
+    Debug("e-Paper busy release\r\n");
+}
+
+/******************************************************************************
+function :	Turn On Display
+parameter:
+******************************************************************************/
+static void EPD_2IN13G_TurnOnDisplay(void)
+{
+
+    EPD_2IN13G_SendCommand(0x12); // DISPLAY_REFRESH
+    EPD_2IN13G_SendData(0x00);
+    EPD_2IN13G_ReadBusy();
+
+}
+
+/******************************************************************************
+function :	Setting the display window
+parameter:
+******************************************************************************/
+static void EPD_2IN9_V2_SetWindows(void)
+{
+    if(EPD_2IN13G_WIDTH < 128)
+        Source_BITS = 128;
+
+    EPD_2IN13G_SendCommand(0x61); //TRES
+    EPD_2IN13G_SendData(Source_BITS/256);		// EPD_2IN13G_WIDTH_H
+    EPD_2IN13G_SendData(Source_BITS%256);		// EPD_2IN13G_WIDTH_L
+    EPD_2IN13G_SendData(Gate_BITS/256);			// EPD_2IN13G_HEIGHT_H
+    EPD_2IN13G_SendData(Gate_BITS%256); 		// EPD_2IN13G_HEIGHT_L	
+}
+
+/******************************************************************************
+function :	Initialize the e-Paper register
+parameter:
+******************************************************************************/
+void EPD_2IN13G_Init(void)
+{
+    EPD_2IN13G_Reset();
+
+    EPD_2IN13G_ReadBusy();
+    EPD_2IN13G_SendCommand(0x4D);
+    EPD_2IN13G_SendData(0x78);
+
+    EPD_2IN13G_SendCommand(0x00);	//PSR
+    EPD_2IN13G_SendData(0x0F);
+    EPD_2IN13G_SendData(0x29);
+
+    EPD_2IN13G_SendCommand(0x01);	//PWRR
+    EPD_2IN13G_SendData(0x07);
+    EPD_2IN13G_SendData(0x00);
+
+    EPD_2IN13G_SendCommand(0x03);	//POFS
+    EPD_2IN13G_SendData(0x10);
+    EPD_2IN13G_SendData(0x54);
+    EPD_2IN13G_SendData(0x44);
+
+    EPD_2IN13G_SendCommand(0x06);	//BTST_P
+    EPD_2IN13G_SendData(0x05);
+    EPD_2IN13G_SendData(0x00);
+    EPD_2IN13G_SendData(0x3F);
+    EPD_2IN13G_SendData(0x0A);
+    EPD_2IN13G_SendData(0x25);
+    EPD_2IN13G_SendData(0x12);
+    EPD_2IN13G_SendData(0x1A); 
+
+    EPD_2IN13G_SendCommand(0x50);	//CDI
+    EPD_2IN13G_SendData(0x37);
+
+    EPD_2IN13G_SendCommand(0x60);	//TCON
+    EPD_2IN13G_SendData(0x02);
+    EPD_2IN13G_SendData(0x02);
+
+    EPD_2IN9_V2_SetWindows();  // Setting the display window
+
+    EPD_2IN13G_SendCommand(0xE7);
+    EPD_2IN13G_SendData(0x1C);
+
+    EPD_2IN13G_SendCommand(0xE3);	
+    EPD_2IN13G_SendData(0x22);
+
+    EPD_2IN13G_SendCommand(0xB4);
+    EPD_2IN13G_SendData(0xD0);
+    EPD_2IN13G_SendCommand(0xB5);
+    EPD_2IN13G_SendData(0x03);
+
+    EPD_2IN13G_SendCommand(0xE9);
+    EPD_2IN13G_SendData(0x01); 
+
+    EPD_2IN13G_SendCommand(0x30);
+    EPD_2IN13G_SendData(0x08);  
+
+    EPD_2IN13G_SendCommand(0x04);
+    EPD_2IN13G_ReadBusy(); 
+}
+
+/******************************************************************************
+function :	Clear screen
+parameter:
+******************************************************************************/
+void EPD_2IN13G_Clear(UBYTE color)
+{
+    UWORD Width, Height;
+    Width = Source_BITS / 4 ;
+    Height = EPD_2IN13G_HEIGHT;
+
+    EPD_2IN13G_SendCommand(0x10);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            EPD_2IN13G_SendData((color << 6) | (color << 4) | (color << 2) | color);
+        }
+    }
+
+    EPD_2IN13G_TurnOnDisplay();
+}
+
+/******************************************************************************
+function :	Sends the image buffer in RAM to e-Paper and displays
+parameter:
+******************************************************************************/
+void EPD_2IN13G_Display(UBYTE *Image)
+{
+    UWORD Width, Height;
+    Width = (EPD_2IN13G_WIDTH % 4 == 0)? (EPD_2IN13G_WIDTH / 4 ): (EPD_2IN13G_WIDTH / 4 + 1);
+    Height = EPD_2IN13G_HEIGHT;
+
+    EPD_2IN13G_SendCommand(0x10);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < (Source_BITS / 4); i++) {
+            if(i < 31 ) EPD_2IN13G_SendData(Image[i + j * Width]);
+            else EPD_2IN13G_SendData(0x00);
+        }
+    }
+
+    EPD_2IN13G_TurnOnDisplay();
+}
+
+/******************************************************************************
+function :	Enter sleep mode
+parameter:
+******************************************************************************/
+void EPD_2IN13G_Sleep(void)
+{
+    EPD_2IN13G_SendCommand(0x02); //power off
+    EPD_2IN13G_ReadBusy();       //waiting for the electronic paper IC to release the idle signal
+    DEV_Delay_ms(100);           //!!!The delay here is necessary,100mS at least!!! 
+    
+    EPD_2IN13G_SendCommand(0x07);  //deep sleep
+    EPD_2IN13G_SendData(0XA5);
+}

+ 32 - 0
RaspberryPi_JetsonNano/c/lib/e-Paper/EPD_2in13g.h

@@ -0,0 +1,32 @@
+/*****************************************************************************
+* | File      	:   EPD_2in13g.h
+* | Author      :   Waveshare team
+* | Function    :   2inch13 e-paper (G)
+* | Info        :
+*----------------
+* |	This version:   V1.0
+* | Date        :   2023-05-29
+* | Info        :
+* -----------------------------------------------------------------------------
+******************************************************************************/
+#ifndef __EPD_2IN13G_H_
+#define __EPD_2IN13G_H_
+
+#include "DEV_Config.h"
+
+// Display resolution
+#define EPD_2IN13G_WIDTH       122
+#define EPD_2IN13G_HEIGHT      250
+
+// Color
+#define  EPD_2IN13G_BLACK   0x0
+#define  EPD_2IN13G_WHITE   0x1
+#define  EPD_2IN13G_YELLOW  0x2
+#define  EPD_2IN13G_RED     0x3
+
+void EPD_2IN13G_Init(void);
+void EPD_2IN13G_Clear(UBYTE color);
+void EPD_2IN13G_Display(UBYTE *Image);
+void EPD_2IN13G_Sleep(void);
+
+#endif

+ 157 - 82
RaspberryPi_JetsonNano/c/lib/e-Paper/EPD_5in83.c

@@ -1,13 +1,69 @@
 /*****************************************************************************
-* | File      	:   EPD_5in83_V2.c
+* | File      	:   EPD_5in83.c
 * | Author      :   Waveshare team
-* | Function    :   5.83inch e-paper V2
+* | Function    :   5.83inch e-paper
 * | Info        :
 *----------------
-* |	This version:   V1.0
-* | Date        :   2020-11-23
+* |	This version:   V3.0
+* | Date        :   2019-06-13
 * | Info        :
 * -----------------------------------------------------------------------------
+* V3.0(2019-06-13):
+* 1.Change:
+*    EPD_Reset() => EPD_5IN83_Reset()
+*    EPD_SendCommand() => EPD_5IN83_SendCommand()
+*    EPD_SendData() => EPD_5IN83_SendData()
+*    EPD_WaitUntilIdle() => EPD_5IN83_ReadBusy()
+*    EPD_SetFullReg() => EPD_5IN83_SetFullReg()
+*    EPD_SetPartReg() => EPD_5IN83_SetPartReg()
+*    EPD_TurnOnDisplay() => EPD_5IN83_TurnOnDisplay()
+*    EPD_Init() => EPD_5IN83_Init()
+*    EPD_Clear() => EPD_5IN83_Clear()
+*    EPD_Display() => EPD_5IN83_Display()
+*    EPD_Sleep() => EPD_5IN83_Sleep()
+* 2.remove commands define:
+*    #define PANEL_SETTING                               0x00
+*    #define POWER_SETTING                               0x01
+*    #define POWER_OFF                                   0x02
+*    #define POWER_OFF_SEQUENCE_SETTING                  0x03
+*    #define POWER_ON                                    0x04
+*    #define POWER_ON_MEASURE                            0x05
+*    #define BOOSTER_SOFT_START                          0x06
+*    #define DEEP_SLEEP                                  0x07
+*    #define DATA_START_TRANSMISSION_1                   0x10
+*    #define DATA_STOP                                   0x11
+*    #define DISPLAY_REFRESH                             0x12
+*    #define DATA_START_TRANSMISSION_2                   0x13
+*    #define VCOM_LUT                                    0x20
+*    #define W2W_LUT                                     0x21
+*    #define B2W_LUT                                     0x22
+*    #define W2B_LUT                                     0x23
+*    #define B2B_LUT                                     0x24
+*    #define PLL_CONTROL                                 0x30
+*    #define TEMPERATURE_SENSOR_CALIBRATION              0x40
+*    #define TEMPERATURE_SENSOR_SELECTION                0x41
+*    #define TEMPERATURE_SENSOR_WRITE                    0x42
+*    #define TEMPERATURE_SENSOR_READ                     0x43
+*    #define VCOM_AND_DATA_INTERVAL_SETTING              0x50
+*    #define LOW_POWER_DETECTION                         0x51
+*    #define TCON_SETTING                                0x60
+*    #define RESOLUTION_SETTING                          0x61
+*    #define GET_STATUS                                  0x71
+*    #define AUTO_MEASURE_VCOM                           0x80
+*    #define READ_VCOM_VALUE                             0x81
+*    #define VCM_DC_SETTING                              0x82
+*    #define PARTIAL_WINDOW                              0x90
+*    #define PARTIAL_IN                                  0x91
+*    #define PARTIAL_OUT                                 0x92
+*    #define PROGRAM_MODE                                0xA0
+*    #define ACTIVE_PROGRAM                              0xA1
+*    #define READ_OTP_DATA                               0xA2
+*    #define POWER_SAVING                                0xE3
+* -----------------------------------------------------------------------------
+* V2.0(2018-11-09):
+* 1.Remove:ImageBuff[EPD_HEIGHT * EPD_WIDTH / 8]
+* 2.Change:EPD_Display(UBYTE *Image)
+*   Need to pass parameters: pointer to cached data
 #
 # Permission is hereby granted, free of charge, to any person obtaining a copy
 # of this software and associated documnetation files (the "Software"), to deal
@@ -28,19 +84,19 @@
 # THE SOFTWARE.
 #
 ******************************************************************************/
-#include "EPD_5in83_V2.h"
+#include "EPD_5in83.h"
 #include "Debug.h"
 
 /******************************************************************************
 function :	Software reset
 parameter:
 ******************************************************************************/
-static void EPD_5in83_V2_Reset(void)
+static void EPD_5IN83_Reset(void)
 {
     DEV_Digital_Write(EPD_RST_PIN, 1);
     DEV_Delay_ms(200);
     DEV_Digital_Write(EPD_RST_PIN, 0);
-    DEV_Delay_ms(5);
+    DEV_Delay_ms(2);
     DEV_Digital_Write(EPD_RST_PIN, 1);
     DEV_Delay_ms(200);
 }
@@ -50,7 +106,7 @@ function :	send command
 parameter:
      Reg : Command register
 ******************************************************************************/
-static void EPD_5in83_V2_SendCommand(UBYTE Reg)
+static void EPD_5IN83_SendCommand(UBYTE Reg)
 {
     DEV_Digital_Write(EPD_DC_PIN, 0);
     DEV_Digital_Write(EPD_CS_PIN, 0);
@@ -63,7 +119,7 @@ function :	send data
 parameter:
     Data : Write data
 ******************************************************************************/
-static void EPD_5in83_V2_SendData(UBYTE Data)
+static void EPD_5IN83_SendData(UBYTE Data)
 {
     DEV_Digital_Write(EPD_DC_PIN, 1);
     DEV_Digital_Write(EPD_CS_PIN, 0);
@@ -75,121 +131,140 @@ static void EPD_5in83_V2_SendData(UBYTE Data)
 function :	Wait until the busy_pin goes LOW
 parameter:
 ******************************************************************************/
-static void EPD_5in83_V2_ReadBusy(void)
+static void EPD_5IN83_ReadBusy(void)
 {
-	Debug("e-Paper busy\r\n");
-	do {
-		EPD_5in83_V2_SendCommand(0x71);
-		DEV_Delay_ms(10);    
-	}
-	while(!DEV_Digital_Read(EPD_BUSY_PIN));   
-	Debug("e-Paper busy release\r\n");
+    Debug("e-Paper busy\r\n");
+    while(DEV_Digital_Read(EPD_BUSY_PIN) == 0) {      //LOW: idle, HIGH: busy
+        DEV_Delay_ms(100);
+    }
+    Debug("e-Paper busy release\r\n");
 }
 
 /******************************************************************************
 function :	Turn On Display
 parameter:
 ******************************************************************************/
-static void EPD_5in83_V2_TurnOnDisplay(void)
+static void EPD_5IN83_TurnOnDisplay(void)
 {
-	EPD_5in83_V2_SendCommand(0x12);	//DISPLAY REFRESH 	
-	DEV_Delay_ms(100);					//!!!The delay here is necessary, 200uS at least!!!     
-	EPD_5in83_V2_ReadBusy();			//waiting for the electronic paper IC to release the idle signal
+    EPD_5IN83_SendCommand(0x12); // DISPLAY_REFRESH
+    DEV_Delay_ms(100);
+    EPD_5IN83_ReadBusy();
 }
 
 /******************************************************************************
 function :	Initialize the e-Paper register
 parameter:
 ******************************************************************************/
-void EPD_5in83_V2_Init(void)
+void EPD_5IN83_Init(void)
 {
-    EPD_5in83_V2_Reset();
+    EPD_5IN83_Reset();
+
+    EPD_5IN83_SendCommand(0x01); // POWER_SETTING
+    EPD_5IN83_SendData(0x37);
+    EPD_5IN83_SendData(0x00);
+
+    EPD_5IN83_SendCommand(0x00); // PANEL_SETTING
+    EPD_5IN83_SendData(0xCF);
+    EPD_5IN83_SendData(0x08);
+
+    EPD_5IN83_SendCommand(0x06); // BOOSTER_SOFT_START
+    EPD_5IN83_SendData(0xc7);
+    EPD_5IN83_SendData(0xcc);
+    EPD_5IN83_SendData(0x28);
 
-	EPD_5in83_V2_SendCommand(0x01);			//POWER SETTING
-	EPD_5in83_V2_SendData (0x07);
-	EPD_5in83_V2_SendData (0x07);    //VGH=20V,VGL=-20V
-	EPD_5in83_V2_SendData (0x3f);		//VDH=15V
-	EPD_5in83_V2_SendData (0x3f);		//VDL=-15V
+    EPD_5IN83_SendCommand(0x04); // POWER_ON
+    EPD_5IN83_ReadBusy();
 
-	EPD_5in83_V2_SendCommand(0x04); //POWER ON
-	DEV_Delay_ms(100);  
-	EPD_5in83_V2_ReadBusy();        //waiting for the electronic paper IC to release the idle signal
+    EPD_5IN83_SendCommand(0x30); // PLL_CONTROL
+    EPD_5IN83_SendData(0x3c);
 
-	EPD_5in83_V2_SendCommand(0X00);			//PANNEL SETTING
-	EPD_5in83_V2_SendData(0x1F);   //KW-3f   KWR-2F	BWROTP 0f	BWOTP 1f
+    EPD_5IN83_SendCommand(0x41); // TEMPERATURE_CALIBRATION
+    EPD_5IN83_SendData(0x00);
 
-	EPD_5in83_V2_SendCommand(0x61);        	//tres			
-	EPD_5in83_V2_SendData (0x02);		//source 648
-	EPD_5in83_V2_SendData (0x88);
-	EPD_5in83_V2_SendData (0x01);		//gate 480
-	EPD_5in83_V2_SendData (0xE0);
+    EPD_5IN83_SendCommand(0x50); // VCOM_AND_DATA_INTERVAL_SETTING
+    EPD_5IN83_SendData(0x77);
 
-	EPD_5in83_V2_SendCommand(0X15);		
-	EPD_5in83_V2_SendData(0x00);		
+    EPD_5IN83_SendCommand(0x60); // TCON_SETTING
+    EPD_5IN83_SendData(0x22);
 
-	EPD_5in83_V2_SendCommand(0X50);			//VCOM AND DATA INTERVAL SETTING
-	EPD_5in83_V2_SendData(0x10);
-	EPD_5in83_V2_SendData(0x07);
+    EPD_5IN83_SendCommand(0x61); // TCON_RESOLUTION
+    EPD_5IN83_SendData(EPD_5IN83_WIDTH >> 8); // source 600
+    EPD_5IN83_SendData(EPD_5IN83_WIDTH & 0xff);
+    EPD_5IN83_SendData(EPD_5IN83_HEIGHT >> 8); // gate 448
+    EPD_5IN83_SendData(EPD_5IN83_HEIGHT & 0xff);
 
-	EPD_5in83_V2_SendCommand(0X60);			//TCON SETTING
-	EPD_5in83_V2_SendData(0x22);
+    EPD_5IN83_SendCommand(0x82); // VCM_DC_SETTING
+    EPD_5IN83_SendData(0x1E); // decide by LUT file
+
+    EPD_5IN83_SendCommand(0xe5); // FLASH MODE
+    EPD_5IN83_SendData(0x03);
 }
 
 /******************************************************************************
 function :	Clear screen
 parameter:
 ******************************************************************************/
-void EPD_5in83_V2_Clear(void)
+void EPD_5IN83_Clear(void)
 {
-    UWORD Width, Height, i;
-    Width = (EPD_5in83_V2_WIDTH % 8 == 0)? (EPD_5in83_V2_WIDTH / 8 ): (EPD_5in83_V2_WIDTH / 8 + 1);
-    Height = EPD_5in83_V2_HEIGHT;
-
-	EPD_5in83_V2_SendCommand(0x10);
-	for(i=0; i<Width*Height; i++) {
-		EPD_5in83_V2_SendData(0x00);  
-	}
-	EPD_5in83_V2_SendCommand(0x13);
-	for(i=0; i<Width*Height; i++) {
-		EPD_5in83_V2_SendData(0x00);  
-	}
-	EPD_5in83_V2_TurnOnDisplay();
+    UWORD Width, Height;
+    Width = (EPD_5IN83_WIDTH % 8 == 0)? (EPD_5IN83_WIDTH / 8 ): (EPD_5IN83_WIDTH / 8 + 1);
+    Height = EPD_5IN83_HEIGHT;
+
+    EPD_5IN83_SendCommand(0x10);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            for(UBYTE k = 0; k < 4; k++) {
+                EPD_5IN83_SendData(0x33);
+            }
+        }
+    }
+		EPD_5IN83_TurnOnDisplay();
 }
 
 /******************************************************************************
 function :	Sends the image buffer in RAM to e-Paper and displays
 parameter:
 ******************************************************************************/
-void EPD_5in83_V2_Display(UBYTE *Image)
+void EPD_5IN83_Display(UBYTE *Image)
 {
-    UWORD Width, Height, i, j;
-    Width = (EPD_5in83_V2_WIDTH % 8 == 0)? (EPD_5in83_V2_WIDTH / 8 ): (EPD_5in83_V2_WIDTH / 8 + 1);
-    Height = EPD_5in83_V2_HEIGHT;
-
-	EPD_5in83_V2_SendCommand(0x10);
-	for(i=0;i<Height;i++) {
-		for(j=0; j<Width; j++) {
-			EPD_5in83_V2_SendData(0x00);  
-		}
-	}
-	EPD_5in83_V2_SendCommand(0x13);
-	for(i=0;i<Height;i++) {
-		for(j=0; j<Width; j++) {
-			EPD_5in83_V2_SendData(~Image[i*Width + j]);  
-		}
-	}
-    EPD_5in83_V2_TurnOnDisplay();
+    UBYTE Data_Black, Data;
+    UWORD Width, Height;
+    Width = (EPD_5IN83_WIDTH % 8 == 0)? (EPD_5IN83_WIDTH / 8 ): (EPD_5IN83_WIDTH / 8 + 1);
+    Height = EPD_5IN83_HEIGHT;
+
+    EPD_5IN83_SendCommand(0x10);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            Data_Black = ~Image[i + j * Width];
+            for(UBYTE k = 0; k < 8; k++) {
+                if(Data_Black & 0x80)
+                    Data = 0x00;
+                else
+                    Data = 0x03;
+                Data <<= 4;
+                Data_Black <<= 1;
+                k++;
+                if(Data_Black & 0x80)
+                    Data |= 0x00;
+                else
+                    Data |= 0x03;
+                Data_Black <<= 1;
+                EPD_5IN83_SendData(Data);
+            }
+        }
+    }
+    EPD_5IN83_TurnOnDisplay();
 }
 
 /******************************************************************************
 function :	Enter sleep mode
 parameter:
 ******************************************************************************/
-void EPD_5in83_V2_Sleep(void)
+void EPD_5IN83_Sleep(void)
 {
-	EPD_5in83_V2_SendCommand(0X02);  	//power off
-	EPD_5in83_V2_ReadBusy();			//waiting for the electronic paper IC to release the idle signal
-	EPD_5in83_V2_SendCommand(0X07);		//deep sleep
-	EPD_5in83_V2_SendData(0xA5);
+    EPD_5IN83_SendCommand(0x02); // POWER_OFF
+    EPD_5IN83_ReadBusy();
+    EPD_5IN83_SendCommand(0x07); // DEEP_SLEEP
+    EPD_5IN83_SendData(0XA5);
 }
 

+ 1 - 1
RaspberryPi_JetsonNano/c/lib/e-Paper/EPD_5in83b_V2.c

@@ -17,7 +17,7 @@
 #
 # 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

+ 1 - 1
RaspberryPi_JetsonNano/c/lib/e-Paper/EPD_5in83b_V2.h

@@ -22,7 +22,7 @@
 # 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 
+# 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.

+ 3 - 1
RaspberryPi_JetsonNano/c/list.txt

@@ -17,15 +17,17 @@ EPD model                   EPD define (EPD=)
 2.9inch e-Paper (D)         epd2in9d
 2.13inch e-Paper (V2)       epd2in13V2
 2.13inch e-Paper (V3)       epd2in13V3
+2.13inch e-Paper (V4)       epd2in13V4
 2.13inch e-Paper (B)/(C)    epd2in13bc
 2.13inch e-Paper (B) (V3)   epd2in13bV3
 2.13inch e-Paper (B) (V4)   epd2in13bV4
 2.13inch e-Paper (D)        epd2in13d
+2.13inch e-Paper (G)        epd2in13g
 3.52inch e-Paper            epd3in52
 3.7inch e-Paper             epd3in7
 4.01inch e-Paper (F)        epd4in01f
 4.2inch e-Paper             epd4in2
-4.2inch e-Paper (V2         epd4in2V2
+4.2inch e-Paper (V2)         epd4in2V2
 4.2inch e-Paper (B)/(C)     epd4in2bc
 4.2inch e-Paper (B) (V2)    epd4in2bV2
 5.65inch e-Paper (F)        epd5in65f

二進制
RaspberryPi_JetsonNano/c/pic/2in13g.bmp


+ 68 - 0
RaspberryPi_JetsonNano/python/examples/epd_2in13g_test.py

@@ -0,0 +1,68 @@
+#!/usr/bin/python
+# -*- coding:utf-8 -*-
+import sys
+import os
+picdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'pic')
+libdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'lib')
+if os.path.exists(libdir):
+    sys.path.append(libdir)
+
+import logging
+from waveshare_epd import epd2in13g
+import time
+from PIL import Image,ImageDraw,ImageFont
+import traceback
+
+logging.basicConfig(level=logging.DEBUG)
+
+try:
+    logging.info("epd2in13g Demo")
+
+    epd = epd2in13g.EPD()   
+    logging.info("init and Clear")
+    epd.init()
+    epd.Clear()
+    font15 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 15)
+    font18 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 18)
+    font24 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 24)
+    font40 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 40)
+
+    # Drawing on the image
+    logging.info("1.Drawing on the image...")
+    Himage = Image.new('RGB', (epd.height, epd.width), epd.WHITE)  
+    draw = ImageDraw.Draw(Himage)
+    draw.rectangle([(0,0),(50,50)],outline = epd.BLACK)
+    draw.rectangle([(55,0),(100,50)],fill = epd.RED)
+    draw.line([(0,0),(50,50)], fill = epd.YELLOW,width = 1)
+    draw.line([(0,50),(50,0)], fill = epd.YELLOW,width = 1)
+    draw.pieslice((55, 60, 95, 100), 90, 180, outline = epd.RED)
+    draw.pieslice((55, 60, 95, 100), 270, 360, fill = epd.BLACK)
+    draw.chord((10, 60, 50, 100), 0, 360, fill = epd.YELLOW)
+    draw.ellipse((55, 60, 95, 100), outline = epd.RED)
+    draw.polygon([(110,0),(110,50),(150,25)],outline = epd.BLACK)
+    draw.polygon([(190,0),(190,50),(150,25)],fill = epd.BLACK)
+    draw.text((120, 60), 'e-Paper demo', font = font15, fill = epd.YELLOW)
+    draw.text((110, 90), u'微雪电子', font = font24, fill = epd.RED)
+
+    epd.display(epd.getbuffer(Himage))
+    time.sleep(3)
+    
+    # read bmp file 
+    logging.info("2.read bmp file")
+    Himage = Image.open(os.path.join(picdir, '2in13g.bmp'))
+    epd.display(epd.getbuffer(Himage))
+    time.sleep(3)
+    
+    logging.info("Clear...")
+    epd.Clear()
+    
+    logging.info("Goto Sleep...")
+    epd.sleep()
+        
+except IOError as e:
+    logging.info(e)
+    
+except KeyboardInterrupt:    
+    logging.info("ctrl + c:")
+    epd2in13g.epdconfig.module_exit()
+    exit()

二進制
RaspberryPi_JetsonNano/python/lib/waveshare_epd/__init__.pyc


二進制
RaspberryPi_JetsonNano/python/lib/waveshare_epd/epd2in13_V3.pyc


+ 242 - 0
RaspberryPi_JetsonNano/python/lib/waveshare_epd/epd2in13g.py

@@ -0,0 +1,242 @@
+# *****************************************************************************
+# * | File        :	  epd2in13g.py
+# * | Author      :   Waveshare team
+# * | Function    :   Electronic paper driver
+# * | Info        :
+# *----------------
+# * | This version:   V1.0
+# * | Date        :   2023-05-29
+# # | Info        :   python demo
+# -----------------------------------------------------------------------------
+# ******************************************************************************/
+# 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.
+#
+
+import logging
+from . import epdconfig
+
+import PIL
+from PIL import Image
+import io
+
+# Display resolution
+EPD_WIDTH       = 122
+EPD_HEIGHT      = 250
+
+logger = logging.getLogger(__name__)
+
+class EPD:
+    def __init__(self):
+        self.reset_pin = epdconfig.RST_PIN
+        self.dc_pin = epdconfig.DC_PIN
+        self.busy_pin = epdconfig.BUSY_PIN
+        self.cs_pin = epdconfig.CS_PIN
+        self.width = EPD_WIDTH
+        self.height = EPD_HEIGHT
+        self.BLACK  = 0x000000   #   00  BGR
+        self.WHITE  = 0xffffff   #   01
+        self.YELLOW = 0x00ffff   #   10
+        self.RED    = 0x0000ff   #   11
+        self.Gate_BITS = EPD_HEIGHT
+        if self.width < 128:
+            self.Source_BITS = 128
+        else:
+            self.Source_BITS = self.width
+
+        
+    # Hardware reset
+    def reset(self):
+        epdconfig.digital_write(self.reset_pin, 1)
+        epdconfig.delay_ms(200) 
+        epdconfig.digital_write(self.reset_pin, 0)         # module reset
+        epdconfig.delay_ms(2)
+        epdconfig.digital_write(self.reset_pin, 1)
+        epdconfig.delay_ms(200)   
+
+    def send_command(self, command):
+        epdconfig.digital_write(self.dc_pin, 0)
+        epdconfig.digital_write(self.cs_pin, 0)
+        epdconfig.spi_writebyte([command])
+        epdconfig.digital_write(self.cs_pin, 1)
+
+    def send_data(self, data):
+        epdconfig.digital_write(self.dc_pin, 1)
+        epdconfig.digital_write(self.cs_pin, 0)
+        epdconfig.spi_writebyte([data])
+        epdconfig.digital_write(self.cs_pin, 1)
+        
+    def ReadBusy(self):
+        logger.debug("e-Paper busy H")
+        epdconfig.delay_ms(100)
+        while(epdconfig.digital_read(self.busy_pin) == 0):      # 0: idle, 1: busy
+            epdconfig.delay_ms(5)
+        logger.debug("e-Paper busy release")
+        
+    def SetWindow(self):
+        self.send_command(0x61) # SET_RAM_X_ADDRESS_START_END_POSITION
+        # x point must be the multiple of 8 or the last 3 bits will be ignored
+        self.send_data(self.Source_BITS/256)
+        self.send_data(self.Source_BITS%256)
+        self.send_data(self.Gate_BITS/256)
+        self.send_data(self.Gate_BITS%256)
+
+    def TurnOnDisplay(self):
+        self.send_command(0x12) # DISPLAY_REFRESH
+        self.send_data(0X00)
+        self.ReadBusy()
+        
+    def init(self):
+        if (epdconfig.module_init() != 0):
+            return -1
+        # EPD hardware init start
+
+        self.reset()
+        
+        self.ReadBusy()
+        self.send_command(0x4D)
+        self.send_data(0x78)
+
+        self.send_command(0x00)
+        self.send_data(0x0F)
+        self.send_data(0x29)
+
+        self.send_command(0x01)
+        self.send_data(0x07)
+        self.send_data(0x00)
+
+        self.send_command(0x03)
+        self.send_data(0x10)
+        self.send_data(0x54)
+        self.send_data(0x44)
+
+        self.send_command(0x06)
+        self.send_data(0x05)
+        self.send_data(0x00)
+        self.send_data(0x3F)
+        self.send_data(0x0A)
+        self.send_data(0x25)
+        self.send_data(0x12)
+        self.send_data(0x1A)
+
+        self.send_command(0x50)
+        self.send_data(0x37)
+
+        self.send_command(0x60)
+        self.send_data(0x02)
+        self.send_data(0x02)
+        
+        self.SetWindow()
+        
+        self.send_command(0xE7)
+        self.send_data(0x1C)
+
+        self.send_command(0xE3)
+        self.send_data(0x22)
+
+        self.send_command(0xB4)
+        self.send_data(0xD0)
+        self.send_command(0xB5)
+        self.send_data(0x03)
+
+        self.send_command(0xE9)
+        self.send_data(0x01)
+        
+        self.send_command(0x30)
+        self.send_data(0x08)
+        
+        self.send_command(0x04)
+        self.ReadBusy()
+        return 0
+
+    def getbuffer(self, image):
+        # Create a pallette with the 4 colors supported by the panel
+        pal_image = Image.new("P", (1,1))
+        pal_image.putpalette( (0,0,0,  255,255,255,  255,255,0,   255,0,0) + (0,0,0)*252)
+
+        # Check if we need to rotate the image
+        imwidth, imheight = image.size
+        if(imwidth == self.width and imheight == self.height):
+            image_temp = image
+        elif(imwidth == self.height and imheight == self.width):
+            image_temp = image.rotate(90, expand=True)
+        else:
+            logger.warning("Invalid image dimensions: %d x %d, expected %d x %d" % (imwidth, imheight, self.width, self.height))
+
+        # Convert the soruce image to the 4 colors, dithering if needed
+        image_4color = image_temp.convert("RGB").quantize(palette=pal_image)
+        buf_4color = bytearray(image_4color.tobytes('raw'))
+
+        # into a single byte to transfer to the panel
+        if self.width % 4 == 0 :
+            Width = self.width // 4
+        else :
+            Width = self.width // 4 + 1
+        Height = self.height 
+        buf = [0x00] * int(Width * Height)
+        idx = 0
+        for j in range(0, Height):
+            for i in range(0, Width):
+                if i == Width -1:
+                    buf[i + j * Width] = (buf_4color[idx] << 6) + (buf_4color[idx+1] << 4)
+                    idx = idx + 2
+                else:
+                    buf[i + j * Width] = (buf_4color[idx] << 6) + (buf_4color[idx+1] << 4) + (buf_4color[idx+2] << 2) + buf_4color[idx+3]
+                    idx = idx + 4
+        return buf
+
+    def display(self, image):
+        if self.width % 4 == 0 :
+            Width = self.width // 4
+        else :
+            Width = self.width // 4 + 1
+        Height = self.height
+
+        self.send_command(0x10)
+        for j in range(0, Height):
+            for i in range(0, self.Source_BITS//4):
+                if i < 31 :
+                    self.send_data(image[i + j * Width])
+                else :
+                    self.send_data(0x00)
+                    
+        self.TurnOnDisplay()
+        
+    def Clear(self, color=0x55):
+        Width = self.Source_BITS//4
+        Height = self.height
+
+
+        self.send_command(0x10)
+        for j in range(0, Height):
+            for i in range(0, Width):
+                    self.send_data(color)
+        self.TurnOnDisplay()
+
+    def sleep(self):
+        self.send_command(0x02) # POWER_OFF
+        self.ReadBusy()
+        epdconfig.delay_ms(100)
+        
+        self.send_command(0x07) # DEEP_SLEEP
+        self.send_data(0XA5)
+        
+        epdconfig.delay_ms(2000)
+        epdconfig.module_exit()
+### END OF FILE ###
+

二進制
RaspberryPi_JetsonNano/python/lib/waveshare_epd/epdconfig.pyc


二進制
RaspberryPi_JetsonNano/python/pic/2in13g.bmp