112 lines
3.1 KiB
C
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;
|
|
}
|