summaryrefslogtreecommitdiff
path: root/firmware/target/mips/ingenic_x1000/fiiom3k/lcd-fiiom3k.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/mips/ingenic_x1000/fiiom3k/lcd-fiiom3k.c')
-rw-r--r--firmware/target/mips/ingenic_x1000/fiiom3k/lcd-fiiom3k.c192
1 files changed, 192 insertions, 0 deletions
diff --git a/firmware/target/mips/ingenic_x1000/fiiom3k/lcd-fiiom3k.c b/firmware/target/mips/ingenic_x1000/fiiom3k/lcd-fiiom3k.c
new file mode 100644
index 0000000000..96f794d7df
--- /dev/null
+++ b/firmware/target/mips/ingenic_x1000/fiiom3k/lcd-fiiom3k.c
@@ -0,0 +1,192 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2021 Aidan MacDonald
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21
22#include "lcd.h"
23#include "kernel.h"
24#include "lcd-x1000.h"
25#include "gpio-x1000.h"
26#include "system.h"
27
28#define CS_PIN (1 << 18)
29#define RD_PIN (1 << 16)
30
31static const uint32_t fiio_lcd_cmd_enable[] = {
32 /* Software reset */
33 LCD_INSTR_CMD, 0x01,
34 LCD_INSTR_UDELAY, 120000,
35 /* Sleep out */
36 LCD_INSTR_CMD, 0x11,
37 LCD_INSTR_UDELAY, 5000,
38 /* Memory access order */
39 LCD_INSTR_CMD, 0x36,
40 LCD_INSTR_DAT, 0x00,
41 /* Row and column address set */
42 LCD_INSTR_CMD, 0x2a,
43 LCD_INSTR_DAT, 0x00,
44 LCD_INSTR_DAT, 0x00,
45 LCD_INSTR_DAT, (LCD_WIDTH >> 8) & 0xff,
46 LCD_INSTR_DAT, (LCD_WIDTH & 0xff),
47 LCD_INSTR_CMD, 0x2b,
48 LCD_INSTR_DAT, 0x00,
49 LCD_INSTR_DAT, 0x00,
50 LCD_INSTR_DAT, (LCD_HEIGHT >> 8) & 0xff,
51 LCD_INSTR_DAT, (LCD_HEIGHT & 0xff),
52 /* Interface pixel format */
53 LCD_INSTR_CMD, 0x3a,
54 LCD_INSTR_DAT, 0x05,
55 /* Enable display inversion */
56 LCD_INSTR_CMD, 0x21,
57 /* Porch setting */
58 LCD_INSTR_CMD, 0xb2,
59 LCD_INSTR_DAT, 0x0c,
60 LCD_INSTR_DAT, 0x0c,
61 LCD_INSTR_DAT, 0x00,
62 LCD_INSTR_DAT, 0x33,
63 LCD_INSTR_DAT, 0x33,
64 /* Gate control */
65 LCD_INSTR_CMD, 0xb7,
66 LCD_INSTR_DAT, 0x35,
67 /* VCOM setting */
68 LCD_INSTR_CMD, 0xbb,
69 LCD_INSTR_DAT, 0x1f,
70 /* Backlight control 5 */
71 LCD_INSTR_CMD, 0xbc,
72 LCD_INSTR_DAT, 0xec,
73 /* Backlight control 6 */
74 LCD_INSTR_CMD, 0xbd,
75 LCD_INSTR_DAT, 0xfe,
76 /* Voltage settings */
77 LCD_INSTR_CMD, 0xc2,
78 LCD_INSTR_DAT, 0x01,
79 LCD_INSTR_CMD, 0xc3,
80 LCD_INSTR_DAT, 0x19,
81 LCD_INSTR_CMD, 0xc4,
82 LCD_INSTR_DAT, 0x20,
83 /* Frame rate control */
84 LCD_INSTR_CMD, 0xc6,
85 LCD_INSTR_DAT, 0x0f, /* = 60 fps */
86 /* Power control 1 */
87 LCD_INSTR_CMD, 0xd0,
88 LCD_INSTR_DAT, 0xa4,
89 LCD_INSTR_DAT, 0xa1,
90 /* d6 Unknown */
91 LCD_INSTR_CMD, 0xd6,
92 LCD_INSTR_DAT, 0xa1,
93 /* Positive gamma correction */
94 LCD_INSTR_CMD, 0xe0,
95 LCD_INSTR_DAT, 0xd0,
96 LCD_INSTR_DAT, 0x06,
97 LCD_INSTR_DAT, 0x0c,
98 LCD_INSTR_DAT, 0x0a,
99 LCD_INSTR_DAT, 0x09,
100 LCD_INSTR_DAT, 0x0a,
101 LCD_INSTR_DAT, 0x32,
102 LCD_INSTR_DAT, 0x33,
103 LCD_INSTR_DAT, 0x49,
104 LCD_INSTR_DAT, 0x19,
105 LCD_INSTR_DAT, 0x14,
106 LCD_INSTR_DAT, 0x15,
107 LCD_INSTR_DAT, 0x2b,
108 LCD_INSTR_DAT, 0x34,
109 /* Negative gamma correction */
110 LCD_INSTR_CMD, 0xe1,
111 LCD_INSTR_DAT, 0xd0,
112 LCD_INSTR_DAT, 0x06,
113 LCD_INSTR_DAT, 0x0c,
114 LCD_INSTR_DAT, 0x0a,
115 LCD_INSTR_DAT, 0x09,
116 LCD_INSTR_DAT, 0x11,
117 LCD_INSTR_DAT, 0x37,
118 LCD_INSTR_DAT, 0x33,
119 LCD_INSTR_DAT, 0x49,
120 LCD_INSTR_DAT, 0x19,
121 LCD_INSTR_DAT, 0x14,
122 LCD_INSTR_DAT, 0x15,
123 LCD_INSTR_DAT, 0x2d,
124 LCD_INSTR_DAT, 0x34,
125 /* Tearing effect line ON, mode=0 (vsync signal) */
126 LCD_INSTR_CMD, 0x35,
127 LCD_INSTR_DAT, 0x00,
128 /* Display ON */
129 LCD_INSTR_CMD, 0x29,
130 LCD_INSTR_END,
131};
132
133static const uint32_t fiio_lcd_cmd_sleep[] = {
134 /* Display OFF */
135 LCD_INSTR_CMD, 0x28,
136 /* Sleep IN */
137 LCD_INSTR_CMD, 0x10,
138 LCD_INSTR_UDELAY, 5000,
139 LCD_INSTR_END,
140};
141
142static const uint32_t fiio_lcd_cmd_wake[] = {
143 /* Sleep OUT */
144 LCD_INSTR_CMD, 0x11,
145 LCD_INSTR_UDELAY, 5000,
146 /* Display ON */
147 LCD_INSTR_CMD, 0x29,
148 LCD_INSTR_END,
149};
150
151static const uint8_t __attribute__((aligned(64)))
152 fiio_lcd_dma_wr_cmd[] = {0x00, 0x00, 0x00, 0x2c};
153
154const struct lcd_tgt_config lcd_tgt_config = {
155 .bus_width = 16,
156 .cmd_width = 8,
157 .use_6800_mode = 0,
158 .use_serial = 0,
159 .clk_polarity = 0,
160 .dc_polarity = 0,
161 .wr_polarity = 1,
162 .te_enable = 1,
163 .te_polarity = 1,
164 .te_narrow = 0,
165 .dma_wr_cmd_buf = &fiio_lcd_dma_wr_cmd,
166 .dma_wr_cmd_size = sizeof(fiio_lcd_dma_wr_cmd),
167};
168
169void lcd_tgt_enable(bool enable)
170{
171 if(enable) {
172 gpio_config(GPIO_A, 0xffff, GPIO_DEVICE(1));
173 gpio_config(GPIO_B, 0x1f << 16, GPIO_DEVICE(1));
174 gpio_config(GPIO_B, CS_PIN|RD_PIN, GPIO_OUTPUT(1));
175 mdelay(5);
176 gpio_out_level(GPIO_B, CS_PIN, 0);
177 lcd_set_clock(X1000_CLK_SCLK_A, 30000000);
178 lcd_exec_commands(&fiio_lcd_cmd_enable[0]);
179 } else {
180 lcd_exec_commands(&fiio_lcd_cmd_sleep[0]);
181 mdelay(115); /* ensure we wait a total of 120ms before power off */
182 gpio_config(GPIO_B, CS_PIN|RD_PIN, 0);
183 }
184}
185
186void lcd_tgt_sleep(bool sleep)
187{
188 if(sleep)
189 lcd_exec_commands(&fiio_lcd_cmd_sleep[0]);
190 else
191 lcd_exec_commands(&fiio_lcd_cmd_wake[0]);
192}