一、概述
经过上一篇的《《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,定义了像素格式,位宽,宽高、显存地址等。
LCD的操作接口rt_device_graphic_ops,定义了LCD的绘图操作,比如像素点、画线等操作。
LCD的控制命令,比如更新显存、开关LCD、获取信息、等待VSYNC等。
LCD的像素格式
可见,RT-thread对于LCD的抽象操作还是比较直观,完成以上的操作,再借助IO设备管理层提供的注册接口rt_device_register进行注册,即可使用IO设备管理接口操作LCD。
(二)先楫LCDC外设介绍
对于先楫的LCDC外设硬件控制器
在HPM6750上有RGB控制器,支持24位的RGB显示接口
在HPM6800上,支持2 个 4 Lane MIPI-DSI/LVDS-Tx 显示接口
对于在RT-thread上,也支持了hpm_sdk的panel组件,涵盖了hpm6750和hpm6800的显示适配。
对于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。
(三)创建LCD设备
下面来创建先楫的LCD设备。LCD设备模型从struct rt_device结构体中派生,并添加自己的私有数据。
成员主要有LCD的基地址,中断号,互斥锁,LCD名称等。
实例化一个lcd的设备数组,可以存在多个lcd设备,里面包含设备的初始化参数。
(四)实现LCD设备的操作方法
按照以上的定义,已经实例化了一个hpm_lcd_ops结构体,然后需要实现对应的操作函数,也就是LCD设备定义操作方法。对于LCD设备来说,只有其中的init和control操作方法才有意义,而本文实现的也是这两个接口,分别是hpm_lcd_init、hpm_lcd_control。
1、init:初始化LCD设备
对于该操作方法,先楫的LCD驱动代码不需要执行任何操作,只需要在注册初始化LCD即可。
2、control:控制LCD设备
应用程序也可以对LCD设备进行控制,通过control方法完成。原型如下:
其中参数cmd包含了控制LCD的方式,通用设备命令可取以下宏定义:
当然在最新的rtthread 5.0.2当中也更新了几个命令
本文在这里主要实现以下几个命令
(1)RTGRAPHIC_CTRL_RECT_UPDATE 更新显存
对于显存的更新,可以使用控制器自身定义的显存也可以使用传入的显存地址,在先楫的手册中有提到影子寄存器加载使能功能,也就是显存会在下一个VSYNC到达加载,这样可以做到显示的完整更新。
而在hpmicro的驱动中也提供了该API:lcdc_layer_set_next_buffer,这里适配的驱动使用第一层layer。
故可以下实现:
(2)RTGRAPHIC_CTRL_WAIT_VSYNC 等待帧完成
为了保证传输的高效和防撕裂,这里使用中断方式传输一帧,再下一帧更新之前等待VSYNC完毕。
(3)RTGRAPHIC_CTRL_GET_INFO 获取LCD信息
主要获取LCD的像素格式、宽高等,传递给args参数
(4)RTGRAPHIC_CTRL_POWERON 亮屏
RTGRAPHIC_CTRL_POWEROFF 息屏
调用hpm_sdk的panel组件接口即可。
(五)注册LCD设备
使用IO设备框架的rt_device_register完成注册,主要关注设备操作方法的赋值部分,以及保存lcd设备示例赋值给lcd的user_data成员。
(六)驱动配置
在board的Kconfig中使能LCD,该宏控制LCD驱动相关代码是否添加到工程中
另外添加panel组件,该宏先楫已经实现,这里使用的是hpm6750,故只有RGB接口。
在驱动drivers的SConscript文件添加LCD驱动的判断选项,如果使能,drv_lcd.c则会被添加到工程中。
(七)驱动验证
注册设备之后,LCD设备将会在IO设备管理器中出现,我们使用hpm6750evkmini的wifi_web_camera_demo这个官方示例作为验证,烧录验证,使用list device命令查看到注册的设备已经包含了LCD设备。
在wifi_web_camera_demo的示例上,在获取camera图像的接口中,添加lcd的设备操作,把图像显示到LCD上,只需要先打开lcd,然后进行control,两条语句就可以实现显示,特别方便操作。
最终可以实现使用简单的IO设备即可操作LCD
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !