博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
omap 的framebuffer驱动程序
阅读量:4074 次
发布时间:2019-05-25

本文共 3252 字,大约阅读时间需要 10 分钟。

 
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.ccore.c中定义了platform_driverstatic 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/ueventmodaliassubsystempowerdrivermanager0manager1overlay0overlay1overlay2microamps_requested_vdda_dacdisplay2display1display0----------------------------------------------------overlay0目录中为基本显示层的信息overlay1和overlay2分别目录中分别是两个叠加显示层的信息manager0和manager1中则提供了管理方面的功能查看sys文件系统/ # cat sys/devices/platform/omapdss/overlay0/name gfxgfx为graphics的含义,表示overlay0的名称为图形层,文件enable是一个可又控制的# echo 0 > sys/devices/platform/omapdss/overlay0/enabled 关屏# echo 1 > sys/devices/platform/omapdss/overlay0/enabled 开屏4. 主显示驱动的framebufferdrivers/video/omap2/omapfbomafb.c, omapfb-sysfs.c, omapfb-ioctl.c, omapfb-main.comapfb-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]);//初始化	//注册framebuffer	for (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,*/};

转载地址:http://axkni.baihongyu.com/

你可能感兴趣的文章
C语言中的 (void*)0 与 (void)0
查看>>
vu 是什么
查看>>
io口的作用
查看>>
IO口的作用
查看>>
UIView的使用setNeedsDisplay
查看>>
归档与解归档
查看>>
Window
查看>>
为什么button在设置标题时要用一个方法,而不像lable一样直接用一个属性
查看>>
字符串的截取
查看>>
2. Add Two Numbers
查看>>
17. Letter Combinations of a Phone Number (DFS, String)
查看>>
93. Restore IP Addresses (DFS, String)
查看>>
19. Remove Nth Node From End of List (双指针)
查看>>
49. Group Anagrams (String, Map)
查看>>
139. Word Break (DP)
查看>>
Tensorflow入门资料
查看>>
剑指_用两个栈实现队列
查看>>
剑指_顺时针打印矩阵
查看>>
剑指_栈的压入弹出序列
查看>>
剑指_复杂链表的复制
查看>>