Add support for 135x240 display

pull/7/head
Ivan Belokobylskiy 2019-12-27 20:31:24 +03:00
rodzic dfa1346bd3
commit ef31f0437f
4 zmienionych plików z 41 dodań i 12 usunięć

Wyświetl plik

@ -11,6 +11,8 @@ based on ST7789 chip.
<img src="https://raw.githubusercontent.com/devbis/st7789_mpy/master/docs/ST7789.jpg" alt="ST7789 display photo"/> <img src="https://raw.githubusercontent.com/devbis/st7789_mpy/master/docs/ST7789.jpg" alt="ST7789 display photo"/>
</p> </p>
It supports both 240x240 and 135x240 variants of displays.
It is written in pure C, so you have to build It is written in pure C, so you have to build
firmware by yourself. firmware by yourself.
Only ESP8266 and ESP32 are supported for now. Only ESP8266 and ESP32 are supported for now.
@ -197,3 +199,11 @@ Edit `esp8266_common.ld` file in the `ports/esp8266` dir and add a line
*st7789/*.o(.literal* .text*) *st7789/*.o(.literal* .text*)
in the `.irom0.text : ALIGN(4)` section in the `.irom0.text : ALIGN(4)` section
#### Unsupported dimensions
This driver supports only 240x240 and 135x240 pixel displays.
If you have a display with an unsupported resolution, you can pass
`xstart` and `ystart` parameters to the display constructor to set the
required offsets.

Wyświetl plik

@ -1 +1 @@
0.1.3 0.1.4

Wyświetl plik

@ -22,7 +22,7 @@
* THE SOFTWARE. * THE SOFTWARE.
*/ */
#define __ST7789_VERSION__ "0.1.3" #define __ST7789_VERSION__ "0.1.4"
#include "py/obj.h" #include "py/obj.h"
#include "py/runtime.h" #include "py/runtime.h"
@ -56,6 +56,8 @@ typedef struct _st7789_ST7789_obj_t {
mp_obj_base_t *spi_obj; mp_obj_base_t *spi_obj;
uint8_t width; uint8_t width;
uint8_t height; uint8_t height;
uint8_t xstart;
uint8_t ystart;
mp_hal_pin_obj_t reset; mp_hal_pin_obj_t reset;
mp_hal_pin_obj_t dc; mp_hal_pin_obj_t dc;
mp_hal_pin_obj_t cs; mp_hal_pin_obj_t cs;
@ -98,8 +100,8 @@ STATIC void set_window(st7789_ST7789_obj_t *self, uint8_t x0, uint8_t y0, uint8_
if (y0 > y1 || y1 >= self->height) { if (y0 > y1 || y1 >= self->height) {
return; return;
} }
uint8_t bufx[4] = {x0 >> 8, x0 & 0xFF, x1 >> 8, x1 & 0xFF}; uint8_t bufx[4] = {(x0+self->xstart) >> 8, (x0+self->xstart) & 0xFF, (x1+self->xstart) >> 8, (x1+self->xstart) & 0xFF};
uint8_t bufy[4] = {y0 >> 8, y0 & 0xFF, y1 >> 8, y1 & 0xFF}; uint8_t bufy[4] = {(y0+self->ystart) >> 8, (y0+self->ystart) & 0xFF, (y1+self->ystart) >> 8, (y1+self->ystart) & 0xFF};
write_cmd(self, ST7789_CASET, bufx, 4); write_cmd(self, ST7789_CASET, bufx, 4);
write_cmd(self, ST7789_RASET, bufy, 4); write_cmd(self, ST7789_RASET, bufy, 4);
write_cmd(self, ST7789_RAMWR, NULL, 0); write_cmd(self, ST7789_RAMWR, NULL, 0);
@ -488,7 +490,10 @@ mp_obj_t st7789_ST7789_make_new(const mp_obj_type_t *type,
size_t n_args, size_t n_args,
size_t n_kw, size_t n_kw,
const mp_obj_t *all_args ) { const mp_obj_t *all_args ) {
enum { ARG_spi, ARG_width, ARG_height, ARG_reset, ARG_dc, ARG_cs, ARG_backlight }; enum {
ARG_spi, ARG_width, ARG_height, ARG_reset, ARG_dc, ARG_cs,
ARG_backlight, ARG_xstart, ARG_ystart
};
static const mp_arg_t allowed_args[] = { static const mp_arg_t allowed_args[] = {
{ MP_QSTR_spi, MP_ARG_OBJ | MP_ARG_REQUIRED, {.u_obj = MP_OBJ_NULL} }, { MP_QSTR_spi, MP_ARG_OBJ | MP_ARG_REQUIRED, {.u_obj = MP_OBJ_NULL} },
{ MP_QSTR_width, MP_ARG_INT | MP_ARG_REQUIRED, {.u_int = 0} }, { MP_QSTR_width, MP_ARG_INT | MP_ARG_REQUIRED, {.u_int = 0} },
@ -497,6 +502,8 @@ mp_obj_t st7789_ST7789_make_new(const mp_obj_type_t *type,
{ MP_QSTR_dc, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, { MP_QSTR_dc, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
{ MP_QSTR_cs, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, { MP_QSTR_cs, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
{ MP_QSTR_backlight, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, { MP_QSTR_backlight, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
{ MP_QSTR_xstart, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -1} },
{ MP_QSTR_ystart, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -1} },
}; };
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
@ -511,6 +518,19 @@ mp_obj_t st7789_ST7789_make_new(const mp_obj_type_t *type,
self->width = args[ARG_width].u_int; self->width = args[ARG_width].u_int;
self->height = args[ARG_height].u_int; self->height = args[ARG_height].u_int;
if (args[ARG_xstart].u_int >= 0 && args[ARG_ystart].u_int >= 0) {
self->xstart = args[ARG_xstart].u_int;
self->ystart = args[ARG_ystart].u_int;
} else if (self->width == 240 && self->height == 240) {
self->xstart = ST7789_240x240_XSTART;
self->ystart = ST7789_240x240_YSTART;
} else if (self->width == 135 && self->height == 240) {
self->xstart = ST7789_135x240_XSTART;
self->ystart = ST7789_135x240_YSTART;
} else {
mp_raise_ValueError("Unsupported display. Only 240x240 and 135x240 are supported without xstart and ystart provided");
}
if (args[ARG_reset].u_obj == MP_OBJ_NULL if (args[ARG_reset].u_obj == MP_OBJ_NULL
|| args[ARG_dc].u_obj == MP_OBJ_NULL) { || args[ARG_dc].u_obj == MP_OBJ_NULL) {
mp_raise_ValueError("must specify all of reset/dc pins"); mp_raise_ValueError("must specify all of reset/dc pins");

Wyświetl plik

@ -5,11 +5,10 @@
extern "C" { extern "C" {
#endif #endif
#define ST7789_TFTWIDTH_240 240
#define ST7789_TFTHEIGHT_240 240
#define ST7789_240x240_XSTART 0 #define ST7789_240x240_XSTART 0
#define ST7789_240x240_YSTART 0 #define ST7789_240x240_YSTART 0
#define ST7789_135x240_XSTART 52
#define ST7789_135x240_YSTART 40
// color modes // color modes
@ -45,10 +44,10 @@ extern "C" {
#define ST7789_MADCTL 0x36 #define ST7789_MADCTL 0x36
#define ST7789_MADCTL_MY 0x80 // Page Address Order #define ST7789_MADCTL_MY 0x80 // Page Address Order
#define ST7789_MADCTL_MX 0x40 // Column Address Order #define ST7789_MADCTL_MX 0x40 // Column Address Order
#define ST7789_MADCTL_MV 0x20 // Page/Column Order #define ST7789_MADCTL_MV 0x20 // Page/Column Order
#define ST7789_MADCTL_ML 0x10 // Line Address Order #define ST7789_MADCTL_ML 0x10 // Line Address Order
#define ST7789_MADCTL_MH 0x04 // Display Data Latch Order #define ST7789_MADCTL_MH 0x04 // Display Data Latch Order
#define ST7789_MADCTL_RGB 0x00 #define ST7789_MADCTL_RGB 0x00
#define ST7789_MADCTL_BGR 0x08 #define ST7789_MADCTL_BGR 0x08