Skip to content

Commit 3b23248

Browse files
committed
feature: supprt soft spi
Signed-off-by: lbuque <1102390310@qq.com>
1 parent d822b42 commit 3b23248

File tree

12 files changed

+251
-81
lines changed

12 files changed

+251
-81
lines changed

examples/tft_config/t-wristband/tft_config.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from machine import Pin, SPI
1+
from machine import Pin, SPI, SoftSPI
22
import time
33
import lcd
44

@@ -77,7 +77,8 @@
7777
)
7878

7979
def config():
80-
hspi = SPI(2, sck=Pin(18), mosi=Pin(19), miso=None)
80+
# hspi = SPI(2, sck=Pin(18), mosi=Pin(19), miso=None)
81+
hspi = SoftSPI(baudrate=80 * 1000* 1000, polarity=0, phase=0, sck=Pin(18), mosi=Pin(19), miso=Pin(4))
8182
panel = lcd.SPIPanel(spi=hspi, command=Pin(23), cs=Pin(5), pclk=60000000, width=80, height=160)
8283
st = lcd.ST7735(panel, reset=Pin(26), backlight=Pin(27))
8384
st.backlight_on()

lcd/bus/dpi/dpi_panel.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#include "dpi_panel.h"
22

3+
#if DPI_LCD_SUPPORTED
4+
35
#if USE_ESP_LCD
46
#include "esp32.h"
57
#endif
@@ -314,3 +316,4 @@ const mp_obj_type_t lcd_dpi_type = {
314316
.make_new = lcd_dpi_make_new,
315317
.locals_dict = (mp_obj_dict_t *)&lcd_dpi_locals_dict,
316318
};
319+
#endif

lcd/bus/dpi/dpi_panel.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#ifndef LCD_DPI_H_
22
#define LCD_DPI_H_
33

