没有合适的资源?快使用搜索试试~ 我知道了~
关于linux的fb_framebuffer设备驱动.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 144 浏览量
2021-12-03
22:32:06
上传
评论 1
收藏 50KB PDF 举报
温馨提示
试读
30页
关于linux的fb_framebuffer设备驱动.pdf
资源详情
资源评论
资源推荐
草稿 V2.4.0
1framebuffer 设备即帧缓冲设备(简写 fb )提供了显示接口的抽象描述。他
同时代表着显示接口的存储区,应用程序通过定义好的函数访问,不需要知道底
层的任何操作。
Framebuffer 驱动使用的设备节点,通常位于 /dev 目录,如 /dev/fb*. 从用
户角度看, fb 设备和其他 /dev 下面的设备类似:普通的字符设备,主设备号 29,
次设备号定义 fb 的索引。
通常,使用如下方式(前面的数字表示次设备号)
0=/dev/fb0 第一个 fb 设备
1=/dev/fb1 第二个 fb 设备
考虑到向下兼容,可以创建符号链接:
/dev/fb0current->fb0
/dev/fb1current->fb1
fb 也是一种普通的内存设备,可以读写其内容。例如,屏幕抓屏:
cp/dev/fb0myfile
fb 虽然可以像内存设备( /dev/mem)一样,对其 read,write,seek 以及 mmap。
但区别在于 fb 使用的不是整个内存区,而是显存部分。
通过 ioctl 可以读取或设定 fb 设备参数,很重要的一点,颜色表 (cmap) 也
要通过 Ioctl 设定。查看 <linux/fb.h> 就知道有多少 ioctl 应用以及相关数据结
构。这里给出摘要:
- 你可以获取设备一些不变的信息,如设备名,屏幕的组织(平面,象素 ,...)
对应内存区的长度和起始地址。
- 也可以获取能够改变的信息,例如位深,颜色格式,时序等。如果你改变这
些值,驱动程序将对值进行优化,以满足设备特性(如果你的设定,设备不支持,
返回 EINVAL)。
- 你也可以获取或设定部分颜色表。
所有这些特性让应用程序十分容易的使用 framebuffer 设备。 Xserver 可
以使用 /dev/fb* 而不需知道硬件的寄存器是如何组织的。 XF68_FBDev是一个用
于位映射(单色) Xserver ,唯一要做的就是在应用程序在相应的位置设定是否
显示。
在新内核中,帧缓冲设备可以工作于模块中,允许动态加载。这类驱动必须
调用 register_framebuffer() 在系统中注册。
之所以对视频模式进行介绍,因为在后面的一些数据结构中,会出现对视频
模式的参数描述。
CRT显示器用 3 个电子枪轰击磷粉完成颜色的显示。电子枪必须完成从左到草稿 V2.4.0
2 右的水平扫描和从上至下的垂直扫描。改变枪的电压,对应显示的颜色可以不同。
当电子枪完成一行扫描重新回到下一行的开始,被称为“水平折回” 。当一屏幕
全部扫描完毕,电子枪从底部回到左上角,被称为“垂直折回” 。在折回的途中
电子枪是关闭的。
电子枪打点的移动速度取决于点时钟。如果点时钟是 28.37516MHz,打一
个点需要 35242ps。
1/(28.37516E6Hz)=35.242E-9s
如果屏幕分辨率是 640x480,那么一行的时间是:
640*35.242E-9s=22.555E-6s
然而水平折回也是需要时间的,通常 272 个点时钟单位,因此扫描一行需要
的时间就是:
(640+272)*35.242E-9s=32.141E-6s
由此得到水平扫描的频率是 31KHz:
1/(32.141E-6s)=31.113E3Hz
若屏幕有 480 行,加上垂直折回时间 49 个行时钟单位,刷新一屏所需时间:
(480+49)*32.141E-6s=17.002E-3s
由此得到垂直扫描的频率是 59Hz:
1/(17.002E-3s)=58.815Hz
这意味着屏幕数据每秒钟刷新 59 次。为了得到稳定的图像显示效果, VESA
标准规定垂直扫描频率不低于 72Hz。但也因人而异,有些人在 50Hz 时就感觉不
到闪烁,而另一些则要在 80Hz 以上才可。
由于显示器不知道何时开始新的一行扫描,因此需要为行扫描提供水平同步
信号。类似的,也为每一帧显示提供垂直同步信号。图像在屏幕上点的位置取决
于这些同步信号的发生时刻。
下图给出了所有时序的概要。水平折回的时间就是左边空白+右边空白+水
平 同 步 长 度 。 垂 直 折 回 的 时 间 就 是 上 空 白 + 下 空 白 + 垂 直 同 步 长 。
+----------+--------------------------------------------+----------+-------+
||^|||
|||upper_margin|||
||?|||
+----------###############################################----------+-------+
|#^#||
|left#|#right|hsync|
|margin#|xres#margin|len|
|<-------->#<---------------+--------------------------->#<-------->|<----->|
|#|#||
|#|#||
|#|yres#||
|#|#||
|#|#||
|#|#||
|#?#|| 草稿 V2.4.0
3+----------###############################################----------+-------+
||^|||
|||lower_margin|||
||?|||
+----------+---------------------------------------------+----------+-------+
||^|||
|||vsync_len|||
||?|||
+----------+---------------------------------------------+----------+-------+ 把
XFree86 时序变成 fb 时序
典型的显示模式:
"800x600"508008569761040600637643666
<name>DCFHRSH1SH2HFLVRSV1SV2VFL
而帧缓冲设备使用下面的参数:
-pixclock: 点时钟 inps(picoseconds)
-left_margin:timefromsynctopicture
-right_margin:timefrompicturetosync
-upper_margin:timefromsynctopicture
-lower_margin:timefrompicturetosync
-hsync_len:lengthofhorizontalsync
-vsync_len:lengthofverticalsync
1)Pixelclock:
xfree:inMHz
fb:inpicoseconds(ps)
pixclock=1000000/DCF
2)horizontaltimings:
left_margin=HFL-SH2
right_margin=SH1-HR
hsync_len=SH2-SH1
3)verticaltimings:
upper_margin=VFL-SV2
lower_margin=SV1-VR
vsync_len=SV2-SV1
1.2
下面给出了一个 framebuffer 驱动例子,并添加详细注释。通过阅读该例,
希望大家对 framebuffer 驱动初步了解。 后面我们将分析用到的数据结构, 以及草稿 V2.4.0
4 其中成员变量和成员函数的功能和意义。
/*linux/drivers/video/anakinfb.c
*Copyright(C)2001AlephOneLtd.forAcuniaN.V.
*
*Thisprogramisfreesoftware;youcanredistributeitand/ormodify
*itunderthetermsoftheGNUGeneralPublicLicenseversion2as
*publishedbytheFreeSoftwareFoundation.
*Changelog:23-Apr-2001TTCCreated
*/
#include<linux/types.h>
#include<linux/fb.h>
#include<linux/string.h>
#include<linux/errno.h>
#include<linux/init.h>
#include<linux/module.h>
#include<asm/io.h>
#include<video/fbcon.h>
#include<video/fbcon-cfb16.h>
staticu16colreg[16];// 颜色描述表, cmap的简化描述
staticintcurrcon=0;// 当前的 console 索引
staticstructfb_infofb_info;
staticstructdisplaydisplay;
staticintanakinfb_getcolreg(u_intregno,u_int*red,u_int*green,
u_int*blue,u_int*transp,structfb_info*info)
{
if(regno>15)// 共有 16 色,故索引不大于 15
return1;
// 颜色描述的位深 16 位,分别是 R:G:B=5:6:5 ;后面的补齐操作采用了左移
低位补齐方式,只要和 setcloreg 运算相反即可,也可以使用高位补齐方式。
*red=colreg[regno]&0xf800;
*green=colreg[regno]&0x7e0<<5;// 移到高字节,凑足 16 位
*blue=colreg[regno]&0x1f<<11;// 移到高字节,凑足 16 位
*transp=0;// 不支持透明度
return0;// 成功返回 0,参考 fb_get_cmap 实现,就知道这里为什么是 0。
}
staticintanakinfb_setcolreg(u_intregno,u_intred,u_intgreen,u_int 草稿 V2.4.0
5blue,u_inttransp,structfb_info*info)
{
if(regno>15)
return1;
// 根据索引,设置颜色表的颜色值
colreg[regno]=(red&0xf800)|(green&0xfc00>>5)|
(blue&0xf800>>11);
return0;
}
// 从 fb_info 结构获取 fb_fix_screeninfo 信息。由于我们在 anakinfb_init
中并没有设置 fb_info.fix 的值,所以只有在此函数内通过常值赋予。
staticintanakinfb_get_fix(structfb_fix_screeninfo*fix,intcon,
structfb_info*info)
{
//fix 全部为 0
memset(fix,0,sizeof(structfb_fix_screeninfo));
//id 作为字符串标识用
strcpy(fix->id,"AnakinFB");
// 显存的起始物理地址
fix->smem_start=VGA_START;
// 显存所占的字节数
fix->smem_len=VGA_SIZE;
// 象素显示
fix->type=FB_TYPE_PACKED_PIXELS;
// 下面的略,参考后面 fb_fix_srceeninfo 结构
fix->type_aux=0;
fix->visual=FB_VISUAL_TRUECOLOR;
fix->xpanstep=0;
fix->ypanstep=0;
fix->ywrapstep=0;
// 每行所占字节数, xres =400
fix->line_length=400*2;
// 显卡无硬件加速
fix->accel=FB_ACCEL_NONE;
return0;
}
staticintanakinfb_get_var(structfb_var_screeninfo*var,intcon,
structfb_info*info)
{
//var 初始化为 0
memset(var,0,sizeof(structfb_var_screeninfo));
//x 方向分辨率草稿 V2.4.0
6var->xres=400;
//y 方向分辨率
var->yres=234;
// 虚拟分辨率,不支持 pan,故和实际分辨率一致
var->xres_virtual=400;
var->yres_virtual=234;
var->xoffset=0;
var->yoffset=0;
// 色深 16 位, 5:6:5 结构
var->bits_per_pixel=16;
// 彩色,非灰度, bpp<8,grayscale=1
var->grayscale=0;
// 根据 R:G:B =5: 6:5 得下面数据
var->red.offset=11;
var->red.length=5;
var->green.offset=5;
var->green.length=6;
var->blue.offset=0;
var->blue.length=5;
// 不支持透明度
var->transp.offset=0;
var->transp.length=0;
var->nonstd=0;
var->activate=FB_ACTIVATE_NOW;
// 下面解释略
var->height=-1;
var->width=-1;
var->pixclock=0;
var->left_margin=0;
剩余29页未读,继续阅读
sinat_40572875
- 粉丝: 52
- 资源: 7万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0