📄 hcibcsp.cpp
字号:
dwSize = sizeof(dwData);
if ((RegQueryValueEx (hk, L"Drift", NULL, &dwType, (LPBYTE)&dwData, &dwSize) == ERROR_SUCCESS) &&
(dwType == REG_DWORD) && (dwSize == sizeof(dwData)) && dwData)
pParms->uiDriftFactor = dwData;
dwData = 0;
dwSize = sizeof(dwData);
if ((RegQueryValueEx (hk, L"ScoWriteLowNumPackets", NULL, &dwType, (LPBYTE)&dwData, &dwSize) == ERROR_SUCCESS) &&
(dwType == REG_DWORD) && (dwSize == sizeof(dwData)) && dwData)
pParms->iScoWriteLowNumPackets = dwData;
dwData = 0;
dwSize = sizeof(dwData);
if ((RegQueryValueEx (hk, L"ScoWriteNumPackets", NULL, &dwType, (LPBYTE)&dwData, &dwSize) == ERROR_SUCCESS) &&
(dwType == REG_DWORD) && (dwSize == sizeof(dwData)) && dwData)
pParms->iScoWriteNumPackets = dwData;
dwData = 0;
dwSize = sizeof(dwData);
if ((RegQueryValueEx (hk, L"ScoWritePacketSize", NULL, &dwType, (LPBYTE)&dwData, &dwSize) == ERROR_SUCCESS) &&
(dwType == REG_DWORD) && (dwSize == sizeof(dwData)) && dwData)
pParms->iScoWritePacketSize = dwData;
dwData = 0;
dwSize = sizeof(dwData);
if ((RegQueryValueEx (hk, L"ScoSampleSize", NULL, &dwType, (LPBYTE)&dwData, &dwSize) == ERROR_SUCCESS) &&
(dwType == REG_DWORD) && (dwSize == sizeof(dwData)) && dwData)
pParms->iScoSampleSize = dwData;
RegCloseKey (hk);
}
#if defined (DEBUG) || defined (_DEBUG)
pParms->iReadBufferHeader = DEBUG_READ_BUFFER_HEADER;
pParms->iReadBufferTrailer = DEBUG_READ_BUFFER_TRAILER;
pParms->iWriteBufferHeader = DEBUG_WRITE_BUFFER_HEADER;
pParms->iWriteBufferTrailer = DEBUG_WRITE_BUFFER_TRAILER;
#endif
return TRUE;
}
int HCI_StartHardware (void) {
IFDBG(DebugOut (DEBUG_HCI_INIT, L"[BCSP] HCI_StartHardware\n"));
RETAILMSG(1, (TEXT("[BCSP] HCI_StartHardware\n")));
if (hFile != INVALID_HANDLE_VALUE) {
IFDBG(DebugOut (DEBUG_HCI_INIT, L"[BCSP] HCI_StartHardware (already started)\n"));
RETAILMSG(1, (TEXT("[BCSP] HCI_StartHardware (already started)\n")));
return TRUE;
}
if (! gCallback) {
IFDBG(DebugOut (DEBUG_HCI_INIT, L"[BCSP] HCI_StartHardware (not registered)\n"));
RETAILMSG(1, (TEXT("[BCSP] HCI_StartHardware (not registered)\n")));
return FALSE;
}
return ERROR_SUCCESS == gCallback (DEVICE_UP, NULL);
}
int HCI_StopHardware (void) {
IFDBG(DebugOut (DEBUG_HCI_INIT, L"[BCSP] HCI_StopHardware\n"));
RETAILMSG(1, (TEXT("[BCSP] HCI_StopHardware\n")));
if (hFile == INVALID_HANDLE_VALUE) {
IFDBG(DebugOut (DEBUG_HCI_INIT, L"[BCSP] HCI_StopHardware (already stopped)\n"));
RETAILMSG(1, (TEXT("[BCSP] HCI_StopHardware (already started)\n")));
return TRUE;
}
if (! gCallback) {
IFDBG(DebugOut (DEBUG_HCI_INIT, L"[BCSP] HCI_StopHardware (not registered)\n"));
RETAILMSG(1, (TEXT("[BCSP] HCI_StopHardware (not registered)\n")));
return FALSE;
}
return ERROR_SUCCESS == gCallback (DEVICE_DOWN, NULL);
}
//#error this might never be called. Init the debug somewhere else?
int HCI_SetCallback (HCI_TransportCallback pfCallback) {
gCallback = pfCallback;
if (gCallback)
DebugInit();
else
DebugDeInit();
return ERROR_SUCCESS;
}
int HCI_OpenConnection (void) {
IFDBG(DebugOut (DEBUG_HCI_TRANSPORT, L"[BCSP] HCI_OpenConnection - Started\n"));
RETAILMSG(1, (TEXT("[BCSP] HCI_OpenConnection - Started\n")));
if (hFile != INVALID_HANDLE_VALUE) {
IFDBG(DebugOut (DEBUG_HCI_TRANSPORT, L"[BCSP] HCI_OpenConnection - already open, failing.\n"));
return FALSE;
}
WCHAR szComPortName[_MAX_PATH];
wcscpy (szComPortName, DEFAULT_COM_NAME);
// DWORD dwBaud = 38400;
DWORD dwBaud = 115200;
DWORD dwThreadPriority = DEFAULT_WORKER_THREAD_PRIORITY;
HKEY hk;
if (ERROR_SUCCESS == RegOpenKeyEx (HKEY_BASE, L"software\\microsoft\\bluetooth\\hci", 0, KEY_READ, &hk)) {
DWORD dwType;
DWORD dwSize = sizeof(szComPortName);
if ((ERROR_SUCCESS == RegQueryValueEx (hk, L"Name", NULL, &dwType, (LPBYTE)szComPortName, &dwSize)) &&
(dwType == REG_SZ) && (dwSize > 0) && (dwSize < _MAX_PATH))
;
else
wcscpy (szComPortName, DEFAULT_COM_NAME);
dwSize = sizeof(dwBaud);
if ((ERROR_SUCCESS == RegQueryValueEx (hk, L"baud", NULL, &dwType, (LPBYTE)&dwBaud, &dwSize)) &&
(dwType == REG_DWORD) && (dwSize == sizeof(dwBaud)))
;
else
// dwBaud = 38400;
dwBaud = 115200;
DWORD dwData = 0;
dwSize = sizeof(dwData);
if ((ERROR_SUCCESS == RegQueryValueEx (hk, L"Priority256", NULL, &dwType, (LPBYTE)&dwData, &dwSize)) &&
(dwType == REG_DWORD) && (dwSize == sizeof(dwData)))
dwThreadPriority = dwData;
RegCloseKey (hk);
}
IFDBG(DebugOut (DEBUG_HCI_TRANSPORT, L"[BCSP] Opening port %s (rate %d) for I/O with unit\n", szComPortName, dwBaud));
hFile = CreateFile(szComPortName,
GENERIC_READ | GENERIC_WRITE,
0, // comm devices must be opened w/exclusive-access
NULL, // no security attrs
OPEN_EXISTING, // comm devices must use OPEN_EXISTING
FILE_ATTRIBUTE_NORMAL, // overlapped I/O
NULL // hTemplate must be NULL for comm devices
);
if (hFile == INVALID_HANDLE_VALUE) {
IFDBG(DebugOut (DEBUG_ERROR, L"[BCSP] Failed CreateFile in BCSP HCI Interface. GetLastError = 0x%08x\n", GetLastError ()));
return FALSE;
}
if (! SetupComm (hFile, 4096, 4096)) {
CloseCommPort ();
IFDBG(DebugOut (DEBUG_ERROR, L"[BCSP] Failed SetupComm in BCSP HCI Interface. GetLastError = 0x%08x\n", GetLastError ()));
return FALSE;
}
// purge any information in the buffer
// if ( ! PurgeComm (hFile, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR )) {
// CloseCommPort ();
//
// IFDBG(DebugOut (DEBUG_ERROR, L"[BCSP] Failed PurgeComm in BCSP HCI Interface. GetLastError = 0x%08x\n", GetLastError ()));
// return FALSE;
// }
DCB dcb;
if (! GetCommState(hFile, &dcb)) {
CloseCommPort ();
IFDBG(DebugOut (DEBUG_ERROR, L"[BCSP] Failed GetCommState in BCSP HCI Interface. GetLastError = 0x%08x\n", GetLastError ()));
return FALSE;
}
dcb.BaudRate = dwBaud;
// dcb.fDtrControl = DTR_CONTROL_ENABLE;
// dcb.fRtsControl = RTS_CONTROL_ENABLE;
// for SEMCO module
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fAbortOnError = FALSE;
dcb.ByteSize =8;
dcb.fParity = TRUE;
dcb.Parity = EVENPARITY;
dcb.StopBits = ONESTOPBIT;
dcb.ErrorChar = -64;
if (! SetCommState(hFile, &dcb)) {
CloseCommPort ();
IFDBG(DebugOut (DEBUG_ERROR, L"[BCSP] Failed SetCommState in BCSP HCI Interface. GetLastError = 0x%08x\n", GetLastError ()));
return FALSE;
}
COMMTIMEOUTS CommTimeOuts;
CommTimeOuts.ReadIntervalTimeout = 1 ;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0 ;
CommTimeOuts.ReadTotalTimeoutConstant = 1000 ;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0 ;
CommTimeOuts.WriteTotalTimeoutConstant = 1000 ;
if (! SetCommTimeouts (hFile, &CommTimeOuts)) {
CloseCommPort ();
IFDBG(DebugOut (DEBUG_ERROR, L"[BCSP] Failed SetCommTimeouts in BCSP HCI Interface. GetLastError = 0x%08x\n", GetLastError ()));
return FALSE;
}
#if defined (BT_USE_CELOG)
if (ERROR_SUCCESS == RegOpenKeyEx (HKEY_BASE, L"software\\microsoft\\bluetooth\\debug", 0, KEY_READ, &hk)) {
DWORD dwType;
DWORD dw;
DWORD dwSize = sizeof(dw);
if ((ERROR_SUCCESS == RegQueryValueEx (hk, L"celog", NULL, &dwType, (LPBYTE)&dw, &dwSize)) &&
(dwType == REG_DWORD) && (dwSize == sizeof(dw)) && dw)
g_fCeLog = IsCeLogStatus (CELOGSTATUS_ENABLED_GENERAL);
RegCloseKey (hk);
}
if (g_fCeLog) {
#if defined (SDK_BUILD)
CELOGSDK_START ();
#endif
BTH_CELOG_START_DATA sd;
sd.eTransport = BCSP;
GetLocalTime (&sd.st);
wsprintf (sd.szDriverString, L"BCSP Driver v. 0x%08x on %s", HCI_INTERFACE_VERSION_1_1, szComPortName);
CELOGDATAFLAGGED(TRUE, CELID_RAW_UCHAR, &sd, sizeof(sd), 0, CELZONE_ALWAYSON, CELOG_FLAG_START);
}
#endif
g_fShutDown = FALSE;
ReinitGlobals ();
g_pWriteBuff = (unsigned char*) malloc (MAX_BUFFER_SIZE);
if (! g_pWriteBuff) {
CloseCommPort ();
IFDBG(DebugOut(DEBUG_HCI_TRANSPORT, L"[BCSP] HCI_OpenConnection failed: Error allocating write buffer.\n"));
return FALSE;
}
g_hCanTransmitPacket = CreateEvent (NULL, FALSE, FALSE, NULL);
g_hWriteThreadEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
g_hPacketReady = CreateEvent (NULL, FALSE, FALSE, NULL);
g_pfmdPacketDescr = svsutil_AllocFixedMemDescr (sizeof(SerialPacket), 10);
InitializeCriticalSection (&g_csBCSP);
InitializeCriticalSection (&g_csPackets);
g_hReadThread = CreateThread (NULL, 0, COMReadThread, NULL, 0, NULL);
g_hWriteThread = CreateThread (NULL, 0, BCSPWriteThread, NULL, 0, NULL);
CeSetThreadPriority(g_hReadThread, dwThreadPriority);
CeSetThreadPriority(g_hWriteThread, dwThreadPriority);
IFDBG(DebugOut(DEBUG_HCI_TRANSPORT, L"[BCSP] HCI_OpenConnection: Attempting BCSP link establishment.\n"));
if(!g_initCSR)
{
InitCSRBluetooth();
g_initCSR = TRUE;
}
if (! BCSPLinkEstablishment()) {
HCI_CloseConnection ();
IFDBG(DebugOut(DEBUG_HCI_TRANSPORT, L"[BCSP] HCI_OpenConnection failed: Could not complete BCSP link establishment.\n"));
return FALSE;
}
IFDBG(DebugOut(DEBUG_HCI_TRANSPORT, L"[BCSP] HCI_OpenConnection: BCSP link establishment complete.\n"));
IFDBG(DebugOut(DEBUG_HCI_TRANSPORT, L"[BCSP] HCI_OpenConnection: Successful.\n"));
RETAILMSG(1, (TEXT("[BCSP] HCI_OpenConnection: BCSP link establishment complete.\n")));
RETAILMSG(1, (TEXT("[BCSP] HCI_OpenConnection: Successful.\n")));
/* if(!g_initCSR)
{
InitCSRBluetooth();
// g_initCSR = TRUE;
}
*/
return TRUE;
}
void HCI_CloseConnection (void) {
if (g_fShutDown) {
IFDBG(DebugOut(DEBUG_HCI_TRANSPORT, L"[BCSP] HCI_CloseConnection: already in shutdown.\n"));
return;
}
IFDBG(DebugOut(DEBUG_HCI_TRANSPORT, L"[BCSP] HCI_CloseConnection: entered.\n"));
CloseCommPort ();
EnterCriticalSection (&g_csBCSP);
g_fShutDown = TRUE;
SetEvent (g_hCanTransmitPacket);
CloseHandle(g_hCanTransmitPacket);
SetEvent (g_hWriteThreadEvent);
CloseHandle(g_hWriteThreadEvent);
SetEvent (g_hPacketReady);
CloseHandle (g_hPacketReady);
if (g_pWriteBuff) {
free (g_pWriteBuff);
g_pWriteBuff = NULL;
}
while (g_pTransmitPackets) {
BCSPPacketListNode *pNext = g_pTransmitPackets->next;
delete g_pTransmitPackets;
g_pTransmitPackets = pNext;
}
while (g_pSCOTransmitPackets) {
BCSPPacketListNode *pNext = g_pSCOTransmitPackets->next;
delete g_pSCOTransmitPackets;
g_pSCOTransmitPackets = pNext;
}
LeaveCriticalSection (&g_csBCSP);
DeleteCriticalSection(&g_csBCSP);
if (g_hWriteThread) {
WaitForSingleObject (g_hWriteThread, INFINITE);
CloseHandle (g_hWriteThread);
}
if (g_hReadThread) {
WaitForSingleObject (g_hReadThread, INFINITE);
CloseHandle (g_hReadThread);
}
EnterCriticalSection (&g_csPackets);
svsutil_ReleaseFixedNonEmpty (g_pfmdPacketDescr);
g_pfmdPacketDescr = NULL;
g_pPackets = NULL;
LeaveCriticalSection (&g_csPackets);
DeleteCriticalSection(&g_csPackets);
ReinitGlobals ();
IFDBG(DebugOut(DEBUG_HCI_TRANSPORT, L"[BCSP] HCI_CloseConnection: success\n"));
}
int HCI_ReadPacket (HCI_TYPE *peType, BD_BUFFER *pBuff) {
IFDBG(DebugOut(DEBUG_HCI_TRANSPORT, L"[BCSP] HCI_ReadPacket\n"));
if(pBuff->cSize < PACKET_SIZE_R) {
IFDBG(DebugOut(DEBUG_ERROR, L"[BCSP] HCI_ReadPacket failed: passed in buffer is too small. ERROR\n"));
return FALSE;
}
// RETAILMSG(1, (TEXT("FUNC : HCI_ReadPacket\n")));
while (TRUE) { // loop through ack packets, link establishment packets,
// and other packets the client doesn't care about
IFDBG(DebugOut(DEBUG_HCI_TRANSPORT, L"[BCSP] In HCI_ReadPacket...\n"));
BCSPHeader header;
if (! ReadFromCOMPort(&header, pBuff->pBuffer))
break;
if (header.checksum != header.GetChecksum()) {
IFDBG(DebugOut(DEBUG_HCI_TRANSPORT, L"[BCSP] HCI_ReadPacket: packet checksum is invalid. Discarding.\n"));
continue;
}
if((header.protocolID == 1) && (header.protocolType == 0) && (header.payloadLength == 4)) {
const unsigned char syncPayload[] = { 0xDA, 0xDC, 0xED, 0xED };
const unsigned char confPayload[] = { 0xAD, 0xEF, 0xAC, 0xED };
if(0 == memcmp(syncPayload, pBuff->pBuffer, 4)) { // SYNC received so send SYNC-RESP
IFDBG(DebugOut(DEBUG_HCI_TRANSPORT, L"[BCSP] HCI_ReadPacket : got SYNC scheduling SYNC-RESP.\n"));
InterlockedIncrement ((LONG *)&g_iRxSyncs);
SetEvent(g_hWriteThreadEvent);
} else if(0 == memcmp(confPayload, pBuff->pBuffer, 4)) { // CONF received so send CONF-RESP
IFDBG(DebugOut(DEBUG_HCI_TRANSPORT, L"[BCSP] HCI_ReadPacket : got CONF scheduling CONF-RESP.\n"));
InterlockedIncrement ((LONG *)&g_iRxConfs);
SetEvent(g_hWriteThreadEvent);
} else
IFDBG(DebugOut(DEBUG_HCI_TRANSPORT, L"[BCSP] HCI_ReadPacket : got something strange, discarding...\n"));
continue;
}
if (g_fShutDown)
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -