RT-Thread设备驱动开发指南进阶篇--动手驱动先楫LCD外设

02/23 20:32
阅读数 10


一、概述


经过上一篇的《《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




———————End——————



👇 点击阅读原文进入官网

本文分享自微信公众号 - RTThread物联网操作系统(RTThread)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部