📄 amcc_orig.cpp
字号:
/*
AMCC.cpp
Sheldon Instruments, Inc.
Abstract:
Functions for communicating with AMCC 5933/5920. Used by IOctl.cpp.
Revision History:
23Mar1999 - created by Robert Updike
24Feb2000 - added SheldonUnMapDirect. Robert Updike
2002-07-10: mik
Using byte count for SheldonConfigRead.
*/
#include "driver.h"
/*
Function Name:
SheldonMailboxRead
Routine Description:
Read from the mailbox registers.
Arguments:
Irp - I/O request being serviced
pdx - pointer to the device extension.
Return Value:
STATUS_SUCCESS
*/
NTSTATUS SheldonMailboxRead(PIRP Irp, PDEVICE_EXTENSION pdx)
{
PULONG params;
// get a ULONG pointer to the mailbox number
params = (PULONG) Irp->AssociatedIrp.SystemBuffer;
if(*params > AMCC_IMB4 )
return STATUS_INVALID_PARAMETER;
/////////////////
// IO and memory mapped
/////////////////
if( (ULONG)pdx->base[AMCC_OPREGS] & 0xffff0000 )
*params = READ_REGISTER_ULONG((ULONG *) pdx->base[AMCC_OPREGS] + *params);
else
*params = READ_PORT_ULONG((ULONG *) pdx->base[AMCC_OPREGS] + *params);
/////////////////
// Memory mapped Only
/////////////////
// *params = READ_REGISTER_ULONG((ULONG *) pdx->base[AMCC_OPREGS] + *params);
return STATUS_SUCCESS;
}
/*
Function Name:
SheldonMailboxRead16
Routine Description:
Read from the mailbox registers.
Arguments:
Irp - I/O request being serviced
pdx - pointer to the device extension.
Return Value:
STATUS_SUCCESS
*/
NTSTATUS SheldonMailboxRead16(PIRP Irp, PDEVICE_EXTENSION pdx)
{
PULONG params;
// get a ULONG pointer to the mailbox number
params = (PULONG) Irp->AssociatedIrp.SystemBuffer;
if(*params > (AMCC_IMB4*4)+2 )
return STATUS_INVALID_PARAMETER;
/////////////////
// IO and memory mapped
/////////////////
if( (ULONG)pdx->base[AMCC_OPREGS] & 0xffff0000 )
*params = READ_REGISTER_USHORT( (PUSHORT)pdx->base[AMCC_OPREGS] + *params );
else
*params = READ_PORT_USHORT( (PUSHORT)pdx->base[AMCC_OPREGS] + *params );
/////////////////
// Memory mapped Only
/////////////////
// *params = READ_REGISTER_USHORT( (PUSHORT)pdx->base[AMCC_OPREGS] + *params );
return STATUS_SUCCESS;
}
/*
Function Name:
SheldonMailboxRead8
Routine Description:
Read from the mailbox registers.
Arguments:
Irp - I/O request being serviced
pdx - pointer to the device extension.
Return Value:
STATUS_SUCCESS
*/
NTSTATUS SheldonMailboxRead8(PIRP Irp, PDEVICE_EXTENSION pdx)
{
PULONG params;
// get a ULONG pointer to the mailbox number
params = (PULONG) Irp->AssociatedIrp.SystemBuffer;
if(*params > (AMCC_IMB4*4)+3 )
return STATUS_INVALID_PARAMETER;
/////////////////
// IO and memory mapped
/////////////////
if( (ULONG)pdx->base[AMCC_OPREGS] & 0xffff0000 )
*params = READ_REGISTER_UCHAR( (PUCHAR)pdx->base[AMCC_OPREGS] + *params );
else
*params = READ_PORT_UCHAR( (PUCHAR)pdx->base[AMCC_OPREGS] + *params );
/////////////////
// Memory mapped Only
/////////////////
// *params = READ_REGISTER_UCHAR( (PUCHAR)pdx->base[AMCC_OPREGS] + *params );
return STATUS_SUCCESS;
}
/*
Function Name:
SheldonMailboxWrite
Routine Description:
Write to the mailbox registers.
Arguments:
Irp - I/O request being serviced
pdx - pointer to the device extension.
Return Value:
STATUS_SUCCESS
*/
NTSTATUS SheldonMailboxWrite(PIRP Irp, PDEVICE_EXTENSION pdx)
{
PULONG params;
// get a ULONG pointer to the mailbox number
params = (PULONG) Irp->AssociatedIrp.SystemBuffer;
if(params[SI_MAILBOX_NUM_INDEX] > AMCC_OMB4 )
return STATUS_INVALID_PARAMETER;
// write the data
/////////////////
// IO and memory mapped
/////////////////
if( (ULONG)pdx->base[AMCC_OPREGS] & 0xffff0000 )
WRITE_REGISTER_ULONG((ULONG *) pdx->base[AMCC_OPREGS] + params[SI_MAILBOX_NUM_INDEX], params[SI_MAILBOX_WRITE_DATA_INDEX]);
else
WRITE_PORT_ULONG((ULONG *) pdx->base[AMCC_OPREGS] + params[SI_MAILBOX_NUM_INDEX], params[SI_MAILBOX_WRITE_DATA_INDEX]);
/////////////////
// Memory mapped Only
/////////////////
// WRITE_REGISTER_ULONG((ULONG *) pdx->base[AMCC_OPREGS] + params[SI_MAILBOX_NUM_INDEX], params[SI_MAILBOX_WRITE_DATA_INDEX]);
return STATUS_SUCCESS;
}
/*
Function Name:
SheldonMailboxWrite16
Routine Description:
Write to the mailbox registers.
Arguments:
Irp - I/O request being serviced
pdx - pointer to the device extension.
Return Value:
STATUS_SUCCESS
*/
NTSTATUS SheldonMailboxWrite16(PIRP Irp, PDEVICE_EXTENSION pdx)
{
PULONG params;
// get a ULONG pointer to the mailbox number
params = (PULONG) Irp->AssociatedIrp.SystemBuffer;
if(params[SI_MAILBOX_NUM_INDEX] > (AMCC_OMB4*2)+2 )
return STATUS_INVALID_PARAMETER;
// write the data
/////////////////
// IO and memory mapped
/////////////////
if( (ULONG)pdx->base[AMCC_OPREGS] & 0xffff0000 )
WRITE_REGISTER_USHORT( (USHORT *) pdx->base[AMCC_OPREGS] + params[SI_MAILBOX_NUM_INDEX], (USHORT)params[SI_MAILBOX_WRITE_DATA_INDEX]);
else
WRITE_PORT_USHORT( (USHORT *) pdx->base[AMCC_OPREGS] + params[SI_MAILBOX_NUM_INDEX], (USHORT)params[SI_MAILBOX_WRITE_DATA_INDEX]);
/////////////////
// Memory mapped Only
/////////////////
// WRITE_REGISTER_USHORT( (USHORT *) pdx->base[AMCC_OPREGS] + params[SI_MAILBOX_NUM_INDEX], (USHORT)params[SI_MAILBOX_WRITE_DATA_INDEX]);
return STATUS_SUCCESS;
}
/*
Function Name:
SheldonMailboxWrite8
Routine Description:
Write to the mailbox registers.
Arguments:
Irp - I/O request being serviced
pdx - pointer to the device extension.
Return Value:
STATUS_SUCCESS
*/
NTSTATUS SheldonMailboxWrite8(PIRP Irp, PDEVICE_EXTENSION pdx)
{
PULONG params;
// get a ULONG pointer to the mailbox number
params = (PULONG) Irp->AssociatedIrp.SystemBuffer;
if(params[SI_MAILBOX_NUM_INDEX] > (AMCC_OMB4*4)+3 )
return STATUS_INVALID_PARAMETER;
// write the data
/////////////////
// IO and memory mapped
/////////////////
if( (ULONG)pdx->base[AMCC_OPREGS] & 0xffff0000 )
WRITE_REGISTER_UCHAR( (UCHAR *) pdx->base[AMCC_OPREGS] + params[SI_MAILBOX_NUM_INDEX], (UCHAR)params[SI_MAILBOX_WRITE_DATA_INDEX]);
else
WRITE_PORT_UCHAR( (UCHAR *) pdx->base[AMCC_OPREGS] + params[SI_MAILBOX_NUM_INDEX], (UCHAR)params[SI_MAILBOX_WRITE_DATA_INDEX]);
/////////////////
// Memory mapped Only
/////////////////
// WRITE_REGISTER_UCHAR( (UCHAR *) pdx->base[AMCC_OPREGS] + params[SI_MAILBOX_NUM_INDEX], (UCHAR)params[SI_MAILBOX_WRITE_DATA_INDEX]);
return STATUS_SUCCESS;
}
/*
Function Name:
SheldonOpregRead
Routine Description:
Read from the opregs.
Arguments:
Irp - I/O request being serviced
pdx - pointer to the device extension.
Return Value:
STATUS_SUCCESS
*/
NTSTATUS SheldonOpregRead(PIRP Irp, PDEVICE_EXTENSION pdx)
{
PULONG params;
// get a ULONG pointer
params = (PULONG) Irp->AssociatedIrp.SystemBuffer;
if(*params > AMCC_PTCR || *params < AMCC_MWAR)
return STATUS_INVALID_PARAMETER;
/////////////////
// IO and memory mapped
/////////////////
if( (ULONG)pdx->base[AMCC_OPREGS] & 0xffff0000 )
*params = READ_REGISTER_ULONG((ULONG *) pdx->base[AMCC_OPREGS] + *params);
else
*params = READ_PORT_ULONG((ULONG *) pdx->base[AMCC_OPREGS] + *params);
/////////////////
// Memory mapped Only
/////////////////
// *params = READ_REGISTER_ULONG((ULONG *) pdx->base[AMCC_OPREGS] + *params);
return STATUS_SUCCESS;
}
/*
Function Name:
SheldonOpregWrite
Routine Description:
Write to the opregs.
Arguments:
Irp - I/O request being serviced
pdx - pointer to the device extension.
Return Value:
STATUS_SUCCESS
*/
NTSTATUS SheldonOpregWrite(PIRP Irp, PDEVICE_EXTENSION pdx)
{
PULONG params;
// get a ULONG pointer
params = (PULONG)Irp->AssociatedIrp.SystemBuffer;
if(params[SI_OPREG_NUM_INDEX] > AMCC_PTCR || params[SI_OPREG_NUM_INDEX] < AMCC_MWAR)
return STATUS_INVALID_PARAMETER;
// write the data
/////////////////
// IO and memory mapped
/////////////////
if( (ULONG)pdx->base[AMCC_OPREGS] & 0xffff0000 )
WRITE_REGISTER_ULONG((ULONG *) pdx->base[AMCC_OPREGS] + params[SI_OPREG_NUM_INDEX], params[SI_OPREG_WRITE_DATA_INDEX]);
else
WRITE_PORT_ULONG((ULONG *) pdx->base[AMCC_OPREGS] + params[SI_OPREG_NUM_INDEX], params[SI_OPREG_WRITE_DATA_INDEX]);
/////////////////
// Memory mapped Only
/////////////////
// WRITE_REGISTER_ULONG((ULONG *) pdx->base[AMCC_OPREGS] + params[SI_OPREG_NUM_INDEX], params[SI_OPREG_WRITE_DATA_INDEX]);
return STATUS_SUCCESS;
}
/*
Function Name:
SheldonPassthroughRead
Routine Description:
Read from the Passthrough region.
Arguments:
Irp - I/O request being serviced
pdx - pointer to the device extension.
Return Value:
STATUS_SUCCESS
*/
NTSTATUS SheldonPassthroughRead(PIRP Irp, PDEVICE_EXTENSION pdx)
{
PULONG params;
CHAR *bytePointer;
// get a ULONG pointer to the buffer
params = (PULONG) Irp->AssociatedIrp.SystemBuffer;
// check that the passthrough region given really is a passthrough region
if(params[SI_PASSTHROUGH_REGION_INDEX] > AMCC_LAST_PASS_THROUGH_REGION || params[SI_PASSTHROUGH_REGION_INDEX] < AMCC_FIRST_PASS_THROUGH_REGION)
return STATUS_INVALID_PARAMETER_1;
// check that the offset is smaller than the size of the region
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -