omap 的framebuffer驱动程序

2023-12-10 19:58

本文主要是介绍omap 的framebuffer驱动程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.帧缓冲的基本原理
通过 framebuffer ,应用程序用 mmap 把显存映射到应用程序虚拟地址空间,将要显示的数据写入这个内存空间就可以在屏幕上显示出来; 
驱动程序分配系统内存作为显存;实现 file_operations 结构中的接口,为应用程序服务;实现 fb_ops 结构中的接口,控制和操作 LCD 控制器; 
驱动程序将显存的起始地址和长度传给 LCD 控制器的寄存器 (一般由 fb_set_var 完成) 。 LCD 控制器会自动的将显存中的数据显示在 LCD 屏上。
2.
register_framebuffer(struct fb_info *fb_info)
unregister_framebuffer(struct fb_info *fb_info)
底层驱动程序的工作基本上是填充 fb_info 结构,然后注册它
3. OMAP 的 DSS显示
DSS(Display sub system)显示子系统
显示子系统的库在drivers/video/omap2/dss目录中,主要包含了
core.c, dispc.c, display.c, dpi.c, dss.c ,manager.c omapdss.c, overlay.c venc.c
core.c中定义了platform_driver
static struct platform_driver omap_dss_driver = {
.driver         = {.name   = "omapdss",.owner  = THIS_MODULE,},
}
它和arch/arm/mach-omap2中定义的平台设备相匹配
static struct platform_device my_dss_device = {.name          = "omapdss",.id            = -1,.dev            = {.platform_data = &my_dss_data,},
};
文件系统的信息包含在以下目录中
/ # ls sys/devices/platform/omapdss/
uevent
modalias
subsystem
power
driver
manager0
manager1
overlay0
overlay1
overlay2
microamps_requested_vdda_dac
display2
display1
display0
----------------------------------------------------
overlay0目录中为基本显示层的信息
overlay1和overlay2分别目录中分别是两个叠加显示层的信息
manager0和manager1中则提供了管理方面的功能
查看sys文件系统
/ # cat sys/devices/platform/omapdss/overlay0/name 
gfx
gfx为graphics的含义,表示overlay0的名称为图形层,文件enable是一个可又控制的
# echo 0 > sys/devices/platform/omapdss/overlay0/enabled 关屏
# echo 1 > sys/devices/platform/omapdss/overlay0/enabled 开屏
4. 主显示驱动的framebuffer
drivers/video/omap2/omapfb
omafb.c, omapfb-sysfs.c, omapfb-ioctl.c, omapfb-main.c
omapfb-main.c定义了platform_driver
#define MODULE_NAME	"omapfb"
static struct platform_driver omapfb_driver = {.probe		= omapfb_probe,.remove		= omapfb_remove,.suspend	= omapfb_suspend,.resume		= omapfb_resume,.driver		= {.name	= MODULE_NAME,.owner	= THIS_MODULE,},
};
与arch/arm/plat-omap/fb.c中的platform_device相匹配
static struct platform_device omap_fb_device = {.name		= "omapfb",.id		= -1,.dev = {.dma_mask		= &omap_fb_dma_mask,.coherent_dma_mask	= ~(u32)0,.platform_data		= &omapfb_config,},.num_resources = 0,
};
omapfb-main.c的调用
static int omapfb_probe(struct platform_device *pdev)
{struct omapfb2_device *fbdev = NULL;omapfb_create_framebuffers(fbdev);/*调用 framebuffer_alloc 为fb_info结构体分配内存*/
}
static int omapfb_create_framebuffers(struct omapfb2_device *fbdev)
{struct fb_info *fbi;struct omapfb2_device *fbdev = NULL;fbdev = kzalloc(sizeof(struct omapfb2_device), GFP_KERNEL);fbi = framebuffer_alloc(sizeof(struct omapfb_info),fbdev->dev);...omapfb_fb_init(fbdev, fbdev->fbs[i]);//初始化//注册framebufferfor (i = 0; i < fbdev->num_fbs; i++) {r = register_framebuffer(fbdev->fbs[i]);return r;}
}
static int omapfb_fb_init(struct omapfb2_device *fbdev, struct fb_info *fbi)
{fbi->fbops = &omapfb_ops;
}static struct fb_ops omapfb_ops = {.owner          = THIS_MODULE,.fb_open        = omapfb_open,.fb_release     = omapfb_release,.fb_fillrect    = cfb_fillrect,.fb_copyarea    = cfb_copyarea,.fb_imageblit   = cfb_imageblit,.fb_blank       = omapfb_blank,.fb_ioctl       = omapfb_ioctl,.fb_check_var   = omapfb_check_var,.fb_set_par     = omapfb_set_par,.fb_pan_display = omapfb_pan_display,.fb_mmap	= omapfb_mmap,.fb_setcolreg	= omapfb_setcolreg,.fb_setcmap	= omapfb_setcmap,/*.fb_write	= omapfb_write,*/
};


这篇关于omap 的framebuffer驱动程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/478190

相关文章

C#通过ACE OLEDB驱动程序访问 Access和 Excel

ACE 代表 Access Connectivity Engine。它是 Microsoft 提供的一组组件,用于访问和操作 Microsoft Access 数据库以及其他类似的文件格式,如 Excel 工作簿。ACE 主要包括以下几部分: ACE OLEDB 驱动程序:用于通过 OLE DB 提供程序访问 Access 数据库和 Excel 文件。例如,Microsoft.ACE.OLED

随手记(2)-java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序

问题描述: 在使用Java连接access数据的.mdb文件时候程序报如下错误 java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序     错误原因: 在win7 office2013下报错 解决方法:  查看Java桥连程序连接字符串是否写成{Microsoft Access Driver (*.m

如何检查电脑驱动程序

PC电脑有很多选择,从键盘到硬盘,还有众多的内部和外围组件,使您的PC。每个硬件需要驱动程序。驱动程序帮助与硬件上的软件进行通信。如果没有驱动程序时,Windows不会告发' T是能够发送和接收命令到新的打印机你有,这是很容易被发现他们在你的系统设置来检查这些驱动程序。找到他们,并找出如果你需要任何更新。微动力电脑教程 说明 一 在您的桌面菜单左下角选择“开

DMA驱动程序编写

一.  DMA的引入     假设我们让2440来拷贝一段数据, 从内存的src拷贝到dst,拷贝的长度为size. char *src = AAA; char *dst = BBB; int i; for (i = 0; i <size; i++)     dst[i] = src[i];     这写出来的代码是让cpu来执行数据的拷贝工作, 显然,cpu在执行这个过程中,同一

虹科技术|全新Linux环境PCAN驱动程序发布!CAN/CAN FD通信体验全面升级!

全新8.17.0版本的PCAN-Linux驱动程序正式发布,专为CAN和CAN FD接口量身打造。无论是CAN 2.0 a/b还是CAN FD的PCAN硬件产品,都能在我们的新驱动下“驰骋自如”。想要体验字符模式设备驱动接口(chardev)的便捷,还是SocketCAN设备驱动接口(netdev)的高效?都由您说了算! 新版本驱动包概览 1、设备驱动程序模块源代码及Makefil

Linux串口驱动程序(5)-串口接收分析

1、tty数据接收流程分析 在用户调用read函数来读取设备的文件的数据时,首先得到响应的是tty_read,这个函数又是由n_tty_read来实现的   /*** n_tty_read - read function for tty* @tty: tty device* @file: file object* @buf: userspace buffer pointer* @nr:

Linux串口驱动程序(4)-串口发送分析

1、tty数据发送调用关系 怎么样才能找到发送数据所使用的函数呢?打开uart_register_driver函数,找到里面的tty_register_driver,转到定义,这里调用了tty_fops这个结构,这几结构里就保存了读写串口的函数tty_write:   static const struct file_operations tty_fops = {.llseek = no_

Linux串口驱动程序(3)-串口打开分析

先来分析一下串口打开的过程: 1、用户调用open函数打开串口设备文件 2、在内核中通过tty子系统,把open操作层层传递到串口驱动程序中 3、在串口驱动程序中的XX_open最终实现这个操作。   这里主要有2个点需要我们重点分析,一个是open函数的传递过程,而是串口驱动程序XXX_open函数的实现。 1、open函数传递 打开uart_register_driver函数,里

Linux串口驱动程序(1)-tty架构

1、tty概念分析 在Linux系统中,终端是一类字符型设备,它包括多种类型,通常使用tty来简称各种类型的终端设备。由于串口也是一种终端,因此这里引入终端这个概念     串口终端(/dev/ttyS*) 串口终端是使用计算机串口连接的终端设备。Linux把每个串行端口都看作是一个字符设备。这些串行端口所对应的设备名称是 /dev/ttySAC0;/dev/ttySAC1…

Linux字符设备驱动程序开发(3)-LED驱动程序设计

1、设备控制理论 控制理论-作用 大部分驱动程序除了需要提供读写设备的能力外,还需要具备控制设备的能力。比如: 改变波特率。 设备控制-应用函数 在用户空间,使用ioctl系统调用来控制设备,原型如下: int ioctl(int fd,unsigned long cmd,...)fd: 要控制的设备文件描述符cmd: 发送给设备的控制命令…: 第3个参数是可选的参数,存在与否是