summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1997-11-15 18:15:36 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1997-11-15 18:15:36 +0000
commitd24ceb38f71e2b8a0b0822815de35cc0658c2d4e (patch)
treeea630f5e30b81178221066489117ec1030003fb2 /c/src/lib/libbsp
parentFixed prototype (diff)
downloadrtems-d24ceb38f71e2b8a0b0822815de35cc0658c2d4e.tar.bz2
interrupt driven change from Eric Norum
Diffstat (limited to 'c/src/lib/libbsp')
-rw-r--r--c/src/lib/libbsp/m68k/gen68360/console/console.c54
1 files changed, 43 insertions, 11 deletions
diff --git a/c/src/lib/libbsp/m68k/gen68360/console/console.c b/c/src/lib/libbsp/m68k/gen68360/console/console.c
index 270d6b2bb7..2c2ce594e2 100644
--- a/c/src/lib/libbsp/m68k/gen68360/console/console.c
+++ b/c/src/lib/libbsp/m68k/gen68360/console/console.c
@@ -40,7 +40,7 @@ static void *smc1ttyp;
/*
* I/O buffers and pointers to buffer descriptors
*/
-static volatile char rxBuf[RXBUFSIZE], txBuf;
+static volatile char rxBuf[RXBUFSIZE];
static volatile m360BufferDescriptor_t *smcRxBd, *smcTxBd;
/*
@@ -62,6 +62,15 @@ smc1InterruptHandler (rtems_vector_number v)
smcRxBd->status = M360_BD_EMPTY | M360_BD_WRAP | M360_BD_INTERRUPT;
}
}
+
+ /*
+ * Buffer transmitted?
+ */
+ if (m360.smc1.smce & 0x2) {
+ m360.smc1.smce = 0x2;
+ if ((smcTxBd->status & M360_BD_READY) == 0)
+ rtems_termios_dequeue_characters (smc1ttyp, smcTxBd->length);
+ }
m360.cisr = 1UL << 4; /* Clear SMC1 interrupt-in-service bit */
}
@@ -122,8 +131,6 @@ smc1Initialize (void)
* Setup the Transmit Buffer Descriptor
*/
smcTxBd->status = M360_BD_WRAP;
- smcTxBd->length = 1;
- smcTxBd->buffer = &txBuf;
/*
* Set up SMC1 general and protocol-specific mode registers
@@ -150,7 +157,7 @@ smc1Initialize (void)
sc = rtems_interrupt_catch (smc1InterruptHandler,
(m360.cicr & 0xE0) | 0x04,
&old_handler);
- m360.smc1.smcm = 1; /* Enable SMC1 receiver interrupt */
+ m360.smc1.smcm = 3; /* Enable SMC1 TX and RX interrupts */
m360.cimr |= 1UL << 4; /* Enable SMC1 interrupts */
}
#endif
@@ -168,19 +175,32 @@ smc1Read (int minor)
return c;
}
+/*
+ * Device-dependent write routine
+ * Interrupt-driven devices:
+ * Begin transmission of as many characters as possible (minimum is 1).
+ * Polling devices:
+ * Transmit all characters.
+ */
static int
smc1Write (int minor, char *buf, int len)
{
- int nwrite = 0;
-
- while (nwrite < len) {
+#if (defined (M360_SMC1_INTERRUPT))
+ smcTxBd->buffer = buf;
+ smcTxBd->length = len;
+ smcTxBd->status = M360_BD_READY | M360_BD_WRAP | M360_BD_INTERRUPT;
+#else
+ while (len--) {
+ static char txBuf;
while (smcTxBd->status & M360_BD_READY)
continue;
txBuf = *buf++;
+ smcTxBd->buffer = &txBuf;
+ smcTxBd->length = 1;
smcTxBd->status = M360_BD_READY | M360_BD_WRAP;
- nwrite++;
}
- return nwrite;
+#endif
+ return 0;
}
/*
@@ -190,6 +210,16 @@ smc1Write (int minor, char *buf, int len)
*/
/*
+ * Reserve resources consumed by this driver
+ */
+void console_reserve_resources(
+ rtems_configuration_table *configuration
+)
+{
+ rtems_termios_reserve_resources (configuration, 1);
+}
+
+/*
* Initialize and register the device
*/
rtems_device_driver console_initialize(
@@ -237,14 +267,16 @@ rtems_device_driver console_open(
NULL,
NULL,
NULL,
- smc1Write);
+ smc1Write,
+ 1);
smc1ttyp = args->iop->data1;
#else
sc = rtems_termios_open (major, minor, arg,
NULL,
NULL,
smc1Read,
- smc1Write);
+ smc1Write,
+ 0);
#endif
return sc;
}