linux-Framebuffer核心文件概述

Framebuffer主要文件概述(fbdev)

fbmem.c drivers\video\fbdev\core

fbmem.c drivers\video\fbdev\core
1.提供注册的framebuffer,构造设备节点/dev/fb%d,保存设备注册的fb_info(registered_fb保存),创建proc/fb文件,提供读写等操作,读取fb文件时,会遍历整个registered_fb中注册的fb_info信息
(seq_printf(m, “%d %s\n”, fi->node, fi->fix.id);)
2.提供设备节点的打开关闭,读写以及控制等文件操作(fops,注意主要的操作在ioctl中。还有比较重要的是mmap操作。
3.有关于显示log,调色板信息设置,log的翻转等

fbsysfs.c video\fbdev\core

1.主要提供sysfs的接口,通过sysfs的接口,查看一些fb_info的一些属性,在注册framebuffer时会同步调用fb_init_device
2.提供了framebuffer_alloc以及framebuffer_release
3.如果使用了CONFIG_FB_BACKLIGHT,还能使用fb_bl_default_curve,填入最小的值,最大的值,自动将fb_info->bl_curve中填入背光值,产生线性的背光曲线

skeletonfb.c video\fbdev (骨架程序,提供示例代码)

1.主要是注册一个fb的主要步骤,是一个示例框架,写framebuffer驱动的时候可以参考该代码

fb_notify.c video\fbdev\core

1.提供了一个通知链注册与反注册的函数
2.对外提供了fb_notifier_call_chain接口,可以分发framebuffer events,主要是在fbmem中调用,分发的事件如下:

/*	The resolution of the passed in fb_info about to change */ 
#define FB_EVENT_MODE_CHANGE		0x01
/*	The display on this fb_info is beeing suspended, no access to the
 *	framebuffer is allowed any more after that call returns
 */
#define FB_EVENT_SUSPEND		0x02
/*	The display on this fb_info was resumed, you can restore the display
 *	if you own it
 */
#define FB_EVENT_RESUME			0x03
/*      An entry from the modelist was removed */
#define FB_EVENT_MODE_DELETE            0x04
/*      A driver registered itself */
#define FB_EVENT_FB_REGISTERED          0x05
/*      A driver unregistered itself */
#define FB_EVENT_FB_UNREGISTERED        0x06
/*      CONSOLE-SPECIFIC: get console to framebuffer mapping */
#define FB_EVENT_GET_CONSOLE_MAP        0x07
/*      CONSOLE-SPECIFIC: set console to framebuffer mapping */
#define FB_EVENT_SET_CONSOLE_MAP        0x08
/*      A hardware display blank change occurred */
#define FB_EVENT_BLANK                  0x09
/*      Private modelist is to be replaced */
#define FB_EVENT_NEW_MODELIST           0x0A
/*	The resolution of the passed in fb_info about to change and
        all vc's should be changed         */
#define FB_EVENT_MODE_CHANGE_ALL	0x0B
/*	A software display blank change occurred */
#define FB_EVENT_CONBLANK               0x0C
/*      Get drawing requirements        */
#define FB_EVENT_GET_REQ                0x0D
/*      Unbind from the console if possible */
#define FB_EVENT_FB_UNBIND              0x0E
/*      CONSOLE-SPECIFIC: remap all consoles to new fb - for vga_switcheroo */
#define FB_EVENT_REMAP_ALL_CONSOLE      0x0F
/*      A hardware display blank early change occured */
#define FB_EARLY_EVENT_BLANK		0x10
/*      A hardware display blank revert early change occured */
#define FB_R_EARLY_EVENT_BLANK		0x11

fb_sys_fops.c drivers\video\fbdev\core\

1.通用的设备节点读写函数,主要是使用在framebuffer是在内存中存在的,即info->screen_base使实际的内存地址还是寄存器地址,实际的内存地址,可以直接调用copy_to_user或者是copy_from_user,而使用寄存器地址的话,会先从寄存器搬运到一个buff中,然后再拷贝到用户空间的buff,或者是拷贝到寄存器地址中去
2.提供了fb_sys_readfb_sys_write2个接口,这2个接口和fbmem中的fb_read以及fb_write,不同点就是在info->screen_base是内存地址还是寄存器地址,寄存器需要由特定的指令去读取(fb_memcpy_tofb或者是fb_memcpy_fromfb

cfbcopyarea.c \drivers\video\fbdev\core\

1.提供通用的区域拷贝函数。假如平台有加速引擎的话,可以重新定义fb->ops中的fb_copyarea函数指针

cfbfillrect.c drivers\video\fbdev\core\

1.通用的填充矩形的函数,也可以使用平台引擎加速。同理赋值fb_fillrect

cfbimgblt.c drivers\video\fbdev\core\

1.通用的方法拷贝图像到显示内存中(显存),如果有更快的方法(显示引擎加速)可以被重写

fbcmap.c \drivers\video\fbdev\core\

1.与调色板相关的

fbcvt.c \drivers\video\fbdev\core\

1.根据 VESA时序,将输入参数mode(已经填充下x,y,刷新率,隔行扫描或者逐行扫描等参数)计算出fp,bp,vsync,hsync等参数,返回mode

int fb_find_mode_cvt(struct fb_videomode *mode, int margins, int rb)

fbmon.c \drivers\video\fbdev\core\

1.主要和显示描述语言(EDID)相关,负责解析EDID,以及判定EDID中相关参数的有效性,EDID主要用在HDMI,MHL,DP中,用来表达显示器支持的分辨率以及audio部分,
2.关于EDID Tool1,EDID Tool2借助工具可以生成EDID,自动计算内部的一些校验和,加快开发速度,生成的EDID一般存放在显示器件上的EEPROM中,EEPROM的固定地址的I2C地址是0xA2

fb_cmdline.c \drivers\video\fbdev\core\

1.文件中调用了__setup,将"video="字段放入__setup_start 和__setup_end之间,系统之后匹配命令行参数,如果存在video= 则调用video_setup函数,将字段存入video_options数组中

__setup("video=", video_setup);

2.其它设备驱动需要调用fb_get_options函数,返回之前存入的参数。

fb_ddc.c \drivers\video\fbdev\core\

1.关于DDC以及EDID的读取,对外的接口是fb_ddc_read,传入的参数是i2c adapter,返回值是EDID(128bytes)的数组或者NULL

fb_defio.c \drivers\video\fbdev\core\

1.延迟IO操作,使用主机内存作为缓冲区,并使用MMU页面故障作为何时执行设备IO的预触发。
2.framebuffer驱动使用fb_deferred_io_init初始化延迟IO

//设置您的结构。例如:
static struct fb_deferred_io hecubafb_defio = {
        .delay          = HZ,
        .deferred_io    = hecubafb_dpy_deferred_io,
};
//延迟是发生page_mkwrite触发器与调用deferred_io回调之间的最小延迟。下面说明了deferred_io回调。

//设置延迟的IO回调。例如:
static void hecubafb_dpy_deferred_io(struct fb_info *info,
                                     struct list_head *pagelist)
//在deferred_io回调中,您将对显示设备执行所有IO。您收到的页面列表是延迟期间写入的页面列表。您不得修改此列表。从工作队列中调用此回调。

//初始化:
info->fbdefio = &hecubafb_defio;
fb_deferred_io_init(info);
//清理:
fb_deferred_io_cleanup(info);

3.关于原理,请看链接

modedb.c \drivers\video\fbdev\core\

1.标准的视频模式数据库管理,存放着标准的视频时序描述
2.一种例程,用于探测视频模式,所有帧缓冲设备都可以使用该模式
3.一个具有大量标准视频模式的通用视频模式数据库(取自XFree86)
4.可以为需要非标准模式的图形硬件提供自己的模式数据库,例如amifb和Mac帧缓冲区驱动程序(使用macmodes.c)

syscopyarea.c \drivers\video\fbdev\core\

1.提供区域拷贝函数
2.主要用在framebuffer在Ram中,而不是硬件的寄存区地址(cfb_copyarea)

sysfillrect.c \drivers\video\fbdev\core\

1.填充矩形,同理显存也是在内存中

sysimgblt.c \drivers\video\fbdev\core\

1.图像拷贝到显存(内存中),而非寄存器中。

你可能感兴趣的:(linux驱动之子系统)