Skip to content

Commit 7b90b55

Browse files
committed
updates SPIBus to accept spi.Bus instance
Changes the XPT2046 driver to use `spi.Bus` and `spi.Device` Adds use of macro to enable logging. I still have to update the build script to turn the debug logging on and off from the command line. I also need to write new spi handling for the rest of the MCU's
1 parent 244119d commit 7b90b55

File tree

12 files changed

+290
-202
lines changed

12 files changed

+290
-202
lines changed

api_drivers/common_api_drivers/indev/xpt2046.py

Lines changed: 38 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
from micropython import const
2-
import micropython
3-
import machine
1+
from micropython import const # NOQA
2+
import micropython # NOQA
3+
import machine # NOQA
44
import pointer_framework
5-
import lcd_bus
5+
import _thread
6+
import spi as _spi
67

78

89
_INT_ON_PD0_BIT = const(0x01)
@@ -31,32 +32,30 @@ class XPT2046(pointer_framework.PointerDriver):
3132

3233
def __init__(
3334
self,
34-
miso,
35-
mosi,
36-
clk,
37-
cs,
38-
host,
35+
spi_bus,
3936
freq=1000000,
37+
cs=-1,
4038
interrupt=-1,
4139
vref_on=False,
4240
press_threshold=400,
4341
touch_cal=None
4442
):
4543
super().__init__(touch_cal=touch_cal)
46-
self._trans_buf = bytearray(1)
47-
self._trans_mv = memoryview(self._trans_buf)
48-
49-
self._recv_buf = bytearray(2)
50-
self._recv_mv = memoryview(self._recv_buf)
44+
self._trans_mv = _spi.get_dma_buffer(1)
45+
self._recv_mv = _spi.get_dma_buffer(2)
5146

5247
self._on_schedule_ref = self._on_schedule
5348
self._press_threshold = press_threshold
49+
5450
if interrupt != -1:
5551
PD0_BIT = _INT_ON_PD0_BIT
5652
interrupt = machine.Pin(interrupt, machine.Pin.IN)
57-
interrupt.irq(trigger=machine.Pin.IRQ_FALLING, handler=self._on_interrupt)
53+
interrupt.irq(
54+
trigger=machine.Pin.IRQ_FALLING,
55+
handler=self._on_interrupt
56+
)
5857

59-
self._set_mode_event()
58+
self._set_mode_event() # NOQA
6059
else:
6160
interrupt = None
6261
PD0_BIT = _INT_OFF_PD0_BIT
@@ -79,52 +78,32 @@ def __init__(
7978
# self._TEMP0 = const(0x86)
8079
# self._TEMP1 = const(0xF6)
8180

82-
if (
83-
isinstance(self._py_disp_drv._data_bus, lcd_bus.SPIBus) and
84-
self._py_disp_drv._data_bus.get_host() == host
85-
):
86-
self.__shared_bus = True
87-
self._spi = lcd_bus.SPIBus(
88-
mosi=mosi,
89-
miso=miso,
90-
sclk=clk,
91-
cs=cs,
92-
freq=freq,
93-
dc=-1,
94-
host=host
95-
)
81+
self._spi = _spi.Device(
82+
spi_bus=spi_bus,
83+
freq=freq,
84+
cs=cs
85+
)
9686

97-
self._spi.init(self._orig_width, self._orig_height, 4, False)
87+
self._lock = _thread.allocate_lock()
9888

99-
else:
100-
self.__shared_bus = False
101-
102-
self._spi = machine.SPI(
103-
host + 1,
104-
baudrate=freq,
105-
sck=machine.Pin(clk, machine.Pin.OUT),
106-
mosi=machine.Pin(mosi, machine.Pin.OUT),
107-
miso=machine.Pin(miso, machine.Pin.IN, pull=machine.Pin.PULL_UP)
108-
)
89+
def _read_reg(self, reg):
90+
self._lock.acquire()
10991

110-
self.cs = machine.Pin(cs, machine.Pin.OUT)
111-
self.cs.value(1)
92+
def _callback(*_):
93+
self._lock.release()
11294

113-
def _read_reg(self, reg):
114-
self._recv_buf[0] = 0x00
115-
self._recv_buf[1] = 0x00
95+
self._recv_mv[0] = 0x00
96+
self._recv_mv[1] = 0x00
97+
self._spi.comm(
98+
cmd=reg,
99+
cmd_bits=8,
100+
rx_data=self._recv_mv,
101+
callback=_callback
102+
)
116103

117-
if self.__shared_bus:
118-
self._spi.rx_param(reg, self._recv_mv)
119-
else:
120-
self.cs.value(0)
121-
self._trans_buf[0] = reg
122-
self._recv_buf[0] = 0x00
123-
self._recv_buf[1] = 0x00
124-
self._spi.write_readinto(self._trans_mv, self._recv_mv)
125-
self.cs.value(1)
126-
127-
return (self._recv_buf[0] << 8) | self._recv_buf[1]
104+
self._lock.acquire()
105+
self._lock.release()
106+
return (self._recv_mv[0] << 8) | self._recv_mv[1]
128107

129108
def _on_schedule(self, *_):
130109
self.read()
@@ -155,8 +134,8 @@ def _get_coords(self):
155134
(_MIN_RAW_COORD <= x <= _MAX_RAW_COORD) or
156135
(_MIN_RAW_COORD <= y <= _MAX_RAW_COORD)
157136
):
158-
x = int((x / float(_MAX_RAW_COORD)) * self._orig_width)
159-
y = int((y / float(_MAX_RAW_COORD)) * self._orig_height)
137+
x = int((x / float(_MAX_RAW_COORD)) * self._orig_width) # NOQA
138+
y = int((y / float(_MAX_RAW_COORD)) * self._orig_height) # NOQA
160139

161140
x_points.append(x)
162141
y_points.append(y)

ext_mod/esp32_additions/spi/include/esp32_spi_bus.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
spi_host_device_t host;
1818
spi_bus_config_t buscfg;
1919
bool octal_mode;
20+
bool dual_mode;
2021

2122
enum {
2223
MACHINE_HW_SPI_STATE_NONE,

ext_mod/esp32_additions/spi/src/esp32_spi_bus.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,10 +365,11 @@ mp_obj_t esp32_hw_spi_bus_make_new(const mp_obj_type_t *type, size_t n_args, siz
365365
} else {
366366
self->octal_mode = false;
367367
}
368-
368+
self->dual_mode = false;
369369
if ((bool)args[ARG_dual].u_bool) {
370370
if (mosi != -1 && miso != -1) {
371371
buscfg_flags |= SPICOMMON_BUSFLAG_DUAL;
372+
self->dual_mode = true;
372373
} else {
373374
mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("miso and mosi pins are needed to use dual mode"));
374375
return mp_const_none;

ext_mod/esp32_additions/spi/src/esp32_spi_device.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -108,18 +108,18 @@ mp_obj_t esp32_hw_spi_dev_make_new(const mp_obj_type_t *type, size_t n_args, siz
108108
ARG_queue_size,
109109
};
110110
static const mp_arg_t allowed_args[] = {
111-
{ MP_QSTR_spi_bus, MP_ARG_REQUIRED | MP_ARG_OBJ },
112-
{ MP_QSTR_baudrate, MP_ARG_REQUIRED | MP_ARG_INT },
113-
{ MP_QSTR_cs, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -1 } },
114-
{ MP_QSTR_polarity, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0 } },
115-
{ MP_QSTR_phase, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0 } },
116-
{ MP_QSTR_bits, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 8 } },
117-
{ MP_QSTR_firstbit, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = MICROPY_PY_MACHINE_SPI_MSB } },
118-
{ MP_QSTR_three_wire, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false } },
119-
{ MP_QSTR_cs_active_pos, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false } },
120-
{ MP_QSTR_half_duplex, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false } },
121-
{ MP_QSTR_clock_as_cs, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false } },
122-
{ MP_QSTR_queue_size, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 5 } },
111+
{ MP_QSTR_spi_bus, MP_ARG_OBJ | MP_ARG_KW_ONLY | MP_ARG_REQUIRED },
112+
{ MP_QSTR_freq, MP_ARG_INT | MP_ARG_KW_ONLY | MP_ARG_REQUIRED },
113+
{ MP_QSTR_cs, MP_ARG_INT | MP_ARG_KW_ONLY, { .u_int = -1 } },
114+
{ MP_QSTR_polarity, MP_ARG_INT | MP_ARG_KW_ONLY, { .u_int = 0 } },
115+
{ MP_QSTR_phase, MP_ARG_INT | MP_ARG_KW_ONLY, { .u_int = 0 } },
116+
{ MP_QSTR_firstbit, MP_ARG_INT | MP_ARG_KW_ONLY, { .u_int = MICROPY_PY_MACHINE_SPI_MSB } },
117+
{ MP_QSTR_bits, MP_ARG_INT | MP_ARG_KW_ONLY, { .u_int = 8 } },
118+
{ MP_QSTR_three_wire, MP_ARG_BOOL | MP_ARG_KW_ONLY, { .u_bool = false } },
119+
{ MP_QSTR_cs_high_active, MP_ARG_BOOL | MP_ARG_KW_ONLY, { .u_bool = false } },
120+
{ MP_QSTR_half_duplex, MP_ARG_BOOL | MP_ARG_KW_ONLY, { .u_bool = false } },
121+
{ MP_QSTR_clock_as_cs, MP_ARG_BOOL | MP_ARG_KW_ONLY, { .u_bool = false } },
122+
{ MP_QSTR_queue_size, MP_ARG_INT | MP_ARG_KW_ONLY, { .u_int = 5 } },
123123
};
124124
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
125125
mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);

