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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? bcm203x.c

?? 嵌入式Linux的藍牙模塊驅動
?? C
字號:
/* * *  Broadcom Blutonium firmware driver * *  Copyright (C) 2003  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/config.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/slab.h>#include <linux/types.h>#include <linux/errno.h>#include <linux/timer.h>#include <linux/device.h>#include <linux/firmware.h>#include <linux/usb.h>#include <net/bluetooth/bluetooth.h>#ifndef CONFIG_BT_HCIBCM203X_DEBUG#undef  BT_DBG#define BT_DBG(D...)#endif#define VERSION "1.0"static struct usb_device_id bcm203x_table[] = {	/* Broadcom Blutonium (BCM2033) */	{ USB_DEVICE(0x0a5c, 0x2033) },	{ }	/* Terminating entry */};MODULE_DEVICE_TABLE(usb, bcm203x_table);#define BCM203X_ERROR		0#define BCM203X_RESET		1#define BCM203X_LOAD_MINIDRV	2#define BCM203X_SELECT_MEMORY	3#define BCM203X_CHECK_MEMORY	4#define BCM203X_LOAD_FIRMWARE	5#define BCM203X_CHECK_FIRMWARE	6#define BCM203X_IN_EP		0x81#define BCM203X_OUT_EP		0x02struct bcm203x_data {	struct usb_device	*udev;	unsigned long		state;	struct timer_list	timer;	struct urb		*urb;	unsigned char		*buffer;	unsigned char		*fw_data;	unsigned int		fw_size;	unsigned int		fw_sent;};static void bcm203x_complete(struct urb *urb, struct pt_regs *regs){	struct bcm203x_data *data = urb->context;	struct usb_device *udev = urb->dev;	int len;	BT_DBG("udev %p urb %p", udev, urb);	if (urb->status) {		BT_ERR("URB failed with status %d", urb->status);		data->state = BCM203X_ERROR;		return;	}	switch (data->state) {	case BCM203X_LOAD_MINIDRV:		memcpy(data->buffer, "#", 1);		usb_fill_bulk_urb(urb, udev, usb_sndbulkpipe(udev, BCM203X_OUT_EP),				data->buffer, 1, bcm203x_complete, data);		data->state = BCM203X_SELECT_MEMORY;		mod_timer(&data->timer, jiffies + (HZ / 10));		break;	case BCM203X_SELECT_MEMORY:		usb_fill_int_urb(urb, udev, usb_rcvintpipe(udev, BCM203X_IN_EP),				data->buffer, 32, bcm203x_complete, data, 1);		data->state = BCM203X_CHECK_MEMORY;		if (usb_submit_urb(data->urb, GFP_ATOMIC) < 0)			BT_ERR("Can't submit URB");		break;	case BCM203X_CHECK_MEMORY:		if (data->buffer[0] != '#') {			BT_ERR("Memory select failed");			data->state = BCM203X_ERROR;			break;		}		data->state = BCM203X_LOAD_FIRMWARE;	case BCM203X_LOAD_FIRMWARE:		if (data->fw_sent == data->fw_size) {			usb_fill_int_urb(urb, udev, usb_rcvintpipe(udev, BCM203X_IN_EP),				data->buffer, 32, bcm203x_complete, data, 1);			data->state = BCM203X_CHECK_FIRMWARE;		} else {			len = min_t(uint, data->fw_size - data->fw_sent, 4096);			usb_fill_bulk_urb(urb, udev, usb_sndbulkpipe(udev, BCM203X_OUT_EP),				data->fw_data + data->fw_sent, len, bcm203x_complete, data);			data->fw_sent += len;		}		if (usb_submit_urb(data->urb, GFP_ATOMIC) < 0)			BT_ERR("Can't submit URB");		break;	case BCM203X_CHECK_FIRMWARE:		if (data->buffer[0] != '.') {			BT_ERR("Firmware loading failed");			data->state = BCM203X_ERROR;			break;		}		data->state = BCM203X_RESET;		break;	}}static void bcm203x_timer(unsigned long user_data){	struct bcm203x_data *data = (struct bcm203x_data *) user_data;	if (usb_submit_urb(data->urb, GFP_ATOMIC) < 0)		BT_ERR("Can't submit URB");}static int bcm203x_probe(struct usb_interface *intf, const struct usb_device_id *id){	const struct firmware *firmware;	struct usb_device *udev = interface_to_usbdev(intf);	struct bcm203x_data *data;	int size;	BT_DBG("intf %p id %p", intf, id);	if (intf->cur_altsetting->desc.bInterfaceNumber != 0)		return -ENODEV;	data = kmalloc(sizeof(*data), GFP_KERNEL);	if (!data) {		BT_ERR("Can't allocate memory for data structure");		return -ENOMEM;	}	memset(data, 0, sizeof(*data));	data->udev  = udev;	data->state = BCM203X_LOAD_MINIDRV;	data->urb = usb_alloc_urb(0, GFP_KERNEL);	if (!data->urb) {		BT_ERR("Can't allocate URB");		kfree(data);		return -ENOMEM;	}	if (request_firmware(&firmware, "BCM2033-MD.hex", &udev->dev) < 0) {		BT_ERR("Mini driver request failed");		usb_free_urb(data->urb);		kfree(data);		return -EIO;	}	BT_DBG("minidrv data %p size %d", firmware->data, firmware->size);	size = max_t(uint, firmware->size, 4096);	data->buffer = kmalloc(size, GFP_KERNEL);	if (!data->buffer) {		BT_ERR("Can't allocate memory for mini driver");		release_firmware(firmware);		usb_free_urb(data->urb);		kfree(data);		return -ENOMEM;	}	memcpy(data->buffer, firmware->data, firmware->size);	usb_fill_bulk_urb(data->urb, udev, usb_sndbulkpipe(udev, BCM203X_OUT_EP),			data->buffer, firmware->size, bcm203x_complete, data);	release_firmware(firmware);	if (request_firmware(&firmware, "BCM2033-FW.bin", &udev->dev) < 0) {		BT_ERR("Firmware request failed");		usb_free_urb(data->urb);		kfree(data->buffer);		kfree(data);		return -EIO;	}	BT_DBG("firmware data %p size %d", firmware->data, firmware->size);	data->fw_data = kmalloc(firmware->size, GFP_KERNEL);	if (!data->fw_data) {		BT_ERR("Can't allocate memory for firmware image");		usb_free_urb(data->urb);		kfree(data->buffer);		kfree(data);		return -ENOMEM;	}	memcpy(data->fw_data, firmware->data, firmware->size);	data->fw_size = firmware->size;	data->fw_sent = 0;	release_firmware(firmware);	init_timer(&data->timer);	data->timer.function = bcm203x_timer;	data->timer.data = (unsigned long) data;	usb_set_intfdata(intf, data);	mod_timer(&data->timer, jiffies + HZ);	return 0;}static void bcm203x_disconnect(struct usb_interface *intf){	struct bcm203x_data *data = usb_get_intfdata(intf);	BT_DBG("intf %p", intf);	usb_unlink_urb(data->urb);	usb_set_intfdata(intf, NULL);	usb_free_urb(data->urb);	kfree(data->fw_data);	kfree(data->buffer);	kfree(data);}static struct usb_driver bcm203x_driver = {	.owner		= THIS_MODULE,	.name		= "bcm203x",	.probe		= bcm203x_probe,	.disconnect	= bcm203x_disconnect,	.id_table	= bcm203x_table,};static int __init bcm203x_init(void){	int err;	BT_INFO("Broadcom Blutonium firmware driver ver %s", VERSION);	err = usb_register(&bcm203x_driver);	if (err < 0)		BT_ERR("Failed to register USB driver");	return err;}static void __exit bcm203x_exit(void){	usb_deregister(&bcm203x_driver);}module_init(bcm203x_init);module_exit(bcm203x_exit);MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");MODULE_DESCRIPTION("Broadcom Blutonium firmware driver ver " VERSION);MODULE_VERSION(VERSION);MODULE_LICENSE("GPL");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久噜噜噜久噜久久综合| 91国偷自产一区二区三区观看| 亚洲婷婷综合色高清在线| 久久午夜羞羞影院免费观看| 欧美一级二级在线观看| 欧美久久久久久蜜桃| 欧美精品日韩一本| 51午夜精品国产| 日韩免费性生活视频播放| 日韩一区二区三区观看| 日韩精品资源二区在线| 久久综合色综合88| 欧美国产精品一区二区三区| 欧美高清在线精品一区| 国产精品福利在线播放| 樱桃视频在线观看一区| 日本女优在线视频一区二区| 看电影不卡的网站| 国产a级毛片一区| 色噜噜狠狠成人网p站| 欧美在线观看视频一区二区 | 精品美女一区二区三区| 精品剧情v国产在线观看在线| 精品福利一二区| 中文字幕欧美三区| 亚洲影视资源网| 美腿丝袜在线亚洲一区| 国产成人免费在线视频| 91香蕉视频在线| 日韩一区和二区| 国产精品伦理在线| 午夜激情一区二区| 国产成人精品综合在线观看| 一本色道久久综合亚洲91 | 久久综合成人精品亚洲另类欧美 | 91精品欧美综合在线观看最新| 欧美tickling挠脚心丨vk| 中文字幕欧美激情一区| 亚洲国产综合91精品麻豆| 九九久久精品视频| 欧美亚洲愉拍一区二区| 精品国产成人系列| 亚洲国产精品尤物yw在线观看| 免费看黄色91| 91免费观看视频| 久久亚洲欧美国产精品乐播| 一区二区日韩av| 国产69精品久久99不卡| 555夜色666亚洲国产免| 亚洲精品国产无套在线观| 久久精品国产亚洲a| 欧美日韩亚洲国产综合| 国产精品大尺度| 国产一区二区伦理| 欧美一区二区三区免费| 亚洲欧美乱综合| 成人综合在线视频| 久久色在线观看| 国产精品美日韩| 欧美电影免费观看完整版| 在线国产电影不卡| 欧美国产激情一区二区三区蜜月| 亚洲va国产va欧美va观看| 成av人片一区二区| 久久久亚洲国产美女国产盗摄 | 久久久久久久综合日本| 午夜日韩在线电影| 欧美在线视频日韩| 一区二区三区自拍| 一本一道久久a久久精品| 久久麻豆一区二区| 国产最新精品精品你懂的| 欧美一区二区成人| 蓝色福利精品导航| 欧美一区二区在线免费观看| 丝袜脚交一区二区| 欧美精品1区2区3区| 亚洲国产精品一区二区久久| 一本久道中文字幕精品亚洲嫩| 国产精品色噜噜| 成人小视频免费观看| 中文在线免费一区三区高中清不卡| 国产美女久久久久| 中文字幕欧美国产| 色婷婷香蕉在线一区二区| 亚洲精品欧美在线| 欧美男人的天堂一二区| 日韩成人一级大片| 亚洲精品在线免费观看视频| 国产精品一区在线观看乱码| 国产日韩视频一区二区三区| 国产精品亚洲午夜一区二区三区| 久久久久久久久久久久电影| 国产成人综合网| 亚洲另类春色国产| 欧美精品18+| 国产二区国产一区在线观看 | av午夜精品一区二区三区| 国产精品对白交换视频| 精品视频在线免费看| 麻豆免费看一区二区三区| 亚洲影视资源网| 欧美一区二区三区电影| 国产成人精品亚洲午夜麻豆| 亚洲日韩欧美一区二区在线| 欧美在线观看一区二区| 蜜臀久久久99精品久久久久久| 久久亚区不卡日本| 欧美唯美清纯偷拍| 国模少妇一区二区三区| 亚洲欧美成aⅴ人在线观看| 欧美电影在线免费观看| 粉嫩13p一区二区三区| 亚洲国产婷婷综合在线精品| 精品91自产拍在线观看一区| 99久久精品国产一区| 秋霞影院一区二区| 成人欧美一区二区三区在线播放| 欧美伦理电影网| 成人av午夜影院| 美女久久久精品| 亚洲素人一区二区| 欧美精品一区二区久久婷婷| 色婷婷精品大视频在线蜜桃视频| 久久99精品国产.久久久久| 亚洲卡通动漫在线| 久久久久久久久蜜桃| 欧美一区2区视频在线观看| 波多野结衣中文字幕一区| 久久99精品一区二区三区| 亚洲国产va精品久久久不卡综合| 久久一区二区三区国产精品| 欧美男同性恋视频网站| 97久久人人超碰| 国产精品一卡二| 美女网站在线免费欧美精品| 亚洲国产一区在线观看| 1000部国产精品成人观看| 亚洲精品一区二区三区四区高清 | 欧美zozozo| 欧美伦理影视网| 91精品福利视频| av不卡一区二区三区| 精品一区二区在线视频| 日韩国产一区二| 天堂成人国产精品一区| 亚洲一二三区视频在线观看| 国产精品视频你懂的| 国产日本欧洲亚洲| 26uuu国产电影一区二区| 日韩欧美亚洲国产另类| 3d动漫精品啪啪一区二区竹菊| 91国内精品野花午夜精品| 99国产精品久久久久久久久久 | 亚洲女女做受ⅹxx高潮| 亚洲国产精华液网站w | 亚洲女爱视频在线| 亚洲人成小说网站色在线| 成人欧美一区二区三区黑人麻豆 | 高清久久久久久| 国产成人免费视频一区| 国产激情视频一区二区三区欧美 | 国产精品水嫩水嫩| 中文字幕精品综合| 综合分类小说区另类春色亚洲小说欧美| 国产日韩视频一区二区三区| 国产精品久久久久久久裸模 | 亚洲综合偷拍欧美一区色| 一区二区三区自拍| 调教+趴+乳夹+国产+精品| 美女网站色91| 丁香六月久久综合狠狠色| av电影在线观看完整版一区二区| 99久久综合精品| 欧美亚男人的天堂| 日韩一区二区三区视频| 久久精品亚洲精品国产欧美 | 色婷婷综合久久久中文字幕| 欧美伊人久久久久久久久影院| 欧美日韩电影在线播放| 精品美女在线播放| 亚洲人成网站色在线观看| 亚洲风情在线资源站| 国内成人免费视频| 色欧美乱欧美15图片| 欧美日韩国产大片| 国产免费成人在线视频| 一片黄亚洲嫩模| 韩国成人精品a∨在线观看| 91丨porny丨户外露出| 欧美亚洲一区二区三区四区| 日韩午夜在线播放| 亚洲欧洲成人自拍| 麻豆中文一区二区| 在线视频欧美精品| 国产亚洲精品久| 日韩av中文字幕一区二区| av在线不卡电影| xnxx国产精品| 亚洲成a人v欧美综合天堂下载 |