LCD的驱动方法技术

技术编号:38987926 阅读:18 留言:0更新日期:2023-10-07 10:18
本发明专利技术涉及一种LCD的驱动方法,包括如下步骤:在内核空间为LCD开辟一块内存,使该内存与LCD的像素一一对应;通过内核定时器以固定的频率启动DMA,使DMA将内存中的数据搬到LCD屏幕,完成并定期更新送显操作。本发明专利技术解决了嵌入式设备低成本LCD屏幕显示不稳定的问题,使设备显示可以稳定运行在恶劣的电磁环境下,并成功通过设备的电磁兼容认证测试。本发明专利技术简化了LCD驱动的操作流程,更加易于用户操作且灵活,用户只需要去关心内存数据的修改,而不需要考虑显示数据到LCD的传输问题。同时降低了LCD显示的CPU占有率。了LCD显示的CPU占有率。了LCD显示的CPU占有率。

【技术实现步骤摘要】
LCD的驱动方法


[0001]本专利技术涉及低成本嵌入式设备显示
,具体涉及LCD的驱动方法。

技术介绍

[0002]随着越来越多的硬件在Linux中接入,Linux系统对硬件生态的支持越来越完善。以至于我们在定制好硬件板卡以后,直接使用Linux的menuconfig就可以定制板卡的相关驱动。但Linux内核中的驱动支持有几个特点,一是偏向于高端硬件,如网卡、显卡,另一个特点是偏向于大厂,如intel、AMD、NVIDIA等。但是在工控领域的实际应用中,会有一些不同的需求。一些中低端的工控设备具有很大的出货量,如物联网网关、电力网关等设备。这就导致这类设备更在意元器件的硬件成本。以物联网网关为例,它的主要作用是网络通信,而人机交互功能则要求比较简单。这时如果使用NVIDIA的显卡去做图形显示,那么对于数以亿计的产品生产来说显然是得不偿失的。
[0003]目前一些低成本LCD的产品方案主要是LCD控制器+LCD面板的的结构。LCD控制器一般采用串行总线或者并行总线的接口与MPU通信。MPU将要显示的数据通过总线发送给控制器。控制器通过硬件电路的电平变化控制LCD面板的色度以及内容。目前在Linux系统下的LCD屏幕的驱动程序有以下问题:1、操作繁琐,浪费CPU资源。想要进行字符显示,首先需要从字库中查找字符编码,计算出字符对应的地址,最后寻址并发送。根据显示内容,会重复多次这个流程。
[0004]2、容易受到干扰,造成显示乱码。驱动程序将要显示数据传输给控制器,控制器操作电平将数据显示出来。在这期间,如果受到电磁干扰就会造成本次流程失败。事实上嵌入式设备工作的电磁环境比较恶劣,经常会有LCD显示“花屏”的现象出现。

技术实现思路

[0005]为了针对低成本的嵌入式设备提供一种低成本的LCD显示方案,本专利技术提供了一种LCD的驱动方法,包括如下步骤:步骤S1:在内核空间为LCD开辟一块内存,使该内存与LCD的像素一一对应;步骤S2:通过内核定时器以固定的频率启动DMA,使DMA将内存中的数据搬到LCD屏幕,完成并定期更新送显操作。
[0006]其中,所述步骤S1包括:步骤S11:在内核设备树中spi节点下新增一个LCD设备,然后在内核模块中增加对应的驱动,以便系统启动时发现设备树中的设备名称和内核模块中的驱动名称匹配时会自动调用probe函数;步骤S12:在probe函数中注册一个spi_device,建立供应用层调动的设备节点,完成LCD硬件的初始化操作,使LCD像素与disram数组一一对应。
[0007]其中,所述步骤S2包括:步骤S21:在probe函数中注册一个定时器,设置probe函数指针指向定时器的超时
回调函数;步骤S22:将disram数组静态内存映射为DMA的数据缓冲区;步骤S23:配置DMA的参数,使其传输方向由内存指向spi设备;步骤S24:在定时器的超时回调函数中启动一次DMA传输,使内核将数据填充到disram数组中,完成一次显示操作,之后使用DMA中断通知CPU。
[0008]本专利技术提供的LCD驱动方法,解决了嵌入式设备低成本LCD屏幕显示不稳定的问题,使设备显示可以稳定运行在恶劣的电磁环境下,并成功通过设备的电磁兼容认证测试。本专利技术简化了LCD驱动的操作流程,更加易于用户操作且灵活,用户只需要去关心内存数据的修改,而不需要考虑显示数据到LCD的传输问题。同时降低了LCD显示的CPU占有率。
附图说明
[0009]图1:本专利技术的LCD驱动方法所涉及到的内核显存与LCD像素映射的逻辑原理图。
具体实施方式
[0010]为了对本专利技术的技术方案及有益效果有更进一步的了解,下面结合附图详细说明本专利技术的技术方案及其产生的有益效果。
[0011]本专利技术的总体思路为,在Linux内核空间中为LCD开辟一块内存,使该内存与LCD的像素一一对应。同时建立DMA流式映射,通过内核定时器以固定的频率去启动DMA,DMA将内存中的数据搬移到LCD屏幕。这样用户如果想修改某处显示,直接修改与之对应的内存就可以,DMA会保证数据正确到达屏幕。同时内核定时器以固定的频率重复启动DMA,保证了LCD可以被动态刷新。这样即使遇到电磁干扰也可以肉眼察觉不到的速度恢复。
[0012]本专利技术以armv7架构,Linux

4.19内核,以及TG160160B的LCD屏幕为例,TG160160B是一款低成本的LCD,其LCD控制器为ST75161,通信接口为串行总线spi(串行外围设备接口协议)。TG160160B采用的是被动矩阵技术,即在液晶屏幕上设置一组交错排列的透明导电线(称为行线)和另一组垂直于行线排列的透明导电线(称为列线),通过对行线和列线施加不同的电压信号来控制液晶分子的旋转和扭曲,从而实现像素的开关控制。
[0013]每个像素点由交叉点上的液晶分子控制,当所在的行线和列线施加的电压信号相同时,液晶分子会旋转或扭曲,使光线透过,显示为亮点;反之,当电压信号不同时,液晶分子不旋转或扭曲,光线被阻隔,显示为暗点。TG160160B屏幕有160行和160列的像素,因此共有25600个像素点,每个像素点可以显示两种状态(亮或暗),从而实现黑白图像的显示。
[0014]具体的实现方式如下:1、在Linux内核中开辟显存首先在Linux内核设备树中spi节点下增加一个LCD设备,然后在内核模块中增加对应的驱动driver。这样当系统启动时发现设备树中的设备名称和内核模块中的驱动名称匹配时会自动调用probe函数。probe函数中注册一个spi_device,建立设备节点,供应用层调用,最后完成LCD硬件的初始化操作。
[0015]以最简单的单色度(只有黑白色)为例,使用1个bit代表一个像素点(相应的四级灰度的则需要2个bit表示一个像素)。那么对于160*160个像素,使用一个u8类型的二维数组disram[20][160]来表示如图1所示。每个数组元素为8位,所以对应就是(20*8)*160个
bit,正好与LCD的像素一一对应。
[0016]驱动程序通过copy_from_user函数将应用层经过字符转换过的数据拷贝到内核层。内核根据显示规则,将数据填入到disram数组中,驱动返回,执行完一次显示操作。
[0017]2、内核定时器调用DMA刷新LCD2

1、在probe函数中调用init_timer注册一个定时器。其中expires值为1/500 HZ,也就是定时时间为2ms,对应DMA的刷新频率为500HZ。设置函数指针指向定时器的超时回调函数。
[0018]2‑
2、采用流式DMA映射(dma_map_single)将disram[20][160]静态内存映射为DMA的数据缓冲区。
[0019]2‑
3、配置DMA控制器和通道,指定传输方向、传输大小、DMA缓冲区地址等参数。其中传输方向是从内存到spi设备,传输大小为32本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种LCD的驱动方法,其特征在于,包括如下步骤:步骤S1:在内核空间为LCD开辟一块内存,使该内存与LCD的像素一一对应;步骤S2:通过内核定时器以固定的频率启动DMA,使DMA将内存中的数据搬到LCD屏幕,完成并定期更新送显操作。2.如权利要求1所述的LCD的驱动方法,其特征在于,所述步骤S1包括:步骤S11:在内核设备树中spi节点下新增一个LCD设备,然后在内核模块中增加对应的驱动,以便系统启动时发现设备树中的设备名称和内核模块中的驱动名称匹配时会自动调用probe函数;步骤S12:在probe函数中注册一个spi_device...

【专利技术属性】
技术研发人员:张云飞黄磊齐璇战茅
申请(专利权)人:麒麟软件有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1