Skip to content

Commit d8fca1f

Browse files
committed
added support for Pimoroni's Tufty2040
1 parent 75ba17e commit d8fca1f

File tree

5 files changed

+229
-0
lines changed

5 files changed

+229
-0
lines changed
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
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+
29+
#include "mpconfigboard.h"
30+
#include "common-hal/paralleldisplay/ParallelBus.h"
31+
#include "shared-module/displayio/__init__.h"
32+
#include "supervisor/shared/board.h"
33+
34+
#define DELAY 0x80
35+
36+
enum reg {
37+
SWRESET = 0x01,
38+
TEOFF = 0x34,
39+
TEON = 0x35,
40+
MADCTL = 0x36,
41+
COLMOD = 0x3A,
42+
GCTRL = 0xB7,
43+
VCOMS = 0xBB,
44+
LCMCTRL = 0xC0,
45+
VDVVRHEN = 0xC2,
46+
VRHS = 0xC3,
47+
VDVS = 0xC4,
48+
FRCTRL2 = 0xC6,
49+
PWCTRL1 = 0xD0,
50+
PORCTRL = 0xB2,
51+
GMCTRP1 = 0xE0,
52+
GMCTRN1 = 0xE1,
53+
INVOFF = 0x20,
54+
SLPOUT = 0x11,
55+
DISPON = 0x29,
56+
GAMSET = 0x26,
57+
DISPOFF = 0x28,
58+
RAMWR = 0x2C,
59+
INVON = 0x21,
60+
CASET = 0x2A,
61+
RASET = 0x2B,
62+
PWMFRSEL = 0xCC
63+
};
64+
65+
enum MADCTL {
66+
ROW_ORDER = 0b10000000,
67+
COL_ORDER = 0b01000000,
68+
SWAP_XY = 0b00100000, // AKA "MV"
69+
SCAN_ORDER = 0b00010000,
70+
RGB_BGR = 0b00001000,
71+
HORIZ_ORDER = 0b00000100
72+
};
73+
74+
uint8_t display_init_sequence[] = {
75+
SWRESET, DELAY, 0x64, // 100ms delay
76+
TEON, DELAY, 0x64,
77+
COLMOD, 1, 0x05,
78+
PORCTRL, 5, 0x0c, 0x0c, 0x00, 0x33, 0x33,
79+
LCMCTRL, 1, 0x2c,
80+
VDVVRHEN, 1, 0x01,
81+
VRHS, 1, 0x12,
82+
VDVS, 1, 0x20,
83+
PWCTRL1, 2, 0xa4, 0xa1,
84+
FRCTRL2, 1, 0x0f,
85+
GCTRL, 1, 0x35,
86+
VCOMS, 1, 0x1f,
87+
0xd6, 1, 0xa1,
88+
GMCTRP1, 14, 0xd0, 0x08, 0x11, 0x08, 0x0c, 0x15, 0x39, 0x33, 0x50, 0x36, 0x13, 0x14, 0x29, 0x2D,
89+
GMCTRN1, 14, 0xd0, 0x08, 0x10, 0x08, 0x06, 0x06, 0x39, 0x44, 0x51, 0x0b, 0x16, 0x14, 0x2f, 0x31,
90+
INVON, DELAY, 0x64,
91+
SLPOUT, DELAY, 0x64,
92+
DISPON, DELAY, 0x64,
93+
CASET, 4, 0x00, 0x00, 0x01, 0x3F,
94+
RASET, 4, 0x00, 0x00, 0x00, 0xEF,
95+
MADCTL, 1, ROW_ORDER | SWAP_XY | SCAN_ORDER,
96+
};
97+
98+
99+
void board_init(void) {
100+
paralleldisplay_parallelbus_obj_t *bus = &allocate_display_bus()->parallel_bus;
101+
bus->base.type = &paralleldisplay_parallelbus_type;
102+
common_hal_paralleldisplay_parallelbus_construct(bus,
103+
&pin_GPIO14, // Data0
104+
&pin_GPIO11, // Command or data
105+
&pin_GPIO10, // Chip select
106+
&pin_GPIO12, // Write
107+
&pin_GPIO13, // Read
108+
NULL, // Reset
109+
2500000); // Frequency (not fast enough to hit 60Hz, but seems to avoid the ghosting issue)
110+
111+
displayio_display_obj_t *display = &allocate_display()->display;
112+
display->base.type = &displayio_display_type;
113+
common_hal_displayio_display_construct(display,
114+
bus,
115+
320, // Width
116+
240, // Height
117+
0, // column start
118+
0, // row start
119+
0, // rotation
120+
16, // Color depth
121+
false, // grayscale
122+
false, // pixels_in_byte_share_row (unused for depths > 8)
123+
1, // bytes per cell. Only valid for depths < 8
124+
false, // reverse_pixels_in_byte. Only valid for depths < 8
125+
true, // reverse_pixels_in_word
126+
CASET, // Set column command
127+
RASET, // Set row command
128+
RAMWR, // Write memory command
129+
display_init_sequence,
130+
sizeof(display_init_sequence),
131+
&pin_GPIO2, // Backlight pin
132+
NO_BRIGHTNESS_COMMAND,
133+
1.0f, // brightness (ignored)
134+
false, // single_byte_bounds
135+
false, // data_as_commands
136+
true, // auto_refresh
137+
60, // native_frames_per_second
138+
true, // backlight_on_high
139+
false, // SH1107_addressing
140+
250); // backlight pwm frequency (highest that will result 0.01 displaying an image)
141+
common_hal_never_reset_pin(&pin_GPIO2); // backlight pin
142+
}
143+
144+
bool board_requests_safe_mode(void) {
145+
return false;
146+
}
147+
148+
void reset_board(void) {
149+
}
150+
151+
void board_deinit(void) {
152+
common_hal_displayio_release_displays();
153+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#define MICROPY_HW_BOARD_NAME "Pimoroni Tufty 2040"
2+
#define MICROPY_HW_MCU_NAME "rp2040"
3+
4+
// Status LED
5+
#define MICROPY_HW_LED_STATUS (&pin_GPIO25)
6+
7+
#define DEFAULT_UART_BUS_TX (&pin_GPIO0)
8+
#define DEFAULT_UART_BUS_RX (&pin_GPIO1)
9+
10+
#define DEFAULT_I2C_BUS_SDA (&pin_GPIO4)
11+
#define DEFAULT_I2C_BUS_SCL (&pin_GPIO5)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
USB_VID = 0x2E8A
2+
USB_PID = 0x101B
3+
USB_PRODUCT = "Tufty 2040"
4+
USB_MANUFACTURER = "Pimoroni"
5+
6+
CHIP_VARIANT = RP2040
7+
CHIP_FAMILY = rp2
8+
9+
EXTERNAL_FLASH_DEVICES = "W25Q64JVxQ"
10+
11+
CIRCUITPY__EVE = 1
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// Put board-specific pico-sdk definitions here. This file must exist.
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#include "shared-bindings/board/__init__.h"
2+
3+
#include "shared-module/displayio/__init__.h"
4+
5+
STATIC const mp_rom_map_elem_t board_module_globals_table[] = {
6+
CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS
7+
8+
{ MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO0) },
9+
{ MP_ROM_QSTR(MP_QSTR_GP0), MP_ROM_PTR(&pin_GPIO0) },
10+
11+
{ MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO1) },
12+
{ MP_ROM_QSTR(MP_QSTR_GP1), MP_ROM_PTR(&pin_GPIO1) },
13+
14+
{ MP_ROM_QSTR(MP_QSTR_LCD_BACKLIGHT), MP_ROM_PTR(&pin_GPIO2) },
15+
16+
{ MP_ROM_QSTR(MP_QSTR_INT), MP_ROM_PTR(&pin_GPIO3) },
17+
{ MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO4) },
18+
{ MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO5) },
19+
20+
{ MP_ROM_QSTR(MP_QSTR_SW_DOWN), MP_ROM_PTR(&pin_GPIO6) },
21+
{ MP_ROM_QSTR(MP_QSTR_SW_A), MP_ROM_PTR(&pin_GPIO7) },
22+
{ MP_ROM_QSTR(MP_QSTR_SW_B), MP_ROM_PTR(&pin_GPIO8) },
23+
{ MP_ROM_QSTR(MP_QSTR_SW_C), MP_ROM_PTR(&pin_GPIO9) },
24+
{ MP_ROM_QSTR(MP_QSTR_SW_UP), MP_ROM_PTR(&pin_GPIO22) },
25+
26+
{ MP_ROM_QSTR(MP_QSTR_LCD_CS), MP_ROM_PTR(&pin_GPIO10) },
27+
{ MP_ROM_QSTR(MP_QSTR_LCD_RS), MP_ROM_PTR(&pin_GPIO11) },
28+
{ MP_ROM_QSTR(MP_QSTR_LCD_WR), MP_ROM_PTR(&pin_GPIO12) },
29+
{ MP_ROM_QSTR(MP_QSTR_LCD_RD), MP_ROM_PTR(&pin_GPIO13) },
30+
{ MP_ROM_QSTR(MP_QSTR_LCD_DB0), MP_ROM_PTR(&pin_GPIO14) },
31+
{ MP_ROM_QSTR(MP_QSTR_LCD_DB1), MP_ROM_PTR(&pin_GPIO15) },
32+
{ MP_ROM_QSTR(MP_QSTR_LCD_DB2), MP_ROM_PTR(&pin_GPIO16) },
33+
{ MP_ROM_QSTR(MP_QSTR_LCD_DB3), MP_ROM_PTR(&pin_GPIO17) },
34+
{ MP_ROM_QSTR(MP_QSTR_LCD_DB4), MP_ROM_PTR(&pin_GPIO18) },
35+
{ MP_ROM_QSTR(MP_QSTR_LCD_DB5), MP_ROM_PTR(&pin_GPIO19) },
36+
{ MP_ROM_QSTR(MP_QSTR_LCD_DB6), MP_ROM_PTR(&pin_GPIO20) },
37+
{ MP_ROM_QSTR(MP_QSTR_LCD_DB7), MP_ROM_PTR(&pin_GPIO21) },
38+
39+
{ MP_ROM_QSTR(MP_QSTR_USER_SW), MP_ROM_PTR(&pin_GPIO23) },
40+
41+
{ MP_ROM_QSTR(MP_QSTR_VBUS_DETECT), MP_ROM_PTR(&pin_GPIO24) },
42+
{ MP_ROM_QSTR(MP_QSTR_USER_LED), MP_ROM_PTR(&pin_GPIO25) },
43+
{ MP_ROM_QSTR(MP_QSTR_LIGHT_SENSE), MP_ROM_PTR(&pin_GPIO26) },
44+
{ MP_ROM_QSTR(MP_QSTR_SENSOR_POWER), MP_ROM_PTR(&pin_GPIO27) },
45+
{ MP_ROM_QSTR(MP_QSTR_REF_1V2), MP_ROM_PTR(&pin_GPIO28) },
46+
{ MP_ROM_QSTR(MP_QSTR_VBAT_SENSE), MP_ROM_PTR(&pin_GPIO29) },
47+
48+
{ MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) },
49+
{ MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) },
50+
51+
{ MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_ROM_PTR(&displays[0].display)},
52+
};
53+
MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);

0 commit comments

Comments
 (0)