FrameBuffer浅谈

FrameBuffer通常作为LCD控制器或者其他显示设备的驱动,FrameBuffer驱动是一个字符设备,设备节点是/dev/fbX,主设备号为29,次设备号递增,用户可以将Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节。这些都是由Framebuffer设备驱动来完成的。Framebuffer设备为上层应用程序提供系统调用,也为下一层的特定硬件驱动提供接口;那些底层硬件驱动需要用到这儿的接口来向系统内核注册它们自己。

Framebuffer数据结构

kernel\include\linux\fb.h

fb_info是Linux为帧缓冲设备定义的驱动层接口。它不仅包含了底层函数,而且还有记录设备状态的数据。每个帧缓冲设备都与一个fb_info结构相对应。

struct fb_info {
  atomic_t count;
  int node;  /*一个FrameBuffer设备的次设备号*/
  int flags;
  struct mutex lock;		/* Lock for open/release/ioctl funcs */
  struct mutex mm_lock;		/* Lock for fb_mmap and smem_* fields */
  struct fb_var_screeninfo var;/* Current var */
  struct fb_fix_screeninfo fix;/* Current fix */
  struct fb_monspecs monspecs;/* Current Monitor specs */
  struct work_struct queue;	/* Framebuffer event queue */
  struct fb_pixmap pixmap;	/* Image hardware mapper */
  struct fb_pixmap sprite;	/* Cursor hardware mapper */
  struct fb_cmap cmap;		/* Current cmap */
  struct list_head modelist;  /* mode list */
  struct fb_videomode *mode;	/* current mode */
#ifdef CONFIG_FB_BACKLIGHT
  struct backlight_device *bl_dev;
  /* Backlight level curve */
  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;	/* This is the parent */
  struct device *dev;		/* This is this fb device */
  int class_flag;         /* private sysfs flags */
#ifdef CONFIG_FB_TILEBLITTING
  struct fb_tile_ops *tileops;/* Tile Blitting */
#endif
  char __iomem *screen_base;	/* Virtual address */
  unsigned long screen_size;	/* Amount of ioremapped VRAM or 0 */ 
  void *pseudo_palette;		/* Fake palette of 16 colors */ 
#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;
  struct apertures_struct {
    unsigned int count;
    struct aperture {
      resource_size_t base;
      resource_size_t size;
    } ranges[0];
  } *apertures;
};

fb_var_screeninfo:用于记录用户可修改的显示控制器参数,包括屏幕分辨率、每个像素点的比特数等

struct fb_var_screeninfo {
  __u32 xres;			/* 行可见像素*/
  __u32 yres;         /* 列可见像素*/
  __u32 xres_virtual;	/* 行虚拟像素*/
  __u32 yres_virtual; /* 列虚拟像素*/
  __u32 xoffset;		/* 水平偏移量*/
  __u32 yoffset;		/* 垂直偏移量*/
  __u32 bits_per_pixel;/*每个像素所占bit位数*/
  __u32 grayscale;	/* 灰色刻度*/
  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;			/* 图像高度*/
  __u32 width;			/* 图像宽度*/
  __u32 accel_flags;		/* (OBSOLETE) see fb_info.flags */
  __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 */
};

fb_fix_screeninfo:记录了用户不能修改的显示控制器的参数,这些参数是在驱动初始化时设置的

struct fb_fix_screeninfo {
  char id[16];			/* identification string eg "TT Builtin" */
  unsigned long smem_start;/* Start of frame buffer mem */
  __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;			
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值