Krolyxon
Commit 1d55752

Branches

Tags

Refs →

orion-rf.piolibdepsesp32-s3-n16r8U8g2srcclibu8x8_d_s1d15e06.c

250 lines · 8.9 KB · C

1/*
2
3 u8x8_d_s1d15e06.c
4
5 https://github.com/olikraus/u8g2/pull/1190
6 https://github.com/olikraus/u8g2/issues/1172
7
8 Universal 8bit Graphics Library (https://github.com/olikraus/u8g2/)
9
10 Copyright (c) 2020, olikraus@gmail.com
11
12 All rights reserved.
13
14 Redistribution and use in source and binary forms, with or without modification,
15 are permitted provided that the following conditions are met:
16 * Redistributions of source code must retain the above copyright notice, this list
17 of conditions and the following disclaimer.
18
19 * Redistributions in binary form must reproduce the above copyright notice, this
20 list of conditions and the following disclaimer in the documentation and/or other
21 materials provided with the distribution.
22
23 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
24 CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
25 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
26 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
28 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
30 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
31 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
32 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
33 STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
35 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36
37*/
38#include "u8x8.h"
39
40static const uint8_t u8x8_d_s1d15e06_powersave0_seq[] = {
41 U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */
42 U8X8_C(0xA8), /* display on */
43 U8X8_END_TRANSFER(), /* disable chip */
44 U8X8_END() /* end of sequence */
45};
46
47static const uint8_t u8x8_d_s1d15e06_powersave1_seq[] = {
48 U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */
49 U8X8_C(0xA8|1), /* display off, enter sleep mode */
50 U8X8_END_TRANSFER(), /* disable chip */
51 U8X8_END() /* end of sequence */
52};
53
54static const uint8_t u8x8_d_s1d15e06_flip0_seq[] = {
55 U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */
56 U8X8_C(0xA6), /* LCD Mapping */
57 U8X8_END_TRANSFER(), /* disable chip */
58 U8X8_END() /* end of sequence */
59};
60
61static const uint8_t u8x8_d_s1d15e06_flip1_seq[] = {
62 U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */
63 U8X8_C(0xA7), /* LCD Mapping */
64 U8X8_END_TRANSFER(), /* disable chip */
65 U8X8_END() /* end of sequence */
66};
67
68uint8_t u8x8_d_s1d15e06_common(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
69{
70 uint8_t x, y, c;
71 uint8_t *ptr;
72 switch(msg)
73 {
74 case U8X8_MSG_DISPLAY_DRAW_TILE:
75 u8x8_cad_StartTransfer(u8x8);
76
77 x = ((u8x8_tile_t *)arg_ptr)->x_pos;
78 x *= 8;
79
80 u8x8_cad_SendCmd(u8x8, 0xB1); //Page Address - Row
81 u8x8_cad_SendArg(u8x8, (((u8x8_tile_t *)arg_ptr)->y_pos));
82
83 y = ((u8x8_tile_t *)arg_ptr)->y_pos;
84 y += u8x8->x_offset;
85
86 u8x8_cad_SendCmd(u8x8, 0x13); /* col */
87 u8x8_cad_SendArg(u8x8, x);
88
89 u8x8_cad_SendCmd(u8x8, 0x1D ); //Data Write
90
91 c = ((u8x8_tile_t *)arg_ptr)->cnt;
92 c *= 8;
93 ptr = ((u8x8_tile_t *)arg_ptr)->tile_ptr;
94 do
95 {
96 u8x8_cad_SendData(u8x8, c, ptr); /* note: SendData can not handle more than 255 bytes */
97 arg_int--;
98 } while( arg_int > 0 );
99
100 u8x8_cad_EndTransfer(u8x8);
101 break;
102 /* handled in the calling procedure
103 case U8X8_MSG_DISPLAY_SETUP_MEMORY:
104 u8x8_d_helper_display_setup_memory(u8x8, &u8x8_uc1608_128x64_display_info);
105 break;
106 case U8X8_MSG_DISPLAY_INIT:
107 u8x8_d_helper_display_init(u8x8);
108 u8x8_cad_SendSequence(u8x8, u8x8_d_uc1701_dogs102_init_seq);
109 break;
110 */
111 case U8X8_MSG_DISPLAY_SET_POWER_SAVE:
112 if ( arg_int == 0 )
113 u8x8_cad_SendSequence(u8x8, u8x8_d_s1d15e06_powersave0_seq);
114 else
115 u8x8_cad_SendSequence(u8x8, u8x8_d_s1d15e06_powersave1_seq);
116 break;
117 case U8X8_MSG_DISPLAY_SET_FLIP_MODE:
118 if ( arg_int == 0 )
119 {
120 u8x8_cad_SendSequence(u8x8, u8x8_d_s1d15e06_flip0_seq);
121 u8x8->x_offset = u8x8->display_info->default_x_offset;
122 }
123 else
124 {
125 u8x8_cad_SendSequence(u8x8, u8x8_d_s1d15e06_flip1_seq);
126 u8x8->x_offset = u8x8->display_info->flipmode_x_offset;
127 }
128 break;
129#ifdef U8X8_WITH_SET_CONTRAST
130 case U8X8_MSG_DISPLAY_SET_CONTRAST:
131 break;
132#endif
133 default:
134 return 0;
135 }
136 return 1;
137}
138
139/*================================================*/
140/* s1d15e06 160x100 */
141
142
143static const u8x8_display_info_t u8x8_s1d15e06_160100_display_info =
144{
145 /* chip_enable_level = */ 0, /* s1d15e06 has low active CS */
146 /* chip_disable_level = */ 1,
147
148 /* post_chip_enable_wait_ns = */ 10, /* uc1608 datasheet, page 39, actually 0 */
149 /* pre_chip_disable_wait_ns = */ 20, /* uc1608 datasheet, page 39 */
150 /* reset_pulse_width_ms = */ 1, /* uc1608 datasheet, page 42 */
151 /* post_reset_wait_ms = */ 10,
152 /* sda_setup_time_ns = */ 30, /* uc1608 datasheet, page 41 */
153 /* sck_pulse_width_ns = */ 65, /* half of cycle time */
154 /* sck_clock_hz = */ 8000000UL, /* since Arduino 1.6.0, the SPI bus speed in Hz. Should be 1000000000/sck_pulse_width_ns */
155 /* spi_mode = */ 0, /* active high, rising edge */
156 /* i2c_bus_clock_100kHz = */ 4,
157 /* data_setup_time_ns = */ 30, /* uc1608 datasheet, page 39 */
158 /* write_pulse_width_ns = */ 65, /* uc1608 datasheet, page 39 */
159 /* tile_width = */ 20, /* width of 20*8=160 pixel */
160 /* tile_height = */ 13,
161 /* default_x_offset = */ 0, /* reused as y page offset */
162 /* flipmode_x_offset = */ 0, /* reused as y page offset */
163 /* pixel_width = */ 160,
164 /* pixel_height = */ 100
165};
166
167static const uint8_t u8x8_d_s1d15e06_160100_init_seq[] = {
168
169 U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */
170
171 /* (Command no in datasheet) Description */
172 U8X8_C(0xA0|1), /* (12) Column Address Direction (Reverse) */
173
174 U8X8_C(0xC4|1), /* (5) Common Output Status (Reverse) */
175 U8X8_C(0x84), /* (11) Display Data In. Direction (Normal) */
176
177 U8X8_C(0xA6), /* (3) Display Normal Reverse (Normal) */
178 U8X8_C(0xA4), /* (4) Display All Light (Normal) */
179
180
181 U8X8_CAA(0x6D,0x18,0x04), /* (18) Duty Set Command,
182 Parameter "Duty Set" 1/96 ,
183 Parameter "Start Point Set" */
184
185 U8X8_CA(0x66, 0x01), /* (15) Display Mode, Parameter 0 (4 Gray Scale) 1 (Binary) */
186 U8X8_CA(0x39, 0x43), /* (16) Gray Scale Pattern Set, Pattern */
187 U8X8_C(0xBE|1), /* (2) Display Off Mode (0 VSS / 1 Vcc) */
188
189 U8X8_CA(0x2B, 0x03), /* (27) LCD Drive Mode Voltage Select, Parameter */
190
191 U8X8_CA(0x81, 0x32), /* (28) Electronic Volume, Parameter */
192 U8X8_C(0xE4|1), /* (14) N-Line On Off (On) */
193 U8X8_CA(0x36, 0x05), /* (13) N-Line Inversion Drive, Parameter (6x4) */
194
195 U8X8_CA(0x41, 0x03), /* (13) (26) Step-up CK Frequency Select, fosc/8 */
196 U8X8_CA(0x5F, 0x04), /* (24) Built-in Oscillator Frequency, Parameter */
197 U8X8_C(0xAA|1), /* (23) Built-in OSC On */
198
199 U8X8_CA(0x25, 0x1F), /* (25) Power Control Set, Parameter */
200
201 U8X8_CA(0x8A, 0x00), /* (6) Start Line Setup, Parameter */
202 U8X8_CA(0xB1, 0x00), /* (7) Page Address Set, Parameter */
203 U8X8_CA(0x13, 0x00), /* (8) Column Address Set */
204
205 U8X8_C(0xAE|1), /* (1) Display ON/OFF */
206
207 U8X8_END_TRANSFER(), /* disable chip */
208 U8X8_END() /* end of sequence */
209};
210
211uint8_t u8x8_d_s1d15e06_160100(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
212{
213
214 /* checking for the flip mode cmd first */
215 if ( msg == U8X8_MSG_DISPLAY_SET_FLIP_MODE )
216 {
217 if ( arg_int == 0 )
218 {
219 u8x8_cad_SendSequence(u8x8, u8x8_d_s1d15e06_flip0_seq);
220 u8x8->x_offset = u8x8->display_info->default_x_offset;
221 }
222 else
223 {
224 u8x8_cad_SendSequence(u8x8, u8x8_d_s1d15e06_flip1_seq);
225 u8x8->x_offset = u8x8->display_info->flipmode_x_offset;
226 }
227 return 1;
228 }
229 /* call the common procedure, this now leads to the effect, that the flip code is executed again */
230 /* maybe we should paste the common code here to avoid this */
231
232
233 if ( u8x8_d_s1d15e06_common(u8x8, msg, arg_int, arg_ptr) == 0 )
234 {
235 /* msg not handled, then try here */
236 switch(msg)
237 {
238 case U8X8_MSG_DISPLAY_SETUP_MEMORY:
239 u8x8_d_helper_display_setup_memory(u8x8, &u8x8_s1d15e06_160100_display_info);
240 break;
241 case U8X8_MSG_DISPLAY_INIT:
242 u8x8_d_helper_display_init(u8x8);
243 u8x8_cad_SendSequence(u8x8, u8x8_d_s1d15e06_160100_init_seq);
244 break;
245 default:
246 return 0; /* msg unknown */
247 }
248 }
249 return 1;
250}