#include <windows.h>
#include <tchar.h>
#include <smbus.h>
#include "platform.h"
#include "bceddk.h"
#include "gpio.h"
#include "E:\WINCE500\PLATFORM\Db1200\Drivers\Psc_i2s\psc_i2s.h"
#define BUFSIZE 256
WCHAR achBuffer[BUFSIZE];
DWORD dwAAASysIntr;
HANDLE hAAAInterruptEvent;
HANDLE hAAAInterruptThread;
BOOL WINAPI DllEntryPoint(HANDLE hinstDLL,
DWORD dwReason,
LPVOID lpvReserved)
{
switch(dwReason) {
case DLL_PROCESS_ATTACH:
RETAILMSG(1, (TEXT("STRINGS:DLL_PROCESS_ATTACH\n")));
break;
case DLL_THREAD_ATTACH:
RETAILMSG(1, (TEXT("STRINGS:DLL_THREAD_ATTACH\n")));
break;
case DLL_THREAD_DETACH:
RETAILMSG(1, (TEXT("STRINGS:DLL_THREAD_DETACH\n")));
break;
case DLL_PROCESS_DETACH:
RETAILMSG(1, (TEXT("STRINGS:DLL_PROCESS_DETACH\n")));
break;
#ifdef UNDER_CE
case DLL_PROCESS_EXITING:
RETAILMSG(1, (TEXT("STRINGS:DLL_PROCESS_EXITING\n")));
break;
case DLL_SYSTEM_STARTED:
RETAILMSG(1, (TEXT("STRINGS:DLL_SYSTEM_STARTED\n")));
break;
#endif
}
return TRUE;
}
DWORD ThreadProc(PVOID pArg)
{
DWORD dw;
HANDLE hPCA9554;
SMBUS_TRANSFER smPCA9554;
hPCA9554 = SMBus_Initialize();
while (1) {
dw = WaitForSingleObject(hAAAInterruptEvent, INFINITE);
switch(dw) {
case WAIT_OBJECT_0:
ResetEvent(hAAAInterruptEvent);
InterruptDone(dwAAASysIntr);
RETAILMSG(1, (TEXT("AAA9554: Internal\r\n")));
smPCA9554.Address = 0x4e;
smPCA9554.Register = 0;
smPCA9554.DataSize = 0;
smPCA9554.Data[0] = 0;
SMBus_WriteData(hPCA9554, &smPCA9554);
smPCA9554.Address = 0x4f;
smPCA9554.Register = 0;
smPCA9554.DataSize = 1;
smPCA9554.Data[0] = 0;
SMBus_ReadData(hPCA9554, &smPCA9554);
RETAILMSG(1, (TEXT("AAA9554: smPCA9554.Data[0] = %x\r\n", smPCA9554.Data[0])));
break;
}
}
return 1;
}
DWORD AAA_Init(DWORD dwContext)
{
DWORD dwRet = 0;
DWORD dwAAAthreadID;
int x = 0;
RETAILMSG(1, (TEXT("MYSTRINGS:AAA_Init\n")));
// 初始化驱动程序
memset(achBuffer, 0, BUFSIZE * sizeof(WCHAR));
// 返回一个不为零的数
dwRet = 1;
dwAAASysIntr = InterruptConnect(Internal, 0, HWINTR_GPIO28, 0);
if (SYSINTR_NOP == dwAAASysIntr) {
RETAILMSG(1, (TEXT("AAA9554: Can't allocate AAA9554 SYSINTR\r\n")));
goto ErrorReturn;
}
hAAAInterruptEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (NULL == hAAAInterruptEvent) {
RETAILMSG(1, (TEXT("AAA9554: Can't create AAA9554 interrupt event\r\n")));
goto ErrorReturn;
}
if (!InterruptInitialize(dwAAASysIntr, hAAAInterruptEvent, NULL, 0)) {
RETAILMSG(1, (TEXT("AAA9554: Call to InterruptInitialize failed\r\n")));
goto ErrorReturn;
}
hAAAInterruptThread = CreateThread(NULL, 0, ThreadProc, &x, 0, &dwAAAthreadID);
if (NULL == hAAAInterruptThread) {
RETAILMSG(1, (TEXT("AAA9554: Call to CreateThread failed\r\n")));
goto ErrorReturn;
}
return dwRet;
ErrorReturn:
dwRet = 0;
return dwRet;
}
BOOL AAA_Deinit(DWORD hDeviceContext)
{
BOOL bRet = TRUE;
RETAILMSG(1, (TEXT("MYSTRINGS:AAA_Deinit\n")));
return bRet;
}
DWORD AAA_Open(DWORD hDeviceContext,
DWORD AccessCode,
DWORD ShareMode)
{
DWORD dwRet = 0;
RETAILMSG(1, (TEXT("MYSTRINGS:AAA_Open\n")));
// 必须返回一个不为空的句柄
dwRet = 1;
return dwRet;
}
BOOL AAA_Close(DWORD hOpenContext)
{
BOOL bRet = TRUE;
RETAILMSG(1, (TEXT("MYSTRINGS:AAA_Close\n")));
return bRet;
}
BOOL AAA_IOControl(DWORD hOpenContext,
DWORD dwCode,
PBYTE pBufIn,
DWORD dwLenIn,
PBYTE pBufOut,
DWORD dwLenOut,
PDWORD pdwActualOut)
{
BOOL bRet = TRUE;
RETAILMSG(1, (TEXT("MYSTRINGS:AAA_IOControl\n")));
return bRet;
}
void AAA_PowerDown(DWORD hDeviceContext)
{
RETAILMSG(1, (TEXT("MYSTRINGS:AAA_PowerDown\n")));
}
void AAA_PowerUp(DWORD hDeviceContext)
{
RETAILMSG(1, (TEXT("MYSTRINGS:AAA_PowerUp\n")));
}
DWORD AAA_Read(DWORD hOpenContext,
LPVOID pBuffer,
DWORD Count)
{
DWORD dwRet = 0;
RETAILMSG(1, (TEXT("MYSTRINGS:AAA_Read\n")));
// 确定读取的字节大小读取数据
DWORD cbBuffer = wcslen(achBuffer);
dwRet = min(cbBuffer, Count);
wcsncpy((LPWSTR)pBuffer, achBuffer, dwRet);
// 返回实际读取的字节数
return dwRet;
}
DWORD AAA_Seek(DWORD hOpenContext,
long Amount,
WORD Type)
{
DWORD dwRet = 0;
RETAILMSG(1, (TEXT("MYSTRINGS:AAA_Seek\n")));
return dwRet;
}
DWORD AAA_Write(DWORD hOpenContext,
LPCVOID pBuffer,
DWORD Count)
{
DWORD dwRet = 0;
RETAILMSG(1, (TEXT("MYSTRINGS:AAA_Write\n")));
// 确定实际要写入字节的大小,写入数据
dwRet = min(BUFSIZE, Count);
wcsncpy(achBuffer, (LPWSTR)pBuffer, dwRet);
// 返回实际写入的字节数
return dwRet;
}