⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 amcc_orig.cpp

📁 The PCI Local bus concept was developed to break the PC data I/O bottleneck and clearly opens the d
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/*

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 + -