hcj@lzaz.ATT.COM (HC Johnson) (01/04/89)
This is a 4 part posting of the files and changes to add rs232 and midi
drivers to minix-st.
The component parts are:
rs232.shar, the all new rs232 files
rs232diff.shar, cdif of files changed to support rs232 and midi
midi.shar, the all new midi files
cu.shar. a user terminal emulator like that on unix. This may be only a
binary depending on other factors.
midi need not be installed to use rs232.
the major minor for rs232 is determined by your fs/table.c
on my system its major 8 minor 0. (always minor 0, or you'll panic).
the rs232 inode must be named tty1.
rs232 will support login. -- change /etc/ttys to add the line , 101.
You will find out how SLOW minix can be when you start interacting
with rs232.
Howard Johnson
ATT-BL
lzaz!hcj
This is rs232diff.shar, the rs232 cdif files for adding rs232 and midi to
minix-st.
==============================================================
echo extracting 'rs232.cdif'
sed -e 's/^X//' >rs232.cdif <<'SHAR_EOF'
X*** /az1/hcj/minix.src/src/kernel/Makefile Sat Oct 29 11:50:08 1988
X--- kernel/Makefile Sat Dec 24 06:48:04 1988
X***************
X*** 7,19 ****
X
X OBJ = stmpx.o stmain.o proc.o system.o stshadow.o \
X tty.o clock.o memory.o stdma.o stfloppy.o stwini.o \
X stcon.o stkbd.o stvdu.o stfnt.o stprint.o \
X table.o stdmp.o
X HDR = ../h/callnr.h ../h/com.h ../h/const.h ../h/error.h \
X ../h/sgtty.h ../h/signal.h ../h/type.h \
X const.h glo.h proc.h tty.h type.h \
X stacia.h staddr.h stdma.h stfdc.h sthdc.h stmfp.h \
X! stram.h stsound.h stvideo.h
X ALL = kernel.mix
X
X all: $(ALL)
X--- 7,21 ----
X
X OBJ = stmpx.o stmain.o proc.o system.o stshadow.o \
X tty.o clock.o memory.o stdma.o stfloppy.o stwini.o \
X+ rstty.o miditty.o \
X+ bmsclock.o midis.o midi.o rs232.o rs232s.o \
X stcon.o stkbd.o stvdu.o stfnt.o stprint.o \
X table.o stdmp.o
X HDR = ../h/callnr.h ../h/com.h ../h/const.h ../h/error.h \
X ../h/sgtty.h ../h/signal.h ../h/type.h \
X const.h glo.h proc.h tty.h type.h \
X stacia.h staddr.h stdma.h stfdc.h sthdc.h stmfp.h \
X! stram.h stsound.h stvideo.h ring.h
X ALL = kernel.mix
X
X all: $(ALL)
X***************
X*** 32,36 ****
X--- 34,44 ----
X
X stmpx.o: stmpx.s
X $(CC) -c $(CFLAGS) stmpx.s
X+
X+ midis.o: midis.s
X+ $(CC) -c $(CFLAGS) midis.s
X+
X+ rs232s.o: rs232s.s
X+ $(CC) -c $(CFLAGS) rs232s.s
X
X $(OBJ): $(HDR)
X*** /az1/hcj/minix.src/src/kernel/stacia.h Sat Oct 29 11:49:41 1988
X--- kernel/stacia.h Wed Nov 23 17:40:22 1988
X***************
X*** 47,50 ****
X
X /* values for the ST: */
X #define KBD_INIT (A_81N|A_Q64)
X! #define MDI_INIT (A_81N|A_Q16)
X--- 47,50 ----
X
X /* values for the ST: */
X #define KBD_INIT (A_81N|A_Q64)
X! #define MDI_INIT (A_RXINT|A_TXPOL|A_81N|A_Q16)
X*** /az1/hcj/minix.src/src/kernel/stcon.c Sat Oct 29 11:49:42 1988
X--- kernel/stcon.c Wed Dec 28 16:34:34 1988
X***************
X*** 4,9 ****
X--- 4,10 ----
X */
X #define DEBDMP /* dump system tables */
X #define DEBOUT /* debugging on console and/or printer */
X+ #define DBG_RS232
X
X #include "../h/const.h"
X #include "../h/type.h"
X***************
X*** 57,62 ****
X--- 58,77 ----
X case 5: /* PF5: ON/OFF printer debugging */
X STusePrt ^= 1; return;
X #endif
X+ #ifdef DBG_RS232
X+ case 7:
X+ rstty_dmp();
X+ rs232_dmp(); return;
X+ #ifdef NONO
X+ case 8: /* PF8: special */
X+ tty_dmp(); return;
X+ #endif
X+
X+ case 9: /* PF9: special */
X+ miditty_dmp();
X+ midi_dmp(); return;
X+ #endif
X+
X case 10: /* PF10: issue SIGKILL */
X sigchar(&tty_struct[CONSOLE], SIGKILL); return;
X }
X*** /az1/hcj/minix.src/src/kernel/stdmp.c Sat Oct 29 11:49:44 1988
X--- kernel/stdmp.c Wed Dec 28 07:17:57 1988
X***************
X*** 30,39 ****
X vir_clicks base, limit, first, last;
X phys_bytes ltmp, dst;
X int index;
X extern phys_bytes umap();
X
X printf(
X! "\nproc pid pc sp splow flag user sys base limit recv command\n");
X
X dst = umap(proc_addr(SYSTASK), D, (vir_bytes)nbuff, (vir_bytes)NSIZE);
X
X--- 30,41 ----
X vir_clicks base, limit, first, last;
X phys_bytes ltmp, dst;
X int index;
X+ int i;
X+ char *cp;
X extern phys_bytes umap();
X
X printf(
X! "\r\nproc pid pc sp splow flag user sys base limit recv command\n");
X
X dst = umap(proc_addr(SYSTASK), D, (vir_bytes)nbuff, (vir_bytes)NSIZE);
X
X***************
X*** 45,50 ****
X--- 47,53 ----
X base = (vir_clicks) (ltmp/1024L);
X ltmp = (((long) last << CLICK_SHIFT) + 512L);
X limit = (vir_clicks) (ltmp/1024L);
X+ printf("\r");
X prname((int)(rp - proc));
X printf(" %4d %6X %6X %6X %4x %5D %6D %3dK %3dK ",
X rp->p_pid, (long)rp->p_pcpsw.pc,
X***************
X*** 64,72 ****
X for (np = &nbuff[0]; np < &nbuff[NSIZE]; np++)
X if (*np <= ' ' || *np >= 0177) *np = 0;
X if (index == LOW_USER + 1)
X! printf("/bin/sh");
X else
X! printf("%s", nbuff);
X }
X printf("\n");
X }
X--- 67,81 ----
X for (np = &nbuff[0]; np < &nbuff[NSIZE]; np++)
X if (*np <= ' ' || *np >= 0177) *np = 0;
X if (index == LOW_USER + 1)
X! cp = "/bin/sh";
X else
X! cp = nbuff;
X! for(i=0;i<100;i++)
X! if(cp[i] == '\0')
X! break;
X! if(i > 8)
X! printf("\n\r\t");
X! printf("%s", cp);
X }
X printf("\n");
X }
X***************
X*** 121,127 ****
X }
X
X
X! char *nayme[]= {"PRINTR", "TTY ", "WINCHE", "FLOPPY", "RAMDSK", "CLOCK ",
X "SYS ", "HARDWR", "MM ", "FS ", "INIT "};
X prname(i)
X int i;
X--- 130,140 ----
X }
X
X
X! char *nayme[]= {
X! "MIDI ",
X! "RS232 ",
X! "BMSCLK",
X! "PRINTR", "TTY ", "WINCHE", "FLOPPY", "RAMDSK", "CLOCK ",
X "SYS ", "HARDWR", "MM ", "FS ", "INIT "};
X prname(i)
X int i;
X*** /az1/hcj/minix.src/src/kernel/stmain.c Sat Oct 29 11:49:50 1988
X--- kernel/stmain.c Tue Nov 29 18:03:21 1988
X***************
X*** 1,3 ****
X--- 1,4 ----
X+
X #ifdef ATARI_ST
X /* This file contains the main program of MINIX for the Atari ST.
X * The routine main() initializes the system and starts the ball
X***************
X*** 249,266 ****
X *===========================================================================*/
X PUBLIC aciaint()
X {
X if (KBD->ac_cs & A_IRQ)
X kbdint();
X if (MDI->ac_cs & A_IRQ)
X mdiint();
X }
X
X /*===========================================================================*
X * temporary stuff *
X *===========================================================================*/
X timint(t) {fake_int("timint", t);}
X! siaint(t) {fake_int("siaint", t);}
X! mdiint(t) {fake_int("mdiint", t);}
X iob(t) {fake_int("iob", t);}
X
X fake_int(s, t) char *s; {
X--- 250,270 ----
X *===========================================================================*/
X PUBLIC aciaint()
X {
X+ MFP->mf_ierb &= ~IB_AINT;
X+ do {
X if (KBD->ac_cs & A_IRQ)
X kbdint();
X if (MDI->ac_cs & A_IRQ)
X mdiint();
X+ } while ((MFP->mf_gpip & IO_AINT)==0);
X+ MFP->mf_ierb |= IB_AINT;
X }
X
X /*===========================================================================*
X * temporary stuff *
X *===========================================================================*/
X timint(t) {fake_int("timint", t);}
X! xmdiint(t) {fake_int("mdiint", MDI->ac_da);}
X iob(t) {fake_int("iob", t);}
X
X fake_int(s, t) char *s; {
X*** /az1/hcj/minix.src/src/kernel/stvdu.c Sat Oct 29 11:49:57 1988
X--- kernel/stvdu.c Tue Dec 6 14:11:21 1988
X***************
X*** 720,725 ****
X--- 720,728 ----
X }
X }
X
X+ PRIVATE noop()
X+ {}
X+
X /*===========================================================================*
X * vduinit *
X *===========================================================================*/
X***************
X*** 728,733 ****
X--- 731,739 ----
X register struct vduinfo *v = &vduinfo;
X
X tty_struct[CONSOLE].tty_start = start;
X+ tty_struct[CONSOLE].tty_open = noop;
X+ tty_struct[CONSOLE].tty_close = noop;
X+ tty_struct[CONSOLE].tty_ioctl = noop;
X tty_struct[CONSOLE].tty_echo = echo;
X if (VIDEO->vd_res & RES_HIGH) {
X v->mono = 1;
X*** /az1/hcj/minix.src/src/kernel/table.c Sat Oct 29 11:50:03 1988
X--- kernel/table.c Wed Dec 28 04:24:58 1988
X***************
X*** 33,45 ****
X #include "proc.h"
X
X extern int sys_task(), clock_task(), mem_task(), floppy_task(),
X! winchester_task(), tty_task(), printer_task();
X
X /* The startup routine of each task is given below, from -NR_TASKS upwards.
X * The order of the names here MUST agree with the numerical values assigned to
X * the tasks in ../h/com.h.
X */
X int (*task[NR_TASKS+INIT_PROC_NR+1])() = {
X printer_task, tty_task, winchester_task, floppy_task, mem_task,
X clock_task, sys_task, 0, 0, 0, 0
X };
X--- 33,49 ----
X #include "proc.h"
X
X extern int sys_task(), clock_task(), mem_task(), floppy_task(),
X! winchester_task(), tty_task(), printer_task(),
X! midi_task(), rs232_task(), bmsclock_task();
X
X /* The startup routine of each task is given below, from -NR_TASKS upwards.
X * The order of the names here MUST agree with the numerical values assigned to
X * the tasks in ../h/com.h.
X */
X int (*task[NR_TASKS+INIT_PROC_NR+1])() = {
X+ midi_task,
X+ rs232_task,
X+ bmsclock_task,
X printer_task, tty_task, winchester_task, floppy_task, mem_task,
X clock_task, sys_task, 0, 0, 0, 0
X };
X*** /az1/hcj/minix.src/src/kernel/tty.h Sat Oct 29 11:50:06 1988
X--- kernel/tty.h Sat Dec 24 15:53:04 1988
X***************
X*** 1,10 ****
X #define NR_TTYS 1 /* how many terminals can system handle */
X #define CONSOLE 0 /* line number for console */
X #define OPERATOR (-1) /* handle CTRL-ALT-PFX sequences */
X
X! #define TTY_IN_BYTES 200 /* input queue size */
X #define TAB_SIZE 8 /* distance between tabs */
X #define TAB_MASK 07 /* mask for tty_column when tabbing */
X #define MAX_OVERRUN 16 /* size of overrun input buffer */
X
X #define ERASE_CHAR '\b' /* default erase character */
X--- 1,16 ----
X #define NR_TTYS 1 /* how many terminals can system handle */
X+ #define NR_RS232 1 /* how many rs232 ports can system handle */
X+ #define NR_MIDI 1 /* how many midi ports can system handle */
X #define CONSOLE 0 /* line number for console */
X+ #define COM0 0 /* line number for rs232 */
X+ #define MIDI0 0 /* line number for midi */
X+
X #define OPERATOR (-1) /* handle CTRL-ALT-PFX sequences */
X
X! #define TTY_IN_BYTES 200 /* 200 input queue size */
X #define TAB_SIZE 8 /* distance between tabs */
X #define TAB_MASK 07 /* mask for tty_column when tabbing */
X+
X #define MAX_OVERRUN 16 /* size of overrun input buffer */
X
X #define ERASE_CHAR '\b' /* default erase character */
X***************
X*** 28,33 ****
X--- 34,44 ----
X int (*tty_start)(); /* routine to start device output */
X int (*tty_echo)(); /* echo character and flush output */
X
X+ /* Open/Close section. */
X+ int (*tty_open)(); /* device specific open */
X+ int (*tty_close)(); /* device specific close */
X+ int (*tty_ioctl)(); /* device specific ioctl */
X+
X /* Terminal parameters and status. */
X int tty_mode; /* terminal mode set by IOCTL */
X char tty_escaped; /* 1 when '\' just seen, else 0 */
X***************
X*** 55,60 ****
X--- 66,72 ----
X int tty_outleft; /* # chars yet to be copied to tty_outqueue */
X int tty_cum; /* # chars copied to tty_outqueue so far */
X int tty_pgrp; /* Slot number of controlling process */
X+ char tty_baud; /* index of baud (rs232) */
X };
X
X /* Values for the fields. */
X*** /az1/hcj/minix.src/src/fs/table.c Sat Oct 29 11:47:02 1988
X--- fs/table.c Wed Dec 28 04:26:03 1988
X***************
X*** 124,130 ****
X no_call, rw_dev, no_call, WINCHESTER, /* 3 = /dev/hd0 */
X tty_open, rw_dev, no_call, TTY, /* 4 = /dev/tty0 */
X no_call, rw_dev2, no_call, TTY, /* 5 = /dev/tty */
X! no_call, rw_dev, no_call, PRINTER /* 6 = /dev/lp */
X };
X
X int max_major = sizeof(dmap)/sizeof(struct dmap);
X--- 124,133 ----
X no_call, rw_dev, no_call, WINCHESTER, /* 3 = /dev/hd0 */
X tty_open, rw_dev, no_call, TTY, /* 4 = /dev/tty0 */
X no_call, rw_dev2, no_call, TTY, /* 5 = /dev/tty */
X! no_call, rw_dev, no_call, PRINTER, /* 6 = /dev/lp */
X! no_call, rw_dev, no_call, BMSCLOCK, /* 7 = /dev/bms */
X! tty_open, rw_dev, no_call, RS232, /* 8 = /dev/com0 */
X! no_call, rw_dev, no_call, MIDI, /* 9 = /dev/midi */
X };
X
X int max_major = sizeof(dmap)/sizeof(struct dmap);
X*** /az1/hcj/minix.src/src/h/com.h Sat Oct 29 11:49:02 1988
X--- h/com.h Thu Dec 29 04:00:07 1988
X***************
X*** 21,26 ****
X--- 21,27 ----
X # define SYS_FRESH 10 /* fcn code for sys_fresh() */
X #endif
X # define SYS_KILL 11 /* fcn code for sys_kill(proc, sig) */
X+ # define SYS_TRACE 12 /* fcn code for sys_trace(req,pid,addr,data) */
X
X #define CLOCK -3 /* clock class */
X # define SET_ALARM 1 /* fcn code to CLOCK, set up alarm */
X***************
X*** 50,57 ****
X--- 51,84 ----
X # define TTY_WRITE 4 /* fcn code for writing to tty */
X # define TTY_IOCTL 5 /* fcn code for ioctl */
X # define TTY_SETPGRP 6 /* fcn code for setpgrp */
X+ # define TTY_OPEN 7 /* fcn code for open */
X+ # define TTY_CLOSE 8 /* fcn code for close */
X # define SUSPEND -998 /* used in interrupts when tty has no data */
X
X+ #define BMSCLOCK -9 /* clock on BMS 100 */
X+ # define BMS_READ 3
X+ # define BMS_WRITE 4
X+
X+ #define RS232 -10 /* serial port */
X+ # define RS232_CHAR_INT 1 /* fcn code for tty input interrupt */
X+ # define RS232_O_DONE 2 /* fcn code for tty output done */
X+ # define RS232_READ 3 /* fcn code for reading from tty */
X+ # define RS232_WRITE 4 /* fcn code for writing to tty */
X+ # define RS232_IOCTL 5 /* fcn code for ioctl */
X+ # define RS232_SETPGRP 6 /* fcn code for setpgrp */
X+ # define RS232_OPEN 7 /* fcn code for open */
X+ # define RS232_CLOSE 8 /* fcn code for close */
X+
X+ #define MIDI -11 /* midi port */
X+ # define MIDI_CHAR_INT 1 /* fcn code for tty input interrupt */
X+ # define MIDI_O_DONE 2 /* fcn code for tty output done */
X+ # define MIDI_READ 3 /* fcn code for reading from tty */
X+ # define MIDI_WRITE 4 /* fcn code for writing to tty */
X+ # define MIDI_IOCTL 5 /* fcn code for ioctl */
X+ # define MIDI_SETPGRP 6 /* fcn code for setpgrp */
X+ # define MIDI_OPEN 7 /* fcn code for open */
X+ # define MIDI_CLOSE 8 /* fcn code for close */
X+
X /* Names of message fields for messages to CLOCK task. */
X #define DELTA_TICKS m6_l1 /* alarm interval in clock ticks */
X #define FUNC_TO_CALL m6_f1 /* pointer to function to call */
X***************
X*** 102,104 ****
X--- 129,142 ----
X #define MEM_PTR m1_p1 /* tells where memory map is for sys_newmap */
X #define CANCEL 0 /* general request to force a task to cancel */
X #define SIG_MAP m1_i2 /* used by kernel for passing signal bit map */
X+
X+ /* do_ioctl in fs/device.c needs to know who to do ioctl for
X+ * this is an unfortunate hack. HCJ
X+ * These numbers are the major numbers in fs/table.c
X+ */
X+
X+ #define DEV_WINI 3
X+ #define DEV_TTY 4
X+ #define DEV_TTY0 5
X+ #define DEV_RS232 8
X+ #define DEV_MIDI 9
X*** /az1/hcj/minix.src/src/h/const.h Sat Oct 29 11:49:03 1988
X--- h/const.h Fri Dec 16 15:48:03 1988
X***************
X*** 22,29 ****
X #define MAJOR 8 /* major device = (dev>>MAJOR) & 0377 */
X #define MINOR 0 /* minor device = (dev>>MINOR) & 0377 */
X
X! #define NR_TASKS 8 /* number of tasks in the transfer vector */
X! #define NR_PROCS 16 /* number of slots in proc table */
X #define NR_SEGS 3 /* # segments per process */
X #define T 0 /* proc[i].mem_map[T] is for text */
X #define D 1 /* proc[i].mem_map[D] is for data */
X--- 22,29 ----
X #define MAJOR 8 /* major device = (dev>>MAJOR) & 0377 */
X #define MINOR 0 /* minor device = (dev>>MINOR) & 0377 */
X
X! #define NR_TASKS 11 /* number of tasks in the transfer vector */
X! #define NR_PROCS 17 /* number of slots in proc table */
X #define NR_SEGS 3 /* # segments per process */
X #define T 0 /* proc[i].mem_map[T] is for text */
X #define D 1 /* proc[i].mem_map[D] is for data */
X***************
X*** 64,70 ****
X #define NO_NUM 0x8000 /* used as numerical argument to panic() */
X #define MAX_PATH 128 /* max length of path names */
X #define SIG_PUSH_BYTES 8 /* how many bytes pushed by signal */
X! #define MAX_ISTACK_BYTES 1024 /* maximum initial stack size for EXEC */
X
X /* Device numbers of root (RAM) and boot (fd0) devices. */
X #define ROOT_DEV (dev_nr) 256 /* major-minor device number of root dev */
X--- 64,70 ----
X #define NO_NUM 0x8000 /* used as numerical argument to panic() */
X #define MAX_PATH 128 /* max length of path names */
X #define SIG_PUSH_BYTES 8 /* how many bytes pushed by signal */
X! #define MAX_ISTACK_BYTES 2048 /* maximum initial stack size for EXEC */
X
X /* Device numbers of root (RAM) and boot (fd0) devices. */
X #define ROOT_DEV (dev_nr) 256 /* major-minor device number of root dev */
X*** /az1/hcj/minix.src/src/h/sgtty.h Sat Oct 29 11:49:04 1988
X--- h/sgtty.h Wed Dec 28 05:06:36 1988
X***************
X*** 18,31 ****
X };
X
X /* Field names */
X! #define XTABS 0006000 /* do tab expansion */
X #define RAW 0000040 /* enable raw mode */
X #define CRMOD 0000020 /* map lf to cr + lf */
X #define ECHO 0000010 /* echo input */
X #define CBREAK 0000002 /* enable cbreak mode */
X #define COOKED 0000000 /* neither CBREAK nor RAW */
X
X #define TIOCGETP (('t'<<8) | 8)
X #define TIOCSETP (('t'<<8) | 9)
X #define TIOCGETC (('t'<<8) | 18)
X #define TIOCSETC (('t'<<8) | 17)
X--- 18,77 ----
X };
X
X /* Field names */
X! /* every one thinks XTABS is 06000 but only 1 bit is needed:
X! */
X! #define XTABS 0004000 /* do tab expansion */
X #define RAW 0000040 /* enable raw mode */
X+ #define IN_CANON 0001000 /* when off, no special processing on input */
X+ /* the VEOF is how many inchars to wakeup on*/
X #define CRMOD 0000020 /* map lf to cr + lf */
X+ /* the following is a magic cookie, the same name and value with termio.h */
X #define ECHO 0000010 /* echo input */
X #define CBREAK 0000002 /* enable cbreak mode */
X #define COOKED 0000000 /* neither CBREAK nor RAW */
X+ /* when IN_CANON is OFF, then we will interpret additional bits for special
X+ * processing
X+ */
X+ #define SPECIAL_0 0000040
X+ #define SPECIAL_1 0000100
X
X #define TIOCGETP (('t'<<8) | 8)
X #define TIOCSETP (('t'<<8) | 9)
X #define TIOCGETC (('t'<<8) | 18)
X #define TIOCSETC (('t'<<8) | 17)
X+ #define TIOCSTART (('t'<<8) | 1)
X+ #define TIOCSTOP (('t'<<8) | 2)
X+
X+ /* Baud rates for rs232 */
X+ #define B19200 0
X+ #define B9600 1
X+ #define B4800 2
X+ #define B3600 3
X+ #define B2400 4
X+ #define B2000 5
X+ #define B1800 6
X+ #define B1200 7
X+ #define B600 8
X+ #define B300 9
X+ #define B200 10
X+ #define B150 11
X+ #define B134 12
X+ #define B110 13
X+ #define B75 14
X+ #define B50 15
X+
X+
X+ /* these ioctls for rs232 taken from termio.h */
X+ #ifndef TCGETA
X+
X+ #define TC_RS232 ('T'<<8)
X+ #define TCGETA (TC_RS232|1)
X+ #define TCSETA (TC_RS232|2)
X+ #define TCSETAW (TC_RS232|3)
X+ #define TCSETAF (TC_RS232|4)
X+ #define TCSBRK (TC_RS232|5)
X+ #define TCXONC (TC_RS232|6)
X+ #define TCFLSH (TC_RS232|7)
X+ #define TCDSET (TC_RS232|32)
X+ #endif
X+
SHAR_EOF