diff options
Diffstat (limited to 'firmware/target/mips/ingenic_x1000/fiiom3k/lcd-fiiom3k.c')
-rw-r--r-- | firmware/target/mips/ingenic_x1000/fiiom3k/lcd-fiiom3k.c | 192 |
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 | |||
31 | static 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 | |||
133 | static 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 | |||
142 | static 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 | |||
151 | static const uint8_t __attribute__((aligned(64))) | ||
152 | fiio_lcd_dma_wr_cmd[] = {0x00, 0x00, 0x00, 0x2c}; | ||
153 | |||
154 | const 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 | |||
169 | void 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 | |||
186 | void 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 | } | ||