⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hcibcsp.cpp

📁 三星2440原版bsp
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		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 + -