根据LUT大小自动适配

This commit is contained in:
tpu
2025-05-22 17:21:04 +08:00
parent 9178c01880
commit 41bce96de3
4 changed files with 140 additions and 84 deletions

View File

@@ -37,6 +37,7 @@
此种型号有两种电路板:
5个测试点: pinout_1.xlsx
6个测试点: pinout_0.xlsx
另外这种屏有少数用的主控是SSD1675B。这两种主控的LUT格式是不一样的。
2.13寸黑白红:
屏是直接焊接到主板上的,型号: HINK-E0213A67主控IL3897

View File

@@ -55,7 +55,7 @@
****************************************************************************************
*/
#define EPD_VERSION 0xA50f0002
#define EPD_VERSION 0xA50f0003
/*

View File

@@ -12,6 +12,7 @@ int scr_mode;
int line_bytes;
int scr_padding;
int update_mode;
int lut_size;
// 窗口参数
@@ -19,6 +20,113 @@ int win_w;
int win_h;
/******************************************************************************/
u8 lut_fast_70[80] = {
// RP0 RP1 RP2 RP3 RP4 RP5 RP6
0x80, 0x60, 0x40, 0x00, 0x00, 0x00, 0x00, // LUT0
0x10, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, // LUT1
0x80, 0x60, 0x40, 0x00, 0x00, 0x00, 0x00, // LUT0
0x10, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, // LUT1
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // LUT4
0x03, 0x03, 0x00, 0x00, 0x02, // Group0
0x09, 0x09, 0x00, 0x00, 0x02, // Group1
0x03, 0x03, 0x00, 0x00, 0x02, // Group2
0x00, 0x00, 0x00, 0x00, 0x00, // Group3
0x00, 0x00, 0x00, 0x00, 0x00, // Group4
0x00, 0x00, 0x00, 0x00, 0x00, // Group5
0x00, 0x00, 0x00, 0x00, 0x00, // Group6
// VGH VSH1 VSH2 VSL FR1 FR2
0x15, 0x41, 0xa8, 0x32, 0x30, 0x0a,
};
// 这里如果B-B和W->W不驱动的话屏幕很快就会花掉。
// 但如果驱动的话,这种黑白转换就没有意义了。
u8 lut_fly_70[80] = {
// RP0 RP1 RP2 RP3 RP4 RP5 RP6
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // LUT0 B->B
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // LUT1 B->W
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // LUT2 W->B
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // LUT3 W->W
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // LUT4
0x0f, 0x00, 0x00, 0x00, 0x01, // Group0
0x00, 0x00, 0x00, 0x00, 0x01, // Group1
0x00, 0x00, 0x00, 0x00, 0x01, // Group2
0x00, 0x00, 0x00, 0x00, 0x01, // Group3
0x00, 0x00, 0x00, 0x00, 0x01, // Group4
0x00, 0x00, 0x00, 0x00, 0x01, // Group5
0x00, 0x00, 0x00, 0x00, 0x01, // Group6
// VGH VSH1 VSH2 VSL FR1 FR2
0x15, 0x41, 0xa8, 0x32, 0x0a, 0x2e,
};
u8 lut_fast_100[112] = {
// RP0 RP1 RP2 RP3 RP4 RP5 RP6 RP7 RP8 RP9
0x80, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // LUT0
0x10, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // LUT1
0x80, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // LUT0
0x10, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // LUT1
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // LUT4
0x03, 0x03, 0x00, 0x00, 0x02, // Group0
0x06, 0x06, 0x00, 0x00, 0x02, // Group1
0x03, 0x03, 0x00, 0x00, 0x02, // Group2
0x00, 0x00, 0x00, 0x00, 0x00, // Group3
0x00, 0x00, 0x00, 0x00, 0x00, // Group4
0x00, 0x00, 0x00, 0x00, 0x00, // Group5
0x00, 0x00, 0x00, 0x00, 0x00, // Group6
0x00, 0x00, 0x00, 0x00, 0x00, // Group7
0x00, 0x00, 0x00, 0x00, 0x00, // Group8
0x00, 0x00, 0x00, 0x00, 0x00, // Group9
// VGH VSH1 VSH2 VSL VCOM FR1 FR2
0x15, 0x41, 0xa8, 0x32, 0x50, 0x0f, 0x0c,
};
// 这里如果B-B和W->W不驱动的话屏幕很快就会花掉。
// 但如果驱动的话,这种黑白转换就没有意义了。
u8 lut_fly_100[112] = {
// RP0 RP1 RP2 RP3 RP4 RP5 RP6 RP7 RP8 RP9
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // LUT0 B->B
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // LUT1 B->W
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // LUT2 W->B
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // LUT3 W->W
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // LUT4
0x0f, 0x00, 0x00, 0x00, 0x01, // Group0
0x00, 0x00, 0x00, 0x00, 0x01, // Group1
0x00, 0x00, 0x00, 0x00, 0x01, // Group2
0x00, 0x00, 0x00, 0x00, 0x01, // Group3
0x00, 0x00, 0x00, 0x00, 0x01, // Group4
0x00, 0x00, 0x00, 0x00, 0x01, // Group5
0x00, 0x00, 0x00, 0x00, 0x01, // Group6
0x00, 0x00, 0x00, 0x00, 0x01, // Group7
0x00, 0x00, 0x00, 0x00, 0x01, // Group8
0x00, 0x00, 0x00, 0x00, 0x01, // Group9
// VGH VSH1 VSH2 VSL VCOM FR1 FR2
0x15, 0x41, 0xa8, 0x32, 0x50, 0x0f, 0x0c,
};
u8 *lut_fast = lut_fast_70;
u8 *lut_fly = lut_fly_70;
/******************************************************************************/
// x必须是8的倍数且x2>x1, Y2>y1
void epd_window(int x1, int y1, int x2, int y2)
{
@@ -90,80 +198,24 @@ void epd_pos(int x, int y)
epd_data(y>>8);
}
u8 lut_fast[80] = {
// RP0 RP1 RP2 RP3 RP4 RP5 RP6
0x80, 0x60, 0x40, 0x00, 0x00, 0x00, 0x00, // LUT0
0x10, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, // LUT1
0x80, 0x60, 0x40, 0x00, 0x00, 0x00, 0x00, // LUT0
0x10, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, // LUT1
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // LUT4
0x03, 0x03, 0x00, 0x00, 0x02, // Group0
0x09, 0x09, 0x00, 0x00, 0x02, // Group1
0x03, 0x03, 0x00, 0x00, 0x02, // Group2
0x00, 0x00, 0x00, 0x00, 0x00, // Group3
0x00, 0x00, 0x00, 0x00, 0x00, // Group4
0x00, 0x00, 0x00, 0x00, 0x00, // Group5
0x00, 0x00, 0x00, 0x00, 0x00, // Group6
// VGH VSH1 VSH2 VSL FR1 FR2
0x15, 0x41, 0xa8, 0x32, 0x30, 0x0a,
};
// 这里如果B-B和W->W不驱动的话屏幕很快就会花掉。
// 但如果驱动的话,这种黑白转换就没有意义了。
u8 lut_fly[80] = {
// RP0 RP1 RP2 RP3 RP4 RP5 RP6
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // LUT0 B->B
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // LUT1 B->W
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // LUT2 W->B
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // LUT3 W->W
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // LUT4
0x0f, 0x00, 0x00, 0x00, 0x01, // Group0
0x00, 0x00, 0x00, 0x00, 0x01, // Group1
0x00, 0x00, 0x00, 0x00, 0x01, // Group2
0x00, 0x00, 0x00, 0x00, 0x01, // Group3
0x00, 0x00, 0x00, 0x00, 0x01, // Group4
0x00, 0x00, 0x00, 0x00, 0x01, // Group5
0x00, 0x00, 0x00, 0x00, 0x01, // Group6
// VGH VSH1 VSH2 VSL FR1 FR2
0x15, 0x41, 0xa8, 0x32, 0x0a, 0x2e,
};
u8 lut_otp[80] = {
0x96, 0x82, 0x99, 0x21, 0x51, 0x00, 0x04, // LUT0
0x96, 0x11, 0x99, 0x21, 0xa8, 0x20, 0x80, // LUT1
0x96, 0x8a, 0x99, 0x21, 0x91, 0x2b, 0xaf, // LUT2
0x96, 0x8a, 0x99, 0x21, 0x91, 0x2b, 0xaf, // LUT3
0x5a, 0x01, 0x00, 0x12, 0x60, 0x00, 0x00, // LUTC
0x0a, 0x01, 0x0a, 0x01, 0x02, //Group0
0x24, 0x58, 0x3e, 0x06, 0x00, //Group1
0x03, 0x03, 0x03, 0x03, 0x0e, //Group2
0x01, 0x14, 0x01, 0x14, 0x04, //Group3
0x02, 0x02, 0x0a, 0x08, 0x02, //Group4
0x04, 0x06, 0x03, 0x26, 0x04, //Group5
0x04, 0x04, 0x03, 0x26, 0x03, //Group6
// VGH VSH1 VSH2 VSL FR1 FR2
0x11, 0x37, 0xb2, 0x2a, 0x1b, 0x07
};
void epd_load_lut(u8 *lut)
{
epd_cmd(0x32);
epd_data_array(lut, 70);
epd_cmd1(0x03, lut[70]);
epd_cmd3(0x04, lut[71], lut[72], lut[73]);
//epd_cmd1(0x3a, lut[74]);
//epd_cmd1(0x3b, lut[75]);
epd_data_array(lut, lut_size);
epd_cmd1(0x03, lut[lut_size+0]);
epd_cmd3(0x04, lut[lut_size+1], lut[lut_size+2], lut[lut_size+3]);
if(lut_size==70){
epd_cmd1(0x3a, lut[lut_size+4]); // FR1
epd_cmd1(0x3b, lut[lut_size+5]); // FR2
}else{
epd_cmd1(0x2c, lut[lut_size+4]); // VCOM
epd_cmd1(0x3a, lut[lut_size+5]); // FR1
epd_cmd1(0x3b, lut[lut_size+6]); // FR2
}
}
@@ -171,28 +223,29 @@ void epd_dump_lut(void)
{
u8 lut[256];
int i, j;
int group = (lut_size==70)? 7 : 10;
epd_cmd_read(0x33, lut, 256);
for(i=0; i<5; i++){
printk("\t");
for(j=0; j<7; j++){
for(j=0; j<group; j++){
printk("0x%02x, ", lut[i*7+j]);
}
printk(" // LUT%d\n", i);
}
for(i=0; i<7; i++){
for(i=0; i<group; i++){
printk("\t");
for(j=0; j<5; j++){
printk("0x%02x, ", lut[35+i*5+j]);
printk("0x%02x, ", lut[group*5+i*5+j]);
}
printk(" // Group%d\n", i);
}
printk("\t");
for(i=0; i<7; i++){
printk("0x%02x, ", lut[70+i]);
printk("0x%02x, ", lut[group*10+i]);
}
printk("\n\n");
@@ -216,12 +269,19 @@ int epd_lut_size(void)
if(lut[i]!=0xa5)
break;
}
printk("LUT size: %d\n", i);
lut_size = i;
printk("LUT size: %d\n", lut_size);
//hex_dump("LUT", lut, 256);
return i;
if(lut_size==100){
lut_fast = lut_fast_100;
lut_fly = lut_fly_100;
}
return lut_size;
}
void epd_init(void)
{
//printk("epd_init: %dx%d\n", scr_w, scr_h);
@@ -251,13 +311,6 @@ void epd_init(void)
epd_window(0, 0, scr_w-1, scr_h-1);
epd_cmd1(0x18, 0x80); // Read Built-in temperature sensor
#if 0
epd_cmd1(0x22, 0xb1);
epd_cmd(0x20);
epd_wait();
epd_dump_lut();
#endif
}
@@ -366,6 +419,7 @@ int epd_detect(void)
epd_cmd(0x12); // SWRESET
if(epd_busy()){
epd_wait();
epd_lut_size();
retv = 1;
}
epd_hw_close();

View File

@@ -184,6 +184,7 @@ void user_app_init(void)
epd_hw_init(0x23200700, 0x05210006, 104, 212, ROTATE_3); // 2.13黑白屏6个测试点
if(epd_detect()==0){
epd_hw_init(0x23111000, 0x07210120, 104, 212, ROTATE_3); // 2.13黑白屏5个测试点
epd_detect();
}
selflash(otp_boot);