use It8951 files
This commit is contained in:
		| @@ -0,0 +1,921 @@ | ||||
| /***************************************************************************** | ||||
| * | File      	:   EPD_IT8951.c | ||||
| * | Author      :   Waveshare team | ||||
| * | Function    :   IT8951 Common driver | ||||
| * | Info        : | ||||
| *---------------- | ||||
| * |	This version:   V1.0 | ||||
| * | Date        :   2019-09-17 | ||||
| * | 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_IT8951.h" | ||||
| #include <time.h> | ||||
|  | ||||
| //basic mode definition | ||||
| UBYTE INIT_Mode = 0; | ||||
| UBYTE GC16_Mode = 2; | ||||
| //A2_Mode's value is not fixed, is decide by firmware's LUT  | ||||
| UBYTE A2_Mode = 6; | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	Software reset | ||||
| parameter: | ||||
| ******************************************************************************/ | ||||
| static void EPD_IT8951_Reset(void) | ||||
| { | ||||
|     DEV_Digital_Write(EPD_RST_PIN, HIGH); | ||||
|     DEV_Delay_ms(200); | ||||
|     DEV_Digital_Write(EPD_RST_PIN, LOW); | ||||
|     DEV_Delay_ms(10); | ||||
|     DEV_Digital_Write(EPD_RST_PIN, HIGH); | ||||
|     DEV_Delay_ms(200); | ||||
| } | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	Wait until the busy_pin goes HIGH | ||||
| parameter: | ||||
| ******************************************************************************/ | ||||
| static void EPD_IT8951_ReadBusy(void) | ||||
| { | ||||
| 	// Debug("Busy ------\r\n"); | ||||
|     UBYTE Busy_State = DEV_Digital_Read(EPD_BUSY_PIN); | ||||
|     //0: busy, 1: idle | ||||
|     while(Busy_State == 0) { | ||||
|         Busy_State = DEV_Digital_Read(EPD_BUSY_PIN); | ||||
|     } | ||||
| 	// Debug("Busy Release ------\r\n"); | ||||
| } | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	write command | ||||
| parameter:  command | ||||
| ******************************************************************************/ | ||||
| static void EPD_IT8951_WriteCommand(UWORD Command) | ||||
| { | ||||
| 	//Set Preamble for Write Command | ||||
| 	UWORD Write_Preamble = 0x6000; | ||||
| 	 | ||||
| 	EPD_IT8951_ReadBusy(); | ||||
|  | ||||
|     DEV_Digital_Write(EPD_CS_PIN, LOW); | ||||
| 	 | ||||
| 	DEV_SPI_WriteByte(Write_Preamble>>8); | ||||
| 	DEV_SPI_WriteByte(Write_Preamble); | ||||
| 	 | ||||
| 	EPD_IT8951_ReadBusy();	 | ||||
| 	 | ||||
| 	DEV_SPI_WriteByte(Command>>8); | ||||
| 	DEV_SPI_WriteByte(Command); | ||||
| 	 | ||||
| 	DEV_Digital_Write(EPD_CS_PIN, HIGH); | ||||
| } | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	write data | ||||
| parameter:  data | ||||
| ******************************************************************************/ | ||||
| static void EPD_IT8951_WriteData(UWORD Data) | ||||
| { | ||||
|     //Set Preamble for Write Command | ||||
| 	UWORD Write_Preamble = 0x0000; | ||||
|  | ||||
|     EPD_IT8951_ReadBusy(); | ||||
|  | ||||
|     DEV_Digital_Write(EPD_CS_PIN, LOW); | ||||
|  | ||||
| 	DEV_SPI_WriteByte(Write_Preamble>>8); | ||||
| 	DEV_SPI_WriteByte(Write_Preamble); | ||||
|  | ||||
|     EPD_IT8951_ReadBusy(); | ||||
|  | ||||
| 	DEV_SPI_WriteByte(Data>>8); | ||||
| 	DEV_SPI_WriteByte(Data); | ||||
|  | ||||
|     DEV_Digital_Write(EPD_CS_PIN, HIGH); | ||||
| } | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	write multi data | ||||
| parameter:  data | ||||
| ******************************************************************************/ | ||||
| static void EPD_IT8951_WriteMuitiData(UWORD* Data_Buf, UDOUBLE Length) | ||||
| { | ||||
|     //Set Preamble for Write Command | ||||
| 	UWORD Write_Preamble = 0x0000; | ||||
|  | ||||
|     EPD_IT8951_ReadBusy(); | ||||
|  | ||||
|     DEV_Digital_Write(EPD_CS_PIN, LOW); | ||||
|  | ||||
| 	DEV_SPI_WriteByte(Write_Preamble>>8); | ||||
| 	DEV_SPI_WriteByte(Write_Preamble); | ||||
|  | ||||
|     EPD_IT8951_ReadBusy(); | ||||
|  | ||||
|     for(UDOUBLE i = 0; i<Length; i++) | ||||
|     { | ||||
| 	    DEV_SPI_WriteByte(Data_Buf[i]>>8); | ||||
| 	    DEV_SPI_WriteByte(Data_Buf[i]); | ||||
|     } | ||||
|     DEV_Digital_Write(EPD_CS_PIN, HIGH); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	read data | ||||
| parameter:  data | ||||
| ******************************************************************************/ | ||||
| static UWORD EPD_IT8951_ReadData() | ||||
| { | ||||
|     UWORD ReadData; | ||||
| 	UWORD Write_Preamble = 0x1000; | ||||
|     UWORD Read_Dummy; | ||||
|  | ||||
|     EPD_IT8951_ReadBusy(); | ||||
|  | ||||
|     DEV_Digital_Write(EPD_CS_PIN, LOW); | ||||
|  | ||||
| 	DEV_SPI_WriteByte(Write_Preamble>>8); | ||||
| 	DEV_SPI_WriteByte(Write_Preamble); | ||||
|  | ||||
|     EPD_IT8951_ReadBusy(); | ||||
|  | ||||
|     //dummy | ||||
|     Read_Dummy = DEV_SPI_ReadByte()<<8; | ||||
|     Read_Dummy |= DEV_SPI_ReadByte(); | ||||
|  | ||||
|     EPD_IT8951_ReadBusy(); | ||||
|  | ||||
|     ReadData = DEV_SPI_ReadByte()<<8; | ||||
|     ReadData |= DEV_SPI_ReadByte(); | ||||
|  | ||||
|     DEV_Digital_Write(EPD_CS_PIN, HIGH); | ||||
|  | ||||
|     return ReadData; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	read multi data | ||||
| parameter:  data | ||||
| ******************************************************************************/ | ||||
| static void EPD_IT8951_ReadMultiData(UWORD* Data_Buf, UDOUBLE Length) | ||||
| { | ||||
| 	UWORD Write_Preamble = 0x1000; | ||||
|     UWORD Read_Dummy; | ||||
|  | ||||
|     EPD_IT8951_ReadBusy(); | ||||
|  | ||||
|     DEV_Digital_Write(EPD_CS_PIN, LOW); | ||||
|  | ||||
| 	DEV_SPI_WriteByte(Write_Preamble>>8); | ||||
| 	DEV_SPI_WriteByte(Write_Preamble); | ||||
|  | ||||
|     EPD_IT8951_ReadBusy(); | ||||
|  | ||||
|     //dummy | ||||
|     Read_Dummy = DEV_SPI_ReadByte()<<8; | ||||
|     Read_Dummy |= DEV_SPI_ReadByte(); | ||||
|  | ||||
|     EPD_IT8951_ReadBusy(); | ||||
|  | ||||
|     for(UDOUBLE i = 0; i<Length; i++) | ||||
|     { | ||||
| 	    Data_Buf[i] = DEV_SPI_ReadByte()<<8; | ||||
| 	    Data_Buf[i] |= DEV_SPI_ReadByte(); | ||||
|     } | ||||
|  | ||||
|     DEV_Digital_Write(EPD_CS_PIN, HIGH); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function:	write multi arg | ||||
| parameter:	data | ||||
| description:	some situation like this: | ||||
| * 1 commander     0    argument | ||||
| * 1 commander     1    argument | ||||
| * 1 commander   multi  argument | ||||
| ******************************************************************************/ | ||||
| static void EPD_IT8951_WriteMultiArg(UWORD Arg_Cmd, UWORD* Arg_Buf, UWORD Arg_Num) | ||||
| { | ||||
|      //Send Cmd code | ||||
|      EPD_IT8951_WriteCommand(Arg_Cmd); | ||||
|      //Send Data | ||||
|      for(UWORD i=0; i<Arg_Num; i++) | ||||
|      { | ||||
|          EPD_IT8951_WriteData(Arg_Buf[i]); | ||||
|      } | ||||
| } | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	Cmd4 ReadReg | ||||
| parameter:   | ||||
| ******************************************************************************/ | ||||
| static UWORD EPD_IT8951_ReadReg(UWORD Reg_Address) | ||||
| { | ||||
|     UWORD Reg_Value; | ||||
|     EPD_IT8951_WriteCommand(IT8951_TCON_REG_RD); | ||||
|     EPD_IT8951_WriteData(Reg_Address); | ||||
|     Reg_Value =  EPD_IT8951_ReadData(); | ||||
|     return Reg_Value; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	Cmd5 WriteReg | ||||
| parameter:   | ||||
| ******************************************************************************/ | ||||
| static void EPD_IT8951_WriteReg(UWORD Reg_Address,UWORD Reg_Value) | ||||
| { | ||||
|     EPD_IT8951_WriteCommand(IT8951_TCON_REG_WR); | ||||
|     EPD_IT8951_WriteData(Reg_Address); | ||||
|     EPD_IT8951_WriteData(Reg_Value); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	get VCOM | ||||
| parameter:   | ||||
| ******************************************************************************/ | ||||
| static UWORD EPD_IT8951_GetVCOM(void) | ||||
| { | ||||
|     UWORD VCOM; | ||||
|     EPD_IT8951_WriteCommand(USDEF_I80_CMD_VCOM); | ||||
|     EPD_IT8951_WriteData(0x0000); | ||||
|     VCOM =  EPD_IT8951_ReadData(); | ||||
|     return VCOM; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	set VCOM | ||||
| parameter:   | ||||
| ******************************************************************************/ | ||||
| static void EPD_IT8951_SetVCOM(UWORD VCOM) | ||||
| { | ||||
|     EPD_IT8951_WriteCommand(USDEF_I80_CMD_VCOM); | ||||
|     EPD_IT8951_WriteData(0x0001); | ||||
|     EPD_IT8951_WriteData(VCOM); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	Cmd10 LD_IMG | ||||
| parameter:   | ||||
| ******************************************************************************/ | ||||
| static void EPD_IT8951_LoadImgStart( IT8951_Load_Img_Info* Load_Img_Info ) | ||||
| { | ||||
|     UWORD Args; | ||||
|     Args = (\ | ||||
|         Load_Img_Info->Endian_Type<<8 | \ | ||||
|         Load_Img_Info->Pixel_Format<<4 | \ | ||||
|         Load_Img_Info->Rotate\ | ||||
|     ); | ||||
|     EPD_IT8951_WriteCommand(IT8951_TCON_LD_IMG); | ||||
|     EPD_IT8951_WriteData(Args); | ||||
| } | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	Cmd11 LD_IMG_Area | ||||
| parameter:   | ||||
| ******************************************************************************/ | ||||
| static void EPD_IT8951_LoadImgAreaStart( IT8951_Load_Img_Info* Load_Img_Info, IT8951_Area_Img_Info* Area_Img_Info ) | ||||
| { | ||||
|     UWORD Args[5]; | ||||
|     Args[0] = (\ | ||||
|         Load_Img_Info->Endian_Type<<8 | \ | ||||
|         Load_Img_Info->Pixel_Format<<4 | \ | ||||
|         Load_Img_Info->Rotate\ | ||||
|     ); | ||||
|     Args[1] = Area_Img_Info->Area_X; | ||||
|     Args[2] = Area_Img_Info->Area_Y; | ||||
|     Args[3] = Area_Img_Info->Area_W; | ||||
|     Args[4] = Area_Img_Info->Area_H; | ||||
|     EPD_IT8951_WriteMultiArg(IT8951_TCON_LD_IMG_AREA, Args,5); | ||||
| } | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	Cmd12 LD_IMG_End | ||||
| parameter:   | ||||
| ******************************************************************************/ | ||||
| static void EPD_IT8951_LoadImgEnd(void) | ||||
| { | ||||
|     EPD_IT8951_WriteCommand(IT8951_TCON_LD_IMG_END); | ||||
| } | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	EPD_IT8951_Get_System_Info | ||||
| parameter:   | ||||
| ******************************************************************************/ | ||||
| static void EPD_IT8951_GetSystemInfo(void* Buf) | ||||
| { | ||||
|     IT8951_Dev_Info* Dev_Info;  | ||||
|  | ||||
|     EPD_IT8951_WriteCommand(USDEF_I80_CMD_GET_DEV_INFO); | ||||
|  | ||||
|     EPD_IT8951_ReadMultiData((UWORD*)Buf, sizeof(IT8951_Dev_Info)/2); | ||||
|  | ||||
|     Dev_Info = (IT8951_Dev_Info*)Buf; | ||||
| 	Debug("Panel(W,H) = (%d,%d)\r\n",Dev_Info->Panel_W, Dev_Info->Panel_H ); | ||||
| 	Debug("Memory Address = %X\r\n",Dev_Info->Memory_Addr_L | (Dev_Info->Memory_Addr_H << 16)); | ||||
| 	Debug("FW Version = %s\r\n", (UBYTE*)Dev_Info->FW_Version); | ||||
| 	Debug("LUT Version = %s\r\n", (UBYTE*)Dev_Info->LUT_Version); | ||||
| } | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	EPD_IT8951_Set_Target_Memory_Addr | ||||
| parameter:   | ||||
| ******************************************************************************/ | ||||
| static void EPD_IT8951_SetTargetMemoryAddr(UDOUBLE Target_Memory_Addr) | ||||
| { | ||||
| 	UWORD WordH = (UWORD)((Target_Memory_Addr >> 16) & 0x0000FFFF); | ||||
| 	UWORD WordL = (UWORD)( Target_Memory_Addr & 0x0000FFFF); | ||||
|  | ||||
|     EPD_IT8951_WriteReg(LISAR+2, WordH); | ||||
|     EPD_IT8951_WriteReg(LISAR  , WordL); | ||||
| } | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	EPD_IT8951_WaitForDisplayReady | ||||
| parameter:   | ||||
| ******************************************************************************/ | ||||
| static void EPD_IT8951_WaitForDisplayReady(void) | ||||
| { | ||||
|     //Check IT8951 Register LUTAFSR => NonZero Busy, Zero - Free | ||||
|     while( EPD_IT8951_ReadReg(LUTAFSR) ) | ||||
|     { | ||||
|         //wait in idle state | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	EPD_IT8951_HostAreaPackedPixelWrite_1bp | ||||
| parameter:   | ||||
| ******************************************************************************/ | ||||
| static void EPD_IT8951_HostAreaPackedPixelWrite_1bp(IT8951_Load_Img_Info*Load_Img_Info,IT8951_Area_Img_Info*Area_Img_Info, bool Packed_Write) | ||||
| { | ||||
|     UWORD Source_Buffer_Width, Source_Buffer_Height; | ||||
|     UWORD Source_Buffer_Length; | ||||
|  | ||||
|     UWORD* Source_Buffer = (UWORD*)Load_Img_Info->Source_Buffer_Addr; | ||||
|     EPD_IT8951_SetTargetMemoryAddr(Load_Img_Info->Target_Memory_Addr); | ||||
|     EPD_IT8951_LoadImgAreaStart(Load_Img_Info,Area_Img_Info); | ||||
|  | ||||
|     //from byte to word | ||||
|     //use 8bp to display 1bp, so here, divide by 2, because every byte has full bit. | ||||
|     Source_Buffer_Width = Area_Img_Info->Area_W/2; | ||||
|     Source_Buffer_Height = Area_Img_Info->Area_H; | ||||
|     Source_Buffer_Length = Source_Buffer_Width * Source_Buffer_Height; | ||||
|      | ||||
|     if(Packed_Write == true) | ||||
|     { | ||||
|         EPD_IT8951_WriteMuitiData(Source_Buffer, Source_Buffer_Length); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         for(UDOUBLE i=0; i<Source_Buffer_Height; i++) | ||||
|         { | ||||
|             for(UDOUBLE j=0; j<Source_Buffer_Width; j++) | ||||
|             { | ||||
|                 EPD_IT8951_WriteData(*Source_Buffer); | ||||
|                 Source_Buffer++; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     EPD_IT8951_LoadImgEnd(); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	EPD_IT8951_HostAreaPackedPixelWrite_2bp | ||||
| parameter:   | ||||
| ******************************************************************************/ | ||||
| static void EPD_IT8951_HostAreaPackedPixelWrite_2bp(IT8951_Load_Img_Info*Load_Img_Info, IT8951_Area_Img_Info*Area_Img_Info, bool Packed_Write) | ||||
| { | ||||
|     UWORD Source_Buffer_Width, Source_Buffer_Height; | ||||
|     UWORD Source_Buffer_Length; | ||||
|  | ||||
|     UWORD* Source_Buffer = (UWORD*)Load_Img_Info->Source_Buffer_Addr; | ||||
|     EPD_IT8951_SetTargetMemoryAddr(Load_Img_Info->Target_Memory_Addr); | ||||
|     EPD_IT8951_LoadImgAreaStart(Load_Img_Info,Area_Img_Info); | ||||
|  | ||||
|     //from byte to word | ||||
|     Source_Buffer_Width = (Area_Img_Info->Area_W*2/8)/2; | ||||
|     Source_Buffer_Height = Area_Img_Info->Area_H; | ||||
|     Source_Buffer_Length = Source_Buffer_Width * Source_Buffer_Height; | ||||
|  | ||||
|     if(Packed_Write == true) | ||||
|     { | ||||
|         EPD_IT8951_WriteMuitiData(Source_Buffer, Source_Buffer_Length); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         for(UDOUBLE i=0; i<Source_Buffer_Height; i++) | ||||
|         { | ||||
|             for(UDOUBLE j=0; j<Source_Buffer_Width; j++) | ||||
|             { | ||||
|                 EPD_IT8951_WriteData(*Source_Buffer); | ||||
|                 Source_Buffer++; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     EPD_IT8951_LoadImgEnd(); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	EPD_IT8951_HostAreaPackedPixelWrite_4bp | ||||
| parameter:   | ||||
| ******************************************************************************/ | ||||
| static void EPD_IT8951_HostAreaPackedPixelWrite_4bp(IT8951_Load_Img_Info*Load_Img_Info, IT8951_Area_Img_Info*Area_Img_Info, bool Packed_Write) | ||||
| { | ||||
|     UWORD Source_Buffer_Width, Source_Buffer_Height; | ||||
|     UWORD Source_Buffer_Length; | ||||
| 	 | ||||
|     UWORD* Source_Buffer = (UWORD*)Load_Img_Info->Source_Buffer_Addr; | ||||
|     EPD_IT8951_SetTargetMemoryAddr(Load_Img_Info->Target_Memory_Addr); | ||||
|     EPD_IT8951_LoadImgAreaStart(Load_Img_Info,Area_Img_Info); | ||||
|  | ||||
|     //from byte to word | ||||
|     Source_Buffer_Width = (Area_Img_Info->Area_W*4/8)/2; | ||||
|     Source_Buffer_Height = Area_Img_Info->Area_H; | ||||
|     Source_Buffer_Length = Source_Buffer_Width * Source_Buffer_Height; | ||||
|  | ||||
|     if(Packed_Write == true) | ||||
|     { | ||||
|         EPD_IT8951_WriteMuitiData(Source_Buffer, Source_Buffer_Length); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         for(UDOUBLE i=0; i<Source_Buffer_Height; i++) | ||||
|         { | ||||
|             for(UDOUBLE j=0; j<Source_Buffer_Width; j++) | ||||
|             { | ||||
|                 EPD_IT8951_WriteData(*Source_Buffer); | ||||
|                 Source_Buffer++; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 	 | ||||
|     EPD_IT8951_LoadImgEnd(); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	EPD_IT8951_HostAreaPackedPixelWrite_8bp | ||||
| parameter:   | ||||
| Precautions: Can't Packed Write | ||||
| ******************************************************************************/ | ||||
| static void EPD_IT8951_HostAreaPackedPixelWrite_8bp(IT8951_Load_Img_Info*Load_Img_Info,IT8951_Area_Img_Info*Area_Img_Info) | ||||
| { | ||||
|     UWORD Source_Buffer_Width, Source_Buffer_Height; | ||||
|  | ||||
|     UWORD* Source_Buffer = (UWORD*)Load_Img_Info->Source_Buffer_Addr; | ||||
|     EPD_IT8951_SetTargetMemoryAddr(Load_Img_Info->Target_Memory_Addr); | ||||
|     EPD_IT8951_LoadImgAreaStart(Load_Img_Info,Area_Img_Info); | ||||
|  | ||||
|     //from byte to word | ||||
|     Source_Buffer_Width = (Area_Img_Info->Area_W*8/8)/2; | ||||
|     Source_Buffer_Height = Area_Img_Info->Area_H; | ||||
|  | ||||
|     for(UDOUBLE i=0; i<Source_Buffer_Height; i++) | ||||
|     { | ||||
|         for(UDOUBLE j=0; j<Source_Buffer_Width; j++) | ||||
|         { | ||||
|             EPD_IT8951_WriteData(*Source_Buffer); | ||||
|             Source_Buffer++; | ||||
|         } | ||||
|     } | ||||
|     EPD_IT8951_LoadImgEnd(); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	EPD_IT8951_Display_Area | ||||
| parameter:   | ||||
| ******************************************************************************/ | ||||
| static void EPD_IT8951_Display_Area(UWORD X,UWORD Y,UWORD W,UWORD H,UWORD Mode) | ||||
| { | ||||
|     UWORD Args[5]; | ||||
|     Args[0] = X; | ||||
|     Args[1] = Y; | ||||
|     Args[2] = W; | ||||
|     Args[3] = H; | ||||
|     Args[4] = Mode; | ||||
|     //0x0034 | ||||
|     EPD_IT8951_WriteMultiArg(USDEF_I80_CMD_DPY_AREA, Args,5); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	EPD_IT8951_Display_AreaBuf | ||||
| parameter:   | ||||
| ******************************************************************************/ | ||||
| static void EPD_IT8951_Display_AreaBuf(UWORD X,UWORD Y,UWORD W,UWORD H,UWORD Mode, UDOUBLE Target_Memory_Addr) | ||||
| { | ||||
|     UWORD Args[7]; | ||||
|     Args[0] = X; | ||||
|     Args[1] = Y; | ||||
|     Args[2] = W; | ||||
|     Args[3] = H; | ||||
|     Args[4] = Mode; | ||||
|     Args[5] = (UWORD)Target_Memory_Addr; | ||||
|     Args[6] = (UWORD)(Target_Memory_Addr>>16); | ||||
|     //0x0037 | ||||
|     EPD_IT8951_WriteMultiArg(USDEF_I80_CMD_DPY_BUF_AREA, Args,7);  | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	EPD_IT8951_Display_1bp | ||||
| parameter:   | ||||
| ******************************************************************************/ | ||||
| static void EPD_IT8951_Display_1bp(UWORD X, UWORD Y, UWORD W, UWORD H, UWORD Mode,UDOUBLE Target_Memory_Addr, UBYTE Back_Gray_Val,UBYTE Front_Gray_Val) | ||||
| { | ||||
|     //Set Display mode to 1 bpp mode - Set 0x18001138 Bit[18](0x1800113A Bit[2])to 1 | ||||
|     EPD_IT8951_WriteReg(UP1SR+2, EPD_IT8951_ReadReg(UP1SR+2) | (1<<2) ); | ||||
|  | ||||
|     EPD_IT8951_WriteReg(BGVR, (Front_Gray_Val<<8) | Back_Gray_Val); | ||||
|  | ||||
|     if(Target_Memory_Addr == 0) | ||||
|     { | ||||
|         EPD_IT8951_Display_Area(X,Y,W,H,Mode); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         EPD_IT8951_Display_AreaBuf(X,Y,W,H,Mode,Target_Memory_Addr); | ||||
|     } | ||||
|      | ||||
|     EPD_IT8951_WaitForDisplayReady(); | ||||
|  | ||||
|     EPD_IT8951_WriteReg(UP1SR+2, EPD_IT8951_ReadReg(UP1SR+2) & ~(1<<2) ); | ||||
| } | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	Enhanced driving capability | ||||
| parameter:  Enhanced driving capability for IT8951, in case the blurred display effect | ||||
| ******************************************************************************/ | ||||
| void Enhance_Driving_Capability(void) | ||||
| { | ||||
|     UWORD RegValue = EPD_IT8951_ReadReg(0x0038); | ||||
|     Debug("The reg value before writing is %x\r\n", RegValue); | ||||
|  | ||||
|     EPD_IT8951_WriteReg(0x0038, 0x0602); | ||||
|  | ||||
|     RegValue = EPD_IT8951_ReadReg(0x0038); | ||||
|     Debug("The reg value after writing is %x\r\n", RegValue); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	Cmd1 SYS_RUN | ||||
| parameter:  Run the system | ||||
| ******************************************************************************/ | ||||
| void EPD_IT8951_SystemRun(void) | ||||
| { | ||||
|     EPD_IT8951_WriteCommand(IT8951_TCON_SYS_RUN); | ||||
| } | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	Cmd2 STANDBY | ||||
| parameter:  Standby | ||||
| ******************************************************************************/ | ||||
| void EPD_IT8951_Standby(void) | ||||
| { | ||||
|     EPD_IT8951_WriteCommand(IT8951_TCON_STANDBY); | ||||
| } | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	Cmd3 SLEEP | ||||
| parameter:  Sleep | ||||
| ******************************************************************************/ | ||||
| void EPD_IT8951_Sleep(void) | ||||
| { | ||||
|     EPD_IT8951_WriteCommand(IT8951_TCON_SLEEP); | ||||
| } | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	EPD_IT8951_Init | ||||
| parameter:   | ||||
| ******************************************************************************/ | ||||
| IT8951_Dev_Info EPD_IT8951_Init(UWORD VCOM) | ||||
| { | ||||
|     IT8951_Dev_Info Dev_Info; | ||||
|  | ||||
|     EPD_IT8951_Reset(); | ||||
|  | ||||
|     EPD_IT8951_SystemRun(); | ||||
|  | ||||
|     EPD_IT8951_GetSystemInfo(&Dev_Info); | ||||
|      | ||||
|     //Enable Pack write | ||||
|     EPD_IT8951_WriteReg(I80CPCR,0x0001); | ||||
|  | ||||
|     //Set VCOM by handle | ||||
|     if(VCOM != EPD_IT8951_GetVCOM()) | ||||
|     { | ||||
|         EPD_IT8951_SetVCOM(VCOM); | ||||
|         Debug("VCOM = -%.02fV\n",(float)EPD_IT8951_GetVCOM()/1000); | ||||
|     } | ||||
|     return Dev_Info; | ||||
| } | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	EPD_IT8951_Clear_Refresh | ||||
| parameter:   | ||||
| ******************************************************************************/ | ||||
| void EPD_IT8951_Clear_Refresh(IT8951_Dev_Info Dev_Info,UDOUBLE Target_Memory_Addr, UWORD Mode) | ||||
| { | ||||
|  | ||||
|     UDOUBLE ImageSize = ((Dev_Info.Panel_W * 4 % 8 == 0)? (Dev_Info.Panel_W * 4 / 8 ): (Dev_Info.Panel_W * 4 / 8 + 1)) * Dev_Info.Panel_H; | ||||
|     UBYTE* Frame_Buf = malloc (ImageSize); | ||||
|     memset(Frame_Buf, 0xFF, ImageSize); | ||||
|  | ||||
|  | ||||
|     IT8951_Load_Img_Info Load_Img_Info; | ||||
|     IT8951_Area_Img_Info Area_Img_Info; | ||||
|  | ||||
|     EPD_IT8951_WaitForDisplayReady(); | ||||
|  | ||||
|     Load_Img_Info.Source_Buffer_Addr = (UDOUBLE)Frame_Buf; | ||||
|     Load_Img_Info.Endian_Type = IT8951_LDIMG_L_ENDIAN; | ||||
|     Load_Img_Info.Pixel_Format = IT8951_4BPP; | ||||
|     Load_Img_Info.Rotate =  IT8951_ROTATE_0; | ||||
|     Load_Img_Info.Target_Memory_Addr = Target_Memory_Addr; | ||||
|  | ||||
|     Area_Img_Info.Area_X = 0; | ||||
|     Area_Img_Info.Area_Y = 0; | ||||
|     Area_Img_Info.Area_W = Dev_Info.Panel_W; | ||||
|     Area_Img_Info.Area_H = Dev_Info.Panel_H; | ||||
|  | ||||
|     EPD_IT8951_HostAreaPackedPixelWrite_4bp(&Load_Img_Info, &Area_Img_Info, false); | ||||
|  | ||||
|     EPD_IT8951_Display_Area(0, 0, Dev_Info.Panel_W, Dev_Info.Panel_H, Mode); | ||||
|  | ||||
|     free(Frame_Buf); | ||||
|     Frame_Buf = NULL; | ||||
| } | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	EPD_IT8951_1bp_Refresh | ||||
| parameter: | ||||
| ******************************************************************************/ | ||||
| void EPD_IT8951_1bp_Refresh(UBYTE* Frame_Buf, UWORD X, UWORD Y, UWORD W, UWORD H, UBYTE Mode, UDOUBLE Target_Memory_Addr, bool Packed_Write) | ||||
| { | ||||
|     IT8951_Load_Img_Info Load_Img_Info; | ||||
|     IT8951_Area_Img_Info Area_Img_Info; | ||||
|  | ||||
|     EPD_IT8951_WaitForDisplayReady(); | ||||
|  | ||||
|     Load_Img_Info.Source_Buffer_Addr = (UDOUBLE)Frame_Buf; | ||||
|     Load_Img_Info.Endian_Type = IT8951_LDIMG_L_ENDIAN; | ||||
|     //Use 8bpp to set 1bpp | ||||
|     Load_Img_Info.Pixel_Format = IT8951_8BPP; | ||||
|     Load_Img_Info.Rotate =  IT8951_ROTATE_0; | ||||
|     Load_Img_Info.Target_Memory_Addr = Target_Memory_Addr; | ||||
|  | ||||
|     Area_Img_Info.Area_X = X/8; | ||||
|     Area_Img_Info.Area_Y = Y; | ||||
|     Area_Img_Info.Area_W = W/8; | ||||
|     Area_Img_Info.Area_H = H; | ||||
|  | ||||
|  | ||||
|     //clock_t start, finish; | ||||
|     //double duration; | ||||
|  | ||||
|     //start = clock(); | ||||
|  | ||||
|     EPD_IT8951_HostAreaPackedPixelWrite_1bp(&Load_Img_Info, &Area_Img_Info, Packed_Write); | ||||
|  | ||||
|     //finish = clock(); | ||||
|     //duration = (double)(finish - start) / CLOCKS_PER_SEC; | ||||
| 	//Debug( "Write occupy %f second\n", duration ); | ||||
|  | ||||
|     //start = clock(); | ||||
|  | ||||
|     EPD_IT8951_Display_1bp(X,Y,W,H,Mode,Target_Memory_Addr,0xF0,0x00); | ||||
|  | ||||
|     //finish = clock(); | ||||
|     //duration = (double)(finish - start) / CLOCKS_PER_SEC; | ||||
| 	//Debug( "Show occupy %f second\n", duration ); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	EPD_IT8951_1bp_Multi_Frame_Write | ||||
| parameter:   | ||||
| ******************************************************************************/ | ||||
| void EPD_IT8951_1bp_Multi_Frame_Write(UBYTE* Frame_Buf, UWORD X, UWORD Y, UWORD W, UWORD H,UDOUBLE Target_Memory_Addr, bool Packed_Write) | ||||
| { | ||||
|     IT8951_Load_Img_Info Load_Img_Info; | ||||
|     IT8951_Area_Img_Info Area_Img_Info; | ||||
|  | ||||
|     EPD_IT8951_WaitForDisplayReady(); | ||||
|  | ||||
|     Load_Img_Info.Source_Buffer_Addr = (UDOUBLE)Frame_Buf; | ||||
|     Load_Img_Info.Endian_Type = IT8951_LDIMG_L_ENDIAN; | ||||
|     //Use 8bpp to set 1bpp | ||||
|     Load_Img_Info.Pixel_Format = IT8951_8BPP; | ||||
|     Load_Img_Info.Rotate =  IT8951_ROTATE_0; | ||||
|     Load_Img_Info.Target_Memory_Addr = Target_Memory_Addr; | ||||
|  | ||||
|     Area_Img_Info.Area_X = X/8; | ||||
|     Area_Img_Info.Area_Y = Y; | ||||
|     Area_Img_Info.Area_W = W/8; | ||||
|     Area_Img_Info.Area_H = H; | ||||
|  | ||||
|     EPD_IT8951_HostAreaPackedPixelWrite_1bp(&Load_Img_Info, &Area_Img_Info,Packed_Write); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	EPD_IT8951_1bp_Multi_Frame_Refresh | ||||
| parameter:   | ||||
| ******************************************************************************/ | ||||
| void EPD_IT8951_1bp_Multi_Frame_Refresh(UWORD X, UWORD Y, UWORD W, UWORD H,UDOUBLE Target_Memory_Addr) | ||||
| { | ||||
|     EPD_IT8951_WaitForDisplayReady(); | ||||
|  | ||||
|     EPD_IT8951_Display_1bp(X,Y,W,H, A2_Mode,Target_Memory_Addr,0xF0,0x00); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	EPD_IT8951_2bp_Refresh | ||||
| parameter:   | ||||
| ******************************************************************************/ | ||||
| void EPD_IT8951_2bp_Refresh(UBYTE* Frame_Buf, UWORD X, UWORD Y, UWORD W, UWORD H, bool Hold, UDOUBLE Target_Memory_Addr, bool Packed_Write) | ||||
| { | ||||
|     IT8951_Load_Img_Info Load_Img_Info; | ||||
|     IT8951_Area_Img_Info Area_Img_Info; | ||||
|  | ||||
|     EPD_IT8951_WaitForDisplayReady(); | ||||
|  | ||||
|     Load_Img_Info.Source_Buffer_Addr = (UDOUBLE)Frame_Buf; | ||||
|     Load_Img_Info.Endian_Type = IT8951_LDIMG_L_ENDIAN; | ||||
|     Load_Img_Info.Pixel_Format = IT8951_2BPP; | ||||
|     Load_Img_Info.Rotate =  IT8951_ROTATE_0; | ||||
|     Load_Img_Info.Target_Memory_Addr = Target_Memory_Addr; | ||||
|  | ||||
|     Area_Img_Info.Area_X = X; | ||||
|     Area_Img_Info.Area_Y = Y; | ||||
|     Area_Img_Info.Area_W = W; | ||||
|     Area_Img_Info.Area_H = H; | ||||
|  | ||||
|     EPD_IT8951_HostAreaPackedPixelWrite_2bp(&Load_Img_Info, &Area_Img_Info,Packed_Write); | ||||
|  | ||||
|     if(Hold == true) | ||||
|     { | ||||
|         EPD_IT8951_Display_Area(X,Y,W,H, GC16_Mode); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         EPD_IT8951_Display_AreaBuf(X,Y,W,H, GC16_Mode,Target_Memory_Addr); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	EPD_IT8951_4bp_Refresh | ||||
| parameter:   | ||||
| ******************************************************************************/ | ||||
| void EPD_IT8951_4bp_Refresh(UBYTE* Frame_Buf, UWORD X, UWORD Y, UWORD W, UWORD H, bool Hold, UDOUBLE Target_Memory_Addr, bool Packed_Write) | ||||
| { | ||||
|     IT8951_Load_Img_Info Load_Img_Info; | ||||
|     IT8951_Area_Img_Info Area_Img_Info; | ||||
|  | ||||
|     EPD_IT8951_WaitForDisplayReady(); | ||||
|  | ||||
|     Load_Img_Info.Source_Buffer_Addr = (UDOUBLE)Frame_Buf; | ||||
|     Load_Img_Info.Endian_Type = IT8951_LDIMG_L_ENDIAN; | ||||
|     Load_Img_Info.Pixel_Format = IT8951_4BPP; | ||||
|     Load_Img_Info.Rotate =  IT8951_ROTATE_0; | ||||
|     Load_Img_Info.Target_Memory_Addr = Target_Memory_Addr; | ||||
|  | ||||
|     Area_Img_Info.Area_X = X; | ||||
|     Area_Img_Info.Area_Y = Y; | ||||
|     Area_Img_Info.Area_W = W; | ||||
|     Area_Img_Info.Area_H = H; | ||||
|  | ||||
|     EPD_IT8951_HostAreaPackedPixelWrite_4bp(&Load_Img_Info, &Area_Img_Info, Packed_Write); | ||||
|  | ||||
|     if(Hold == true) | ||||
|     { | ||||
|         EPD_IT8951_Display_Area(X,Y,W,H, GC16_Mode); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         EPD_IT8951_Display_AreaBuf(X,Y,W,H, GC16_Mode,Target_Memory_Addr); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
| function :	EPD_IT8951_8bp_Refresh | ||||
| parameter:   | ||||
| ******************************************************************************/ | ||||
| void EPD_IT8951_8bp_Refresh(UBYTE *Frame_Buf, UWORD X, UWORD Y, UWORD W, UWORD H, bool Hold, UDOUBLE Target_Memory_Addr) | ||||
| { | ||||
|     IT8951_Load_Img_Info Load_Img_Info; | ||||
|     IT8951_Area_Img_Info Area_Img_Info; | ||||
|  | ||||
|     EPD_IT8951_WaitForDisplayReady(); | ||||
|  | ||||
|     Load_Img_Info.Source_Buffer_Addr = (UDOUBLE)Frame_Buf; | ||||
|     Load_Img_Info.Endian_Type = IT8951_LDIMG_L_ENDIAN; | ||||
|     Load_Img_Info.Pixel_Format = IT8951_8BPP; | ||||
|     Load_Img_Info.Rotate =  IT8951_ROTATE_0; | ||||
|     Load_Img_Info.Target_Memory_Addr = Target_Memory_Addr; | ||||
|  | ||||
|     Area_Img_Info.Area_X = X; | ||||
|     Area_Img_Info.Area_Y = Y; | ||||
|     Area_Img_Info.Area_W = W; | ||||
|     Area_Img_Info.Area_H = H; | ||||
|  | ||||
|     EPD_IT8951_HostAreaPackedPixelWrite_8bp(&Load_Img_Info, &Area_Img_Info); | ||||
|  | ||||
|     if(Hold == true) | ||||
|     { | ||||
|         EPD_IT8951_Display_Area(X, Y, W, H, GC16_Mode); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         EPD_IT8951_Display_AreaBuf(X, Y, W, H, GC16_Mode, Target_Memory_Addr); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,209 @@ | ||||
| /***************************************************************************** | ||||
| * | File      	:   EPD_IT8951.h | ||||
| * | Author      :   Waveshare team | ||||
| * | Function    :   IT8951 Common driver | ||||
| * | Info        : | ||||
| *---------------- | ||||
| * |	This version:   V1.0 | ||||
| * | Date        :   2019-09-17 | ||||
| * | 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. | ||||
| # | ||||
| ******************************************************************************/ | ||||
| #ifndef __EPD_IT8951_H_ | ||||
| #define __EPD_IT8951_H_ | ||||
|  | ||||
| #include <stdbool.h> | ||||
|  | ||||
| #include "../Config/DEV_Config.h" | ||||
|  | ||||
|  | ||||
| // INIT mode, for every init or some time after A2 mode refresh | ||||
| extern UBYTE INIT_Mode; | ||||
| // GC16 mode, for every time to display 16 grayscale image | ||||
| extern UBYTE GC16_Mode; | ||||
| // A2 mode, for fast refresh without flash | ||||
| extern UBYTE A2_Mode; | ||||
|  | ||||
|  | ||||
| typedef struct IT8951_Load_Img_Info | ||||
| { | ||||
|     UWORD    Endian_Type;         //little or Big Endian | ||||
|     UWORD    Pixel_Format;        //bpp | ||||
|     UWORD    Rotate;              //Rotate mode | ||||
|     UDOUBLE  Source_Buffer_Addr;  //Start address of source Frame buffer | ||||
|     UDOUBLE  Target_Memory_Addr;  //Base address of target image buffer | ||||
| }IT8951_Load_Img_Info; | ||||
|  | ||||
| typedef struct IT8951_Area_Img_Info | ||||
| { | ||||
|     UWORD Area_X; | ||||
|     UWORD Area_Y; | ||||
|     UWORD Area_W; | ||||
|     UWORD Area_H; | ||||
| }IT8951_Area_Img_Info; | ||||
|  | ||||
| typedef struct IT8951_Dev_Info | ||||
| { | ||||
|     UWORD Panel_W; | ||||
|     UWORD Panel_H; | ||||
|     UWORD Memory_Addr_L; | ||||
|     UWORD Memory_Addr_H; | ||||
|     UWORD FW_Version[8]; | ||||
|     UWORD LUT_Version[8]; | ||||
| }IT8951_Dev_Info; | ||||
|  | ||||
| /*----------------------------------------------------------------------- | ||||
| IT8951 Command defines | ||||
| ------------------------------------------------------------------------*/ | ||||
|  | ||||
| //Built in I80 Command Code | ||||
| #define IT8951_TCON_SYS_RUN      0x0001 | ||||
| #define IT8951_TCON_STANDBY      0x0002 | ||||
| #define IT8951_TCON_SLEEP        0x0003 | ||||
| #define IT8951_TCON_REG_RD       0x0010 | ||||
| #define IT8951_TCON_REG_WR       0x0011 | ||||
|  | ||||
| #define IT8951_TCON_MEM_BST_RD_T 0x0012 | ||||
| #define IT8951_TCON_MEM_BST_RD_S 0x0013 | ||||
| #define IT8951_TCON_MEM_BST_WR   0x0014 | ||||
| #define IT8951_TCON_MEM_BST_END  0x0015 | ||||
|  | ||||
| #define IT8951_TCON_LD_IMG       0x0020 | ||||
| #define IT8951_TCON_LD_IMG_AREA  0x0021 | ||||
| #define IT8951_TCON_LD_IMG_END   0x0022 | ||||
|  | ||||
| //I80 User defined command code | ||||
| #define USDEF_I80_CMD_DPY_AREA     0x0034 | ||||
| #define USDEF_I80_CMD_GET_DEV_INFO 0x0302 | ||||
| #define USDEF_I80_CMD_DPY_BUF_AREA 0x0037 | ||||
| #define USDEF_I80_CMD_VCOM		   0x0039 | ||||
|  | ||||
| /*----------------------------------------------------------------------- | ||||
|  IT8951 Mode defines | ||||
| ------------------------------------------------------------------------*/ | ||||
|  | ||||
| //Rotate mode | ||||
| #define IT8951_ROTATE_0     0 | ||||
| #define IT8951_ROTATE_90    1 | ||||
| #define IT8951_ROTATE_180   2 | ||||
| #define IT8951_ROTATE_270   3 | ||||
|  | ||||
| //Pixel mode (Bit per Pixel) | ||||
| #define IT8951_2BPP   0 | ||||
| #define IT8951_3BPP   1 | ||||
| #define IT8951_4BPP   2 | ||||
| #define IT8951_8BPP   3 | ||||
|  | ||||
| //Endian Type | ||||
| #define IT8951_LDIMG_L_ENDIAN   0 | ||||
| #define IT8951_LDIMG_B_ENDIAN   1 | ||||
|  | ||||
| /*----------------------------------------------------------------------- | ||||
| IT8951 Registers defines | ||||
| ------------------------------------------------------------------------*/ | ||||
| //Register Base Address | ||||
| #define DISPLAY_REG_BASE 0x1000               //Register RW access | ||||
|  | ||||
| //Base Address of Basic LUT Registers | ||||
| #define LUT0EWHR  (DISPLAY_REG_BASE + 0x00)   //LUT0 Engine Width Height Reg | ||||
| #define LUT0XYR   (DISPLAY_REG_BASE + 0x40)   //LUT0 XY Reg | ||||
| #define LUT0BADDR (DISPLAY_REG_BASE + 0x80)   //LUT0 Base Address Reg | ||||
| #define LUT0MFN   (DISPLAY_REG_BASE + 0xC0)   //LUT0 Mode and Frame number Reg | ||||
| #define LUT01AF   (DISPLAY_REG_BASE + 0x114)  //LUT0 and LUT1 Active Flag Reg | ||||
|  | ||||
| //Update Parameter Setting Register | ||||
| #define UP0SR     (DISPLAY_REG_BASE + 0x134)  //Update Parameter0 Setting Reg | ||||
| #define UP1SR     (DISPLAY_REG_BASE + 0x138)  //Update Parameter1 Setting Reg | ||||
| #define LUT0ABFRV (DISPLAY_REG_BASE + 0x13C)  //LUT0 Alpha blend and Fill rectangle Value | ||||
| #define UPBBADDR  (DISPLAY_REG_BASE + 0x17C)  //Update Buffer Base Address | ||||
| #define LUT0IMXY  (DISPLAY_REG_BASE + 0x180)  //LUT0 Image buffer X/Y offset Reg | ||||
| #define LUTAFSR   (DISPLAY_REG_BASE + 0x224)  //LUT Status Reg (status of All LUT Engines) | ||||
| #define BGVR      (DISPLAY_REG_BASE + 0x250)  //Bitmap (1bpp) image color table | ||||
|  | ||||
| //System Registers | ||||
| #define SYS_REG_BASE 0x0000 | ||||
|  | ||||
| //Address of System Registers | ||||
| #define I80CPCR (SYS_REG_BASE + 0x04) | ||||
|  | ||||
| //Memory Converter Registers | ||||
| #define MCSR_BASE_ADDR 0x0200 | ||||
| #define MCSR  (MCSR_BASE_ADDR + 0x0000) | ||||
| #define LISAR (MCSR_BASE_ADDR + 0x0008) | ||||
|  | ||||
|  | ||||
| /* | ||||
| void EPD_IT8951_SystemRun(); | ||||
| void EPD_IT8951_Standby(); | ||||
| void EPD_IT8951_Sleep(); | ||||
|  | ||||
| UWORD EPD_IT8951_ReadReg(UWORD Reg_Address); | ||||
| void EPD_IT8951_WriteReg(UWORD Reg_Address,UWORD Reg_Value); | ||||
| UWORD EPD_IT8951_GetVCOM(void); | ||||
| void EPD_IT8951_SetVCOM(UWORD VCOM); | ||||
|  | ||||
| void EPD_IT8951_LoadImgStart( IT8951_Load_Img_Info* Load_Img_Info ); | ||||
| void EPD_IT8951_LoadImgAreaStart( IT8951_Load_Img_Info* Load_Img_Info, IT8951_Area_Img_Info* Area_Img_Info ); | ||||
| void EPD_IT8951_LoadImgEnd(void); | ||||
|  | ||||
| void EPD_IT8951_GetSystemInfo(void* Buf); | ||||
| void EPD_IT8951_SetTargetMemoryAddr(UDOUBLE Target_Memory_Addr); | ||||
| void EPD_IT8951_WaitForDisplayReady(void); | ||||
|  | ||||
|  | ||||
| void EPD_IT8951_HostAreaPackedPixelWrite_8bp(IT8951_Load_Img_Info*Load_Img_Info,IT8951_Area_Img_Info*Area_Img_Info); | ||||
|  | ||||
| void EPD_IT8951_HostAreaPackedPixelWrite_1bp(IT8951_Load_Img_Info*Load_Img_Info,IT8951_Area_Img_Info*Area_Img_Info, bool Packed_Write); | ||||
|  | ||||
| void EPD_IT8951_HostAreaPackedPixelWrite_2bp(IT8951_Load_Img_Info*Load_Img_Info,IT8951_Area_Img_Info*Area_Img_Info, bool Packed_Write); | ||||
|  | ||||
| void EPD_IT8951_Display_Area(UWORD X,UWORD Y,UWORD W,UWORD H,UWORD Mode); | ||||
| void EPD_IT8951_Display_AreaBuf(UWORD X,UWORD Y,UWORD W,UWORD H,UWORD Mode, UDOUBLE Target_Memory_Addr); | ||||
|  | ||||
| void EPD_IT8951_Display_1bp(UWORD X, UWORD Y, UWORD W, UWORD H, UWORD Mode,UDOUBLE Target_Memory_Addr, UBYTE Front_Gray_Val, UBYTE Back_Gray_Val); | ||||
| */ | ||||
|  | ||||
| void Enhance_Driving_Capability(void); | ||||
|  | ||||
| void EPD_IT8951_SystemRun(void); | ||||
|  | ||||
| void EPD_IT8951_Standby(void); | ||||
|  | ||||
| void EPD_IT8951_Sleep(void); | ||||
|  | ||||
| IT8951_Dev_Info EPD_IT8951_Init(UWORD VCOM); | ||||
|  | ||||
| void EPD_IT8951_Clear_Refresh(IT8951_Dev_Info Dev_Info,UDOUBLE Target_Memory_Addr, UWORD Mode); | ||||
|  | ||||
| void EPD_IT8951_1bp_Refresh(UBYTE* Frame_Buf, UWORD X, UWORD Y, UWORD W, UWORD H, UBYTE Mode, UDOUBLE Target_Memory_Addr, bool Packed_Write); | ||||
| void EPD_IT8951_1bp_Multi_Frame_Write(UBYTE* Frame_Buf, UWORD X, UWORD Y, UWORD W, UWORD H,UDOUBLE Target_Memory_Addr, bool Packed_Write); | ||||
| void EPD_IT8951_1bp_Multi_Frame_Refresh(UWORD X, UWORD Y, UWORD W, UWORD H,UDOUBLE Target_Memory_Addr); | ||||
|  | ||||
| void EPD_IT8951_2bp_Refresh(UBYTE* Frame_Buf, UWORD X, UWORD Y, UWORD W, UWORD H, bool Hold, UDOUBLE Target_Memory_Addr, bool Packed_Write); | ||||
|  | ||||
| void EPD_IT8951_4bp_Refresh(UBYTE* Frame_Buf, UWORD X, UWORD Y, UWORD W, UWORD H, bool Hold, UDOUBLE Target_Memory_Addr, bool Packed_Write); | ||||
|  | ||||
| void EPD_IT8951_8bp_Refresh(UBYTE *Frame_Buf, UWORD X, UWORD Y, UWORD W, UWORD H, bool Hold, UDOUBLE Target_Memory_Addr); | ||||
|  | ||||
|  | ||||
|  | ||||
| #endif | ||||
		Reference in New Issue
	
	Block a user