diff options
Diffstat (limited to 'drivers/video/fbcon-cfb8.c')
-rw-r--r-- | drivers/video/fbcon-cfb8.c | 141 |
1 files changed, 60 insertions, 81 deletions
diff --git a/drivers/video/fbcon-cfb8.c b/drivers/video/fbcon-cfb8.c index 5fa339be1..c559f4025 100644 --- a/drivers/video/fbcon-cfb8.c +++ b/drivers/video/fbcon-cfb8.c @@ -13,70 +13,44 @@ #include <linux/tty.h> #include <linux/console.h> #include <linux/string.h> +#include <linux/config.h> #include <linux/fb.h> #include "fbcon.h" - - - /* - * Prototypes - */ - -static int open_cfb8(struct display *p); -static void release_cfb8(void); -static void bmove_cfb8(struct display *p, int sy, int sx, int dy, int dx, - int height, int width); -static void clear_cfb8(struct vc_data *conp, struct display *p, int sy, - int sx, int height, int width); -static void putc_cfb8(struct vc_data *conp, struct display *p, int c, int yy, - int xx); -static void putcs_cfb8(struct vc_data *conp, struct display *p, - const char *s, int count, int yy, int xx); -static void rev_char_cfb8(struct display *p, int xx, int yy); - - - /* - * `switch' for the low level operations - */ - -static struct display_switch dispsw_cfb8 = { - open_cfb8, release_cfb8, bmove_cfb8, clear_cfb8, putc_cfb8, putcs_cfb8, - rev_char_cfb8 -}; +#include "fbcon-cfb8.h" /* * 8 bpp packed pixels */ -static u_long nibbletab_cfb8[] = { +static u32 nibbletab_cfb8[] = { +#if defined(__BIG_ENDIAN) 0x00000000,0x000000ff,0x0000ff00,0x0000ffff, 0x00ff0000,0x00ff00ff,0x00ffff00,0x00ffffff, 0xff000000,0xff0000ff,0xff00ff00,0xff00ffff, 0xffff0000,0xffff00ff,0xffffff00,0xffffffff +#elif defined(__LITTLE_ENDIAN) + 0x00000000,0xff000000,0x00ff0000,0xffff0000, + 0x0000ff00,0xff00ff00,0x00ffff00,0xffffff00, + 0x000000ff,0xff0000ff,0x00ff00ff,0xffff00ff, + 0x0000ffff,0xff00ffff,0x00ffffff,0xffffffff +#else +#error FIXME: No endianness?? +#endif }; -static int open_cfb8(struct display *p) +void fbcon_cfb8_setup(struct display *p) { - if (p->type != FB_TYPE_PACKED_PIXELS || p->var.bits_per_pixel != 8) - return -EINVAL; - p->next_line = p->var.xres_virtual; p->next_plane = 0; - MOD_INC_USE_COUNT; - return 0; } -static void release_cfb8(void) -{ - MOD_DEC_USE_COUNT; -} - -static void bmove_cfb8(struct display *p, int sy, int sx, int dy, int dx, - int height, int width) +void fbcon_cfb8_bmove(struct display *p, int sy, int sx, int dy, int dx, + int height, int width) { int bytes = p->next_line, linesize = bytes * p->fontheight, rows; - u_char *src,*dst; + u8 *src,*dst; if (sx == 0 && dx == 0 && width * 8 == bytes) mymemmove(p->screen_base + dy * linesize, @@ -101,12 +75,12 @@ static void bmove_cfb8(struct display *p, int sy, int sx, int dy, int dx, } } -static void clear_cfb8(struct vc_data *conp, struct display *p, int sy, int sx, - int height, int width) +void fbcon_cfb8_clear(struct vc_data *conp, struct display *p, int sy, int sx, + int height, int width) { - u_char *dest0,*dest; + u8 *dest0,*dest; int bytes=p->next_line,lines=height * p->fontheight, rows, i; - u_long bgx; + u32 bgx; dest = p->screen_base + sy * p->fontheight * bytes + sx * 8; @@ -116,8 +90,8 @@ static void clear_cfb8(struct vc_data *conp, struct display *p, int sy, int sx, if (sx == 0 && width * 8 == bytes) for (i = 0 ; i < lines * width ; i++) { - ((u_long *)dest)[0]=bgx; - ((u_long *)dest)[1]=bgx; + ((u32 *)dest)[0]=bgx; + ((u32 *)dest)[1]=bgx; dest+=8; } else { @@ -125,20 +99,20 @@ static void clear_cfb8(struct vc_data *conp, struct display *p, int sy, int sx, for (rows = lines; rows-- ; dest0 += bytes) { dest=dest0; for (i = 0 ; i < width ; i++) { - ((u_long *)dest)[0]=bgx; - ((u_long *)dest)[1]=bgx; + ((u32 *)dest)[0]=bgx; + ((u32 *)dest)[1]=bgx; dest+=8; } } } } -static void putc_cfb8(struct vc_data *conp, struct display *p, int c, int yy, - int xx) +void fbcon_cfb8_putc(struct vc_data *conp, struct display *p, int c, int yy, + int xx) { - u_char *dest,*cdat; + u8 *dest,*cdat; int bytes=p->next_line,rows; - ulong eorx,fgx,bgx; + u32 eorx,fgx,bgx; c &= 0xff; @@ -154,17 +128,17 @@ static void putc_cfb8(struct vc_data *conp, struct display *p, int c, int yy, eorx = fgx ^ bgx; for (rows = p->fontheight ; rows-- ; dest += bytes) { - ((u_long *)dest)[0]= (nibbletab_cfb8[*cdat >> 4] & eorx) ^ bgx; - ((u_long *)dest)[1]= (nibbletab_cfb8[*cdat++ & 0xf] & eorx) ^ bgx; + ((u32 *)dest)[0]= (nibbletab_cfb8[*cdat >> 4] & eorx) ^ bgx; + ((u32 *)dest)[1]= (nibbletab_cfb8[*cdat++ & 0xf] & eorx) ^ bgx; } } -static void putcs_cfb8(struct vc_data *conp, struct display *p, const char *s, - int count, int yy, int xx) +void fbcon_cfb8_putcs(struct vc_data *conp, struct display *p, const char *s, + int count, int yy, int xx) { - u_char *cdat, c, *dest, *dest0; + u8 *cdat, c, *dest, *dest0; int rows,bytes=p->next_line; - u_long eorx, fgx, bgx; + u32 eorx, fgx, bgx; dest0 = p->screen_base + yy * p->fontheight * bytes + xx * 8; fgx=attr_fgcol(p,conp); @@ -179,39 +153,44 @@ static void putcs_cfb8(struct vc_data *conp, struct display *p, const char *s, cdat = p->fontdata + c * p->fontheight; for (rows = p->fontheight, dest = dest0; rows-- ; dest += bytes) { - ((u_long *)dest)[0]= (nibbletab_cfb8[*cdat >> 4] & eorx) ^ bgx; - ((u_long *)dest)[1]= (nibbletab_cfb8[*cdat++ & 0xf] & eorx) ^ - bgx; + ((u32 *)dest)[0]= (nibbletab_cfb8[*cdat >> 4] & eorx) ^ bgx; + ((u32 *)dest)[1]= (nibbletab_cfb8[*cdat++ & 0xf] & eorx) ^ bgx; } dest0+=8; } } -static void rev_char_cfb8(struct display *p, int xx, int yy) +void fbcon_cfb8_revc(struct display *p, int xx, int yy) { - u_char *dest; + u8 *dest; int bytes=p->next_line, rows; dest = p->screen_base + yy * p->fontheight * bytes + xx * 8; for (rows = p->fontheight ; rows-- ; dest += bytes) { - ((u_long *)dest)[0] ^= 0x0f0f0f0f; - ((u_long *)dest)[1] ^= 0x0f0f0f0f; + ((u32 *)dest)[0] ^= 0x0f0f0f0f; + ((u32 *)dest)[1] ^= 0x0f0f0f0f; } } -#ifdef MODULE -int init_module(void) -#else -int fbcon_init_cfb8(void) -#endif -{ - return(fbcon_register_driver(&dispsw_cfb8, 0)); -} + /* + * `switch' for the low level operations + */ -#ifdef MODULE -void cleanup_module(void) -{ - fbcon_unregister_driver(&dispsw_cfb8); -} -#endif /* MODULE */ +struct display_switch fbcon_cfb8 = { + fbcon_cfb8_setup, fbcon_cfb8_bmove, fbcon_cfb8_clear, fbcon_cfb8_putc, + fbcon_cfb8_putcs, fbcon_cfb8_revc +}; + + + /* + * Visible symbols for modules + */ + +EXPORT_SYMBOL(fbcon_cfb8); +EXPORT_SYMBOL(fbcon_cfb8_setup); +EXPORT_SYMBOL(fbcon_cfb8_bmove); +EXPORT_SYMBOL(fbcon_cfb8_clear); +EXPORT_SYMBOL(fbcon_cfb8_putc); +EXPORT_SYMBOL(fbcon_cfb8_putcs); +EXPORT_SYMBOL(fbcon_cfb8_revc); |