///---------------------------------------------------------------------------//
// NAME OF PROJECT: TE6410 Version: 1.0 (development)
//----------------------------------------------------------------------------//
// NAME OF SOURCE FILE: ADC.cpp
//----------------------------------------------------------------------------//
// //
// Data of creation: 2010.04.8
// Data of last modification: 2010.04.8
// //
// CONTENTS: stream driver for adc control . only for AIN0
// //
//----------------------------------------------------------------------------//
// NAME OF PROJECT FILE: ADC.dll
//----------------------------------------------------------------------------//
// UTILIZING COMPILER: Microsoft Visual Studio 2005
//----------------------------------------------------------------------------//
// phantom - Forlinx Embedded //
//----------------------------------------------------------------------------//
#include "stdafx.h"
#include "bsp.h"
//#include <s3c6410.h>
#include <DrvLib.h>
#include <winuser.h>
#include "ADC.h"
#define ADC_FREQ 2500000
// adc virtual address
static volatile S3C6410_ADC_REG *v_pADCPregs ;
// global variable
HANDLE hThread;
HANDLE hAdcEvent;
unsigned int g_convertervalue;
//----------------------------------------------------------------------------//
// DLL entry //
//----------------------------------------------------------------------------//
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved) {
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
OutputDebugString(L"\nADC - DLL_PROCESS_ATTACH\n");
RETAILMSG(1,(TEXT("ADC - DLL_PROCESS_ATTACH\n")));
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
default:
break;
}
return TRUE;
}
//----------------------------------------------------------------------------//
// Delay //
//----------------------------------------------------------------------------//
static void Delay(UINT32 count)
{
volatile int i, j = 0;
volatile static int loop = S3C6410_ACLK/100000;
for(;count > 0;count--)
for(i=0;i < loop; i++) { j++; }
}
//----------------------------------------------------------------------------//
// AD Converter Thread //
//----------------------------------------------------------------------------//
DWORD WINAPI AdcThread (PVOID hdcMain)
{
int preScaler = S3C6410_PCLK/ADC_FREQ -1;
v_pADCPregs->ADCCON = (1<<14)|(preScaler<<6)|(0<<3); //channel 0
//Delay(10);
hAdcEvent = CreateEvent(NULL, TRUE, FALSE, _T("TE6410_ADC"));
while(1)
{
WaitForSingleObject(hAdcEvent, INFINITE);
v_pADCPregs->ADCCON|=0x1; //start ADC
while(v_pADCPregs->ADCCON & 0x1); //check if Enable_start is low
while(!(v_pADCPregs->ADCCON & 0x8000)); //check if EC(End of Conversion) flag is high
g_convertervalue = (int)v_pADCPregs->ADCDAT0 & 0x3ff;
//RETAILMSG(1,(TEXT("convertervalue = %d\n"), g_convertervalue));
//Delay(50);
}
return 0;
}
//----------------------------------------------------------------------------//
// AD CONVERTER START //
//----------------------------------------------------------------------------//
void Converter_Start( void )
{
SetEvent(hAdcEvent);
}
//----------------------------------------------------------------------------//
// AD CONVERTER STOP //
//----------------------------------------------------------------------------//
void Converter_Stop( void )
{
ResetEvent(hAdcEvent);
}
//----------------------------------------------------------------------------//
// ADC initial //
//----------------------------------------------------------------------------//
DWORD ADC_Init(LPCTSTR pContext, LPCVOID lpvBusContext) {
//Virtual address mapping
v_pADCPregs = (volatile S3C6410_ADC_REG*)DrvLib_MapIoSpace(S3C6410_BASE_REG_PA_ADC,
sizeof(S3C6410_ADC_REG),
FALSE);
hThread = CreateThread (NULL, 0, AdcThread, NULL, 0, NULL);
return 1;
}
//----------------------------------------------------------------------------//
// ADC deinit //
//----------------------------------------------------------------------------//
BOOL ADC_Deinit(DWORD hDeviceContext) {
VirtualFree((PVOID)v_pADCPregs, 0, MEM_RELEASE);
v_pADCPregs = NULL;
CloseHandle(hAdcEvent);
CloseHandle(hThread);
return TRUE;
}
//----------------------------------------------------------------------------//
// ADC open //
//----------------------------------------------------------------------------//
DWORD ADC_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode) {
OutputDebugString(L"ADC - ADC Open\n");
return 1;
}
//----------------------------------------------------------------------------//
// ADC close //
//----------------------------------------------------------------------------//
BOOL ADC_Close(DWORD hOpenContext) {
OutputDebugString(L"ADC - ADC Close\n");
Converter_Stop();
return TRUE;
}
//----------------------------------------------------------------------------//
// ADC read //
//----------------------------------------------------------------------------//
DWORD ADC_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count) {
*(DWORD *)pBuffer = g_convertervalue;
return 1;
}
//----------------------------------------------------------------------------//
// ADC write //
//----------------------------------------------------------------------------//
DWORD ADC_Write(DWORD hOpenContext, LPCVOID pBuffer, DWORD Count) {
return 1;
}
//----------------------------------------------------------------------------//
// ADC power up //
//----------------------------------------------------------------------------//
VOID ADC_PowerUp(DWORD hDeviceContext) {
}
//----------------------------------------------------------------------------//
// ADC down //
//----------------------------------------------------------------------------//
VOID ADC_PowerDown(DWORD hDeviceContext) {
}
//----------------------------------------------------------------------------//
// ADC seek //
//----------------------------------------------------------------------------//
DWORD ADC_Seek(DWORD hOpenContext, long Amount, DWORD Type) {
return 0;
}
//----------------------------------------------------------------------------//
// ADC IO control //
//----------------------------------------------------------------------------//
BOOL ADC_IOControl(DWORD Handle,
DWORD dwIoControlCode,
PDWORD pInBuf,
DWORD nInBufSize,
PDWORD pOutBuf,
DWORD nOutBufSize,
PDWORD pBytesReturned) {
switch (dwIoControlCode) {
case IOCTL_ADC_START:
Converter_Start();
break;
case IOCTL_ADC_STOP:
Converter_Stop();
break;
default:
break;
}
return TRUE;
}