⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fbcon.h

📁 该程序是在linux arm下实现的基于framebuffer的LCD驱动
💻 H
📖 第 1 页 / 共 2 页
字号:
/* *  linux/drivers/video/fbcon.h -- Low level frame buffer based console driver * *	Copyright (C) 1997 Geert Uytterhoeven * *  This file is subject to the terms and conditions of the GNU General Public *  License.  See the file COPYING in the main directory of this archive *  for more details. */#ifndef _VIDEO_FBCON_H#define _VIDEO_FBCON_H#include <linux/config.h>#include <linux/types.h>#include <linux/console_struct.h>#include <linux/vt_buffer.h>#include <asm/io.h>    /*                                       *  `switch' for the Low Level Operations     */ struct display_switch {                                                    void (*setup)(struct display *p);    void (*bmove)(struct display *p, int sy, int sx, int dy, int dx,		  int height, int width);    /* for clear, conp may be NULL, which means use a blanking (black) color */    void (*clear)(struct vc_data *conp, struct display *p, int sy, int sx,		  int height, int width);    void (*putc)(struct vc_data *conp, struct display *p, int c, int yy,    		 int xx);    void (*putcs)(struct vc_data *conp, struct display *p, const unsigned short *s,		  int count, int yy, int xx);         void (*revc)(struct display *p, int xx, int yy);    void (*cursor)(struct display *p, int mode, int xx, int yy);    int  (*set_font)(struct display *p, int width, int height);    void (*clear_margins)(struct vc_data *conp, struct display *p,			  int bottom_only);    unsigned int fontwidthmask;      /* 1 at (1 << (width - 1)) if width is supported */}; extern struct display_switch fbcon_dummy;   /*    *    This is the interface between the low-level console driver and the    *    low-level frame buffer device    */struct display {    /* Filled in by the frame buffer device */    struct fb_var_screeninfo var;   /* variable infos. yoffset and vmode */                                    /* are updated by fbcon.c */    struct fb_cmap cmap;            /* colormap */    char *screen_base;              /* pointer to top of virtual screen */                                        /* (virtual address) */    int visual;    int type;                       /* see FB_TYPE_* */    int type_aux;                   /* Interleave for interleaved Planes */    u_short ypanstep;               /* zero if no hardware ypan */    u_short ywrapstep;              /* zero if no hardware ywrap */    u_long line_length;             /* length of a line in bytes */    u_short can_soft_blank;         /* zero if no hardware blanking */    u_short inverse;                /* != 0 text black on white as default */    struct display_switch *dispsw;  /* low level operations */    void *dispsw_data;              /* optional dispsw helper data */#if 0    struct fb_fix_cursorinfo fcrsr;    struct fb_var_cursorinfo *vcrsr;    struct fb_cursorstate crsrstate;#endif    /* Filled in by the low-level console driver */    struct vc_data *conp;           /* pointer to console data */    struct fb_info *fb_info;        /* frame buffer for this console */    int vrows;                      /* number of virtual rows */    unsigned short cursor_x;        /* current cursor position */    unsigned short cursor_y;    int fgcol;                      /* text colors */    int bgcol;    u_long next_line;               /* offset to one line below */    u_long next_plane;              /* offset to next plane */    u_char *fontdata;               /* Font associated to this display */    unsigned short _fontheightlog;    unsigned short _fontwidthlog;    unsigned short _fontheight;    unsigned short _fontwidth;    int userfont;                   /* != 0 if fontdata kmalloc()ed */    u_short scrollmode;             /* Scroll Method */    short yscroll;                  /* Hardware scrolling */    unsigned char fgshift, bgshift;    unsigned short charmask;        /* 0xff or 0x1ff */};/* drivers/video/fbcon.c */extern struct display fb_display[MAX_NR_CONSOLES];extern char con2fb_map[MAX_NR_CONSOLES];extern int PROC_CONSOLE(const struct fb_info *info);extern void set_con2fb_map(int unit, int newidx);extern int set_all_vcs(int fbidx, struct fb_ops *fb,		       struct fb_var_screeninfo *var, struct fb_info *info);#define fontheight(p) ((p)->_fontheight)#define fontheightlog(p) ((p)->_fontheightlog)#ifdef CONFIG_FBCON_FONTWIDTH8_ONLY/* fontwidth w is supported by dispsw */#define FONTWIDTH(w)	(1 << ((8) - 1))/* fontwidths w1-w2 inclusive are supported by dispsw */#define FONTWIDTHRANGE(w1,w2)	FONTWIDTH(8)#define fontwidth(p) (8)#define fontwidthlog(p) (0)#else/* fontwidth w is supported by dispsw */#define FONTWIDTH(w)	(1 << ((w) - 1))/* fontwidths w1-w2 inclusive are supported by dispsw */#define FONTWIDTHRANGE(w1,w2)	(FONTWIDTH(w2+1) - FONTWIDTH(w1))#define fontwidth(p) ((p)->_fontwidth)#define fontwidthlog(p) ((p)->_fontwidthlog)#endif    /*     *  Attribute Decoding     *//* Color */#define attr_fgcol(p,s)    \	(((s) >> ((p)->fgshift)) & 0x0f)#define attr_bgcol(p,s)    \	(((s) >> ((p)->bgshift)) & 0x0f)#define	attr_bgcol_ec(p,conp) \	((conp) ? (((conp)->vc_video_erase_char >> ((p)->bgshift)) & 0x0f) : 0)/* Monochrome */#define attr_bold(p,s) \	((s) & 0x200)#define attr_reverse(p,s) \	(((s) & 0x800) ^ ((p)->inverse ? 0x800 : 0))#define attr_underline(p,s) \	((s) & 0x400)#define attr_blink(p,s) \	((s) & 0x8000)	    /*     *  Scroll Method     */     /* Internal flags */#define __SCROLL_YPAN		0x001#define __SCROLL_YWRAP		0x002#define __SCROLL_YMOVE		0x003#define __SCROLL_YREDRAW	0x004#define __SCROLL_YMASK		0x00f#define __SCROLL_YFIXED		0x010#define __SCROLL_YNOMOVE	0x020#define __SCROLL_YPANREDRAW	0x040#define __SCROLL_YNOPARTIAL	0x080/* Only these should be used by the drivers *//* Which one should you use? If you have a fast card and slow bus,   then probably just 0 to indicate fbcon should choose between   YWRAP/YPAN+MOVE/YMOVE. On the other side, if you have a fast bus   and even better if your card can do fonting (1->8/32bit painting),   you should consider either SCROLL_YREDRAW (if your card is   able to do neither YPAN/YWRAP), or SCROLL_YNOMOVE.   The best is to test it with some real life scrolling (usually, not   all lines on the screen are filled completely with non-space characters,   and REDRAW performs much better on such lines, so don't cat a file   with every line covering all screen columns, it would not be the right   benchmark). */#define SCROLL_YREDRAW		(__SCROLL_YFIXED|__SCROLL_YREDRAW)#define SCROLL_YNOMOVE		(__SCROLL_YNOMOVE|__SCROLL_YPANREDRAW)/* SCROLL_YNOPARTIAL, used in combination with the above, is for video   cards which can not handle using panning to scroll a portion of the   screen without excessive flicker.  Panning will only be used for   whole screens. *//* Namespace consistency */#define SCROLL_YNOPARTIAL	__SCROLL_YNOPARTIAL#if defined(__sparc__)/* We map all of our framebuffers such that big-endian accesses * are what we want, so the following is sufficient. */#define fb_readb sbus_readb#define fb_readw sbus_readw#define fb_readl sbus_readl#define fb_writeb sbus_writeb#define fb_writew sbus_writew#define fb_writel sbus_writel#define fb_memset sbus_memset_io#elif defined(__i386__) || defined(__alpha__) || \      defined(__x86_64__) || defined(__hppa__)#define fb_readb __raw_readb#define fb_readw __raw_readw#define fb_readl __raw_readl#define fb_writeb __raw_writeb#define fb_writew __raw_writew#define fb_writel __raw_writel#define fb_memset memset_io#else#define fb_readb(addr) (*(volatile u8 *) (addr))#define fb_readw(addr) (*(volatile u16 *) (addr))#define fb_readl(addr) (*(volatile u32 *) (addr))#define fb_writeb(b,addr) (*(volatile u8 *) (addr) = (b))#define fb_writew(b,addr) (*(volatile u16 *) (addr) = (b))#define fb_writel(b,addr) (*(volatile u32 *) (addr) = (b))#define fb_memset memset#endifextern void fbcon_redraw_clear(struct vc_data *, struct display *, int, int, int, int);extern void fbcon_redraw_bmove(struct display *, int, int, int, int, int, int);/* ================================================================= *//*                      Utility Assembler Functions                  *//* ================================================================= */#if defined(__mc68000__)/* ====================================================================== *//* Those of a delicate disposition might like to skip the next couple of * pages. * * These functions are drop in replacements for memmove and * memset(_, 0, _). However their five instances add at least a kilobyte * to the object file. You have been warned. * * Not a great fan of assembler for the sake of it, but I think * that these routines are at least 10 times faster than their C * equivalents for large blits, and that's important to the lowest level of * a graphics driver. Question is whether some scheme with the blitter * would be faster. I suspect not for simple text system - not much * asynchrony. * * Code is very simple, just gruesome expansion. Basic strategy is to * increase data moved/cleared at each step to 16 bytes to reduce * instruction per data move overhead. movem might be faster still * For more than 15 bytes, we try to align the write direction on a * longword boundary to get maximum speed. This is even more gruesome. * Unaligned read/write used requires 68020+ - think this is a problem? * * Sorry! *//* ++roman: I've optimized Robert's original versions in some minor * aspects, e.g. moveq instead of movel, let gcc choose the registers, * use movem in some places... * For other modes than 1 plane, lots of more such assembler functions * were needed (e.g. the ones using movep or expanding color values). *//* ++andreas: more optimizations:   subl #65536,d0 replaced by clrw d0; subql #1,d0 for dbcc   addal is faster than addaw   movep is rather expensive compared to ordinary move's   some functions rewritten in C for clarity, no speed loss */static __inline__ void *fb_memclear_small(void *s, size_t count){   if (!count)      return(0);   __asm__ __volatile__(         "lsrl   #1,%1 ; jcc 1f ; moveb %2,%0@-\n\t"      "1: lsrl   #1,%1 ; jcc 1f ; movew %2,%0@-\n\t"      "1: lsrl   #1,%1 ; jcc 1f ; movel %2,%0@-\n\t"      "1: lsrl   #1,%1 ; jcc 1f ; movel %2,%0@- ; movel %2,%0@-\n\t"      "1:"         : "=a" (s), "=d" (count)         : "d" (0), "0" ((char *)s+count), "1" (count)   );   __asm__ __volatile__(         "subql  #1,%1 ; jcs 3f\n\t"	 "movel %2,%%d4; movel %2,%%d5; movel %2,%%d6\n\t"      "2: moveml %2/%%d4/%%d5/%%d6,%0@-\n\t"         "dbra %1,2b\n\t"      "3:"         : "=a" (s), "=d" (count)         : "d" (0), "0" (s), "1" (count)	 : "d4", "d5", "d6"  );   return(0);}static __inline__ void *fb_memclear(void *s, size_t count){   if (!count)      return(0);   if (count < 16) {      __asm__ __volatile__(            "lsrl   #1,%1 ; jcc 1f ; clrb %0@+\n\t"         "1: lsrl   #1,%1 ; jcc 1f ; clrw %0@+\n\t"         "1: lsrl   #1,%1 ; jcc 1f ; clrl %0@+\n\t"         "1: lsrl   #1,%1 ; jcc 1f ; clrl %0@+ ; clrl %0@+\n\t"         "1:"            : "=a" (s), "=d" (count)            : "0" (s), "1" (count)     );   } else {      long tmp;      __asm__ __volatile__(            "movel %1,%2\n\t"            "lsrl   #1,%2 ; jcc 1f ; clrb %0@+ ; subqw #1,%1\n\t"            "lsrl   #1,%2 ; jcs 2f\n\t"  /* %0 increased=>bit 2 switched*/            "clrw   %0@+  ; subqw  #2,%1 ; jra 2f\n\t"         "1: lsrl   #1,%2 ; jcc 2f\n\t"            "clrw   %0@+  ; subqw  #2,%1\n\t"         "2: movew %1,%2; lsrl #2,%1 ; jeq 6f\n\t"            "lsrl   #1,%1 ; jcc 3f ; clrl %0@+\n\t"         "3: lsrl   #1,%1 ; jcc 4f ; clrl %0@+ ; clrl %0@+\n\t"         "4: subql  #1,%1 ; jcs 6f\n\t"         "5: clrl %0@+; clrl %0@+ ; clrl %0@+ ; clrl %0@+\n\t"            "dbra %1,5b   ; clrw %1; subql #1,%1; jcc 5b\n\t"         "6: movew %2,%1; btst #1,%1 ; jeq 7f ; clrw %0@+\n\t"         "7:            ; btst #0,%1 ; jeq 8f ; clrb %0@+\n\t"         "8:"            : "=a" (s), "=d" (count), "=d" (tmp)            : "0" (s), "1" (count)     );   }   return(0);}static __inline__ void *fb_memset255(void *s, size_t count){   if (!count)      return(0);   __asm__ __volatile__(         "lsrl   #1,%1 ; jcc 1f ; moveb %2,%0@-\n\t"      "1: lsrl   #1,%1 ; jcc 1f ; movew %2,%0@-\n\t"      "1: lsrl   #1,%1 ; jcc 1f ; movel %2,%0@-\n\t"      "1: lsrl   #1,%1 ; jcc 1f ; movel %2,%0@- ; movel %2,%0@-\n\t"      "1:"         : "=a" (s), "=d" (count)         : "d" (-1), "0" ((char *)s+count), "1" (count)   );   __asm__ __volatile__(         "subql  #1,%1 ; jcs 3f\n\t"	 "movel %2,%%d4; movel %2,%%d5; movel %2,%%d6\n\t"      "2: moveml %2/%%d4/%%d5/%%d6,%0@-\n\t"         "dbra %1,2b\n\t"      "3:"         : "=a" (s), "=d" (count)         : "d" (-1), "0" (s), "1" (count)	 : "d4", "d5", "d6"  );   return(0);}static __inline__ void *fb_memmove(void *d, const void *s, size_t count){   if (d < s) {      if (count < 16) {         __asm__ __volatile__(               "lsrl   #1,%2 ; jcc 1f ; moveb %1@+,%0@+\n\t"            "1: lsrl   #1,%2 ; jcc 1f ; movew %1@+,%0@+\n\t"            "1: lsrl   #1,%2 ; jcc 1f ; movel %1@+,%0@+\n\t"            "1: lsrl   #1,%2 ; jcc 1f ; movel %1@+,%0@+ ; movel %1@+,%0@+\n\t"            "1:"               : "=a" (d), "=a" (s), "=d" (count)               : "0" (d), "1" (s), "2" (count)        );      } else {         long tmp;         __asm__ __volatile__(               "movel  %0,%3\n\t"               "lsrl   #1,%3 ; jcc 1f ; moveb %1@+,%0@+ ; subqw #1,%2\n\t"               "lsrl   #1,%3 ; jcs 2f\n\t"  /* %0 increased=>bit 2 switched*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -