Skip to content

Commit b1433fb

Browse files
committed
feature: support qspi driver and rm67162 driver
Signed-off-by: lbuque <1102390310@qq.com>
1 parent 5b4502d commit b1433fb

File tree

20 files changed

+1449
-368
lines changed

20 files changed

+1449
-368
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import lcd
2+
from machine import Pin, SPI
3+
4+
rm67162_spi_init = (
5+
(0xFE, b'\x00', 0), # PAGE
6+
(0x36, b'\x00', 0), # Scan Direction Control
7+
(0x3A, b'\x75', 0), # Interface Pixel Format 16bit/pixel
8+
(0x51, b'\x00', 0), # Write Display Brightness MAX_VAL=0XFF
9+
(0x11, b'\x00', 120), # Sleep Out
10+
(0x29, b'\x00', 120), # Display on
11+
(0x51, b'\xD0', 0), # Write Display Brightness MAX_VAL=0XFF
12+
)
13+
14+
rm67162_qspi_init = (
15+
(0x11, b'\x00', 120), # Sleep Out
16+
(0x3A, b'\x55', 0), # Interface Pixel Format 16bit/pixel
17+
(0x51, b'\x00', 0), # Write Display Brightness MAX_VAL=0XFF
18+
(0x29, b'\x00', 120), # Display on
19+
(0x51, b'\xD0', 0), # Write Display Brightness MAX_VAL=0XFF
20+
)
21+
22+
def config():
23+
hspi = SPI(2, sck=Pin(47), mosi=None, miso=None, polarity=0, phase=0)
24+
panel = lcd.QSPIPanel(
25+
spi=hspi,
26+
data=(Pin(18), Pin(7), Pin(48), Pin(5)),
27+
command=Pin(7),
28+
cs=Pin(6),
29+
pclk=80 * 1000 * 1000,
30+
width=240,
31+
height=536
32+
)
33+
rm = lcd.RM67162(panel, reset=Pin(17), bpp=24)
34+
rm.reset()
35+
rm.init()
36+
# rm.custom_init(rm67162_qspi_init)
37+
rm.rotation(0)
38+
rm.backlight_on()
39+
return rm

