mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 01:49:46 +00:00
Extending ili9881c driver support for nwe080 panel
Signed-off-by: Penk Chen <penk@cutiepi.io> drm/panel: ilitek-ili9881c: Clean up on mipi_dsi_attach failure mipi_dsi_attach is allowed to fail, and currently the probe code doesn't clean up (mainly drm_panel_remove) if this happens. Add cleanup code on failure. Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com> drm/panel: panel-ilitek9881c: Add prepare_upstream_first flag The panel sends MIPI DCS commands during prepare and is expecting the bus to remain in LP-11 state in-between. Set the prepare_upstream_first flag so that the upstream DSI host is prepared / pre_enabled first, and therefore the bus is in a defined state. Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com> drm/panel: panel-ilitek9881c: Use cansleep methods Use cansleep version of gpiod_set_value so external IO drivers (like via I2C) can be used. Signed-off-by: Mark Williams <mwp@mwp.id.au> drm/panel: panel-ilitek9881c: Crystalfontz support Add support for Crystalfontz CFAF7201280A0-050Tx panel. Signed-off-by: Mark Williams <mwp@mwp.id.au> drm/panel: ilitek-ili9881c: Allow configuration of the number of lanes Not all panels use all 4 data lanes, so allow configuration based on the compatible string. Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com> drm/panel: ili9881: Add configuration for the new panels Add configuration for the 5" and 7" Raspberry Pi 720x1280 DSI panels based on ili9881. Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com> drm: panel: ili9881: Correct symmetry on enable/disable return codes ili9881c_enable is always returning 0. ili9881c_disable was returning the error code from mipi_dsi_dcs_set_display_off. If non-zero, the drm_panel framework will leave the panel marked as enabled, and not run the enable hook next time around. That isn't helpful, particularly as we're expecting unprepare to disable resets and regulators. Change ili9881c_disable to match enable in always returning 0. Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com> drm: panel: ili9881: Add option to reconfigure setup commands The driver is typically asking for LP commands, but then tries to send set_display_[on|off] from enable/disable when the host will be in HS mode. It also sends shutdown commands just before it asserts reset and disables the regulator, which is rather redundant. Add an option to configure these two choices from the panel_desc. Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com> Update panel-ilitek-ili9881c.c Correcting display dimension typo ILI9881C: Update timings for CFAF7201280A0-050TX Update of ILI9881C CFAF7201280A0-050TX panel timing to work with the CM5. Signed-off-by: Mark Williams <mark@crystalfontz.com> drm/panel: ilitek-ili9881c: Restore lanes configuration for nwe080 panel This config was missing with the forward porting of the rasp pi kernel to 6.12. Refer to https://github.com/raspberrypi/linux/issues/6856 Signed-off-by: Jack O'Brien <obri.jack.02@gmail.com>
This commit is contained in:
@@ -1,6 +1,9 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (C) 2017-2018, Bootlin
|
||||
* Copyright (C) 2021, Henson Li <henson@cutiepi.io>
|
||||
* Copyright (C) 2021, Penk Chen <penk@cutiepi.io>
|
||||
* Copyright (C) 2022, Mark Williams <mark@crystalfontz.com>
|
||||
*/
|
||||
|
||||
#include <linux/delay.h>
|
||||
@@ -37,6 +40,12 @@ struct ili9881c_instr {
|
||||
} arg;
|
||||
};
|
||||
|
||||
enum ili9881_desc_flags {
|
||||
ILI9881_FLAGS_NO_SHUTDOWN_CMDS = BIT(0),
|
||||
ILI9881_FLAGS_PANEL_ON_IN_PREPARE = BIT(1),
|
||||
ILI9881_FLAGS_MAX = BIT(31),
|
||||
};
|
||||
|
||||
struct ili9881c_desc {
|
||||
const struct ili9881c_instr *init;
|
||||
const size_t init_length;
|
||||
@@ -44,6 +53,7 @@ struct ili9881c_desc {
|
||||
const unsigned long mode_flags;
|
||||
u8 default_address_mode;
|
||||
unsigned int lanes;
|
||||
enum ili9881_desc_flags flags;
|
||||
};
|
||||
|
||||
struct ili9881c {
|
||||
@@ -1224,6 +1234,622 @@ static const struct ili9881c_instr am8001280g_init[] = {
|
||||
ILI9881C_COMMAND_INSTR(MIPI_DCS_WRITE_POWER_SAVE, 0x00),
|
||||
};
|
||||
|
||||
static const struct ili9881c_instr nwe080_init[] = {
|
||||
ILI9881C_SWITCH_PAGE_INSTR(3),
|
||||
//GIP_1
|
||||
ILI9881C_COMMAND_INSTR(0x01, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x02, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x03, 0x73),
|
||||
ILI9881C_COMMAND_INSTR(0x04, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x05, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x06, 0x0A),
|
||||
ILI9881C_COMMAND_INSTR(0x07, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x08, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x09, 0x20),
|
||||
ILI9881C_COMMAND_INSTR(0x0a, 0x20),
|
||||
ILI9881C_COMMAND_INSTR(0x0b, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x0c, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x0d, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x0e, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x0f, 0x1E),
|
||||
ILI9881C_COMMAND_INSTR(0x10, 0x1E),
|
||||
ILI9881C_COMMAND_INSTR(0x11, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x12, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x13, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x14, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x15, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x16, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x17, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x18, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x19, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x1A, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x1B, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x1C, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x1D, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x1E, 0x40),
|
||||
ILI9881C_COMMAND_INSTR(0x1F, 0x80),
|
||||
ILI9881C_COMMAND_INSTR(0x20, 0x06),
|
||||
ILI9881C_COMMAND_INSTR(0x21, 0x01),
|
||||
ILI9881C_COMMAND_INSTR(0x22, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x23, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x24, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x25, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x26, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x27, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x28, 0x33),
|
||||
ILI9881C_COMMAND_INSTR(0x29, 0x03),
|
||||
ILI9881C_COMMAND_INSTR(0x2A, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x2B, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x2C, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x2D, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x2E, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x2F, 0x00),
|
||||
|
||||
ILI9881C_COMMAND_INSTR(0x30, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x31, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x32, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x33, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x34, 0x04),
|
||||
ILI9881C_COMMAND_INSTR(0x35, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x36, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x37, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x38, 0x3C),
|
||||
ILI9881C_COMMAND_INSTR(0x39, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x3A, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x3B, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x3C, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x3D, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x3E, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x3F, 0x00),
|
||||
|
||||
ILI9881C_COMMAND_INSTR(0x40, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x41, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x42, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x43, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x44, 0x00),
|
||||
|
||||
ILI9881C_COMMAND_INSTR(0x50, 0x10),
|
||||
ILI9881C_COMMAND_INSTR(0x51, 0x32),
|
||||
ILI9881C_COMMAND_INSTR(0x52, 0x54),
|
||||
ILI9881C_COMMAND_INSTR(0x53, 0x76),
|
||||
ILI9881C_COMMAND_INSTR(0x54, 0x98),
|
||||
ILI9881C_COMMAND_INSTR(0x55, 0xba),
|
||||
ILI9881C_COMMAND_INSTR(0x56, 0x10),
|
||||
ILI9881C_COMMAND_INSTR(0x57, 0x32),
|
||||
ILI9881C_COMMAND_INSTR(0x58, 0x54),
|
||||
ILI9881C_COMMAND_INSTR(0x59, 0x76),
|
||||
ILI9881C_COMMAND_INSTR(0x5A, 0x98),
|
||||
ILI9881C_COMMAND_INSTR(0x5B, 0xba),
|
||||
ILI9881C_COMMAND_INSTR(0x5C, 0xdc),
|
||||
ILI9881C_COMMAND_INSTR(0x5D, 0xfe),
|
||||
|
||||
//GIP_3
|
||||
ILI9881C_COMMAND_INSTR(0x5E, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x5F, 0x01),
|
||||
ILI9881C_COMMAND_INSTR(0x60, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x61, 0x15),
|
||||
ILI9881C_COMMAND_INSTR(0x62, 0x14),
|
||||
ILI9881C_COMMAND_INSTR(0x63, 0x0E),
|
||||
ILI9881C_COMMAND_INSTR(0x64, 0x0F),
|
||||
ILI9881C_COMMAND_INSTR(0x65, 0x0C),
|
||||
ILI9881C_COMMAND_INSTR(0x66, 0x0D),
|
||||
ILI9881C_COMMAND_INSTR(0x67, 0x06),
|
||||
ILI9881C_COMMAND_INSTR(0x68, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x69, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x6A, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x6B, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x6C, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x6D, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x6E, 0x07),
|
||||
ILI9881C_COMMAND_INSTR(0x6F, 0x02),
|
||||
|
||||
ILI9881C_COMMAND_INSTR(0x70, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x71, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x72, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x73, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x74, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x75, 0x01),
|
||||
ILI9881C_COMMAND_INSTR(0x76, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x77, 0x14),
|
||||
ILI9881C_COMMAND_INSTR(0x78, 0x15),
|
||||
ILI9881C_COMMAND_INSTR(0x79, 0x0E),
|
||||
ILI9881C_COMMAND_INSTR(0x7A, 0x0F),
|
||||
ILI9881C_COMMAND_INSTR(0x7B, 0x0C),
|
||||
ILI9881C_COMMAND_INSTR(0x7C, 0x0D),
|
||||
ILI9881C_COMMAND_INSTR(0x7D, 0x06),
|
||||
ILI9881C_COMMAND_INSTR(0x7E, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x7F, 0x02),
|
||||
|
||||
ILI9881C_COMMAND_INSTR(0x80, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x81, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x82, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x83, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x84, 0x07),
|
||||
ILI9881C_COMMAND_INSTR(0x85, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x86, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x87, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x88, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x89, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x8A, 0x02),
|
||||
|
||||
ILI9881C_SWITCH_PAGE_INSTR(4),
|
||||
ILI9881C_COMMAND_INSTR(0x6C, 0x15),
|
||||
ILI9881C_COMMAND_INSTR(0x6E, 0x2A),
|
||||
|
||||
//clamp 15V
|
||||
ILI9881C_COMMAND_INSTR(0x6F, 0x35),
|
||||
ILI9881C_COMMAND_INSTR(0x3A, 0x92),
|
||||
ILI9881C_COMMAND_INSTR(0x8D, 0x1F),
|
||||
ILI9881C_COMMAND_INSTR(0x87, 0xBA),
|
||||
ILI9881C_COMMAND_INSTR(0x26, 0x76),
|
||||
ILI9881C_COMMAND_INSTR(0xB2, 0xD1),
|
||||
ILI9881C_COMMAND_INSTR(0xB5, 0x27),
|
||||
ILI9881C_COMMAND_INSTR(0x31, 0x75),
|
||||
ILI9881C_COMMAND_INSTR(0x30, 0x03),
|
||||
ILI9881C_COMMAND_INSTR(0x3B, 0x98),
|
||||
ILI9881C_COMMAND_INSTR(0x35, 0x17),
|
||||
ILI9881C_COMMAND_INSTR(0x33, 0x14),
|
||||
ILI9881C_COMMAND_INSTR(0x38, 0x01),
|
||||
ILI9881C_COMMAND_INSTR(0x39, 0x00),
|
||||
|
||||
ILI9881C_SWITCH_PAGE_INSTR(1),
|
||||
// direction rotate
|
||||
//ILI9881C_COMMAND_INSTR(0x22, 0x0B),
|
||||
ILI9881C_COMMAND_INSTR(0x22, 0x0A),
|
||||
ILI9881C_COMMAND_INSTR(0x31, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x53, 0x63),
|
||||
ILI9881C_COMMAND_INSTR(0x55, 0x69),
|
||||
ILI9881C_COMMAND_INSTR(0x50, 0xC7),
|
||||
ILI9881C_COMMAND_INSTR(0x51, 0xC2),
|
||||
ILI9881C_COMMAND_INSTR(0x60, 0x26),
|
||||
|
||||
ILI9881C_COMMAND_INSTR(0xA0, 0x08),
|
||||
ILI9881C_COMMAND_INSTR(0xA1, 0x0F),
|
||||
ILI9881C_COMMAND_INSTR(0xA2, 0x25),
|
||||
ILI9881C_COMMAND_INSTR(0xA3, 0x01),
|
||||
ILI9881C_COMMAND_INSTR(0xA4, 0x23),
|
||||
ILI9881C_COMMAND_INSTR(0xA5, 0x18),
|
||||
ILI9881C_COMMAND_INSTR(0xA6, 0x11),
|
||||
ILI9881C_COMMAND_INSTR(0xA7, 0x1A),
|
||||
ILI9881C_COMMAND_INSTR(0xA8, 0x81),
|
||||
ILI9881C_COMMAND_INSTR(0xA9, 0x19),
|
||||
ILI9881C_COMMAND_INSTR(0xAA, 0x26),
|
||||
ILI9881C_COMMAND_INSTR(0xAB, 0x7C),
|
||||
ILI9881C_COMMAND_INSTR(0xAC, 0x24),
|
||||
ILI9881C_COMMAND_INSTR(0xAD, 0x1E),
|
||||
ILI9881C_COMMAND_INSTR(0xAE, 0x5C),
|
||||
ILI9881C_COMMAND_INSTR(0xAF, 0x2A),
|
||||
ILI9881C_COMMAND_INSTR(0xB0, 0x2B),
|
||||
ILI9881C_COMMAND_INSTR(0xB1, 0x50),
|
||||
ILI9881C_COMMAND_INSTR(0xB2, 0x5C),
|
||||
ILI9881C_COMMAND_INSTR(0xB3, 0x39),
|
||||
|
||||
ILI9881C_COMMAND_INSTR(0xC0, 0x08),
|
||||
ILI9881C_COMMAND_INSTR(0xC1, 0x1F),
|
||||
ILI9881C_COMMAND_INSTR(0xC2, 0x24),
|
||||
ILI9881C_COMMAND_INSTR(0xC3, 0x1D),
|
||||
ILI9881C_COMMAND_INSTR(0xC4, 0x04),
|
||||
ILI9881C_COMMAND_INSTR(0xC5, 0x32),
|
||||
ILI9881C_COMMAND_INSTR(0xC6, 0x24),
|
||||
ILI9881C_COMMAND_INSTR(0xC7, 0x1F),
|
||||
ILI9881C_COMMAND_INSTR(0xC8, 0x90),
|
||||
ILI9881C_COMMAND_INSTR(0xC9, 0x20),
|
||||
ILI9881C_COMMAND_INSTR(0xCA, 0x2C),
|
||||
ILI9881C_COMMAND_INSTR(0xCB, 0x82),
|
||||
ILI9881C_COMMAND_INSTR(0xCC, 0x19),
|
||||
ILI9881C_COMMAND_INSTR(0xCD, 0x22),
|
||||
ILI9881C_COMMAND_INSTR(0xCE, 0x4E),
|
||||
ILI9881C_COMMAND_INSTR(0xCF, 0x28),
|
||||
ILI9881C_COMMAND_INSTR(0xD0, 0x2D),
|
||||
ILI9881C_COMMAND_INSTR(0xD1, 0x51),
|
||||
ILI9881C_COMMAND_INSTR(0xD2, 0x5D),
|
||||
ILI9881C_COMMAND_INSTR(0xD3, 0x39),
|
||||
|
||||
ILI9881C_SWITCH_PAGE_INSTR(0),
|
||||
//PWM
|
||||
ILI9881C_COMMAND_INSTR(0x51, 0x0F),
|
||||
ILI9881C_COMMAND_INSTR(0x52, 0xFF),
|
||||
ILI9881C_COMMAND_INSTR(0x53, 0x2C),
|
||||
|
||||
ILI9881C_COMMAND_INSTR(0x11, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x29, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x35, 0x00),
|
||||
};
|
||||
|
||||
static const struct ili9881c_instr cfaf7201280a0_050tx_init[] = {
|
||||
//ILI9881C PAGE3
|
||||
ILI9881C_SWITCH_PAGE_INSTR(3),
|
||||
//GIP_1
|
||||
ILI9881C_COMMAND_INSTR(0x01, 0x00), //added
|
||||
ILI9881C_COMMAND_INSTR(0x02, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x03, 0x73),
|
||||
ILI9881C_COMMAND_INSTR(0x04, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x05, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x06, 0x0A),
|
||||
ILI9881C_COMMAND_INSTR(0x07, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x08, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x09, 0x01),
|
||||
ILI9881C_COMMAND_INSTR(0x0A, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x0B, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x0C, 0x01),
|
||||
ILI9881C_COMMAND_INSTR(0x0D, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x0E, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x0F, 0x1D),
|
||||
ILI9881C_COMMAND_INSTR(0x10, 0x1D),
|
||||
ILI9881C_COMMAND_INSTR(0x11, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x12, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x13, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x14, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x15, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x16, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x17, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x18, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x19, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x1A, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x1B, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x1C, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x1D, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x1E, 0x40),
|
||||
ILI9881C_COMMAND_INSTR(0x1F, 0x80),
|
||||
ILI9881C_COMMAND_INSTR(0x20, 0x06),
|
||||
ILI9881C_COMMAND_INSTR(0x21, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x22, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x23, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x24, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x25, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x26, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x27, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x28, 0x33),
|
||||
ILI9881C_COMMAND_INSTR(0x29, 0x03),
|
||||
ILI9881C_COMMAND_INSTR(0x2A, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x2B, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x2C, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x2D, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x2E, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x2F, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x30, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x31, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x32, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x33, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x34, 0x04),
|
||||
ILI9881C_COMMAND_INSTR(0x35, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x36, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x37, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x38, 0x3C),
|
||||
ILI9881C_COMMAND_INSTR(0x39, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x3A, 0x40),
|
||||
ILI9881C_COMMAND_INSTR(0x3B, 0x40),
|
||||
ILI9881C_COMMAND_INSTR(0x3C, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x3D, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x3E, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x3F, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x40, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x41, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x42, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x43, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x44, 0x00),
|
||||
//GIP_2
|
||||
ILI9881C_COMMAND_INSTR(0x50, 0x01),
|
||||
ILI9881C_COMMAND_INSTR(0x51, 0x23),
|
||||
ILI9881C_COMMAND_INSTR(0x52, 0x45),
|
||||
ILI9881C_COMMAND_INSTR(0x53, 0x67),
|
||||
ILI9881C_COMMAND_INSTR(0x54, 0x89),
|
||||
ILI9881C_COMMAND_INSTR(0x55, 0xAB),
|
||||
ILI9881C_COMMAND_INSTR(0x56, 0x01),
|
||||
ILI9881C_COMMAND_INSTR(0x57, 0x23),
|
||||
ILI9881C_COMMAND_INSTR(0x58, 0x45),
|
||||
ILI9881C_COMMAND_INSTR(0x59, 0x67),
|
||||
ILI9881C_COMMAND_INSTR(0x5A, 0x89),
|
||||
ILI9881C_COMMAND_INSTR(0x5B, 0xAB),
|
||||
ILI9881C_COMMAND_INSTR(0x5C, 0xCD),
|
||||
ILI9881C_COMMAND_INSTR(0x5D, 0xEF),
|
||||
//GIP_3
|
||||
ILI9881C_COMMAND_INSTR(0x5E, 0x11),
|
||||
ILI9881C_COMMAND_INSTR(0x5F, 0x01),
|
||||
ILI9881C_COMMAND_INSTR(0x60, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x61, 0x15),
|
||||
ILI9881C_COMMAND_INSTR(0x62, 0x14),
|
||||
ILI9881C_COMMAND_INSTR(0x63, 0x0E),
|
||||
ILI9881C_COMMAND_INSTR(0x64, 0x0F),
|
||||
ILI9881C_COMMAND_INSTR(0x65, 0x0C),
|
||||
ILI9881C_COMMAND_INSTR(0x66, 0x0D),
|
||||
ILI9881C_COMMAND_INSTR(0x67, 0x06),
|
||||
ILI9881C_COMMAND_INSTR(0x68, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x69, 0x07),
|
||||
ILI9881C_COMMAND_INSTR(0x6A, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x6B, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x6C, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x6D, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x6E, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x6F, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x70, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x71, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x72, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x73, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x74, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x75, 0x01),
|
||||
ILI9881C_COMMAND_INSTR(0x76, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x77, 0x14),
|
||||
ILI9881C_COMMAND_INSTR(0x78, 0x15),
|
||||
ILI9881C_COMMAND_INSTR(0x79, 0x0E),
|
||||
ILI9881C_COMMAND_INSTR(0x7A, 0x0F),
|
||||
ILI9881C_COMMAND_INSTR(0x7B, 0x0C),
|
||||
ILI9881C_COMMAND_INSTR(0x7C, 0x0D),
|
||||
ILI9881C_COMMAND_INSTR(0x7D, 0x06),
|
||||
ILI9881C_COMMAND_INSTR(0x7E, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x7F, 0x07),
|
||||
ILI9881C_COMMAND_INSTR(0x80, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x81, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x82, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x83, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x84, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x85, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x86, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x87, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x88, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x89, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x8A, 0x02),
|
||||
//ILI9881C PAGE4
|
||||
ILI9881C_SWITCH_PAGE_INSTR(4),
|
||||
ILI9881C_COMMAND_INSTR(0x6C, 0x15),
|
||||
ILI9881C_COMMAND_INSTR(0x6E, 0x2B),
|
||||
// VGH & VGL OUTPUT
|
||||
ILI9881C_COMMAND_INSTR(0x6F, 0x33),
|
||||
ILI9881C_COMMAND_INSTR(0x8D, 0x18),
|
||||
ILI9881C_COMMAND_INSTR(0x87, 0xBA),
|
||||
ILI9881C_COMMAND_INSTR(0x26, 0x76),
|
||||
//Reload Gamma setting
|
||||
ILI9881C_COMMAND_INSTR(0xB2, 0xD1),
|
||||
ILI9881C_COMMAND_INSTR(0xB5, 0x06),
|
||||
ILI9881C_COMMAND_INSTR(0x3A, 0x24),
|
||||
ILI9881C_COMMAND_INSTR(0x35, 0x1F),
|
||||
|
||||
//ILI9881C PAGE1
|
||||
ILI9881C_SWITCH_PAGE_INSTR(1),
|
||||
ILI9881C_COMMAND_INSTR(0x22, 0x09),
|
||||
//Column inversion
|
||||
ILI9881C_COMMAND_INSTR(0x31, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x40, 0x33),
|
||||
ILI9881C_COMMAND_INSTR(0x53, 0xA2),
|
||||
ILI9881C_COMMAND_INSTR(0x55, 0x92),
|
||||
ILI9881C_COMMAND_INSTR(0x50, 0x96),
|
||||
ILI9881C_COMMAND_INSTR(0x51, 0x96),
|
||||
ILI9881C_COMMAND_INSTR(0x60, 0x22),
|
||||
ILI9881C_COMMAND_INSTR(0x61, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x62, 0x19),
|
||||
ILI9881C_COMMAND_INSTR(0x63, 0x00),
|
||||
//---P-GAMMA START---
|
||||
ILI9881C_COMMAND_INSTR(0xA0, 0x08),
|
||||
ILI9881C_COMMAND_INSTR(0xA1, 0x11),
|
||||
ILI9881C_COMMAND_INSTR(0xA2, 0x19),
|
||||
ILI9881C_COMMAND_INSTR(0xA3, 0x0D),
|
||||
ILI9881C_COMMAND_INSTR(0xA4, 0x0D),
|
||||
ILI9881C_COMMAND_INSTR(0xA5, 0x1E),
|
||||
ILI9881C_COMMAND_INSTR(0xA6, 0x14),
|
||||
ILI9881C_COMMAND_INSTR(0xA7, 0x17),
|
||||
ILI9881C_COMMAND_INSTR(0xA8, 0x4F),
|
||||
ILI9881C_COMMAND_INSTR(0xA9, 0x1A),
|
||||
ILI9881C_COMMAND_INSTR(0xAA, 0x27),
|
||||
ILI9881C_COMMAND_INSTR(0xAB, 0x49),
|
||||
ILI9881C_COMMAND_INSTR(0xAC, 0x1A),
|
||||
ILI9881C_COMMAND_INSTR(0xAD, 0x18),
|
||||
ILI9881C_COMMAND_INSTR(0xAE, 0x4C),
|
||||
ILI9881C_COMMAND_INSTR(0xAF, 0x22),
|
||||
ILI9881C_COMMAND_INSTR(0xB0, 0x27),
|
||||
ILI9881C_COMMAND_INSTR(0xB1, 0x4B),
|
||||
ILI9881C_COMMAND_INSTR(0xB2, 0x60),
|
||||
ILI9881C_COMMAND_INSTR(0xB3, 0x39),
|
||||
//--- N-GAMMA START---
|
||||
ILI9881C_COMMAND_INSTR(0xC0, 0x08),
|
||||
ILI9881C_COMMAND_INSTR(0xC1, 0x11),
|
||||
ILI9881C_COMMAND_INSTR(0xC2, 0x19),
|
||||
ILI9881C_COMMAND_INSTR(0xC3, 0x0D),
|
||||
ILI9881C_COMMAND_INSTR(0xC4, 0x0D),
|
||||
ILI9881C_COMMAND_INSTR(0xC5, 0x1E),
|
||||
ILI9881C_COMMAND_INSTR(0xC6, 0x14),
|
||||
ILI9881C_COMMAND_INSTR(0xC7, 0x17),
|
||||
ILI9881C_COMMAND_INSTR(0xC8, 0x4F),
|
||||
ILI9881C_COMMAND_INSTR(0xC9, 0x1A),
|
||||
ILI9881C_COMMAND_INSTR(0xCA, 0x27),
|
||||
ILI9881C_COMMAND_INSTR(0xCB, 0x49),
|
||||
ILI9881C_COMMAND_INSTR(0xCC, 0x1A),
|
||||
ILI9881C_COMMAND_INSTR(0xCD, 0x18),
|
||||
ILI9881C_COMMAND_INSTR(0xCE, 0x4C),
|
||||
ILI9881C_COMMAND_INSTR(0xCF, 0x33),
|
||||
ILI9881C_COMMAND_INSTR(0xD0, 0x27),
|
||||
ILI9881C_COMMAND_INSTR(0xD1, 0x4B),
|
||||
ILI9881C_COMMAND_INSTR(0xD2, 0x60),
|
||||
ILI9881C_COMMAND_INSTR(0xD3, 0x39),
|
||||
};
|
||||
|
||||
static const struct ili9881c_instr rpi_5inch_init[] = {
|
||||
ILI9881C_SWITCH_PAGE_INSTR(3),
|
||||
ILI9881C_COMMAND_INSTR(0x01, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x02, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x03, 0x73),
|
||||
ILI9881C_COMMAND_INSTR(0x04, 0x73),
|
||||
ILI9881C_COMMAND_INSTR(0x05, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x06, 0x06),
|
||||
ILI9881C_COMMAND_INSTR(0x07, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x08, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x09, 0x01),
|
||||
ILI9881C_COMMAND_INSTR(0x0a, 0x01),
|
||||
ILI9881C_COMMAND_INSTR(0x0b, 0x01),
|
||||
ILI9881C_COMMAND_INSTR(0x0c, 0x01),
|
||||
ILI9881C_COMMAND_INSTR(0x0d, 0x01),
|
||||
ILI9881C_COMMAND_INSTR(0x0e, 0x01),
|
||||
ILI9881C_COMMAND_INSTR(0x0f, 0x01),
|
||||
ILI9881C_COMMAND_INSTR(0x10, 0x01),
|
||||
ILI9881C_COMMAND_INSTR(0x11, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x12, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x13, 0x01),
|
||||
ILI9881C_COMMAND_INSTR(0x14, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x15, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x16, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x17, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x18, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x19, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x1a, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x1b, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x1c, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x1d, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x1e, 0xc0),
|
||||
ILI9881C_COMMAND_INSTR(0x1f, 0x80),
|
||||
ILI9881C_COMMAND_INSTR(0x20, 0x04),
|
||||
ILI9881C_COMMAND_INSTR(0x21, 0x03),
|
||||
ILI9881C_COMMAND_INSTR(0x22, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x23, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x24, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x25, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x26, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x27, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x28, 0x33),
|
||||
ILI9881C_COMMAND_INSTR(0x29, 0x03),
|
||||
ILI9881C_COMMAND_INSTR(0x2a, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x2b, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x2c, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x2d, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x2e, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x2f, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x30, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x31, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x32, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x33, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x34, 0x03),
|
||||
ILI9881C_COMMAND_INSTR(0x35, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x36, 0x03),
|
||||
ILI9881C_COMMAND_INSTR(0x37, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x38, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x39, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x3a, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x3b, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x3c, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x3d, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x3e, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x3f, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x40, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x41, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x42, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x43, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x44, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x50, 0x01),
|
||||
ILI9881C_COMMAND_INSTR(0x51, 0x23),
|
||||
ILI9881C_COMMAND_INSTR(0x52, 0x45),
|
||||
ILI9881C_COMMAND_INSTR(0x53, 0x67),
|
||||
ILI9881C_COMMAND_INSTR(0x54, 0x89),
|
||||
ILI9881C_COMMAND_INSTR(0x55, 0xab),
|
||||
ILI9881C_COMMAND_INSTR(0x56, 0x01),
|
||||
ILI9881C_COMMAND_INSTR(0x57, 0x23),
|
||||
ILI9881C_COMMAND_INSTR(0x58, 0x45),
|
||||
ILI9881C_COMMAND_INSTR(0x59, 0x67),
|
||||
ILI9881C_COMMAND_INSTR(0x5a, 0x89),
|
||||
ILI9881C_COMMAND_INSTR(0x5b, 0xab),
|
||||
ILI9881C_COMMAND_INSTR(0x5c, 0xcd),
|
||||
ILI9881C_COMMAND_INSTR(0x5d, 0xef),
|
||||
ILI9881C_COMMAND_INSTR(0x5e, 0x10),
|
||||
ILI9881C_COMMAND_INSTR(0x5f, 0x09),
|
||||
ILI9881C_COMMAND_INSTR(0x60, 0x08),
|
||||
ILI9881C_COMMAND_INSTR(0x61, 0x0f),
|
||||
ILI9881C_COMMAND_INSTR(0x62, 0x0e),
|
||||
ILI9881C_COMMAND_INSTR(0x63, 0x0d),
|
||||
ILI9881C_COMMAND_INSTR(0x64, 0x0c),
|
||||
ILI9881C_COMMAND_INSTR(0x65, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x66, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x67, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x68, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x69, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x6a, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x6b, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x6c, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x6d, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x6e, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x6f, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x70, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x71, 0x06),
|
||||
ILI9881C_COMMAND_INSTR(0x72, 0x07),
|
||||
ILI9881C_COMMAND_INSTR(0x73, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x74, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x75, 0x06),
|
||||
ILI9881C_COMMAND_INSTR(0x76, 0x07),
|
||||
ILI9881C_COMMAND_INSTR(0x77, 0x0e),
|
||||
ILI9881C_COMMAND_INSTR(0x78, 0x0f),
|
||||
ILI9881C_COMMAND_INSTR(0x79, 0x0c),
|
||||
ILI9881C_COMMAND_INSTR(0x7a, 0x0d),
|
||||
ILI9881C_COMMAND_INSTR(0x7b, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x7c, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x7d, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x7e, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x7f, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x80, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x81, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x82, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x83, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x84, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x85, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x86, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x87, 0x09),
|
||||
ILI9881C_COMMAND_INSTR(0x88, 0x08),
|
||||
ILI9881C_COMMAND_INSTR(0x89, 0x02),
|
||||
ILI9881C_COMMAND_INSTR(0x8A, 0x02),
|
||||
ILI9881C_SWITCH_PAGE_INSTR(4),
|
||||
ILI9881C_COMMAND_INSTR(0x6C, 0x15),
|
||||
ILI9881C_COMMAND_INSTR(0x6E, 0x2a),
|
||||
ILI9881C_COMMAND_INSTR(0x6F, 0x57),
|
||||
ILI9881C_COMMAND_INSTR(0x3A, 0xa4),
|
||||
ILI9881C_COMMAND_INSTR(0x8D, 0x1a),
|
||||
ILI9881C_COMMAND_INSTR(0x87, 0xba),
|
||||
ILI9881C_COMMAND_INSTR(0x26, 0x76),
|
||||
ILI9881C_COMMAND_INSTR(0xB2, 0xd1),
|
||||
ILI9881C_SWITCH_PAGE_INSTR(1),
|
||||
ILI9881C_COMMAND_INSTR(0x22, 0x0A),
|
||||
ILI9881C_COMMAND_INSTR(0x31, 0x00),
|
||||
ILI9881C_COMMAND_INSTR(0x53, 0x35),
|
||||
ILI9881C_COMMAND_INSTR(0x55, 0x50),
|
||||
ILI9881C_COMMAND_INSTR(0x50, 0xaf),
|
||||
ILI9881C_COMMAND_INSTR(0x51, 0xaf),
|
||||
ILI9881C_COMMAND_INSTR(0x60, 0x14),
|
||||
ILI9881C_COMMAND_INSTR(0xA0, 0x08),
|
||||
ILI9881C_COMMAND_INSTR(0xA1, 0x1d),
|
||||
ILI9881C_COMMAND_INSTR(0xA2, 0x2c),
|
||||
ILI9881C_COMMAND_INSTR(0xA3, 0x14),
|
||||
ILI9881C_COMMAND_INSTR(0xA4, 0x19),
|
||||
ILI9881C_COMMAND_INSTR(0xA5, 0x2e),
|
||||
ILI9881C_COMMAND_INSTR(0xA6, 0x22),
|
||||
ILI9881C_COMMAND_INSTR(0xA7, 0x23),
|
||||
ILI9881C_COMMAND_INSTR(0xA8, 0x97),
|
||||
ILI9881C_COMMAND_INSTR(0xA9, 0x1e),
|
||||
ILI9881C_COMMAND_INSTR(0xAA, 0x29),
|
||||
ILI9881C_COMMAND_INSTR(0xAB, 0x7b),
|
||||
ILI9881C_COMMAND_INSTR(0xAC, 0x18),
|
||||
ILI9881C_COMMAND_INSTR(0xAD, 0x17),
|
||||
ILI9881C_COMMAND_INSTR(0xAE, 0x4b),
|
||||
ILI9881C_COMMAND_INSTR(0xAF, 0x1f),
|
||||
ILI9881C_COMMAND_INSTR(0xB0, 0x27),
|
||||
ILI9881C_COMMAND_INSTR(0xB1, 0x52),
|
||||
ILI9881C_COMMAND_INSTR(0xB2, 0x63),
|
||||
ILI9881C_COMMAND_INSTR(0xB3, 0x39),
|
||||
ILI9881C_COMMAND_INSTR(0xC0, 0x08),
|
||||
ILI9881C_COMMAND_INSTR(0xC1, 0x1d),
|
||||
ILI9881C_COMMAND_INSTR(0xC2, 0x2c),
|
||||
ILI9881C_COMMAND_INSTR(0xC3, 0x14),
|
||||
ILI9881C_COMMAND_INSTR(0xC4, 0x19),
|
||||
ILI9881C_COMMAND_INSTR(0xC5, 0x2e),
|
||||
ILI9881C_COMMAND_INSTR(0xC6, 0x22),
|
||||
ILI9881C_COMMAND_INSTR(0xC7, 0x23),
|
||||
ILI9881C_COMMAND_INSTR(0xC8, 0x97),
|
||||
ILI9881C_COMMAND_INSTR(0xC9, 0x1e),
|
||||
ILI9881C_COMMAND_INSTR(0xCA, 0x29),
|
||||
ILI9881C_COMMAND_INSTR(0xCB, 0x7b),
|
||||
ILI9881C_COMMAND_INSTR(0xCC, 0x18),
|
||||
ILI9881C_COMMAND_INSTR(0xCD, 0x17),
|
||||
ILI9881C_COMMAND_INSTR(0xCE, 0x4b),
|
||||
ILI9881C_COMMAND_INSTR(0xCF, 0x1f),
|
||||
ILI9881C_COMMAND_INSTR(0xD0, 0x27),
|
||||
ILI9881C_COMMAND_INSTR(0xD1, 0x52),
|
||||
ILI9881C_COMMAND_INSTR(0xD2, 0x63),
|
||||
ILI9881C_COMMAND_INSTR(0xD3, 0x39),
|
||||
};
|
||||
|
||||
static const struct ili9881c_instr rpi_7inch_init[] = {
|
||||
ILI9881C_SWITCH_PAGE_INSTR(3),
|
||||
ILI9881C_COMMAND_INSTR(0x01, 0x00),
|
||||
@@ -1486,7 +2112,7 @@ static int ili9881c_prepare(struct drm_panel *panel)
|
||||
instr->arg.cmd.data);
|
||||
|
||||
if (ret)
|
||||
goto disable_power;
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = ili9881c_switch_page(ctx, 0);
|
||||
@@ -1498,36 +2124,60 @@ static int ili9881c_prepare(struct drm_panel *panel)
|
||||
&ctx->address_mode,
|
||||
sizeof(ctx->address_mode));
|
||||
if (ret < 0)
|
||||
goto disable_power;
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = mipi_dsi_dcs_set_tear_on(ctx->dsi, MIPI_DSI_DCS_TEAR_MODE_VBLANK);
|
||||
if (ret)
|
||||
goto disable_power;
|
||||
return ret;
|
||||
|
||||
ret = mipi_dsi_dcs_exit_sleep_mode(ctx->dsi);
|
||||
if (ret)
|
||||
goto disable_power;
|
||||
return ret;
|
||||
|
||||
msleep(120);
|
||||
if (ctx->desc->flags & ILI9881_FLAGS_PANEL_ON_IN_PREPARE) {
|
||||
msleep(120);
|
||||
|
||||
ret = mipi_dsi_dcs_set_display_on(ctx->dsi);
|
||||
if (ret)
|
||||
goto disable_power;
|
||||
ret = mipi_dsi_dcs_set_display_on(ctx->dsi);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
disable_power:
|
||||
regulator_disable(ctx->power);
|
||||
return ret;
|
||||
static int ili9881c_enable(struct drm_panel *panel)
|
||||
{
|
||||
struct ili9881c *ctx = panel_to_ili9881c(panel);
|
||||
|
||||
if (!(ctx->desc->flags & ILI9881_FLAGS_PANEL_ON_IN_PREPARE)) {
|
||||
msleep(120);
|
||||
|
||||
mipi_dsi_dcs_set_display_on(ctx->dsi);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ili9881c_disable(struct drm_panel *panel)
|
||||
{
|
||||
struct ili9881c *ctx = panel_to_ili9881c(panel);
|
||||
|
||||
if (!(ctx->desc->flags & ILI9881_FLAGS_PANEL_ON_IN_PREPARE))
|
||||
mipi_dsi_dcs_set_display_off(ctx->dsi);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ili9881c_unprepare(struct drm_panel *panel)
|
||||
{
|
||||
struct ili9881c *ctx = panel_to_ili9881c(panel);
|
||||
|
||||
mipi_dsi_dcs_set_display_off(ctx->dsi);
|
||||
mipi_dsi_dcs_enter_sleep_mode(ctx->dsi);
|
||||
if (!(ctx->desc->flags & ILI9881_FLAGS_NO_SHUTDOWN_CMDS)) {
|
||||
if (ctx->desc->flags & ILI9881_FLAGS_PANEL_ON_IN_PREPARE)
|
||||
mipi_dsi_dcs_set_display_off(ctx->dsi);
|
||||
|
||||
mipi_dsi_dcs_enter_sleep_mode(ctx->dsi);
|
||||
}
|
||||
|
||||
regulator_disable(ctx->power);
|
||||
gpiod_set_value_cansleep(ctx->reset, 1);
|
||||
|
||||
@@ -1636,6 +2286,58 @@ static const struct drm_display_mode am8001280g_default_mode = {
|
||||
.height_mm = 151,
|
||||
};
|
||||
|
||||
static const struct drm_display_mode nwe080_default_mode = {
|
||||
.clock = 71750,
|
||||
|
||||
.hdisplay = 800,
|
||||
.hsync_start = 800 + 52,
|
||||
.hsync_end = 800 + 52 + 8,
|
||||
.htotal = 800 + 52 + 8 + 48,
|
||||
|
||||
.vdisplay = 1280,
|
||||
.vsync_start = 1280 + 16,
|
||||
.vsync_end = 1280 + 16 + 6,
|
||||
.vtotal = 1280 + 16 + 6 + 15,
|
||||
|
||||
.width_mm = 107,
|
||||
.height_mm = 170,
|
||||
};
|
||||
|
||||
static const struct drm_display_mode cfaf7201280a0_050tx_default_mode = {
|
||||
/*
|
||||
* These timings are a compromise so the panel will work with
|
||||
* both the CM4 and CM5.
|
||||
*/
|
||||
.clock = 78000,
|
||||
.hdisplay = 720,
|
||||
.hsync_start = 720 + 120,
|
||||
.hsync_end = 720 + 120 + 2,
|
||||
.htotal = 720 + 120 + 2 + 80,
|
||||
.vdisplay = 1280,
|
||||
.vsync_start = 1280 + 60,
|
||||
.vsync_end = 1280 + 60 + 2,
|
||||
.vtotal = 1280 + 60 + 2 + 90,
|
||||
.width_mm = 62,
|
||||
.height_mm = 110,
|
||||
};
|
||||
|
||||
static const struct drm_display_mode rpi_5inch_default_mode = {
|
||||
.clock = 83333,
|
||||
|
||||
.hdisplay = 720,
|
||||
.hsync_start = 720 + 110,
|
||||
.hsync_end = 720 + 110 + 2,
|
||||
.htotal = 720 + 110 + 2 + 105,
|
||||
|
||||
.vdisplay = 1280,
|
||||
.vsync_start = 1280 + 100,
|
||||
.vsync_end = 1280 + 100 + 2,
|
||||
.vtotal = 1280 + 100 + 2 + 100,
|
||||
|
||||
.width_mm = 62,
|
||||
.height_mm = 110,
|
||||
};
|
||||
|
||||
static const struct drm_display_mode rpi_7inch_default_mode = {
|
||||
.clock = 83330,
|
||||
|
||||
@@ -1699,6 +2401,8 @@ static enum drm_panel_orientation ili9881c_get_orientation(struct drm_panel *pan
|
||||
static const struct drm_panel_funcs ili9881c_funcs = {
|
||||
.prepare = ili9881c_prepare,
|
||||
.unprepare = ili9881c_unprepare,
|
||||
.enable = ili9881c_enable,
|
||||
.disable = ili9881c_disable,
|
||||
.get_modes = ili9881c_get_modes,
|
||||
.get_orientation = ili9881c_get_orientation,
|
||||
};
|
||||
@@ -1708,15 +2412,17 @@ static int ili9881c_dsi_probe(struct mipi_dsi_device *dsi)
|
||||
struct ili9881c *ctx;
|
||||
int ret;
|
||||
|
||||
ctx = devm_drm_panel_alloc(&dsi->dev, struct ili9881c, panel, &ili9881c_funcs,
|
||||
DRM_MODE_CONNECTOR_DSI);
|
||||
if (IS_ERR(ctx))
|
||||
return PTR_ERR(ctx);
|
||||
|
||||
ctx = devm_kzalloc(&dsi->dev, sizeof(*ctx), GFP_KERNEL);
|
||||
if (!ctx)
|
||||
return -ENOMEM;
|
||||
mipi_dsi_set_drvdata(dsi, ctx);
|
||||
ctx->dsi = dsi;
|
||||
ctx->desc = of_device_get_match_data(&dsi->dev);
|
||||
|
||||
ctx->panel.prepare_prev_first = true;
|
||||
drm_panel_init(&ctx->panel, &dsi->dev, &ili9881c_funcs,
|
||||
DRM_MODE_CONNECTOR_DSI);
|
||||
|
||||
ctx->power = devm_regulator_get(&dsi->dev, "power");
|
||||
if (IS_ERR(ctx->power))
|
||||
return dev_err_probe(&dsi->dev, PTR_ERR(ctx->power),
|
||||
@@ -1752,7 +2458,11 @@ static int ili9881c_dsi_probe(struct mipi_dsi_device *dsi)
|
||||
dsi->format = MIPI_DSI_FMT_RGB888;
|
||||
dsi->lanes = ctx->desc->lanes;
|
||||
|
||||
return mipi_dsi_attach(dsi);
|
||||
ret = mipi_dsi_attach(dsi);
|
||||
if (ret)
|
||||
drm_panel_remove(&ctx->panel);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void ili9881c_dsi_remove(struct mipi_dsi_device *dsi)
|
||||
@@ -1761,6 +2471,9 @@ static void ili9881c_dsi_remove(struct mipi_dsi_device *dsi)
|
||||
|
||||
mipi_dsi_detach(dsi);
|
||||
drm_panel_remove(&ctx->panel);
|
||||
|
||||
gpiod_set_value_cansleep(ctx->reset, 1);
|
||||
regulator_disable(ctx->power);
|
||||
}
|
||||
|
||||
static const struct ili9881c_desc lhr050h41_desc = {
|
||||
@@ -1813,12 +2526,38 @@ static const struct ili9881c_desc am8001280g_desc = {
|
||||
MIPI_DSI_CLOCK_NON_CONTINUOUS | MIPI_DSI_MODE_LPM,
|
||||
};
|
||||
|
||||
static const struct ili9881c_desc nwe080_desc = {
|
||||
.init = nwe080_init,
|
||||
.init_length = ARRAY_SIZE(nwe080_init),
|
||||
.mode = &nwe080_default_mode,
|
||||
.mode_flags = MIPI_DSI_MODE_VIDEO_SYNC_PULSE | MIPI_DSI_MODE_VIDEO,
|
||||
.lanes = 4,
|
||||
};
|
||||
|
||||
static const struct ili9881c_desc cfaf7201280a0_050tx_desc = {
|
||||
.init = cfaf7201280a0_050tx_init,
|
||||
.init_length = ARRAY_SIZE(cfaf7201280a0_050tx_init),
|
||||
.mode = &cfaf7201280a0_050tx_default_mode,
|
||||
.mode_flags = MIPI_DSI_MODE_VIDEO_SYNC_PULSE | MIPI_DSI_MODE_VIDEO,
|
||||
.lanes = 4,
|
||||
};
|
||||
|
||||
static const struct ili9881c_desc rpi_5inch_desc = {
|
||||
.init = rpi_5inch_init,
|
||||
.init_length = ARRAY_SIZE(rpi_5inch_init),
|
||||
.mode = &rpi_5inch_default_mode,
|
||||
.mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_LPM,
|
||||
.lanes = 2,
|
||||
};
|
||||
|
||||
static const struct ili9881c_desc rpi_7inch_desc = {
|
||||
.init = rpi_7inch_init,
|
||||
.init_length = ARRAY_SIZE(rpi_7inch_init),
|
||||
.mode = &rpi_7inch_default_mode,
|
||||
.mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_LPM,
|
||||
.lanes = 2,
|
||||
.flags = ILI9881_FLAGS_NO_SHUTDOWN_CMDS |
|
||||
ILI9881_FLAGS_PANEL_ON_IN_PREPARE,
|
||||
};
|
||||
|
||||
static const struct of_device_id ili9881c_of_match[] = {
|
||||
@@ -1828,6 +2567,9 @@ static const struct of_device_id ili9881c_of_match[] = {
|
||||
{ .compatible = "tdo,tl050hdv35", .data = &tl050hdv35_desc },
|
||||
{ .compatible = "wanchanglong,w552946aba", .data = &w552946aba_desc },
|
||||
{ .compatible = "ampire,am8001280g", .data = &am8001280g_desc },
|
||||
{ .compatible = "crystalfontz,cfaf7201280a0_050tx", .data = &cfaf7201280a0_050tx_desc },
|
||||
{ .compatible = "nwe,nwe080", .data = &nwe080_desc },
|
||||
{ .compatible = "raspberrypi,dsi-5inch", &rpi_5inch_desc },
|
||||
{ .compatible = "raspberrypi,dsi-7inch", &rpi_7inch_desc },
|
||||
{ }
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user