summaryrefslogtreecommitdiffstats
path: root/sys/dev/ppbus/ppb_1284.c
diff options
context:
space:
mode:
authornsouch <nsouch@FreeBSD.org>1998-09-13 18:26:26 +0000
committernsouch <nsouch@FreeBSD.org>1998-09-13 18:26:26 +0000
commit5cc33ee728b656673a8728d17e20571446aa70b5 (patch)
tree5c6c2e36e8a7af235f1d9c33ab99602d4dbed9a1 /sys/dev/ppbus/ppb_1284.c
parenta35f9a9ecfa09df02ced63a2453c256721f8ad38 (diff)
downloadFreeBSD-src-5cc33ee728b656673a8728d17e20571446aa70b5.zip
FreeBSD-src-5cc33ee728b656673a8728d17e20571446aa70b5.tar.gz
ppbus enhanced to support ZIP+ : 1284 code added, microseq improved +
some bugs corrected in vpoio.
Diffstat (limited to 'sys/dev/ppbus/ppb_1284.c')
-rw-r--r--sys/dev/ppbus/ppb_1284.c89
1 files changed, 63 insertions, 26 deletions
diff --git a/sys/dev/ppbus/ppb_1284.c b/sys/dev/ppbus/ppb_1284.c
index 0a0ddeb..e13a69c 100644
--- a/sys/dev/ppbus/ppb_1284.c
+++ b/sys/dev/ppbus/ppb_1284.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: ppb_1284.c,v 1.3 1998/01/31 07:23:06 eivind Exp $
+ * $Id: ppb_1284.c,v 1.4 1998/08/03 19:14:31 msmith Exp $
*
*/
@@ -107,7 +107,7 @@ nibble_1284_inbyte(struct ppb_device *dev, char *buffer)
for (i = 0; i < 2; i++) {
/* ready to take data (nAUTO low) */
- ppb_wctr(dev, AUTOFEED | nSTROBE | nINIT | nSELECTIN);
+ ppb_wctr(dev, AUTOFEED & ~(STROBE | SELECTIN));
if ((error = do_1284_wait(dev, nACK, 0)))
return (error);
@@ -115,12 +115,8 @@ nibble_1284_inbyte(struct ppb_device *dev, char *buffer)
/* read nibble */
nibble[i] = ppb_rstr(dev);
-#ifdef DEBUG_1284
- printf("nibble_1284_inbyte: nibble[%d]=0x%x\n", i, nibble[i]);
-#endif
-
/* ack, not ready for another nibble */
- ppb_wctr(dev, nAUTOFEED | nSTROBE | nINIT | nSELECTIN);
+ ppb_wctr(dev, 0 & ~(AUTOFEED | STROBE | SELECTIN));
/* wait ack from peripherial */
if ((error = do_1284_wait(dev, nACK, nACK)))
@@ -130,10 +126,6 @@ nibble_1284_inbyte(struct ppb_device *dev, char *buffer)
*buffer = ((nibble2char(nibble[1]) << 4) & 0xf0) |
(nibble2char(nibble[0]) & 0x0f);
-#ifdef DEBUG_1284
- printf("nibble_1284_inbyte: byte=0x%x\n", *buffer);
-#endif
-
return (0);
}
@@ -160,35 +152,80 @@ nibble_1284_sync(struct ppb_device *dev)
}
/*
- * nibble_1284_mode()
+ * ppb_1284_negociate()
*
* Normal nibble mode or request device id mode (see ppb_1284.h)
*/
int
-nibble_1284_mode(struct ppb_device *dev, int mode)
+ppb_1284_negociate(struct ppb_device *dev, int mode)
{
- char ctrl;
int error;
+ int phase = 0;
- ctrl = ppb_rctr(dev);
+ ppb_wctr(dev, (nINIT | SELECTIN) & ~(STROBE | AUTOFEED));
+ DELAY(1);
ppb_wdtr(dev, mode);
- DELAY(5);
+ DELAY(1);
- ppb_wctr(dev, (ctrl & ~SELECTIN) | AUTOFEED);
- if ((error = do_1284_wait(dev, nACK | ERROR | SELECT | nFAULT,
- ERROR | SELECT | nFAULT))) {
- ppb_wctr(dev, ctrl);
- return (error);
- }
+ ppb_wctr(dev, (nINIT | AUTOFEED) & ~(STROBE | SELECTIN));
- ppb_wctr(dev, ppb_rctr(dev) | STROBE);
- DELAY(5);
+ if ((error = do_1284_wait(dev, nACK | PERROR | SELECT | nFAULT,
+ PERROR | SELECT | nFAULT)))
+ goto error;
- ppb_wctr(dev, ppb_rctr(dev) & ~STROBE);
+ phase = 1;
+
+ ppb_wctr(dev, (nINIT | STROBE | AUTOFEED) & ~SELECTIN);
DELAY(5);
- ppb_wctr(dev, ppb_rctr(dev) & ~AUTOFEED);
+ ppb_wctr(dev, nINIT & ~(SELECTIN | AUTOFEED | STROBE));
+
+#if 0 /* not respected by most devices */
+ if ((error = do_1284_wait(dev, nACK, nACK)))
+ goto error;
+
+ if (mode == 0)
+ if ((error = do_1284_wait(dev, SELECT, 0)))
+ goto error;
+ else
+ if ((error = do_1284_wait(dev, SELECT, SELECT)))
+ goto error;
+#endif
+
+ return (0);
+
+error:
+ if (bootverbose)
+ printf("%s: status=0x%x %d\n", __FUNCTION__, ppb_rstr(dev), phase);
+
+ return (error);
+}
+
+int
+ppb_1284_terminate(struct ppb_device *dev, int how)
+{
+ int error;
+
+ switch (how) {
+ case VALID_STATE:
+
+ ppb_wctr(dev, SELECTIN & ~(STROBE | AUTOFEED));
+
+ if ((error = do_1284_wait(dev, nACK | nBUSY | nFAULT, nFAULT)))
+ return (error);
+
+ ppb_wctr(dev, (SELECTIN | AUTOFEED) & ~STROBE);
+
+ if ((error = do_1284_wait(dev, nACK, nACK)))
+ return (error);
+
+ ppb_wctr(dev, SELECTIN & ~(STROBE | AUTOFEED));
+ break;
+
+ default:
+ return (EINVAL);
+ }
return (0);
}
OpenPOWER on IntegriCloud