Skip to content

Commit f79b485

Browse files
committed
adding software rotation support for all display bus types.
There are displays like the ra8876 that do not support hardware rotation and that display uses an SPI or an I8080 bus.
1 parent eb3ed67 commit f79b485

File tree

27 files changed

+2262
-1439
lines changed

27 files changed

+2262
-1439
lines changed

api_drivers/common_api_drivers/display/ra8876/_ra8876_init.py

Whitespace-only changes.

api_drivers/common_api_drivers/display/ra8876/_ra8876_type1.py

Lines changed: 480 additions & 0 deletions
Large diffs are not rendered by default.

api_drivers/common_api_drivers/display/ra8876/ra8876.py

Lines changed: 21 additions & 447 deletions
Large diffs are not rendered by default.

api_drivers/py_api_drivers/frozen/display/display_driver_framework.py

Lines changed: 42 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ def __init__(
8282
rgb565_byte_swap=False,
8383
_cmd_bits=8,
8484
_param_bits=8,
85+
_sw_rotation=False,
8586
_init_bus=True
8687
):
8788
if power_on_state not in (STATE_HIGH, STATE_LOW):
@@ -130,6 +131,7 @@ def __init__(
130131
self._rgb565_byte_swap = rgb565_byte_swap
131132
self._cmd_bits = _cmd_bits
132133
self._param_bits = _param_bits
134+
self._sw_rotation = _sw_rotation
133135

134136
if data_bus is None:
135137
self._reset_pin = None
@@ -140,47 +142,39 @@ def __init__(
140142
self._frame_buffer1 = frame_buffer1
141143
self._frame_buffer2 = frame_buffer2
142144
else:
143-
if reset_pin is None:
144-
self._reset_pin = None
145-
elif not isinstance(reset_pin, int):
146-
self._reset_pin = reset_pin
147-
else:
148-
self._reset_pin = machine.Pin(reset_pin, machine.Pin.OUT)
149-
self._reset_pin.value(not reset_state)
150145

151-
if power_pin is None:
152-
self._power_pin = None
153-
elif not isinstance(power_pin, int):
154-
self._power_pin = power_pin
146+
if isinstance(reset_pin, int):
147+
self._reset_pin = machine.Pin(reset_pin, machine.Pin.OUT)
155148
else:
149+
self._reset_pin = reset_pin
150+
151+
if isinstance(power_pin, int):
156152
self._power_pin = machine.Pin(power_pin, machine.Pin.OUT)
157-
self._power_pin.value(not power_on_state)
153+
else:
154+
self._power_pin = power_pin
158155

159-
if backlight_pin is None:
160-
self._backlight_pin = None
161-
elif not isinstance(backlight_pin, int):
162-
self._backlight_pin = backlight_pin
156+
if isinstance(backlight_pin, int):
157+
self._backlight_pin = machine.Pin(backlight_pin, machine.Pin.OUT) # NOQA
163158
else:
164-
self._backlight_pin = machine.Pin(
165-
backlight_pin,
166-
machine.Pin.OUT
167-
)
159+
self._backlight_pin = backlight_pin
168160

169161
if backlight_on_state == STATE_PWM:
170-
if isinstance(self._backlight_pin, io_expander_framework.Pin):
171-
backlight_on_state = STATE_HIGH
162+
if isinstance(self._backlight_pin, machine.Pin):
163+
self._backlight_pin = machine.PWM(self._backlight_pin, freq=38000) # NOQA
172164
else:
173-
self._backlight_pin = machine.PWM(
174-
self._backlight_pin, freq=38000)
175-
176-
if (
177-
backlight_on_state != STATE_PWM and
178-
self._backlight_pin is not None
179-
):
180-
self._backlight_pin.value(not backlight_on_state)
165+
backlight_on_state = STATE_HIGH
181166

182167
self._backlight_on_state = backlight_on_state
183168

169+
if self._reset_pin:
170+
self._reset_pin.value(not reset_state)
171+
172+
if self._power_pin:
173+
self._power_pin.value(not power_on_state)
174+
175+
if backlight_on_state != STATE_PWM and self._backlight_pin:
176+
self._backlight_pin.value(not backlight_on_state)
177+
184178
self._data_bus = data_bus
185179
self._disp_drv = lv.display_create(display_width, display_height) # NOQA
186180
self._disp_drv.set_color_format(color_space)
@@ -238,7 +232,8 @@ def _init_bus(self):
238232
buffer_size,
239233
self._rgb565_byte_swap,
240234
self._cmd_bits,
241-
self._param_bits
235+
self._param_bits,
236+
self._sw_rotation
242237
)
243238

244239
self._disp_drv.set_flush_cb(self._flush_cb)
@@ -296,7 +291,7 @@ def _on_size_change(self, _):
296291
self._param_buf[0] = (self._madctl(
297292
self._color_byte_order, self._ORIENTATION_TABLE, ~rotation
298293
))
299-
self._data_bus.tx_param(_MADCTL, self._param_mv[:1])
294+
self.set_params(_MADCTL, self._param_mv[:1])
300295

301296
@staticmethod
302297
def get_displays():
@@ -482,7 +477,7 @@ def init(self, type=None): # NOQA
482477
self._initilized = True
483478

484479
def set_params(self, cmd, params=None):
485-
self._data_bus.tx_param(cmd, params)
480+
self._data_bus.tx_param(cmd, params, False, False)
486481

487482
def get_params(self, cmd, params):
488483
self._data_bus.rx_param(cmd, params)
@@ -551,22 +546,33 @@ def _dummy_set_memory_location(self, *_, **__): # NOQA
551546

552547
def _set_memory_location(self, x1, y1, x2, y2):
553548
# Column addresses
554-
param_buf = self._param_buf # NOQA
549+
550+
if self._sw_rotation:
551+
param_buf = bytearray(4)
552+
else:
553+
param_buf = self._param_buf
555554

556555
param_buf[0] = (x1 >> 8) & 0xFF
557556
param_buf[1] = x1 & 0xFF
558557
param_buf[2] = (x2 >> 8) & 0xFF
559558
param_buf[3] = x2 & 0xFF
560559

561-
self._data_bus.tx_param(_CASET, self._param_mv)
560+
if self._sw_rotation:
561+
self._data_bus.tx_param(_CASET, param_buf, True, False)
562+
param_buf = bytearray(4)
563+
else:
564+
self.set_params(_CASET, self._param_mv)
562565

563566
# Page addresses
564567
param_buf[0] = (y1 >> 8) & 0xFF
565568
param_buf[1] = y1 & 0xFF
566569
param_buf[2] = (y2 >> 8) & 0xFF
567570
param_buf[3] = y2 & 0xFF
568571

569-
self._data_bus.tx_param(_RASET, self._param_mv)
572+
if self._sw_rotation:
573+
self._data_bus.tx_param(_RASET, param_buf, True, True)
574+
else:
575+
self.set_params(_RASET, self._param_mv)
570576

571577
return _RAMWR
572578

ext_mod/lcd_bus/common_include/i2c_bus.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414

1515
mp_obj_t callback;
1616

17-
void *buf1;
18-
void *buf2;
17+
mp_obj_array_t *view1;
18+
mp_obj_array_t *view2;
1919
uint32_t buffer_flags;
2020

2121
bool trans_done;

ext_mod/lcd_bus/common_include/i80_bus.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919

2020
mp_obj_t callback;
2121

22-
void *buf1;
23-
void *buf2;
22+
mp_obj_array_t *view1;
23+
mp_obj_array_t *view2;
2424
uint32_t buffer_flags;
2525

2626
bool trans_done;

ext_mod/lcd_bus/common_include/rgb_bus.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414

1515
mp_obj_t callback;
1616

17-
void *buf1;
18-
void *buf2;
17+
mp_obj_array_t *view1;
18+
mp_obj_array_t *view2;
1919
uint32_t buffer_flags;
2020

2121
bool trans_done;

ext_mod/lcd_bus/common_include/spi_bus.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818

1919
mp_obj_t callback;
2020

21-
void *buf1;
22-
void *buf2;
21+
mp_obj_array_t *view1;
22+
mp_obj_array_t *view2;
2323
uint32_t buffer_flags;
2424

2525
bool trans_done;
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#include "freertos/FreeRTOS.h"
2+
#include "freertos/task.h"
3+
#include "freertos/semphr.h"
4+
#include "freertos/event_groups.h"
5+
#include "freertos/idf_additions.h"
6+
7+
8+
#ifndef __BUS_TASK_H__
9+
#define __BUS_TASK_H__
10+
11+
typedef struct _bus_lock_t {
12+
SemaphoreHandle_t handle;
13+
StaticSemaphore_t buffer;
14+
} bus_lock_t;
15+
16+
typedef struct _bus_event_t {
17+
EventGroupHandle_t handle;
18+
StaticEventGroup_t buffer;
19+
} bus_event_t;
20+
21+
22+
void bus_event_init(bus_event_t *event);
23+
void bus_event_delete(bus_event_t *event);
24+
bool bus_event_isset(bus_event_t *event);
25+
void bus_event_set(bus_event_t *event);
26+
void bus_event_clear(bus_event_t *event);
27+
void bus_event_clear_from_isr(bus_event_t *event);
28+
bool bus_event_isset_from_isr(bus_event_t *event);
29+
void bus_event_set_from_isr(bus_event_t *event);
30+
void bus_event_wait(bus_event_t *event);
31+
32+
int bus_lock_acquire(bus_lock_t *lock, int32_t wait_ms);
33+
void bus_lock_release(bus_lock_t *lock);
34+
void bus_lock_init(bus_lock_t *lock);
35+
void bus_lock_delete(bus_lock_t *lock);
36+
void bus_lock_release_from_isr(bus_lock_t *lock);
37+
38+
#endif
39+
40+

ext_mod/lcd_bus/esp32_include/dsi_bus.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,17 @@
2424
typedef struct _mp_lcd_dsi_bus_obj_t {
2525
mp_obj_base_t base;
2626

27+
rotation_t *rotation;
28+
2729
mp_obj_t callback;
2830

29-
void *buf1;
30-
void *buf2;
31+
mp_obj_array_t *view1;
32+
mp_obj_array_t *view2;
33+
3134
uint32_t buffer_flags;
3235

33-
bool trans_done;
34-
bool rgb565_byte_swap;
36+
uint8_t trans_done : 1;
37+
uint8_t rgb565_byte_swap : 1;
3538

3639
lcd_panel_io_t panel_io_handle;
3740

0 commit comments

Comments
 (0)