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