操作帧缓冲:测试程序 struct fb_var_screeninfo struct fb_fix_screeninfo fix

来源:互联网 发布:2017网络市场专项行动 编辑:程序博客网 时间:2024/06/03 16:50
#include<stdio.h>#include<unistd.h>#include<stdlib.h>//堆空间#man calloc#include<fcntl.h>#include<linux/fb.h>#include<sys/ioctl.h>#include<sys/mman.h>//mmap()函数/*测试:可以在开发板上测试,也可以在pc上测试*pc上测试要注意先进入真实终端模式,通过ctrl+alt+f1~f6可分别进入*个终端,通过ctrl+alt+f7可回到终端*/转载请注明博客原文地址:http://blog.csdn.net/oyhb_1992/article/details/77659021typedef unsigned int u32;typedef unsigned short u16;typedef unsigned char u8;typedef unsigned int s32;typedef unsigned short s16;typedef signed char s8;#define RGB888(r,g,b) (r<<16 | (g)<<8| (b))struct ldm_info{int fd;//打开的文件描述符struct fb_var_screeninfo var; //结构体定义在/usr/include/linux/fb.h头文件里struct fb_fix_screeninfo fix;int x_size,y_size;//屏幕的实际分辨率int bpp; //每个像素占多少个字节u8 *start_addr; //显存映射到当前进程空间的地址void (*draw_pixel) (struct ldm_info *info,int x,int y,u32 color);};//在指定的坐标位置画出一个像素点的颜色static void draw_pixel_32(struct ldm_info * info,int x,int y,u32 color){*(u32*)(info->start_addr + y *info->fix.line_length+x*info->bpp)=color;}static void draw_rect(struct ldm_info * info,int x,int y,int xlen,int ylen,u32 color){int ix,iy;*(u32*)(info->start_addr + y *info->fix.line_length+x*info->bpp)=color;for(iy=0;iy<ylen;iy++)for(ix=0;ix<xlen;ix++){draw_pixel_32(info,ix+x,iy+y,color);}}static void clear_screen(struct ldm_info * info,int x,int y,int xlen,int ylen,u32 color){draw_rect(info,0,0,info->x_size,info->y_size,color);}static void print_screen_info(struct ldm_info * info){//操作系统告诉里的屏幕的分辨率printf("var: xres=%d, yres=%d,xres_virtual= %d\n, yres_virtual=%d\n", info->var.xres, info->var.yres,info->var.xres_virtual, info->var.yres_virtual);//我们实际算出来的屏幕分辨率,比较理论和实际是否相等printf("x_size = %d, y_size = %d\n", info->x_size,info->y_size);printf("bits_per_pixel=%d, bpp=%d\n",info->var.bits_per_pixel,info->bpp);printf("red: offset=%d, length=%d,msb_right=%d\n",info->var.red.offset, info->var.red.length,info->var.red.msb_right);printf("green: offset=%d, length=%d,msb_right=%d\n",info->var.green.offset, info->var.green.length,info->var.green.msb_right);printf("blue: offset=%d, length=%d,msb_right=%d\n",info->var.blue.offset, info->var.blue.length,info->var.blue.msb_right);}int main(int argc , char ** argv){int ret;if(argc<2){fprintf(stderr,"fbapp<fb device node>\n");//必须要有一个fb device 的设备节点return -1;}//结构体存到堆空间struct ldm_info *ldm_info = calloc(1,sizeof(struct ldm_info));//打开设备文件ldm_info->fd = open(argv[1],O_RDWR);/*ldm_info->fd = open("/dev/fb0",O_RDWR);*/if(ldm_info->fd<0){perror("openfd failed");goto err_open_fd;}//获取var和fix对象,得到当前屏幕的分辨率和色深参数ret = ioctl(ldm_info->fd,FBIOGET_VSCREENINFO, &ldm_info-> var); //获取可变参数if(ret<0){perror("ioctl get var failed");goto err_ioctl_get;}ret = ioctl(ldm_info->fd ,FBIOGET_FSCREENINFO, &ldm_info->fix);//获取 固定参数if(ret<0){perror("ioctl get fix failed");goto err_ioctl_get;}//通过fix中的两个成员可以计算得到屏幕的实际分辨率ldm_info->bpp = ldm_info->var.bits_per_pixel/8;switch(ldm_info->bpp){case 2:// ldm_info->draw_pixel= draw_pixel_16bit;break;case 3:ldm_info->bpp=4;case 4:ldm_info->draw_pixel =draw_pixel_32;break;}ldm_info->y_size = ldm_info->var.yres;ldm_info->x_size = ldm_info->fix.line_length/ ldm_info->bpp;//一行的字节数除以一个像素点的字节数print_screen_info(ldm_info);//将显存映射到当前进程空间,得到显存映射后的虚拟首地址/*把/dev/fb0映射到程序进程的内存空间中来,然后得到一个指向这段存储空间的指针,这样就可以方便的读写了但是我们要知道能映射多少和该映射多少,这能很方便的从上面一个程序得出的参数来决定*/ldm_info->start_addr=mmap(NULL,ldm_info->fix.smem_len,PROT_WRITE,MAP_SHARED,ldm_info->fd,0);if(MAP_FAILED == ldm_info->start_addr){perror("mmap");goto err_mmap;}//////开始画图clear_screen(ldm_info,0,0,ldm_info->x_size,ldm_info->y_size,RGB888(0,0,255));//draw_rect(struct ldm_info * info,int x,int y,int xlen,int ylen,u32 color)draw_rect(ldm_info,ldm_info->x_size/4,ldm_info->y_size/4,ldm_info->x_size/2,ldm_info->y_size/2,RGB888(255,0,0));close(ldm_info->fd);free(ldm_info);return 0;err_mmap:munmap(ldm_info->start_addr, ldm_info->fix.smem_len);err_ioctl_get:close(ldm_info->fd);free(ldm_info);err_open_fd:free(ldm_info);}/*运行程序:./ldm_app /dev/fb0注意一定要养成好的习惯,每次操作如果函数有出错误的可能性都要每次进行判断打印出错误信息,这样以后调试的时候才能更省时间*/在应用程序中,操作/dev/fbn的一般步骤如下:(1)打开/dev/fbn设备文件。(2)用ioctl()操作取得当前显示屏幕的参数,如屏幕分辨率、每个像素点的比特数。根据屏幕参数可计算屏幕缓冲区的大小。(3)用mmap()函数,将屏幕缓冲区映射到用户空间。(4)映射后就可以直接读/写屏幕缓冲区,进行绘图和图片显示了。


 

 

 

 

 

