]> Zhao Yanbai Git Server - minix.git/commitdiff
rs232 support
authorPhilip Homburg <philip@cs.vu.nl>
Fri, 29 Jul 2005 15:22:58 +0000 (15:22 +0000)
committerPhilip Homburg <philip@cs.vu.nl>
Fri, 29 Jul 2005 15:22:58 +0000 (15:22 +0000)
drivers/tty/keyboard.c
drivers/tty/rs232.c
drivers/tty/tty.c
drivers/tty/tty.h
include/minix/config.h

index 4b8485018882c2822bd23a6d8dbe91652616a9aa..6023e3252bdd7e42bbc28d293d1c15ad9c987bb1 100644 (file)
@@ -133,9 +133,9 @@ int scode;
 }
 
 /*===========================================================================*
- *                             kbd_hw_int                                   *
+ *                             kbd_interrupt                                *
  *===========================================================================*/
-PUBLIC void do_interrupt(m_ptr)
+PUBLIC void kbd_interrupt(m_ptr)
 message *m_ptr;
 {
 /* A keyboard interrupt has occurred.  Process it. */
@@ -406,6 +406,7 @@ tty_t *tp;
           panic("TTY",  "Couldn't set keyboard IRQ policy", i);
       if ((i=sys_irqenable(&irq_hook_id)) != OK)
           panic("TTY", "Couldn't enable keyboard IRQs", i);
+      kbd_irq_set |= (1 << KEYBOARD_IRQ);
   }
 }
 
index 1023fdab3f79c5e9e60915c301e592650cbd8030..87b27dec54379803c1c6f510277260e8247fc306 100644 (file)
@@ -226,6 +226,7 @@ typedef struct rs232 {
   unsigned parity_errors;
   unsigned break_interrupts;
 
+  int irq;                     /* irq for this line */
   int irq_hook_id;             /* interrupt hook */
 
   char ibuf[RS_IBUFSIZE];      /* input buffer */
@@ -249,21 +250,21 @@ PRIVATE port_t addr_8250[] = {
 };
 #endif
 
-FORWARD _PROTOTYPE( int rs232_handler, (message *m)                    );
 FORWARD _PROTOTYPE( void in_int, (rs232_t *rs)                         );
 FORWARD _PROTOTYPE( void line_int, (rs232_t *rs)                       );
 FORWARD _PROTOTYPE( void modem_int, (rs232_t *rs)                      );
 FORWARD _PROTOTYPE( int rs_write, (tty_t *tp, int try)                         );
 FORWARD _PROTOTYPE( void rs_echo, (tty_t *tp, int c)                   );
-FORWARD _PROTOTYPE( void rs_ioctl, (tty_t *tp)                         );
+FORWARD _PROTOTYPE( int rs_ioctl, (tty_t *tp, int try)                         );
 FORWARD _PROTOTYPE( void rs_config, (rs232_t *rs)                      );
 FORWARD _PROTOTYPE( int rs_read, (tty_t *tp, int try)                          );
-FORWARD _PROTOTYPE( void rs_icancel, (tty_t *tp)                       );
-FORWARD _PROTOTYPE( void rs_ocancel, (tty_t *tp)                       );
+FORWARD _PROTOTYPE( int rs_icancel, (tty_t *tp, int try)                               );
+FORWARD _PROTOTYPE( int rs_ocancel, (tty_t *tp, int try)                               );
 FORWARD _PROTOTYPE( void rs_ostart, (rs232_t *rs)                      );
-FORWARD _PROTOTYPE( void rs_break, (tty_t *tp)                         );
-FORWARD _PROTOTYPE( void rs_close, (tty_t *tp)                         );
+FORWARD _PROTOTYPE( int rs_break, (tty_t *tp, int try)                         );
+FORWARD _PROTOTYPE( int rs_close, (tty_t *tp, int try)                         );
 FORWARD _PROTOTYPE( void out_int, (rs232_t *rs)                                );
+FORWARD _PROTOTYPE( void rs232_handler, (rs232_t *rs)                  );
 
 /* XXX */
 PRIVATE void lock(void) {}
@@ -282,7 +283,7 @@ PRIVATE int my_inb(port_t port)
 /*==========================================================================*
  *                             rs_write                                    *
  *==========================================================================*/
-PRIVATE void rs_write(tp, try)
+PRIVATE int rs_write(tp, try)
 register tty_t *tp;
 int try;
 {
@@ -387,13 +388,15 @@ int c;                            /* character to echo */
 /*==========================================================================*
  *                             rs_ioctl                                    *
  *==========================================================================*/
-PRIVATE void rs_ioctl(tp)
+PRIVATE int rs_ioctl(tp, dummy)
 tty_t *tp;                     /* which TTY */
+int dummy;
 {
 /* Reconfigure the line as soon as the output has drained. */
   rs232_t *rs = tp->tty_priv;
 
   rs->drain = TRUE;
+  return 0;    /* dummy */
 }
 
 
@@ -580,6 +583,7 @@ tty_t *tp;                  /* which TTY */
   /* Enable interrupts for both interrupt controller and device. */
   irq = (line & 1) == 0 ? RS232_IRQ : SECONDARY_IRQ;
 
+  rs->irq = irq;
   if(sys_irqsetpolicy(irq, IRQ_REENABLE, &rs->irq_hook_id) != OK) {
        printf("RS232: Couldn't obtain hook for irq %d\n", irq);
   } else {
@@ -588,6 +592,8 @@ tty_t *tp;                  /* which TTY */
        }
   }
 
+  rs_irq_set |= (1 << irq);
+
   sys_outb(rs->int_enab_port, IE_LINE_STATUS_CHANGE | IE_MODEM_STATUS_CHANGE
                                | IE_RECEIVER_READY | IE_TRANSMITTER_READY);
 #else /* MACHINE == ATARI */
@@ -617,14 +623,35 @@ tty_t *tp;                        /* which TTY */
 
   /* Tell external device we are ready. */
   istart(rs);
+
+}
+
+
+/*==========================================================================*
+ *                             rs_interrupt                                        *
+ *==========================================================================*/
+PUBLIC void rs_interrupt(m)
+message *m;                    /* which TTY */
+{
+       unsigned long irq_set;
+       int i;
+       rs232_t *rs;
+
+       irq_set= m->NOTIFY_ARG;
+       for (i= 0, rs = rs_lines; i<NR_RS_LINES; i++, rs++)
+       {
+               if (irq_set & (1 << rs->irq))
+                       rs232_handler(rs);
+       }
 }
 
 
 /*==========================================================================*
  *                             rs_icancel                                  *
  *==========================================================================*/
-PRIVATE void rs_icancel(tp)
+PRIVATE int rs_icancel(tp, dummy)
 tty_t *tp;                     /* which TTY */
+int dummy;
 {
 /* Cancel waiting input. */
   rs232_t *rs = tp->tty_priv;
@@ -634,14 +661,17 @@ tty_t *tp;                        /* which TTY */
   rs->itail = rs->ihead;
   istart(rs);
   unlock();
+
+  return 0;    /* dummy */
 }
 
 
 /*==========================================================================*
  *                             rs_ocancel                                  *
  *==========================================================================*/
-PRIVATE void rs_ocancel(tp)
+PRIVATE int rs_ocancel(tp, dummy)
 tty_t *tp;                     /* which TTY */
+int dummy;
 {
 /* Cancel pending output. */
   rs232_t *rs = tp->tty_priv;
@@ -651,13 +681,15 @@ tty_t *tp;                        /* which TTY */
   rs->ocount = 0;
   rs->otail = rs->ohead;
   unlock();
+
+  return 0;    /* dummy */
 }
 
 
 /*==========================================================================*
  *                             rs_read                                     *
  *==========================================================================*/
-PRIVATE void rs_read(tp, try)
+PRIVATE int rs_read(tp, try)
 tty_t *tp;                     /* which tty */
 int try;
 {
@@ -718,8 +750,9 @@ rs232_t *rs;                        /* which rs line */
 /*==========================================================================*
  *                             rs_break                                    *
  *==========================================================================*/
-PRIVATE void rs_break(tp)
+PRIVATE int rs_break(tp, dummy)
 tty_t *tp;                     /* which tty */
+int dummy;
 {
 /* Generate a break condition by setting the BREAK bit for 0.4 sec. */
   rs232_t *rs = tp->tty_priv;
@@ -731,21 +764,25 @@ tty_t *tp;                        /* which tty */
   /* milli_delay(400); */                              /* ouch */
   printf("RS232 break\n");
   sys_outb(rs->line_ctl_port, line_controls);
+  return 0;    /* dummy */
 }
 
 
 /*==========================================================================*
  *                             rs_close                                    *
  *==========================================================================*/
-PRIVATE void rs_close(tp)
+PRIVATE int rs_close(tp, dummy)
 tty_t *tp;                     /* which tty */
+int dummy;
 {
 /* The line is closed; optionally hang up. */
   rs232_t *rs = tp->tty_priv;
+  int r;
 
   if (tp->tty_termios.c_cflag & HUPCL) {
        sys_outb(rs->modem_ctl_port, MC_OUT2 | MC_RTS);
   }
+  return 0;    /* dummy */
 }
 
 
@@ -755,19 +792,11 @@ tty_t *tp;                        /* which tty */
 /*==========================================================================*
  *                             rs232_handler                               *
  *==========================================================================*/
-PRIVATE int rs232_handler(m)
-message *m;
+PRIVATE void rs232_handler(rs)
+struct rs232 *rs;
 {
 /* Interrupt hander for RS232. */
 
-       /* XXX */
-#if DEAD_CODE
-  register rs232_t *rs = structof(rs232_t, hook, hook);
-#else
-       /* XXX */
-  register rs232_t *rs = NULL;
-#endif
-
   while (TRUE) {
        int v;
        /* Loop to pick up ALL pending interrupts for device.
@@ -790,7 +819,7 @@ message *m;
                line_int(rs);
                continue;
        }
-       return(1);      /* reenable serial interrupt */
+       return;
   }
 }
 #endif /* MACHINE == IBM_PC */
index 3998c4e5b381f5ea0879940c27c999aaf044a9a9..8e1f80b1f94ef2832b0baec440cfcfc99f7a1043 100644 (file)
@@ -76,6 +76,9 @@
 
 extern int irq_hook_id;
 
+unsigned long kbd_irq_set = 0;
+unsigned long rs_irq_set = 0;
+
 /* Address of a tty structure. */
 #define tty_addr(line) (&tty_table[line])
 
@@ -204,7 +207,10 @@ PUBLIC void main(void)
                expire_timers();        /* run watchdogs of expired timers */
                continue;               /* contine to check for events */
        case HARD_INT: {                /* hardware interrupt notification */
-               do_interrupt(&tty_mess);/* fetch chars from keyboard */
+               if (tty_mess.NOTIFY_ARG & kbd_irq_set)
+                       kbd_interrupt(&tty_mess);/* fetch chars from keyboard */
+               if (tty_mess.NOTIFY_ARG & rs_irq_set)
+                       rs_interrupt(&tty_mess);/* serial I/O */
                expire_timers();        /* run watchdogs of expired timers */
                continue;               /* contine to check for events */
        }
index ceb6c68d0564e2c7b5f1586044b9e2e51cd64551..4191f94f08d2458b817315fb0fc5b734c2d1ffe4 100644 (file)
@@ -84,6 +84,9 @@ extern tty_t tty_table[NR_CONS+NR_RS_LINES+NR_PTYS];
 extern int ccurrent;           /* currently visible console */
 extern int irq_hook_id;                /* hook id for keyboard irq */
 
+extern unsigned long kbd_irq_set;
+extern unsigned long rs_irq_set;
+
 /* Values for the fields. */
 #define NOT_ESCAPED        0   /* previous character is not LNEXT (^V) */
 #define ESCAPED            1   /* previous character was LNEXT (^V) */
@@ -129,6 +132,7 @@ _PROTOTYPE( int select_retry, (struct tty *tp)                              );
 
 /* rs232.c */
 _PROTOTYPE( void rs_init, (struct tty *tp)                             );
+_PROTOTYPE( void rs_interrupt, (message *m)                            );
 
 #if (CHIP == INTEL)
 /* console.c */
@@ -146,7 +150,7 @@ _PROTOTYPE( void kb_init, (struct tty *tp)                          );
 _PROTOTYPE( int kbd_loadmap, (message *m)                              );
 _PROTOTYPE( void do_panic_dumps, (message *m)                          );
 _PROTOTYPE( void do_fkey_ctl, (message *m)                             );
-_PROTOTYPE( void do_interrupt, (message *m)                            );
+_PROTOTYPE( void kbd_interrupt, (message *m)                           );
 
 /* pty.c */
 _PROTOTYPE( void do_pty, (struct tty *tp, message *m_ptr)              );
index 6c9bcb664b4ebd5b4d454ff6c2b2e4b3a16ab890..75d265d9af8dd6b5fbd9100fb73252739e2f019f 100755 (executable)
  * system can handle.
  */
 #define NR_CONS            4   /* # system consoles (1 to 8) */
-#define        NR_RS_LINES        0    /* # rs232 terminals (0 to 4) */
+#define        NR_RS_LINES        4    /* # rs232 terminals (0 to 4) */
 #define        NR_PTYS            32   /* # pseudo terminals (0 to 64) */