📄 dac.cpp
字号:
#include "windows.h"
#include "s2410.h"
#include "winbase.h"
#define EXIO_BASE 0xA2000000 //扩展IO物理地址
#define DAC_IOCTRL_WRITEDA 0x01 //写MAX504
typedef void (* INIT)(void);
typedef BOOL (* SEND)(unsigned char);
INIT SpiInit;
SEND SpiSend;
HINSTANCE hmode;
typedef struct{
unsigned int a;
}EXIO_TEST;
EXIO_TEST *exio=NULL;
bool
DllEntry(HANDLE hinstdll,
DWORD dwreason,
LPVOID lpvreserved )
{
return true;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
bool DAC_Close(DWORD hopencontext)
{
bool bret = true;
return bret;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
bool DAC_Deinit(DWORD hdevicecontext)
{
bool bret = true;
return bret;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD DAC_Init(DWORD dwcontext)
{
hmode=LoadLibrary(_T("spidrv.dll")); //获取SPI动态链接库句柄
RETAILMSG(1,(TEXT("DAC.DLL: init !!!\r\n")));
if(hmode)
{
SpiInit=(INIT)GetProcAddress(hmode,_T("SPI_Init")); //获取函数地址
SpiSend=(SEND)GetProcAddress(hmode,_T("SPI_SendByte"));
}
else
RETAILMSG(1,(TEXT("LoadLibrary failed!!!\r\n")));
SpiInit(); //初始化SPI总线
///////////////////////映射扩展IO地址///////////////////
exio=(EXIO_TEST *)VirtualAlloc(0,sizeof(EXIO_TEST),MEM_RESERVE, PAGE_NOACCESS);
if(!exio)
{
RETAILMSG(1,(TEXT("DACdriver:exio virualalloc failed\r\n")));
return 0;
}
if(!VirtualCopy((PVOID)exio,(PVOID)(EXIO_BASE),sizeof(EXIO_TEST),PAGE_READWRITE | PAGE_NOCACHE ))
{
RETAILMSG(1,(TEXT("DACdriver:virtualcopy failed! \r\n")));
return 0;
}
exio=(EXIO_TEST *)((unsigned char *)exio+0x100);
exio->a &= 0xFFFFFFF0; //EXIO低4位清零
exio->a |= 0x00000007; //选中MAX504芯片
//hmode =GetModuleHandle(_T("spidrv.dll"));
return 1;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD DAC_IOControl(
DWORD Handle,
DWORD dwIoControlCode,
PBYTE pInBuf,
DWORD nInBufSize,
PBYTE pOutBuf,
DWORD nOutBufSize,
PDWORD pBytesReturned
)
{
unsigned int value=0;
switch(dwIoControlCode)
{
case DAC_IOCTRL_WRITEDA:
exio->a &= 0xFFFFFFF0; //EXIO低4位清零
exio->a |= 0x00000007; //选中MAX504芯片
value=(*((unsigned int *)pInBuf));
value <<= 2; //电压值左移两位
SpiSend((value>>8)&0xff); //传送电压值高8位
SpiSend(value&0xff); //传送电压值低8位
exio->a |= 0x0000000f; //拉高片选,锁存电压值
break;
default :
return 0;
}
return 1;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD DAC_Open(DWORD hdevicecontext, DWORD accesscode, DWORD sharemode)
{
DWORD dwret = 0;
dwret = 1; // have to make non-zero for this call to succeed.
return dwret;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void DAC_Powerdown(DWORD hdevicecontext)
{
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void DAC_Powerup(DWORD hdevicecontext)
{
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD DAC_Read(DWORD hopencontext,LPVOID pbuffer, DWORD count)
{
DWORD dwret = 0;
return dwret;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD DAC_Seek(DWORD hopencontext, long amount, DWORD type)
{
DWORD dwret = 0;
return dwret;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD DAC_Write(DWORD hopencontext, LPVOID psourcebytes, DWORD numberofbytes)
{
DWORD dwret = 0;
return dwret;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -