Re: Patches for serial console available

Werner Almesberger (almesber@lrc.epfl.ch)
Thu, 20 Jul 1995 15:21:24 +0200 (MET DST)


Miquel van Smoorenburg wrote:
> I've hacked up serial console support for Linux 1.3.10.
> The diffs are pretty big (17k)

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_____________________/