怎样写 Linux LCD 驱动程序
基本原理
写 framebuffer 驱动程序要做什么
LCD 模块 / 驱动程序 / 控制器关于LCD 设备资料可参考如下资料:
什么是 frame buffer 设备frame buffer 设备是图形硬件的抽象,它代表了图形硬件的侦缓冲区,允许应用程序通过指定的接口访问图形硬件。因此,应用程序不必关心底层硬件细节。 设备通过特定的设备节点访问,通常在 /dev 目录下,如 /dev/fb*。 更多关于 frame buffer device 的资料可以在以下两个文件中找到: linux /Documentation/fb/framebuffer.txt 和 linux /Documentation/fb /interal.txt,但这些资料内容不多,还需要看看结合代码具体分析。 Linux Frame Buffer 驱动程序层次结构Frame Buffer 设备驱动可以从三个层次来看:
在 Linux 内核中,Frame Buffer 设备驱动的源码主要在以下两个文件中,它们处于 frame buffer 驱动体系结构的中间层,它为上层的用户程序提供系统调用,也为底层特定硬件驱动提供了接口:
数据结构头文件 fb.h 定义了所有的数据结构:
接口fbmem.c 实现了所有驱动使用的通用代码,避免了重复。 全局变量: struct fb_info *registered_fb [FB_MAX]int num_registered_fb; 这个两个变量用于记录正在使用的 fb_info 结构实例。fb_info 代表 video card 的当前状态,所有的 fb_info 结构都放在数组中。当一个 frame buffer 在内核中登记时,一个新的 fb_info 结构被加入该数组,num_registered_fb 加 1。 fb_drivers 数组: static struct {const char *name;int (*init)(void);int (*setup)(void); } fb_drivers[] __initdata= { ....}; 若 frame buffer 驱动程序是静态链接到内核中,一个新的 entry 必须要加到这个表中。 若该驱动程序是使用 insmod/rmmod 动态加载到内核,则不必关心这个结构。 static struct file_operations fb_ops ={owner: THIS_MODULE,read: fb_read,write: fb_write,ioctl: fb_ioctl,mmap: fb_mmap,open: fb_open,release: fb_release }; 这是用户应用程序的接口,fbmem.c 实现了这些函数。 register/unregister framebuffer: register_framebuffer(struct fb_info *fb_info)unregister_framebuffer(struct fb_info *fb_info) 这是底层 frame buffer 设备驱动程序的接口。驱动程序使用这对函数实现注册和撤销操作。底层驱动程序的工作基本上是填充 fb_info 结构,然后注册它。 一个 LCD controller 驱动程序实现一个 LCD controller 驱动程序主要做如下两步:
分配系统内存作为显存由于大多数 LDC controller 没有自己的显存,需要分配一块系统内存作为显存。这块系统内存的起始地址和长度之后会被存放在 fb_fix_screeninfo 的 smem_start 和 smem_len 域中。该内存应该是物理上连续的。 对于带独立显存的显卡,使用 request_mem_region 和 ioremap 将显卡外设内存映射到处理器虚拟地址空间。 实现 fb_ops 结构目前还没有讨论的 file_operations 方法是 ioctl ()。用户应用程序使用 ioctrl 系统调用操作 LCD 硬件。fb_ops 结构中定义的方法为这些操作提供支持。注意, fb_ops 结构不是 file_operations 结构。fb_ops 是底层操作的抽象,而 file_operations 为上层系统调用接口提供支持。 下面考虑需要实现哪些方法。ioctl 命令和 fb_ops 结构中的接口之间的关系如下所示: FBIOGET_VSCREENINFO fb_get_varFBIOPUT_VSCREENINFO fb_set_varFBIOGET_FSCREENINFO fb_get_fixFBIOPUTCMAP fb_set_cmapFBIOGETCMAP fb_get_cmapFBIOPAN_DISPLAY fb_pan_display 只要我们实现了那些 fb_XXX 函数,那么用户应用程序就可以使用 FBIOXXXX 宏来操作 LDC 硬件了。那怎么实现那些接口呢?可以参考下 linux/drivers/video 目录下的驱动程序。 在众多接口中, fb_set_var 是最重要的。它用于设置 video mode 等信息。下面是实现 fb_set_var 函数的通用步骤:
其中第四步是底层硬件操作。 Reference
|
怎样写 Linux LCD 驱动程序相关推荐
- Linux LCD驱动程序
LCD操作原理 在Linux系统中通过Framebuffer(简称为fb,又叫显存)驱动程序来控制LCD. Frame是帧的意思,buffer是缓冲的意思,这意味着Framebuffer就是一块内存, ...
- Linux内核 LCD 驱动程序框架
Linux 内核 LCD 驱动程序框架 1. framebuffer 简介 1.1 什么是 framebuffer 1.2 framebuffer的作用 2. framebuffer 驱动的框架 3. ...
- linux lcd驱动调试 echo dev/fb0,LCD驱动程序 - osc_msmij2gf的个人空间 - OSCHINA - 中文开源技术交流社区...
LCD驱动程序 假设 app: open("/dev/fb0", ...) 主设备号: 29, 次设备号: 0 kernel: fb_open int fbidx = iminor ...
- Linux系统驱动之分析内核自带的LCD驱动程序_基于IMX6ULL
百问网技术交流群,百万嵌入式工程师聚集地: https://www.100ask.net/page/2248041 资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone ...
- 自己写Linux Usb鼠标驱动程序
USB子系统相关内容参考<精通Linux设备驱动程序>第11章. USB鼠标驱动程序可以参考内核中的鼠标驱动,路径为linux-3.0.86\drivers\hid\usbhid\usbm ...
- Linux LCD 驱动实验
目录 Linux 下LCD 驱动简析 1 Framebuffer 设备 LCD 驱动简析 硬件原理图分析 LCD 驱动程序编写 运行测试 LCD 屏幕基本测试 设置LCD 作为终端控制台 LCD 背光 ...
- arm裸机与嵌入式linux驱动开发,如何编写基于ARM的裸机程序和基于Linux的驱动程序?...
在嵌入式开发中,ADC应用比较频繁,本文主要讲解ADC的基本原理以及如何编写基于ARM的裸机程序和基于Linux的驱动程序. ARM架构:Cortex-A9Linux内核:3.14 在讲述ADC之前, ...
- 七 linux LCD驱动代分析
LCD驱动分析 原文地址: http://blog.csdn.net/woshidahuaidan2011/article/details/52054795 1.对LCD驱动添加设备信息 对lcd驱动 ...
- Linux LCD屏幕驱动调参实操
Linux LCD屏幕驱动调参实操 初探 Linux下的 LCD 驱动文中提到过, IMX6ULL的 eLCDIF接口驱动程序已经有半导体厂家NXP编写好了,并且不同分辨率LCD屏的eLCDIF接口驱 ...
- 嵌入式驱动编写-LCD驱动程序
如何来写LCD的驱动程序,首先 看芯片开发手册和原理图 根据原理图,找到s3c2440的GPIO控制管脚,gpb gpc gpd gpg管脚控制 需要设置寄存器 以及设置LCD控制寄存器 查看 ...
最新文章
- MySQL InnoDB锁
- 64位jvm的指针膨胀 和 数据补白
- db2分页查询语句优化_面试官:数据量很大,分页查询很慢,怎么优化?
- jsp 跳到servlet路径_想打开一个jsp的页面就跳转到servlet中去,并向servlet传值。用什么跳转...
- python图形编程复选按钮和单选按钮详细说明_Python_tkinter_单选框(Radiobutton)与复选框(Checkbutton)...
- 新一代Notebook神器出现,Jupyter危险了!
- Python随机数生成方法
- ROS底盘控制节点 源码分析
- JQuery修改background-image背景图片
- Mysql学习总结(18)——Mysql主从架构的复制原理及配置详解
- congestion report解读
- 我在华为外包一年的经历分享。
- jersey restful 测试_Jersey实现Restful服务
- WINCE 矩阵键盘 介绍
- 试题 算法提高 字符串跳步
- vue在调用摄像头扫码(vue-qrcode-reader)
- 华为mate7android版本,华为Mate7升级安卓6.0(EMUI4.0)M版本详细图文教程
- ᑋᵉᑊᑊᵒ ᵕ̈ᰔᩚ
- 蓝桥杯 核桃的数量(python)
- python如何写生日快乐说说_抖音上很火的生日句子,适合过生日发的高逼格
热门文章
- 线性判别分析LDA解析2
- android studio for android learning (五) 最新Activity理解与其生命周期
- android studio for android learning (四) 兼容性问题
- mysql 存储过程 高并发_解决数据库高并发常见方案
- springboot(运行原理参考借鉴)
- [MySQL]触发器
- 【转】navicat远程连接mysql,2003 can't connect to mysql server on 10038
- struts2远程命令执行漏洞S2-045
- jQuery2.x源码解析(设计篇)
- PYTHON之路(九)