diff --git a/Readme.txt b/Readme.txt index 69695b7..413a858 100644 --- a/Readme.txt +++ b/Readme.txt @@ -37,6 +37,7 @@ 此种型号有两种电路板: 5个测试点: pinout_1.xlsx 6个测试点: pinout_0.xlsx + 另外,这种屏有少数用的主控是SSD1675B。这两种主控的LUT格式是不一样的。 2.13寸黑白红: 屏是直接焊接到主板上的,型号: HINK-E0213A67,主控IL3897 diff --git a/src/config/user_config.h b/src/config/user_config.h index 96a98a8..c754f53 100644 --- a/src/config/user_config.h +++ b/src/config/user_config.h @@ -55,7 +55,7 @@ **************************************************************************************** */ -#define EPD_VERSION 0xA50f0002 +#define EPD_VERSION 0xA50f0003 /* diff --git a/src/epd/epd.c b/src/epd/epd.c index 0c983e1..ec3de90 100644 --- a/src/epd/epd.c +++ b/src/epd/epd.c @@ -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