Krolyxon
Commit 1d55752

Branches

Tags

Refs →

orion-rf.piolibdepsesp32-s3-n16r8U8g2srcclibu8x8_d_s1d15721.c

231 lines · 8.4 KB · C

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