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