19,520
社区成员




RETAILMSG(SHOW_FUNCTION_MSG, (TEXT("IIC_IOControl: IOCTL_IIC_READ.\r\n")));
if ( (dwLenIn < sizeof(IIC_IO_DESC)) || (NULL == pBufIn) || (dwLenOut < sizeof(IIC_IO_DESC)) || (NULL == pBufOut) ) {
SetLastError (ERROR_INVALID_PARAMETER);
RetVal = FALSE;
DEBUGMSG (ZONE_ERROR, (TEXT(" Invalid parameter\r\n")));
break;
}
if(FAILED(CeOpenCallerBuffer(&pMarshalledInBuf, pBufIn, dwLenIn, ARG_I_PTR, TRUE)))
{
RETAILMSG(1, (TEXT("IIC_IOControl: CeOpenCallerBuffer failed in IOCTL_IIC_READ for IN buf.\r\n")));
return FALSE;
}
if(FAILED(CeOpenCallerBuffer(&pMarshalledOutBuf, pBufOut, dwLenOut, ARG_O_PTR, TRUE)))
{
RETAILMSG(1, (TEXT("IIC_IOControl: CeOpenCallerBuffer failed in IOCTL_IIC_READ for OUT buf.\r\n")));
return FALSE;
}
EnterCriticalSection(&(pInitContext->CritSec));
if(HW_Read(pOpenContext, (PIIC_IO_DESC)pMarshalledInBuf, (PIIC_IO_DESC)pMarshalledOutBuf))
{
// success
*pdwActualOut = sizeof(IIC_IO_DESC);
}
else
{
RETAILMSG(1, (TEXT("IIC_IOControl: IOCTL_IIC_READ ERROR_TIMEOUT.\r\n")));
SetLastError(ERROR_TIMEOUT);
*pdwActualOut = 0;
RetVal = FALSE;
}
LeaveCriticalSection(&(pInitContext->CritSec));
if(FAILED(CeCloseCallerBuffer(pMarshalledInBuf, pBufIn, dwLenIn, ARG_I_PTR)))
{
RETAILMSG(1, (TEXT("IIC_IOControl: CeCloseCallerBuffer failed in IOCTL_IIC_READ for IN buf.\r\n")));
return FALSE;
}
if(FAILED(CeCloseCallerBuffer(pMarshalledOutBuf, pBufOut, dwLenOut, ARG_O_PTR)))
{
RETAILMSG(1, (TEXT("IIC_IOControl: CeCloseCallerBuffer failed in IOCTL_IIC_READ for OUT buf.\r\n")));
return FALSE;
}
其实看起来大同小异。
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <types.h>
#include "iic.h"
#define FT5X06_I2C_ADDR 0x70
#define I2C_DEVICE_BUS_0 _T("IIC0:")
static HANDLE g_hFT5X06 = NULL;
//-----------------------------------------------------------------------------
// Function: FT5X06_Initialize
//
// Initialize PMIC
//
BOOL FT5X06_Initialize()
{
// Open I2C handle
g_hFT5X06 = CreateFile(I2C_DEVICE_BUS_0,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, 0);
if ( INVALID_HANDLE_VALUE == g_hFT5X06 )
{
DWORD dwErr = GetLastError();
RETAILMSG(TRUE, (TEXT("Error %d opening device '%s' \r\n"), dwErr, I2C_DEVICE_BUS_0 ));
return FALSE;
}
return TRUE;
}
//-----------------------------------------------------------------------------
// Function: FT5X06_Deinitialize
//
// Denitialize PMIC
//
VOID FT5X06_Deinitialize()
{
// Close I2C handle
if(g_hFT5X06 != INVALID_HANDLE_VALUE)
CloseHandle(g_hFT5X06);
}
//-----------------------------------------------------------------------------
// Function: FT5X06_Write
//
// Write PMIC Registers
//
BOOL FT5X06_Write(UINT8 addr, UINT8 val)
{
BOOL rc = TRUE;
if (g_hFT5X06 == INVALID_HANDLE_VALUE)
{
DEBUGMSG(TRUE, (L"FT5X06_Write: Invalide handle\r\n"));
rc = FALSE;
}
else
{
DWORD dwErr=0;
DWORD bytes;
IIC_IO_DESC IIC_Data;
UINT8 Data[16] = {0};
Data[0] = addr;
Data[1] = val;
IIC_Data.SlaveAddress = FT5X06_I2C_ADDR;
IIC_Data.Count = 2;
IIC_Data.Data = Data;
// use iocontrol to write
if ( !DeviceIoControl(g_hFT5X06,
IOCTL_IIC_WRITE,
&IIC_Data, sizeof(IIC_IO_DESC),
NULL, 0,
&bytes, NULL) )
{
dwErr = GetLastError();
RETAILMSG(TRUE,(TEXT("IOCTL_IIC_WRITE ERROR: %u \r\n"), dwErr));
rc = FALSE;
}
}
return rc;
}
//-----------------------------------------------------------------------------
// Function: FT5X06_Read
//
// Read PMIC Registers
//
BOOL FT5X06_Read(UINT8 addr, UINT8 *val, UINT8 size)
{
BOOL rc = TRUE;
if (g_hFT5X06 == INVALID_HANDLE_VALUE)
{
DEBUGMSG(TRUE, (L"FT5X06_Read: Invalide handle.\r\n"));
rc = FALSE;
}
else
{
DWORD dwErr=0;
DWORD bytes;
IIC_IO_DESC IIC_AddressData, IIC_Data;
IIC_AddressData.SlaveAddress = FT5X06_I2C_ADDR;
IIC_AddressData.Data = &addr;
IIC_AddressData.Count = 1;
IIC_Data.SlaveAddress = FT5X06_I2C_ADDR | 0x01;
IIC_Data.Data = val;
IIC_Data.Count = size;
// use iocontrol to read
if ( !DeviceIoControl(g_hFT5X06,
IOCTL_IIC_READ,
&IIC_AddressData, sizeof(IIC_IO_DESC),
&IIC_Data, sizeof(IIC_IO_DESC),
&bytes, NULL) )
{
dwErr = GetLastError();
RETAILMSG(TRUE,(TEXT("IOCTL_IIC_WRITE ERROR: %u \r\n"), dwErr));
rc = FALSE;
}
}
return rc;
}
代码如上。
我觉得驱动应该没有这种限制,所以很想怀疑是硬件问题,不过在驱动中他又能工作,那么也就证明硬件应该是通的。好晕,没想清楚。