Subject: random console changes

From: Philip Blundell <[email-masked]>
Date: Sat, 31 Oct 1998 15:16:24 +0000

Here's a motley collection of patches.  Basically, they do:

 - let acornfb know what colour depth is in use rather than always assuming 
   4bpp
 - don't link ll_char_wr into the kernel if fbcon is in use
 - make 1bpp modes work properly (previously characters were reversed)

I'm posting it to the list in hopes that someone will feel keen enough to tidy 
the changes up so that they can be installed into the kernel.

p.

--- linux/arch/arm/lib/ll_char_wr.S~	Sun Jun 21 11:15:19 1998
+++ linux/arch/arm/lib/ll_char_wr.S	Sat Oct 31 15:07:03 1998
@@ -15,6 +15,7 @@
 
 #include <linux/linkage.h>
 #include <asm/assembler.h>
+
 		.text
 
 #define BOLD            0x01
@@ -135,23 +136,40 @@
 		tst	ip, #INVERSE << 9
 		mvnne	r4, r4
 		mvnne	r7, r7
-		strb	r4, [r0], r5
-		mov	r4, r4, lsr #8
-		strb	r4, [r0], r5
+		ldr	lr, =bitswap
+		tst	ip, #UNDERLINE << 9
+		and	ip, r4, #255
+		ldrb	ip, [lr, ip]
+		strb	ip, [r0], r5
 		mov	r4, r4, lsr #8
-		strb	r4, [r0], r5
+		and	ip, r4, #255
+		ldrb	ip, [lr, ip]
+		strb	ip, [r0], r5
 		mov	r4, r4, lsr #8
-		strb	r4, [r0], r5
-		strb	r7, [r0], r5
+		and	ip, r4, #255
+		ldrb	ip, [lr, ip]
+		strb	ip, [r0], r5
+		mov	ip, r4, lsr #8
+		ldrb	ip, [lr, ip]
+		strb	ip, [r0], r5
+		and	ip, r7, #255
+		ldrb	ip, [lr, ip]
+		strb	ip, [r0], r5
 		mov	r7, r7, lsr #8
-		strb	r7, [r0], r5
+		and	ip, r7, #255
+		ldrb	ip, [lr, ip]
+		strb	ip, [r0], r5
 		mov	r7, r7, lsr #8
-		strb	r7, [r0], r5
-		mov	r7, r7, lsr #8
-		tst	ip, #UNDERLINE << 9
-		mvneq	r7, r7
-		strb	r7, [r0], r5
+		and	ip, r7, #255
+		ldrb	ip, [lr, ip]
+		strb	ip, [r0], r5
+		mov	ip, r7, lsr #8
+		ldrb	ip, [lr, ip]
+		mvneq	ip, ip
+		strb	ip, [r0], r5
 		LOADREGS(fd, sp!, {r4 - r7, pc})
+
+		.ltorg
 
 		.bss
 ENTRY(con_charconvtable)
--- linux/arch/arm/lib/Makefile~	Sun Sep 13 00:38:17 1998
+++ linux/arch/arm/lib/Makefile	Sat Oct 31 15:04:41 1998
@@ -6,14 +6,17 @@
 
 L_TARGET := lib.a
 L_OBJS   := backtrace.o bitops.o checksum.o delay.o io.o memcpy.o \
-	    system.o string.o uaccess.o
+	    system.o string.o uaccess.o bitswap.o
 
 ifeq ($(PROCESSOR),armo)
   L_OBJS += uaccess-armo.o
 endif
 
 ifdef CONFIG_ARCH_ACORN
-  L_OBJS += loaders.o ll_char_wr.o io-acorn.o
+  L_OBJS += loaders.o io-acorn.o
+  ifndef CONFIG_FB
+    L_OBJS += ll_char_wr.S
+  endif
   ifdef CONFIG_ARCH_A5K
     L_OBJS += floppydma.o
   endif
--- linux/arch/arm/kernel/setup.c~	Tue Oct 27 19:06:29 1998
+++ linux/arch/arm/kernel/setup.c	Thu Oct 29 22:16:17 1998
@@ -178,15 +178,15 @@
 	ORIG_VIDEO_LINES  = params->u1.s.video_num_rows;
 
 #ifdef CONFIG_ARCH_ACORN
-#ifndef CONFIG_FB
-	{
+       	{
 		extern int bytes_per_char_h;
+#ifndef CONFIG_FB
 		extern int bytes_per_char_v;
 
-		bytes_per_char_h  = params->u1.s.bytes_per_char_h;
 		bytes_per_char_v  = params->u1.s.bytes_per_char_v;
-	}
 #endif
+		bytes_per_char_h  = params->u1.s.bytes_per_char_h;
+	}
 	memc_ctrl_reg	  = params->u1.s.memc_control_reg;
 	number_ide_drives = (params->u1.s.adfsdrives >> 6) & 3;
 	number_mfm_drives = (params->u1.s.adfsdrives >> 3) & 3;
--- linux/drivers/video/acornfb.c~	Tue Oct 27 19:06:35 1998
+++ linux/drivers/video/acornfb.c	Sat Oct 31 14:45:54 1998
@@ -90,6 +90,7 @@
 static struct display disp;
 static struct fb_info fb_info;
 static struct acornfb_par current_par;
+int bytes_per_char_h;
 
 static inline void
 acornfb_palette_write(u_int regno, union palette pal)
@@ -238,7 +239,7 @@
 	var->yoffset		= 0;
 	var->bits_per_pixel	= par->bits_per_pixel;
 	var->grayscale		= 0;
-	var->red.msb_right	= 0;
+	var->red.msb_right	= (par->bits_per_pixel == 1);
 	var->transp.msb_right	= 0;
 	var->red.offset		= 0;
 	var->transp.offset	= 0;
@@ -343,7 +344,7 @@
 
 	current_par.xres	   = 8 * ORIG_VIDEO_COLS;
 	current_par.yres	   = 8 * ORIG_VIDEO_LINES;
-	current_par.bits_per_pixel = 4;
+	current_par.bits_per_pixel = bytes_per_char_h;
 	current_par.screen_base	   = SCREEN2_BASE;
 	current_par.palette_size   = VIDC_PALETTE_SIZE;
 	acornfb_update_par(&current_par);
--- linux/drivers/video/fbcon.c~	Mon Oct 26 20:14:47 1998
+++ linux/drivers/video/fbcon.c	Sat Oct 31 15:02:06 1998
@@ -1834,13 +1834,16 @@
 
 	    /* monochrome */
 	    unsigned char inverse = p->inverse ? 0x00 : 0xff;
+	    extern char bitswap[];
 
 	    /* can't use simply memcpy because need to apply inverse */
 	    for( y1 = 0; y1 < LOGO_H; y1++ ) {
 		src = logo + y1*LOGO_LINE + x/8;
 		dst = fb + y1*line;
-		for( x1 = 0; x1 < LOGO_LINE; ++x1 )
-		    *dst++ = *src++ ^ inverse;
+		for( x1 = 0; x1 < LOGO_LINE; ++x1 ) {
+		    char c = *src++;
+		    *dst++ = (p->var.red.msb_right?bitswap[c]:c) ^ inverse;
+		}
 	    }
 	    done = 1;
 	}
--- linux/arch/arm/Makefile~	Thu Oct 29 19:00:47 1998
+++ linux/arch/arm/Makefile	Sat Oct 31 14:36:59 1998
@@ -79,7 +79,7 @@
 ifeq ($(CONFIG_ARCH_A5K),y)
 MACHINE		 = a5k
 ARCHDIR		 = arc
-COMPRESSED_EXTRA = $(TOPDIR)/arch/arm/lib/ll_char_wr.o
+COMPRESSED_EXTRA = $(TOPDIR)/arch/arm/lib/ll_char_wr.o $(TOPDIR)/arch/arm/lib/bitswap.o
 endif
 
 ifeq ($(CONFIG_ARCH_ARC),y)
--- /dev/null	Sun Oct 12 19:38:15 1997
+++ linux/arch/arm/lib/bitswap.c	Sat Oct 31 14:12:38 1998
@@ -0,0 +1,35 @@
+unsigned char bitswap[256] = 
+{
+  0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
+  0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
+  0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
+  0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
+  0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
+  0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
+  0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
+  0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
+  0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
+  0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
+  0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
+  0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
+  0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
+  0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
+  0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
+  0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
+  0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
+  0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
+  0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
+  0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
+  0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
+  0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
+  0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
+  0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
+  0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
+  0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
+  0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
+  0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
+  0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
+  0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
+  0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
+  0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
+};
--- linux/drivers/video/fbcon-mfb.c~	Fri Oct 16 19:41:48 1998
+++ linux/drivers/video/fbcon-mfb.c	Sat Oct 31 14:45:25 1998
@@ -18,6 +18,7 @@
 #include <video/fbcon.h>
 #include <video/fbcon-mfb.h>
 
+extern unsigned char bitswap[];
 
     /*
      *  Monochrome
@@ -104,7 +105,7 @@
 	    d |= d>>1;
 	if (revs)
 	    d = ~d;
-	*dest = d;
+	*dest = p->var.red.msb_right?bitswap[d]:d;
     }
 }
 
@@ -133,7 +134,7 @@
 		d |= d>>1;
 	    if (revs)
 		d = ~d;
-	    *dest = d;
+	    *dest = p->var.red.msb_right?bitswap[d]:d;
 	}
     }
 }

unsubscribe: body of `unsubscribe linux-arm' to [email-masked]