ext_mod/lcd_bus/esp32_include/spi_bus.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
//local_includes
55
#include "lcd_types.h"
6+
#include "esp_spi_bus.h"
67

78
// esp-idf includes
89
#include "esp_lcd_panel_io.h"
@@ -30,11 +31,9 @@
3031

3132
lcd_panel_io_t panel_io_handle;
3233
esp_lcd_panel_io_spi_config_t panel_io_config;
33-
spi_bus_config_t bus_config;
34+
esp32_hw_spi_bus_obj_t *spi_bus;
3435
esp_lcd_spi_bus_handle_t bus_handle;
3536

36-
spi_host_device_t host;
37-
3837
} mp_lcd_spi_bus_obj_t;
3938

4039
extern const mp_obj_type_t mp_lcd_spi_bus_type;

ext_mod/lcd_bus/esp32_src/i80_bus.c

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@
141141

142142
self->panel_io_config.cs_gpio_num = (int)args[ARG_cs].u_int;
143143
self->panel_io_config.pclk_hz = (uint32_t)args[ARG_freq].u_int;
144-
self->panel_io_config.trans_queue_depth = 1;
144+
self->panel_io_config.trans_queue_depth = 5;
145145
self->panel_io_config.on_color_trans_done = &bus_trans_done_cb;
146146
self->panel_io_config.user_ctx = self;
147147
self->panel_io_config.lcd_cmd_bits = (int)args[ARG_cmd_bits].u_int;
@@ -156,6 +156,43 @@
156156
self->panel_io_config.flags.pclk_active_neg = (unsigned int)args[ARG_pclk_active_low].u_bool;
157157
self->panel_io_config.flags.pclk_idle_low = (unsigned int)args[ARG_pclk_idle_low].u_bool;
158158

