From 878e29396c079c08229d5b4698f1fc1d48873ba6 Mon Sep 17 00:00:00 2001 From: Dana Conrad Date: Wed, 7 Aug 2024 01:12:55 +0000 Subject: ErosQNative: Add v3 LCD support, conditional on bootloader bootloader passes the player version to rockbox for LCD init changes Credit ZappBranigan2972 on forums for original changes Credit Bilgus for devicedata additions Change-Id: Ia2ca493edef49b7457e84dc19b05397dc915fa5a --- .../ingenic_x1000/erosqnative/lcd-erosqnative.c | 146 ++++++++++++++++++++- firmware/target/mips/ingenic_x1000/system-x1000.c | 7 +- 2 files changed, 150 insertions(+), 3 deletions(-) (limited to 'firmware/target/mips/ingenic_x1000') diff --git a/firmware/target/mips/ingenic_x1000/erosqnative/lcd-erosqnative.c b/firmware/target/mips/ingenic_x1000/erosqnative/lcd-erosqnative.c index 0d43a3f010..bcc30a71bd 100644 --- a/firmware/target/mips/ingenic_x1000/erosqnative/lcd-erosqnative.c +++ b/firmware/target/mips/ingenic_x1000/erosqnative/lcd-erosqnative.c @@ -25,11 +25,138 @@ #include "lcd-x1000.h" #include "gpio-x1000.h" #include "system.h" +#include "devicedata.h" /* for reference on these command/data hex values, see the mipi dcs lcd spec. * * Not everything here is there, but all the standard stuff is. */ -static const uint32_t erosqnative_lcd_cmd_enable[] = { +/* New Display Eroq 2.1 / Hifiwalker 1.7+ / Surfans v3.2, unknown Controller * + * (partially GC9A01 register compatible) * + * https://espruino.microcosm.app/api/v1/files/ \ * + * 9dc1b976d621a2ab3854312cce862c4a9a50dc1b.html#GC9A01 , * + * https://www.buydisplay.com/download/ic/GC9A01A.pdf , * + * https://lcddisplay.co/wp-content/uploads/2023/02/GC9A01.pdf * + * Init sequence From 'EROS Q (c口)_V2.1_20231209固件.zip' * + * update.upt/.iso -> In 'uboot.bin' at 0x52da0-0x5305f * + * http://www.eroshifi.com/download/firmware/122.html */ +static const uint32_t erosqnative_lcd_cmd_enable_v3[] = { + + /* Unlock EXTC? */ + LCD_INSTR_CMD, 0xfe, // Inter Register Enable1 + LCD_INSTR_CMD, 0xef, // Inter Register Enable2 + + LCD_INSTR_CMD, 0x36, // Memory Access Control +/* Bit7 1:vertical flip 0:no vertical flip + Bit6 1:horizontal flip 0:no horizontal flip + Bit3 1:BGR 0:RGB */ + LCD_INSTR_DAT, 0x90, + /* Pixel Format Set */ + LCD_INSTR_CMD, 0x3a, + LCD_INSTR_DAT, 0x55, /* Rockbox uses 16pp, OF specified 18 bpp */ + + LCD_INSTR_CMD, 0x84, // ?? (undocumented) + LCD_INSTR_DAT, 0x04, + LCD_INSTR_CMD, 0x86, // ?? + LCD_INSTR_DAT, 0xfb, + LCD_INSTR_CMD, 0x87, // ?? + LCD_INSTR_DAT, 0x79, + LCD_INSTR_CMD, 0x89, // ?? + LCD_INSTR_DAT, 0x0b, + LCD_INSTR_CMD, 0x8a, // ?? + LCD_INSTR_DAT, 0x20, + LCD_INSTR_CMD, 0x8b, // ?? + LCD_INSTR_DAT, 0x80, + LCD_INSTR_CMD, 0x8d, // ?? + LCD_INSTR_DAT, 0x3b, + LCD_INSTR_CMD, 0x8e, // ?? + LCD_INSTR_DAT, 0xcf, + + LCD_INSTR_CMD, 0xec, // Charge Pump Frequent Control + LCD_INSTR_DAT, 0x33, + LCD_INSTR_DAT, 0x02, + LCD_INSTR_DAT, 0x4c, + + LCD_INSTR_CMD, 0x98, // ?? (undocumented) + LCD_INSTR_DAT, 0x3e, + LCD_INSTR_CMD, 0x9c, // ?? + LCD_INSTR_DAT, 0x4b, + LCD_INSTR_CMD, 0x99, // ?? + LCD_INSTR_DAT, 0x3e, + LCD_INSTR_CMD, 0x9d, // ?? + LCD_INSTR_DAT, 0x4b, + LCD_INSTR_CMD, 0x9b, // ?? + LCD_INSTR_DAT, 0x55, + + LCD_INSTR_CMD, 0xe8, // Frame Rate + LCD_INSTR_DAT, 0x11, + LCD_INSTR_DAT, 0x00, + + LCD_INSTR_CMD, 0xff, // ?? (Adafruit & Co lib. C:0xFF, D:0x60, D:0x01, D:0x04) + LCD_INSTR_DAT, 0x62, // LCD_INSTR_DAT, 0x01, LCD_INSTR_DAT, 0x04, + LCD_INSTR_CMD, 0xc3, // Vreg1a voltage Control + LCD_INSTR_DAT, 0x20, + LCD_INSTR_CMD, 0xc4, // Vreg1b voltage Control + LCD_INSTR_DAT, 0x03, + LCD_INSTR_CMD, 0xc9, // Vreg2a voltage Control + LCD_INSTR_DAT, 0x2a, + + LCD_INSTR_CMD, 0xf0, // SET_GAMMA1 + LCD_INSTR_DAT, 0x4a, + LCD_INSTR_DAT, 0x10, + LCD_INSTR_DAT, 0x0a, + LCD_INSTR_DAT, 0x0a, + LCD_INSTR_DAT, 0x26, + LCD_INSTR_DAT, 0x39, + + LCD_INSTR_CMD, 0xf2, // SET_GAMMA3 + LCD_INSTR_DAT, 0x4a, + LCD_INSTR_DAT, 0x10, + LCD_INSTR_DAT, 0x0a, + LCD_INSTR_DAT, 0x0a, + LCD_INSTR_DAT, 0x26, + LCD_INSTR_DAT, 0x39, + + LCD_INSTR_CMD, 0xf1, // SET_GAMMA2 + LCD_INSTR_DAT, 0x50, + LCD_INSTR_DAT, 0x8f, + LCD_INSTR_DAT, 0xaf, + LCD_INSTR_DAT, 0x3b, + LCD_INSTR_DAT, 0x3f, + LCD_INSTR_DAT, 0x7f, + + LCD_INSTR_CMD, 0xf3, // SET_GAMMA4 + LCD_INSTR_DAT, 0x50, + LCD_INSTR_DAT, 0x8f, + LCD_INSTR_DAT, 0xaf, + LCD_INSTR_DAT, 0x3b, + LCD_INSTR_DAT, 0x3f, + LCD_INSTR_DAT, 0x7f, + + LCD_INSTR_CMD, 0xba, // TE Control + LCD_INSTR_DAT, 0x0a, + +#ifdef BOOTLOADER + LCD_INSTR_CMD, 0x35, // Tearing Effect Line ON + LCD_INSTR_DAT, 0x00, +#endif + + LCD_INSTR_CMD, 0x21, /* Invert */ + + /* Lock EXTC? */ + LCD_INSTR_CMD, 0xfe, // Inter Register Enable1 + LCD_INSTR_CMD, 0xee, + + /* Exit Sleep */ + LCD_INSTR_CMD, 0x11, + LCD_INSTR_UDELAY, 120000, + /* Display On */ + LCD_INSTR_CMD, 0x29, + LCD_INSTR_UDELAY, 20000, + LCD_INSTR_END, +}; + +/* Original Display / Hifiwalker -1.5 / Surfans -2.7 */ +static const uint32_t erosqnative_lcd_cmd_enable_v1[] = { /* Set EXTC? */ LCD_INSTR_CMD, 0xc8, LCD_INSTR_DAT, 0xff, @@ -179,7 +306,22 @@ void lcd_tgt_enable(bool enable) mdelay(5); gpio_set_level(GPIO_LCD_CE, 0); - lcd_exec_commands(&erosqnative_lcd_cmd_enable[0]); +#ifdef BOOTLOADER +# if EROSQN_VER == 3 + lcd_exec_commands(&erosqnative_lcd_cmd_enable_v3[0]); +# else + lcd_exec_commands(&erosqnative_lcd_cmd_enable_v1[0]); +# endif +#else + if (device_data.lcd_version == 3) + { + lcd_exec_commands(&erosqnative_lcd_cmd_enable_v3[0]); + } + else + { + lcd_exec_commands(&erosqnative_lcd_cmd_enable_v1[0]); + } +#endif } else { /* doesn't flash white if we don't do anything... */ #if 0 diff --git a/firmware/target/mips/ingenic_x1000/system-x1000.c b/firmware/target/mips/ingenic_x1000/system-x1000.c index 32ac66ec92..1c850736b6 100644 --- a/firmware/target/mips/ingenic_x1000/system-x1000.c +++ b/firmware/target/mips/ingenic_x1000/system-x1000.c @@ -20,6 +20,7 @@ ****************************************************************************/ #include "system.h" +#include #include "mips.h" #include "panic.h" #include "button.h" @@ -36,6 +37,10 @@ #include "x1000/msc.h" #include "x1000/aic.h" +#if defined(HAVE_DEVICEDATA) +#include "devicedata.h" +#endif + #ifdef X1000_CPUIDLE_STATS int __cpu_idle_avg = 0; int __cpu_idle_cur = 0; @@ -88,7 +93,7 @@ void fill_devicedata(struct device_data_t *data) memset(data->payload, 0xff, data->length); data->lcd_version = EROSQN_VER; #else - uint8_t lcd_version = data->lcd_version; + uint8_t lcd_version = device_data.lcd_version; memset(data->payload, 0xff, data->length); data->lcd_version = lcd_version; #endif -- cgit v1.2.3