8000 Merge pull request #10107 from SeanTheITGuy/elecrow_crowpanel_4_2_epaper · adafruit/circuitpython@a1f4eea · GitHub
[go: up one dir, main page]

Skip to content

Commit a1f4eea

Browse files
authored
Merge pull request #10107 from SeanTheITGuy/elecrow_crowpanel_4_2_epaper
Elecrow crowpanel 4.2 epaper device
2 parents 2101084 + 5ae4689 commit a1f4eea

File tree

5 files changed

+246
-0
lines changed

5 files changed

+246
-0
lines changed
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
// This file is part of the CircuitPython project: https://circuitpython.org
2+
//
3+
// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries
4+
//
5+
// SPDX-License-Identifier: MIT
6+
7+
#include "supervisor/board.h"
8+
#include "mpconfigboard.h"
9+
#include "shared-bindings/busio/SPI.h"
10+
#include "shared-bindings/fourwire/FourWire.h"
11+
#include "shared-bindings/microcontroller/Pin.h"
12+
#include "shared-module/displayio/__init__.h"
13+
#include "shared-module/displayio/mipi_constants.h"
14+
#include "shared-bindings/board/__init__.h"
15+
#include "shared-bindings/digitalio/DigitalInOut.h"
16+
17+
// SSD1683 EPD Driver chip
18+
const uint8_t display_start_sequence[] = {
19+
// Init
20+
0x12, 0x80, 0x0a, // Soft reset
21+
0x01, 0x03, 0x2b, 0x01, 0x00, // Set MUX as 300
22+
0x21, 0x02, 0x40, 0x00, // Display update control
23+
0x3c, 0x01, 0x01, // Border waveform
24+
0x11, 0x01, 0x03, // X- mode
25+
0x44, 0x02, 0x00, 0x31, // Set RAM X Address Start/End Pos
26+
0x45, 0x04, 0x00, 0x00, 0x2b, 0x01, // Set RAM Y Address Start/End Pos
27+
0x4e, 0x01, 0x00, // Set RAM X Address counter
28+
0x4f, 0x02, 0x00, 0x00, // Set RAM Y Address counter
29+
};
30+
31+
const uint8_t display_stop_sequence[] = {
32+
0x10, 0x01, 0x32,
33+
};
34+
35+
const uint8_t refresh_sequence[] = {
36+
0x22, 0x01, 0xf7, // Display update sequence option
37+
0x20, 0x80, 0x0a, // Master activation
38+
};
39+
40+
void board_init(void) {
41+
42+
// Enable EPD with driver pin
43+
digitalio_digitalinout_obj_t epd_enable_pin_obj;
44+
epd_enable_pin_obj.base.type = &digitalio_digitalinout_type;
45+
common_hal_digitalio_digitalinout_construct(&epd_enable_pin_obj, &pin_GPIO7);
46+
common_hal_digitalio_digitalinout_switch_to_output(&epd_enable_pin_obj, true, DRIVE_MODE_PUSH_PULL);
47+
common_hal_digitalio_digitalinout_never_reset(&epd_enable_pin_obj);
48+
49+
// Set up the SPI object used to control the display
50+
fourwire_fourwire_obj_t *bus = &allocate_display_bus()->fourwire_bus;
51+
busio_spi_obj_t *spi = &bus->inline_bus;
52+
common_hal_busio_spi_construct(spi, &pin_GPIO12, &pin_GPIO11, NULL, false);
53+
common_hal_busio_spi_never_reset(spi);
54+
55+
// Set up the DisplayIO pin object
56+
bus->base.type = &fourwire_fourwire_type;
57+
common_hal_fourwire_fourwire_construct(bus,
58+
spi,
59+
&pin_GPIO46, // EPD_DC Command or data
60+
&pin_GPIO45, // EPD_CS Chip select
61+
&pin_GPIO47, // EPD_RST Reset
62+
1000000, // Baudrate
63+
0, // Polarity
64+
0); // Phase
65+
66+
// Set up the DisplayIO epaper object
67+
epaperdisplay_epaperdisplay_obj_t *display = &allocate_display()->epaper_display;
68+
display->base.type = &epaperdisplay_epaperdisplay_type;
69+
common_hal_epaperdisplay_epaperdisplay_construct(
70+
display,
71+
bus,
72+
display_start_sequence, sizeof(display_start_sequence),
73+
1, // start up time
74+
display_stop_sequence, sizeof(display_stop_sequence),
75+
400, // width
76+
300, // height
77+
400, // ram_width
78+
300, // ram_height
79+
0, // colstart
80+
0, // rowstart
81+
0, // rotation
82+
NO_COMMAND, // set_column_window_command
83+
NO_COMMAND, // set_row_window_command
84+
NO_COMMAND, // set_current_column_command
85+
NO_COMMAND, // set_current_row_command
86+
0x24, // write_black_ram_command
87+
false, // black_bits_inverted
88+
0x26, // write_color_ram_command
89+
false, // color_bits_inverted
90+
0x000000, // highlight_color
91+
refresh_sequence, sizeof(refresh_sequence), // refresh_display_command
92+
1.0, // refresh_time
93+
&pin_GPIO48, // busy_pin
94+
true, // busy_state
95+
2.0, // seconds_per_frame
96+
false, // always_toggle_chip_select
97+
false, // grayscale
98+
false, // acep
99+
false, // two_byte_sequence_length
100+
false); // address_little_endian
101+
}
102+
103+
void board_deinit(void) {
104+
epaperdisplay_epaperdisplay_obj_t *display = &displays[0].epaper_display;
105+
if (display->base.type == &epaperdisplay_epaperdisplay_type) {
106+
while (common_hal_epaperdisplay_epaperdisplay_get_busy(display)) {
107+
RUN_BACKGROUND_TASKS;
108+
}
109+
}
110+
common_hal_displayio_release_displays();
111+
}
112+
113+
// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// This file is part of the CircuitPython project: https://circuitpython.org
2+
//
3+
// SPDX-FileCopyrightText: Copyright (c) 2019 Scott Shawcroft for Adafruit Industries
4+
//
5+
// SPDX-License-Identifier: MIT
6+
7+
#pragma once
8+
9+
// Micropython setup
10+
11+
#define MICROPY_HW_BOARD_NAME "CrowPanel 4.2 EPaper"
12+
#define MICROPY_HW_MCU_NAME "ESP32S3"
13+
#define MICROPY_HW_LED_STATUS (&pin_GPIO41)
14+
#define CIRCUITPY_BOOT_BUTTON (&pin_GPIO0)
15+
16+
#define CIRCUITPY_BOARD_SPI (2)
17+
#define CIRCUITPY_BOARD_SPI_PIN { \
18+
{.clock = &pin_GPIO39, .mosi = &pin_GPIO40, .miso = &pin_GPIO13}, /*SD*/ \
19+
{.clock = &pin_GPIO12, .mosi = &pin_GPIO11}, /*EPD*/ \
20+
}
21+
22+
// UART pins attached to the USB-serial converter chip
23+
#define DEFAULT_UART_BUS_RX (&pin_GPIO44)
24+
#define DEFAULT_UART_BUS_TX (&pin_GPIO43)
25+
26+
#define CIRCUITPY_CONSOLE_UART_TX DEFAULT_UART_BUS_TX
27+
#define CIRCUITPY_CONSOLE_UART_RX DEFAULT_UART_BUS_RX
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
CIRCUITPY_CREATOR_ID = 0x1C350000
2+
CIRCUITPY_CREATION_ID = 0x00000001
3+
4+
# This board doesn't have USB by default, it
5+
# instead uses a CH340C USB-to-Serial chip
6+
CIRCUITPY_USB_DEVICE = 0
7+
CIRCUITPY_ESP_USB_SERIAL_JTAG = 0
8+
9+
IDF_TARGET = esp32s3
10+
11+
CIRCUITPY_ESP_FLASH_SIZE = 8MB
12+
CIRCUITPY_ESP_FLASH_MODE = qio
13+
CIRCUITPY_ESP_FLASH_FREQ = 80m
14+
15+
CIRCUITPY_ESP_PSRAM_SIZE = 8MB
16+
CIRCUITPY_ESP_PSRAM_MODE = opi
17+
CIRCUITPY_ESP_PSRAM_FREQ = 80m
18+
19+
CIRCUITPY_ESPCAMERA = 0
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
// This file is part of the CircuitPython project: https://circuitpython.org
2+
//
3+
// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries
4+
//
5+
// SPDX-License-Identifier: MIT
6+
7+
#include "shared-bindings/board/__init__.h"
8+
#include "shared-module/displayio/__init__.h"
9+
10+
CIRCUITPY_BOARD_BUS_SINGLETON(tf_spi, spi, 0)
11+
CIRCUITPY_BOARD_BUS_SINGLETON(epd_spi, spi, 1)
12+
13+
14+
static const mp_rom_map_elem_t board_module_globals_table[] = {
15+
CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS
16+
17+
// Buttons
18+
{ MP_ROM_QSTR(MP_QSTR_BUTTON_BOOT), MP_ROM_PTR(&pin_GPIO0) },
19+
{ MP_ROM_QSTR(MP_QSTR_BUTTON_EXIT), MP_ROM_PTR(&pin_GPIO1) },
20+
{ MP_ROM_QSTR(MP_QSTR_BUTTON_MENU), MP_ROM_PTR(&pin_GPIO2) },
21+
22+
// Rocker Switch
23+
{ MP_ROM_QSTR(MP_QSTR_ROCKER_DOWN), MP_ROM_PTR(&pin_GPIO4) },
24+
{ MP_ROM_QSTR(MP_QSTR_ROCKER_CLICK), MP_ROM_PTR(&pin_GPIO5) },
25+
{ MP_ROM_QSTR(MP_QSTR_ROCKER_UP), MP_ROM_PTR(&pin_GPIO6) },
26+
27+
// LED
28+
{ MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO41) },
29+
30+
// Device Control (Pins that, when activated, enable devices)
31+
{ MP_ROM_QSTR(MP_QSTR_EPD_ENABLE), MP_ROM_PTR(&pin_GPIO7) },
32+
{ MP_ROM_QSTR(MP_QSTR_TF_ENABLE), MP_ROM_PTR(&pin_GPIO42) },
33+
34+
// EPD
35+
{ MP_ROM_QSTR(MP_QSTR_EPD_BUSY), MP_ROM_PTR(&pin_GPIO48) },
36+
{ MP_ROM_QSTR(MP_QSTR_EPD_RES), MP_ROM_PTR(&pin_GPIO47) },
37+
{ MP_ROM_QSTR(MP_QSTR_EPD_DC), MP_ROM_PTR(&pin_GPIO46) },
38+
{ MP_ROM_QSTR(MP_QSTR_EPD_CS), MP_ROM_PTR(&pin_GPIO45) },
39+
{ MP_ROM_QSTR(MP_QSTR_EPD_CLK), MP_ROM_PTR(&pin_GPIO12) },
40+
{ MP_ROM_QSTR(MP_QSTR_EPD_MOSI), MP_ROM_PTR(&pin_GPIO11) },
41+
42+
// TF Slot
43+
{ MP_ROM_QSTR(MP_QSTR_TF_CS), MP_ROM_PTR(&pin_GPIO10) },
44+
{ MP_ROM_QSTR(MP_QSTR_TF_MOSI), MP_ROM_PTR(&pin_GPIO40) },
45+
{ MP_ROM_QSTR(MP_QSTR_TF_CLK), MP_ROM_PTR(&pin_GPIO39) },
46+
{ MP_ROM_QSTR(MP_QSTR_TF_MISO), MP_ROM_PTR(&pin_GPIO13) },
47+
48+
// User accessible GPIO
49+
{ MP_ROM_QSTR(MP_QSTR_IO3), MP_ROM_PTR(&pin_GPIO3) },
50+
{ MP_ROM_QSTR(MP_QSTR_IO8), MP_ROM_PTR(&pin_GPIO8) },
51+
{ MP_ROM_QSTR(MP_QSTR_IO9), MP_ROM_PTR(&pin_GPIO9) },
52+
{ MP_ROM_QSTR(MP_QSTR_IO14), MP_ROM_PTR(&pin_GPIO14) },
53+
{ MP_ROM_QSTR(MP_QSTR_IO15), MP_ROM_PTR(&pin_GPIO15) },
54+
{ MP_ROM_QSTR(MP_QSTR_IO16), MP_ROM_PTR(&pin_GPIO16) },
55+
{ MP_ROM_QSTR(MP_QSTR_IO17), MP_ROM_PTR(&pin_GPIO17) },
56+
{ MP_ROM_QSTR(MP_QSTR_IO18), MP_ROM_PTR(&pin_GPIO18) },
57+
{ MP_ROM_QSTR(MP_QSTR_IO19), MP_ROM_PTR(&pin_GPIO19) },
58+
{ MP_ROM_QSTR(MP_QSTR_IO20), MP_ROM_PTR(&pin_GPIO20) },
59+
{ MP_ROM_QSTR(MP_QSTR_IO21), MP_ROM_PTR(&pin_GPIO21) },
60+
{ MP_ROM_QSTR(MP_QSTR_IO38), MP_ROM_PTR(&pin_GPIO38) },
61+
62+
// UART
63+
{ MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO43) },
64+
{ MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO44) },
65+
66+
// Objects
67+
{ MP_ROM_QSTR(MP_QSTR_TF_SPI), MP_ROM_PTR(&board_tf_spi_obj) },
68+
{ MP_ROM_QSTR(MP_QSTR_EPD_SPI), MP_ROM_PTR(&board_epd_spi_obj) },
69+
{ MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) },
70+
{ MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_ROM_PTR(&displays[0].display)},
71+
72+
};
73+
MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#
2+
# Espressif IoT Development Framework Configuration
3+
#
4+
#
5+
# Component config
6+
#
7+
#
8+
# LWIP
9+
#
10+
# end of LWIP
11+
12+
# end of Component config
13+
14+
# end of Espressif IoT Development Framework Configuration

0 commit comments

Comments
 (0)
0