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的翻转等
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中填入背光值,产生线性的背光曲线
1.主要是注册一个fb的主要步骤,是一个示例框架,写framebuffer驱动的时候可以参考该代码
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
1.通用的设备节点读写函数,主要是使用在framebuffer是在内存中存在的,即info->screen_base使实际的内存地址还是寄存器地址,实际的内存地址,可以直接调用copy_to_user或者是copy_from_user,而使用寄存器地址的话,会先从寄存器搬运到一个buff中,然后再拷贝到用户空间的buff,或者是拷贝到寄存器地址中去
2.提供了fb_sys_read和fb_sys_write2个接口,这2个接口和fbmem中的fb_read以及fb_write,不同点就是在info->screen_base是内存地址还是寄存器地址,寄存器需要由特定的指令去读取(fb_memcpy_tofb或者是fb_memcpy_fromfb)
1.提供通用的区域拷贝函数。假如平台有加速引擎的话,可以重新定义fb->ops中的fb_copyarea函数指针
1.通用的填充矩形的函数,也可以使用平台引擎加速。同理赋值fb_fillrect
1.通用的方法拷贝图像到显示内存中(显存),如果有更快的方法(显示引擎加速)可以被重写
1.与调色板相关的
1.根据 VESA时序,将输入参数mode(已经填充下x,y,刷新率,隔行扫描或者逐行扫描等参数)计算出fp,bp,vsync,hsync等参数,返回mode
int fb_find_mode_cvt(struct fb_videomode *mode, int margins, int rb)
1.主要和显示描述语言(EDID)相关,负责解析EDID,以及判定EDID中相关参数的有效性,EDID主要用在HDMI,MHL,DP中,用来表达显示器支持的分辨率以及audio部分,
2.关于EDID Tool1,EDID Tool2借助工具可以生成EDID,自动计算内部的一些校验和,加快开发速度,生成的EDID一般存放在显示器件上的EEPROM中,EEPROM的固定地址的I2C地址是0xA2
1.文件中调用了__setup,将"video="
字段放入__setup_start 和__setup_end之间,系统之后匹配命令行参数,如果存在video= 则调用video_setup函数,将字段存入video_options
数组中
__setup("video=", video_setup);
2.其它设备驱动需要调用fb_get_options
函数,返回之前存入的参数。
1.关于DDC以及EDID的读取,对外的接口是fb_ddc_read
,传入的参数是i2c adapter,返回值是EDID(128bytes)的数组或者NULL
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.关于原理,请看链接
1.标准的视频模式数据库管理,存放着标准的视频时序描述
2.一种例程,用于探测视频模式,所有帧缓冲设备都可以使用该模式
3.一个具有大量标准视频模式的通用视频模式数据库(取自XFree86)
4.可以为需要非标准模式的图形硬件提供自己的模式数据库,例如amifb和Mac帧缓冲区驱动程序(使用macmodes.c)
1.提供区域拷贝函数
2.主要用在framebuffer在Ram中,而不是硬件的寄存区地址(cfb_copyarea)
1.填充矩形,同理显存也是在内存中
1.图像拷贝到显存(内存中),而非寄存器中。