From 1249a791cc6d8ba60620a53c7b323e4b53b8c1cd Mon Sep 17 00:00:00 2001 From: Silvano Seva Date: Tue, 2 Feb 2021 10:36:54 +0100 Subject: [PATCH] Automatic display detection and configuration in MDx display driver --- platform/drivers/display/HX83XX_MDx.c | 260 +++++++++++++++++++------- 1 file changed, 188 insertions(+), 72 deletions(-) diff --git a/platform/drivers/display/HX83XX_MDx.c b/platform/drivers/display/HX83XX_MDx.c index 708bfd2d..7701f6f0 100644 --- a/platform/drivers/display/HX83XX_MDx.c +++ b/platform/drivers/display/HX83XX_MDx.c @@ -15,16 +15,13 @@ * along with this program; if not, see * ***************************************************************************/ -#include -#include -#include -#include -#include #include #include #include -#include "hwconfig.h" -#include "stm32f4xx.h" +#include +#include +#include +#include /** * LCD command set, basic and extended @@ -214,70 +211,181 @@ void display_init() gpio_clearPin(LCD_CS); /** - * The following command sequence has been taken as-is from Tytera original - * firmware. Without it, screen needs framebuffer data to be sent very slowly, + * The command sequence below has been taken as-is from the LCD initialisation + * routine at address 0x0804d1c8 of Tytera's firmware for MD-UV380 radios, + * version S18.016. + * It has also been cross-checked with the firmware image for MD-380/390 to + * ensure that is compatible also with the displays of that radios. + * Without this sequence, screen needs framebuffer data to be sent very slowly, * otherwise nothing will be rendered. * Since we do not have the datasheet for the controller employed in this - * screen, we can only copy-and-paste... + * screen, we can only do copy-and-paste... */ - writeCmd(0xfe); - writeCmd(0xef); - writeCmd(0xb4); - writeData(0x00); - writeCmd(0xff); - writeData(0x16); - writeCmd(0xfd); - writeData(0x4f); - writeCmd(0xa4); - writeData(0x70); - writeCmd(0xe7); - writeData(0x94); - writeData(0x88); - writeCmd(0xea); - writeData(0x3a); - writeCmd(0xed); - writeData(0x11); - writeCmd(0xe4); - writeData(0xc5); - writeCmd(0xe2); - writeData(0x80); - writeCmd(0xa3); - writeData(0x12); - writeCmd(0xe3); - writeData(0x07); - writeCmd(0xe5); - writeData(0x10); - writeCmd(0xf0); - writeData(0x00); - writeCmd(0xf1); - writeData(0x55); - writeCmd(0xf2); - writeData(0x05); - writeCmd(0xf3); - writeData(0x53); - writeCmd(0xf4); - writeData(0x00); - writeCmd(0xf5); - writeData(0x00); - writeCmd(0xf7); - writeData(0x27); - writeCmd(0xf8); - writeData(0x22); - writeCmd(0xf9); - writeData(0x77); - writeCmd(0xfa); - writeData(0x35); - writeCmd(0xfb); - writeData(0x00); - writeCmd(0xfc); - writeData(0x00); - writeCmd(0xfe); - writeCmd(0xef); - writeCmd(0xe9); - writeData(0x00); - delayMs(20); + uint8_t lcd_type = platform_getHwInfo()->lcd_type; - /** The registers and commands below are the same in HX8353-E controller **/ + if((lcd_type == 2) || (lcd_type == 3)) + { +// writeCmd(0x3a); +// writeData(0x05); +// writeCmd(0x36); +// +// if(lcd_type == 3) +// writeData(8); +// else +// writeData(0x88); + + writeCmd(0xfe); + writeCmd(0xef); + writeCmd(0xb4); + writeData(0x00); + writeCmd(0xff); + writeData(0x16); + writeCmd(0xfd); + + if(lcd_type == 3) + writeData(0x40); + else + writeData(0x4f); + + writeCmd(0xa4); + writeData(0x70); + writeCmd(0xe7); + writeData(0x94); + writeData(0x88); + writeCmd(0xea); + writeData(0x3a); + writeCmd(0xed); + writeData(0x11); + writeCmd(0xe4); + writeData(0xc5); + writeCmd(0xe2); + writeData(0x80); + writeCmd(0xa3); + writeData(0x12); + writeCmd(0xe3); + writeData(0x07); + writeCmd(0xe5); + writeData(0x10); + writeCmd(0xf0); + writeData(0x00); + writeCmd(0xf1); + writeData(0x55); + writeCmd(0xf2); + writeData(0x05); + writeCmd(0xf3); + writeData(0x53); + writeCmd(0xf4); + writeData(0x00); + writeCmd(0xf5); + writeData(0x00); + writeCmd(0xf7); + writeData(0x27); + writeCmd(0xf8); + writeData(0x22); + writeCmd(0xf9); + writeData(0x77); + writeCmd(0xfa); + writeData(0x35); + writeCmd(0xfb); + writeData(0x00); + writeCmd(0xfc); + writeData(0x00); + writeCmd(0xfe); + writeCmd(0xef); + writeCmd(0xe9); + writeData(0x00); + delayMs(20); +// writeCmd(0x11); +// delayMs(120); +// writeCmd(0x29); +// writeCmd(0x2c); + } + else + { + writeCmd(0x11); + delayMs(120); + writeCmd(0xb1); + writeData(0x05); + writeData(0x3c); + writeData(0x3c); + writeCmd(0xb2); + writeData(0x05); + writeData(0x3c); + writeData(0x3c); + writeCmd(0xb3); + writeData(0x05); + writeData(0x3c); + writeData(0x3c); + writeData(0x05); + writeData(0x3c); + writeData(0x3c); + writeCmd(0xb4); + writeData(0x03); + writeCmd(0xc0); + writeData(0x28); + writeData(0x08); + writeData(0x04); + writeCmd(0xc1); + writeData(0xc0); + writeCmd(0xc2); + writeData(0xd); + writeData(0x00); + writeCmd(0xc3); + writeData(0x8d); + writeData(0x2a); + writeCmd(0xc4); + writeData(0x8d); + writeData(0xee); + writeCmd(0xc5); + writeData(0x1a); + writeCmd(0x36); + writeData(0x08); + writeCmd(0xe0); + writeData(0x04); + writeData(0x0c); + writeData(0x07); + writeData(0x0a); + writeData(0x2e); + writeData(0x30); + writeData(0x25); + writeData(0x2a); + writeData(0x28); + writeData(0x26); + writeData(0x2e); + writeData(0x3a); + writeData(0x00); + writeData(0x01); + writeData(0x03); + writeData(0x13); + writeCmd(0xe1); + writeData(0x04); + writeData(0x16); + writeData(0x06); + writeData(0x0d); + writeData(0x2d); + writeData(0x26); + writeData(0x23); + writeData(0x27); + writeData(0x27); + writeData(0x25); + writeData(0x2d); + writeData(0x3b); + writeData(0x00); + writeData(0x01); + writeData(0x04); + writeData(0x13); +// writeCmd(0x3a); +// writeData(0x05); +// writeCmd(0x36); +// +// if(lcd_type == 1) +// writeData(200); +// else +// writeData(8); + +// writeCmd(0x29); +// writeCmd(0x2c); + } /* * Configuring screen's memory access control: TYT MD3x0 radios have the screen @@ -296,12 +404,20 @@ void display_init() * - SS (bit 2): 0 -> refresh screen left-to-right * - bit 1 and 0: don't care */ + writeCmd(CMD_MADCTL); - #ifndef DISPLAY_MIRROR_X - writeData(0x60); /* MD390 and similar radios: screen "normal" */ - #else - writeData(0xA0); /* MD380 and similar radios: screen mirrored */ - #endif + if(lcd_type == 1) + { + writeData(0x60); /* Reference case: MD-390(G) */ + } + else if(lcd_type == 2) + { + writeData(0x20); /* Reference case: MD-380V(G) */ + } + else + { + writeData(0xA0); /* Reference case: MD-380 */ + } writeCmd(CMD_CASET); writeData(0x00);