This reverts commit 206897658a.
We must keep the frame completion interrupt disabled until we send a new
frame to the eLCDIF, as the frame completion interrupt fires at each
vertical blank interval. If we keep it enabled, then the semaphore we
use to indicate the frame has been loaded by the eLCDIF will be posted
to when we do not have a frame queued, and calls to `display_write` will
return before the eLCDIF has actually loaded the new framebuffer.
Fixes #80590
Signed-off-by: Daniel DeGrasse <daniel.degrasse@nxp.com>
126 lines
4.3 KiB
Text
126 lines
4.3 KiB
Text
# Copyright 2019,2023-2024 NXP
|
|
# Copyright (c) 2022, Basalte bv
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
|
|
menuconfig DISPLAY_MCUX_ELCDIF
|
|
bool "MCUX eLCDIF driver"
|
|
default y
|
|
depends on DT_HAS_NXP_IMX_ELCDIF_ENABLED
|
|
select PINCTRL
|
|
help
|
|
Enable support for mcux eLCDIF driver.
|
|
|
|
if DISPLAY_MCUX_ELCDIF
|
|
|
|
config MCUX_ELCDIF_FB_NUM
|
|
int "Framebuffers to allocate in driver"
|
|
default 2
|
|
range 0 2
|
|
help
|
|
Number of framebuffers to allocate in ELCDIF driver. Driver allocated
|
|
framebuffers are required to support partial display updates.
|
|
The driver has been validated to support 0 through 2 framebuffers.
|
|
Note that hardware will likely perform best if zero driver
|
|
framebuffers are allocated by the driver, and the application
|
|
implements double framebuffering by always calling display_write with
|
|
a buffer equal in size to the connected panel.
|
|
|
|
NOTE: when no framebuffers are allocated, the ELCDIF will be
|
|
set to display an empty buffer during initialization. This means
|
|
the display will show what is effectively a dump of
|
|
system RAM until a new framebuffer is written. If the security
|
|
implications of this concern you, leave at least one driver
|
|
framebuffer enabled.
|
|
|
|
config MCUX_ELCDIF_FB_SIZE
|
|
int "Framebuffer size required by the eLCDIF driver"
|
|
default 3686400
|
|
help
|
|
eLCDIF driver allocates framebuffers to support partial display updates.
|
|
The framebuffer size is computed as : panel_width * panel_height * bpp.
|
|
The default value is set to afford for a default resolution of 1280x720 and
|
|
4-bytes pixel format, e.g. ARGB8888. Applications should change this value
|
|
according to the actual used resolution and format to optimize the heap size.
|
|
|
|
config MCUX_ELCDIF_PXP
|
|
bool "Use PXP for display rotation"
|
|
depends on MCUX_PXP
|
|
depends on (MCUX_ELCDIF_FB_NUM > 0)
|
|
help
|
|
Use the PXP for display rotation. This requires the LCDIF node
|
|
have a "nxp,pxp" devicetree property pointing to the PXP device node.
|
|
The ELCDIF will only utilize the PXP to rotate frames if
|
|
display_write is called with a framebuffer equal in size to the
|
|
display.
|
|
|
|
if MCUX_ELCDIF_PXP
|
|
|
|
choice MCUX_ELCDIF_PXP_ROTATE_DIRECTION
|
|
default MCUX_ELCDIF_PXP_ROTATE_0
|
|
prompt "Rotation angle of PXP"
|
|
help
|
|
Set rotation angle of PXP. The ELCDIF cannot detect the correct
|
|
rotation angle based on the call to display_write, so the user should
|
|
configure it here. In order for PXP rotation to work, calls to
|
|
display_write MUST supply a framebuffer equal in size to screen width
|
|
and height (without rotation applied). Note that the width and
|
|
height settings of the screen in devicetree should not be modified
|
|
from their values in the default screen orientation when using this
|
|
functionality.
|
|
|
|
config MCUX_ELCDIF_PXP_ROTATE_0
|
|
bool "Rotate display by 0 degrees"
|
|
help
|
|
Rotate display by 0 degrees. Primarily useful for testing,
|
|
production applications should simply disable the PXP.
|
|
|
|
config MCUX_ELCDIF_PXP_ROTATE_90
|
|
bool "Rotate display by 90 degrees"
|
|
help
|
|
Rotate display counter-clockwise by 90 degrees.
|
|
For LVGL, this corresponds to a rotation of 270 degrees
|
|
|
|
config MCUX_ELCDIF_PXP_ROTATE_180
|
|
bool "Rotate display by 180 degrees"
|
|
help
|
|
Rotate display counter-clockwise by 180 degrees
|
|
|
|
config MCUX_ELCDIF_PXP_ROTATE_270
|
|
bool "Rotate display by 270 degrees"
|
|
help
|
|
Rotate display counter-clockwise by 270 degrees
|
|
For LVGL, this corresponds to a rotation of 90 degrees
|
|
|
|
endchoice
|
|
|
|
choice MCUX_ELCDIF_PXP_FLIP_DIRECTION
|
|
default MCUX_ELCDIF_PXP_FLIP_DISABLE
|
|
prompt "Flip direction of PXP"
|
|
help
|
|
Set flip direction of PXP. The ELCDIF cannot detect the correct
|
|
rotation angle based on the call to display_write, so the user should
|
|
configure it here. In order for PXP flip to work, calls to
|
|
display_write MUST supply a framebuffer equal in size to screen width
|
|
and height (without flip applied). Note that the width and
|
|
height settings of the screen in devicetree should not be modified
|
|
from their values in the default screen orientation when using this
|
|
functionality.
|
|
|
|
config MCUX_ELCDIF_PXP_FLIP_DISABLE
|
|
bool "Do not flip display"
|
|
|
|
config MCUX_ELCDIF_PXP_FLIP_HORIZONTAL
|
|
bool "Flip display horizontally"
|
|
|
|
config MCUX_ELCDIF_PXP_FLIP_VERTICAL
|
|
bool "Flip display vertically"
|
|
|
|
config MCUX_ELCDIF_PXP_FLIP_BOTH
|
|
bool "Flib display both horizontally and vertically"
|
|
|
|
endchoice
|
|
|
|
endif # MCUX_ELCDIF_PXP
|
|
|
|
endif # DISPLAY_MCUX_ELCDIF
|