1¡¢framebuffer Ö¡»º³å
Ö¡»º³å£¨framebuffer£©ÊÇLinux ϵͳΪÏÔʾÉ豸ÌṩµÄÒ»¸ö½Ó¿Ú£¬Ëü½«ÏÔʾ»º³åÇø³éÏ󣬯Á±ÎͼÏñÓ²¼þµÄµ×²ã²îÒ죬ÔÊÐíÉϲãÓ¦ÓóÌÐòÔÚͼÐÎģʽÏÂÖ±½Ó¶ÔÏÔʾ»º³åÇø½øÐжÁд²Ù×÷¡£Óû§²»±Ø¹ØÐÄÎïÀíÏÔʾ»º³åÇøµÄ¾ßÌåλÖü°´æ·Å·½Ê½£¬ÕâЩ¶¼ÓÉÖ¡»º³åÉ豸Çý¶¯±¾ÉíÀ´Íê³É¡£
framebuffer»úÖÆÄ£·ÂÏÔ¿¨µÄ¹¦ÄÜ£¬½«ÏÔ¿¨Ó²¼þ½á¹¹³éÏóΪһϵÁеÄÊý¾Ý½á¹¹£¬¿ÉÒÔͨ¹ýframebufferµÄ¶Áдֱ½Ó¶ÔÏÔ´æ½øÐвÙ×÷¡£Óû§¿ÉÒÔ½«framebuffer¿´³ÉÊÇÏÔ´æµÄÒ»¸öÓ³Ïñ£¬½«ÆäÓ³Éäµ½½ø³Ì¿Õ¼äºó£¬¾Í¿ÉÒÔÖ±½Ó½øÐжÁд²Ù×÷£¬Ð´²Ù×÷»áÖ±½Ó·´Ó³ÔÚÆÁÄ»ÉÏ¡£
framebufferÊǸö×Ö·ûÉ豸£¬Ö÷É豸ºÅΪ29£¬¶ÔÓ¦ÓÚ/dev/fb%d É豸Îļþ¡£
ͨ³££¬Ê¹ÓÃÈçÏ·½Ê½£¨Ç°ÃæµÄÊý×Ö±íʾ´ÎÉ豸ºÅ£©
0 = /dev/fb0 µÚÒ»¸öfb É豸
1 = /dev/fb1 µÚ¶þ¸öfb É豸
fb Ò²ÊÇÒ»ÖÖÆÕͨµÄÄÚ´æÉ豸£¬¿ÉÒÔ¶ÁдÆäÄÚÈÝ¡£ÀýÈ磬ÆÁÄ»×¥ÆÁ£ºcp /dev/fb0 myfilefb ËäÈ»¿ÉÒÔÏñÄÚ´æÉ豸£¨/dev/mem£©Ò»Ñù£¬¶ÔÆäread,write,seek ÒÔ¼°mmap¡£µ«Çø±ðÔÚÓÚfb ʹÓõIJ»ÊÇÕû¸öÄÚ´æÇø£¬¶øÊÇÏԴ沿·Ö¡£
2¡¢fbÓëÓ¦ÓóÌÐòµÄ½»»¥
¶ÔÓÚÓû§³ÌÐò¶øÑÔ£¬ËüºÍÆäËûµÄÉ豸²¢Ã»ÓÐÊ²Ã´Çø±ð£¬Óû§¿ÉÒÔ°Ñfb¿´³ÉÊÇÒ»¿éÄڴ棬¼È¿ÉÒÔÏòÄÚ´æÖÐдÊý¾Ý£¬Ò²¿ÉÒÔ¶ÁÊý¾Ý¡£fbµÄÏÔʾ»º³åÇøÎ»ÓÚÄں˿ռ䣬ӦÓóÌÐò¿ÉÒ԰Ѵ˿ռäÓ³Éäµ½×Ô¼ºµÄÓû§¿Õ¼ä£¬ÔÚ½øÐвÙ×÷¡£
ÔÚÓ¦ÓóÌÐòÖУ¬²Ù×÷/dev/fbnµÄÒ»°ã²½ÖèÈçÏ£º
£¨1£©´ò¿ª/dev/fbnÉ豸Îļþ¡£
£¨2£©ÓÃioctl()²Ù×÷È¡µÃµ±Ç°ÏÔʾÆÁÄ»µÄ²ÎÊý£¬ÈçÆÁÄ»·Ö±æÂÊ¡¢Ã¿
¸öÏñËØµãµÄ±ÈÌØÊý¡£¸ù¾ÝÆÁÄ»²ÎÊý¿É¼ÆËãÆÁÄ»»º³åÇøµÄ´óС¡£
£¨3£©ÓÃmmap()º¯Êý£¬½«ÆÁÄ»»º³åÇøÓ³Éäµ½Óû§¿Õ¼ä¡£
£¨4£©Ó³Éäºó¾Í¿ÉÒÔÖ±½Ó¶Á/дÆÁÄ»»º³åÇø£¬½øÐлæÍ¼ºÍͼƬÏÔʾÁË¡£
3¡¢fbµÄ½á¹¹¼°ÆäÏà¹Ø½á¹¹Ìå
ÔÚlinuxÖУ¬fbÉ豸Çý¶¯µÄÔ´ÂëÖ÷ÒªÔÚFb.h (linux2.6.28\include\linux)ºÍFbmem.c (linux2.6.28\drivers\video)Á½¸öÎļþÖУ¬ËüÃÇÊÇfbÉ豸Çý¶¯µÄÖмä²ã£¬ÎªÉϲãÌṩϵͳµ÷Óã¬Îªµ×²ãÇý¶¯Ìṩ½Ó¿Ú¡£

ÔÚfb.hÎļþÖÐÓÐfbÇý¶¯ÐèҪʹÓõĺܶà½á¹¹£¬ÎÒÃÇÏȶÔÕâЩ½á¹¹Ìå½øÐÐ˵Ã÷£º
£¨1£©¡¢
Ò»¸öÖ¡»º³åÇø¶ÔÓ¦Ò»¸östruct fb_info½á¹¹£¬Ëü°üÀ¨ÁËÖ¡»º³åÉ豸µÄÊôÐԺͲÙ×÷µÄÍêÕû¼¯ºÏ£¬Ã¿¸öÖ¡É豸¶¼ÓÐÒ»¸öfb_info½á¹¹Ìå¡£Ô´ÂëÈçÏ£º
struct fb_info {
int node;
int flags;
struct mutex lock;/* Lock for open/release/ioctl funcs */»¥³âËø
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 */ͼÏñÓ²¼þmapper
struct fb_pixmap sprite;/* Cursor hardware mapper */¹â±êÓ²¼þmapper
struct fb_cmap cmap;/* Current cmap */µ±Ç°µÄµ÷É«°å
struct list_head modelist; /* mode list */
struct fb_videomode *mode;/* current mode */µ±Ç°µÄÊÓÆµÄ£Ê½
#ifdef CONFIG_FB_BACKLIGHTÈç¹ûÅäÖÃÁËLCDÖ§³Ö±³¹âµÆ
/* assigned backlight device */
/* set before framebuffer registration,
remove after unregister */±³¹âµ÷Õû
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 */fbÉ豸
int class_flag; /* private sysfs flags */˽ÓеÄsysfs±êÖ¾
#ifdef CONFIG_FB_TILEBLITTING
struct fb_tile_ops *tileops; /* Tile Blitting */ͼ¿éblitting
#endif
char __iomem *screen_base;/* Virtual address */ÐéÄâ»ùµØÖ·
unsigned long screen_size;/* Amount of ioremapped VRAM or 0 */ ioremapµÄÐéÄâÄÚ´æ´óС
void *pseudo_palette;/* Fake palette of 16 colors */ α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 */
/* From here on everything is device dependent */
void *par;
};
£¨2£©¡¢
/*
* Frame buffer operations
*
* LOCKING NOTE: those functions must _ALL_ be called with the console
* semaphore held, this is the only suitable locking mechanism we have
* in 2.6. Some may be called at interrupt time at this point though.
*/
fb_ops½á¹¹ÌåÓÃÀ´ÊµÏÖ¶ÔÖ¡»º³åÉ豸µÄ²Ù×÷£¬ÕâЩº¯ÊýÐèÒªÇý¶¯¿ª·¢ÈËÔ±±àд£¬
struct fb_ops {
/* open/release and usage marking */
struct module *owner;
´ò¿ªºÍÊÍ·Å
int (*fb_open)(struct fb_info *info, int user);
int (*fb_release)(struct fb_info *info, int user);
ÕâÁ½¸öº¯Êý¶ÔÓÚ·ÇÏßÐÔ²¼¾ÖµÄ/³£¹æÄÚ´æÓ³ÉäÎÞ·¨¹¤×÷µÄÖ¡»º³åÉ豸ÐèÒª
/* For framebuffers with strange non linear la