ssdfbvar.h revision 1.10 1 1.10 tnn /* $NetBSD: ssdfbvar.h,v 1.10 2021/08/05 22:31:20 tnn Exp $ */
2 1.1 tnn
3 1.1 tnn /*
4 1.1 tnn * Copyright (c) 2019 The NetBSD Foundation, Inc.
5 1.1 tnn * All rights reserved.
6 1.1 tnn *
7 1.1 tnn * This code is derived from software contributed to The NetBSD Foundation
8 1.1 tnn * by Tobias Nygren.
9 1.1 tnn *
10 1.1 tnn * Redistribution and use in source and binary forms, with or without
11 1.1 tnn * modification, are permitted provided that the following conditions
12 1.1 tnn * are met:
13 1.1 tnn * 1. Redistributions of source code must retain the above copyright
14 1.1 tnn * notice, this list of conditions and the following disclaimer.
15 1.1 tnn * 2. Redistributions in binary form must reproduce the above copyright
16 1.1 tnn * notice, this list of conditions and the following disclaimer in the
17 1.1 tnn * documentation and/or other materials provided with the distribution.
18 1.1 tnn *
19 1.1 tnn * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 1.1 tnn * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 1.1 tnn * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 1.1 tnn * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 1.1 tnn * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 1.1 tnn * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 1.1 tnn * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 1.1 tnn * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 1.1 tnn * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 1.1 tnn * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 1.1 tnn * POSSIBILITY OF SUCH DAMAGE.
30 1.1 tnn */
31 1.1 tnn
32 1.1 tnn /*
33 1.1 tnn * cfdata attachment flags
34 1.1 tnn */
35 1.1 tnn #define SSDFB_ATTACH_FLAG_PRODUCT_MASK 0x000000ff
36 1.1 tnn #define SSDFB_ATTACH_FLAG_UPSIDEDOWN 0x00000100
37 1.1 tnn #define SSDFB_ATTACH_FLAG_INVERSE 0x00000200
38 1.1 tnn #define SSDFB_ATTACH_FLAG_CONSOLE 0x00000400
39 1.10 tnn #define SSDFB_ATTACH_FLAG_MPSAFE 0x00000800
40 1.1 tnn
41 1.1 tnn /*
42 1.1 tnn * Fundamental commands
43 1.1 tnn * SSD1306 Rev 1.1 p.28
44 1.1 tnn * SH1106 Rev 0.1 p.19,20,22
45 1.1 tnn */
46 1.1 tnn #define SSDFB_CMD_SET_CONTRAST_CONTROL 0x81
47 1.1 tnn #define SSDFB_CMD_ENTIRE_DISPLAY_OFF 0xa4
48 1.1 tnn #define SSDFB_CMD_ENTIRE_DISPLAY_ON 0xa5
49 1.1 tnn #define SSDFB_CMD_SET_NORMAL_DISPLAY 0xa6
50 1.1 tnn #define SSDFB_CMD_SET_INVERSE_DISPLAY 0xa7
51 1.1 tnn #define SSDFB_CMD_SET_DISPLAY_OFF 0xae
52 1.1 tnn #define SSDFB_CMD_SET_DISPLAY_ON 0xaf
53 1.1 tnn
54 1.1 tnn /*
55 1.1 tnn * Scrolling commands; SSD1306 Rev 1.1 p. 28
56 1.1 tnn */
57 1.1 tnn #define SSDFB_CMD_VERTICAL_AND_RIGHT_SCROLL 0x29
58 1.1 tnn #define SSDFB_CMD_VERTICAL_AND_LEFT_SCROLL 0x2a
59 1.1 tnn #define SSDFB_CMD_DEACTIVATE_SCROLL 0x2e
60 1.1 tnn #define SSDFB_CMD_ACTIVATE_SCROLL 0x2f
61 1.1 tnn #define SSDFB_CMD_SET_VERTICAL_SCROLL_AREA 0xa3
62 1.1 tnn
63 1.1 tnn /*
64 1.1 tnn * Addressing commands
65 1.1 tnn * SSD1306 Rev 1.1 p.30
66 1.1 tnn * SH1106 Rev 0.1 p.18,22
67 1.1 tnn */
68 1.1 tnn #define SSDFB_CMD_SET_LOWER_COLUMN_START_ADDRESS_BASE 0x00
69 1.1 tnn #define SSDFB_CMD_SET_LOWER_COLUMN_START_ADDRESS_MAX 0x0f
70 1.1 tnn #define SSDFB_CMD_SET_HIGHER_COLUMN_START_ADDRESS_BASE 0x10
71 1.1 tnn #define SSDFB_CMD_SET_HIGHER_COLUMN_START_ADDRESS_MAX 0x1f
72 1.1 tnn #define SSD1306_CMD_SET_MEMORY_ADDRESSING_MODE 0x20
73 1.1 tnn #define SSD1306_MEMORY_ADDRESSING_MODE_HORIZONTAL 0x00
74 1.1 tnn #define SSD1306_MEMORY_ADDRESSING_MODE_VERTICAL 0x01
75 1.1 tnn #define SSD1306_MEMORY_ADDRESSING_MODE_PAGE 0x02
76 1.1 tnn #define SSD1306_CMD_SET_COLUMN_ADDRESS 0x21
77 1.1 tnn #define SSD1306_CMD_SET_PAGE_ADDRESS 0x22
78 1.1 tnn #define SSDFB_CMD_SET_PAGE_START_ADDRESS_BASE 0xb0
79 1.1 tnn #define SSDFB_CMD_SET_PAGE_START_ADDRESS_MAX 0xb7
80 1.1 tnn
81 1.1 tnn /*
82 1.1 tnn * Resolution & hardware layout commands
83 1.1 tnn * SSD1306 Rev 1.1 p.31
84 1.1 tnn * SH1106 Rev 0.1 p.19,20,21,23
85 1.1 tnn */
86 1.1 tnn #define SSDFB_CMD_SET_DISPLAY_START_LINE_BASE 0x40
87 1.1 tnn #define SSDFB_CMD_SET_DISPLAY_START_LINE_MAX 0x7f
88 1.1 tnn #define SSDFB_CMD_SET_SEGMENT_REMAP_NORMAL 0xa0
89 1.1 tnn #define SSDFB_CMD_SET_SEGMENT_REMAP_REVERSE 0xa1
90 1.1 tnn #define SSDFB_CMD_SET_MULTIPLEX_RATIO 0xa8
91 1.1 tnn #define SSDFB_CMD_SET_COM_OUTPUT_DIRECTION_NORMAL 0xc0
92 1.1 tnn #define SSDFB_CMD_SET_COM_OUTPUT_DIRECTION_REMAP 0xc8
93 1.1 tnn #define SSDFB_CMD_SET_DISPLAY_OFFSET 0xd3
94 1.1 tnn #define SSDFB_CMD_SET_COM_PINS_HARDWARE_CFG 0xda
95 1.1 tnn #define SSDFB_COM_PINS_A1_MASK 0x02
96 1.1 tnn #define SSDFB_COM_PINS_ALTERNATIVE_MASK 0x10
97 1.1 tnn #define SSDFB_COM_PINS_REMAP_MASK 0x20
98 1.1 tnn
99 1.1 tnn /*
100 1.1 tnn * Timing & driving commands
101 1.1 tnn * SSD1306 Rev 1.1 p.32
102 1.1 tnn * SH1106 Rev 0.1 p.24,25,26
103 1.1 tnn */
104 1.1 tnn #define SSDFB_CMD_SET_DISPLAY_CLOCK_RATIO 0xd5
105 1.3 tnn #define SSDFB_DISPLAY_CLOCK_DIVIDER_MASK __BITS(3, 0)
106 1.3 tnn #define SSDFB_DISPLAY_CLOCK_OSCILLATOR_MASK __BITS(7, 4)
107 1.1 tnn #define SSDFB_CMD_SET_PRECHARGE_PERIOD 0xd9
108 1.3 tnn #define SSDFB_PRECHARGE_MASK __BITS(3, 0)
109 1.3 tnn #define SSDFB_DISCHARGE_MASK __BITS(7, 4)
110 1.1 tnn #define SSDFB_CMD_SET_VCOMH_DESELECT_LEVEL 0xdb
111 1.1 tnn #define SSD1306_VCOMH_DESELECT_LEVEL_0_65_VCC 0x00
112 1.1 tnn #define SSD1306_VCOMH_DESELECT_LEVEL_0_77_VCC 0x20
113 1.1 tnn #define SSD1306_VCOMH_DESELECT_LEVEL_0_83_VCC 0x30
114 1.1 tnn #define SH1106_VCOMH_DESELECT_LEVEL_DEFAULT 0x35
115 1.1 tnn
116 1.1 tnn /*
117 1.1 tnn * Misc commands
118 1.1 tnn * SSD1306 Rev 1.1 p.32
119 1.1 tnn * SH1106 Rev 0.1 p.27,28
120 1.1 tnn */
121 1.1 tnn #define SSDFB_CMD_NOP 0xe3
122 1.1 tnn #define SH1106_CMD_READ_MODIFY_WRITE 0xe0
123 1.1 tnn #define SH1106_CMD_READ_MODIFY_WRITE_CANCEL 0xee
124 1.1 tnn
125 1.1 tnn /*
126 1.1 tnn * Charge pump commands
127 1.1 tnn * SSD1306 App Note Rev 0.4 p.3
128 1.1 tnn * SH1106 V0.1 p.18
129 1.1 tnn */
130 1.1 tnn #define SSD1306_CMD_SET_CHARGE_PUMP 0x8d
131 1.1 tnn #define SSD1306_CHARGE_PUMP_ENABLE 0x14
132 1.1 tnn #define SSD1306_CHARGE_PUMP_DISABE 0x10
133 1.1 tnn #define SH1106_CMD_SET_CHARGE_PUMP_7V4 0x30
134 1.1 tnn #define SH1106_CMD_SET_CHARGE_PUMP_8V0 0x31
135 1.1 tnn #define SH1106_CMD_SET_CHARGE_PUMP_8V4 0x32
136 1.1 tnn #define SH1106_CMD_SET_CHARGE_PUMP_9V0 0x33
137 1.1 tnn
138 1.1 tnn /*
139 1.1 tnn * DC-DC commands
140 1.1 tnn * SH1106 V0.1 p.18
141 1.1 tnn */
142 1.1 tnn #define SH1106_CMD_SET_DC_DC 0xad
143 1.1 tnn #define SH1106_DC_DC_OFF 0x8a
144 1.1 tnn #define SH1106_DC_DC_ON 0x8b
145 1.1 tnn
146 1.3 tnn /*
147 1.3 tnn * SSD1322 command set
148 1.3 tnn */
149 1.3 tnn #define SSD1322_CMD_ENABLE_GRAY_SCALE_TABLE 0x00
150 1.3 tnn #define SSD1322_CMD_SET_COLUMN_ADDRESS 0x15
151 1.3 tnn #define SSD1322_CMD_WRITE_RAM 0x5c
152 1.3 tnn #define SSD1322_CMD_READ_RAM 0x5d
153 1.3 tnn #define SSD1322_CMD_SET_ROW_ADDRESS 0x75
154 1.3 tnn #define SSD1322_CMD_SET_REMAP_AND_DUAL_COM_LINE_MODE 0xa0
155 1.3 tnn #define SSD1322_CMD_SET_DISPLAY_START_LINE 0xa1
156 1.3 tnn #define SSD1322_CMD_SET_DISPLAY_OFFSET 0xa2
157 1.3 tnn
158 1.7 tnn #define SSD1322_CMD_ENTIRE_DISPLAY_OFF SSDFB_CMD_ENTIRE_DISPLAY_OFF
159 1.7 tnn #define SSD1322_CMD_ENTIRE_DISPLAY_ON SSDFB_CMD_ENTIRE_DISPLAY_ON
160 1.7 tnn #define SSD1322_CMD_NORMAL_DISPLAY SSDFB_CMD_SET_NORMAL_DISPLAY
161 1.7 tnn #define SSD1322_CMD_INVERSE_DISPLAY SSDFB_CMD_SET_INVERSE_DISPLAY
162 1.7 tnn #define SSD1322_CMD_SET_SLEEP_MODE_ON SSDFB_CMD_SET_DISPLAY_OFF
163 1.7 tnn #define SSD1322_CMD_SET_SLEEP_MODE_OFF SSDFB_CMD_SET_DISPLAY_ON
164 1.3 tnn
165 1.3 tnn #define SSD1322_CMD_ENABLE_PARTIAL_DISPLAY 0xa8
166 1.3 tnn #define SSD1322_CMD_EXIT_PARTIAL_DISPLAY 0xa9
167 1.3 tnn #define SSD1322_CMD_FUNCTION_SELECTION 0xab
168 1.3 tnn #define SSD1322_FUNCTION_SELECTION_EXTERNAL_VDD 0
169 1.3 tnn #define SSD1322_FUNCTION_SELECTION_INTERNAL_VDD __BIT(0)
170 1.3 tnn #define SSD1322_CMD_SET_PHASE_LENGTH 0xb1
171 1.3 tnn #define SSD1322_PHASE_LENGTH_PHASE_2_MASK __BITS(7, 4)
172 1.3 tnn #define SSD1322_DEFAULT_PHASE_2 7
173 1.3 tnn #define SSD1322_PHASE_LENGTH_PHASE_1_MASK __BITS(3, 0)
174 1.3 tnn #define SSD1322_DEFAULT_PHASE_1 4
175 1.3 tnn #define SSD1322_CMD_SET_FRONT_CLOCK_DIVIDER 0xb3
176 1.3 tnn #define SSD1322_FREQUENCY_MASK __BITS(7, 4)
177 1.3 tnn #define SSD1322_DEFAULT_FREQUENCY 5
178 1.3 tnn #define SSD1322_DIVIDER_MASK __BITS(3, 0)
179 1.3 tnn #define SSD1322_DEFAULT_DIVIDER 0
180 1.3 tnn #define SSD1322_CMD_DISPLAY_ENHANCEMENT_A 0xb4
181 1.3 tnn #define SSD1322_DISPLAY_ENHANCEMENT_A_MAGIC1 0xa2
182 1.3 tnn #define SSD1322_DISPLAY_ENHANCEMENT_A_MAGIC2 0xb5
183 1.3 tnn #define SSD1322_CMD_SET_GPIO 0xb5
184 1.3 tnn #define SSD1322_GPIO0_DISABLED 0
185 1.3 tnn #define SSD1322_GPIO0_TRISTATE __BIT(0)
186 1.3 tnn #define SSD1322_GPIO0_LOW __BIT(1)
187 1.3 tnn #define SSD1322_GPIO0_HIGH __BITS(1, 0)
188 1.3 tnn #define SSD1322_GPIO1_DISABLED 0
189 1.3 tnn #define SSD1322_GPIO1_TRISTATE __BIT(2)
190 1.3 tnn #define SSD1322_GPIO1_LOW __BIT(3)
191 1.3 tnn #define SSD1322_GPIO1_HIGH __BITS(3, 2)
192 1.3 tnn #define SSD1322_CMD_SET_SECOND_PRECHARGE_PERIOD 0xb6
193 1.7 tnn #define SSD1322_DEFAULT_SECOND_PRECHARGE_PERIOD 8
194 1.3 tnn #define SSD1322_CMD_SET_GRAY_SCALE_TABLE 0xb8
195 1.3 tnn #define SSD1322_CMD_SET_DEFAULT_GRAY_SCALE_TABLE 0xb9
196 1.3 tnn #define SSD1322_CMD_SET_PRE_CHARGE_VOLTAGE_LEVEL 0xbb
197 1.3 tnn #define SSD1322_DEFAULT_PRE_CHARGE_VOLTAGE_LEVEL 0x17
198 1.3 tnn #define SSD1322_CMD_SET_VCOMH 0xbe
199 1.3 tnn #define SSD1322_DEFAULT_VCOMH 0x04
200 1.3 tnn #define SSD1322_CMD_SET_CONTRAST_CURRENT 0xc1
201 1.3 tnn #define SSD1322_DEFAULT_CONTRAST_CURRENT 0x7f
202 1.3 tnn #define SSD1322_CMD_MASTER_CONTRAST_CURRENT_CONTROL 0xc7
203 1.3 tnn #define SSD1322_DEFAULT_MASTER_CONTRAST_CURRENT_CONTROL 0xf
204 1.7 tnn #define SSD1322_CMD_SET_MULTIPLEX_RATIO 0xca
205 1.3 tnn #define SSD1322_CMD_DISPLAY_ENHANCEMENT_B 0xd1
206 1.3 tnn #define SSD1322_DISPLAY_ENHANCEMENT_B_MAGIC1 0xa2
207 1.3 tnn #define SSD1322_DISPLAY_ENHANCEMENT_B_MAGIC2 0x20
208 1.3 tnn #define SSD1322_CMD_SET_COMMAND_LOCK 0xfd
209 1.3 tnn #define SSD1322_COMMAND_UNLOCK_MAGIC 0x12
210 1.3 tnn #define SSD1322_COMMAND_LOCK_MAGIC 0x16
211 1.7 tnn /* undocumented on this chip, but works in practice */
212 1.7 tnn #define SSD1322_CMD_NOP SSDFB_CMD_NOP
213 1.7 tnn
214 1.7 tnn /*
215 1.7 tnn * SSD1353 command set
216 1.7 tnn */
217 1.7 tnn #define SSD1353_CMD_SET_COLUMN_ADDRESS SSD1322_CMD_SET_COLUMN_ADDRESS
218 1.7 tnn #define SSD1353_CMD_DRAW_LINE 0x21
219 1.7 tnn #define SSD1353_CMD_DRAW_RECTANGLE 0x22
220 1.7 tnn #define SSD1353_CMD_COPY 0x23
221 1.7 tnn #define SSD1353_CMD_DIM 0x24
222 1.7 tnn #define SSD1353_CMD_CLEAR_WINDOW 0x25
223 1.7 tnn #define SSD1353_CMD_FILL_ENABLE 0x26
224 1.7 tnn #define SSD1353_CMD_SCROLLING_SETUP 0x27
225 1.7 tnn #define SSD1353_CMD_DEACTIVATE_SCROLL SSDFB_CMD_DEACTIVATE_SCROLL
226 1.7 tnn #define SSD1353_CMD_ACTIVATE_SCROLL SSDFB_CMD_ACTIVATE_SCROLL
227 1.7 tnn #define SSD1353_CMD_WRITE_RAM SSD1322_CMD_WRITE_RAM
228 1.7 tnn #define SD1353_CMD_READ_RAM SSD1322_CMD_READ_RAM
229 1.7 tnn #define SSD1353_CMD_SET_ROW_ADDRESS SSD1322_CMD_SET_ROW_ADDRESS
230 1.7 tnn #define SSD1353_CMD_SET_CONTRAST_CONTROL_A 0x81
231 1.7 tnn #define SSD1353_CMD_SET_CONTRAST_CONTROL_B 0x82
232 1.7 tnn #define SSD1353_CMD_SET_CONTRAST_CONTROL_C 0x83
233 1.7 tnn #define SSD1353_DEFAULT_CONTRAST_CONTROL 128
234 1.7 tnn #define SSD1353_CMD_MASTER_CURRENT_CONTROL 0x87
235 1.7 tnn #define SSD1353_DEFAULT_MASTER_CURRENT_ATTENUATION 15
236 1.7 tnn #define SSD1353_CMD_SET_SECOND_PRECHARGE_SPEED 0x8a
237 1.7 tnn #define SSD1353_DEFAULT_SECOND_PRECHARGE_SPEED 2
238 1.7 tnn #define SSD1353_CMD_REMAP_COLOR_DEPTH 0xa0
239 1.8 tnn #define SSD1353_REMAP_NO_INCREMENT __BIT(0)
240 1.8 tnn #define SSD1353_REMAP_SEG_DIRECTION __BIT(1)
241 1.8 tnn #define SSD1353_REMAP_RGB __BIT(2)
242 1.8 tnn #define SSD1353_REMAP_LR __BIT(3)
243 1.8 tnn #define SSD1353_REMAP_COM_DIRECTION __BIT(4)
244 1.8 tnn #define SSD1353_REMAP_SPLIT_ODD_EVEN __BIT(5)
245 1.8 tnn #define SSD1353_REMAP_PIXEL_FORMAT_MASK __BITS(7, 6)
246 1.7 tnn #define SSD1353_CMD_SET_DISPLAY_START_LINE SSD1322_CMD_SET_DISPLAY_START_LINE
247 1.7 tnn #define SSD1353_CMD_SET_DISPLAY_OFFSET SSD1322_CMD_SET_DISPLAY_OFFSET
248 1.7 tnn #define SSD1353_CMD_SET_VERTICAL_SCROLL_AREA SSDFB_CMD_SET_VERTICAL_SCROLL_AREA
249 1.7 tnn #define SSD1353_CMD_NORMAL_DISPLAY 0xa4
250 1.7 tnn #define SSD1353_CMD_ENTIRE_DISPLAY_ON 0xa5
251 1.7 tnn #define SSD1353_CMD_ENTIRE_DISPLAY_OFF 0xa6
252 1.7 tnn #define SSD1353_CMD_INVERSE_DISPLAY SSDFB_CMD_SET_INVERSE_DISPLAY
253 1.7 tnn #define SSD1353_CMD_SET_MULTIPLEX_RATIO SSDFB_CMD_SET_MULTIPLEX_RATIO
254 1.7 tnn #define SSD1353_CMD_DIM_MODE_SETTING 0xab
255 1.7 tnn #define SSD1353_CMD_SET_DISPLAY_ON_DIM 0xac
256 1.7 tnn #define SSD1353_CMD_SET_DISPLAY_OFF SSDFB_CMD_SET_DISPLAY_OFF
257 1.7 tnn #define SSD1353_CMD_SET_DISPLAY_ON SSDFB_CMD_SET_DISPLAY_ON
258 1.7 tnn #define SSD1353_CMD_SET_PHASE_LENGTH SSD1322_CMD_SET_PHASE_LENGTH
259 1.7 tnn #define SSD1353_DEFAULT_PHASE_2 7
260 1.7 tnn #define SSD1353_DEFAULT_PHASE_1 4
261 1.7 tnn #define SSD1353_CMD_SET_FRONT_CLOCK_DIVIDER SSD1322_CMD_SET_FRONT_CLOCK_DIVIDER
262 1.7 tnn #define SSD1353_DEFAULT_DIVIDER 0
263 1.7 tnn #define SSD1353_DEFAULT_FREQUENCY 12
264 1.7 tnn #define SSD1353_CMD_SET_SECOND_PRECHARGE_PERIOD 0xb4
265 1.7 tnn #define SSD1353_DEFAULT_SECOND_PRECHARGE_PERIOD 7
266 1.7 tnn #define SSD1353_CMD_SET_GRAY_SCALE_TABLE SSD1322_CMD_SET_GRAY_SCALE_TABLE
267 1.7 tnn #define SSD1353_CMD_SET_DEFAULT_GRAY_SCALE_TABLE SSD1322_CMD_SET_DEFAULT_GRAY_SCALE_TABLE
268 1.7 tnn #define SSD1353_CMD_SET_PRE_CHARGE_VOLTAGE_LEVEL SSD1322_CMD_SET_PRE_CHARGE_VOLTAGE_LEVEL
269 1.7 tnn #define SSD1353_DEFAULT_PRE_CHARGE_VOLTAGE_LEVEL 0x3e
270 1.7 tnn #define SSD1353_CMD_SET_VCOMH SSD1322_CMD_SET_VCOMH
271 1.7 tnn #define SSD1353_DEFAULT_VCOMH 0x3c
272 1.7 tnn #define SSD1353_CMD_OTP_WRITE 0xc0
273 1.7 tnn #define SSD1353_CMD_RESET 0xe2
274 1.7 tnn #define SSD1353_CMD_NOP SSDFB_CMD_NOP
275 1.7 tnn #define SSD1353_CMD_SET_COMMAND_LOCK SSD1322_CMD_SET_COMMAND_LOCK
276 1.7 tnn #define SSD1353_COMMAND_UNLOCK_MAGIC SSD1322_COMMAND_UNLOCK_MAGIC
277 1.7 tnn #define SSD1353_COMMAND_LOCK_MAGIC SSD1353_COMMAND_LOCK_MAGIC
278 1.3 tnn
279 1.4 tnn struct ssdfb_softc;
280 1.4 tnn
281 1.1 tnn typedef enum {
282 1.1 tnn SSDFB_CONTROLLER_UNKNOWN=0,
283 1.1 tnn SSDFB_CONTROLLER_SSD1306=1,
284 1.1 tnn SSDFB_CONTROLLER_SH1106=2,
285 1.3 tnn SSDFB_CONTROLLER_SSD1322=3,
286 1.9 tnn SSDFB_CONTROLLER_SSD1353=4,
287 1.1 tnn } ssdfb_controller_id_t;
288 1.1 tnn
289 1.1 tnn typedef enum {
290 1.1 tnn SSDFB_PRODUCT_UNKNOWN=0,
291 1.1 tnn SSDFB_PRODUCT_SSD1306_GENERIC=1,
292 1.1 tnn SSDFB_PRODUCT_SH1106_GENERIC=2,
293 1.1 tnn SSDFB_PRODUCT_ADAFRUIT_931=3,
294 1.1 tnn SSDFB_PRODUCT_ADAFRUIT_938=4,
295 1.3 tnn SSDFB_PRODUCT_SSD1322_GENERIC=5,
296 1.9 tnn SSDFB_PRODUCT_SSD1353_GENERIC=6,
297 1.9 tnn SSDFB_PRODUCT_DEP_160128A_RGB=7,
298 1.1 tnn } ssdfb_product_id_t;
299 1.1 tnn
300 1.1 tnn #define SSDFB_I2C_DEFAULT_ADDR 0x3c
301 1.1 tnn #define SSDFB_I2C_ALTERNATIVE_ADDR 0x3d
302 1.1 tnn
303 1.1 tnn /* Co bit has different behaviour in SSD1306 and SH1106 */
304 1.1 tnn #define SSDFB_I2C_CTRL_BYTE_CONTINUATION_MASK __BIT(7)
305 1.1 tnn #define SSDFB_I2C_CTRL_BYTE_DATA_MASK __BIT(6)
306 1.1 tnn
307 1.1 tnn union ssdfb_block {
308 1.1 tnn uint8_t col[8];
309 1.1 tnn uint64_t raw;
310 1.1 tnn };
311 1.1 tnn
312 1.1 tnn struct ssdfb_product {
313 1.1 tnn ssdfb_product_id_t p_product_id;
314 1.1 tnn ssdfb_controller_id_t p_controller_id;
315 1.1 tnn const char *p_name;
316 1.1 tnn int p_width;
317 1.1 tnn int p_height;
318 1.5 tnn int p_bits_per_pixel;
319 1.8 tnn bool p_rgb;
320 1.1 tnn int p_panel_shift;
321 1.1 tnn uint8_t p_fosc;
322 1.1 tnn uint8_t p_fosc_div;
323 1.1 tnn uint8_t p_precharge;
324 1.1 tnn uint8_t p_discharge;
325 1.1 tnn uint8_t p_compin_cfg;
326 1.1 tnn uint8_t p_vcomh_deselect_level;
327 1.1 tnn uint8_t p_default_contrast;
328 1.1 tnn uint8_t p_multiplex_ratio;
329 1.4 tnn int (*p_init)(struct ssdfb_softc *);
330 1.5 tnn int (*p_sync)(struct ssdfb_softc *, bool);
331 1.1 tnn };
332 1.1 tnn
333 1.1 tnn struct ssdfb_softc {
334 1.1 tnn device_t sc_dev;
335 1.1 tnn const struct ssdfb_product *sc_p;
336 1.1 tnn
337 1.1 tnn /* wscons & rasops state */
338 1.1 tnn u_int sc_mode;
339 1.1 tnn int sc_fontcookie;
340 1.1 tnn struct wsdisplay_font *sc_font;
341 1.1 tnn struct wsscreen_descr sc_screen_descr;
342 1.1 tnn const struct wsscreen_descr *sc_screens[1];
343 1.1 tnn struct wsscreen_list sc_screenlist;
344 1.1 tnn struct rasops_info sc_ri;
345 1.1 tnn size_t sc_ri_bits_len;
346 1.1 tnn struct wsdisplay_emulops sc_orig_riops;
347 1.1 tnn int sc_nscreens;
348 1.1 tnn device_t sc_wsdisplay;
349 1.1 tnn bool sc_is_console;
350 1.1 tnn bool sc_usepoll;
351 1.1 tnn
352 1.1 tnn /* hardware state */
353 1.1 tnn bool sc_upsidedown;
354 1.1 tnn bool sc_inverse;
355 1.1 tnn uint8_t sc_contrast;
356 1.1 tnn bool sc_display_on;
357 1.1 tnn union ssdfb_block *sc_gddram;
358 1.1 tnn size_t sc_gddram_len;
359 1.1 tnn
360 1.1 tnn /* damage tracking */
361 1.1 tnn lwp_t *sc_thread;
362 1.1 tnn kcondvar_t sc_cond;
363 1.1 tnn kmutex_t sc_cond_mtx;
364 1.1 tnn bool sc_detaching;
365 1.1 tnn int sc_backoff;
366 1.1 tnn bool sc_modified;
367 1.2 tnn struct uvm_object *sc_uobj;
368 1.1 tnn
369 1.1 tnn /* reference to bus-specific code */
370 1.1 tnn void *sc_cookie;
371 1.1 tnn int (*sc_cmd)(void *, uint8_t *, size_t, bool);
372 1.1 tnn int (*sc_transfer_rect)(void *, uint8_t, uint8_t, uint8_t, uint8_t,
373 1.1 tnn uint8_t *, size_t, bool);
374 1.1 tnn };
375 1.1 tnn
376 1.1 tnn void ssdfb_attach(struct ssdfb_softc *, int flags);
377 1.1 tnn int ssdfb_detach(struct ssdfb_softc *);
378