4+
#if DPI_LCD_SUPPORTED
5+
46
#include "py/obj.h"
57
#include "mphalport.h"
68
#if USE_ESP_LCD
@@ -57,4 +59,6 @@ typedef struct lcd_dpi_obj_t {
5759

5860
extern const mp_obj_type_t lcd_dpi_type;
5961

62+
#endif
63+
6064
#endif

lcd/bus/i80/i80_panel.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ STATIC mp_obj_t lcd_i80_deinit(mp_obj_t self_in) {
151151
mp_obj_base_t *self = (mp_obj_base_t *)MP_OBJ_TO_PTR(self_in);
152152

153153
hal_lcd_i80_deinit(self);
154-
// m_del_obj(lcd_i80_obj_t, self);
154+
155155
return mp_const_none;
156156
}
157157
STATIC MP_DEFINE_CONST_FUN_OBJ_1(lcd_i80_deinit_obj, lcd_i80_deinit);

lcd/bus/qspi/qspi_panel.c

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#include "qspi_panel.h"
22
#include "lcd_panel.h"
33

4-
54
#if USE_ESP_LCD
65
#include "hal/esp32/esp32.h"
76
#else
@@ -17,10 +16,10 @@
1716
#include <string.h>
1817

1918

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-
) {
19+
STATIC void lcd_qspi_panel_print(const mp_print_t *print,
20+
mp_obj_t self_in,
21+
mp_print_kind_t kind)
22+
{
2423
(void) kind;
2524
lcd_qspi_panel_obj_t *self = MP_OBJ_TO_PTR(self_in);
2625
mp_printf(
@@ -38,12 +37,11 @@ STATIC void lcd_qspi_panel_print(
3837
}
3938

4039

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-
) {
40+
STATIC mp_obj_t lcd_qspi_panel_make_new(const mp_obj_type_t *type,
41+
size_t n_args,
42+
size_t n_kw,
43+
const mp_obj_t *all_args)
44+
{
4745
enum {
4846
ARG_spi,
4947
ARG_data,
@@ -52,7 +50,7 @@ STATIC mp_obj_t lcd_qspi_panel_make_new(
5250
ARG_pclk,
5351
ARG_width,
5452
ARG_height,
55-
ARG_swap_color_bytes,
53+
// ARG_swap_color_bytes,
5654
ARG_cmd_bits,
5755
ARG_param_bits
5856
};
@@ -64,9 +62,9 @@ STATIC mp_obj_t lcd_qspi_panel_make_new(
6462
{ MP_QSTR_pclk, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 10000000 } },
6563
{ MP_QSTR_width, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 240 } },
6664
{ 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 } },
65+
// { MP_QSTR_swap_color_bytes, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false } },
66+
{ MP_QSTR_cmd_bits, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 8 } },
67+
{ MP_QSTR_param_bits, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 8 } },
7068
};
7169
mp_arg_val_t args[MP_ARRAY_SIZE(make_new_args)];
7270
mp_arg_parse_all_kw_array(
@@ -102,7 +100,8 @@ STATIC mp_obj_t lcd_qspi_panel_make_new(
102100
}
103101

104102

105-
STATIC mp_obj_t lcd_qspi_panel_tx_param(size_t n_args, const mp_obj_t *args_in){
103+
STATIC mp_obj_t lcd_qspi_panel_tx_param(size_t n_args, const mp_obj_t *args_in)
104+
{
106105
mp_obj_base_t *self = (mp_obj_base_t *)MP_OBJ_TO_PTR(args_in[0]);
107106
int cmd = mp_obj_get_int(args_in[1]);
108107
if (n_args == 3) {
@@ -118,7 +117,8 @@ STATIC mp_obj_t lcd_qspi_panel_tx_param(size_t n_args, const mp_obj_t *args_in){
118117
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(lcd_qspi_panel_tx_param_obj, 2, 3, lcd_qspi_panel_tx_param);
119118

120119

121-
STATIC mp_obj_t lcd_qspi_panel_tx_color(size_t n_args, const mp_obj_t *args_in) {
120+
STATIC mp_obj_t lcd_qspi_panel_tx_color(size_t n_args, const mp_obj_t *args_in)
121+
{
122122
mp_obj_base_t *self = (mp_obj_base_t *)MP_OBJ_TO_PTR(args_in[0]);
123123
int cmd = mp_obj_get_int(args_in[1]);
124124

@@ -136,7 +136,8 @@ STATIC mp_obj_t lcd_qspi_panel_tx_color(size_t n_args, const mp_obj_t *args_in)
136136
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(lcd_qspi_panel_tx_color_obj, 2, 3, lcd_qspi_panel_tx_color);
137137

138138

139-
STATIC mp_obj_t lcd_qspi_panel_deinit(mp_obj_t self_in) {
139+
STATIC mp_obj_t lcd_qspi_panel_deinit(mp_obj_t self_in)
140+
{
140141
mp_obj_base_t *self = (mp_obj_base_t *)MP_OBJ_TO_PTR(self_in);
141142

142143
hal_lcd_qspi_panel_deinit(self);
@@ -169,4 +170,4 @@ const mp_obj_type_t lcd_qspi_panel_type = {
169170
.make_new = lcd_qspi_panel_make_new,
170171
.protocol = &mp_lcd_panel_p,
171172
.locals_dict = (mp_obj_dict_t *)&lcd_qspi_panel_locals_dict,
172-
};
173+
};

lcd/bus/qspi/qspi_panel.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ typedef struct lcd_qspi_panel_obj_t {
2727
uint32_t pclk;
2828
int cmd_bits;
2929
int param_bits;
30-
bool swap_color_bytes;
30+
// bool swap_color_bytes;
3131
#if USE_ESP_LCD
3232
spi_device_handle_t io_handle;
3333
#else

lcd/bus/spi/spi_panel.c

Lines changed: 70 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
#include "spi_panel.h"
22
#include "lcd_panel.h"
33

4-
5-
#if USE_ESP_LCD
4+
#include "modmachine.h"
5+
#include "extmod/machine_spi.h"
66
#include "hal/esp32/esp32.h"
7-
#else
8-
#include "hal/commom/soft8080.h"
9-
#endif
7+
#include "hal/commom/softspi.h"
108

119
#include "mphalport.h"
1210

@@ -17,18 +15,17 @@
1715
#include <string.h>
1816

1917

20-
STATIC void lcd_spi_panel_print(
21-
const mp_print_t *print,
22-
mp_obj_t self_in, mp_print_kind_t kind
23-
) {
18+
STATIC void lcd_spi_panel_print(const mp_print_t *print,
19+
mp_obj_t self_in,
20+
mp_print_kind_t kind)
21+
{
2422
(void) kind;
2523
lcd_spi_panel_obj_t *self = MP_OBJ_TO_PTR(self_in);
2624
mp_printf(
2725
print,
28-
"<SPI Panel SPI=%p, dc=%p, write=%p, cs=%p, width=%u, height=%u, cmd_bits=%u, param_bits=%u>",
26+
"<SPI Panel SPI=%p, dc=%p, cs=%p, width=%u, height=%u, cmd_bits=%u, param_bits=%u>",
2927
self->spi_obj,
3028
self->dc,
31-
self->wr,
3229
self->cs,
3330
self->width,
3431
self->height,
@@ -38,20 +35,19 @@ STATIC void lcd_spi_panel_print(
3835
}
3936

4037

41-
STATIC mp_obj_t lcd_spi_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-
) {
38+
STATIC mp_obj_t lcd_spi_panel_make_new(const mp_obj_type_t *type,
39+
size_t n_args,
40+
size_t n_kw,
41+
const mp_obj_t *all_args)
42+
{
4743
enum {
4844
ARG_spi,
4945
ARG_command,
5046
ARG_cs,
5147
ARG_pclk,
5248
ARG_width,
5349
ARG_height,
54-
ARG_swap_color_bytes,
50+
// ARG_swap_color_bytes,
5551
ARG_cmd_bits,
5652
ARG_param_bits
5753
};
@@ -62,7 +58,7 @@ STATIC mp_obj_t lcd_spi_panel_make_new(
6258
{ MP_QSTR_pclk, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 10000000 } },
6359
{ MP_QSTR_width, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 240 } },
6460
{ MP_QSTR_height, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 240 } },
65-
{ MP_QSTR_swap_color_bytes, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false } },
61+
// { MP_QSTR_swap_color_bytes, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false } },
6662
{ MP_QSTR_cmd_bits, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 8 } },
6763
{ MP_QSTR_param_bits, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 8 } },
6864
};
@@ -89,12 +85,18 @@ STATIC mp_obj_t lcd_spi_panel_make_new(
8985
self->cmd_bits = args[ARG_cmd_bits].u_int;
9086
self->param_bits = args[ARG_param_bits].u_int;
9187

92-
hal_lcd_spi_panel_construct(&self->base);
88+
if (mp_obj_is_type(self->spi_obj, &machine_hw_spi_type)) {
89+
hal_lcd_spi_panel_construct(&self->base);
90+
} else if (mp_obj_is_type(self->spi_obj, &mp_machine_soft_spi_type)) {
91+
hal_lcd_softspi_panel_construct(&self->base);
92+
}
93+
9394
return MP_OBJ_FROM_PTR(self);
9495
}
9596

9697

97-
STATIC mp_obj_t lcd_spi_panel_tx_param(size_t n_args, const mp_obj_t *args_in){
98+
STATIC mp_obj_t lcd_spi_panel_tx_param(size_t n_args, const mp_obj_t *args_in)
99+
{
98100
mp_obj_base_t *self = (mp_obj_base_t *)MP_OBJ_TO_PTR(args_in[0]);
99101
int cmd = mp_obj_get_int(args_in[1]);
100102
if (n_args == 3) {
@@ -110,7 +112,8 @@ STATIC mp_obj_t lcd_spi_panel_tx_param(size_t n_args, const mp_obj_t *args_in){
110112
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(lcd_spi_panel_tx_param_obj, 2, 3, lcd_spi_panel_tx_param);
111113

112114

113-
STATIC mp_obj_t lcd_spi_panel_tx_color(size_t n_args, const mp_obj_t *args_in) {
115+
STATIC mp_obj_t lcd_spi_panel_tx_color(size_t n_args, const mp_obj_t *args_in)
116+
{
114117
mp_obj_base_t *self = (mp_obj_base_t *)MP_OBJ_TO_PTR(args_in[0]);
115118
int cmd = mp_obj_get_int(args_in[1]);
116119

@@ -128,7 +131,8 @@ STATIC mp_obj_t lcd_spi_panel_tx_color(size_t n_args, const mp_obj_t *args_in) {
128131
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(lcd_spi_panel_tx_color_obj, 2, 3, lcd_spi_panel_tx_color);
129132

130133

131-
STATIC mp_obj_t lcd_spi_panel_deinit(mp_obj_t self_in) {
134+
STATIC mp_obj_t lcd_spi_panel_deinit(mp_obj_t self_in)
135+
{
132136
mp_obj_base_t *self = (mp_obj_base_t *)MP_OBJ_TO_PTR(self_in);
133137

134138
hal_lcd_spi_panel_deinit(self);
@@ -147,10 +151,49 @@ STATIC const mp_rom_map_elem_t lcd_spi_panel_locals_dict_table[] = {
147151
STATIC MP_DEFINE_CONST_DICT(lcd_spi_panel_locals_dict, lcd_spi_panel_locals_dict_table);
148152

149153

154+
STATIC inline void mp_lcd_spi_panel_tx_param(mp_obj_base_t *self,
155+
int lcd_cmd,
156+
const void *param,
157+
size_t param_size)
158+
{
159+
lcd_spi_panel_obj_t *spi_panel_obj = (lcd_spi_panel_obj_t *)self;
160+
if (mp_obj_is_type(spi_panel_obj->spi_obj, &machine_hw_spi_type)) {
161+
hal_lcd_spi_panel_tx_param(self, lcd_cmd, param, param_size);
162+
} else if (mp_obj_is_type(spi_panel_obj->spi_obj, &mp_machine_soft_spi_type)) {
163+
hal_lcd_softspi_panel_tx_param(self, lcd_cmd, param, param_size);
164+
}
165+
}
166+
167+
168+
STATIC inline void mp_lcd_spi_panel_tx_color(mp_obj_base_t *self,
169+
int lcd_cmd,
170+
const void *color,
171+
size_t color_size)
172+
{
173+
lcd_spi_panel_obj_t *spi_panel_obj = (lcd_spi_panel_obj_t *)self;
174+
if (mp_obj_is_type(spi_panel_obj->spi_obj, &machine_hw_spi_type)) {
175+
hal_lcd_spi_panel_tx_color(self, lcd_cmd, color, color_size);
176+
} else if (mp_obj_is_type(spi_panel_obj->spi_obj, &mp_machine_soft_spi_type)) {
177+
hal_lcd_softspi_panel_tx_color(self, lcd_cmd, color, color_size);
178+
}
179+
}
180+
181+
182+
STATIC inline void mp_lcd_spi_panel_deinit(mp_obj_base_t *self)
183+
{
184+
lcd_spi_panel_obj_t *spi_panel_obj = (lcd_spi_panel_obj_t *)self;
185+
if (mp_obj_is_type(spi_panel_obj->spi_obj, &machine_hw_spi_type)) {
186+
hal_lcd_spi_panel_deinit(self);
187+
} else if (mp_obj_is_type(spi_panel_obj->spi_obj, &mp_machine_soft_spi_type)) {
188+
hal_lcd_softspi_panel_deinit(self);
189+
}
190+
}
191+
192+
150193
STATIC const mp_lcd_panel_p_t mp_lcd_panel_p = {
151-
.tx_param = hal_lcd_spi_panel_tx_param,
152-
.tx_color = hal_lcd_spi_panel_tx_color,
153-
.deinit = hal_lcd_spi_panel_deinit
194+
.tx_param = mp_lcd_spi_panel_tx_param,
195+
.tx_color = mp_lcd_spi_panel_tx_color,
196+
.deinit = mp_lcd_spi_panel_deinit
154197
};
155198

156199

@@ -161,4 +204,4 @@ const mp_obj_type_t lcd_spi_panel_type = {
161204
.make_new = lcd_spi_panel_make_new,
162205
.protocol = &mp_lcd_panel_p,
163206
.locals_dict = (mp_obj_dict_t *)&lcd_spi_panel_locals_dict,
164-
};
207+
};

lcd/bus/spi/spi_panel.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,14 @@ typedef struct lcd_spi_panel_obj_t {
1515
uint16_t height;
1616

1717
mp_obj_t dc;
18-
mp_obj_t wr;
1918
mp_obj_t cs;
19+
mp_hal_pin_obj_t dc_pin;
20+
mp_hal_pin_obj_t cs_pin;
2021

2122
uint32_t pclk;
2223
int cmd_bits;
2324
int param_bits;
24-
bool swap_color_bytes;
25+
// bool swap_color_bytes;
2526
#if USE_ESP_LCD
2627
esp_lcd_panel_io_handle_t io_handle;
2728
#else

0 commit comments

Comments
 (0)