📄 nibble.c
字号:
/*++
Copyright (C) Microsoft Corporation, 1993 - 1999
Module Name:
nibble.c
Abstract:
This module contains the code to do nibble mode reads.
Author:
Anthony V. Ercolano 1-Aug-1992
Norbert P. Kusters 22-Oct-1993
Environment:
Kernel mode
Revision History :
--*/
#include "pch.h"
BOOLEAN
ParIsNibbleSupported(
IN PPDO_EXTENSION Pdx
);
BOOLEAN
ParIsChannelizedNibbleSupported(
IN PPDO_EXTENSION Pdx
);
NTSTATUS
ParEnterNibbleMode(
IN PPDO_EXTENSION Pdx,
IN BOOLEAN DeviceIdRequest
);
NTSTATUS
ParEnterChannelizedNibbleMode(
IN PPDO_EXTENSION Pdx,
IN BOOLEAN DeviceIdRequest
);
VOID
ParTerminateNibbleMode(
IN PPDO_EXTENSION Pdx
);
NTSTATUS
ParNibbleModeRead(
IN PPDO_EXTENSION Pdx,
IN PVOID Buffer,
IN ULONG BufferSize,
OUT PULONG BytesTransferred
);
BOOLEAN
ParIsNibbleSupported(
IN PPDO_EXTENSION Pdx
)
/*++
Routine Description:
This routine determines whether or not nibble mode is suported
by trying to negotiate when asked.
Arguments:
Pdx - The device extension.
Return Value:
BOOLEAN.
--*/
{
NTSTATUS Status;
if (Pdx->BadProtocolModes & NIBBLE) {
DD((PCE)Pdx,DDT,"ParIsNibbleSupported: BAD PROTOCOL Leaving\n");
return FALSE;
}
if (Pdx->ProtocolModesSupported & NIBBLE) {
DD((PCE)Pdx,DDT,"ParIsNibbleSupported: Already Checked YES Leaving\n");
return TRUE;
}
Status = ParEnterNibbleMode (Pdx, FALSE);
ParTerminateNibbleMode (Pdx);
if (NT_SUCCESS(Status)) {
DD((PCE)Pdx,DDT,"ParIsNibbleSupported: SUCCESS Leaving\n");
Pdx->ProtocolModesSupported |= NIBBLE;
return TRUE;
}
DD((PCE)Pdx,DDT,"ParIsNibbleSupported: UNSUCCESSFUL Leaving\n");
return FALSE;
}
BOOLEAN
ParIsChannelizedNibbleSupported(
IN PPDO_EXTENSION Pdx
)
/*++
Routine Description:
This routine determines whether or not channelized nibble mode is suported (1284.3)
by trying to negotiate when asked.
Arguments:
Pdx - The device extension.
Return Value:
BOOLEAN.
--*/
{
NTSTATUS Status;
if (Pdx->BadProtocolModes & CHANNEL_NIBBLE) {
DD((PCE)Pdx,DDT,"ParIsChannelizedNibbleSupported: BAD PROTOCOL Leaving\n");
return FALSE;
}
if (Pdx->ProtocolModesSupported & CHANNEL_NIBBLE) {
DD((PCE)Pdx,DDT,"ParIsChannelizedNibbleSupported: Already Checked YES Leaving\n");
return TRUE;
}
Status = ParEnterChannelizedNibbleMode (Pdx, FALSE);
ParTerminateNibbleMode (Pdx);
if (NT_SUCCESS(Status)) {
DD((PCE)Pdx,DDT,"ParIsChannelizedNibbleSupported: SUCCESS Leaving\n");
Pdx->ProtocolModesSupported |= CHANNEL_NIBBLE;
return TRUE;
}
DD((PCE)Pdx,DDT,"ParIsChannelizedNibbleSupported: UNSUCCESSFUL Leaving\n");
return FALSE;
}
NTSTATUS
ParEnterNibbleMode(
IN PPDO_EXTENSION Pdx,
IN BOOLEAN DeviceIdRequest
)
/*++
Routine Description:
This routine performs 1284 negotiation with the peripheral to the
nibble mode protocol.
Arguments:
Controller - Supplies the port address.
DeviceIdRequest - Supplies whether or not this is a request for a device
id.
Return Value:
STATUS_SUCCESS - Successful negotiation.
otherwise - Unsuccessful negotiation.
--*/
{
NTSTATUS Status = STATUS_SUCCESS;
DD((PCE)Pdx,DDT,"ParEnterNibbleMode: Start\n");
if ( Pdx->ModeSafety == SAFE_MODE ) {
if (DeviceIdRequest) {
Status = IeeeEnter1284Mode (Pdx, NIBBLE_EXTENSIBILITY | DEVICE_ID_REQ);
} else {
Status = IeeeEnter1284Mode (Pdx, NIBBLE_EXTENSIBILITY);
}
} else {
DD((PCE)Pdx,DDT,"ParEnterNibbleMode: In UNSAFE_MODE.\n");
Pdx->Connected = TRUE;
}
// dvdr
if (NT_SUCCESS(Status)) {
DD((PCE)Pdx,DDT,"ParEnterNibbleMode: IeeeEnter1284Mode returned success\n");
Pdx->CurrentEvent = 6;
P5SetPhase( Pdx, PHASE_NEGOTIATION );
Pdx->IsIeeeTerminateOk = TRUE;
} else {
DD((PCE)Pdx,DDT,"ParEnterNibbleMode: IeeeEnter1284Mode returned unsuccessful\n");
ParTerminateNibbleMode ( Pdx );
P5SetPhase( Pdx, PHASE_UNKNOWN );
Pdx->IsIeeeTerminateOk = FALSE;
}
DD((PCE)Pdx,DDT,"ParEnterNibbleMode: Leaving with Status : %x \n", Status);
return Status;
}
NTSTATUS
ParEnterChannelizedNibbleMode(
IN PPDO_EXTENSION Pdx,
IN BOOLEAN DeviceIdRequest
)
/*++
Routine Description:
This routine performs 1284 negotiation with the peripheral to the
nibble mode protocol.
Arguments:
Controller - Supplies the port address.
DeviceIdRequest - Supplies whether or not this is a request for a device
id.
Return Value:
STATUS_SUCCESS - Successful negotiation.
otherwise - Unsuccessful negotiation.
--*/
{
NTSTATUS Status = STATUS_SUCCESS;
DD((PCE)Pdx,DDT,"ParEnterChannelizedNibbleMode: Start\n");
if ( Pdx->ModeSafety == SAFE_MODE ) {
if (DeviceIdRequest) {
Status = IeeeEnter1284Mode (Pdx, CHANNELIZED_EXTENSIBILITY | DEVICE_ID_REQ);
} else {
Status = IeeeEnter1284Mode (Pdx, CHANNELIZED_EXTENSIBILITY);
}
} else {
DD((PCE)Pdx,DDT,"ParEnterChannelizedNibbleMode: In UNSAFE_MODE.\n");
Pdx->Connected = TRUE;
}
// dvdr
if (NT_SUCCESS(Status)) {
DD((PCE)Pdx,DDT,"ParEnterChannelizedNibbleMode: IeeeEnter1284Mode returned success\n");
Pdx->CurrentEvent = 6;
P5SetPhase( Pdx, PHASE_NEGOTIATION );
Pdx->IsIeeeTerminateOk = TRUE;
} else {
DD((PCE)Pdx,DDT,"ParEnterChannelizedNibbleMode: IeeeEnter1284Mode returned unsuccessful\n");
ParTerminateNibbleMode ( Pdx );
P5SetPhase( Pdx, PHASE_UNKNOWN );
Pdx->IsIeeeTerminateOk = FALSE;
}
DD((PCE)Pdx,DDT,"ParEnterChannelizedNibbleMode: Leaving with Status : %x \n", Status);
return Status;
}
VOID
ParTerminateNibbleMode(
IN PPDO_EXTENSION Pdx
)
/*++
Routine Description:
This routine terminates the interface back to compatibility mode.
Arguments:
Controller - Supplies the parallel port's controller address.
Return Value:
None.
--*/
{
DD((PCE)Pdx,DDT,"ParTerminateNibbleMode: Enter.\n");
if ( Pdx->ModeSafety == SAFE_MODE ) {
IeeeTerminate1284Mode (Pdx);
} else {
DD((PCE)Pdx,DDT,"ParTerminateNibbleMode: In UNSAFE_MODE.\n");
Pdx->Connected = FALSE;
}
DD((PCE)Pdx,DDT,"ParTerminateNibbleMode: Exit.\n");
}
NTSTATUS
ParNibbleModeRead(
IN PPDO_EXTENSION Pdx,
IN PVOID Buffer,
IN ULONG BufferSize,
OUT PULONG BytesTransferred
)
/*++
Routine Description:
This routine performs a 1284 nibble mode read into the given
buffer for no more than 'BufferSize' bytes.
Arguments:
Pdx - Supplies the device extension.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -