xref: /netbsd-src/sys/dev/ic/ssdfbvar.h (revision 2e6662efc3ecfb1f7255046a4ba6166b56b49f7b)
1*2e6662efStnn /* $NetBSD: ssdfbvar.h,v 1.10 2021/08/05 22:31:20 tnn Exp $ */
27ce8945fStnn 
37ce8945fStnn /*
47ce8945fStnn  * Copyright (c) 2019 The NetBSD Foundation, Inc.
57ce8945fStnn  * All rights reserved.
67ce8945fStnn  *
77ce8945fStnn  * This code is derived from software contributed to The NetBSD Foundation
87ce8945fStnn  * by Tobias Nygren.
97ce8945fStnn  *
107ce8945fStnn  * Redistribution and use in source and binary forms, with or without
117ce8945fStnn  * modification, are permitted provided that the following conditions
127ce8945fStnn  * are met:
137ce8945fStnn  * 1. Redistributions of source code must retain the above copyright
147ce8945fStnn  *    notice, this list of conditions and the following disclaimer.
157ce8945fStnn  * 2. Redistributions in binary form must reproduce the above copyright
167ce8945fStnn  *    notice, this list of conditions and the following disclaimer in the
177ce8945fStnn  *    documentation and/or other materials provided with the distribution.
187ce8945fStnn  *
197ce8945fStnn  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
207ce8945fStnn  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
217ce8945fStnn  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
227ce8945fStnn  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
237ce8945fStnn  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
247ce8945fStnn  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
257ce8945fStnn  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
267ce8945fStnn  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
277ce8945fStnn  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
287ce8945fStnn  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
297ce8945fStnn  * POSSIBILITY OF SUCH DAMAGE.
307ce8945fStnn  */
317ce8945fStnn 
327ce8945fStnn /*
337ce8945fStnn  * cfdata attachment flags
347ce8945fStnn  */
357ce8945fStnn #define SSDFB_ATTACH_FLAG_PRODUCT_MASK		0x000000ff
367ce8945fStnn #define SSDFB_ATTACH_FLAG_UPSIDEDOWN		0x00000100
377ce8945fStnn #define SSDFB_ATTACH_FLAG_INVERSE		0x00000200
387ce8945fStnn #define SSDFB_ATTACH_FLAG_CONSOLE		0x00000400
39*2e6662efStnn #define SSDFB_ATTACH_FLAG_MPSAFE		0x00000800
407ce8945fStnn 
417ce8945fStnn /*
427ce8945fStnn  * Fundamental commands
437ce8945fStnn  * SSD1306 Rev 1.1 p.28
447ce8945fStnn  * SH1106 Rev 0.1 p.19,20,22
457ce8945fStnn  */
467ce8945fStnn #define SSDFB_CMD_SET_CONTRAST_CONTROL		0x81
477ce8945fStnn #define SSDFB_CMD_ENTIRE_DISPLAY_OFF		0xa4
487ce8945fStnn #define SSDFB_CMD_ENTIRE_DISPLAY_ON		0xa5
497ce8945fStnn #define SSDFB_CMD_SET_NORMAL_DISPLAY		0xa6
507ce8945fStnn #define SSDFB_CMD_SET_INVERSE_DISPLAY		0xa7
517ce8945fStnn #define SSDFB_CMD_SET_DISPLAY_OFF		0xae
527ce8945fStnn #define SSDFB_CMD_SET_DISPLAY_ON		0xaf
537ce8945fStnn 
547ce8945fStnn /*
557ce8945fStnn  * Scrolling commands; SSD1306 Rev 1.1 p. 28
567ce8945fStnn  */
577ce8945fStnn #define SSDFB_CMD_VERTICAL_AND_RIGHT_SCROLL	0x29
587ce8945fStnn #define SSDFB_CMD_VERTICAL_AND_LEFT_SCROLL	0x2a
597ce8945fStnn #define SSDFB_CMD_DEACTIVATE_SCROLL		0x2e
607ce8945fStnn #define SSDFB_CMD_ACTIVATE_SCROLL		0x2f
617ce8945fStnn #define SSDFB_CMD_SET_VERTICAL_SCROLL_AREA	0xa3
627ce8945fStnn 
637ce8945fStnn /*
647ce8945fStnn  * Addressing commands
657ce8945fStnn  * SSD1306 Rev 1.1 p.30
667ce8945fStnn  * SH1106 Rev 0.1 p.18,22
677ce8945fStnn  */
687ce8945fStnn #define SSDFB_CMD_SET_LOWER_COLUMN_START_ADDRESS_BASE	0x00
697ce8945fStnn #define SSDFB_CMD_SET_LOWER_COLUMN_START_ADDRESS_MAX	0x0f
707ce8945fStnn #define SSDFB_CMD_SET_HIGHER_COLUMN_START_ADDRESS_BASE	0x10
717ce8945fStnn #define SSDFB_CMD_SET_HIGHER_COLUMN_START_ADDRESS_MAX	0x1f
727ce8945fStnn #define SSD1306_CMD_SET_MEMORY_ADDRESSING_MODE		0x20
737ce8945fStnn 	#define SSD1306_MEMORY_ADDRESSING_MODE_HORIZONTAL 0x00
747ce8945fStnn 	#define SSD1306_MEMORY_ADDRESSING_MODE_VERTICAL	0x01
757ce8945fStnn 	#define SSD1306_MEMORY_ADDRESSING_MODE_PAGE	0x02
767ce8945fStnn #define SSD1306_CMD_SET_COLUMN_ADDRESS			0x21
777ce8945fStnn #define SSD1306_CMD_SET_PAGE_ADDRESS			0x22
787ce8945fStnn #define SSDFB_CMD_SET_PAGE_START_ADDRESS_BASE		0xb0
797ce8945fStnn #define SSDFB_CMD_SET_PAGE_START_ADDRESS_MAX		0xb7
807ce8945fStnn 
817ce8945fStnn /*
827ce8945fStnn  * Resolution & hardware layout commands
837ce8945fStnn  * SSD1306 Rev 1.1 p.31
847ce8945fStnn  * SH1106 Rev 0.1 p.19,20,21,23
857ce8945fStnn  */
867ce8945fStnn #define SSDFB_CMD_SET_DISPLAY_START_LINE_BASE		0x40
877ce8945fStnn #define SSDFB_CMD_SET_DISPLAY_START_LINE_MAX		0x7f
887ce8945fStnn #define SSDFB_CMD_SET_SEGMENT_REMAP_NORMAL		0xa0
897ce8945fStnn #define SSDFB_CMD_SET_SEGMENT_REMAP_REVERSE		0xa1
907ce8945fStnn #define SSDFB_CMD_SET_MULTIPLEX_RATIO			0xa8
917ce8945fStnn #define SSDFB_CMD_SET_COM_OUTPUT_DIRECTION_NORMAL	0xc0
927ce8945fStnn #define SSDFB_CMD_SET_COM_OUTPUT_DIRECTION_REMAP	0xc8
937ce8945fStnn #define SSDFB_CMD_SET_DISPLAY_OFFSET			0xd3
947ce8945fStnn #define SSDFB_CMD_SET_COM_PINS_HARDWARE_CFG		0xda
957ce8945fStnn 	#define SSDFB_COM_PINS_A1_MASK			0x02
967ce8945fStnn 	#define SSDFB_COM_PINS_ALTERNATIVE_MASK		0x10
977ce8945fStnn 	#define SSDFB_COM_PINS_REMAP_MASK		0x20
987ce8945fStnn 
997ce8945fStnn /*
1007ce8945fStnn  * Timing & driving commands
1017ce8945fStnn  * SSD1306 Rev 1.1 p.32
1027ce8945fStnn  * SH1106 Rev 0.1 p.24,25,26
1037ce8945fStnn  */
1047ce8945fStnn #define SSDFB_CMD_SET_DISPLAY_CLOCK_RATIO		0xd5
105634f223dStnn 	#define SSDFB_DISPLAY_CLOCK_DIVIDER_MASK	__BITS(3, 0)
106634f223dStnn 	#define SSDFB_DISPLAY_CLOCK_OSCILLATOR_MASK	__BITS(7, 4)
1077ce8945fStnn #define SSDFB_CMD_SET_PRECHARGE_PERIOD			0xd9
108634f223dStnn 	#define SSDFB_PRECHARGE_MASK			__BITS(3, 0)
109634f223dStnn 	#define SSDFB_DISCHARGE_MASK			__BITS(7, 4)
1107ce8945fStnn #define SSDFB_CMD_SET_VCOMH_DESELECT_LEVEL		0xdb
1117ce8945fStnn 	#define SSD1306_VCOMH_DESELECT_LEVEL_0_65_VCC	0x00
1127ce8945fStnn 	#define SSD1306_VCOMH_DESELECT_LEVEL_0_77_VCC	0x20
1137ce8945fStnn 	#define SSD1306_VCOMH_DESELECT_LEVEL_0_83_VCC	0x30
1147ce8945fStnn 	#define SH1106_VCOMH_DESELECT_LEVEL_DEFAULT	0x35
1157ce8945fStnn 
1167ce8945fStnn /*
1177ce8945fStnn  * Misc commands
1187ce8945fStnn  * SSD1306 Rev 1.1 p.32
1197ce8945fStnn  * SH1106 Rev 0.1 p.27,28
1207ce8945fStnn  */
1217ce8945fStnn #define SSDFB_CMD_NOP					0xe3
1227ce8945fStnn #define SH1106_CMD_READ_MODIFY_WRITE			0xe0
1237ce8945fStnn #define SH1106_CMD_READ_MODIFY_WRITE_CANCEL		0xee
1247ce8945fStnn 
1257ce8945fStnn /*
1267ce8945fStnn  * Charge pump commands
1277ce8945fStnn  * SSD1306 App Note Rev 0.4 p.3
1287ce8945fStnn  * SH1106 V0.1 p.18
1297ce8945fStnn  */
1307ce8945fStnn #define SSD1306_CMD_SET_CHARGE_PUMP			0x8d
1317ce8945fStnn 	#define SSD1306_CHARGE_PUMP_ENABLE		0x14
1327ce8945fStnn 	#define SSD1306_CHARGE_PUMP_DISABE		0x10
1337ce8945fStnn #define SH1106_CMD_SET_CHARGE_PUMP_7V4			0x30
1347ce8945fStnn #define SH1106_CMD_SET_CHARGE_PUMP_8V0			0x31
1357ce8945fStnn #define SH1106_CMD_SET_CHARGE_PUMP_8V4			0x32
1367ce8945fStnn #define SH1106_CMD_SET_CHARGE_PUMP_9V0			0x33
1377ce8945fStnn 
1387ce8945fStnn /*
1397ce8945fStnn  * DC-DC commands
1407ce8945fStnn  * SH1106 V0.1 p.18
1417ce8945fStnn  */
1427ce8945fStnn #define SH1106_CMD_SET_DC_DC				0xad
1437ce8945fStnn 	#define SH1106_DC_DC_OFF			0x8a
1447ce8945fStnn 	#define SH1106_DC_DC_ON				0x8b
1457ce8945fStnn 
146634f223dStnn /*
147634f223dStnn  * SSD1322 command set
148634f223dStnn  */
149634f223dStnn #define SSD1322_CMD_ENABLE_GRAY_SCALE_TABLE		0x00
150634f223dStnn #define SSD1322_CMD_SET_COLUMN_ADDRESS			0x15
151634f223dStnn #define SSD1322_CMD_WRITE_RAM				0x5c
152634f223dStnn #define SSD1322_CMD_READ_RAM				0x5d
153634f223dStnn #define SSD1322_CMD_SET_ROW_ADDRESS			0x75
154634f223dStnn #define SSD1322_CMD_SET_REMAP_AND_DUAL_COM_LINE_MODE	0xa0
155634f223dStnn #define SSD1322_CMD_SET_DISPLAY_START_LINE		0xa1
156634f223dStnn #define SSD1322_CMD_SET_DISPLAY_OFFSET			0xa2
157634f223dStnn 
1586653d809Stnn #define SSD1322_CMD_ENTIRE_DISPLAY_OFF			SSDFB_CMD_ENTIRE_DISPLAY_OFF
1596653d809Stnn #define SSD1322_CMD_ENTIRE_DISPLAY_ON			SSDFB_CMD_ENTIRE_DISPLAY_ON
1606653d809Stnn #define SSD1322_CMD_NORMAL_DISPLAY			SSDFB_CMD_SET_NORMAL_DISPLAY
1616653d809Stnn #define SSD1322_CMD_INVERSE_DISPLAY			SSDFB_CMD_SET_INVERSE_DISPLAY
1626653d809Stnn #define SSD1322_CMD_SET_SLEEP_MODE_ON			SSDFB_CMD_SET_DISPLAY_OFF
1636653d809Stnn #define SSD1322_CMD_SET_SLEEP_MODE_OFF			SSDFB_CMD_SET_DISPLAY_ON
164634f223dStnn 
165634f223dStnn #define SSD1322_CMD_ENABLE_PARTIAL_DISPLAY		0xa8
166634f223dStnn #define SSD1322_CMD_EXIT_PARTIAL_DISPLAY		0xa9
167634f223dStnn #define SSD1322_CMD_FUNCTION_SELECTION			0xab
168634f223dStnn 	#define SSD1322_FUNCTION_SELECTION_EXTERNAL_VDD	0
169634f223dStnn 	#define SSD1322_FUNCTION_SELECTION_INTERNAL_VDD	__BIT(0)
170634f223dStnn #define SSD1322_CMD_SET_PHASE_LENGTH			0xb1
171634f223dStnn 	#define SSD1322_PHASE_LENGTH_PHASE_2_MASK	__BITS(7, 4)
172634f223dStnn 	#define SSD1322_DEFAULT_PHASE_2			7
173634f223dStnn 	#define SSD1322_PHASE_LENGTH_PHASE_1_MASK	__BITS(3, 0)
174634f223dStnn 	#define SSD1322_DEFAULT_PHASE_1			4
175634f223dStnn #define SSD1322_CMD_SET_FRONT_CLOCK_DIVIDER		0xb3
176634f223dStnn 	#define SSD1322_FREQUENCY_MASK			__BITS(7, 4)
177634f223dStnn 	#define SSD1322_DEFAULT_FREQUENCY		5
178634f223dStnn 	#define SSD1322_DIVIDER_MASK			__BITS(3, 0)
179634f223dStnn 	#define SSD1322_DEFAULT_DIVIDER			0
180634f223dStnn #define SSD1322_CMD_DISPLAY_ENHANCEMENT_A		0xb4
181634f223dStnn 	#define SSD1322_DISPLAY_ENHANCEMENT_A_MAGIC1	0xa2
182634f223dStnn 	#define SSD1322_DISPLAY_ENHANCEMENT_A_MAGIC2	0xb5
183634f223dStnn #define SSD1322_CMD_SET_GPIO				0xb5
184634f223dStnn 	#define SSD1322_GPIO0_DISABLED			0
185634f223dStnn 	#define SSD1322_GPIO0_TRISTATE			__BIT(0)
186634f223dStnn 	#define SSD1322_GPIO0_LOW			__BIT(1)
187634f223dStnn 	#define SSD1322_GPIO0_HIGH			__BITS(1, 0)
188634f223dStnn 	#define SSD1322_GPIO1_DISABLED			0
189634f223dStnn 	#define SSD1322_GPIO1_TRISTATE			__BIT(2)
190634f223dStnn 	#define SSD1322_GPIO1_LOW			__BIT(3)
191634f223dStnn 	#define SSD1322_GPIO1_HIGH			__BITS(3, 2)
192634f223dStnn #define SSD1322_CMD_SET_SECOND_PRECHARGE_PERIOD		0xb6
1936653d809Stnn 	#define SSD1322_DEFAULT_SECOND_PRECHARGE_PERIOD	8
194634f223dStnn #define SSD1322_CMD_SET_GRAY_SCALE_TABLE		0xb8
195634f223dStnn #define SSD1322_CMD_SET_DEFAULT_GRAY_SCALE_TABLE	0xb9
196634f223dStnn #define SSD1322_CMD_SET_PRE_CHARGE_VOLTAGE_LEVEL	0xbb
197634f223dStnn 	#define SSD1322_DEFAULT_PRE_CHARGE_VOLTAGE_LEVEL	0x17
198634f223dStnn #define SSD1322_CMD_SET_VCOMH				0xbe
199634f223dStnn 	#define SSD1322_DEFAULT_VCOMH			0x04
200634f223dStnn #define SSD1322_CMD_SET_CONTRAST_CURRENT		0xc1
201634f223dStnn 	#define SSD1322_DEFAULT_CONTRAST_CURRENT	0x7f
202634f223dStnn #define SSD1322_CMD_MASTER_CONTRAST_CURRENT_CONTROL	0xc7
203634f223dStnn 	#define SSD1322_DEFAULT_MASTER_CONTRAST_CURRENT_CONTROL	0xf
2046653d809Stnn #define SSD1322_CMD_SET_MULTIPLEX_RATIO			0xca
205634f223dStnn #define SSD1322_CMD_DISPLAY_ENHANCEMENT_B		0xd1
206634f223dStnn 	#define SSD1322_DISPLAY_ENHANCEMENT_B_MAGIC1	0xa2
207634f223dStnn 	#define SSD1322_DISPLAY_ENHANCEMENT_B_MAGIC2	0x20
208634f223dStnn #define SSD1322_CMD_SET_COMMAND_LOCK			0xfd
209634f223dStnn 	#define SSD1322_COMMAND_UNLOCK_MAGIC		0x12
210634f223dStnn 	#define SSD1322_COMMAND_LOCK_MAGIC		0x16
2116653d809Stnn /* undocumented on this chip, but works in practice */
2126653d809Stnn #define SSD1322_CMD_NOP					SSDFB_CMD_NOP
2136653d809Stnn 
2146653d809Stnn /*
2156653d809Stnn  * SSD1353 command set
2166653d809Stnn  */
2176653d809Stnn #define SSD1353_CMD_SET_COLUMN_ADDRESS			SSD1322_CMD_SET_COLUMN_ADDRESS
2186653d809Stnn #define SSD1353_CMD_DRAW_LINE				0x21
2196653d809Stnn #define SSD1353_CMD_DRAW_RECTANGLE			0x22
2206653d809Stnn #define SSD1353_CMD_COPY				0x23
2216653d809Stnn #define SSD1353_CMD_DIM					0x24
2226653d809Stnn #define SSD1353_CMD_CLEAR_WINDOW			0x25
2236653d809Stnn #define SSD1353_CMD_FILL_ENABLE				0x26
2246653d809Stnn #define SSD1353_CMD_SCROLLING_SETUP			0x27
2256653d809Stnn #define SSD1353_CMD_DEACTIVATE_SCROLL			SSDFB_CMD_DEACTIVATE_SCROLL
2266653d809Stnn #define SSD1353_CMD_ACTIVATE_SCROLL			SSDFB_CMD_ACTIVATE_SCROLL
2276653d809Stnn #define SSD1353_CMD_WRITE_RAM				SSD1322_CMD_WRITE_RAM
2286653d809Stnn #define SD1353_CMD_READ_RAM				SSD1322_CMD_READ_RAM
2296653d809Stnn #define SSD1353_CMD_SET_ROW_ADDRESS			SSD1322_CMD_SET_ROW_ADDRESS
2306653d809Stnn #define SSD1353_CMD_SET_CONTRAST_CONTROL_A		0x81
2316653d809Stnn #define SSD1353_CMD_SET_CONTRAST_CONTROL_B		0x82
2326653d809Stnn #define SSD1353_CMD_SET_CONTRAST_CONTROL_C		0x83
2336653d809Stnn 	#define SSD1353_DEFAULT_CONTRAST_CONTROL	128
2346653d809Stnn #define SSD1353_CMD_MASTER_CURRENT_CONTROL		0x87
2356653d809Stnn 	#define SSD1353_DEFAULT_MASTER_CURRENT_ATTENUATION	15
2366653d809Stnn #define SSD1353_CMD_SET_SECOND_PRECHARGE_SPEED		0x8a
2376653d809Stnn 	#define SSD1353_DEFAULT_SECOND_PRECHARGE_SPEED	2
2386653d809Stnn #define SSD1353_CMD_REMAP_COLOR_DEPTH			0xa0
239bc6773ddStnn 	#define SSD1353_REMAP_NO_INCREMENT		__BIT(0)
240bc6773ddStnn 	#define SSD1353_REMAP_SEG_DIRECTION		__BIT(1)
241bc6773ddStnn 	#define SSD1353_REMAP_RGB			__BIT(2)
242bc6773ddStnn 	#define SSD1353_REMAP_LR			__BIT(3)
243bc6773ddStnn 	#define SSD1353_REMAP_COM_DIRECTION		__BIT(4)
244bc6773ddStnn 	#define SSD1353_REMAP_SPLIT_ODD_EVEN		__BIT(5)
245bc6773ddStnn 	#define SSD1353_REMAP_PIXEL_FORMAT_MASK		__BITS(7, 6)
2466653d809Stnn #define SSD1353_CMD_SET_DISPLAY_START_LINE		SSD1322_CMD_SET_DISPLAY_START_LINE
2476653d809Stnn #define SSD1353_CMD_SET_DISPLAY_OFFSET			SSD1322_CMD_SET_DISPLAY_OFFSET
2486653d809Stnn #define SSD1353_CMD_SET_VERTICAL_SCROLL_AREA		SSDFB_CMD_SET_VERTICAL_SCROLL_AREA
2496653d809Stnn #define SSD1353_CMD_NORMAL_DISPLAY			0xa4
2506653d809Stnn #define SSD1353_CMD_ENTIRE_DISPLAY_ON			0xa5
2516653d809Stnn #define SSD1353_CMD_ENTIRE_DISPLAY_OFF			0xa6
2526653d809Stnn #define SSD1353_CMD_INVERSE_DISPLAY			SSDFB_CMD_SET_INVERSE_DISPLAY
2536653d809Stnn #define SSD1353_CMD_SET_MULTIPLEX_RATIO			SSDFB_CMD_SET_MULTIPLEX_RATIO
2546653d809Stnn #define SSD1353_CMD_DIM_MODE_SETTING			0xab
2556653d809Stnn #define SSD1353_CMD_SET_DISPLAY_ON_DIM			0xac
2566653d809Stnn #define SSD1353_CMD_SET_DISPLAY_OFF			SSDFB_CMD_SET_DISPLAY_OFF
2576653d809Stnn #define SSD1353_CMD_SET_DISPLAY_ON			SSDFB_CMD_SET_DISPLAY_ON
2586653d809Stnn #define SSD1353_CMD_SET_PHASE_LENGTH			SSD1322_CMD_SET_PHASE_LENGTH
2596653d809Stnn 	#define SSD1353_DEFAULT_PHASE_2			7
2606653d809Stnn 	#define SSD1353_DEFAULT_PHASE_1			4
2616653d809Stnn #define SSD1353_CMD_SET_FRONT_CLOCK_DIVIDER		SSD1322_CMD_SET_FRONT_CLOCK_DIVIDER
2626653d809Stnn 	#define SSD1353_DEFAULT_DIVIDER			0
2636653d809Stnn 	#define SSD1353_DEFAULT_FREQUENCY		12
2646653d809Stnn #define SSD1353_CMD_SET_SECOND_PRECHARGE_PERIOD		0xb4
2656653d809Stnn 	#define SSD1353_DEFAULT_SECOND_PRECHARGE_PERIOD	7
2666653d809Stnn #define SSD1353_CMD_SET_GRAY_SCALE_TABLE		SSD1322_CMD_SET_GRAY_SCALE_TABLE
2676653d809Stnn #define SSD1353_CMD_SET_DEFAULT_GRAY_SCALE_TABLE	SSD1322_CMD_SET_DEFAULT_GRAY_SCALE_TABLE
2686653d809Stnn #define SSD1353_CMD_SET_PRE_CHARGE_VOLTAGE_LEVEL	SSD1322_CMD_SET_PRE_CHARGE_VOLTAGE_LEVEL
2696653d809Stnn 	#define SSD1353_DEFAULT_PRE_CHARGE_VOLTAGE_LEVEL	0x3e
2706653d809Stnn #define SSD1353_CMD_SET_VCOMH				SSD1322_CMD_SET_VCOMH
2716653d809Stnn 	#define SSD1353_DEFAULT_VCOMH			0x3c
2726653d809Stnn #define SSD1353_CMD_OTP_WRITE				0xc0
2736653d809Stnn #define SSD1353_CMD_RESET				0xe2
2746653d809Stnn #define SSD1353_CMD_NOP					SSDFB_CMD_NOP
2756653d809Stnn #define SSD1353_CMD_SET_COMMAND_LOCK			SSD1322_CMD_SET_COMMAND_LOCK
2766653d809Stnn 	#define SSD1353_COMMAND_UNLOCK_MAGIC		SSD1322_COMMAND_UNLOCK_MAGIC
2776653d809Stnn 	#define SSD1353_COMMAND_LOCK_MAGIC		SSD1353_COMMAND_LOCK_MAGIC
278634f223dStnn 
27978cce6faStnn struct ssdfb_softc;
28078cce6faStnn 
2817ce8945fStnn typedef enum {
2827ce8945fStnn 	SSDFB_CONTROLLER_UNKNOWN=0,
2837ce8945fStnn 	SSDFB_CONTROLLER_SSD1306=1,
2847ce8945fStnn 	SSDFB_CONTROLLER_SH1106=2,
285634f223dStnn 	SSDFB_CONTROLLER_SSD1322=3,
286777b2a12Stnn 	SSDFB_CONTROLLER_SSD1353=4,
2877ce8945fStnn } ssdfb_controller_id_t;
2887ce8945fStnn 
2897ce8945fStnn typedef enum {
2907ce8945fStnn 	SSDFB_PRODUCT_UNKNOWN=0,
2917ce8945fStnn 	SSDFB_PRODUCT_SSD1306_GENERIC=1,
2927ce8945fStnn 	SSDFB_PRODUCT_SH1106_GENERIC=2,
2937ce8945fStnn 	SSDFB_PRODUCT_ADAFRUIT_931=3,
2947ce8945fStnn 	SSDFB_PRODUCT_ADAFRUIT_938=4,
295634f223dStnn 	SSDFB_PRODUCT_SSD1322_GENERIC=5,
296777b2a12Stnn 	SSDFB_PRODUCT_SSD1353_GENERIC=6,
297777b2a12Stnn 	SSDFB_PRODUCT_DEP_160128A_RGB=7,
2987ce8945fStnn } ssdfb_product_id_t;
2997ce8945fStnn 
3007ce8945fStnn #define SSDFB_I2C_DEFAULT_ADDR		0x3c
3017ce8945fStnn #define SSDFB_I2C_ALTERNATIVE_ADDR	0x3d
3027ce8945fStnn 
3037ce8945fStnn /* Co bit has different behaviour in SSD1306 and SH1106 */
3047ce8945fStnn #define SSDFB_I2C_CTRL_BYTE_CONTINUATION_MASK	__BIT(7)
3057ce8945fStnn #define SSDFB_I2C_CTRL_BYTE_DATA_MASK		__BIT(6)
3067ce8945fStnn 
3077ce8945fStnn union ssdfb_block {
3087ce8945fStnn 	uint8_t		col[8];
3097ce8945fStnn 	uint64_t	raw;
3107ce8945fStnn };
3117ce8945fStnn 
3127ce8945fStnn struct ssdfb_product {
3137ce8945fStnn 	ssdfb_product_id_t		p_product_id;
3147ce8945fStnn 	ssdfb_controller_id_t		p_controller_id;
3157ce8945fStnn 	const char			*p_name;
3167ce8945fStnn 	int				p_width;
3177ce8945fStnn 	int				p_height;
318128dc7b4Stnn 	int				p_bits_per_pixel;
319bc6773ddStnn 	bool				p_rgb;
3207ce8945fStnn 	int				p_panel_shift;
3217ce8945fStnn 	uint8_t				p_fosc;
3227ce8945fStnn 	uint8_t				p_fosc_div;
3237ce8945fStnn 	uint8_t				p_precharge;
3247ce8945fStnn 	uint8_t				p_discharge;
3257ce8945fStnn 	uint8_t				p_compin_cfg;
3267ce8945fStnn 	uint8_t				p_vcomh_deselect_level;
3277ce8945fStnn 	uint8_t				p_default_contrast;
3287ce8945fStnn 	uint8_t				p_multiplex_ratio;
32978cce6faStnn 	int				(*p_init)(struct ssdfb_softc *);
330128dc7b4Stnn 	int				(*p_sync)(struct ssdfb_softc *, bool);
3317ce8945fStnn };
3327ce8945fStnn 
3337ce8945fStnn struct ssdfb_softc {
3347ce8945fStnn 	device_t			sc_dev;
3357ce8945fStnn 	const struct ssdfb_product	*sc_p;
3367ce8945fStnn 
3377ce8945fStnn 	/* wscons & rasops state */
3387ce8945fStnn 	u_int				sc_mode;
3397ce8945fStnn 	int				sc_fontcookie;
3407ce8945fStnn 	struct wsdisplay_font		*sc_font;
3417ce8945fStnn 	struct wsscreen_descr		sc_screen_descr;
3427ce8945fStnn 	const struct wsscreen_descr	*sc_screens[1];
3437ce8945fStnn 	struct wsscreen_list		sc_screenlist;
3447ce8945fStnn 	struct rasops_info		sc_ri;
3457ce8945fStnn 	size_t				sc_ri_bits_len;
3467ce8945fStnn 	struct wsdisplay_emulops	sc_orig_riops;
3477ce8945fStnn 	int				sc_nscreens;
3487ce8945fStnn 	device_t			sc_wsdisplay;
3497ce8945fStnn 	bool				sc_is_console;
3507ce8945fStnn 	bool				sc_usepoll;
3517ce8945fStnn 
3527ce8945fStnn 	/* hardware state */
3537ce8945fStnn 	bool				sc_upsidedown;
3547ce8945fStnn 	bool				sc_inverse;
3557ce8945fStnn 	uint8_t				sc_contrast;
3567ce8945fStnn 	bool				sc_display_on;
3577ce8945fStnn 	union ssdfb_block		*sc_gddram;
3587ce8945fStnn 	size_t				sc_gddram_len;
3597ce8945fStnn 
3607ce8945fStnn 	/* damage tracking */
3617ce8945fStnn 	lwp_t				*sc_thread;
3627ce8945fStnn 	kcondvar_t			sc_cond;
3637ce8945fStnn 	kmutex_t			sc_cond_mtx;
3647ce8945fStnn 	bool				sc_detaching;
3657ce8945fStnn 	int				sc_backoff;
3667ce8945fStnn 	bool				sc_modified;
367aacc46c3Stnn 	struct uvm_object		*sc_uobj;
3687ce8945fStnn 
3697ce8945fStnn 	/* reference to bus-specific code */
3707ce8945fStnn 	void	*sc_cookie;
3717ce8945fStnn 	int	(*sc_cmd)(void *, uint8_t *, size_t, bool);
3727ce8945fStnn 	int	(*sc_transfer_rect)(void *, uint8_t, uint8_t, uint8_t, uint8_t,
3737ce8945fStnn 				    uint8_t *, size_t, bool);
3747ce8945fStnn };
3757ce8945fStnn 
3767ce8945fStnn void	ssdfb_attach(struct ssdfb_softc *, int flags);
3777ce8945fStnn int	ssdfb_detach(struct ssdfb_softc *);
378