📄 gpio_i2c.c
字号:
/***************************************************
WRITE CONTROL DATA: make sure here: SLCK = 0; SDIO = 0
****************************************************/
if(operation == READ)
{
RETAILMSG(1,(TEXT("0x49 READ!\r\n ")));
controlword = 0x4A;
}
else
{
RETAILMSG(1,(TEXT("0x48 WRITE!\r\n ")));
controlword = 0x4B;
}
RETAILMSG(3,(TEXT("Write IIC ADDR: 0x%x\r\n"),controlword));
for(i = 7; i>=0; i--)
{
if((controlword >> i) & 0x01)
sdio_high();
else
sdio_low();
sleepGPIO(500);
sclk_high();
sleepGPIO(500);
sclk_low();
sleepGPIO(500);
}
/***************************
CHECK ACK for control word
***************************/
sdio_input_enable();
sleepGPIO(500);
sclk_high();
sleepGPIO(500);
if(( returndata = sdio_getdata())!= 0)//READ_SDIO
{
error = 1;
RETAILMSG(1,(TEXT("Write add ack error!\r\n ")));
RETAILMSG(3,(TEXT("returndata: %d\r\n"),returndata));
goto STOP;
}
RETAILMSG(1,(TEXT("Write add ack OK!\r\n ")));
sclk_low();
sleepGPIO(500);
/***************************************
WRITE or READ data
****************************************/
if(operation == READ)
RETAILMSG(3,(TEXT("read data show: ")));
else
RETAILMSG(3,(TEXT("write data show: ")));
for(j = 0; j < numBytes; j++, data++)
{
if(operation == WRITE)
sdio_output_enable();
else
sdio_input_enable();
for(i = 7; i>=0; i--)
{
if(operation == WRITE)
if((*data >> i) & 0x01)
sdio_high();
else
sdio_low();
sleepGPIO(50);
sclk_high();
sleepGPIO(50);
if(operation == READ)
*data = ((*data << 1) | (sdio_getdata()));//READ_SDIO
sclk_low();
sleepGPIO(50);
}
if(operation == READ)
RETAILMSG(3,(TEXT(" 0x%x"),*data));
else
RETAILMSG(3,(TEXT(" 0x%x"),*data));
//modify at 20080331
/******************************
CHECK ACK or SEND ACK=0
*******************************/
if(operation == WRITE)
sdio_input_enable();
else
{
sdio_output_enable();
if(j == (numBytes - 1))
sdio_high();
else
sdio_high();
}
sleepGPIO(50);
sclk_high();
sleepGPIO(50);
if(operation == WRITE)
if((sdio_getdata())!= 0)//READ_SDIO
{
RETAILMSG(1,(TEXT(" ACK ERROR,Quit!\r\n")));
error = 1;
goto STOP;
}
RETAILMSG(1,(TEXT(" ACK OK")));
sclk_low();
sleepGPIO(50);
}
/****************************
STOP: make sure here: SCLK = 0
*****************************/
STOP:
sdio_output_enable();
sdio_low();
sleepGPIO(50);
sclk_high();
sleepGPIO(50);
sdio_high();
return(error);
//function end
}
///////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
// @xref <nl>
// <f DEMO_Init>, <nl>
// <f DEMO_Deinit>, <nl>
// <f DEMO_Open>, <nl>
// <f DEMO_Close>, <nl>
// <f DEMO_Read>, <nl>
// <f DEMO_Write>, <nl>
// <f DEMO_Seek>, <nl>
// <f DEMO_PowerUp>, <nl>
// <f DEMO_PowerDown>, <nl>
// <f DEMO_IOControl> <nl>
//
// -----------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////
BOOL CALLBACK DllMain(HANDLE hDLL,
DWORD dwReason,
LPVOID lpvReserved)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH :
DEBUGREGISTER((HINSTANCE)hDLL);
DisableThreadLibraryCalls((HMODULE) hDLL);
break;
case DLL_PROCESS_DETACH :
break;
case DLL_THREAD_DETACH :
break;
case DLL_THREAD_ATTACH :
break;
default :
break;
}
//end switch
return TRUE;
}
extern "C" DWORD DEMO_Init(DWORD Index)
{
RETAILMSG(1,(TEXT("DEMO_Init!\r\n ")));
//DEMO_reset();
// initial_DEMO();
return TRUE;
}
// -----------------------------------------------------------------------------
//
// @doc WDEV_EXT
//
// @func PVOID | DEMO_Deinit | Device deinitialization routine
//
// @parm DWORD | dwData | value returned from DEMO_Init call
//
// @rdesc Returns TRUE for success, FALSE for failure.
//
// -----------------------------------------------------------------------------
extern "C" BOOL DEMO_Deinit(DWORD dwData)
{
RETAILMSG(1,(TEXT("DEMO_DeInit!\r\n ")));
return TRUE;
}
// -----------------------------------------------------------------------------
//
// @doc WDEV_EXT
//
// @func PVOID | DEMO_Open | Device open routine
//
// @parm DWORD | dwData | Value returned from DEMO_Init call (ignored)
//
// @parm DWORD | dwAccess | Requested access (combination of GENERIC_READ
// and GENERIC_WRITE) (ignored)
//
// @parm DWORD | dwShareMode | Requested share mode (combination of
// FILE_SHARE_READ and FILE_SHARE_WRITE) (ignored)
//
// @rdesc Returns a DWORD which will be passed to Read, Write, etc or NULL if
// unable to open device.
//
// -----------------------------------------------------------------------------
extern "C" PDWORD DEMO_Open( DWORD dwData,
DWORD dwAccess,
DWORD dwShareMode)
{
RETAILMSG(1,(TEXT("DEMO_OPEN \r\ndwData=%d;AccessCode=%d \r\n"),dwData, dwAccess));
initial_DEMO();
return (PDWORD)TRUE;
//modify by mercury xu Mercury's 2008-04-04
}
// -----------------------------------------------------------------------------
//
// @doc WDEV_EXT
//
// @func BOOL | DEMO_Close | Device close routine
//
// @parm DWORD | dwOpenData | Value returned from DEMO_Open call
//
// @rdesc Returns TRUE for success, FALSE for failure
//
// -----------------------------------------------------------------------------
extern "C" BOOL DEMO_Close(PDWORD pdwData)
{
return(FALSE);
}
// -----------------------------------------------------------------------------
//
// @doc WDEV_EXT
//
// @func DWORD | DEMO_Read | Device read routine
//
// @parm DWORD | dwOpenData | Value returned from DEMO_Open call (ignored)
//
// @parm LPVOID | pBuf | Buffer to receive data (ignored)
//
// @parm DWORD | len | Maximum length to read (ignored)
//
// @rdesc Returns 0 always. DEMO_Read should never get called and does
// nothing. Required DEVICE.EXE function, but all data communication
// is handled by <f DEMO_IOControl>.
//
// -----------------------------------------------------------------------------
extern "C" DWORD DEMO_Read(DWORD dwData,
LPVOID pBuf,
DWORD Len)
{
return (FALSE);
}
// -----------------------------------------------------------------------------
//
// @doc WDEV_EXT
//
// @func DWORD | DEMO_Write | Device write routine
//
// @parm DWORD | dwOpenData | Value returned from DEMO_Open call (ignored)
//
// @parm LPCVOID | pBuf | Buffer containing data (ignored)
//
// @parm DWORD | len | Maximum length to write (ignored)
//
// @rdesc Returns 0 always. DEMO_Write should never get called and does
// nothing. Required DEVICE.EXE function, but all data communication
// is handled by <f DEMO_IOControl>.
//
// -----------------------------------------------------------------------------
extern "C" DWORD DEMO_Write(DWORD dwData,
LPCVOID pBuf,
DWORD Len)
{
unsigned short temp;
temp = *(unsigned short *) pBuf;
RETAILMSG(1,(TEXT("DEMO_write!\r\n ")));
return(TRUE);
}
// -----------------------------------------------------------------------------
//
// @doc WDEV_EXT
//
// @func DWORD | DEMO_Seek | Device seek routine
//
// @parm DWORD | dwOpenData | Value returned from DEMO_Open call (ignored)
//
// @parm long | pos | Position to seek to (relative to type) (ignored)
//
// @parm DWORD | type | FILE_BEGIN, FILE_CURRENT, or FILE_END (ignored)
//
// @rdesc Returns -1 always. DEMO_Seek should never get called and does
// nothing. Required DEVICE.EXE function, but all data communication
// is handled by <f DEMO_IOControl>.
//
// -----------------------------------------------------------------------------
extern "C" DWORD DEMO_Seek(DWORD dwData,
long pos,
DWORD type)
{
RETAILMSG(1,(TEXT("DEMO_Seek!\r\n ")));
return(TRUE);
//return((DWORD)DEMO_FM_Tune_DEMO());
}
// -----------------------------------------------------------------------------
//
// @doc WDEV_EXT
//
// @func void | DEMO_PowerUp | Device powerup routine
//
// @comm Called to restore device from suspend mode. Cannot call any
// routines aside from those in the dll in this call.
//
// -----------------------------------------------------------------------------
extern "C" VOID DEMO_PowerUp(VOID)
{
//DEMO_reset();
RETAILMSG(1,(TEXT("DEMO_PowerUp!\r\n ")));
// sleepGPIO(800);
}
// -----------------------------------------------------------------------------
//
// @doc WDEV_EXT
//
// @func void | DEMO_PowerDown | Device powerdown routine
//
// @comm Called to suspend device. Cannot call any routines aside from
// those in the dll in this call.
//
// -----------------------------------------------------------------------------
extern "C" VOID DEMO_PowerDown(VOID)
{
RETAILMSG(1,(TEXT("DEMO_PowerDown!\r\n ")));
}
// -----------------------------------------------------------------------------
//
// @doc WDEV_EXT
//
// @func BOOL | DEMO_IOControl | Device IO control routine
//
// @parm DWORD | dwOpenData | Value returned from DEMO_Open call
//
// @parm DWORD | dwCode |
// IO control code for the function to be performed. DEMO_IOControl only
// supports one IOCTL value (IOCTL_DEMO_MESSAGE)
//
// @parm PBYTE | pBufIn |
// Pointer to the input parameter structure (<t MMDRV_MESSAGE_PARAMS>).
//
// @parm DWORD | dwLenIn |
// Size in bytes of input parameter structure (sizeof(<t MMDRV_MESSAGE_PARAMS>)).
//
// @parm PBYTE | pBufOut | Pointer to the return value (DWORD).
//
// @parm DWORD | dwLenOut | Size of the return value variable (sizeof(DWORD)).
//
// @parm PDWORD | pdwActualOut | Unused
//
// @rdesc Returns TRUE for success, FALSE for failure
//
// @xref <t DEMOe Input Driver Messages> (WIDM_XXX) <nl>
// <t DEMOe Output Driver Messages> (WODM_XXX)
//
// -----------------------------------------------------------------------------
extern "C" BOOL DEMO_IOControl(PDWORD pdwOpenData,
DWORD dwCode,
PBYTE pBufIn,
DWORD dwLenIn,
PBYTE pBufOut,
DWORD dwLenOut,
PDWORD pdwActualOut)
{
RETAILMSG(1,(TEXT("DEMO\r\n pdwOpenData=%d;dwCode=%d\r\n"),pdwOpenData,dwCode));
return(FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -