RT-Thread驱动开发指南进阶篇-动手驱动先楫未适配的外设LCD

描述

一、概述

经过上一篇的《《RT-Thread设备驱动开发指南》基础篇--以先楫bsp的hwtimer设备为例》阐述,可以大致了解到RT-thread设备驱动开发的方法步骤,开发指南中的进阶篇外设主要是比基础篇外设复杂点的外设设备,分别是SDIO、Touch、LCD、sensor、MTD nor、MTD nand、脉冲编码器、加解密设备、PM设备。

对于进阶篇的外设,本文不对先楫已经支持的进阶外设进行阐述,而是进行一次动手实践驱动一个先楫尚未适配的驱动外设-LCD,来更加深入开发RT-thread的设备驱动。

来个效果:

在官方示例的wifi_web_camera_demo基础上加上lcd驱动显示摄像头

二、开发方法

(一)RT-thread的LCD驱动框架介绍

LCD驱动,跟其他外设也类似,无非就是IO设备管理框架-->LCD设备驱动框架->LCD设备驱动。

IO设备管理层主要为设备框架提供统一的操作接口,包括rt_device_read/write/open/close/control等。而做好一个外设驱动,最终的目标就是应用上使用这些统一操作接口,无需理会底层操作。

LCD设备驱动框架层是RT-thread对LCD基本功能的抽象,是一层通用的软件层,和硬件平台无关,抽象了LCD设备的类型定义和具体的操作方法,其框架源码在rtdef.h中

LCD的信息结构 rt_device_graphic_info,定义了像素格式,位宽,宽高、显存地址等。

RGB

LCD的操作接口rt_device_graphic_ops,定义了LCD的绘图操作,比如像素点、画线等操作。

RGB

LCD的控制命令,比如更新显存、开关LCD、获取信息、等待VSYNC等。

RGB

LCD的像素格式

RGB

可见,RT-thread对于LCD的抽象操作还是比较直观,完成以上的操作,再借助IO设备管理层提供的注册接口rt_device_register进行注册,即可使用IO设备管理接口操作LCD。

(二)先楫LCDC外设介绍

对于先楫的LCDC外设硬件控制器

在HPM6750上有RGB控制器,支持24位的RGB显示接口

RGB

在HPM6800上,支持2 个 4 Lane MIPI-DSI/LVDS-Tx 显示接口

RGB

对于在RT-thread上,也支持了hpm_sdk的panel组件,涵盖了hpm6750和hpm6800的显示适配。

RGB

对于hpm_sdk的panel组件介绍,可以参考文章《[hpm_application]选先楫!爽跑1080P or 720Pmipi屏的单片机》

对于使用LCD硬件控制器(RGB,MIPI DSI)通信的屏幕,LCD设备驱动只需要实现LCD设备的操作方法struct rt_device_ops即可,比如control接口里更新硬件控制器的缓存区即可控制屏幕绘图。

如此一来,配合先楫适配好的RT-thread BSP,可以很顺手得适配好LCD的驱动,按先楫BSP的driver照葫芦画瓢个drv_lcd。

RGB

(三)创建LCD设备

下面来创建先楫的LCD设备。LCD设备模型从struct rt_device结构体中派生,并添加自己的私有数据。

成员主要有LCD的基地址,中断号,互斥锁,LCD名称等。

RGB

实例化一个lcd的设备数组,可以存在多个lcd设备,里面包含设备的初始化参数。

RGB

(四)实现LCD设备的操作方法

按照以上的定义,已经实例化了一个hpm_lcd_ops结构体,然后需要实现对应的操作函数,也就是LCD设备定义操作方法。对于LCD设备来说,只有其中的init和control操作方法才有意义,而本文实现的也是这两个接口,分别是hpm_lcd_init、hpm_lcd_control。

1、init:初始化LCD设备

对于该操作方法,先楫的LCD驱动代码不需要执行任何操作,只需要在注册初始化LCD即可。

RGB

2、control:控制LCD设备

应用程序也可以对LCD设备进行控制,通过control方法完成。原型如下:

RGB

其中参数cmd包含了控制LCD的方式,通用设备命令可取以下宏定义:

RGB

当然在最新的rtthread 5.0.2当中也更新了几个命令

RGB

本文在这里主要实现以下几个命令

(1)RTGRAPHIC_CTRL_RECT_UPDATE  更新显存

对于显存的更新,可以使用控制器自身定义的显存也可以使用传入的显存地址,在先楫的手册中有提到影子寄存器加载使能功能,也就是显存会在下一个VSYNC到达加载,这样可以做到显示的完整更新。

RGB

而在hpmicro的驱动中也提供了该API:lcdc_layer_set_next_buffer,这里适配的驱动使用第一层layer。

故可以下实现:

RGB

(2)RTGRAPHIC_CTRL_WAIT_VSYNC  等待帧完成

为了保证传输的高效和防撕裂,这里使用中断方式传输一帧,再下一帧更新之前等待VSYNC完毕。

RGB

(3)RTGRAPHIC_CTRL_GET_INFO  获取LCD信息

主要获取LCD的像素格式、宽高等,传递给args参数

RGB

(4)RTGRAPHIC_CTRL_POWERON 亮屏

     RTGRAPHIC_CTRL_POWEROFF  息屏

调用hpm_sdk的panel组件接口即可。

RGB

(五)注册LCD设备

使用IO设备框架的rt_device_register完成注册,主要关注设备操作方法的赋值部分,以及保存lcd设备示例赋值给lcd的user_data成员。

RGB

(六)驱动配置

在board的Kconfig中使能LCD,该宏控制LCD驱动相关代码是否添加到工程中

RGB

另外添加panel组件,该宏先楫已经实现,这里使用的是hpm6750,故只有RGB接口。

RGB

在驱动drivers的SConscript文件添加LCD驱动的判断选项,如果使能,drv_lcd.c则会被添加到工程中。

RGB

(七)驱动验证

注册设备之后,LCD设备将会在IO设备管理器中出现,我们使用hpm6750evkmini的wifi_web_camera_demo这个官方示例作为验证,烧录验证,使用list device命令查看到注册的设备已经包含了LCD设备。

RGB

在wifi_web_camera_demo的示例上,在获取camera图像的接口中,添加lcd的设备操作,把图像显示到LCD上,只需要先打开lcd,然后进行control,两条语句就可以实现显示,特别方便操作。

RGB

最终可以实现使用简单的IO设备即可操作LCD

RGB

RGB





审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分