/**********************************************************
*
* 文件名: ADC.c
* 功能: IO 口驱动相关函数实现
* 作者: Z.C.F
**********************************************************/
#include "windows.h"
#include "s2410.h"
#include "Windev.h"
//----------------------------------------------------------
//宏定义
//----------------------------------------------------------
#define IOCTL_SET_UP \
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)
HINSTANCE hInst;
//---------------------------------------------------------
//全局变量
//---------------------------------------------------------
/**********************************************************
* 函数名: DLLEntry
* 功能: DLL入口函数
* 主要屏蔽了一些加载卸载信息
* 输入参数:
* hinstDll: DLL句柄
* DwReason: 挂载状态
* lpReserved: 保留
* 输出参数:
* TURE: 挂载成功
**********************************************************/
BOOL DllEntry(
HINSTANCE hinstDll, /*@parm Instance pointer. */
DWORD dwReason, /*@parm Reason routine is called. */
LPVOID lpReserved /*@parm system parameter. */
)
{
hInst=hinstDll;
if ( dwReason == DLL_PROCESS_ATTACH )
{
DisableThreadLibraryCalls((HMODULE) hinstDll);
RETAILMSG(1,(TEXT("ADC DLL ATTACHED!\r\n")));
}
if ( dwReason == DLL_PROCESS_DETACH )
{
RETAILMSG(1,(TEXT("ADC DLL DETACHED!\r\n")));
}
return(TRUE);
}
/*********************************************************
* 函数名: ADC_Init
* 功能:
* 输入参数:dwcontext
* 输出参数: 无
* 返回值: 返回ADC设备句柄
*********************************************************/
HANDLE ADC_Init(DWORD dwcontext)
{
volatile ADCreg *pADCIOreg;
pADCIOreg = NULL;
RETAILMSG( 1, (TEXT("Initialing pADCIOreg!\r\n")));
//分配空间
pADCIOreg = ( ADCreg * )VirtualAlloc( 0, sizeof(ADCreg), MEM_RESERVE, PAGE_NOACCESS );
if( !pADCIOreg )
{
RETAILMSG( 1, (TEXT("Unable to alloc memory for ADCIOreg!\r\n")));
return NULL;
}
if( !VirtualCopy((PVOID)pADCIOreg, (PVOID)(ADC_BASE), sizeof(ADCreg),
PAGE_READWRITE | PAGE_NOCACHE ))
{
RETAILMSG(1, (TEXT("For ADCIOreg, virtual copy failed!\r\n")));
return NULL;
}
return pADCIOreg;
}
/*****************************************************************
* 函数名 : ADC_Deinit
* 功能 :
* 输入参数:
dwcontext:
* 输出参数:
* 返回值 :
******************************************************************/
BOOL ADC_Deinit(volatile ADCreg* dwcontext)
{
if (!dwcontext)
{
SetLastError(ERROR_INVALID_HANDLE);
return(FALSE);
}
LocalFree(dwcontext);
return(TRUE);
}
/*********************************************************
* 函数名: ADC_Open
* 功能: 打开设备
* 输入参数:
* dwcontext:
* dwaccess:
* dwshare:
* 输出参数: 无
* 返回值: 返回打开的ADC设备句柄
*********************************************************/
HANDLE ADC_Open(volatile ADCreg *dwcontext,DWORD dwaccess,DWORD dwshare)
{
//WORD temp;
RETAILMSG(1, (TEXT("adc, open ADCIOreg\r\n")));
//RETAILMSG( 1, (TEXT("rADCCON = %x\r\n"), hDeviceContext->pADCregs->rADCCON));
//RETAILMSG( 1, (TEXT("AccessCode = %x, ShareMode = %x, DM61xIO = %x\r\n"), AccessCode, ShareMode, hDeviceContext));
return dwcontext;
}
/*****************************************************************
* 函数名 : ADC_Close
* 功能 :
* 输入参数:
* dwopen:
* 输出参数:
* 返回值 :
******************************************************************/
BOOL ADC_Close(volatile ADCreg* dwopen)
{
if ( !dwopen )
{
SetLastError(ERROR_INVALID_HANDLE);
return(FALSE);
}
return(TRUE);
}
/*********************************************************
* 函数名: ADC_Read
* 功能: 打开设备
* 输入参数:
* dwopen:
* pBuffer:
* dwcount:
* 输出参数: 读缓存
* 返回值:
* 0表示文件末
* 1表示错误
* 返回读取的字节数表示成功
*********************************************************/
ULONG ADC_Read(volatile ADCreg *dwopen,LPVOID pbuffer,DWORD dwcount)
{
return 0;
}
/*********************************************************
* 函数名: ADC_Write
* 功能: 打开设备
* 输入参数:
* dwopen:
* pBuffer:
* dwcount:
* 输出参数:
* 返回值:
*********************************************************/
ULONG ADC_Write(volatile ADCreg *dwopen, LPCVOID pbuffer, DWORD dwcount )
{
return 0;
}
/*****************************************************************
* 函数名 : ADC_Seek
* 功能 :
* 输入参数:
* hOpenContext:
* Amount:
* Type :
* 输出参数:
* 返回值 :
******************************************************************/
ULONG ADC_Seek( DWORD hOpenContext, long Amount, WORD Type )
{
return 0;
}
/*****************************************************************
* 函数名 : ADC_IOControl
* 功能 :
* 输入参数:
* hOpenDM61xIOreg:
* dwCode:
* pBufIn :
* dwLenIn :
* pBufOut:
* dwLenOut :
* pdwActualOut :
* 输出参数:
* 返回值 :
******************************************************************/
BOOL ADC_IOControl(volatile ADCreg* pADCIOreg,DWORD dwCode,PBYTE pBufIn,DWORD dwLenIn,
PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut )
{
int iDigiValue = 0;
if(pADCIOreg == INVALID_HANDLE_VALUE)
{
RETAILMSG(1, (TEXT("Invalid handle!\r\n")));
return FALSE;
}
switch(dwCode)
{
case IOCTL_SET_UP:
iDigiValue = Read_Adc( pADCIOreg,*pBufIn);
*( int* )pBufOut = iDigiValue;
}
RETAILMSG(1, (TEXT("adc, read after.\r\n")));
return TRUE;
}
/*****************************************************************
* 函数名 : ADC_PowerUp
* 功能 : 打开电源
* 输入参数:
* pHead
* 输出参数:
* 返回值 :
******************************************************************/
void ADC_PowerUp(volatile ADCreg *pHead) /*@parm Handle to device. */
{
}
/*****************************************************************
* 函数名 : ADC_PowerDown
* 功能 : 关闭电源
* 输入参数:
* pHead
* 输出参数:
* 返回值 :
******************************************************************/
void ADC_PowerDown(volatile ADCreg *pHead) /*@parm Handle to device. */
{
}
// config the adc registers and read the digital data
int Read_Adc( volatile ADCreg* pADCIOreg,int ch )
{
RETAILMSG(1, (TEXT("channel:%d\r\n")),ch);
pADCIOreg->rADCCON = (1<<14)|(ch<<3)|(19<<6); // setup channel
//pADCIOreg->rADCCON |= 0<<3; // setup channel
pADCIOreg->rADCCON |= 0x1; // start adc
while(pADCIOreg->rADCCON & 0x1); //check if Enable_start is low
while(!(pADCIOreg->rADCCON & 0x8000)); //check if End of Conversion flag is high
return ( (int)pADCIOreg->rADCDAT0 & 0x3ff ); //return the digital value
}
/*
void Test_Adc(PBYTE pBufOut)
{
int i,key;
int a0=0; //Initialize variables
key=1;
preScaler = ADC_FREQ;
preScaler = PCLK/ADC_FREQ -1; //PCLK:50.7MHz
if (key == 0)
{
for(i=0;i<REQCNT;i++) //May 08, 2002 SOP
{
a0=ReadAdc(0);
}
}
else if(key == 1)
{
for(i=0;i<REQCNT;i++) // ?
{
a0=ReadAdc(0);
}
}
// read digital data to buffer
*(WORD*)pBufOut++ = a0;
rADCCON=(0<<14)|(19<<6)|(7<<3)|(1<<2); //stand by mode to reduce power consumption
}
int ReadAdc(int ch)
{
int i;
static int prevCh=-1;
rADCCON = (1<<14)|(preScaler<<6)|(ch<<3); //setup channel
if(prevCh!=ch)
{
rADCCON = (1<<14)|(preScaler<<6)|(ch<<3); //setup channel
评论0