【Linux】内核驱动学习笔记(二)

7、framebuffer驱动详解

7.1、什么是framebuffer

(1)裸机中如何操作LCD

(2)OS下操作LCD的难点

(3)framebuffer帧缓冲(简称fb)是linux内核中虚拟出的一个设备

(4)framebuffer向应用层提供一个统一标准接口显示设备

(5)从驱动来看,fb是一个典型的字符设备,而且创建了一个类/sys/class/graphics

framebuffer的使用:

(1)设备文件 /dev/fb0

(2)获取设备信息 #include <linux/fb.h>

(3)mmap做映射

(4)填充framebuffer

7.2、framebuffer应用编程实践

1、打开设备

2、获取设备信息

(1)不可变信息FSCREENINFO,使用ioctl的FBIOGET_FSCREENINFO名

(2)可变信息VSCREENINFO,使用ioctl的FBIOGET_VSCREENINFO名

3、mmap做映射

做完了mmap后fb在当前进程中就已经就绪了,随时可以去读写LCD显示器了。

4、fb显示之刷背景

5、设置分辨率

(1)实验失败,实验结果是只能修改虚拟分辨率,不能修改可视分辨率 。原因要去驱动里找。

(2)正确的做法是在驱动中去修改参数,然后重新编译运行,才能解决。

6、写字、画线、图片显示等

7.3、framebuffer驱动框架总览

7.3.1、framebuffer驱动框架部分

(1)drivers/video/fbmem.c 。主要任务:1、创建graphics类、注册FB的字符设备驱动、提供register_framebuffer接口给具体framebuffer驱动编写着来注册fb设备的。本文件相对于fb来说,地位和作用和misc.c文件相对于杂散类设备来说一样的,结构和分析方法也是类似的。
(2)drivers/video/fbsys.c 。这个文件是处理fb在/sys目录下的一些属性文件的。
(3)drivers/video/modedb.c 。这个文件是管理显示模式(譬如VGA、720P等就是显示模式)的

(4)drivers/video/fb_notify.c

7.3.2、framebuffer驱动部分

(1)drivers/video/samsung/s3cfb.c,驱动主体

(2)drivers/video/samsung/s3cfb_fimd6x.c,里面有很多LCD硬件操作的函数

(2)arch/arm/mach-s5pv210/mach-x210.c,负责提供platform_device的

(3)arch/arm/plat-s5p/devs.c,为platform_device提供一些硬件描述信息的

7.3.3、如何分析

(1)经验

(2)分析menuconfig、Makefile、Kconfig

(3)内核编译后检查编译结果中的.o文件

7.3.3.1、framebuffer驱动框架分析

1、fbmem_init函数

(1)#ifdef MODULE

(2)fb_proc_fops和fb在proc文件系统中的表现

(3)register_chrdev注册fb设备

(4)class_create创建graphics类

(5)fbmem_exit的对应

2、fb_fops函数

(1)read/write/mmap/ioctl

(2)registered_fb和num_registered_fb

(3)struct fb_info

3、register_framebuffer

(1)fb驱动框架开放给驱动编写着的注册接口

(2)fb_check_foreignness

(3)remove_conflicting_framebuffers

(4)device_create

(5)fb_init_device

4、fb在sysfs中的接口

(1)device_attrs

(2)dev_set_drvdata和dev_get_drvdata

5、fb的mode

(1)什么是mode

(2)fb_var_to_videomode

(3)fb_add_videomode

6、注册登记该fb设备

(1)registered_fb[i] = fb_info;

(2)结合fb_read等函数中对fb_info的使用

(3)关键点:数据如何封装、数据由谁准备由谁消费、数据如何传递

7、fb_notifier_call_chain

7.3.3.2、framebuffer驱动分析

1、s3cfb.c

(1)注意目录结构的组织

(2)s3cfb_driver

2、s3c_device_fb

(1)mach-x210.c中,被使用

(2)devs.c中

(3)resource的定义和作用

3、probe函数分析

(1)struct s3c_platform_fb 这个结构体是fb的platform_data结构体,这个结构体变量就是platform设备的私有数据,这个数据在platform_device.device.platform_data中存储。在mach文件中去准备并填充这些数据,在probe函数中通过传参的platform_device指针取出来。

(2)struct s3cfb_global 这个结构体主要作用是在驱动部分的2个文件(s3cfb.c和s3cfb_fimd6x.c)的函数中做数据传递用的。

(3)struct resource

(4)regulator

4、platform_data的传递过程

(1)to_fb_plat

(2)s3cfb_set_platdata

(3)smdkc110_machine_init

5、struct s3cfb_lcd

6、pdata->cfg_gpio

7、pdata->clk_on

8、resource的处理

(1)platform_device中提供resource结构体数组

(2)probe中platform_get_resource取出resource并且按FLAG分头处理

9、一些硬件操作

(1)s3cfb_set_vsync_interrupt

(2)s3cfb_set_global_interrupt

(3)s3cfb_set_clock

(4)s3cfb_set_window

(5)s3cfb_display_on

10、s3cfb_init_global

11、向框架注册该fb设备

(1)s3cfb_alloc_framebuffer

(2)s3cfb_register_framebuffer

12、驱动中处理中断

(1)platform_get_irq

(2)request_irq

13、logo显示

14、backlight点亮

7.4、应用层为何不能设置分辨率

1、问题描述

(1)在上文《7.2、framebuffer应用编程实践》节时试图在应用层设置分辨率失败了,原因何在?

(2)定位问题:肯定是驱动的事儿

(3)进一步驱动中定位:ioctl部分的事儿

2、fb的ioctl部分

(1)fb是典型的字符设备驱动

(2)ioctl分为2部分 ,在驱动框架部分驱动部分 各有一半

(3)一路追踪找问题

1、让logo显示在屏幕中央

2、自定义内核启动logo

后来发现CSDN也有小伙伴总结,而且带图的,可以直接查看如下博客链接:
framebuffer驱动详解-from big_C

8、input子系统

input子系统驱动详解-from big_C

9、块设备驱动介绍

块设备驱动介绍_genhd.c blkdev.h-CSDN博客

10、网络设备驱动介绍

网络设备驱动介绍_ppp驱动ifnamsiz-CSDN博客

相关推荐
怀旧,1 分钟前
【C++】19. 封装红⿊树实现set和map
linux·c++·算法
敲上瘾29 分钟前
Docker 存储卷(Volume)核心概念、类型与操作指南
linux·服务器·数据库·docker·容器·架构
神里流~霜灭32 分钟前
(C++)数据结构初阶(顺序表的实现)
linux·c语言·数据结构·c++·算法·顺序表·单链表
自强的小白40 分钟前
vlan(局部虚拟网)
网络·学习
一只乔哇噻1 小时前
java后端工程师进修ing(研一版 || day41)
java·开发语言·学习·算法
知识分享小能手1 小时前
React学习教程,从入门到精通,React 使用属性(Props)创建组件语法知识点与案例详解(15)
前端·javascript·vue.js·学习·react.js·前端框架·vue
禁默1 小时前
已知 inode 号,如何操作文件?Ext 文件系统增删查改底层逻辑拆解
linux·服务器·数据库
许怀楠1 小时前
【Linux】基础指令(下)
linux
咕咚.萌西2 小时前
RISC-V开发环境搭建
linux·硬件架构·risc-v
大筒木老辈子2 小时前
Linux笔记---协议定制与序列化/反序列化
网络·笔记