159+
#if CONFIG_LCD_ENABLE_DEBUG_LOG
160+
printf("dc_gpio_num=%d\n", self->bus_config.dc_gpio_num);
161+
printf("wr_gpio_num=%d\n", self->bus_config.wr_gpio_num);
162+
printf("clk_src=%d\n", self->bus_config.clk_src);
163+
printf("data_gpio_nums[0]=%d\n", self->bus_config.data_gpio_nums[0]);
164+
printf("data_gpio_nums[1]=%d\n", self->bus_config.data_gpio_nums[1]);
165+
printf("data_gpio_nums[2]=%d\n", self->bus_config.data_gpio_nums[2]);
166+
printf("data_gpio_nums[3]=%d\n", self->bus_config.data_gpio_nums[3]);
167+
printf("data_gpio_nums[4]=%d\n", self->bus_config.data_gpio_nums[4]);
168+
printf("data_gpio_nums[5]=%d\n", self->bus_config.data_gpio_nums[5]);
169+
printf("data_gpio_nums[6]=%d\n", self->bus_config.data_gpio_nums[6]);
170+
printf("data_gpio_nums[7]=%d\n", self->bus_config.data_gpio_nums[7]);
171+
printf("data_gpio_nums[8]=%d\n", self->bus_config.data_gpio_nums[8]);
172+
printf("data_gpio_nums[9]=%d\n", self->bus_config.data_gpio_nums[9]);
173+
printf("data_gpio_nums[10]=%d\n", self->bus_config.data_gpio_nums[10]);
174+
printf("data_gpio_nums[11]=%d\n", self->bus_config.data_gpio_nums[11]);
175+
printf("data_gpio_nums[12]=%d\n", self->bus_config.data_gpio_nums[12]);
176+
printf("data_gpio_nums[13]=%d\n", self->bus_config.data_gpio_nums[13]);
177+
printf("data_gpio_nums[14]=%d\n", self->bus_config.data_gpio_nums[14]);
178+
printf("data_gpio_nums[15]=%d\n", self->bus_config.data_gpio_nums[15]);
179+
printf("bus_width=%d\n", self->bus_config.bus_width);
180+
printf("cs_gpio_num=%d\n", self->panel_io_config.cs_gpio_num);
181+
printf("pclk_hz=%d\n", self->panel_io_config.pclk_hz);
182+
printf("trans_queue_depth=%d\n", self->panel_io_config.trans_queue_depth);
183+
printf("lcd_cmd_bits=%d\n", self->panel_io_config.lcd_cmd_bits);
184+
printf("lcd_param_bits=%d\n", self->panel_io_config.lcd_param_bits);
185+
printf("dc_idle_level=%d\n", self->panel_io_config.dc_levels.dc_idle_level);
186+
printf("dc_cmd_level=%d\n", self->panel_io_config.dc_levels.dc_cmd_level);
187+
printf("dc_dummy_level=%d\n", self->panel_io_config.dc_levels.dc_dummy_level);
188+
printf("dc_data_level=%d\n", self->panel_io_config.dc_levels.dc_data_level);
189+
printf("cs_active_high=%d\n", self->panel_io_config.flags.cs_active_high);
190+
printf("reverse_color_bits=%d\n", self->panel_io_config.flags.reverse_color_bits);
191+
printf("swap_color_bytes=%d\n", self->panel_io_config.flags.swap_color_bytes);
192+
printf("pclk_active_neg=%d\n", self->panel_io_config.flags.pclk_active_neg);
193+
printf("pclk_idle_low=%d\n", self->panel_io_config.flags.pclk_idle_low);
194+
#endif
195+
159196
self->panel_io_handle.init = &i80_init;
160197
self->panel_io_handle.del = &i80_del;
161198
self->panel_io_handle.get_lane_count = &i80_get_lane_count;
@@ -166,6 +203,10 @@
166203

167204
mp_lcd_err_t i80_init(mp_obj_t obj, uint16_t width, uint16_t height, uint8_t bpp, uint32_t buffer_size, bool rgb565_byte_swap)
168205
{
206+
#if CONFIG_LCD_ENABLE_DEBUG_LOG
207+
printf("i80_init(self, width=%d, height=%d, bpp=%d, buffer_size=%d, rgb565_byte_swap=%d)\n", width, height, bpp, buffer_size, rgb565_byte_swap);
208+
#endif
209+
169210
mp_lcd_i80_bus_obj_t *self = (mp_lcd_i80_bus_obj_t *)obj;
170211

171212
if (bpp == 16) {
@@ -176,6 +217,9 @@
176217

177218
self->bus_config.max_transfer_bytes = (size_t)buffer_size;
178219

220+
#if CONFIG_LCD_ENABLE_DEBUG_LOG
221+
printf("max_transfer_bytes=%d\n", self->bus_config.max_transfer_bytes);
222+
#endif
179223
esp_err_t ret = esp_lcd_new_i80_bus(&self->bus_config, &self->bus_handle);
180224

181225
if (ret != 0) {
@@ -194,6 +238,10 @@
194238

195239
mp_lcd_err_t i80_del(mp_obj_t obj)
196240
{
241+
#if CONFIG_LCD_ENABLE_DEBUG_LOG
242+
printf("i80_del(self)\n");
243+
#endif
244+
197245
mp_lcd_i80_bus_obj_t *self = (mp_lcd_i80_bus_obj_t *)obj;
198246

199247
mp_lcd_err_t ret = esp_lcd_panel_io_del(self->panel_io_handle.panel_io);
@@ -213,6 +261,11 @@
213261
{
214262
mp_lcd_i80_bus_obj_t *self = (mp_lcd_i80_bus_obj_t *)obj;
215263
*lane_count = (uint8_t)self->bus_config.bus_width;
264+
265+
#if CONFIG_LCD_ENABLE_DEBUG_LOG
266+
printf("i80_get_lane_count(self)-> %d\n", (uint8_t)self->bus_config.bus_width);
267+
#endif
268+
216269
return LCD_OK;
217270
}
218271

0 commit comments

Comments
 (0)