/****************************************/usr/include/linux/fb.h头文件分析/******************************************************/转载请注明博客原文地址:http://blog.csdn.net/oyhb_1992/article/details/77659021#ifndef _LINUX_FB_H#define _LINUX_FB_H#include <linux/types.h>#include <linux/i2c.h>struct dentry;/* Definitions of frame buffers*/#define FB_MAX32/* sufficient for now *//* ioctls0x46 is 'F'*/#define FBIOGET_VSCREENINFO0x4600#define FBIOPUT_VSCREENINFO0x4601#define FBIOGET_FSCREENINFO0x4602#define FBIOGETCMAP0x4604#define FBIOPUTCMAP0x4605#define FBIOPAN_DISPLAY0x4606#define FBIO_CURSOR            _IOWR('F', 0x08, struct fb_cursor)/* 0x4607-0x460B are defined below *//* #define FBIOGET_MONITORSPEC0x460C *//* #define FBIOPUT_MONITORSPEC0x460D *//* #define FBIOSWITCH_MONIBIT0x460E */#define FBIOGET_CON2FBMAP0x460F#define FBIOPUT_CON2FBMAP0x4610#define FBIOBLANK0x4611/* arg: 0 or vesa level + 1 */#define FBIOGET_VBLANK_IOR('F', 0x12, struct fb_vblank)#define FBIO_ALLOC              0x4613#define FBIO_FREE               0x4614#define FBIOGET_GLYPH           0x4615#define FBIOGET_HWCINFO         0x4616#define FBIOPUT_MODEINFO        0x4617#define FBIOGET_DISPINFO        0x4618#define FBIO_WAITFORVSYNC_IOW('F', 0x20, __u32)#define FB_TYPE_PACKED_PIXELS0/* Packed Pixels*/#define FB_TYPE_PLANES1/* Non interleaved planes */#define FB_TYPE_INTERLEAVED_PLANES2/* Interleaved planes*/#define FB_TYPE_TEXT3/* Text/attributes*/#define FB_TYPE_VGA_PLANES4/* EGA/VGA planes*/#define FB_AUX_TEXT_MDA0/* Monochrome text */#define FB_AUX_TEXT_CGA1/* CGA/EGA/VGA Color text */#define FB_AUX_TEXT_S3_MMIO2/* S3 MMIO fasttext */#define FB_AUX_TEXT_MGA_STEP163/* MGA Millenium I: text, attr, 14 reserved bytes */#define FB_AUX_TEXT_MGA_STEP84/* other MGAs:      text, attr,  6 reserved bytes */#define FB_AUX_TEXT_SVGA_GROUP8/* 8-15: SVGA tileblit compatible modes */#define FB_AUX_TEXT_SVGA_MASK7/* lower three bits says step */#define FB_AUX_TEXT_SVGA_STEP28/* SVGA text mode:  text, attr */#define FB_AUX_TEXT_SVGA_STEP49/* SVGA text mode:  text, attr,  2 reserved bytes */#define FB_AUX_TEXT_SVGA_STEP810/* SVGA text mode:  text, attr,  6 reserved bytes */#define FB_AUX_TEXT_SVGA_STEP1611/* SVGA text mode:  text, attr, 14 reserved bytes */#define FB_AUX_TEXT_SVGA_LAST15/* reserved up to 15 */#define FB_AUX_VGA_PLANES_VGA40/* 16 color planes (EGA/VGA) */#define FB_AUX_VGA_PLANES_CFB41/* CFB4 in planes (VGA) */#define FB_AUX_VGA_PLANES_CFB82/* CFB8 in planes (VGA) */#define FB_VISUAL_MONO010/* Monochr. 1=Black 0=White */#define FB_VISUAL_MONO101/* Monochr. 1=White 0=Black */#define FB_VISUAL_TRUECOLOR2/* True color*/#define FB_VISUAL_PSEUDOCOLOR3/* Pseudo color (like atari) */#define FB_VISUAL_DIRECTCOLOR4/* Direct color */#define FB_VISUAL_STATIC_PSEUDOCOLOR5/* Pseudo color readonly */#define FB_ACCEL_NONE0/* no hardware accelerator*/#define FB_ACCEL_ATARIBLITT1/* Atari Blitter*/#define FB_ACCEL_AMIGABLITT2/* Amiga Blitter                */#define FB_ACCEL_S3_TRIO643/* Cybervision64 (S3 Trio64)    */#define FB_ACCEL_NCR_77C32BLT4/* RetinaZ3 (NCR 77C32BLT)      */#define FB_ACCEL_S3_VIRGE5/* Cybervision64/3D (S3 ViRGE)*/#define FB_ACCEL_ATI_MACH64GX6/* ATI Mach 64GX family*/#define FB_ACCEL_DEC_TGA7/* DEC 21030 TGA*/#define FB_ACCEL_ATI_MACH64CT8/* ATI Mach 64CT family*/#define FB_ACCEL_ATI_MACH64VT9/* ATI Mach 64CT family VT class */#define FB_ACCEL_ATI_MACH64GT10/* ATI Mach 64CT family GT class */#define FB_ACCEL_SUN_CREATOR11/* Sun Creator/Creator3D*/#define FB_ACCEL_SUN_CGSIX12/* Sun cg6*/#define FB_ACCEL_SUN_LEO13/* Sun leo/zx*/#define FB_ACCEL_IMS_TWINTURBO14/* IMS Twin Turbo*/#define FB_ACCEL_3DLABS_PERMEDIA2 15/* 3Dlabs Permedia 2*/#define FB_ACCEL_MATROX_MGA2064W 16/* Matrox MGA2064W (Millenium)*/#define FB_ACCEL_MATROX_MGA1064SG 17/* Matrox MGA1064SG (Mystique)*/#define FB_ACCEL_MATROX_MGA2164W 18/* Matrox MGA2164W (Millenium II) */#define FB_ACCEL_MATROX_MGA2164W_AGP 19/* Matrox MGA2164W (Millenium II) */#define FB_ACCEL_MATROX_MGAG10020/* Matrox G100 (Productiva G100) */#define FB_ACCEL_MATROX_MGAG20021/* Matrox G200 (Myst, Mill, ...) */#define FB_ACCEL_SUN_CG1422/* Sun cgfourteen */#define FB_ACCEL_SUN_BWTWO23/* Sun bwtwo*/#define FB_ACCEL_SUN_CGTHREE24/* Sun cgthree*/#define FB_ACCEL_SUN_TCX25/* Sun tcx*/#define FB_ACCEL_MATROX_MGAG40026/* Matrox G400*/#define FB_ACCEL_NV327/* nVidia RIVA 128              */#define FB_ACCEL_NV428/* nVidia RIVA TNT*/#define FB_ACCEL_NV529/* nVidia RIVA TNT2*/#define FB_ACCEL_CT_6555x30/* C&T 6555x*/#define FB_ACCEL_3DFX_BANSHEE31/* 3Dfx Banshee*/#define FB_ACCEL_ATI_RAGE12832/* ATI Rage128 family*/#define FB_ACCEL_IGS_CYBER200033/* CyberPro 2000*/#define FB_ACCEL_IGS_CYBER201034/* CyberPro 2010*/#define FB_ACCEL_IGS_CYBER500035/* CyberPro 5000*/#define FB_ACCEL_SIS_GLAMOUR    36/* SiS 300/630/540              */#define FB_ACCEL_3DLABS_PERMEDIA3 37/* 3Dlabs Permedia 3*/#define FB_ACCEL_ATI_RADEON38/* ATI Radeon family*/#define FB_ACCEL_I810           39      /* Intel 810/815                */#define FB_ACCEL_SIS_GLAMOUR_2  40/* SiS 315, 650, 740*/#define FB_ACCEL_SIS_XABRE      41/* SiS 330 ("Xabre")*/#define FB_ACCEL_I830           42      /* Intel 830M/845G/85x/865G     */#define FB_ACCEL_NV_10          43      /* nVidia Arch 10               */#define FB_ACCEL_NV_20          44      /* nVidia Arch 20               */#define FB_ACCEL_NV_30          45      /* nVidia Arch 30               */#define FB_ACCEL_NV_40          46      /* nVidia Arch 40               */#define FB_ACCEL_XGI_VOLARI_V47/* XGI Volari V3XT, V5, V8      */#define FB_ACCEL_XGI_VOLARI_Z48/* XGI Volari Z7                */#define FB_ACCEL_OMAP161049/* TI OMAP16xx                  */#define FB_ACCEL_TRIDENT_TGUI50/* Trident TGUI*/#define FB_ACCEL_TRIDENT_3DIMAGE 51/* Trident 3DImage*/#define FB_ACCEL_TRIDENT_BLADE3D 52/* Trident Blade3D*/#define FB_ACCEL_TRIDENT_BLADEXP 53/* Trident BladeXP*/#define FB_ACCEL_CIRRUS_ALPINE   53/* Cirrus Logic 543x/544x/5480*/#define FB_ACCEL_NEOMAGIC_NM2070 90/* NeoMagic NM2070              */#define FB_ACCEL_NEOMAGIC_NM2090 91/* NeoMagic NM2090              */#define FB_ACCEL_NEOMAGIC_NM2093 92/* NeoMagic NM2093              */#define FB_ACCEL_NEOMAGIC_NM2097 93/* NeoMagic NM2097              */#define FB_ACCEL_NEOMAGIC_NM2160 94/* NeoMagic NM2160              */#define FB_ACCEL_NEOMAGIC_NM2200 95/* NeoMagic NM2200              */#define FB_ACCEL_NEOMAGIC_NM2230 96/* NeoMagic NM2230              */#define FB_ACCEL_NEOMAGIC_NM2360 97/* NeoMagic NM2360              */#define FB_ACCEL_NEOMAGIC_NM2380 98/* NeoMagic NM2380              */#define FB_ACCEL_PXA3XX 99/* PXA3xx*/#define FB_ACCEL_SAVAGE4        0x80/* S3 Savage4                   */#define FB_ACCEL_SAVAGE3D       0x81/* S3 Savage3D                  */#define FB_ACCEL_SAVAGE3D_MV    0x82/* S3 Savage3D-MV               */#define FB_ACCEL_SAVAGE2000     0x83/* S3 Savage2000                */#define FB_ACCEL_SAVAGE_MX_MV   0x84/* S3 Savage/MX-MV              */#define FB_ACCEL_SAVAGE_MX      0x85/* S3 Savage/MX                 */#define FB_ACCEL_SAVAGE_IX_MV   0x86/* S3 Savage/IX-MV              */#define FB_ACCEL_SAVAGE_IX      0x87/* S3 Savage/IX                 */#define FB_ACCEL_PROSAVAGE_PM   0x88/* S3 ProSavage PM133           */#define FB_ACCEL_PROSAVAGE_KM   0x89/* S3 ProSavage KM133           */#define FB_ACCEL_S3TWISTER_P    0x8a/* S3 Twister                   */#define FB_ACCEL_S3TWISTER_K    0x8b/* S3 TwisterK                  */#define FB_ACCEL_SUPERSAVAGE    0x8c    /* S3 Supersavage               */#define FB_ACCEL_PROSAVAGE_DDR  0x8d/* S3 ProSavage DDR             */#define FB_ACCEL_PROSAVAGE_DDRK 0x8e/* S3 ProSavage DDR-K           */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 /dev/fb0帧缓存内存的大小*/__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  内存映射IO开始地址 物理地址 *//* (physical address) */__u32 mmio_len;/* Length of Memory Mapped I/O 内存映射IO 长度 */__u32 accel;/* Indicate to driver which*//*  specific chip/card we have*/__u16 reserved[3];/* Reserved for future compatibility */};/* Interpretation of offset for color fields: All offsets are from the right,* inside a "pixel" value, which is exactly 'bits_per_pixel' wide (means: you* can use the offset as right argument to <<). A pixel afterwards is a bit* stream and is written to video memory as that unmodified.** For pseudocolor: offset and length should be the same for all color* components. Offset specifies the position of the least significant bit* of the pallette index in a pixel value. Length indicates the number* of available palette entries (i.e. # of entries = 1 << length).*/struct fb_bitfield {__u32 offset;/* beginning of bitfield*/__u32 length;/* length of bitfield*/__u32 msb_right;/* != 0 : Most significant bit is */ /* right */ };#define FB_NONSTD_HAM1/* Hold-And-Modify (HAM)        */#define FB_NONSTD_REV_PIX_IN_B2/* order of pixels in each byte is reversed */#define FB_ACTIVATE_NOW0/* set values immediately (or vbl)*/#define FB_ACTIVATE_NXTOPEN1/* activate on next open*/#define FB_ACTIVATE_TEST2/* don't set, round up impossible */#define FB_ACTIVATE_MASK       15/* values*/#define FB_ACTIVATE_VBL       16/* activate values on next vbl  */#define FB_CHANGE_CMAP_VBL     32/* change colormap on vbl*/#define FB_ACTIVATE_ALL       64/* change all VCs on this fb*/#define FB_ACTIVATE_FORCE     128/* force apply even when no change*/#define FB_ACTIVATE_INV_MODE  256       /* invalidate videomode */#define FB_ACCELF_TEXT1/* (OBSOLETE) see fb_info.flags and vc_mode */#define FB_SYNC_HOR_HIGH_ACT1/* horizontal sync high active*/#define FB_SYNC_VERT_HIGH_ACT2/* vertical sync high active*/#define FB_SYNC_EXT4/* external sync*/#define FB_SYNC_COMP_HIGH_ACT8/* composite sync high active   */#define FB_SYNC_BROADCAST16/* broadcast video timings      *//* vtotal = 144d/288n/576i => PAL  *//* vtotal = 121d/242n/484i => NTSC */#define FB_SYNC_ON_GREEN32/* sync on green */#define FB_VMODE_NONINTERLACED  0/* non interlaced */#define FB_VMODE_INTERLACED1/* interlaced*/#define FB_VMODE_DOUBLE2/* double scan */#define FB_VMODE_ODD_FLD_FIRST4/* interlaced: top line first */#define FB_VMODE_MASK255#define FB_VMODE_YWRAP256/* ywrap instead of panning     */#define FB_VMODE_SMOOTH_XPAN512/* smooth xpan possible (internally used) */#define FB_VMODE_CONUPDATE512/* don't update x/yoffset*//** Display rotation support*/#define FB_ROTATE_UR      0#define FB_ROTATE_CW      1#define FB_ROTATE_UD      2#define FB_ROTATE_CCW     3#define PICOS2KHZ(a) (1000000000UL/(a))#define KHZ2PICOS(a) (1000000000UL/(a))struct fb_var_screeninfo {//可变参数__u32 xres;/* visible resolution视觉上的分辨率:x和y方向的分辨率,就是两个方向上的点数*/__u32 yres;__u32 xres_virtual;/* virtual resolution虚拟分辨率*/__u32 yres_virtual;__u32 xoffset;/* offset from virtual to visible */__u32 yoffset;/* resolution*/__u32 bits_per_pixel;/* guess what每一点占有的bit位*/__u32 grayscale;/* != 0 Graylevels instead of colors */struct fb_bitfield red;/* bitfield in fb mem if true color, */struct fb_bitfield green;/* else only length is significant */struct fb_bitfield blue;struct fb_bitfield transp;/* transparency*/__u32 nonstd;/* != 0 Non standard pixel format */__u32 activate;/* see FB_ACTIVATE_**/__u32 height;/* height of picture in mm    */__u32 width;/* width of picture in mm     */__u32 accel_flags;/* (OBSOLETE) see fb_info.flags *//* Timing: All values in pixclocks, except pixclock (of course) */__u32 pixclock;/* pixel clock in ps (pico seconds) */__u32 left_margin;/* time from sync to picture*/__u32 right_margin;/* time from picture to sync*/__u32 upper_margin;/* time from sync to picture*/__u32 lower_margin;__u32 hsync_len;/* length of horizontal sync*/__u32 vsync_len;/* length of vertical sync*/__u32 sync;/* see FB_SYNC_**/__u32 vmode;/* see FB_VMODE_**/__u32 rotate;/* angle we rotate counter clockwise */__u32 reserved[5];/* Reserved for future compatibility */};struct fb_cmap {__u32 start;/* First entry*/__u32 len;/* Number of entries */__u16 *red;/* Red values*/__u16 *green;__u16 *blue;__u16 *transp;/* transparency, can be NULL */};struct fb_con2fbmap {__u32 console;__u32 framebuffer;};/* VESA Blanking Levels */#define VESA_NO_BLANKING        0#define VESA_VSYNC_SUSPEND      1#define VESA_HSYNC_SUSPEND      2#define VESA_POWERDOWN          3enum {/* screen: unblanked, hsync: on,  vsync: on */FB_BLANK_UNBLANK       = VESA_NO_BLANKING,/* screen: blanked,   hsync: on,  vsync: on */FB_BLANK_NORMAL        = VESA_NO_BLANKING + 1,/* screen: blanked,   hsync: on,  vsync: off */FB_BLANK_VSYNC_SUSPEND = VESA_VSYNC_SUSPEND + 1,/* screen: blanked,   hsync: off, vsync: on */FB_BLANK_HSYNC_SUSPEND = VESA_HSYNC_SUSPEND + 1,/* screen: blanked,   hsync: off, vsync: off */FB_BLANK_POWERDOWN     = VESA_POWERDOWN + 1};#define FB_VBLANK_VBLANKING0x001/* currently in a vertical blank */#define FB_VBLANK_HBLANKING0x002/* currently in a horizontal blank */#define FB_VBLANK_HAVE_VBLANK0x004/* vertical blanks can be detected */#define FB_VBLANK_HAVE_HBLANK0x008/* horizontal blanks can be detected */#define FB_VBLANK_HAVE_COUNT0x010/* global retrace counter is available */#define FB_VBLANK_HAVE_VCOUNT0x020/* the vcount field is valid */#define FB_VBLANK_HAVE_HCOUNT0x040/* the hcount field is valid */#define FB_VBLANK_VSYNCING0x080/* currently in a vsync */#define FB_VBLANK_HAVE_VSYNC0x100/* verical syncs can be detected */struct fb_vblank {__u32 flags;/* FB_VBLANK flags */__u32 count;/* counter of retraces since boot */__u32 vcount;/* current scanline position */__u32 hcount;/* current scandot position */__u32 reserved[4];/* reserved for future compatibility */};/* Internal HW accel */#define ROP_COPY 0#define ROP_XOR  1struct fb_copyarea {__u32 dx;__u32 dy;__u32 width;__u32 height;__u32 sx;__u32 sy;};struct fb_fillrect {__u32 dx;/* screen-relative */__u32 dy;__u32 width;__u32 height;__u32 color;__u32 rop;};struct fb_image {__u32 dx;/* Where to place image */__u32 dy;__u32 width;/* Size of image */__u32 height;__u32 fg_color;/* Only used when a mono bitmap */__u32 bg_color;__u8  depth;/* Depth of the image */const char *data;/* Pointer to image data */struct fb_cmap cmap;/* color map info */};/** hardware cursor control*/#define FB_CUR_SETIMAGE 0x01#define FB_CUR_SETPOS   0x02#define FB_CUR_SETHOT   0x04#define FB_CUR_SETCMAP  0x08#define FB_CUR_SETSHAPE 0x10#define FB_CUR_SETSIZE0x20#define FB_CUR_SETALL   0xFFstruct fbcurpos {__u16 x, y;};struct fb_cursor {__u16 set;/* what to set */__u16 enable;/* cursor on/off */__u16 rop;/* bitop operation */const char *mask;/* cursor mask bits */struct fbcurpos hot;/* cursor hot spot */struct fb_imageimage;/* Cursor image */};#ifdef CONFIG_FB_BACKLIGHT/* Settings for the generic backlight code */#define FB_BACKLIGHT_LEVELS128#define FB_BACKLIGHT_MAX0xFF#endif#endif /* _LINUX_FB_H */