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值。
1
0
发表回复 0

Your email address will not be published. Required fields are marked *