第7章 Linux LCD编程
7.1
LCD操作原理
在Linux系统中通过Framebuffer驱动程序来控制LCD。Frame是帧的意思,buffer是缓冲的意思,这意味着Framebuffer就是一块内存,里面保存着一帧图像。Framebuffer中保存着一帧图像的每一个像素颜色值,假设LCD的分辨率是1024x768,每一个像素的颜色用32位来表示,那么Framebuffer的大小就是:1024x768x32/8=3145728字节。
简单介绍LCD的操作原理:
① 驱动程序设置好LCD控制器:
根据LCD的参数设置LCD控制器的时序、信号极性。
根据LCD分辨率、BPP分配Framebuffer。
② APP使用ioctl获得LCD分辨率、BPP。
③ APP通过mmap映射Framebuffer,在Framebuffer中写入数据。
图7.1 LCD操作原理示意图
假设需要设置LCD中坐标(x,y)处像素的颜色,首要要找到这个像素对应的内存,然后根据它的BPP值设置颜色。假设fb_base是APP执行mmap后得到的Framebuffer地址,如错误!未找到引用源。所示:
7.2 framebuffer映射地址
可以用以下公式算出(x,y)坐标处像素对应的Framebuffer地址:
(x,y)像素起始地址=fb_base+(xres*bpp/8)*y + x*bpp/8
最后一个要解决的问题就是像素的颜色怎么表示。它是用RGB三原色(红、绿、蓝)来表示的,在不同的BPP格式中,用不同的位来分别表示R、G、B,如错误!未找到引用源。所示:
图7.3 RGB三种格式
对于32BPP,一般只设置其中的低24位,高8位表示透明度,一般的LCD都不支持。
对于24BPP,硬件上为了方便处理,在Framebuffer中也是用32位来表示,效果跟32BPP是一样的。
对于16BPP,常用的是RGB565;很少的场合会用到RGB555,这可以通过ioctl读取驱动程序中的RGB位偏移来确定使用哪一种格式。
7.2
Framebuffer编程接口
本节程序的目的是:打开LCD设备节点,获取分辨率等参数,映射Framebuffer,最后实现描点函数。会涉及open、ioctl、mmap三个系统调用函数。
在前面已经讲过open函数,不再赘述。
对于ioctl函数,在Ubuntu中执行“man ioctl”,可以看到它的说明:
图7.4 man查看ioctl函数
头文件:
函数原型:
int ioctl(int fd, unsigned long request, ...);
函数说明:
① fd表示文件描述符。
② request表示与驱动程序交互的命令,用不同的命令控制驱动程序输出我们需要的数据。
③ …表示可变参数arg,根据request命令,设备驱动程序返回输出的数据。
④ 返回值:打开成功返回文件描述符,失败将返回-1。
ioctl的作用非常强大灵活。不同的驱动程序内部会实现不同的ioctl,APP可以使用各种ioctl跟驱动程序交互:可以传数据给驱动程序,也可以从驱动程序中读出数据。
对于mmap函数,在Ubuntu中执行“man mmap”,可以看到它的说明:
图7.5 man查看mmap函数
头文件:
函数原型:
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
函数说明:
① addr表示指定映射的內存起始地址,通常设为NULL表示让系统自动选定地址,并在成功映射后返回该地址。
② length表示将文件中多大的内容映射到内存中。
③ prot表示映射区域的保护方式,可以为以下4种方式的组合:
PROT_EXEC映射区域可被执行
PROT_READ映射区域可被读出
PROT_WRITE映射区域可被写入
PROT_NONE映射区域不能存取
④ Flags表示影响映射区域的不同特性,常用的有以下两种:
MAP_SHARED表示对映射区域写入的数据会复制回文件内,原来的文件会改变。
MAP_PRIVATE表示对映射区域的操作会产生一个映射文件的复制,对此区域的任何修改都不会写回原来的文件内容中。
⑤ 返回值:若成功映射,将返回指向映射的区域的指针,失败将返回-1。
如您在使用瑞萨MCU/MPU产品中有任何问题,可识别下方二维码或复制网址到浏览器中打开,进入瑞萨技术论坛寻找答案或获取在线技术支持。
https://community-ja.renesas.com/zh/forums-groups/mcu-mpu/
未完待续
推荐阅读
Linux I2C设备访问方法 - RZ MPU工业控制教程连载(9)
用户态接口应用与编写APP - RZ MPU工业控制教程连载(10)
Linux SPI协议介绍与访问方法 - RZ MPU工业控制教程连载(11)