亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? hci_bcsp.c

?? 嵌入式Linux的藍牙模塊驅(qū)動
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*    BlueCore Serial Protocol (BCSP) for Linux Bluetooth stack (BlueZ).   Copyright 2002 by Fabrizio Gennari <fabrizio.gennari@philips.com>   Based on       hci_h4.c  by Maxim Krasnyansky <maxk@qualcomm.com>       ABCSP     by Carl Orsborn <cjo@csr.com>   This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License version 2 as   published by the Free Software Foundation;   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.   IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN    ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,    COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS    SOFTWARE IS DISCLAIMED.*//* * $Id: hci_bcsp.c,v 1.2 2002/09/26 05:05:14 maxk Exp $ */#define VERSION "0.1"#include <linux/config.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/sched.h>#include <linux/types.h>#include <linux/fcntl.h>#include <linux/interrupt.h>#include <linux/ptrace.h>#include <linux/poll.h>#include <linux/slab.h>#include <linux/tty.h>#include <linux/errno.h>#include <linux/string.h>#include <linux/signal.h>#include <linux/ioctl.h>#include <linux/skbuff.h>#include <net/bluetooth/bluetooth.h>#include <net/bluetooth/hci_core.h>#include "hci_uart.h"#include "hci_bcsp.h"#ifndef CONFIG_BT_HCIUART_DEBUG#undef  BT_DBG#define BT_DBG( A... )#undef  BT_DMP#define BT_DMP( A... )#endif/* ---- BCSP CRC calculation ---- *//* Table for calculating CRC for polynomial 0x1021, LSB processed first,initial value 0xffff, bits shifted in reverse order. */static const u16 crc_table[] = {	0x0000, 0x1081, 0x2102, 0x3183,	0x4204, 0x5285, 0x6306, 0x7387,	0x8408, 0x9489, 0xa50a, 0xb58b,	0xc60c, 0xd68d, 0xe70e, 0xf78f};/* Initialise the crc calculator */#define BCSP_CRC_INIT(x) x = 0xffff/*   Update crc with next data byte   Implementation note        The data byte is treated as two nibbles.  The crc is generated        in reverse, i.e., bits are fed into the register from the top.*/static void bcsp_crc_update(u16 *crc, u8 d){	u16 reg = *crc;	reg = (reg >> 4) ^ crc_table[(reg ^ d) & 0x000f];	reg = (reg >> 4) ^ crc_table[(reg ^ (d >> 4)) & 0x000f];	*crc = reg;}/*   Get reverse of generated crc   Implementation note        The crc generator (bcsp_crc_init() and bcsp_crc_update())        creates a reversed crc, so it needs to be swapped back before        being passed on.*/static u16 bcsp_crc_reverse(u16 crc){	u16 b, rev;	for (b = 0, rev = 0; b < 16; b++) {		rev = rev << 1;		rev |= (crc & 1);		crc = crc >> 1;	}	return (rev);}/* ---- BCSP core ---- */static void bcsp_slip_msgdelim(struct sk_buff *skb){	const char pkt_delim = 0xc0;	memcpy(skb_put(skb, 1), &pkt_delim, 1);}static void bcsp_slip_one_byte(struct sk_buff *skb, u8 c){	const char esc_c0[2] = { 0xdb, 0xdc };	const char esc_db[2] = { 0xdb, 0xdd };	switch (c) {	case 0xc0:		memcpy(skb_put(skb, 2), &esc_c0, 2);		break;	case 0xdb:		memcpy(skb_put(skb, 2), &esc_db, 2);		break;	default:		memcpy(skb_put(skb, 1), &c, 1);	}}static int bcsp_enqueue(struct hci_uart *hu, struct sk_buff *skb){	struct bcsp_struct *bcsp = hu->priv;	if (skb->len > 0xFFF) {		BT_ERR("Packet too long");		kfree_skb(skb);		return 0;	}	switch (skb->pkt_type) {	case HCI_ACLDATA_PKT:	case HCI_COMMAND_PKT:		skb_queue_tail(&bcsp->rel, skb);		break;	case HCI_SCODATA_PKT:		skb_queue_tail(&bcsp->unrel, skb);		break;			default:		BT_ERR("Unknown packet type");		kfree_skb(skb);		break;	}	return 0;}static struct sk_buff *bcsp_prepare_pkt(struct bcsp_struct *bcsp, u8 *data,		int len, int pkt_type){	struct sk_buff *nskb;	u8  hdr[4], chan;	int rel, i;#ifdef CONFIG_BT_HCIUART_BCSP_TXCRC	u16 BCSP_CRC_INIT(bcsp_txmsg_crc);#endif	switch (pkt_type) {	case HCI_ACLDATA_PKT:		chan = 6;	/* BCSP ACL channel */		rel = 1;	/* reliable channel */		break;	case HCI_COMMAND_PKT:		chan = 5;	/* BCSP cmd/evt channel */		rel = 1;	/* reliable channel */		break;	case HCI_SCODATA_PKT:		chan = 7;	/* BCSP SCO channel */		rel = 0;	/* unreliable channel */		break;	case BCSP_LE_PKT:		chan = 1;	/* BCSP LE channel */		rel = 0;	/* unreliable channel */		break;	case BCSP_ACK_PKT:		chan = 0;	/* BCSP internal channel */		rel = 0;	/* unreliable channel */		break;	default:		BT_ERR("Unknown packet type");		return NULL;	}	/* Max len of packet: (original len +4(bcsp hdr) +2(crc))*2	   (because bytes 0xc0 and 0xdb are escaped, worst case is	   when the packet is all made of 0xc0 and 0xdb :) )	   + 2 (0xc0 delimiters at start and end). */	nskb = alloc_skb((len + 6) * 2 + 2, GFP_ATOMIC);	if (!nskb)		return NULL;	nskb->pkt_type = pkt_type;	bcsp_slip_msgdelim(nskb);	hdr[0] = bcsp->rxseq_txack << 3;	bcsp->txack_req = 0;	BT_DBG("We request packet no %u to card", bcsp->rxseq_txack);	if (rel) {		hdr[0] |= 0x80 + bcsp->msgq_txseq;		BT_DBG("Sending packet with seqno %u", bcsp->msgq_txseq);		bcsp->msgq_txseq = ++(bcsp->msgq_txseq) & 0x07;	}#ifdef  CONFIG_BT_HCIUART_BCSP_TXCRC	hdr[0] |= 0x40;#endif	hdr[1]  = (len << 4) & 0xFF;	hdr[1] |= chan;	hdr[2]  = len >> 4;	hdr[3]  = ~(hdr[0] + hdr[1] + hdr[2]);	/* Put BCSP header */	for (i = 0; i < 4; i++) {		bcsp_slip_one_byte(nskb, hdr[i]);#ifdef  CONFIG_BT_HCIUART_BCSP_TXCRC		bcsp_crc_update(&bcsp_txmsg_crc, hdr[i]);#endif	}	/* Put payload */	for (i = 0; i < len; i++) {		bcsp_slip_one_byte(nskb, data[i]);#ifdef  CONFIG_BT_HCIUART_BCSP_TXCRC		bcsp_crc_update(&bcsp_txmsg_crc, data[i]);#endif	}#ifdef CONFIG_BT_HCIUART_BCSP_TXCRC	/* Put CRC */	bcsp_txmsg_crc = bcsp_crc_reverse(bcsp_txmsg_crc);	bcsp_slip_one_byte(nskb, (u8) ((bcsp_txmsg_crc >> 8) & 0x00ff));	bcsp_slip_one_byte(nskb, (u8) (bcsp_txmsg_crc & 0x00ff));#endif	bcsp_slip_msgdelim(nskb);	return nskb;}/* This is a rewrite of pkt_avail in ABCSP */static struct sk_buff *bcsp_dequeue(struct hci_uart *hu){	struct bcsp_struct *bcsp = (struct bcsp_struct *) hu->priv;	unsigned long flags;	struct sk_buff *skb;		/* First of all, check for unreliable messages in the queue,	   since they have priority */	if ((skb = skb_dequeue(&bcsp->unrel)) != NULL) {		struct sk_buff *nskb = bcsp_prepare_pkt(bcsp, skb->data, skb->len, skb->pkt_type);		if (nskb) {			kfree_skb(skb);			return nskb;		} else {			skb_queue_head(&bcsp->unrel, skb);			BT_ERR("Could not dequeue pkt because alloc_skb failed");		}	}	/* Now, try to send a reliable pkt. We can only send a	   reliable packet if the number of packets sent but not yet ack'ed	   is < than the winsize */	spin_lock_irqsave(&bcsp->unack.lock, flags);	if (bcsp->unack.qlen < BCSP_TXWINSIZE && (skb = skb_dequeue(&bcsp->rel)) != NULL) {		struct sk_buff *nskb = bcsp_prepare_pkt(bcsp, skb->data, skb->len, skb->pkt_type);		if (nskb) {			__skb_queue_tail(&bcsp->unack, skb);			mod_timer(&bcsp->tbcsp, jiffies + HZ / 4);			spin_unlock_irqrestore(&bcsp->unack.lock, flags);			return nskb;		} else {			skb_queue_head(&bcsp->rel, skb);			BT_ERR("Could not dequeue pkt because alloc_skb failed");		}	}	spin_unlock_irqrestore(&bcsp->unack.lock, flags);	/* We could not send a reliable packet, either because there are	   none or because there are too many unack'ed pkts. Did we receive	   any packets we have not acknowledged yet ? */	if (bcsp->txack_req) {		/* if so, craft an empty ACK pkt and send it on BCSP unreliable		   channel 0 */		struct sk_buff *nskb = bcsp_prepare_pkt(bcsp, NULL, 0, BCSP_ACK_PKT);		return nskb;	}	/* We have nothing to send */	return NULL;}static int bcsp_flush(struct hci_uart *hu){	BT_DBG("hu %p", hu);	return 0;}/* Remove ack'ed packets */static void bcsp_pkt_cull(struct bcsp_struct *bcsp){	unsigned long flags;	struct sk_buff *skb;	int i, pkts_to_be_removed;	u8 seqno;	spin_lock_irqsave(&bcsp->unack.lock, flags);	pkts_to_be_removed = bcsp->unack.qlen;	seqno = bcsp->msgq_txseq;	while (pkts_to_be_removed) {		if (bcsp->rxack == seqno)			break;		pkts_to_be_removed--;		seqno = (seqno - 1) & 0x07;	}	if (bcsp->rxack != seqno)		BT_ERR("Peer acked invalid packet");	BT_DBG("Removing %u pkts out of %u, up to seqno %u",	       pkts_to_be_removed, bcsp->unack.qlen, (seqno - 1) & 0x07);	for (i = 0, skb = ((struct sk_buff *) &bcsp->unack)->next; i < pkts_to_be_removed			&& skb != (struct sk_buff *) &bcsp->unack; i++) {		struct sk_buff *nskb;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产凹凸在线观看一区二区 | 国产亚洲一本大道中文在线| 欧美综合色免费| 成人一区二区三区| 成人免费毛片aaaaa**| 国产激情精品久久久第一区二区| 久久99久久久欧美国产| 美女视频黄频大全不卡视频在线播放 | 18成人在线观看| 亚洲丝袜美腿综合| 亚洲欧美日韩国产手机在线| 亚洲精品视频一区| 亚洲电影你懂得| 免费一级片91| 国产成人午夜高潮毛片| 不卡电影免费在线播放一区| 97精品超碰一区二区三区| 日本电影亚洲天堂一区| 欧美麻豆精品久久久久久| 日韩一区二区三区在线视频| 久久精品夜夜夜夜久久| 亚洲精品视频在线观看免费| 婷婷久久综合九色综合绿巨人| 久久香蕉国产线看观看99| 久久嫩草精品久久久精品一| 日韩亚洲欧美一区二区三区| 欧美日韩在线播放一区| 日韩一区二区免费在线观看| 欧美精品一区二区高清在线观看| 国产欧美视频在线观看| 亚洲日本一区二区三区| 日韩高清国产一区在线| 国产精品1024| 欧美日韩免费一区二区三区| 精品噜噜噜噜久久久久久久久试看| 久久久久久99精品| 亚洲成人精品在线观看| 国产一区二区三区四区在线观看| 91亚洲精品一区二区乱码| 欧美一级日韩一级| 亚洲色图视频网站| 蜜臀av性久久久久av蜜臀妖精 | 精品一区二区综合| 91麻豆国产精品久久| 欧美成人乱码一区二区三区| 亚洲私人影院在线观看| 国产综合色在线视频区| 在线视频观看一区| 国产夜色精品一区二区av| 亚洲 欧美综合在线网络| 国产成人免费视频一区| 日韩午夜在线观看视频| 亚洲乱码国产乱码精品精可以看 | 高清日韩电视剧大全免费| 欧美日韩一区二区不卡| 国产精品美女久久久久久久久久久 | 国产亚洲视频系列| 日韩精品亚洲专区| 色视频欧美一区二区三区| 久久久久久久性| 九九九精品视频| 538prom精品视频线放| 一区二区三区精品在线| 波多野结衣中文一区| 精品国产乱码久久| 美国十次综合导航| 欧美一级艳片视频免费观看| 亚洲国产欧美在线| 在线观看www91| 亚洲男人都懂的| 91免费观看视频| 亚洲视频在线一区| 91在线观看美女| 亚洲精品菠萝久久久久久久| 成人福利视频网站| 中文字幕亚洲欧美在线不卡| 成人福利视频网站| 日韩理论片在线| 色综合视频在线观看| 亚洲日韩欧美一区二区在线| 国产精品护士白丝一区av| 菠萝蜜视频在线观看一区| 成人免费视频国产在线观看| 欧美美女一区二区在线观看| 久久嫩草精品久久久精品| 亚洲乱码中文字幕综合| 蜜乳av一区二区| 91麻豆成人久久精品二区三区| 欧美日韩成人激情| 日韩高清中文字幕一区| 国产精品一区二区免费不卡 | 日韩一区二区三区在线观看| 午夜久久久久久| 欧美一区二区视频在线观看2022| 日韩激情一区二区| 日韩午夜在线观看视频| 国产一区二区精品久久91| 国产亚洲综合av| 日本精品一区二区三区高清 | 精品日本一线二线三线不卡| 国产自产v一区二区三区c| 欧美激情一区二区三区不卡| 91欧美一区二区| 麻豆精品在线视频| 国产精品理论片在线观看| 欧美亚洲丝袜传媒另类| 激情综合五月天| 一区二区三区精品| 精品久久一区二区| 色综合一区二区| 蜜臀a∨国产成人精品| 亚洲欧洲性图库| 91精品国产福利| 91影院在线免费观看| 免费看日韩精品| 国产精品久线观看视频| 3d动漫精品啪啪一区二区竹菊| 国产在线精品视频| 亚洲成年人网站在线观看| 久久久久久久久久看片| 欧美日韩精品一区视频| 99精品视频在线免费观看| 久久超碰97中文字幕| 亚洲激情图片qvod| 亚洲国产精品精华液2区45| 欧美日韩亚洲综合| 91视频国产资源| 国产九色精品成人porny| 日日夜夜免费精品| 亚洲精品中文字幕在线观看| 亚洲国产高清在线| 日韩欧美亚洲国产另类| 欧美视频第二页| 99精品一区二区三区| 成人自拍视频在线| 极品美女销魂一区二区三区免费| 亚洲图片欧美综合| 亚洲人亚洲人成电影网站色| 欧美激情一区不卡| 久久久久久久电影| 久久在线观看免费| 日韩欧美区一区二| 日韩欧美成人午夜| 欧美疯狂做受xxxx富婆| 欧美日韩在线播放| 欧美性大战xxxxx久久久| 91原创在线视频| 91蜜桃婷婷狠狠久久综合9色| 国产乱淫av一区二区三区 | 中文av字幕一区| 国产午夜亚洲精品不卡| 久久夜色精品一区| 欧美精品一区二区三区蜜臀| 欧美一级在线免费| 日韩一级免费观看| 欧美大片在线观看一区二区| 宅男在线国产精品| 中文字幕免费不卡| 亚洲人成亚洲人成在线观看图片 | 欧美tickling网站挠脚心| 欧美性淫爽ww久久久久无| 97se狠狠狠综合亚洲狠狠| 91免费看`日韩一区二区| 91在线免费视频观看| 色狠狠桃花综合| 欧美日韩国产首页在线观看| 欧美视频完全免费看| 91精品国产综合久久精品图片| 欧美日韩高清在线| 日韩欧美一级特黄在线播放| 2020国产精品自拍| 中文字幕日韩一区| 亚洲国产精品久久艾草纯爱| 日韩av在线播放中文字幕| 国产一区91精品张津瑜| 成人不卡免费av| 欧美日韩在线播放三区| 精品欧美黑人一区二区三区| 久久这里只有精品6| 国产精品成人免费| 三级不卡在线观看| 26uuu亚洲| 一区二区三区四区在线| 亚洲第一电影网| 精品一区免费av| 色天天综合色天天久久| 日韩一区二区三区高清免费看看| 2023国产精品自拍| 一区二区在线观看不卡| 久久成人精品无人区| 99re这里只有精品视频首页| 欧美蜜桃一区二区三区| 国产欧美视频一区二区| 亚洲午夜在线电影| 国产成人综合亚洲网站| 欧美高清视频在线高清观看mv色露露十八| 精品成a人在线观看| 亚洲一线二线三线视频| 国产福利91精品| 91精品啪在线观看国产60岁|