Argl. I knew there was a reason why I didn't want to merge my serial
consoles with the tty driver ;-)
For your amusement, I've attached my 1638 bytes patch (should work with
most recent kernels).
- Werner
---------------------------------- cut here -----------------------------------
--- ref/init/main.c Wed Jul 5 19:39:48 1995
+++ work/init/main.c Thu Jul 20 15:04:26 1995
@@ -78,6 +78,7 @@
extern void sonycd535_setup(char *str, int *ints);
#endif CONFIG_CDU535
void ramdisk_setup(char *str, int *ints);
+void serial_console_setup(char *str,int *ints);
#ifdef CONFIG_SYSVIPC
extern void ipc_init(void);
@@ -205,6 +206,7 @@
#ifdef CONFIG_CDU31A
{ "cdu31a=", cdu31a_setup },
#endif CONFIG_CDU31A
+ { "scon=", serial_console_setup },
{ 0, 0 }
};
--- ref/drivers/char/console.c Wed Jul 5 19:40:45 1995
+++ work/drivers/char/console.c Thu Jul 20 15:04:57 1995
@@ -1979,6 +1982,43 @@
video_screen_size = video_num_lines * video_size_row;
}
+
+static unsigned long tty_base = 0;
+
+
+static void put_scon(char ch)
+{
+ unsigned long flags;
+
+ while (1) {
+ while (!(inb_p(tty_base+5) & 0x20));
+ save_flags(flags);
+ cli();
+ if (inb_p(tty_base+5) & 0x20) break;
+ restore_flags(flags);
+ }
+ outb_p(ch,tty_base);
+ restore_flags(flags);
+}
+
+
+static void print_scon(const char *str)
+{
+ if (!tty_base) return;
+ while (*str) {
+ if (*str == '\n') put_scon('\r');
+ put_scon(*str++);
+ }
+}
+
+
+void serial_console_setup(char *str,int *ints)
+{
+ if (ints[0] != 1 || ints[1] < 0 || ints[1] > 3) return;
+ tty_base = ((unsigned short *) 0x400)[ints[1]];
+}
+
+
/*
* long con_init(long);
*
@@ -2173,6 +2213,10 @@
display_desc,
video_num_columns,video_num_lines,
MIN_NR_CONSOLES, (MIN_NR_CONSOLES == 1) ? "" : "s", MAX_NR_CONSOLES);
+ if (tty_base) {
+ register_console(print_scon);
+ return kmem_start;
+ }
register_console(console_print);
return kmem_start;
}
-- _________________________________________________________________________ / Werner Almesberger, DI-LRC,EPFL,CH werner.almesberger@lrc.di.epfl.ch / /_IN_R_311__Tel_+41_21_693_6621__Fax_+41_21_693_6610_____________________/