LCDC图层配置介绍
/* @brief LCD layer config */
typedef struct lcdc_layer_config {
uint8_t max_ot; /**< Maximum outstanding transfer */
display_byteorder_t byteorder; /**< Byte order */
display_yuv_format_t yuv; /**< YUV format */
display_pixel_format_t pixel_format; /**< Pixel format */
display_alphablend_option_t alphablend; /**< Alphablending option */
display_yuv2rgb_config_t csc_config; /**< Color space conversion config */
lcdc_layer_max_bytes_per_transfer_t max_bytes; /**< Layer max transfer bytes */
uint16_t height; /**< Layer height in pixel */
uint16_t width; /**< Layer width in pixel */
uint16_t position_x; /**< Layer output position X coord */
uint16_t position_y; /**< Layer output position Y coord */
display_color_32b_t background; /**< Background color */
uint32_t buffer; /**< Pointer of layer display buffer */
uint32_t stride; /**< stride of lines in bytes. stride is calculated by driver if stride == 0. */
} lcdc_layer_config_t;
buffer
待显示图像的内存首地址,LCDC会从此内存处开始读取图像数据并进行显示。为了提高访存效率,可以让buffer首地址以64字节对齐。
pixel_format
待显示图像的像素格式
width
待显示图像的宽度,以像素为单位。
height
待显示图像的高度,以像素为单位。
stride
待显示图像的行距,以字节为单位。stride代表一行图像的像素所占字节大小。LCDC会逐行的从buffer所指向的地址读取数据并进行显示。bufffer + stride * n就是每一行的图像数据的首地址,其中n代表行数,取值范围从0到height-1。
如果代码把stride设置为0,那么driver会自动计算stride大小。计算的方式为stride = width pixel_szie。其中width为图像的宽度,pixel_size是图像单个像素大小,单位是字节,比如ARGB8888的pixelsize是4字节。其中stride最小不小于width pixel_szie字节。为了提高LCDC的访存效率可以把图像缓冲区的stride设置为64字节对齐。
position_x
待显示图像在屏幕上的起始显示位置的横坐标,其中需要注意position_x + width需要小于等于实际屏幕的宽度。
position_y
待显示图像在屏幕上的起始显示位置的纵坐标,其中需要注意position_y + height需要小于等于实际屏幕的高度。
byteorder
LCDC读取数据时候的字节序。
比如内存中的数据为:
00 01 02 03 04 05 06 07...
- display_byteorder_a3a2a1a0
因为LCDC每次读取数据以4字节为单位,所以读取的第一个数据就是0x03020100,第二个数据就是0x07060504。和内存中数据是完全对应的,也是默认字节序
- display_byteorder_a0a1a2a3
所以读取的第一个数据就是0x00010203,第二个数据就是0x04050607。相当于内存的数据为:
03 02 01 00 07 06 05 04...
background
参考《LCDC混色器介绍》
alphablend
typedef enum display_alphablend_mode {
display_alphablend_mode_clear = 0,
display_alphablend_mode_src = 1,
display_alphablend_mode_dst = 2,
display_alphablend_mode_src_over = 3,
display_alphablend_mode_dst_over = 4,
display_alphablend_mode_src_in = 5,
display_alphablend_mode_dst_in = 6,
display_alphablend_mode_src_out = 7,
display_alphablend_mode_dst_out = 8,
display_alphablend_mode_src_at_top = 9,
display_alphablend_mode_dst_at_top = 10,
display_alphablend_mode_xor = 11,
display_alphablend_mode_plus = 12,
display_alphablend_mode_modulate = 13,
display_alphablend_mode_src_org = 14,
display_alphablend_mode_dst_org = 15,
} display_alphablend_mode_t;
typedef enum display_alpha_op {
display_alpha_op_invalid = 0,
display_alpha_op_override = 1,
display_alpha_op_scale = 2,
} display_alpha_op_t;
typedef struct dispaly_alphablend_option {
uint8_t dst_alpha;
uint8_t src_alpha;
display_alpha_op_t dst_alpha_op;
display_alpha_op_t src_alpha_op;
display_alphablend_mode_t mode;
} display_alphablend_option_t;
alphablend用于替换原始图像中的alpha值,注意如果图像中没有alpha通道,比如RGB565,那么默认alpha值为0xff.
- mode
用于配置混色器的混色算法,display_alphablend_mode_src_over为常用的算法。关于混色器可以参考《LCDC混色器介绍》.
- xxx_alpha_op
用于操作dst和src通道alpha替换模式
- display_alpha_op_invalid
颜色替换不生效,保持图像中原始alpha。如果是RGB565或者是YUV,那么alpha为0xFF。 - display_alpha_op_override
把原始图像中的所有像素的alpha值全部替换为dst_alpha和src_alpha值。多用于不带有alpha通道的颜色格式。 - display_alpha_op_scale
用于缩放原始图像中的alpha值。