mirror of
https://github.com/tpunix/HMCLOCK.git
synced 2026-03-19 02:59:45 +08:00
根据LUT大小自动适配
This commit is contained in:
@@ -37,6 +37,7 @@
|
||||
此种型号有两种电路板:
|
||||
5个测试点: pinout_1.xlsx
|
||||
6个测试点: pinout_0.xlsx
|
||||
另外,这种屏有少数用的主控是SSD1675B。这两种主控的LUT格式是不一样的。
|
||||
|
||||
2.13寸黑白红:
|
||||
屏是直接焊接到主板上的,型号: HINK-E0213A67,主控IL3897
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
****************************************************************************************
|
||||
*/
|
||||
|
||||
#define EPD_VERSION 0xA50f0002
|
||||
#define EPD_VERSION 0xA50f0003
|
||||
|
||||
|
||||
/*
|
||||
|
||||
220
src/epd/epd.c
220
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<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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user