1+ /*
2+ * This file is part of the MicroPython project, http://micropython.org/
3+ *
4+ * The MIT License (MIT)
5+ *
6+ * Copyright (c) 2021 Scott Shawcroft for Adafruit Industries
7+ *
8+ * Permission is hereby granted, free of charge, to any person obtaining a copy
9+ * of this software and associated documentation files (the "Software"), to deal
10+ * in the Software without restriction, including without limitation the rights
11+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12+ * copies of the Software, and to permit persons to whom the Software is
13+ * furnished to do so, subject to the following conditions:
14+ *
15+ * The above copyright notice and this permission notice shall be included in
16+ * all copies or substantial portions of the Software.
17+ *
18+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24+ * THE SOFTWARE.
25+ */
26+
27+ #include "supervisor/board.h"
28+ #include "mpconfigboard.h"
29+ #include "shared-bindings/microcontroller/Pin.h"
30+ #include "shared-module/displayio/__init__.h"
31+ #include "shared-module/displayio/mipi_constants.h"
32+
33+ displayio_fourwire_obj_t board_display_obj ;
34+
35+ #define DELAY 0x80
36+ #define PWR_EN 22
37+
38+ // display init sequence according to LilyGO example app
39+ uint8_t display_init_sequence [] = {
40+ // sw reset
41+ 0x01 , 0 | DELAY , 150 ,
42+ // sleep out
43+ 0x11 , 0 | DELAY , 255 ,
44+ // normal display mode on
45+ 0x13 , 0 ,
46+ // display and color format settings
47+ 0x36 , 1 , 0x08 ,
48+ 0xB6 , 2 , 0x0A , 0x82 ,
49+ 0x3A , 1 | DELAY , 0x55 , 10 ,
50+ // ST7789V frame rate setting
51+ 0xB2 , 5 , 0x0C , 0x0C , 0x00 , 0x33 , 0x33 ,
52+ // voltages: VGH / VGL
53+ 0xB7 , 1 , 0x35 ,
54+ // ST7789V power setting
55+ 0xBB , 1 , 0x28 ,
56+ 0xC0 , 1 , 0x0C ,
57+ 0xC2 , 2 , 0x01 , 0xFF ,
58+ 0xC3 , 1 , 0x10 ,
59+ 0xC4 , 1 , 0x20 ,
60+ 0xC6 , 1 , 0x0F ,
61+ 0xD0 , 2 , 0xA4 , 0xA1 ,
62+ // ST7789V gamma setting
63+ 0xE0 , 14 , 0xD0 , 0x00 , 0x02 , 0x07 , 0x0A , 0x28 , 0x32 , 0x44 , 0x42 , 0x06 , 0x0E , 0x12 , 0x14 , 0x17 ,
64+ 0xE1 , 14 , 0xD0 , 0x00 , 0x02 , 0x07 , 0x0A , 0x28 , 0x31 , 0x54 , 0x47 , 0x0E , 0x1C , 0x17 , 0x1B , 0x1E ,
65+ 0x21 , 0 ,
66+ // display on
67+ 0x29 , 0 | DELAY , 255 ,
68+ };
69+
70+ static void display_init (void ) {
71+ busio_spi_obj_t * spi = & displays [0 ].fourwire_bus .inline_bus ;
72+
73+ common_hal_busio_spi_construct (
74+ spi ,
75+ & pin_GPIO2 , // CLK
76+ & pin_GPIO3 , // MOSI
77+ NULL // MISO not connected
78+ );
79+
80+ common_hal_busio_spi_never_reset (spi );
81+
82+ displayio_fourwire_obj_t * bus = & displays [0 ].fourwire_bus ;
83+ bus -> base .type = & displayio_fourwire_type ;
84+
85+ common_hal_displayio_fourwire_construct (
86+ bus ,
87+ spi ,
88+ & pin_GPIO1 , // DC
89+ & pin_GPIO5 , // CS
90+ NULL , // RST (Reset pin tie to 0, do not set here)
91+ 40000000 , // baudrate
92+ 1 , // polarity
93+ 0 // phase
94+ );
95+
96+ displayio_display_obj_t * display = & displays [0 ].display ;
97+ display -> base .type = & displayio_display_type ;
98+
99+ common_hal_displayio_display_construct (
100+ display ,
101+ bus ,
102+ 240 , // width (after rotation)
103+ 135 , // height (after rotation)
104+ 52 , // column start
105+ 40 , // row start
106+ 90 , // rotation
107+ 16 , // color depth
108+ false, // grayscale
109+ false, // pixels in a byte share a row. Only valid for depths < 8
110+ 1 , // bytes per cell. Only valid for depths < 8
111+ false, // reverse_pixels_in_byte. Only valid for depths < 8
112+ true, // reverse_pixels_in_word
113+ MIPI_COMMAND_SET_COLUMN_ADDRESS , // set column command
114+ MIPI_COMMAND_SET_PAGE_ADDRESS , // set row command
115+ MIPI_COMMAND_WRITE_MEMORY_START , // write memory command
116+ display_init_sequence ,
117+ sizeof (display_init_sequence ),
118+ & pin_GPIO4 , // backlight pin
119+ NO_BRIGHTNESS_COMMAND ,
120+ 1.0f , // brightness (ignored)
121+ false, // auto_brightness
122+ false, // single_byte_bounds
123+ false, // data_as_commands
124+ true, // auto_refresh
125+ 60 , // native_frames_per_second
126+ true, // backlight_on_high
127+ false // SH1107_addressing
128+ );
129+
130+ common_hal_never_reset_pin (& pin_GPIO4 ); // backlight pin
131+ }
132+
133+ void board_init (void ) {
134+ // Pin 22 has to be pulled high to turn on the LCD
135+ const uint PWR_PIN = PWR_EN ;
136+ gpio_init (PWR_PIN );
137+ gpio_set_dir (PWR_PIN , GPIO_OUT );
138+ gpio_put (PWR_PIN , 1 );
139+ common_hal_never_reset_pin (& pin_GPIO22 );
140+
141+ // Display
142+ display_init ();
143+ }
144+
145+ bool board_requests_safe_mode (void ) {
146+ return false;
147+ }
148+
149+ void reset_board (void ) {
150+ }
151+
152+ void board_deinit (void ) {
153+ }
0 commit comments