添加新的屏幕驱动基础流程(内置、外置)

一、简介

思澈科技内置外置屏幕添加流程,这里以SF32LB52-LCD_N16R8为例
内置:所有工程下都可在menuconfig中选中加入的屏幕
外置:特定工程下加入的屏幕驱动
本文简单展示了如何添加新的屏幕驱动模组
屏幕参数:
驱动 IC: st77996
接口:DBI
分辨率:480 * 320

参考文档

二、通用配置

屏幕驱动的配置属于通用流程,在内置和外置中都是一样的。
主要有接口配置、时序配置、初始化配置
参考文档

2.1 Timing & Registers

时序和寄存器宏定义,这些可以按照需求配置

2.2 THE_LCD_ID

这个可以自定义配置,主要用于屏幕在位检测

2.3 LCDC配置

lcdc_int_cfg用于配置屏幕接口、色彩格式和时序等相关配置

static LCDC_InitTypeDef lcdc_int_cfg =
{
    .lcd_itf = LCDC_INTF_DBI_8BIT_B,//8线DBI接口模式
    .freq = 12000000,//12M
    .color_mode = LCDC_PIXEL_FORMAT_RGB565,//色彩格式RGB565

    .cfg = {
    /* 对于不同的接口,cfg配置参数可选择不同的配置,具体可参考 bf_hal_lcdc.h 文件 LCDC_InitTypeDef 结构体 */
        .dbi = {
            .syn_mode = HAL_LCDC_SYNC_DISABLE,//HAL_LCDC_SYNC_VER, //HAL_LCDC_SYNC_DISABLE,
            .vsyn_polarity = 0,
            .vsyn_delay_us = 0,
            .hsyn_num = 0,
        },
    },

};

2.4 屏幕初始化配置

LCD_Init() 在此函数中进行屏幕寄存器的初始化配置,具体配置需要参考屏幕驱动数据手册。

static void LCD_Init(LCDC_HandleTypeDef *hlcdc)
{
    uint8_t parameter[15];

    /* Initialize st7789_dbi low level bus layer ----------------------------------*/
    memcpy(&hlcdc->Init, &lcdc_int_cfg, sizeof(LCDC_InitTypeDef));
    if (!te_enabled)
    {
        hlcdc->Init.cfg.spi.syn_mode = HAL_LCDC_SYNC_DISABLE;
    }
    HAL_LCDC_Init(hlcdc);

    BSP_LCD_Reset(1);
    LCD_DRIVER_DELAY_MS(1);
    BSP_LCD_Reset(0); // Reset LCD
    HAL_Delay_us(20);
    BSP_LCD_Reset(1);
    LCD_DRIVER_DELAY_MS(50);

    // remark
    // parameter[0] = 0x20;
    // LCD_WriteReg(hlcdc, 0xE9, parameter, 1);

    /* Sleep Out Command */
    LCD_WriteReg(hlcdc, 0x11, (uint8_t *)NULL, 0);
    /* Wait for 120ms */
    LCD_DRIVER_DELAY_MS(120);

    parameter[0] = 0x40;//A0
    LCD_WriteReg(hlcdc, 0x36, parameter, 1);

    parameter[0] = 0x05;
    LCD_WriteReg(hlcdc, 0x3A, parameter, 1);

    parameter[0] = 0x0C;
    parameter[1] = 0x0C;
    parameter[2] = 0x00;
    parameter[3] = 0x33;
    parameter[4] = 0x33;
    LCD_WriteReg(hlcdc, 0xB2, parameter, 5);

    ...

    parameter[0] = 0x00;
    parameter[1] = 0x00;
    parameter[2] = 0x01;
    parameter[3] = 0x3F;
    LCD_WriteReg(hlcdc, 0x2A, parameter, 4);
#endif
    LCD_WriteReg(hlcdc, 0x20, (uint8_t *)NULL, 0);
    /* clear gram */
    HAL_LCDC_Next_Frame_TE(hlcdc, 0);
    HAL_LCDC_SetROIArea(hlcdc, 0, 0, THE_LCD_PIXEL_WIDTH - 1, THE_LCD_PIXEL_HEIGHT - 1);
    HAL_LCDC_LayerSetFormat(hlcdc, HAL_LCDC_LAYER_DEFAULT, LCDC_PIXEL_FORMAT_RGB565);
    HAL_LCDC_LayerDisable(hlcdc, HAL_LCDC_LAYER_DEFAULT);
    HAL_LCDC_SetBgColor(hlcdc, 0, 0, 0);
    HAL_LCDC_SendLayerData2Reg(hlcdc, REG_WRITE_RAM, 1);
    HAL_LCDC_LayerEnable(hlcdc, HAL_LCDC_LAYER_DEFAULT);
    LCD_WriteReg(hlcdc, 0x29, (uint8_t *)NULL, 0);
}

2.5 驱动回调函数

回调函数说明参考

2.6 屏幕注册声明

在这里插入图片描述

2.7 脚本链接 SConscript

from building import *

cwd = GetCurrentDir()
src = Glob('*.c')
CPPPATH = [cwd + '/../common', cwd]
group = DefineGroup('Drivers', src, depend = ['LCD_USING_ST77989_8080'], CPPPATH = CPPPATH)
/*--------------------------------------修改成自定义的屏幕名称,避免和其他屏幕冲突 */
Return('group')

三、外置流程

3.1 工程选择

首先需要找到一个合适的基础工程,这里选择文档中推荐的rt_driver工程

3.2 peripherals 创建

rt_driver下创建一个peripherals用来放置用户设备,这里也可以直接参考SDK/customer/peripehrals
并在此目录下创建屏幕的驱动芯片代码,以及必要的链接脚本文件,如下:

3.3 链接脚本 SConscript 1

无需修改,将代码加入工程脚本

# for module compiling
import os
from building import *

cwd  = GetCurrentDir()
objs = []
list = os.listdir(cwd)
if GetDepend(['BSP_USING_RTTHREAD']):
    if not GetDepend(['BSP_USING_PC_SIMULATOR']):
        if not GetDepend(['BSP_USING_BUILTIN_LCD']):
            # include all subfolder
            for d in list:
                path = os.path.join(cwd, d)
                if os.path.isfile(os.path.join(path, 'SConscript')):
                    objs = objs + SConscript(os.path.join(d, 'SConscript'))
    
Return('objs')

3.4 Kconfig.proj

将相关屏幕驱动通过这个脚本加入menuconfig中可配置选中
该脚本在工程对应project目录下
代码配置说明如下
配置参数可参考文档

#APP specific configuration.

config CUSTOM_MEM_MAP
    bool 
	select custom_mem_map
	default y

comment "------------Project configuration-----------"

if !BSP_USING_BUILT_LCD

<!-- 屏驱添加 -->
config LCD_USING_ST7796_8080
    bool
    default n

<!-- menuconfig选项 -->
choice
        prompt "Custom LCD driver"
        default LCD_TFT_ST7796_8080										<!-- 默认使用屏驱 -->

        config LCD_TFT_ST7796_8080        							<!--  -->    
            bool "4.0 rect DBI Video TFT LCD(480x320)"   <!-- 屏驱说明,选择的时候显示的文字 -->
            select LCD_USING_ST7796_8080                 <!-- 选中的屏驱,要和注册的一样 -->    
            select BSP_LCDC_USING_DBI               	 <!-- 屏幕驱动接口类型,前面有说明 -->

    endchoice

<!-- 屏幕分辨率宽 -->
    config LCD_HOR_RES_MAX
        int
	    default 480 if LCD_TFT_ST7796_8080
<!-- 屏幕分辨率高 -->
    config LCD_VER_RES_MAX
        int
        default 320 if LCD_TFT_ST7796_8080
<!-- 屏幕DPI值,数据手册或计算得 -->
    config LCD_DPI
        int
        default 315 if LCD_TFT_ST7796_8080

endif

3.5 menuconfig选择

完成Kconfig.proj后即可在menuconfig中选择
menuconfig中多出如下选项
当使用外置屏幕时需要将原有内置屏幕驱动关闭,或在proj.conf中添加# CONFIG_BSP_USING_BUILTIN_LCD is not set


关闭原屏幕驱动

四、内置流程

与外置不同,内置屏幕驱动添加在SDK/customer/peripherals下,这里也包含了各种内置的驱动代码
将通用的屏幕驱动代码加入此文件夹下,然后进行后续配置

4.1 Kconfig配置

此文件在SDK/customer/peripherals
添加驱动声明,这里需要添加屏幕驱动的声明,触摸和背光驱动也在这里添加
需要保证添加的声明与驱动代码中注册的相同

4.2 Kconfig_lcd配置

此文件在SDK/customer/boards
这里添加的配置就与外置流程的Kocnfig.proj一样
添加屏幕选项、添加屏幕参数




4.3 menuconfig选择

打开menuconfig,在原有LCD屏幕选择中会多出一个我们自己配置的屏幕选项,可以选中,并编译

五、现象

当配置选项完成,且屏幕驱动的编写无误,编译通过下载使用后可以出现如下
可以读取到屏幕ID,LOG显示正常不会出现读写超时,屏幕正常显示