Linux驱动开发_帧缓冲设备驱动与LCD应用编程

举报
DS小龙哥 发表于 2022/04/28 23:46:58 2022/04/28
【摘要】 介绍Linux下帧缓冲驱动框架结构、完成帧缓冲驱动编写、安装、测试、封装画点函数、完成对LCD编程。

练习:

1.​ 等待队列、poll函数驱动、异步IO驱动写一次。

2.​ poll函数支持多路复用: 将按键驱动拆分成4个驱动,在应用层使用一个poll函数同时监控4个按键驱动,并读出按键值。 类似的函数: select、epoll

只要涉及到输入基本都会使用: socket网络编程、鼠标驱动、键盘驱动、触摸屏驱动……..


任务1: 帧缓冲结构(FrameBuffer框架)

帧缓冲--->显卡驱动框架---->LCD屏。


​ 帧缓冲驱动框架图:

帧缓冲框架传输数据方式:

LCD屏控制最重要的函数: 画点函数。形参: (x、y、颜色)

帧缓冲驱动框架里与应用传递数据使用了内存映射: mmap()。


STM32里的屏幕:

1.​ LCD屏驱动芯片采用NT35310驱动芯片

2.​ 屏幕的尺寸: 3.5寸

3.​ 分辨率: 320*480

4.​ 时序: 8080时序。 常用的时序: 6800时序、RGB时序。

5.​ 在STM32分为(小、中、大),在大容量里有FSMC控制器。

FSMC控制器: 静态内存控制器,原本是用来控制外部SRAM芯片。

由于部SRAM芯片使用也是8080时序,才可以操作LCD屏。


帧缓冲驱动框架编写框架:


在应用mmap函数将驱动的DMA缓冲区地址映射到进程空间之后,如何控制LCD呢?

需要封装一个画点函数。


任务2: 编写一个帧缓冲驱动(框架)


任务3: 分析开发板自带的LCD驱动(三星公司编写)

三星公司编写文件: s3c_xxxx开头。

当前4412开发板的LCD驱动是使用平台设备编写

什么是平台设备总线? 是现在内核里编写驱动通用框架。

平台设备分为设备端驱动端

练习:

1.​ 理解一下帧缓冲驱动框架的原理。

2.​ 编写一个简单的帧缓冲测试框架,编写应用层测试一下。

3.​ 学习一下基本LCD屏应用编程: 如何封装画点函数、显示一个ASCII码字符串或者中文字符串。

4.​ 调用中文字库,实现基本中文显示。

5.​ 显示一张BMP图片。

扩展练习: 小说阅读器。 可以打开一个指定txt文件,将文件里的文本显示在屏幕上,按键翻页。

项目: 数码相框。

1.​ 打开指定的目录: 存放BMP图片的目录。

2.​ 通过按键控制LCD屏翻页显示(上一张和下一张)。

3.​ 在显示屏上显示图片的信息:



LCD帧缓冲框架代码编写:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/miscdevice.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/io.h>
#include <linux/fb.h>

/*
struct fb_var_screeninfo var;	///可变参数
struct fb_fix_screeninfo fix;	///固定参数
*/

static int tiny4412_fb_open(struct fb_info *info, int user)
{
	printk("tiny4412_fb_open ok!\n");
	return 0;
}

static int tiny4412_fb_release(struct fb_info *info, int user)
{
	printk("tiny4412_fb_release ok!\n");
	return 0;
}

static int tiny4412_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
{
	printk("tiny4412_fb_mmap ok!\n");
	return 0;
}

static struct fb_ops tiny4412_fbops=
{
	.fb_open=tiny4412_fb_open,
	.fb_release=tiny4412_fb_release,
	.fb_mmap=tiny4412_fb_mmap
};

/*保存使LCD屏硬件信息*/
static struct fb_info tiny4412_fb_info=
{
	.var=
	{
		.xres=800,
		.yres=480,
		.bits_per_pixel=24
	},
	.fix=
	{
		.smem_len=800*480*3,
		.line_length=800*3
	},
	.fbops=&tiny4412_fbops
};

static int __init tiny4412_frame_dev_init(void) 
{
	/*注册帧缓冲设备*/
	register_framebuffer(&tiny4412_fb_info);
	printk("LCD:驱动安装成功!\n"); /*提示语句*/
	return 0;
}

static void __exit tiny4412_frame_dev_exit(void) 
{
	/*注销帧缓冲设备*/
	unregister_framebuffer(&tiny4412_fb_info);
	printk("LCD:驱动卸载成功!\n");
}

module_init(tiny4412_frame_dev_init);
module_exit(tiny4412_frame_dev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("tiny4412 wbyq");


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。