lcd/bus/qspi/qspi_panel.c

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
#include "qspi_panel.h"
2+
#include "lcd_panel.h"
3+
4+
5+
#if USE_ESP_LCD
6+
#include "hal/esp32/esp32.h"
7+
#else
8+
#include "hal/commom/soft8080.h"
9+
#endif
10+
11+
#include "mphalport.h"
12+
13+
#include "py/obj.h"
14+
#include "py/runtime.h"
15+
#include "py/gc.h"
16+
17+
#include <string.h>
18+
19+
20+
STATIC void lcd_qspi_panel_print(
21+
const mp_print_t *print,
22+
mp_obj_t self_in, mp_print_kind_t kind
23+
) {
24+
(void) kind;
25+
lcd_qspi_panel_obj_t *self = MP_OBJ_TO_PTR(self_in);
26+
mp_printf(
27+
print,
28+
"<QSPI Panel SPI=%p, dc=%p, write=%pcs=%p, width=%u, height=%u, cmd_bits=%u, param_bits=%u>",
29+
self->spi_obj,
30+
self->dc,
31+
self->wr,
32+
self->cs,
33+
self->width,
34+
self->height,
35+
self->cmd_bits,
36+
self->param_bits
37+
);
38+
}
39+
40+
41+
STATIC mp_obj_t lcd_qspi_panel_make_new(
42+
const mp_obj_type_t *type,
43+
size_t n_args,
44+
size_t n_kw,
45+
const mp_obj_t *all_args
46+
) {
47+
enum {
48+
ARG_spi,
49+
ARG_data,
50+
ARG_command,
51+
ARG_cs,
52+
ARG_pclk,
53+
ARG_width,
54+
ARG_height,
55+
ARG_swap_color_bytes,
56+
ARG_cmd_bits,
57+
ARG_param_bits
58+
};
59+
const mp_arg_t make_new_args[] = {
60+
{ MP_QSTR_spi, MP_ARG_OBJ | MP_ARG_KW_ONLY | MP_ARG_REQUIRED },
61+
{ MP_QSTR_data, MP_ARG_OBJ | MP_ARG_KW_ONLY | MP_ARG_REQUIRED },
62+
{ MP_QSTR_command, MP_ARG_OBJ | MP_ARG_KW_ONLY | MP_ARG_REQUIRED },
63+
{ MP_QSTR_cs, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_OBJ_NULL} },
64+
{ MP_QSTR_pclk, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 10000000 } },
65+
{ MP_QSTR_width, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 240 } },
66+
{ MP_QSTR_height, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 240 } },
67+
{ MP_QSTR_swap_color_bytes, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false } },
68+
{ MP_QSTR_cmd_bits, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 8 } },
69+
{ MP_QSTR_param_bits, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 8 } },
70+
};
71+
mp_arg_val_t args[MP_ARRAY_SIZE(make_new_args)];
72+
mp_arg_parse_all_kw_array(
73+
n_args,
74+
n_kw,
75+
all_args,
76+
MP_ARRAY_SIZE(make_new_args),
77+
make_new_args, args
78+
);
79+
80+
// create new object
81+
lcd_qspi_panel_obj_t *self = m_new_obj(lcd_qspi_panel_obj_t);
82+
self->base.type = &lcd_qspi_panel_type;
83+
self->spi_obj = (mp_obj_base_t *)MP_OBJ_TO_PTR(args[ARG_spi].u_obj);
84+
// data bus
85+
mp_obj_tuple_t *t = MP_OBJ_TO_PTR(args[ARG_data].u_obj);
86+
for (size_t i = 0; i < t->len; i++) {
87+
if (i < 4) {
88+
self->databus_pins[i] = mp_hal_get_pin_obj(t->items[i]);
89+
}
90+
}
91+
self->dc_pin = mp_hal_get_pin_obj(args[ARG_command].u_obj);
92+
self->cs_pin = mp_hal_get_pin_obj(args[ARG_cs].u_obj);
93+
self->pclk = args[ARG_pclk].u_int;
94+
self->width = args[ARG_width].u_int;
95+
self->height = args[ARG_height].u_int;
96+
// self->swap_color_bytes = args[ARG_swap_color_bytes].u_bool;
97+
self->cmd_bits = args[ARG_cmd_bits].u_int;
98+
self->param_bits = args[ARG_param_bits].u_int;
99+
100+
hal_lcd_qspi_panel_construct(&self->base);
101+
return MP_OBJ_FROM_PTR(self);
102+
}
103+
104+
105+
STATIC mp_obj_t lcd_qspi_panel_tx_param(size_t n_args, const mp_obj_t *args_in){
106+
mp_obj_base_t *self = (mp_obj_base_t *)MP_OBJ_TO_PTR(args_in[0]);
107+
int cmd = mp_obj_get_int(args_in[1]);
108+
if (n_args == 3) {
109+
mp_buffer_info_t bufinfo;
110+
mp_get_buffer_raise(args_in[2], &bufinfo, MP_BUFFER_READ);
111+
hal_lcd_qspi_panel_tx_param(self, cmd, bufinfo.buf, bufinfo.len);
112+
} else {
113+
hal_lcd_qspi_panel_tx_param(self, cmd, NULL, 0);
114+
}
115+
116+
return mp_const_none;
117+
}
118+
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(lcd_qspi_panel_tx_param_obj, 2, 3, lcd_qspi_panel_tx_param);
119+
120+
121+
STATIC mp_obj_t lcd_qspi_panel_tx_color(size_t n_args, const mp_obj_t *args_in) {
122+
mp_obj_base_t *self = (mp_obj_base_t *)MP_OBJ_TO_PTR(args_in[0]);
123+
int cmd = mp_obj_get_int(args_in[1]);
124+
125+
if (n_args == 3) {
126+
mp_buffer_info_t bufinfo;
127+
mp_get_buffer_raise(args_in[2], &bufinfo, MP_BUFFER_READ);
128+
hal_lcd_qspi_panel_tx_color(self, cmd, bufinfo.buf, bufinfo.len);
129+
} else {
130+
hal_lcd_qspi_panel_tx_color(self, cmd, NULL, 0);
131+
}
132+
133+
gc_collect();
134+
return mp_const_none;
135+
}
136+
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(lcd_qspi_panel_tx_color_obj, 2, 3, lcd_qspi_panel_tx_color);
137+
138+
139+
STATIC mp_obj_t lcd_qspi_panel_deinit(mp_obj_t self_in) {
140+
mp_obj_base_t *self = (mp_obj_base_t *)MP_OBJ_TO_PTR(self_in);
141+
142+
hal_lcd_qspi_panel_deinit(self);
143+
// m_del_obj(lcd_spi_panel_obj_t, self);
144+
return mp_const_none;
145+
}
146+
STATIC MP_DEFINE_CONST_FUN_OBJ_1(lcd_qspi_panel_deinit_obj, lcd_qspi_panel_deinit);
147+
148+
149+
STATIC const mp_rom_map_elem_t lcd_qspi_panel_locals_dict_table[] = {
150+
{ MP_ROM_QSTR(MP_QSTR_tx_param), MP_ROM_PTR(&lcd_qspi_panel_tx_param_obj) },
151+
{ MP_ROM_QSTR(MP_QSTR_tx_color), MP_ROM_PTR(&lcd_qspi_panel_tx_color_obj) },
152+
{ MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&lcd_qspi_panel_deinit_obj) },
153+
{ MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&lcd_qspi_panel_deinit_obj) },
154+
};
155+
STATIC MP_DEFINE_CONST_DICT(lcd_qspi_panel_locals_dict, lcd_qspi_panel_locals_dict_table);
156+
157+
158+
STATIC const mp_lcd_panel_p_t mp_lcd_panel_p = {
159+
.tx_param = hal_lcd_qspi_panel_tx_param,
160+
.tx_color = hal_lcd_qspi_panel_tx_color,
161+
.deinit = hal_lcd_qspi_panel_deinit
162+
};
163+
164+
165+
const mp_obj_type_t lcd_qspi_panel_type = {
166+
{ &mp_type_type },
167+
.name = MP_QSTR_QSPI_Panel,
168+
.print = lcd_qspi_panel_print,
169+
.make_new = lcd_qspi_panel_make_new,
170+
.protocol = &mp_lcd_panel_p,
171+
.locals_dict = (mp_obj_dict_t *)&lcd_qspi_panel_locals_dict,
172+
};

