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

📄 vxsg.c

📁 wince host 和 target PCI驱动程序
💻 C
字号:
/*
FILE	vxsg.c
HISTORY
		951030	Tilakraj Roy Created
		961211	TR		Changed interfaces for calling from tmbuffer.
Contains routines for page locking non contigious buffers for peripheral bus
master DMA transfers. Contains Windows specific code. Does not contain i960 or
TriMedia code.
*/
#define WANTVXDWRAPS
#include "basedef.h"
#include "vmm.h"
#include "vmmreg.h"
#include "vxdwraps.h"

#include "vxstd.h"
#include "vxwin.h"
#include "vxdbg.h"

#pragma VxD_LOCKED_CODE_SEG
#pragma VxD_LOCKED_DATA_SEG

// tbd
#define	ADDRESS_AND_SIZE_TO_SPAN_PAGES( LinearAddress, Size ) 

BOOL	sgBufferLock ( PVOID pBuffer, DWORD dwSize, PVOID *ppEDDS )
{
	PEDDS	pEDDS;
	WORD	wMaxNumPTE;
	WORD	wSizeOfEDDS;
	
	WORD	wIdx;



	// number of entries needed to lock the pages.
	wMaxNumPTE = (WORD) ( dwSize >> 12 ) + 2;


	// calculate the size of edds for page locking
	wSizeOfEDDS = ( wMaxNumPTE * sizeof ( PTE ) ) + sizeof ( EDDS );

	// allocate entries for the page frame table and the Extended DMA Desc
	if ( ( pEDDS = (PEDDS) winHeapAllocate ( wSizeOfEDDS ) ) == NULL ) 
	{
		DP(0,"sgBufferLock:HeapAllocate:FAIL\n");
		return FALSE;
	}

	pEDDS->dwSize = dwSize;
	pEDDS->dwLinear = (DWORD)pBuffer;
	pEDDS->wSegment = 0;
	pEDDS->wAvailable =  wMaxNumPTE;

	//lock the applications buffer
	if ( winVDMAD_Scatter_Lock ( winGet_Sys_VM_Handle(), 0, pEDDS ) !=
		STATUS_SUCCESS )
	{
		DP(0,"sgBufferLock:VDMAD_Scatter_Lock:Buffer:FAIL\n");
		return FALSE;
	}	

	
	DP(5,"sgBufferLock:Buffer[%x]:Size[%x]:PTE#[%x]\n",
		pBuffer, dwSize, pEDDS->wUsed);

	/*
	DP(5,"sgBufferLock:PTE[0]:Phys[%x]:Size[%x]\n",
		pEDDS->PageTable[0].dwPhysAddr, pEDDS->PageTable[0].dwSize);
	DP(5,"sgBufferLock:PTE[%x]:Phys[%x]:Size[%x]\n",
		( pEDDS->wUsed - 1 ),pEDDS->PageTable[( pEDDS->wUsed - 1 )].dwPhysAddr,
		 pEDDS->PageTable[( pEDDS->wUsed - 1 )].dwSize);
	*/
	for ( wIdx = 0 ; wIdx < pEDDS->wUsed ; wIdx++ )
	{
		DP(5,"PTE[%x]:Phys[%x]:Size[%x]\n",wIdx,pEDDS->PageTable[wIdx].dwPhysAddr, pEDDS->PageTable[wIdx].dwSize);
	}

	
	*ppEDDS = pEDDS;
	return 	TRUE;
}


BOOL	sgBufferUnlock( PVOID pvEDDS )
{
	PEDDS	pEDDS		= (PEDDS)pvEDDS;

	DP(5,"sgBufferUnlock:EDDS[%x]:Buffer[%x]:Size[%x]:PTE#[%x]\n",
		pEDDS, pEDDS->dwLinear, pEDDS->dwSize, pEDDS->wUsed);

	if ( winVDMAD_Scatter_Unlock ( winGet_Sys_VM_Handle(), 0, pEDDS ) !=
		STATUS_SUCCESS )
	{
		DP(0,"sgBufferUnlock:VDMAD_Scatter_Unlock:Buffer:FAIL\n");
		return FALSE;
	}

	winHeapFree (  (DWORD)pEDDS );
		
	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -