Skip to content

Commit cf99a4c

Browse files
committed
adds nv3041a display driver
1 parent e642d12 commit cf99a4c

File tree

1 file changed

+53
-2
lines changed
  • api_drivers/common_api_drivers/display/nv3041a

1 file changed

+53
-2
lines changed

api_drivers/common_api_drivers/display/nv3041a/nv3041a.py

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from micropython import const
44
import lcd_bus
55
import lvgl as lv
6+
import gc
67

78

89
STATE_HIGH = display_driver_framework.STATE_HIGH
@@ -76,14 +77,51 @@ def __init__(
7677
offset_y=0,
7778
color_byte_order=BYTE_ORDER_RGB,
7879
color_space=lv.COLOR_FORMAT.RGB888, # NOQA
79-
rgb565_byte_swap=False,
80+
rgb565_byte_swap=False, # NOQA
8081
):
8182
num_lanes = data_bus.get_lane_count()
8283

8384
if isinstance(data_bus, lcd_bus.SPIBus) and num_lanes == 4:
8485
self.__cmd_modifier = self.__quad_spi_cmd_modifier
8586
self.__color_cmd_modifier = self.__quad_spi_color_cmd_modifier
8687
_cmd_bits = 32
88+
89+
# we need to override the default handling for creating the frame
90+
# buffer is using a quad spi bus. we don't want it to create
91+
# partial buffers for the quad SPI display
92+
93+
buf_size = display_width * display_height * lv.color_format_get_size(color_space)
94+
95+
if frame_buffer1 is None:
96+
gc.collect()
97+
98+
for flags in (
99+
lcd_bus.MEMORY_INTERNAL | lcd_bus.MEMORY_DMA,
100+
lcd_bus.MEMORY_SPIRAM | lcd_bus.MEMORY_DMA,
101+
lcd_bus.MEMORY_INTERNAL,
102+
lcd_bus.MEMORY_SPIRAM
103+
):
104+
try:
105+
frame_buffer1 = (
106+
data_bus.allocate_framebuffer(buf_size, flags)
107+
)
108+
109+
if (flags | lcd_bus.MEMORY_DMA) == flags:
110+
frame_buffer2 = (
111+
data_bus.allocate_framebuffer(buf_size, flags)
112+
)
113+
114+
break
115+
except MemoryError:
116+
frame_buffer1 = data_bus.free_framebuffer(frame_buffer1)
117+
118+
if frame_buffer1 is None:
119+
raise MemoryError(
120+
f'Unable to allocate memory for frame buffer ({buf_size})' # NOQA
121+
)
122+
123+
if len(frame_buffer1) != buf_size:
124+
raise ValueError('incorrect framebuffer size')
87125
else:
88126
self.__cmd_modifier = self.__dummy_cmd_modifier
89127
self.__color_cmd_modifier = self.__dummy_cmd_modifier
@@ -93,6 +131,7 @@ def __init__(
93131
self.__ramwr = self.__color_cmd_modifier(_RAMWR)
94132
self.__ramwrc = self.__color_cmd_modifier(_RAMWRC)
95133
self.__caset = self.__cmd_modifier(_CASET)
134+
self.__flush_ready_count = 0
96135

97136
super().__init__(
98137
data_bus,
@@ -110,18 +149,30 @@ def __init__(
110149
offset_y,
111150
color_byte_order,
112151
color_space, # NOQA
152+
# we don't need to sue RGB565 byte swap so we override it
113153
rgb565_byte_swap=False,
114154
_cmd_bits=_cmd_bits,
115155
_param_bits=8,
116156
_init_bus=True
117157
)
118158

159+
def _flush_ready_cb(self, *_):
160+
# since there are 2 transfers that take place we need to
161+
# make sure that flush ready is only called after the second part
162+
# of the buffer has sent.
163+
self.__flush_ready_count += 1
164+
if self.__flush_ready_count == 2:
165+
self._disp_drv.flush_ready()
166+
self.__flush_ready_count = 0
167+
119168
def set_params(self, cmd, params=None):
120169
cmd = self.__cmd_modifier(cmd)
121170
self._data_bus.tx_param(cmd, params)
122171

123172
def _set_memory_location(self, x1: int, y1: int, x2: int, y2: int):
124-
# Column addresses
173+
return self._dummy_set_memory_location(x1, y1, x2, y2)
174+
175+
def _dummy_set_memory_location(self, x1: int, y1: int, x2: int, y2: int):
125176
param_buf = self._param_buf # NOQA
126177

127178
param_buf[0] = (x1 >> 8) & 0xFF

0 commit comments

Comments
 (0)