lcd/bus/qspi/qspi_panel.h

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#ifndef LCD_QSPI_PANEL_H_
2+
#define LCD_QSPI_PANEL_H_
3+
4+
#include "mphalport.h"
5+
#include "py/obj.h"
6+
#if USE_ESP_LCD
7+
#include "esp_lcd_panel_io.h"
8+
#include "driver/spi_master.h"
9+
#endif
10+
11+
typedef struct lcd_qspi_panel_obj_t {
12+
mp_obj_base_t base;
13+
mp_obj_base_t *spi_obj;
14+
uint16_t width;
15+
uint16_t height;
16+
17+
mp_hal_pin_obj_t databus_pins[4];
18+
mp_hal_pin_obj_t dc_pin;
19+
mp_hal_pin_obj_t wr_pin;
20+
mp_hal_pin_obj_t cs_pin;
21+
22+
mp_obj_t databus[4];
23+
mp_obj_t dc;
24+
mp_obj_t wr;
25+
mp_obj_t cs;
26+
27+
uint32_t pclk;
28+
int cmd_bits;
29+
int param_bits;
30+
bool swap_color_bytes;
31+
#if USE_ESP_LCD
32+
spi_device_handle_t io_handle;
33+
#else
34+
void (*write_color)(mp_hal_pin_obj_t *databus, mp_hal_pin_obj_t wr, const uint8_t *buf, int len);
35+
#endif
36+
} lcd_qspi_panel_obj_t;
37+
38+
extern const mp_obj_type_t lcd_qspi_panel_type;
39+
40+
#endif

lcd/driver/common/lcd_panel_types.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#include "lcd_panel_types.h"
2+
3+
const char* color_space_desc[] = {
4+
"RGB",
5+
"BGR",
6+
"MONOCHROME"
7+
};

0 commit comments

Comments
 (0)