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

网友投稿 1147 2022-05-29

练习:

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寸

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

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 #include #include #include #include #include #include /* 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");

linux

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:redis——旧版复制
下一篇:面向对象-抽象类和抽象方法及练习
相关文章