framebuffer 子系统分析
2015-11-29 14:22
316 查看
fb_info->screen_base = dma_alloc_writecombine(fbi->dev, map_size,
&map_dma, GFP_KERNEL);
fb_info->screen_base 是framebuffer起始虚拟地址,也就是mmap后程序写入fb的地址,该地址会直接写入到fb_info->fix.smem_start指向的物理地址。
在用户空间的Surfaceflinger把数据写入screen_base时候,改数据通过DMA直接映射到smem_start,LCD控制器就能读到数据。
fb_info->fb_fix_screeninfo->smem_start地址
是LCD直接读的物理地址,在LCD初始化的时候会通过函数设置:
static
void s3c2410fb_set_lcdaddr(struct fb_info *info)
{
unsigned long saddr1, saddr2, saddr3;
struct s3c2410fb_info *fbi = info->par;
void __iomem *regs = fbi->io;
saddr1 = info->fix.smem_start >> 1;
saddr2 = info->fix.smem_start;
saddr2 += info->fix.line_length * info->var.yres;
saddr2 >>= 1;
saddr3 = S3C2410_OFFSIZE(0) |
S3C2410_PAGEWIDTH((info->fix.line_length / 2) & 0x3ff);
dprintk("LCDSADDR1 = 0x%08lx\n", saddr1);
dprintk("LCDSADDR2 = 0x%08lx\n", saddr2);
dprintk("LCDSADDR3 = 0x%08lx\n", saddr3);
writel(saddr1, regs + S3C2410_LCDSADDR1);
writel(saddr2, regs + S3C2410_LCDSADDR2);
writel(saddr3, regs + S3C2410_LCDSADDR3);
}
1、页对齐内存大小:dma_map_size = PAGE_ALIGN(MY_DATA_SIZE + PAGE_SIZE);
MY_DATA_SIZE是你想分配的大小.
2、调用
A = dma_alloc_writecombine(B,C,D,GFP_KERNEL);
含义:
A: 内存的虚拟起始地址,在内核要用此地址来操作所分配的内存
B: struct device指针,可以平台初始化里指定,主要是dma_mask之类,可参考framebuffer
C: 实际分配大小,传入dma_map_size即可
D: 返回的内存物理地址,dma就可以用。
所以,A和D是一一对应的,只不过,A是虚拟地址,而D是物理地址。对任意一个操作都将改变缓冲区内容。当然要注意操作环境。
参见S3C2410 LCD驱动中的函数s3c2410fb_map_video_memory():
unsigned map_size = PAGE_ALIGN(info->fix.smem_len);
info->screen_base = dma_alloc_writecombine(fbi->dev, map_size,&map_dma, GFP_KERNEL);
★LCD(Liquid Crystal Display,液晶显示器)概述:可分为依驱动方式之静态驱动(Static)、单纯矩阵驱动(Simple Matrix)以及主动矩阵驱动(Active
Matrix)三种。而其中单纯矩阵型又是俗称的被动式(Passive),可分为扭转向列型(Twisted Nematic,简称TN)和超扭转式向列型(Super Twisted Nematic,简称STN)两种;而主动矩阵型则以薄膜式晶体管型(Thin Film Transistor,简称TFT)为目前主流。
★S3C2410内置LCD控制器详解:一块LCD屏显示图像,不但需要LCD驱动器,还需要有相应的LCD控制器。通常LCD驱动器会以COF/COG的形式与LCD玻璃基板制做在一起,而LCD控制器则有外部电路来实现。而S3C2410内部已经集成了LCD控制器,因此可以很方便地去控制各种类型的LCD屏,例如:STN和TFT屏。由于TFT屏将是今后应用的主流,因此重点介绍TFT屏。
★S3C2410内置LCD控制器的特性:提供了驱动STN/TFT LCD所需的所有信号。
●对STN屏---支持3种扫描方式:4bit单扫、4位双扫和8位单扫;---支持单色、4级灰度和16级灰度屏;---支持256色和4096色彩色STN屏(CSTN);---支持分辩率为640*480、320*240、160*160以及其它规格的多种LCD。
●对TFT屏---支持单色、4级灰度、256色的调色板显示模式;---支持64K和16M色非调色板显示模式;---支持分辩率为640*480,320*240及其它多种规格的LCD;对于控制TFT屏来说,除了要给它送视频资料(VD[23:0])以外,还有以下一些信号是必不可少的,VSYNC(VFRAME)---帧同步信号;HSYNC(VLINE)---行同步信号;VCLK---像数时钟信号;VDEN(VM)---数据有效标志信号。
★LCD控制器的寄存器:LCD控制器逻辑示意图如下所示
●REGBANK---LCD控制器的寄存器组,含17个寄存器及一块256x16的调色板内存,用来设置各项参数。LCD控制寄存器:LCDCON1~LCDCON5(LCDCON1用于选择LCD类型、设置像素时钟、使能LCD信号的输出等;LCDCON2用于设置垂直方向各信号的时间参数;LCDCON3用于设置水平方向各信号的时间参数;LCDCON4对TFT只用来设置HSYNC信号的脉冲宽度;LCDCON5用于设置各个控制信号的极性,并可从中读到一些状态信息);帧内存地址寄存器:LCDSADDR1~LCDSADDR3(帧内存可以很大,而真正要显示的区域被称为视口(View
Point),这3个寄存器用于确定帧内存的起始地址,定位视口在帧内存中的位置);临时调色板寄存器:TPAL(对输出一帧单色图像,可以在TPAL寄存器中设定这个颜色值,然后使能TPAL寄存器,这种方法可以避免修改整个调色板或帧缓冲区);其他寄存器(LCD中断、专用STN LCD及专用SEC(Samsung Electronics Company) TFT LCD)。
●LCDCDMA---LCD控制器专用的DMA信道。可自动从系统总线(System Bus)上取到图像数据,使得显示图像时不需要CPU的干涉(VIDPRCS将LCDDMA中的数据组合成特定的格式,然后从VD[23:0]发送给LCD屏;同时TIMEGEN和LPC3600(三星TFT专用)负责产生LCD屏所需要的控制时序)。LCDCDMA中含有两个FIFO:FIFOH容量为16个字,FIFOL容量为12个字,双扫方式两者分别对应上/下半屏数据,单扫方式只用到FIFOH。FIFO为空或其中数据减少到设定的阈值时LCDDMA自动发起DMA传输从内存中获得图像数据。
★LCD控制器可以支持单色(1BPP)、4级灰度(2BPP)、16级灰度(4BPP)、256色(8BPP)的调色板显示模式、64K(16BPP)和16M(24BPP)非调色板显示模式。图像数据的存储格式:
●16M(24BPP)色---使用24位的数据来表示一个像素的颜色,每种原色使用8位。LCD控制器从内存中获得某个像素的24位颜色值后,直接通过VD[23:0]数据线发送给LCD,为了方便DMA传输,内存中使用4字节来表示一个像素(其中3字节从高到低分别表示红、绿、蓝,剩余的1字节无效,此字节为最低字节还是最高字节是可以由BPP24BL值选择的)。
●64K(16BPP)色---使用16位的数据来表示一个像素的颜色,数据格式分5:6:5(高5位表示红色,中间6位表示绿色,最低5位表示蓝色)和5:5:5:1(从高到低依次为红:绿:蓝:透明度,故又称RGBA)两种,4个字节可以表示2个16BPP的像素,高2字节还是低2字节表示第一像素可以通过HWSWP值决定。
●256(8BPP)色---使用8位的数据来表示一个像素的颜色,直接用其表示对应的3原色的值时显示能力太弱,故引进调色板(Palette,就是一块内存,可以对每个索引值设置颜色,可以使用16BPP或24BPP),用这8位数据表示其在调色板中的索引值,S3C2410/S3C2440中的调色板是一块256x16的内存,使用16BPP的格式表示256色(8BPP)显示模式下各个索引值的颜色,这样即使使用256色的显示模式,最终显示在LCD数据总线上的仍是16BPP的数据。一个4字节可以表示4个8BPP的像素,字节与像素的对应顺序可通过BSWP值设置。
1、fb_info
[cpp] view
plaincopy
struct fb_info {
int node;
int flags;
struct mutex lock; /* 调用open/release/ioctl时的锁 */
struct mutex mm_lock; /* fb_mmap和smem_*的锁 */
struct fb_var_screeninfo var; /* 当前LCD的可变参数 */
struct fb_fix_screeninfo fix; /* 当前LCD的固定参数 */
struct fb_monspecs monspecs; /* 当前LCD标准 */
struct work_struct queue; /* 帧缓冲工作队列 */
struct fb_pixmap pixmap; /* 图像硬件mapper */
struct fb_pixmap sprite; /* 光标硬件mapper */
struct fb_cmap cmap; /* 当前LCD的颜色表 */
struct list_head modelist; /* mode list */
struct fb_videomode *mode; /* 当前的video模式 */
#ifdef CONFIG_FB_BACKLIGHT
/* 对应的背光设备,在framebuffer之前注册及其之后注销 */
struct backlight_device *bl_dev;
/* 背光等级调整 */
struct mutex bl_curve_mutex;
u8 bl_curve[FB_BACKLIGHT_LEVELS];
#endif
#ifdef CONFIG_FB_DEFERRED_IO
struct delayed_work deferred_work;
struct fb_deferred_io *fbdefio;
#endif
struct fb_ops *fbops; /* 帧缓冲底层操作函数接口 */
struct device *device; /* 父设备 */
struct device *dev; /* fb设备*/
int class_flag; /* 私有sysfs标志 */
#ifdef CONFIG_FB_TILEBLITTING
struct fb_tile_ops *tileops; /* Tile Blitting */
#endif
char __iomem *screen_base; /* 虚拟基地址即framebuffer起始虚拟地址 */
unsigned long screen_size; /* 显存大小 */
void *pseudo_palette; /* 伪16色颜色表 */
#define FBINFO_STATE_RUNNING 0
#define FBINFO_STATE_SUSPENDED 1
u32 state; /* Hardware state i.e suspend */
void *fbcon_par; /* fbcon use-only private area */
/* 私有数据 */
void *par;
/* we need the PCI or similiar aperture base/size not
smem_start/size as smem_start may just be an object
allocated inside the aperture so may not actually overlap */
struct apertures_struct {
unsigned int count;
struct aperture {
resource_size_t base;
resource_size_t size;
} ranges[0];
} *apertures;
};
帧缓冲设备中最关键的数据结构就是fb_info,其中记录了设备的全部信息,包括设备的设置参数、状态以及操作函数指针,每一个帧缓冲设备必须对应一个fb_info结构体。
2、fb_var_screeninfo 和 fb_fix_screeninfo
[cpp] view
plaincopy
struct fb_var_screeninfo {
__u32 xres; /* 可视分辨率 */
__u32 yres;
__u32 xres_virtual; /* 虚拟分辨率 */
__u32 yres_virtual;
__u32 xoffset; /* 虚拟到可视之间的偏移 */
__u32 yoffset;
__u32 bits_per_pixel; /* 每个像素点占用的位数 */
__u32 grayscale; /* 非0时指灰度值 */
struct fb_bitfield red; /* fb内存的RGB位域 */
struct fb_bitfield green;
struct fb_bitfield blue;
struct fb_bitfield transp; /* 透明度 */
__u32 nonstd; /* 非0时代指非标准像素格式 */
__u32 activate; /* see FB_ACTIVATE_* */
__u32 height; /* 高度 mm */
__u32 width; /* 宽度 mm */
__u32 accel_flags; /* (OBSOLETE) see fb_info.flags */
/* 时序: 除pixel以外,其他的都以像素时钟为单位 */
__u32 pixclock; /* 像素时钟(皮秒) */
__u32 left_margin; /* 行前肩:从行同步信号到有效数据开始的时钟数 */
__u32 right_margin; /* 行后肩:从有效数据末尾到行同步信号的时钟数 */
__u32 upper_margin; /* 帧前肩:从帧同步信号到有效行开始的行数 */
__u32 lower_margin; /* 帧后肩:从有效行末尾到帧同步信号的行数 */
__u32 hsync_len; /* 行同步信号占用的时钟数 */
__u32 vsync_len; /* 帧同步信号占用的行数 */
__u32 sync; /* see FB_SYNC_* */
__u32 vmode; /* see FB_VMODE_* */
__u32 rotate; /* 旋转角度 */
__u32 reserved[5]; /* 保留备用 */
};
[cpp] view
plaincopy
struct fb_fix_screeninfo {
char id[16]; /* 标识符 */
unsigned long smem_start; /* framebuffer的物理起始地址 */
__u32 smem_len; /* framebuffer的长度 */
__u32 type; /* see FB_TYPE_* */
__u32 type_aux; /* 隔行扫描参数 */
__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; /* 一行的字节数 */
unsigned long mmio_start; /* 内存映射I/O的物理起始地址 */
__u32 mmio_len; /* 内存映射I/O的长度 */
__u32 accel;
__u16 reserved[3]; /* 保留备用 */
};
&map_dma, GFP_KERNEL);
fb_info->screen_base 是framebuffer起始虚拟地址,也就是mmap后程序写入fb的地址,该地址会直接写入到fb_info->fix.smem_start指向的物理地址。
在用户空间的Surfaceflinger把数据写入screen_base时候,改数据通过DMA直接映射到smem_start,LCD控制器就能读到数据。
fb_info->fb_fix_screeninfo->smem_start地址
是LCD直接读的物理地址,在LCD初始化的时候会通过函数设置:
static
void s3c2410fb_set_lcdaddr(struct fb_info *info)
{
unsigned long saddr1, saddr2, saddr3;
struct s3c2410fb_info *fbi = info->par;
void __iomem *regs = fbi->io;
saddr1 = info->fix.smem_start >> 1;
saddr2 = info->fix.smem_start;
saddr2 += info->fix.line_length * info->var.yres;
saddr2 >>= 1;
saddr3 = S3C2410_OFFSIZE(0) |
S3C2410_PAGEWIDTH((info->fix.line_length / 2) & 0x3ff);
dprintk("LCDSADDR1 = 0x%08lx\n", saddr1);
dprintk("LCDSADDR2 = 0x%08lx\n", saddr2);
dprintk("LCDSADDR3 = 0x%08lx\n", saddr3);
writel(saddr1, regs + S3C2410_LCDSADDR1);
writel(saddr2, regs + S3C2410_LCDSADDR2);
writel(saddr3, regs + S3C2410_LCDSADDR3);
}
1、页对齐内存大小:dma_map_size = PAGE_ALIGN(MY_DATA_SIZE + PAGE_SIZE);
MY_DATA_SIZE是你想分配的大小.
2、调用
A = dma_alloc_writecombine(B,C,D,GFP_KERNEL);
含义:
A: 内存的虚拟起始地址,在内核要用此地址来操作所分配的内存
B: struct device指针,可以平台初始化里指定,主要是dma_mask之类,可参考framebuffer
C: 实际分配大小,传入dma_map_size即可
D: 返回的内存物理地址,dma就可以用。
所以,A和D是一一对应的,只不过,A是虚拟地址,而D是物理地址。对任意一个操作都将改变缓冲区内容。当然要注意操作环境。
参见S3C2410 LCD驱动中的函数s3c2410fb_map_video_memory():
unsigned map_size = PAGE_ALIGN(info->fix.smem_len);
info->screen_base = dma_alloc_writecombine(fbi->dev, map_size,&map_dma, GFP_KERNEL);
★LCD(Liquid Crystal Display,液晶显示器)概述:可分为依驱动方式之静态驱动(Static)、单纯矩阵驱动(Simple Matrix)以及主动矩阵驱动(Active
Matrix)三种。而其中单纯矩阵型又是俗称的被动式(Passive),可分为扭转向列型(Twisted Nematic,简称TN)和超扭转式向列型(Super Twisted Nematic,简称STN)两种;而主动矩阵型则以薄膜式晶体管型(Thin Film Transistor,简称TFT)为目前主流。
★S3C2410内置LCD控制器详解:一块LCD屏显示图像,不但需要LCD驱动器,还需要有相应的LCD控制器。通常LCD驱动器会以COF/COG的形式与LCD玻璃基板制做在一起,而LCD控制器则有外部电路来实现。而S3C2410内部已经集成了LCD控制器,因此可以很方便地去控制各种类型的LCD屏,例如:STN和TFT屏。由于TFT屏将是今后应用的主流,因此重点介绍TFT屏。
★S3C2410内置LCD控制器的特性:提供了驱动STN/TFT LCD所需的所有信号。
●对STN屏---支持3种扫描方式:4bit单扫、4位双扫和8位单扫;---支持单色、4级灰度和16级灰度屏;---支持256色和4096色彩色STN屏(CSTN);---支持分辩率为640*480、320*240、160*160以及其它规格的多种LCD。
●对TFT屏---支持单色、4级灰度、256色的调色板显示模式;---支持64K和16M色非调色板显示模式;---支持分辩率为640*480,320*240及其它多种规格的LCD;对于控制TFT屏来说,除了要给它送视频资料(VD[23:0])以外,还有以下一些信号是必不可少的,VSYNC(VFRAME)---帧同步信号;HSYNC(VLINE)---行同步信号;VCLK---像数时钟信号;VDEN(VM)---数据有效标志信号。
★LCD控制器的寄存器:LCD控制器逻辑示意图如下所示
●REGBANK---LCD控制器的寄存器组,含17个寄存器及一块256x16的调色板内存,用来设置各项参数。LCD控制寄存器:LCDCON1~LCDCON5(LCDCON1用于选择LCD类型、设置像素时钟、使能LCD信号的输出等;LCDCON2用于设置垂直方向各信号的时间参数;LCDCON3用于设置水平方向各信号的时间参数;LCDCON4对TFT只用来设置HSYNC信号的脉冲宽度;LCDCON5用于设置各个控制信号的极性,并可从中读到一些状态信息);帧内存地址寄存器:LCDSADDR1~LCDSADDR3(帧内存可以很大,而真正要显示的区域被称为视口(View
Point),这3个寄存器用于确定帧内存的起始地址,定位视口在帧内存中的位置);临时调色板寄存器:TPAL(对输出一帧单色图像,可以在TPAL寄存器中设定这个颜色值,然后使能TPAL寄存器,这种方法可以避免修改整个调色板或帧缓冲区);其他寄存器(LCD中断、专用STN LCD及专用SEC(Samsung Electronics Company) TFT LCD)。
●LCDCDMA---LCD控制器专用的DMA信道。可自动从系统总线(System Bus)上取到图像数据,使得显示图像时不需要CPU的干涉(VIDPRCS将LCDDMA中的数据组合成特定的格式,然后从VD[23:0]发送给LCD屏;同时TIMEGEN和LPC3600(三星TFT专用)负责产生LCD屏所需要的控制时序)。LCDCDMA中含有两个FIFO:FIFOH容量为16个字,FIFOL容量为12个字,双扫方式两者分别对应上/下半屏数据,单扫方式只用到FIFOH。FIFO为空或其中数据减少到设定的阈值时LCDDMA自动发起DMA传输从内存中获得图像数据。
★LCD控制器可以支持单色(1BPP)、4级灰度(2BPP)、16级灰度(4BPP)、256色(8BPP)的调色板显示模式、64K(16BPP)和16M(24BPP)非调色板显示模式。图像数据的存储格式:
●16M(24BPP)色---使用24位的数据来表示一个像素的颜色,每种原色使用8位。LCD控制器从内存中获得某个像素的24位颜色值后,直接通过VD[23:0]数据线发送给LCD,为了方便DMA传输,内存中使用4字节来表示一个像素(其中3字节从高到低分别表示红、绿、蓝,剩余的1字节无效,此字节为最低字节还是最高字节是可以由BPP24BL值选择的)。
●64K(16BPP)色---使用16位的数据来表示一个像素的颜色,数据格式分5:6:5(高5位表示红色,中间6位表示绿色,最低5位表示蓝色)和5:5:5:1(从高到低依次为红:绿:蓝:透明度,故又称RGBA)两种,4个字节可以表示2个16BPP的像素,高2字节还是低2字节表示第一像素可以通过HWSWP值决定。
●256(8BPP)色---使用8位的数据来表示一个像素的颜色,直接用其表示对应的3原色的值时显示能力太弱,故引进调色板(Palette,就是一块内存,可以对每个索引值设置颜色,可以使用16BPP或24BPP),用这8位数据表示其在调色板中的索引值,S3C2410/S3C2440中的调色板是一块256x16的内存,使用16BPP的格式表示256色(8BPP)显示模式下各个索引值的颜色,这样即使使用256色的显示模式,最终显示在LCD数据总线上的仍是16BPP的数据。一个4字节可以表示4个8BPP的像素,字节与像素的对应顺序可通过BSWP值设置。
1、fb_info
[cpp] view
plaincopy
struct fb_info {
int node;
int flags;
struct mutex lock; /* 调用open/release/ioctl时的锁 */
struct mutex mm_lock; /* fb_mmap和smem_*的锁 */
struct fb_var_screeninfo var; /* 当前LCD的可变参数 */
struct fb_fix_screeninfo fix; /* 当前LCD的固定参数 */
struct fb_monspecs monspecs; /* 当前LCD标准 */
struct work_struct queue; /* 帧缓冲工作队列 */
struct fb_pixmap pixmap; /* 图像硬件mapper */
struct fb_pixmap sprite; /* 光标硬件mapper */
struct fb_cmap cmap; /* 当前LCD的颜色表 */
struct list_head modelist; /* mode list */
struct fb_videomode *mode; /* 当前的video模式 */
#ifdef CONFIG_FB_BACKLIGHT
/* 对应的背光设备,在framebuffer之前注册及其之后注销 */
struct backlight_device *bl_dev;
/* 背光等级调整 */
struct mutex bl_curve_mutex;
u8 bl_curve[FB_BACKLIGHT_LEVELS];
#endif
#ifdef CONFIG_FB_DEFERRED_IO
struct delayed_work deferred_work;
struct fb_deferred_io *fbdefio;
#endif
struct fb_ops *fbops; /* 帧缓冲底层操作函数接口 */
struct device *device; /* 父设备 */
struct device *dev; /* fb设备*/
int class_flag; /* 私有sysfs标志 */
#ifdef CONFIG_FB_TILEBLITTING
struct fb_tile_ops *tileops; /* Tile Blitting */
#endif
char __iomem *screen_base; /* 虚拟基地址即framebuffer起始虚拟地址 */
unsigned long screen_size; /* 显存大小 */
void *pseudo_palette; /* 伪16色颜色表 */
#define FBINFO_STATE_RUNNING 0
#define FBINFO_STATE_SUSPENDED 1
u32 state; /* Hardware state i.e suspend */
void *fbcon_par; /* fbcon use-only private area */
/* 私有数据 */
void *par;
/* we need the PCI or similiar aperture base/size not
smem_start/size as smem_start may just be an object
allocated inside the aperture so may not actually overlap */
struct apertures_struct {
unsigned int count;
struct aperture {
resource_size_t base;
resource_size_t size;
} ranges[0];
} *apertures;
};
帧缓冲设备中最关键的数据结构就是fb_info,其中记录了设备的全部信息,包括设备的设置参数、状态以及操作函数指针,每一个帧缓冲设备必须对应一个fb_info结构体。
2、fb_var_screeninfo 和 fb_fix_screeninfo
[cpp] view
plaincopy
struct fb_var_screeninfo {
__u32 xres; /* 可视分辨率 */
__u32 yres;
__u32 xres_virtual; /* 虚拟分辨率 */
__u32 yres_virtual;
__u32 xoffset; /* 虚拟到可视之间的偏移 */
__u32 yoffset;
__u32 bits_per_pixel; /* 每个像素点占用的位数 */
__u32 grayscale; /* 非0时指灰度值 */
struct fb_bitfield red; /* fb内存的RGB位域 */
struct fb_bitfield green;
struct fb_bitfield blue;
struct fb_bitfield transp; /* 透明度 */
__u32 nonstd; /* 非0时代指非标准像素格式 */
__u32 activate; /* see FB_ACTIVATE_* */
__u32 height; /* 高度 mm */
__u32 width; /* 宽度 mm */
__u32 accel_flags; /* (OBSOLETE) see fb_info.flags */
/* 时序: 除pixel以外,其他的都以像素时钟为单位 */
__u32 pixclock; /* 像素时钟(皮秒) */
__u32 left_margin; /* 行前肩:从行同步信号到有效数据开始的时钟数 */
__u32 right_margin; /* 行后肩:从有效数据末尾到行同步信号的时钟数 */
__u32 upper_margin; /* 帧前肩:从帧同步信号到有效行开始的行数 */
__u32 lower_margin; /* 帧后肩:从有效行末尾到帧同步信号的行数 */
__u32 hsync_len; /* 行同步信号占用的时钟数 */
__u32 vsync_len; /* 帧同步信号占用的行数 */
__u32 sync; /* see FB_SYNC_* */
__u32 vmode; /* see FB_VMODE_* */
__u32 rotate; /* 旋转角度 */
__u32 reserved[5]; /* 保留备用 */
};
[cpp] view
plaincopy
struct fb_fix_screeninfo {
char id[16]; /* 标识符 */
unsigned long smem_start; /* framebuffer的物理起始地址 */
__u32 smem_len; /* framebuffer的长度 */
__u32 type; /* see FB_TYPE_* */
__u32 type_aux; /* 隔行扫描参数 */
__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; /* 一行的字节数 */
unsigned long mmio_start; /* 内存映射I/O的物理起始地址 */
__u32 mmio_len; /* 内存映射I/O的长度 */
__u32 accel;
__u16 reserved[3]; /* 保留备用 */
};
相关文章推荐
- Javascript模板引擎:Hogan
- LintCode-剑指Offer-(378)将二叉查找树转换成双链表
- Webkit之HTMLTokenizer分析
- DOM----nodeType,nodeName,nodeValue笔记
- jQuery动画animate和scrollTop结合使用
- Webkit之HTMLToken处理
- Webkit之HTMLInput分析
- HTML基础
- 学习--jquery 自定义插件 页面按照模块 垂直滚动
- 混合开发activity和html之间相互跳转
- 《Node.js实战(第2季)》 读书笔记
- 学习--jquery 记录 使用js判断滚轮滚动方向
- 基于javascript代码实现通过点击图片显示原图片
- 整理Javascript数组学习笔记
- Bootstrap中的进度条
- CSS技巧
- js鼠标滚动图片变大小
- CSS应用的方式与注意问题
- 网页脚本输入这么简单
- 使用Protractor进行AngularJS e2e测试案例