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

📄 hciuart.cxx

📁 老外的一个开源项目
💻 CXX
📖 第 1 页 / 共 2 页
字号:
		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);
			IFDBG(DebugOut (DEBUG_HCI_INIT, L"BthGum:Failed to read COM port from registry, use default port %s", szComPortName));
		}

		if (wcscmp(szComPortName,DEFAULT_COM_NAME))
		{
			Ericsson = FALSE;
			dwStartBaud = 115200;
		}

		dwSize = sizeof(dwBaud);
		if ((ERROR_SUCCESS == RegQueryValueEx (hk, L"baud", NULL, &dwType, (LPBYTE)&dwBaud, &dwSize)) &&
			(dwType == REG_DWORD) && (dwSize == sizeof(dwBaud)))
			;
		else
		{
			dwBaud = dwStartBaud;
			IFDBG(DebugOut (DEBUG_HCI_INIT, L"BthGum:Failed to read baud rate from registry, use default baud rate %d", dwBaud));
		}

		RegCloseKey (hk);

		IFDBG(DebugOut (DEBUG_HCI_INIT, L"Opening port %s (rate %d) for I/O with unit\n", szComPortName, dwBaud));
	}

	if (!KernelIoControl(IOCTL_HAL_HARDWARE_CNFG, NULL, 
		0, &dwHardwareConfig, sizeof(DWORD), &dwBytesReturned))
		{
			IFDBG(DebugOut (DEBUG_HCI_INIT, L"IOCTL_HAL_HARDWARE_CNFG failed!\r\n"));
			return FALSE;
		}
	if (!(((dwHardwareConfig & GUMCFG_BT1) && (0 == wcscmp(szComPortName,DEFAULT_COM_NAME))) || 
		  ((dwHardwareConfig & GUMCFG_BT2) && (0 == wcscmp(szComPortName,ALT_COM_NAME)))))
		{
			IFDBG(DebugOut (DEBUG_HCI_INIT, L"Hardware configuration does not support this driver!\r\n"));
			return FALSE;
		}
	
	RETAILMSG(1, (L"Opening port %s (Startbaud %d Finalbaud %d) for Bluetooth unit\r\n", szComPortName, dwStartBaud, 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"BthGum:Failed CreateFile in UART HCI Interface. GetLastError = 0x%08x\n", GetLastError ()));
		CloseHandle (hFile);
		hFile = INVALID_HANDLE_VALUE;
		return FALSE;

    }

    if (! SetupComm (hFile, 20000, 20000)) 
	{
		IFDBG(DebugOut (DEBUG_ERROR, L"BthGum:Warn SetupComm in UART HCI Interface. GetLastError = 0x%08x\n", GetLastError ()));
		// ignore error ... not critical
    } 

    // purge any information in the buffer

    if ( ! PurgeComm (hFile, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR )) {
		IFDBG(DebugOut (DEBUG_ERROR, L"BthGum:Failed PurgeComm in UART HCI Interface. GetLastError = 0x%08x\n", GetLastError ()));
		CloseHandle (hFile);
		hFile = INVALID_HANDLE_VALUE;
		return FALSE;
    }

    DCB dcb;

	//COMMTIMEOUTS commTimeouts;
	//commTimeouts.ReadTotalTimeoutMultiplier = 1;
	//commTimeouts.ReadIntervalTimeout = 50;
	//commTimeouts.ReadTotalTimeoutConstant = 50;
	//commTimeouts.WriteTotalTimeoutMultiplier = 5;
	//commTimeouts.WriteTotalTimeoutConstant = 500;

	COMMTIMEOUTS commTimeouts;
	commTimeouts.ReadTotalTimeoutMultiplier = 1;
	commTimeouts.ReadIntervalTimeout = 0;
	commTimeouts.ReadTotalTimeoutConstant = 1000;
	commTimeouts.WriteTotalTimeoutMultiplier = 1;
	commTimeouts.WriteTotalTimeoutConstant = 1000;

	//COMMTIMEOUTS commTimeouts;
	//commTimeouts.ReadTotalTimeoutMultiplier = MAXDWORD;
	//commTimeouts.ReadIntervalTimeout = 0;
	//commTimeouts.ReadTotalTimeoutConstant = 1000;
	//commTimeouts.WriteTotalTimeoutMultiplier = 0;
	//commTimeouts.WriteTotalTimeoutConstant = 1000;



	if (! SetCommTimeouts (hFile, &commTimeouts)) {
		IFDBG(DebugOut (DEBUG_ERROR, L"BthGum:Failed SetCommTimeouts in UART HCI Interface. GetLastError = 0x%08x\n", GetLastError ()));
		CloseHandle (hFile);
		hFile = INVALID_HANDLE_VALUE;
		return FALSE;
    }

    if (! GetCommState (hFile, &dcb)) 
	{
		IFDBG(DebugOut (DEBUG_ERROR, L"BthGum:Failed GetCommState in UART HCI Interface. GetLastError = 0x%08x\n", GetLastError ()));
		CloseHandle (hFile);
		hFile = INVALID_HANDLE_VALUE;
		return FALSE;
    }

    dcb.BaudRate = dwStartBaud;
    dcb.fBinary = TRUE;
    dcb.fParity = FALSE;
    dcb.fOutxCtsFlow = TRUE;
    dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
    dcb.fOutX = FALSE;
    dcb.fInX = FALSE;
    dcb.fOutxDsrFlow = FALSE;    
    dcb.fDsrSensitivity = FALSE;
    dcb.fDtrControl = DTR_CONTROL_ENABLE;
    dcb.fTXContinueOnXoff = FALSE;
    dcb.fErrorChar = FALSE;
    dcb.fNull = FALSE;
    dcb.fAbortOnError = TRUE;
    dcb.ByteSize =8;
    dcb.Parity = NOPARITY;
    dcb.StopBits = ONESTOPBIT;

    if (! SetCommState(hFile, &dcb)) {
		IFDBG(DebugOut (DEBUG_ERROR, L"BthGum:Failed SetCommState in UART HCI Interface. GetLastError = 0x%08x\n", GetLastError ()));
		CloseHandle (hFile);
		hFile = INVALID_HANDLE_VALUE;
		return FALSE;
    }

	if (dwStartBaud != dwBaud)
	{
		if(!UART_SetBaudRate(hFile, dwBaud))
		{
			IFDBG(DebugOut (DEBUG_HCI_INIT, L"BthGum:HCI_OpenConnection-Raise baud rate %d fail\n", dwBaud));
			CloseHandle (hFile);
			hFile = INVALID_HANDLE_VALUE;
			return FALSE;
		}
		else
		{
			RETAILMSG(1,(L"Bluetooth baud rate changed!\r\n"));
		}
	}
	else
	{
		RETAILMSG(1,(L"No change in Bluetooth baud rate!\r\n"));
	}

	hWriteEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
	hReadEvent = CreateEvent (NULL, FALSE, FALSE, NULL);

	IFDBG(DebugOut (DEBUG_HCI_INIT, L"BthGum:HCI_OpenConnection - Successful\n"));

	return TRUE;
}

