?? serialcsr.cpp
字號:
{
if(gpfnCOM_Seek)
lResult = gpfnCOM_Seek(pHead, Position, Type);
}
return lResult;
}
/////////////////////////////////////////////////////////////////////
// COM_PowerUp Wrapper
//
// The CSR implementation of this function is a simple passthrough
//
// Powerup is flagged to ensure PS update is performed on next
// access.
//
BOOL
WINAPI
CSR_PowerUp(HANDLE pContext)
{
BOOL bResult = NULL;
HANDLE hPort = NULL;
RETAILMSG(SC_DBG,(TEXT("CSR_PowerUp:enter !!!!\r\n")));
if(ghLibInst)
{
if(gpfnCOM_PowerUp)
bResult = gpfnCOM_PowerUp(pContext);
}
RETAILMSG(SC_DBG,(TEXT("CSR_PowerUp:Finish")));
return bResult;
}
/////////////////////////////////////////////////////////////////////
// COM_PowerDown Wrapper
//
// The CSR implementation of this function is a simple passthrough
//
// PowerDown is flagged to ensure PS update is performed on next
// access. Even though
//
BOOL
WINAPI
CSR_PowerDown(HANDLE pContext)
{
BOOL bResult = NULL;
RETAILMSG(SC_DBG,(TEXT("CSR_PowerDown:enter\r\n")));
if(ghLibInst)
{
if(gpfnCOM_PowerDown)
bResult = gpfnCOM_PowerDown(pContext);
}
BTEnable(FALSE);
RETAILMSG(SC_DBG,(TEXT("CSR_PowerDown:leave\r\n")));
return bResult;
}
/////////////////////////////////////////////////////////////////////
// COM_IOControl Wrapper
//
// The CSR implementation of this function is a simple passthrough
//
BOOL
WINAPI
CSR_IOControl(DWORD dwOpenData, DWORD dwCode, PBYTE pBufIn,
DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut,
PDWORD pdwActualOut)
{
BOOL bResult = FALSE;
PHW_OPEN_INFO pOpenData = (PHW_OPEN_INFO)dwOpenData;
pSkey.pSerialHead = (PHW_INDEP_INFO)pOpenData->pSerialHead;
RETAILMSG(SC_DBG,(TEXT("CSR_IOControl:enter\r\n")));
switch ( dwCode )
{
case IOCTL_BT_TESTMOD:
{
bTestMode = TRUE;
BTEnable(TRUE);
UpdatePersistentStore(hBTTest);
Sleep(100);
UpdatePersistentStore(hBTTest);
SetTestModeCMD(hBTTest);
bResult = TRUE;
}
break;
case IOCTL_POWER_CAPABILITIES:
if (pBufOut && dwLenOut >= sizeof (POWER_CAPABILITIES) && pdwActualOut)
{
PPOWER_CAPABILITIES PowerCaps = (PPOWER_CAPABILITIES)pBufOut;
memset(PowerCaps, 0, sizeof (*PowerCaps));
PowerCaps->DeviceDx = 0x11; //support D0 and D4
*pdwActualOut = sizeof (*PowerCaps);
bResult = TRUE;
}
break;
case IOCTL_POWER_SET :
{
WCHAR state[1024] = {0};
LPWSTR pState = &state[0];
DWORD dwBufChars = (sizeof(state) / sizeof(state[0]));
DWORD dwStateFlags = 0;
DWORD dwErr;
CEDEVICE_POWER_STATE NewDx = *(PCEDEVICE_POWER_STATE)pBufOut;
RETAILMSG(1, (TEXT("CSR: IOCTL_POWER_SET NewDx=%d\r\n"), NewDx));
dwErr = GetSystemPowerState(pState, dwBufChars, &dwStateFlags);
if (ERROR_SUCCESS != dwErr)
{
RETAILMSG(TRUE,(TEXT("CSR: GetSystemPowerState:ERROR:%d\r\n"), dwErr));
}
else
{
RETAILMSG(SC_DBG,(TEXT("CSR: System Power state is '%s', flags 0x%08x\r\n"), state, dwStateFlags));
}
switch(NewDx)
{
case D0: //On, backlightOff, ScreenOff, Unattended
//case D1: //None
//case D2: //Resuming, UserIdle
//To-Do: Must check why is "resuming" state after suspend!!!
RETAILMSG(SC_DBG,(TEXT("CSR: IOCTL_POWER_SET--D0\r\n")));
BTEnable(TRUE);
if(ghLibInst)
{
if(gpfnCOM_PowerUp)
pSkey.bBTPowerControl = gpfnCOM_PowerUp(pSkey.pSerialHead);
}
RETAILMSG(SC_DBG,(TEXT("CSR: bBTPowerControl_gpfnCOM_PowerUp:%d\r\n"), pSkey.bBTPowerControl));
SetEvent(pSkey.PSKeyEvent);
break;
default: //D3: Suspend
//D4: ColdReboot, Reboot, ShutDown,
RETAILMSG(SC_DBG,(TEXT("CSR: IOCTL_POWER_SET--D4\r\n")));
if(ghLibInst)
{
if(gpfnCOM_PowerDown)
pSkey.bBTPowerControl = gpfnCOM_PowerDown(pSkey.pSerialHead);
}
RETAILMSG(SC_DBG,(TEXT("CSR: bBTPowerControl_gpfnCOM_PowerDown:%d\r\n"), pSkey.bBTPowerControl));
break;
}
}
bResult = TRUE;
break;
default:
RETAILMSG(SC_DBG,(TEXT("CSR: IOCTL Default\r\n")));
if(ghLibInst)
{
if(gpfnCOM_IOControl)
bResult = gpfnCOM_IOControl(dwOpenData, dwCode, pBufIn, dwLenIn, pBufOut, dwLenOut, pdwActualOut);
}
break;
}
RETAILMSG(SC_DBG,(TEXT("CSR: CSR_IOControl :leave:bResult:%d\r\n"), bResult));
return bResult;
}
/////////////////////////////////////////////////////////////////////
// SerialGetDroppedByteNumber Wrapper
//
// The CSR implementation of this function is a simple passthrough
//
//SERIALCSR_API ULONG SerialGetDroppedByteNumber(HANDLE pHead)
ULONG SerialGetDroppedByteNumber(HANDLE pHead)
{
ULONG lResult = NULL;
if(ghLibInst)
{
if(gpfnSerialGetDroppedByteNumber)
lResult = gpfnSerialGetDroppedByteNumber(pHead);
}
return lResult;
}
/////////////////////////////////////////////////////////////////////
// UpdatePersistentStore
//
// Sets DCB and updates persistent store on chip
//
// Check that this does not interfere with any previous DCB settings
//
BOOL UpdatePersistentStore(HANDLE hPort)
{
BOOL bRet = FALSE;
BOOL bRestoreSettings = FALSE;
DWORD* dwLen = 0;
DCB dcbOrigConfig;
COMMTIMEOUTS ctoTimeouts;
SERIAL_QUEUE_SIZE sqsQueue;
RETAILMSG(SC_DBG,(TEXT("UpdatePersistentStore:enter\r\n")));
// Store current DCB settings
memset(&dcbOrigConfig, 0, sizeof (dcbOrigConfig));
dcbOrigConfig.DCBlength = sizeof(DCB);
bRestoreSettings = CSR_IOControl((DWORD)hPort, IOCTL_SERIAL_GET_DCB, 0, 0, (unsigned char*)&dcbOrigConfig, sizeof(dcbOrigConfig), dwLen);
// *** WARNING - IOCTL_SERIAL_GET_DCB fails with Widcomm bluetooth driver. No fix completed as this is for MS + out of time
// Setup DCB
DCB dcbConfig;
memset(&dcbConfig, 0, sizeof (dcbConfig));
dcbConfig.DCBlength = sizeof(DCB);
dcbConfig.BaudRate = DEFAULTBAUD;
dcbConfig.Parity = EVENPARITY;
dcbConfig.ByteSize = 8;
dcbConfig.StopBits = ONESTOPBIT;
if(!CSR_IOControl((DWORD)hPort, IOCTL_SERIAL_SET_DCB, (PBYTE)&dcbConfig, sizeof(dcbConfig), 0, 0, 0))
return FALSE;
// Setup the com port timeouts
ctoTimeouts.ReadIntervalTimeout = MAXDWORD;
ctoTimeouts.ReadTotalTimeoutConstant = 0;
ctoTimeouts.ReadTotalTimeoutMultiplier = 0;
ctoTimeouts.WriteTotalTimeoutConstant = 0;
ctoTimeouts.WriteTotalTimeoutMultiplier = 0;
if(!CSR_IOControl((DWORD)hPort, IOCTL_SERIAL_SET_TIMEOUTS, (PBYTE)&ctoTimeouts, sizeof(ctoTimeouts), 0, 0, 0))
return FALSE;
// Queues
sqsQueue.InSize = 16;
sqsQueue.OutSize = 16;
if(!CSR_IOControl((DWORD)hPort, IOCTL_SERIAL_SET_QUEUE_SIZE, (PBYTE)&sqsQueue, sizeof(sqsQueue), 0, 0, 0))
return FALSE;
// Call uBCSP update routine
if(hPort)
bRet = PSConfig(hPort);
// Reapply stored settings
if(bRestoreSettings)
CSR_IOControl((DWORD)hPort, IOCTL_SERIAL_SET_DCB, (unsigned char*)&dcbOrigConfig, sizeof(dcbOrigConfig), 0, 0, 0);
RETAILMSG(SC_DBG,(TEXT("UpdatePersistentStore:leave\r\n")));
return bRet;
}
PVOID VirtualAllocCopyPhysical(unsigned size, char *str, PVOID pPhysicalAddress)
{
PVOID ptr;
unsigned offset;
offset = (unsigned)pPhysicalAddress & ALIGNMENT_MASK;
size +=offset ? PAGE_SIZE : 0;
ptr = VirtualAlloc(0, size, MEM_RESERVE, PAGE_NOACCESS);
if (ptr == NULL)
{
RETAILMSG(TRUE,(TEXT("VirtualAllocCopyPhysical failed! %s : size=0x%x,\r\n"),str,size));
return(0);
}
if (!VirtualCopy((PVOID)ptr, (PVOID)(((unsigned)pPhysicalAddress - offset) >> 8), size, PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
{
RETAILMSG(TRUE,(TEXT("VirtualCopyCopyPhysical failed! %s : addr=0x%x, offset=0x%x\r\n"),str,(unsigned)pPhysicalAddress,offset));
return(0);
}
return((PVOID)((PBYTE)ptr+offset));
}
static DWORD PSKeyUpdate(PPSKEY_UPDATE _pSkey)
{
DWORD we;
HANDLE hPort = NULL;
RETAILMSG(SC_DBG, (TEXT("PSKeyUpdate:enter\r\n")));
if (!_pSkey)
{
RETAILMSG(1, (TEXT("pskey invalid\r\n")));
return ERROR_INVALID_PARAMETER;
}
RETAILMSG(1, (TEXT("pskey valid\r\n")));
while (1)
{
__try {
RETAILMSG(1, (TEXT("before PSKeyUpdate Start\r\n")));
we = WaitForSingleObject(_pSkey->PSKeyEvent, INFINITE);
RETAILMSG(1, (TEXT("PSKeyUpdate Start\r\n")));
// Update persistent store
if(ghSerialHead && gbUpdatePS)
{
//evan_note--->
if(gpfnCOM_Open)
{
// Reset update flag
gbUpdatePS = FALSE;
// Get port handle
hPort = gpfnCOM_Open(ghSerialHead, GENERIC_READ | GENERIC_WRITE, CREATE_NEW);
UpdatePersistentStore(hPort);
gpfnCOM_Close((DWORD)hPort);
}
//<----
}
} _except(EXCEPTION_EXECUTE_HANDLER) {
RETAILMSG(SC_DBG,(TEXT("!!! PSKey EXCEPTION: 0x%X !!!\r\n"), GetExceptionCode() ));
RETAILMSG(1,(TEXT("!!! PSKey EXCEPTION: !!!\r\n") ));
}
RETAILMSG(1,(TEXT("!!! PSKey EXCEPTION: !!!\r\n") ));
}
}
BOOL SetTestModeCMD(HANDLE hPort)
{
BOOL bRet = FALSE;
BOOL bRestoreSettings = FALSE;
DWORD* dwLen = 0;
DCB dcbOrigConfig;
COMMTIMEOUTS ctoTimeouts;
SERIAL_QUEUE_SIZE sqsQueue;
RETAILMSG(SC_DBG,(TEXT("SetTestModeCMD Start\r\n")));
// Store current DCB settings
memset(&dcbOrigConfig, 0, sizeof (dcbOrigConfig));
dcbOrigConfig.DCBlength = sizeof(DCB);
bRestoreSettings = CSR_IOControl((DWORD)hPort, IOCTL_SERIAL_GET_DCB, 0, 0, (unsigned char*)&dcbOrigConfig, sizeof(dcbOrigConfig), dwLen);
// *** WARNING - IOCTL_SERIAL_GET_DCB fails with Widcomm bluetooth driver. No fix completed as this is for MS + out of time
// Setup DCB
DCB dcbConfig;
memset(&dcbConfig, 0, sizeof (dcbConfig));
dcbConfig.DCBlength = sizeof(DCB);
dcbConfig.BaudRate = DEFAULTBAUD;
dcbConfig.Parity = EVENPARITY;
dcbConfig.ByteSize = 8;
dcbConfig.StopBits = ONESTOPBIT;
if(!CSR_IOControl((DWORD)hPort, IOCTL_SERIAL_SET_DCB, (PBYTE)&dcbConfig, sizeof(dcbConfig), 0, 0, 0))
return FALSE;
// Setup the com port timeouts
ctoTimeouts.ReadIntervalTimeout = MAXDWORD;
ctoTimeouts.ReadTotalTimeoutConstant = 0;
ctoTimeouts.ReadTotalTimeoutMultiplier = 0;
ctoTimeouts.WriteTotalTimeoutConstant = 0;
ctoTimeouts.WriteTotalTimeoutMultiplier = 0;
if(!CSR_IOControl((DWORD)hPort, IOCTL_SERIAL_SET_TIMEOUTS, (PBYTE)&ctoTimeouts, sizeof(ctoTimeouts), 0, 0, 0))
return FALSE;
// Queues
sqsQueue.InSize = 16;
sqsQueue.OutSize = 16;
if(!CSR_IOControl((DWORD)hPort, IOCTL_SERIAL_SET_QUEUE_SIZE, (PBYTE)&sqsQueue, sizeof(sqsQueue), 0, 0, 0))
return FALSE;
//Jonathan_test start
if(hPort)
bRet = TESTMode(hPort);
//Jonathan_test end
// Reapply stored settings
if(bRestoreSettings)
CSR_IOControl((DWORD)hPort, IOCTL_SERIAL_SET_DCB, (unsigned char*)&dcbOrigConfig, sizeof(dcbOrigConfig), 0, 0, 0);
RETAILMSG(1,(TEXT("SetTestModeCMD Finish\r\n")));
return bRet;
}
BOOL BTEnable(BOOL bIsOn)
{
if (bIsOn)
{
//b s2440IOP->GPCDAT &= ~(0x1<<9); //Set GPC9/BT_PWR_EN as 0 for pown on
//b s2440IOP->GPCDN |= (0x1<<9); //the pull up function is disabled
//b s2440IOP->GPCCON &= ~(0x3<<18);
//b s2440IOP->GPCCON |= (0x1<<18); //Set Output
s2440IOP->GPBDAT &= ~(0x1<<2); //Set GPB2 as 0 for pown on,LOW ENABLE
s2440IOP->GPBDN |= (0x1<<2); //the pull up function is disabled
s2440IOP->GPBCON &= ~(0x3<<4);
s2440IOP->GPBCON |= (0x1<<4); //Set Output
//Sleep(50);
//b s2440IOP->GPGDAT |= (0x1<<5); //Set GPG5/BT_RESET as 1 for reset BT
//b s2440IOP->GPGDN |= (0x1<<5);
//b s2440IOP->GPGCON &= ~(0x3<<10);
//b s2440IOP->GPGCON |= (0x1<<10);
s2440IOP->GPDDAT |= (0x1<<0); //Set GPD0/BT_RESET as 1 for reset BT
s2440IOP->GPDDN |= (0x1<<0);
s2440IOP->GPDCON &= ~(0x3<<0);
s2440IOP->GPDCON |= (0x1<<0);
Sleep(100);
gbBTPower = TRUE;
ShowIOPort();
}
else
{
s2440IOP->GPCDAT &= ~(0x1<<9);
s2440IOP->GPCDN |= (0x1<<9);
s2440IOP->GPCCON &= ~(0x3<<18);
s2440IOP->GPCCON |= (0x1<<18);
s2440IOP->GPGDAT &= ~(0x1<<5);
s2440IOP->GPGDN |= (0x1<<5);
s2440IOP->GPGCON &= ~(0x3<<10);
s2440IOP->GPGCON |= (0x1<<10);
gbBTPower = FALSE;
ShowIOPort();
Sleep(100);
}
return TRUE;
}
void ShowIOPort(void)
{
RETAILMSG(SC_DBG,(TEXT("gbBTPower=%x\r\n"),gbBTPower));
RETAILMSG(SC_DBG,(TEXT("gpBdat=%x \r\n"),s2440IOP->GPBDAT));
RETAILMSG(SC_DBG,(TEXT("gpBup=%x \r\n"),s2440IOP->GPBDN));
RETAILMSG(SC_DBG,(TEXT("gpBcon=%x \r\n"),s2440IOP->GPBCON));
RETAILMSG(SC_DBG,(TEXT("gpDdat=%x \r\n"),s2440IOP->GPDDAT));
RETAILMSG(SC_DBG,(TEXT("gpDup=%x \r\n"),s2440IOP->GPDDN));
RETAILMSG(SC_DBG,(TEXT("gpDcon=%x \r\n"),s2440IOP->GPDCON));
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -