屏驱回调函数

屏驱回调函数是上层驱动框架操作屏驱的唯一接口,接口里面会经常用到寄存器的读写函数去操作LCD,

屏驱回调函数主要包括如下函数(对于非必选的可以不实现,留空或赋值为NULL即可):

回调函数

说明

LCD_Init

【必选】,屏驱初始函数(包括复位,初始化程序等)

LCD_ReadID

【必选】,屏幕在位检测函数

LCD_DisplayOn

【必选】,屏幕打开

LCD_DisplayOff

【必选】,屏幕关闭

LCD_SetRegion

【必选】,设置屏幕接受数据时的区域(2A,2B 的区域)

LCD_WritePixel

可选,写一个像素点到屏幕上

LCD_WriteMultiplePixels

【必选】,写批量像素点到屏幕上

LCD_ReadPixel

可选,读屏幕上的一个像素点数据,返回像素的RGB值

LCD_SetColorMode

可选,切换输出给屏幕的颜色格式

LCD_SetBrightness

可选,设置屏幕的亮度

LCD_IdleModeOn

可选,进入待机显示模式(低功耗模式)

LCD_IdleModeOff

可选,退出待机显示模式(低功耗模式)

LCD_Rotate

可选,旋转屏幕一定角度

LCD_TimeoutDbg

可选,批量送数超时后,屏幕自检

LCD_TimeoutReset

可选,批量送数超时后,屏幕复位

LCD_ESDCheck

可选,屏幕定时ESD检测

LCD控制器寄存器的读写接口

这些接口会自动根据LCD控制器根据HAL_LCDC_Init设置的接口类型、频率去跟屏幕通信:

  1. 寄存器写函数HAL_LCDC_WriteU8RegHAL_LCDC_WriteU16RegHAL_LCDC_WriteU32Reg

  2. 寄存器读函数HAL_LCDC_ReadU8RegHAL_LCDC_ReadU16RegHAL_LCDC_ReadU32Reg

备注

寄存器和数据的发送都是小端,例如某SPI屏幕写寄存器调用:

uint8_t param[4] = {0xAA, 0xBB, 0xCC, 0xDD};

HAL_LCDC_WriteU32Reg(hlcdc, 0x78563412, &param, 4);

则在接口上传输的是按照0x12,0x34,0x56,0x78, 0xAA, 0xBB, 0xCC, 0xDD的字节顺序。

LCD_Init

屏驱第一个调用的函数,初始化。 这里面主要是:

  1. 调用HAL_LCDC_Init初始化LCD控制器,设定接口的类型、频率、数据格式等等。

  2. 通过BSP_LCD_Reset接口复位屏幕,使用LCD_DRIVER_DELAY_MS来做延时。

  3. 然后从厂家提供的屏幕初始化命令表里面,将命令用思澈的寄存器写接口,送到屏幕上去。

下图是某个屏驱的截图:

../../_images/LCD_Init_func.png

LCD_ReadID

屏幕在位检测函数,该函数返回的值,会跟屏驱注册时提供的LCD_ID去比较,如果相同,则屏驱框架认为该屏驱可用。 否则,就不会调用该屏驱。

这个就是屏驱注册时提供的LCD_ID:

LCD_DRIVER_EXPORT2(nv3051f1, LCD_ID, &lcdc_int_cfg, &LCD_drv,2);  

LCD_DisplayOn

这个函数里面一般就是发送屏驱的Display on命令。命令格式参考屏驱IC的Datasheet。

LCD_DisplayOff

这个函数里面一般是发送屏驱的Display off命令。命令格式参考屏驱IC的Datasheet。

LCD_SetRegion

这个函数是设置LCD控制器的输出区域,以及屏驱的接收区域。

  1. 通过HAL_LCDC_SetROIArea设置LCD控制器的输出区域。

  2. 发送屏驱的接收窗口命令,一般是2A,2B寄存器

一般情况下,这2个区域直接根据SetRegion传入的参数设置相同区域即可。如果是DPI, DSI video这种ramless屏幕,可以初始化设置1次,后面不需要重复设置。

LCD控制器输出区域、屏驱接收区域、Framebuffer所在区域、3者的相对关系

LCD_WritePixel

写1个像素点数据到屏幕上

LCD_WriteMultiplePixels

这个函数是设置Framebuffer的地址和所在区域,然后触发刷屏。

  1. 通过HAL_LCDC_LayerSetData设置Framebuffer所在的地址以及坐标区域。

  2. 通过HAL_LCDC_SendLayerData2Reg_IT先发送批量写数据的寄存器地址,然后发送RGB数据到屏幕。对于DPI、DSI video这种没有寄存器地址的,调用HAL_LCDC_SendLayerData_IT启动送RGB数据。

LCD控制器输出区域、屏驱接收区域、Framebuffer所在区域、3者的相对关系

LCD_ReadPixel

TODO.

LCD_SetColorMode

TODO.

LCD_SetBrightness

设置屏幕的背光,一般有以下2种办法:

  1. 直接修改屏幕的寄存器,来修改液晶的透明度。一般用在AMOLED屏幕上,大概是这样:

    uint8_t bright = (uint8_t)((int)255 * br / 100); //百分比转换为0~255的值
    LCD_WriteReg(hlcdc, 0x51, &bright, 1); //设置背光寄存器,一般是0x51
  1. 修改背光设备“lcdlight”的亮度。这种一般是TFT屏幕才会用到,AMOLED屏幕则不需要。大概是这样:

    rt_device_t device = rt_device_find("lcdlight"); //查找背光设备
    if (device)
    {
        rt_err_t err = rt_device_open(device, RT_DEVICE_OFLAG_RDWR);//打开设备
        uint8_t val = br;
        rt_device_write(device, 0, &val, 1); //设置背光值
        rt_device_close(device); //关闭device(不会关闭背光)
    }

LCD_IdleModeOn

TODO.

LCD_IdleModeOff

TODO.

LCD_Rotate

TODO.

LCD_TimeoutDbg

TODO.

LCD_TimeoutReset

TODO.

LCD_ESDCheck

TODO.