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

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

?? hciattach_ti.c

?? BlueZ源碼
?? C
字號:
/* * *  BlueZ - Bluetooth protocol stack for Linux * *  Copyright (C) 2007-2008  Texas Instruments, Inc. *  Copyright (C) 2005-2008  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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA * */#ifdef HAVE_CONFIG_H#include <config.h>#endif#include <stdio.h>#include <errno.h>#include <unistd.h>#include <stdlib.h>#include <termios.h>#include <time.h>#include <sys/time.h>#include <sys/types.h>#include <sys/param.h>#include <sys/ioctl.h>#include <sys/socket.h>#include <sys/uio.h>#include <bluetooth/bluetooth.h>#include <bluetooth/hci.h>#include <bluetooth/hci_lib.h>#ifdef HCIATTACH_DEBUG#define DPRINTF(x...)	printf(x)#else#define DPRINTF(x...)#endif#define HCIUARTGETDEVICE	_IOR('U', 202, int)#define MAKEWORD(a, b)  ((uint16_t)(((uint8_t)(a)) | ((uint16_t)((uint8_t)(b))) << 8))#define TI_MANUFACTURER_ID	13#define FIRMWARE_DIRECTORY	"/lib/firmware/"#define ACTION_SEND_COMMAND	1#define ACTION_WAIT_EVENT	2#define ACTION_SERIAL		3#define ACTION_DELAY		4#define ACTION_RUN_SCRIPT	5#define ACTION_REMARKS		6#define BRF_DEEP_SLEEP_OPCODE_BYTE_1	0x0c#define BRF_DEEP_SLEEP_OPCODE_BYTE_2	0xfd#define BRF_DEEP_SLEEP_OPCODE		\	(BRF_DEEP_SLEEP_OPCODE_BYTE_1 | (BRF_DEEP_SLEEP_OPCODE_BYTE_2 << 8))#define FILE_HEADER_MAGIC	0x42535442/* * BRF Firmware header */struct bts_header {	uint32_t	magic;	uint32_t	version;	uint8_t	future[24];	uint8_t	actions[0];}__attribute__ ((packed));/* * BRF Actions structure */struct bts_action {	uint16_t	type;	uint16_t	size;	uint8_t	data[0];} __attribute__ ((packed));struct bts_action_send {	uint8_t data[0];} __attribute__ ((packed));struct bts_action_wait {	uint32_t msec;	uint32_t size;	uint8_t data[0];}__attribute__ ((packed));struct bts_action_delay {	uint32_t msec;}__attribute__ ((packed));struct bts_action_serial {	uint32_t baud;	uint32_t flow_control;}__attribute__ ((packed));extern int set_speed(int fd, struct termios *ti, int speed);extern int read_hci_event(int fd, unsigned char* buf, int size);static FILE *bts_load_script(const char* file_name, uint32_t* version){	struct bts_header header;	FILE* fp;	fp = fopen(file_name, "rb");	if (!fp) {		perror("can't open firmware file");		goto out;	}	if (1 != fread(&header, sizeof(struct bts_header), 1, fp)) {		perror("can't read firmware file");		goto errclose;	}	if (header.magic != FILE_HEADER_MAGIC) {		fprintf(stderr, "%s not a legal TI firmware file\n", file_name);		goto errclose;	}	if (NULL != version)		*version = header.version;	goto out;errclose:	fclose(fp);	fp = NULL;out:	return fp;}static unsigned long bts_fetch_action(FILE* fp, unsigned char* action_buf,				unsigned long buf_size, uint16_t* action_type){	struct bts_action action_hdr;	unsigned long nread;	if (!fp)		return 0;	if (1 != fread(&action_hdr, sizeof(struct bts_action), 1, fp))		return 0;	if (action_hdr.size > buf_size) {		fprintf(stderr, "bts_next_action: not enough space to read next action\n");		return 0;	}	nread = fread(action_buf, sizeof(uint8_t), action_hdr.size, fp);	if (nread != (action_hdr.size)) {		fprintf(stderr, "bts_next_action: fread failed to read next action\n");		return 0;	}	*action_type = action_hdr.type;	return nread * sizeof(uint8_t);}static void bts_unload_script(FILE* fp){	if (fp)		fclose(fp);}static int is_it_texas(const uint8_t *respond){	uint16_t manufacturer_id;	manufacturer_id = MAKEWORD(respond[11], respond[12]);	return TI_MANUFACTURER_ID == manufacturer_id ? 1 : 0;}static const char *get_firmware_name(const uint8_t *respond){	static char firmware_file_name[PATH_MAX] = {0};	uint16_t version = 0, chip = 0, min_ver = 0, maj_ver = 0;	version = MAKEWORD(respond[13], respond[14]);	chip =  (version & 0x7C00) >> 10;	min_ver = (version & 0x007F);	maj_ver = (version & 0x0380) >> 7;	if (version & 0x8000)		maj_ver |= 0x0008;	sprintf(firmware_file_name, FIRMWARE_DIRECTORY "TIInit_%d.%d.%d.bts", chip, maj_ver, min_ver);	return firmware_file_name;}static void brf_delay(struct bts_action_delay *delay){	usleep(1000 * delay->msec);}static int brf_set_serial_params(struct bts_action_serial *serial_action,						int fd, struct termios *ti){	fprintf(stderr, "texas: changing baud rate to %u, flow control to %u\n",				serial_action->baud, serial_action->flow_control );	tcflush(fd, TCIOFLUSH);	if (serial_action->flow_control)		ti->c_cflag |= CRTSCTS;	else		ti->c_cflag &= ~CRTSCTS;	if (tcsetattr(fd, TCSANOW, ti) < 0) {		perror("Can't set port settings");		return -1;	}	tcflush(fd, TCIOFLUSH);	if (set_speed(fd, ti, serial_action->baud) < 0) {		perror("Can't set baud rate");		return -1;	}	return 0;}static int brf_send_command_socket(int fd, struct bts_action_send* send_action){	char response[1024] = {0};	hci_command_hdr *cmd = (hci_command_hdr *) send_action->data;	uint16_t opcode = cmd->opcode;	struct hci_request rq;	memset(&rq, 0, sizeof(rq));	rq.ogf    = cmd_opcode_ogf(opcode);	rq.ocf    = cmd_opcode_ocf(opcode);	rq.event  = EVT_CMD_COMPLETE;	rq.cparam = &send_action->data[3];	rq.clen   = send_action->data[2];	rq.rparam = response;	rq.rlen   = sizeof(response);	if (hci_send_req(fd, &rq, 15) < 0) {		perror("Cannot send hci command to socket");		return -1;	}	/* verify success */	if (response[0]) {		errno = EIO;		return -1;	}	return 0;}static int brf_send_command_file(int fd, struct bts_action_send* send_action, long size){	unsigned char response[1024] = {0};	long ret = 0;	/* send command */	if (size != write(fd, send_action, size)) {		perror("Texas: Failed to write action command");		return -1;	}	/* read response */	ret = read_hci_event(fd, response, sizeof(response));	if (ret < 0) {		perror("texas: failed to read command response");		return -1;	}	/* verify success */	if (ret < 7 || 0 != response[6]) {		fprintf( stderr, "TI init command failed.\n" );		errno = EIO;		return -1;	}	return 0;}static int brf_send_command(int fd, struct bts_action_send* send_action, long size, int hcill_installed){	int ret = 0;	char *fixed_action;	/* remove packet type when giving to socket API */	if (hcill_installed) {		fixed_action = ((char *) send_action) + 1;		ret = brf_send_command_socket(fd, (struct bts_action_send *) fixed_action);	} else {		ret = brf_send_command_file(fd, send_action, size);	}	return ret;}static int brf_do_action(uint16_t brf_type, uint8_t *brf_action, long brf_size,				int fd, struct termios *ti, int hcill_installed){	int ret = 0;	switch (brf_type) {	case ACTION_SEND_COMMAND:		DPRINTF("W");		ret = brf_send_command(fd, (struct bts_action_send*) brf_action, brf_size, hcill_installed);		break;	case ACTION_WAIT_EVENT:		DPRINTF("R");		break;	case ACTION_SERIAL:		DPRINTF("S");		ret = brf_set_serial_params((struct bts_action_serial *) brf_action, fd, ti);		break;	case ACTION_DELAY:		DPRINTF("D");		brf_delay((struct bts_action_delay *) brf_action);		break;	case ACTION_REMARKS:		DPRINTF("C");		break;	default:		fprintf(stderr, "brf_init: unknown firmware action type (%d)\n", brf_type);		break;	}	return ret;}/* * tests whether a given brf action is a HCI_VS_Sleep_Mode_Configurations cmd */static int brf_action_is_deep_sleep(uint8_t *brf_action, long brf_size,							uint16_t brf_type){	uint16_t opcode;	if (brf_type != ACTION_SEND_COMMAND)		return 0;	if (brf_size < 3)		return 0;	if (brf_action[0] != HCI_COMMAND_PKT)		return 0;	/* HCI data is little endian */	opcode = brf_action[1] | (brf_action[2] << 8);	if (opcode != BRF_DEEP_SLEEP_OPCODE)		return 0;	/* action is deep sleep configuration command ! */	return 1;}/* * This function is called twice. * The first time it is called, it loads the brf script, and executes its * commands until it reaches a deep sleep command (or its end). * The second time it is called, it assumes HCILL protocol is set up, * and sends rest of brf script via the supplied socket. */static int brf_do_script(int fd, struct termios *ti, const char *bts_file){	int ret = 0,  hcill_installed = bts_file ? 0 : 1;	uint32_t vers;	static FILE *brf_script_file = NULL;	static uint8_t brf_action[256];	static long brf_size;	static uint16_t brf_type;	/* is it the first time we are called ? */	if (0 == hcill_installed) {		DPRINTF("Sending script to serial device\n");		brf_script_file = bts_load_script(bts_file, &vers );		if (!brf_script_file) {			fprintf(stderr, "Warning: cannot find BTS file: %s\n",					bts_file);			return 0;		}		fprintf( stderr, "Loaded BTS script version %u\n", vers );		brf_size = bts_fetch_action(brf_script_file, brf_action,						sizeof(brf_action), &brf_type);		if (brf_size == 0) {			fprintf(stderr, "Warning: BTS file is empty !");			return 0;		}	}	else {		DPRINTF("Sending script to bluetooth socket\n");	}	/* execute current action and continue to parse brf script file */	while (brf_size != 0) {		ret = brf_do_action(brf_type, brf_action, brf_size,						fd, ti, hcill_installed);		if (ret == -1)			break;		brf_size = bts_fetch_action(brf_script_file, brf_action,						sizeof(brf_action), &brf_type);		/* if this is the first time we run (no HCILL yet) */		/* and a deep sleep command is encountered */		/* we exit */		if (!hcill_installed &&				brf_action_is_deep_sleep(brf_action,							brf_size, brf_type))			return 0;	}	bts_unload_script(brf_script_file);	brf_script_file = NULL;	DPRINTF("\n");	return ret;}int texas_init(int fd, struct termios *ti){	struct timespec tm = {0, 50000};	char cmd[4];	unsigned char resp[100];		/* Response */	const char *bts_file;	int n;	memset(resp,'\0', 100);	/* It is possible to get software version with manufacturer specific 	   HCI command HCI_VS_TI_Version_Number. But the only thing you get more	   is if this is point-to-point or point-to-multipoint module */	/* Get Manufacturer and LMP version */	cmd[0] = HCI_COMMAND_PKT;	cmd[1] = 0x01;	cmd[2] = 0x10;	cmd[3] = 0x00;	do {		n = write(fd, cmd, 4);		if (n < 0) {			perror("Failed to write init command (READ_LOCAL_VERSION_INFORMATION)");			return -1;		}		if (n < 4) {			fprintf(stderr, "Wanted to write 4 bytes, could only write %d. Stop\n", n);			return -1;		}		/* Read reply. */		if (read_hci_event(fd, resp, 100) < 0) {			perror("Failed to read init response (READ_LOCAL_VERSION_INFORMATION)");			return -1;		}		/* Wait for command complete event for our Opcode */	} while (resp[4] != cmd[1] && resp[5] != cmd[2]);	/* Verify manufacturer */	if (! is_it_texas(resp)) {		fprintf(stderr,"ERROR: module's manufacturer is not Texas Instruments\n");		return -1;	}	fprintf(stderr, "Found a Texas Instruments' chip!\n");	bts_file = get_firmware_name(resp);	fprintf(stderr, "Firmware file : %s\n", bts_file);	n = brf_do_script(fd, ti, bts_file);	nanosleep(&tm, NULL);	return n;}int texas_post(int fd, struct termios *ti){	int dev_id, dd, ret = 0;	sleep(1);	dev_id = ioctl(fd, HCIUARTGETDEVICE, 0);	if (dev_id < 0) {		perror("cannot get device id");		return -1;	}	DPRINTF("\nAdded device hci%d\n", dev_id);	dd = hci_open_dev(dev_id);	if (dd < 0) {		perror("HCI device open failed");		return -1;	}	ret = brf_do_script(dd, ti, NULL);	hci_close_dev(dd);	return ret;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产欧美日韩不卡| 国产成人a级片| 狠狠色综合播放一区二区| 97精品国产97久久久久久久久久久久| 欧美日本一区二区三区四区| 国产精品久久福利| 国产一区二区不卡| 精品免费日韩av| 天天av天天翘天天综合网色鬼国产| 成人精品国产一区二区4080| 亚洲精品一线二线三线| 亚洲综合999| 97久久超碰国产精品电影| 久久久久97国产精华液好用吗| 秋霞影院一区二区| 欧美日韩精品一区视频| 亚洲欧美日韩在线播放| 国产成人亚洲综合a∨婷婷| 精品成人免费观看| 国产综合色精品一区二区三区| 欧美精品三级日韩久久| 亚洲精品乱码久久久久久日本蜜臀| 国产精品一二三四区| 亚洲精品一区二区在线观看| 久久国产夜色精品鲁鲁99| 欧美一二三四在线| 日韩高清一区在线| 91麻豆精品国产91| 丝袜美腿亚洲色图| 欧美一区二区在线免费播放| 午夜精品成人在线| 337p亚洲精品色噜噜狠狠| 亚洲综合色成人| 欧美色综合影院| 亚洲成人免费av| 欧美一级黄色录像| 国产精品一二三四| 国产精品乱人伦中文| 91视频精品在这里| 亚洲综合免费观看高清完整版在线| 成人av在线网站| 亚洲综合一区二区三区| 欧美三区免费完整视频在线观看| 亚洲国产va精品久久久不卡综合| 欧美日本一区二区在线观看| 免费观看日韩av| 亚洲精品在线观| a4yy欧美一区二区三区| 亚洲在线观看免费| 日韩欧美电影一区| 成人国产精品免费观看视频| 亚洲美女视频在线观看| 欧美伦理电影网| 久久99久久久久久久久久久| 国产清纯美女被跳蛋高潮一区二区久久w| 国产电影精品久久禁18| 亚洲人精品一区| 91精品国产入口| 国产精品2024| 亚洲一区二区三区免费视频| 日韩欧美一区二区不卡| 国产iv一区二区三区| 有码一区二区三区| 欧美成人三级电影在线| 成人av集中营| 免费观看成人av| 亚洲人成亚洲人成在线观看图片 | 午夜精品一区二区三区三上悠亚 | 国产精品家庭影院| 欧美三级蜜桃2在线观看| 国内精品视频一区二区三区八戒| 国产精品国产三级国产普通话99| 欧美色中文字幕| 国产精品亚洲一区二区三区妖精| 亚洲一线二线三线久久久| 欧美精品一区二区三区蜜桃| 欧美最新大片在线看| 国产成人啪免费观看软件| 性久久久久久久久久久久| 国产精品每日更新| 日韩欧美亚洲国产精品字幕久久久| 成人av在线一区二区三区| 麻豆高清免费国产一区| 亚洲一二三四区| 国产精品久久国产精麻豆99网站 | ...xxx性欧美| 久久久久久亚洲综合| 欧美日韩成人在线一区| av一区二区久久| 国产一区二区三区在线观看免费视频| 亚洲一区二区三区精品在线| 欧美国产在线观看| 久久嫩草精品久久久久| 欧美一级在线免费| 欧美日韩亚洲高清一区二区| 97久久精品人人爽人人爽蜜臀| 国产一区二区三区在线观看免费视频| 亚洲v精品v日韩v欧美v专区| 亚洲欧美日韩久久| 中文字幕国产一区| 国产亚洲一区二区三区| 精品国产免费久久 | 日本久久一区二区三区| 成人精品视频网站| 国产99久久精品| 国模少妇一区二区三区| 精品一区二区精品| 久久99久久久欧美国产| 久草精品在线观看| 精品一区二区影视| 美国精品在线观看| 久久不见久久见中文字幕免费| 美日韩一区二区三区| 免费看日韩精品| 六月丁香婷婷久久| 国产一区二区在线视频| 国产在线日韩欧美| 国产精品18久久久久久久久久久久 | 国产99一区视频免费| 极品少妇一区二区三区精品视频| 亚洲午夜免费视频| 午夜av区久久| 日本aⅴ精品一区二区三区 | 成人综合在线网站| 成人免费高清在线观看| 91无套直看片红桃| 欧美日韩亚洲另类| 精品国产在天天线2019| 欧美国产日本视频| 一区二区理论电影在线观看| 亚洲午夜一区二区| 精品制服美女丁香| 成人午夜电影久久影院| 99久久婷婷国产| 欧美绝品在线观看成人午夜影视| 91精品国产福利| 欧美国产一区二区在线观看| 亚洲精品久久久蜜桃| 日韩精品高清不卡| 高清beeg欧美| 在线观看免费一区| 欧美r级电影在线观看| 亚洲欧洲在线观看av| 天堂午夜影视日韩欧美一区二区| 狠狠狠色丁香婷婷综合激情| 99久久精品久久久久久清纯| 欧美精品v日韩精品v韩国精品v| 日韩欧美黄色影院| 亚洲免费观看高清完整版在线| 日本中文字幕一区二区有限公司| 国产成人av资源| 欧美人狂配大交3d怪物一区| 久久久国产一区二区三区四区小说 | 99久久99久久免费精品蜜臀| 99re亚洲国产精品| 欧美成人猛片aaaaaaa| 国产精品电影一区二区三区| 日韩成人精品在线观看| 成人国产亚洲欧美成人综合网| 欧美视频一区二区三区四区| 国产午夜精品一区二区三区视频 | 国产精品不卡在线| 日韩国产精品久久久久久亚洲| 成人高清在线视频| 欧美一区二区三区的| 亚洲天堂2014| 国产乱子伦一区二区三区国色天香| 色94色欧美sute亚洲线路一久| 久久久久国产一区二区三区四区| 亚洲电影激情视频网站| 不卡的av电影在线观看| 精品国产一区二区三区久久影院| 一级精品视频在线观看宜春院| 国产大陆a不卡| 日韩三级伦理片妻子的秘密按摩| 亚洲视频香蕉人妖| 成人精品视频一区| 久久久久久一二三区| 麻豆久久一区二区| 欧美日韩一区国产| 亚洲欧美一区二区三区极速播放| 国产成人福利片| www国产成人免费观看视频 深夜成人网| 亚洲一区在线免费观看| 97超碰欧美中文字幕| 欧美激情一区二区三区全黄 | 日欧美一区二区| 欧美午夜精品久久久久久孕妇| 中文字幕欧美国产| 国产老女人精品毛片久久| 26uuu精品一区二区| 麻豆精品新av中文字幕| 欧美一区日本一区韩国一区| 视频在线观看国产精品| 欧美日本乱大交xxxxx| 天堂久久一区二区三区| 91麻豆精品国产无毒不卡在线观看| 天天影视网天天综合色在线播放| 欧美日韩在线一区二区| 五月激情综合婷婷|