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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? hci_bcsp.c

?? Linux環(huán)境下的藍(lán)牙模塊驅(qū)動(dòng)程序源代碼
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/* * *  Bluetooth HCI UART driver * *  Copyright (C) 2002-2003  Fabrizio Gennari <fabrizio.gennari@philips.com> *  Copyright (C) 2004-2005  Marcel Holtmann <marcel@holtmann.org> * * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * */#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.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 <linux/bitrev.h>#include <asm/unaligned.h>#include <net/bluetooth/bluetooth.h>#include <net/bluetooth/hci_core.h>#include "hci_uart.h"#define VERSION "0.3"static int txcrc = 1;static int hciextn = 1;#define BCSP_TXWINSIZE	4#define BCSP_ACK_PKT	0x05#define BCSP_LE_PKT	0x06struct bcsp_struct {	struct sk_buff_head unack;	/* Unack'ed packets queue */	struct sk_buff_head rel;	/* Reliable packets queue */	struct sk_buff_head unrel;	/* Unreliable packets queue */	unsigned long rx_count;	struct	sk_buff *rx_skb;	u8	rxseq_txack;		/* rxseq == txack. */	u8	rxack;			/* Last packet sent by us that the peer ack'ed */	struct	timer_list tbcsp;	enum {		BCSP_W4_PKT_DELIMITER,		BCSP_W4_PKT_START,		BCSP_W4_BCSP_HDR,		BCSP_W4_DATA,		BCSP_W4_CRC	} rx_state;	enum {		BCSP_ESCSTATE_NOESC,		BCSP_ESCSTATE_ESC	} rx_esc_state;	u8	use_crc;	u16	message_crc;	u8	txack_req;		/* Do we need to send ack's to the peer? */	/* Reliable packet sequence number - used to assign seq to each rel pkt. */	u8	msgq_txseq;};/* ---- 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;}/* ---- 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 (bt_cb(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;	u16 BCSP_CRC_INIT(bcsp_txmsg_crc);	int rel, i;	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;	}	if (hciextn && chan == 5) {		__le16 opcode = ((struct hci_command_hdr *)data)->opcode;		/* Vendor specific commands */		if (hci_opcode_ogf(__le16_to_cpu(opcode)) == 0x3f) {			u8 desc = *(data + HCI_COMMAND_HDR_SIZE);			if ((desc & 0xf0) == 0xc0) {				data += HCI_COMMAND_HDR_SIZE + 1;				len  -= HCI_COMMAND_HDR_SIZE + 1;				chan = desc & 0x0f;			}		}	}	/* 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;	bt_cb(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;	}	if (bcsp->use_crc)		hdr[0] |= 0x40;	hdr[1] = ((len << 4) & 0xff) | 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]);		if (bcsp->use_crc)			bcsp_crc_update(&bcsp_txmsg_crc, hdr[i]);	}	/* Put payload */	for (i = 0; i < len; i++) {		bcsp_slip_one_byte(nskb, data[i]);		if (bcsp->use_crc)			bcsp_crc_update(&bcsp_txmsg_crc, data[i]);	}	/* Put CRC */	if (bcsp->use_crc) {		bcsp_txmsg_crc = bitrev16(bcsp_txmsg_crc);		bcsp_slip_one_byte(nskb, (u8) ((bcsp_txmsg_crc >> 8) & 0x00ff));		bcsp_slip_one_byte(nskb, (u8) (bcsp_txmsg_crc & 0x00ff));	}	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 = 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, bt_cb(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_nested(&bcsp->unack.lock, flags, SINGLE_DEPTH_NESTING);	if (bcsp->unack.qlen < BCSP_TXWINSIZE && (skb = skb_dequeue(&bcsp->rel)) != NULL) {		struct sk_buff *nskb = bcsp_prepare_pkt(bcsp, skb->data, skb->len, bt_cb(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){	struct sk_buff *skb, *tmp;	unsigned long flags;	int i, pkts_to_be_removed;	u8 seqno;	spin_lock_irqsave(&bcsp->unack.lock, flags);	pkts_to_be_removed = skb_queue_len(&bcsp->unack);	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, skb_queue_len(&bcsp->unack),	       (seqno - 1) & 0x07);	i = 0;	skb_queue_walk_safe(&bcsp->unack, skb, tmp) {		if (i++ >= pkts_to_be_removed)			break;		__skb_unlink(skb, &bcsp->unack);		kfree_skb(skb);	}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
青青草精品视频| 紧缚捆绑精品一区二区| 国产亚洲一区字幕| 日韩欧美成人午夜| 欧美一二三区在线观看| 欧美日韩一区二区电影| 欧美老女人第四色| 欧美久久久久免费| 日韩小视频在线观看专区| 日韩视频永久免费| 久久久久国产精品人| 国产三级三级三级精品8ⅰ区| 久久久久国产精品免费免费搜索| 国产视频亚洲色图| 国产精品电影一区二区| 亚洲欧美日韩系列| 国产成人精品网址| 亚洲视频在线观看三级| 日本一区二区三区dvd视频在线| 欧美不卡一区二区| 国产婷婷精品av在线| 国产精品毛片无遮挡高清| 中文av一区特黄| 一区2区3区在线看| 日韩国产欧美视频| 国产一区二区三区| 丁香六月久久综合狠狠色| 99久久99久久精品免费看蜜桃| 色综合一个色综合亚洲| 制服丝袜亚洲色图| 久久久久国产一区二区三区四区| 国产精品久久久久久久久果冻传媒| 最好看的中文字幕久久| 午夜精品国产更新| 国产自产v一区二区三区c| www精品美女久久久tv| 久久久精品综合| 亚洲人成网站精品片在线观看 | 日韩欧美成人一区二区| 国产亚洲综合在线| 亚洲欧美福利一区二区| 日本欧美一区二区| 成人黄页毛片网站| 欧美美女一区二区三区| 国产视频不卡一区| 天天av天天翘天天综合网色鬼国产| 美女mm1313爽爽久久久蜜臀| www.欧美色图| 欧美一区在线视频| **欧美大码日韩| 麻豆国产欧美一区二区三区| 99久久伊人久久99| 日韩精品一区二区三区在线观看| 亚洲少妇中出一区| 激情丁香综合五月| 欧美三级视频在线观看| 欧美激情资源网| 热久久免费视频| 一本色道久久综合精品竹菊| 亚洲精品一区二区三区福利| 亚洲一区免费在线观看| 国产成人啪免费观看软件| 欧美群妇大交群的观看方式| 国产精品久久精品日日| 美女视频黄免费的久久 | 日韩一级免费一区| 亚洲日本一区二区三区| 国产美女av一区二区三区| 欧美三级电影精品| 国产精品久久看| 国产乱一区二区| 91精品国产黑色紧身裤美女| 一区二区三区91| av午夜精品一区二区三区| 精品国产污污免费网站入口| 图片区小说区区亚洲影院| 91色.com| 国产精品高清亚洲| 国产福利一区二区三区视频| 欧美影院一区二区三区| 国产高清成人在线| 欧美日韩国产小视频| 国产精品免费人成网站| 国产精品中文欧美| 精品黑人一区二区三区久久| 五月婷婷激情综合网| 一本大道久久a久久综合婷婷| 久久精品亚洲一区二区三区浴池| 日本aⅴ亚洲精品中文乱码| 欧美三级资源在线| 亚洲最大成人网4388xx| 91麻豆国产福利精品| 中文字幕第一区| 高潮精品一区videoshd| 国产日韩欧美综合一区| 国产一区二区三区视频在线播放| 日韩欧美国产麻豆| 奇米精品一区二区三区在线观看 | 欧美肥妇毛茸茸| 亚洲制服丝袜在线| 在线免费精品视频| 亚洲欧美偷拍另类a∨色屁股| 成人看片黄a免费看在线| 欧美激情一区二区三区在线| 国产成人一区二区精品非洲| 久久久国产精品麻豆| 极品少妇xxxx精品少妇偷拍| 欧美电影免费观看高清完整版在线观看 | 精品一区二区日韩| 欧美成人综合网站| 韩国三级在线一区| 久久久久久久久蜜桃| 国产高清在线精品| 欧美国产精品中文字幕| 成人av电影在线播放| 一区二区中文字幕在线| 色诱视频网站一区| 亚洲成人777| 日韩精品中文字幕在线不卡尤物| 国产一区二三区| 国产精品婷婷午夜在线观看| 91丨九色丨尤物| 亚洲国产va精品久久久不卡综合| 欧美精品第1页| 久久 天天综合| 亚洲精品在线观看网站| 奇米精品一区二区三区在线观看 | 久久精品人人做人人综合 | 欧美日韩高清一区二区| 日韩精品成人一区二区三区| 日韩免费高清电影| 高清av一区二区| 亚洲在线一区二区三区| 日韩一二三区不卡| 丰满放荡岳乱妇91ww| 亚洲最新视频在线观看| 日韩一区二区中文字幕| 国产v日产∨综合v精品视频| 亚洲另类在线一区| 欧美一激情一区二区三区| 粉嫩高潮美女一区二区三区| 一区二区三区丝袜| 精品久久久久久久一区二区蜜臀| 成人国产精品免费观看| 亚洲成人在线观看视频| 久久久久久久久久久久久久久99 | 毛片一区二区三区| 国产精品青草综合久久久久99| 色94色欧美sute亚洲线路二 | 色一情一伦一子一伦一区| 亚洲成av人片在线观看| 久久这里只精品最新地址| 色综合久久66| 日韩精品一区二| 国产高清在线精品| 亚洲国产欧美在线人成| 久久精品在线免费观看| 在线亚洲人成电影网站色www| 久久成人羞羞网站| 亚洲精品乱码久久久久| www成人在线观看| 欧美综合久久久| 成人性生交大合| 日韩av午夜在线观看| 日韩伦理免费电影| 日韩美一区二区三区| 欧美亚洲综合久久| 国产91高潮流白浆在线麻豆| 日本女人一区二区三区| 中文字幕一区在线| 精品国产一二三区| 欧美日本国产一区| 91啪亚洲精品| 国产成人在线影院| 久久综合综合久久综合| 亚洲影院久久精品| 中文字幕欧美一区| 欧美精品一区二区三区高清aⅴ | 国产精品久久毛片av大全日韩| 日韩视频免费观看高清完整版 | 日本高清不卡一区| 丁香激情综合五月| 精品一区二区免费在线观看| 性久久久久久久久久久久| 亚洲三级电影网站| 中文字幕不卡在线| 久久久久9999亚洲精品| 日韩欧美一二三区| 欧美一区二区性放荡片| 欧美在线播放高清精品| 91网站在线观看视频| 成人性生交大合| 国产福利视频一区二区三区| 国产一区亚洲一区| 麻豆成人久久精品二区三区小说| 婷婷一区二区三区| 亚洲国产精品久久人人爱| 一区二区高清在线| 亚洲专区一二三| 一区二区三区欧美视频|