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");
- 点赞
- 收藏
- 关注作者
评论(0)