Vesafb介绍
VESA是Video Electronic Standards Association影像电子工程标准协会的缩写,由多家计算机芯片制造商于1989年联合创立,1994年底,VESA发表了64位架构的VESA Local Bus标准,80486以后的PC机大多采用这一标准的显卡。
Vesafb is a framebuffer driver for Intel architecture that works with VESA 2.0 compliant graphic cards。
Linear frame buffering simply means that the system's CPU is able to access every bit of the display.
显卡简介
显示适配卡(Video card,Graphics card),又称为显示适配器(video adapter),中国大陆简称为显卡或显示卡,香港与台湾简称为显示卡,是个人电脑最基本组成部分之一。-{A|zh-cn:显卡;zh-tw:显示卡}-的用途是将计算机系统所需要的显示信息进行转换驱动显示器,并向显示器提供行扫描信号,控制显示器的正确显示,是联接显示器和个人电脑主板的重要组件,是“人机对话”的重要设备之一。
显卡是插在主板上的扩展槽里的(现在一般是PCI-E或AGP插槽)。它主要负责把主机向显示器发出的显示信号转化为一般电信号,使得显示器能明白个人电脑在让它干什么。显卡的主要芯片叫“显示芯片”(Video chipset,也叫GPU或VPU,图形处理器或视觉处理器),是显卡的主要处理单元。显卡上也有和电脑内存相似的存储器,称为“显示内存”,简称显存。
早期的显卡只是单纯意义的显卡,只起到信号转换的作用;目前我们一般使用的显卡都带有3D画面运算和图形加速功能,所以也叫做“图形加速卡”。
显卡通常由总线接口、PCB板、显示芯片、显存、RAMDAC、VGA BIOS、VGA功能插针、VGA插座及其它外围组件构成,现在的显卡大多还具有DVI显示器插头及S-video端子插头。
ISA显卡是现在最普遍使用的VGA显示器所能支持的最为古老的显卡。
VESA是Video Electronic Standards Association影像电子工程标准协会的缩写,由多家计算机芯片制造商于1989年联合创立,1994年底,VESA发表了64位架构的VESA Local Bus标准,80486以后的PC机大多采用这一标准的显卡。
AGP(Accelerated Graphics Port)是Intel公司在1996年开发的32位总线接口,用来增进计算机系统中的显示效能。分有AGP 1X , AGP 2X ,AGP 4X 及最后的AGP 8X , 频宽分别为 266MB/s ,533MB/s ,1066MB/及2133 MB/s。其中 AGP 4X 以后已跟之前电压不兼容。性能最好的AGP显示卡是nVIDIA公司的GeForce 6800 Ultra 和ATi公司的Radeon X850 XT PE。
PCI Express是显示卡最新的图形接口,用来取代AGP显示卡的,因为面对日后3D显示技术的不断进步,AGP的宽带已经不能再满足庞大的数据运算。目前性能最高的PCI-Express显示卡是Nvidia公司的GeForce 7800GTX 512MB和ATi公司的X1900XTX。此外, 现时部分显示卡可-{zh-tw:支援;zh-cn:支持}-双显示卡(nVidia的SLi和ATi的Crossfire). 当中, Crossfire大部分都需要一张子卡和一张主卡去运行, 但X1300就无此限制,而此限制也即将解封。
MTRR含义
MTRR (Memory Type Range Register) support (CONFIG_MTRR) [N/y/?]
选择该选项,系统将生成/proc/mtrr文件对MTRR进行管理,供X server使用。
在Intel p6家族的处理器中(Ppro、 PII和更新的)有一个内存类型范围寄存器,可用来控制处理器访问的内存范围。打开它一般可以提升显卡的显示性能
It speeds up memory copies between the processor and the graphic card
linux framebuffer相关
又学习到结构体初始化定义的一个绝招,具体如下:
结构体定义(见/include/linux/fb.h)
struct fb_fix_screeninfo {
char id[16]; /* identification string eg "TT Builtin" */
unsigned long smem_start; /* Start of frame buffer mem */
/* (physical address) */
__u32 smem_len; /* Length of frame buffer mem */
__u32 type; /* see FB_TYPE_* */
__u32 type_aux; /* Interleave for interleaved Planes */
__u32 visual; /* see FB_VISUAL_* */
__u16 xpanstep; /* zero if no hardware panning */
__u16 ypanstep; /* zero if no hardware panning */
__u16 ywrapstep; /* zero if no hardware ywrap */
__u32 line_length; /* length of a line in bytes */
unsigned long mmio_start; /* Start of Memory Mapped I/O */
/* (physical address) */
__u32 mmio_len; /* Length of Memory Mapped I/O */
__u32 accel; /* Type of acceleration available */
__u16 reserved[3]; /* Reserved for future compatibility */
};
/drivers/video/Anakinfb.c
结构体初始化,注意并不是初始化全部成员变量,而是一部分,这是一种简捷的定义方式,注意每个成员变量前有一个“.”号,你有更好的定义方式吗?欢迎指教:)
static struct fb_fix_screeninfo anakinfb_fix = {
.id = "AnakinFB",
.smem_start = VGA_START,
.smem_len = VGA_SIZE,
.type = FB_TYPE_PACKED_PIXELS,
.visual = FB_VISUAL_TRUECOLOR,
.line_length = 400*2,
.accel = FB_ACCEL_NONE,
};
下面是一个操作符优先级问题
anakinfb_setcolreg()
{
…
// green & 0xfc00 >> 5与green & (0xfc00 >> 5)相同,注意操作符的优先级
((u16 *)(info->pseudo_palette))[regno] = (red & 0xf800) | (green & 0xfc00 >> 5) | (blue & 0xf800 >> 11);
…
}