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

📄 fbcon.h

📁 该程序是在linux arm下实现的基于framebuffer的LCD驱动
💻 H
📖 第 1 页 / 共 2 页
字号:
               "movew  %1@+,%0@+  ; subqw  #2,%2 ; jra 2f\n\t"            "1: lsrl   #1,%3 ; jcc 2f\n\t"               "movew  %1@+,%0@+  ; subqw  #2,%2\n\t"            "2: movew  %2,%-; lsrl #2,%2 ; jeq 6f\n\t"               "lsrl   #1,%2 ; jcc 3f ; movel %1@+,%0@+\n\t"            "3: lsrl   #1,%2 ; jcc 4f ; movel %1@+,%0@+ ; movel %1@+,%0@+\n\t"            "4: subql  #1,%2 ; jcs 6f\n\t"            "5: movel  %1@+,%0@+;movel %1@+,%0@+\n\t"               "movel  %1@+,%0@+;movel %1@+,%0@+\n\t"               "dbra   %2,5b ; clrw %2; subql #1,%2; jcc 5b\n\t"            "6: movew  %+,%2; btst #1,%2 ; jeq 7f ; movew %1@+,%0@+\n\t"            "7:              ; btst #0,%2 ; jeq 8f ; moveb %1@+,%0@+\n\t"            "8:"               : "=a" (d), "=a" (s), "=d" (count), "=d" (tmp)               : "0" (d), "1" (s), "2" (count)        );      }   } else {      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" ((char *) d + count), "1" ((char *) s + count), "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*/               "movew  %1@-,%0@-  ; subqw  #2,%2 ; jra 2f\n\t"            "1: lsrl   #1,%3 ; jcc 2f\n\t"               "movew  %1@-,%0@-  ; subqw  #2,%2\n\t"            "2: movew %2,%-; lsrl #2,%2 ; jeq 6f\n\t"               "lsrl   #1,%2 ; jcc 3f ; movel %1@-,%0@-\n\t"            "3: lsrl   #1,%2 ; jcc 4f ; movel %1@-,%0@- ; movel %1@-,%0@-\n\t"            "4: subql  #1,%2 ; jcs 6f\n\t"            "5: movel %1@-,%0@-;movel %1@-,%0@-\n\t"               "movel %1@-,%0@-;movel %1@-,%0@-\n\t"               "dbra %2,5b ; clrw %2; subql #1,%2; jcc 5b\n\t"            "6: movew %+,%2; btst #1,%2 ; jeq 7f ; movew %1@-,%0@-\n\t"            "7:              ; btst #0,%2 ; jeq 8f ; moveb %1@-,%0@-\n\t"            "8:"               : "=a" (d), "=a" (s), "=d" (count), "=d" (tmp)               : "0" ((char *) d + count), "1" ((char *) s + count), "2" (count)        );      }   }   return(0);}/* ++andreas: Simple and fast version of memmove, assumes size is   divisible by 16, suitable for moving the whole screen bitplane */static __inline__ void fast_memmove(char *dst, const char *src, size_t size){  if (!size)    return;  if (dst < src)    __asm__ __volatile__      ("1:"       "  moveml %0@+,%/d0/%/d1/%/a0/%/a1\n"       "  moveml %/d0/%/d1/%/a0/%/a1,%1@\n"       "  addql #8,%1; addql #8,%1\n"       "  dbra %2,1b\n"       "  clrw %2; subql #1,%2\n"       "  jcc 1b"       : "=a" (src), "=a" (dst), "=d" (size)       : "0" (src), "1" (dst), "2" (size / 16 - 1)       : "d0", "d1", "a0", "a1", "memory");  else    __asm__ __volatile__      ("1:"       "  subql #8,%0; subql #8,%0\n"       "  moveml %0@,%/d0/%/d1/%/a0/%/a1\n"       "  moveml %/d0/%/d1/%/a0/%/a1,%1@-\n"       "  dbra %2,1b\n"       "  clrw %2; subql #1,%2\n"       "  jcc 1b"       : "=a" (src), "=a" (dst), "=d" (size)       : "0" (src + size), "1" (dst + size), "2" (size / 16 - 1)       : "d0", "d1", "a0", "a1", "memory");}#elif defined(CONFIG_SUN4)/* You may think that I'm crazy and that I should use generic   routines.  No, I'm not: sun4's framebuffer crashes if we std   into it, so we cannot use memset.  */static __inline__ void *sun4_memset(void *s, char val, size_t count){    int i;    for(i=0; i<count;i++)        ((char *) s) [i] = val;    return s;}static __inline__ void *fb_memset255(void *s, size_t count){    return sun4_memset(s, 255, count);}static __inline__ void *fb_memclear(void *s, size_t count){    return sun4_memset(s, 0, count);}static __inline__ void *fb_memclear_small(void *s, size_t count){    return sun4_memset(s, 0, count);}/* To be honest, this is slow_memmove :). But sun4 is crappy, so what we can do. */static __inline__ void fast_memmove(void *d, const void *s, size_t count){    int i;    if (d<s) {	for (i=0; i<count; i++)	    ((char *) d)[i] = ((char *) s)[i];    } else	for (i=0; i<count; i++)	    ((char *) d)[count-i-1] = ((char *) s)[count-i-1];}static __inline__ void *fb_memmove(char *dst, const char *src, size_t size){    fast_memmove(dst, src, size);    return dst;}#elsestatic __inline__ void *fb_memclear_small(void *s, size_t count){    char *xs = (char *) s;    while (count--)	fb_writeb(0, xs++);    return s;}static __inline__ void *fb_memclear(void *s, size_t count){    unsigned long xs = (unsigned long) s;    if (count < 8)	goto rest;    if (xs & 1) {	fb_writeb(0, xs++);	count--;    }    if (xs & 2) {	fb_writew(0, xs);	xs += 2;	count -= 2;    }    while (count > 3) {	fb_writel(0, xs);	xs += 4;	count -= 4;    }rest:    while (count--)	fb_writeb(0, xs++);    return s;}static __inline__ void *fb_memset255(void *s, size_t count){    unsigned long xs = (unsigned long) s;    if (count < 8)	goto rest;    if (xs & 1) {	fb_writeb(0xff, xs++);	count--;    }    if (xs & 2) {	fb_writew(0xffff, xs);	xs += 2;	count -= 2;    }    while (count > 3) {	fb_writel(0xffffffff, xs);	xs += 4;	count -= 4;    }rest:    while (count--)	fb_writeb(0xff, xs++);    return s;}#if defined(__i386__)static __inline__ void fast_memmove(void *d, const void *s, size_t count){  int d0, d1, d2, d3;    if (d < s) {__asm__ __volatile__ (	"cld\n\t"	"shrl $1,%%ecx\n\t"	"jnc 1f\n\t"	"movsb\n"	"1:\tshrl $1,%%ecx\n\t"	"jnc 2f\n\t"	"movsw\n"	"2:\trep\n\t"	"movsl"	: "=&c" (d0), "=&D" (d1), "=&S" (d2)	:"0"(count),"1"((long)d),"2"((long)s)	:"memory");    } else {__asm__ __volatile__ (	"std\n\t"	"shrl $1,%%ecx\n\t"	"jnc 1f\n\t"	"movb 3(%%esi),%%al\n\t"	"movb %%al,3(%%edi)\n\t"	"decl %%esi\n\t"	"decl %%edi\n"	"1:\tshrl $1,%%ecx\n\t"	"jnc 2f\n\t"	"movw 2(%%esi),%%ax\n\t"	"movw %%ax,2(%%edi)\n\t"	"decl %%esi\n\t"	"decl %%edi\n\t"	"decl %%esi\n\t"	"decl %%edi\n"	"2:\trep\n\t"	"movsl\n\t"	"cld"	: "=&c" (d0), "=&D" (d1), "=&S" (d2), "=&a" (d3)	:"0"(count),"1"(count-4+(long)d),"2"(count-4+(long)s)	:"memory");    }}static __inline__ void *fb_memmove(char *dst, const char *src, size_t size){    fast_memmove(dst, src, size);    return dst;}#else /* !__i386__ */    /*     *  Anyone who'd like to write asm functions for other CPUs?     *   (Why are these functions better than those from include/asm/string.h?)     */static __inline__ void *fb_memmove(void *d, const void *s, size_t count){    unsigned long dst, src;    if (d < s) {	dst = (unsigned long) d;	src = (unsigned long) s;	if ((count < 8) || ((dst ^ src) & 3))	    goto restup;	if (dst & 1) {	    fb_writeb(fb_readb(src++), dst++);	    count--;	}	if (dst & 2) {	    fb_writew(fb_readw(src), dst);	    src += 2;	    dst += 2;	    count -= 2;	}	while (count > 3) {	    fb_writel(fb_readl(src), dst);	    src += 4;	    dst += 4;	    count -= 4;	}    restup:	while (count--)	    fb_writeb(fb_readb(src++), dst++);    } else {	dst = (unsigned long) d + count;	src = (unsigned long) s + count;	if ((count < 8) || ((dst ^ src) & 3))	    goto restdown;	if (dst & 1) {	    src--;	    dst--;	    count--;	    fb_writeb(fb_readb(src), dst);	}	if (dst & 2) {	    src -= 2;	    dst -= 2;	    count -= 2;	    fb_writew(fb_readw(src), dst);	}	while (count > 3) {	    src -= 4;	    dst -= 4;	    count -= 4;	    fb_writel(fb_readl(src), dst);	}    restdown:	while (count--) {	    src--;	    dst--;	    fb_writeb(fb_readb(src), dst);	}    }    return d;}static __inline__ void fast_memmove(char *d, const char *s, size_t count){    unsigned long dst, src;    if (d < s) {	dst = (unsigned long) d;	src = (unsigned long) s;	if ((count < 8) || ((dst ^ src) & 3))	    goto restup;	if (dst & 1) {	    fb_writeb(fb_readb(src++), dst++);	    count--;	}	if (dst & 2) {	    fb_writew(fb_readw(src), dst);	    src += 2;	    dst += 2;	    count -= 2;	}	while (count > 3) {	    fb_writel(fb_readl(src), dst);	    src += 4;	    dst += 4;	    count -= 4;	}    restup:	while (count--)	    fb_writeb(fb_readb(src++), dst++);    } else {	dst = (unsigned long) d + count;	src = (unsigned long) s + count;	if ((count < 8) || ((dst ^ src) & 3))	    goto restdown;	if (dst & 1) {	    src--;	    dst--;	    count--;	    fb_writeb(fb_readb(src), dst);	}	if (dst & 2) {	    src -= 2;	    dst -= 2;	    count -= 2;	    fb_writew(fb_readw(src), dst);	}	while (count > 3) {	    src -= 4;	    dst -= 4;	    count -= 4;	    fb_writel(fb_readl(src), dst);	}    restdown:	while (count--) {	    src--;	    dst--;	    fb_writeb(fb_readb(src), dst);	}    }}#endif /* !__i386__ */#endif /* !__mc68000__ */#endif /* _VIDEO_FBCON_H */

⌨️ 快捷键说明

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