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