void HCI_CloseConnection (void) {
	IFDBG(DebugOut (DEBUG_HCI_INIT, L"BthGum:HCI_CloseConnection - Started\n"));

	if (hFile == INVALID_HANDLE_VALUE) {
		IFDBG(DebugOut (DEBUG_ERROR, L"BthGum:HCI_CloseConnection - not active\n"));
		return;
	}

	CloseHandle (hFile);
	CloseHandle (hWriteEvent);
	CloseHandle (hReadEvent);

	hFile = INVALID_HANDLE_VALUE;
	hWriteEvent = hReadEvent = NULL;

	IFDBG(DebugOut (DEBUG_HCI_INIT, L"BthGum:HCI_CloseConnection - Successful\n"));

	return;
}

static BOOL WriteCommPort (unsigned char *pBuffer, unsigned int cSize) {
	DWORD dwFilledSoFar = 0;
	while ((int)dwFilledSoFar < cSize) {
		DWORD dwWrit = 0;
		if ((! WriteFile (hFile, &(pBuffer[dwFilledSoFar]), cSize - dwFilledSoFar, &dwWrit, NULL)) &&
												(dwWrit == 0)) {

#if defined (DEBUG) || defined (_DEBUG) || defined (RETAILLOG)
			if (hFile != INVALID_HANDLE_VALUE)
				IFDBG(DebugOut (DEBUG_ERROR, L"BthGum:Error writing COM port: GetLastError = 0x%08x (%d)\n", GetLastError (), GetLastError ()));
#endif
			return FALSE;
		}
		dwFilledSoFar += dwWrit;
	}

	return TRUE;
}

