windows-nt/Source/XPSP1/NT/drivers/parallel/parport2/sppieee.c
2020-09-26 16:20:57 +08:00

112 lines
3.1 KiB
C

/*++
Copyright (C) Microsoft Corporation, 1993 - 1998
Module Name:
sppieee.c
Abstract:
This module contains code for the host to utilize an ieee version of
compatibility mode
Author:
Robbie Harris (Hewlett-Packard) 29-July-1998
Environment:
Kernel mode
Revision History :
--*/
#include "pch.h"
NTSTATUS
SppIeeeWrite(
IN PPDO_EXTENSION Extension,
IN PVOID Buffer,
IN ULONG BytesToWrite,
OUT PULONG BytesTransferred
)
/*++
Routine Description:
Arguments:
Extension - Supplies the device extension.
Return Value:
None.
--*/
{
NTSTATUS status = STATUS_SUCCESS;
PUCHAR Controller = Extension->Controller;
PUCHAR pPortDCR = Extension->Controller + OFFSET_DCR;
PUCHAR pPortData = Extension->Controller + OFFSET_DATA;
ULONG wByteCount = BytesToWrite;
UCHAR bDCRstrobe; // Holds precomputed value for state 35
UCHAR bDCRnormal; // Holds precomputed value for state 37
PUCHAR lpsBufPtr = (PUCHAR)Buffer; // Pointer to buffer cast to desired data type
// Make precomputed DCR values for strobe and periph ack
bDCRstrobe = SET_DCR(DIR_WRITE, IRQEN_DISABLE, ACTIVE, ACTIVE, ACTIVE, INACTIVE);
bDCRnormal = SET_DCR(DIR_WRITE, IRQEN_DISABLE, ACTIVE, ACTIVE, ACTIVE, ACTIVE);
// Wait a bit to give nBusy a chance to settle, because
// WriteComm will bail immediately if the device says busy
if ( CHECK_DSR( Controller,
INACTIVE, DONT_CARE, DONT_CARE, DONT_CARE, DONT_CARE,
IEEE_MAXTIME_TL ) )
{
while (wByteCount)
{
// Place a data byte on the bus
P5WritePortUchar(pPortData, *lpsBufPtr);
// Start handshake by dropping strobe
P5WritePortUchar(pPortDCR, bDCRstrobe);
// Wait for Periph Busy Response
if ( !CHECK_DSR(Controller, ACTIVE, DONT_CARE, DONT_CARE,
DONT_CARE, DONT_CARE, IEEE_MAXTIME_TL) )
{
status = STATUS_DEVICE_BUSY;
break;
}
// Printer responded by making Busy high -- the byte has
// been accepted. Adjust the data pointer.
lpsBufPtr++;
// Finish handshake by raising strobe
P5WritePortUchar(pPortDCR, bDCRnormal);
// Adjust count while we're waiting for the peripheral
// to respond with state 32
wByteCount--;
// Wait for PeriphAck and PeriphBusy response
if ( !CHECK_DSR(Controller, INACTIVE, ACTIVE, DONT_CARE, DONT_CARE,
DONT_CARE, IEEE_MAXTIME_TL) )
{
// Set appropriate error based on relaxed timeout.
status = STATUS_DEVICE_BUSY;
break;
}
} // while...
*BytesTransferred = BytesToWrite - wByteCount; // Set current count.
}
return status;
}