33from micropython import const
44import lcd_bus
55import lvgl as lv
6+ import gc
67
78
89STATE_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