static BOOL ReadCommPort (unsigned char *pBuffer, DWORD dwLen) {
	DWORD dwFilledSoFar = 0;
	while (dwFilledSoFar < dwLen) {
		OVERLAPPED o;
		memset (&o, 0, sizeof(o));
		o.hEvent = hReadEvent;

		DWORD dwRead = 0;
		if ((! ReadFile (hFile, &pBuffer[dwFilledSoFar], dwLen - dwFilledSoFar, &dwRead, NULL)) &&
			(dwRead == 0)) {
#if defined (DEBUG) || defined (_DEBUG) || defined (RETAILLONG)
			if (hFile != INVALID_HANDLE_VALUE)
				IFDBG(DebugOut (DEBUG_ERROR, L"BthGum:Error writing COM port: GetLastError = 0x%08x (%d)\n", GetLastError (), GetLastError ()));
#endif
			return FALSE;
		}
		dwFilledSoFar += dwRead;
	}

	return TRUE;
}

int HCI_WritePacket (HCI_TYPE eType, BD_BUFFER *pBuff) {
	IFDBG(DebugOut (DEBUG_HCI_TRANSPORT, L"BthGum:HCI_WritePacket type 0x%02x len %d\n", eType, BufferTotal (pBuff)));

	IFDBG(DumpBuff (DEBUG_HCI_DUMP, pBuff->pBuffer + pBuff->cStart, BufferTotal (pBuff)));

#if defined (DEBUG) || defined (_DEBUG)
	ASSERT (pBuff->cStart == DEBUG_WRITE_BUFFER_HEADER);
	ASSERT (pBuff->cSize - pBuff->cEnd >= DEBUG_WRITE_BUFFER_TRAILER);
#endif

	ASSERT (! (pBuff->cStart & 0x3));

	if (((int)BufferTotal (pBuff) > PACKET_SIZE_W) || (pBuff->cStart < 1)) {
		IFDBG(DebugOut (DEBUG_ERROR, L"BthGum:[UART] Packet too big (%d, should be <= %d), or no space for header!\n", BufferTotal (pBuff), PACKET_SIZE_W));
		return FALSE;
	}

	if (hFile == INVALID_HANDLE_VALUE) {
		DebugOut (DEBUG_ERROR, L"BthGum:HCI_WritePacket - not active\n");
		return FALSE;
	}

	pBuff->pBuffer[--pBuff->cStart] = (unsigned char)eType;

	if (! WriteCommPort (pBuff->pBuffer + pBuff->cStart, BufferTotal (pBuff)))
		return FALSE;

	IFDBG(DebugOut (DEBUG_HCI_TRANSPORT, L"BthGum:HCI_WritePacket : DONE type 0x%02x len %d\n", eType, BufferTotal (pBuff)));
	return TRUE;
}

int HCI_ReadPacket (HCI_TYPE *peType, BD_BUFFER *pBuff) {
	IFDBG(DebugOut (DEBUG_HCI_TRANSPORT, L"BthGum:HCI_ReadPacket\n"));
	if (hFile == INVALID_HANDLE_VALUE) {
		IFDBG(DebugOut (DEBUG_ERROR, L"BthGum:HCI_ReadPacket - not active\n"));
		return FALSE;
	}

	pBuff->cStart = 3;
	pBuff->cEnd = pBuff->cSize;

	if (BufferTotal (pBuff) < 257) {
		IFDBG(DebugOut (DEBUG_ERROR, L"BthGum:HCI_ReadPacket - failed buffer too small (%d bytes)\n", BufferTotal (pBuff)));
		return FALSE;
	}

	if (! ReadCommPort (pBuff->pBuffer + pBuff->cStart, 1))
		return FALSE;

	++pBuff->cStart;

	int dwPacketSize = 0;

	switch (pBuff->pBuffer[pBuff->cStart - 1]) {
	case 0x01:			// Command packet
		IFDBG(DebugOut (DEBUG_ERROR, L"BthGum:HCI_ReadPacket - unexpected packet type (command)\n"));
		break;

	case 0x02:			// ACL packet
		if (! ReadCommPort (pBuff->pBuffer + pBuff->cStart, 4))
			return FALSE;

		pBuff->cEnd = pBuff->cStart + 4 + (pBuff->pBuffer[pBuff->cStart + 2] | (pBuff->pBuffer[pBuff->cStart + 3] << 8));

		if (pBuff->cEnd > pBuff->cSize) {
			IFDBG(DebugOut (DEBUG_ERROR, L"BthGum:HCI_ReadPacket - failed: buffer too small\n"));
			return FALSE;
		}

		if (! ReadCommPort (pBuff->pBuffer + pBuff->cStart + 4, BufferTotal (pBuff) - 4))
			return FALSE;

		*peType = DATA_PACKET_ACL;

		IFDBG(DebugOut (DEBUG_HCI_DUMP, L"BthGum:HCI_ReadPacket: ACL\n"));
		IFDBG(DumpBuff (DEBUG_HCI_DUMP, pBuff->pBuffer + pBuff->cStart, BufferTotal (pBuff)));
		return TRUE;

	case 0x03:			// SCO packet
		if (! ReadCommPort (pBuff->pBuffer + pBuff->cStart, 3))
			return FALSE;

		pBuff->cEnd = pBuff->cStart + 3 + pBuff->pBuffer[pBuff->cStart + 2];

		if (pBuff->cEnd > pBuff->cSize) {
			IFDBG(DebugOut (DEBUG_ERROR, L"BthGum:HCI_ReadPacket - failed: buffer too small\n"));
			return FALSE;
		}

		if (! ReadCommPort (pBuff->pBuffer + pBuff->cStart + 3, BufferTotal (pBuff) - 3))
			return FALSE;

		*peType = DATA_PACKET_SCO;

		IFDBG(DebugOut (DEBUG_HCI_DUMP, L"BthGum:HCI_ReadPacket: SCO\n"));
		IFDBG(DumpBuff (DEBUG_HCI_DUMP, pBuff->pBuffer + pBuff->cStart, BufferTotal (pBuff)));
		return TRUE;

	case 0x04:			// HCI Event
		if (! ReadCommPort (pBuff->pBuffer + pBuff->cStart, 2))
			return FALSE;

		pBuff->cEnd = pBuff->cStart + 2 + pBuff->pBuffer[pBuff->cStart + 1];

		if (pBuff->cEnd > pBuff->cSize) {
			IFDBG(DebugOut (DEBUG_ERROR, L"BthGum:HCI_ReadPacket - failed: buffer too small\n"));
			return FALSE;
		}

		if (! ReadCommPort (pBuff->pBuffer + pBuff->cStart + 2, BufferTotal (pBuff) - 2))
			return FALSE;

		*peType = EVENT_PACKET;

		IFDBG(DebugOut (DEBUG_HCI_DUMP, L"BthGum:HCI_ReadPacket: Event\n"));
		IFDBG(DumpBuff (DEBUG_HCI_DUMP, pBuff->pBuffer + pBuff->cStart, BufferTotal (pBuff)));
		return TRUE;
	}

	IFDBG(DebugOut (DEBUG_ERROR, L"BthGum:HCI_ReadPacket - unknown packet type\n"));

#if defined (DEBUG) || defined (_DEBUG)
	IFDBG(DebugOut (DEBUG_ERROR, L"BthGum:Dumping the failing buffer...\n"));
	unsigned char buff[128];
	buff[0] = pBuff->pBuffer[pBuff->cStart - 1];
	int buff_size = 128;
	int buff_offset = 1;

	while (buff_offset < buff_size) {

		DWORD dwRead = 0;
		if ((! ReadFile (hFile, &buff[buff_offset], buff_size - buff_offset, &dwRead, NULL)) &&
			(dwRead == 0)) {
			if (hFile != INVALID_HANDLE_VALUE)
				IFDBG(DebugOut (DEBUG_ERROR, L"BthGum:Error writing COM port: GetLastError = 0x%08x (%d)\n", GetLastError (), GetLastError ()));
			break;
		}
		if (dwRead == 0)
			break;

		buff_offset += dwRead;
	}

	IFDBG(DumpBuff (DEBUG_ERROR, buff, buff_offset));
#endif

	return FALSE;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -