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

📄 bccmd.c

📁 bluetooth 开发应用bluez-utils-2.23
💻 C
📖 第 1 页 / 共 2 页
字号:
				continue;			pskey = storage[i].pskey;			break;		}	} else		pskey = strtol(argv[0] + 2, NULL, 16);	memset(array, 0, sizeof(array));	array[0] = pskey & 0xff;	array[1] = pskey >> 8;	array[2] = stores & 0xff;	array[3] = stores >> 8;	err = transport_read(transport, CSR_VARID_PS_SIZE, array, 8);	if (err < 0)		return err;	length = array[2] + (array[3] << 8);	if (length + 6 > sizeof(array) / 2)		return -EIO;	memset(array, 0, sizeof(array));	array[0] = pskey & 0xff;	array[1] = pskey >> 8;	array[2] = length & 0xff;	array[3] = length >> 8;	array[4] = stores & 0xff;	array[5] = stores >> 8;	err = transport_read(transport, CSR_VARID_PS, array, (length + 3) * 2);	if (err < 0)		return err;	switch (length) {	case 1:		value = array[6] | (array[7] << 8);		printf("%s: 0x%04x (%d)\n", csr_pskeytostr(pskey), value, value);		break;	case 2:		val32 = array[8] | (array[9] << 8) | (array[6] << 16) | (array[7] << 24);		printf("%s: 0x%08x (%d)\n", csr_pskeytostr(pskey), val32, val32);		break;	default:		printf("%s:", csr_pskeytostr(pskey));		for (i = 0; i < length; i++)			printf(" 0x%02x%02x", array[(i * 2) + 6], array[(i * 2) + 7]);		printf("\n");		break;	}	if (reset)		transport_write(transport, CSR_VARID_WARM_RESET, NULL, 0);	return err;}static int cmd_psset(int transport, int argc, char *argv[]){	uint8_t array[128];	uint16_t pskey, length, value, stores = CSR_STORES_PSRAM;	uint32_t val32;	int i, err, reset = 0;	memset(array, 0, sizeof(array));	OPT_PSKEY(2, &stores, &reset, NULL);	if (strncasecmp(argv[0], "0x", 2)) {		pskey = atoi(argv[0]);		for (i = 0; storage[i].pskey; i++) {			if (strcasecmp(storage[i].str, argv[0]))				continue;			pskey = storage[i].pskey;			break;		}	} else		pskey = strtol(argv[0] + 2, NULL, 16);	memset(array, 0, sizeof(array));	array[0] = pskey & 0xff;	array[1] = pskey >> 8;	array[2] = stores & 0xff;	array[3] = stores >> 8;	err = transport_read(transport, CSR_VARID_PS_SIZE, array, 8);	if (err < 0)		return err;	length = array[2] + (array[3] << 8);	if (length + 6 > sizeof(array) / 2)		return -EIO;	memset(array, 0, sizeof(array));	array[0] = pskey & 0xff;	array[1] = pskey >> 8;	array[2] = length & 0xff;	array[3] = length >> 8;	array[4] = stores & 0xff;	array[5] = stores >> 8;	argc--;	argv++;	switch (length) {	case 1:		if (argc != 1) {			errno = E2BIG;			return -1;		}		if (!strncasecmp(argv[0], "0x", 2))			value = strtol(argv[0] + 2, NULL, 16);		else			value = atoi(argv[0]);		array[6] = value & 0xff;		array[7] = value >> 8;		break;	case 2:		if (argc != 1) {			errno = E2BIG;			return -1;		}		if (!strncasecmp(argv[0], "0x", 2))			val32 = strtol(argv[0] + 2, NULL, 16);		else			val32 = atoi(argv[0]);		array[6] = (val32 & 0xff0000) >> 16;		array[7] = val32 >> 24;		array[8] = val32 & 0xff;		array[9] = (val32 & 0xff00) >> 8;		break;	default:		if (argc != length * 2) {			errno = EINVAL;			return -1;		}		for (i = 0; i < length * 2; i++)			if (!strncasecmp(argv[0], "0x", 2))				array[i + 6] = strtol(argv[i] + 2, NULL, 16);			else				array[i + 6] = atoi(argv[i]);		break;	}	err = transport_write(transport, CSR_VARID_PS, array, (length + 3) * 2);	if (err < 0)		return err;	if (reset)		transport_write(transport, CSR_VARID_WARM_RESET, NULL, 0);	return err;}static int cmd_psclr(int transport, int argc, char *argv[]){	uint8_t array[8];	uint16_t pskey, stores = CSR_STORES_PSRAM;	int i, err, reset = 0;	OPT_PSKEY(1, &stores, &reset, NULL);	if (strncasecmp(argv[0], "0x", 2)) {		pskey = atoi(argv[0]);		for (i = 0; storage[i].pskey; i++) {			if (strcasecmp(storage[i].str, argv[0]))				continue;			pskey = storage[i].pskey;			break;		}	} else		pskey = strtol(argv[0] + 2, NULL, 16);	memset(array, 0, sizeof(array));	array[0] = pskey & 0xff;	array[1] = pskey >> 8;	array[2] = stores & 0xff;	array[3] = stores >> 8;	err = transport_write(transport, CSR_VARID_PS_CLR_STORES, array, 8);	if (err < 0)		return err;	if (reset)		transport_write(transport, CSR_VARID_WARM_RESET, NULL, 0);	return err;}static int cmd_pslist(int transport, int argc, char *argv[]){	uint8_t array[8];	uint16_t pskey = 0x0000, length, stores = CSR_STORES_DEFAULT;	int err, reset = 0;	OPT_PSKEY(0, &stores, &reset, NULL);	while (1) {		memset(array, 0, sizeof(array));		array[0] = pskey & 0xff;		array[1] = pskey >> 8;		array[2] = stores & 0xff;		array[3] = stores >> 8;		err = transport_read(transport, CSR_VARID_PS_NEXT, array, 8);		if (err < 0)			break;		pskey = array[4] + (array[5] << 8);		if (pskey == 0x0000)			break;		memset(array, 0, sizeof(array));		array[0] = pskey & 0xff;		array[1] = pskey >> 8;		array[2] = stores & 0xff;		array[3] = stores >> 8;		err = transport_read(transport, CSR_VARID_PS_SIZE, array, 8);		if (err < 0)			continue;		length = array[2] + (array[3] << 8);		printf("0x%04x - %s (%d bytes)\n", pskey,					csr_pskeytostr(pskey), length * 2);	}	if (reset)		transport_write(transport, CSR_VARID_WARM_RESET, NULL, 0);	return 0;}static int cmd_psread(int transport, int argc, char *argv[]){	uint8_t array[256];	uint16_t pskey = 0x0000, length, stores = CSR_STORES_DEFAULT;	char *str, val[7];	int i, err, reset = 0;	OPT_PSKEY(0, &stores, &reset, NULL);	while (1) {		memset(array, 0, sizeof(array));		array[0] = pskey & 0xff;		array[1] = pskey >> 8;		array[2] = stores & 0xff;		array[3] = stores >> 8;		err = transport_read(transport, CSR_VARID_PS_NEXT, array, 8);		if (err < 0)			break;		pskey = array[4] + (array[5] << 8);		if (pskey == 0x0000)			break;		memset(array, 0, sizeof(array));		array[0] = pskey & 0xff;		array[1] = pskey >> 8;		array[2] = stores & 0xff;		array[3] = stores >> 8;		err = transport_read(transport, CSR_VARID_PS_SIZE, array, 8);		if (err < 0)			continue;		length = array[2] + (array[3] << 8);		if (length + 6 > sizeof(array) / 2)			continue;		memset(array, 0, sizeof(array));		array[0] = pskey & 0xff;		array[1] = pskey >> 8;		array[2] = length & 0xff;		array[3] = length >> 8;		array[4] = stores & 0xff;		array[5] = stores >> 8;		err = transport_read(transport, CSR_VARID_PS, array, (length + 3) * 2);		if (err < 0)			continue;		str = csr_pskeytoval(pskey);		if (!strcasecmp(str, "UNKNOWN")) {			sprintf(val, "0x%04x", pskey);			str = NULL;		}		printf("// %s%s\n&%04x =", str ? "PSKEY_" : "", 						str ? str : val, pskey);		for (i = 0; i < length; i++)			printf(" %02x%02x", array[(i * 2) + 7], array[(i * 2) + 6]);		printf("\n");	}	if (reset)		transport_write(transport, CSR_VARID_WARM_RESET, NULL, 0);	return 0;}static int cmd_psload(int transport, int argc, char *argv[]){	uint8_t array[256];	uint16_t pskey, length, size, stores = CSR_STORES_PSRAM;	char *str, val[7];	int err, reset = 0;	OPT_PSKEY(1, &stores, &reset, NULL);	psr_read(argv[0]);	memset(array, 0, sizeof(array));	size = sizeof(array) - 6;	while (psr_get(&pskey, array + 6, &size) == 0) {		str = csr_pskeytoval(pskey);		if (!strcasecmp(str, "UNKNOWN")) {			sprintf(val, "0x%04x", pskey);			str = NULL;		}		printf("Loading %s%s ... ", str ? "PSKEY_" : "",							str ? str : val);		fflush(stdout);		length = size / 2;		array[0] = pskey & 0xff;		array[1] = pskey >> 8;		array[2] = length & 0xff;		array[3] = length >> 8;		array[4] = stores & 0xff;		array[5] = stores >> 8;		err = transport_write(transport, CSR_VARID_PS, array, size + 6);		printf("%s\n", err < 0 ? "failed" : "done");		memset(array, 0, sizeof(array));		size = sizeof(array) - 6;	}	if (reset)		transport_write(transport, CSR_VARID_WARM_RESET, NULL, 0);	return 0;}static int cmd_pscheck(int transport, int argc, char *argv[]){	uint8_t array[256];	uint16_t pskey, size;	int i;	OPT_HELP(1, NULL);	psr_read(argv[0]);	while (psr_get(&pskey, array, &size) == 0) {		printf("0x%04x =", pskey);		for (i = 0; i < size; i++)			printf(" 0x%02x", array[i]);		printf("\n");	}	return 0;}static struct {	char *str;	int (*func)(int transport, int argc, char *argv[]);	char *arg;	char *doc;} commands[] = {	{ "builddef",  cmd_builddef,  "",              "Get build definitions"          },	{ "keylen",    cmd_keylen,    "<handle>",      "Get current crypt key length"   },	{ "clock",     cmd_clock,     "",              "Get local Bluetooth clock"      },	{ "rand",      cmd_rand,      "",              "Get random number"              },	{ "buildname", cmd_buildname, "",              "Get the full build name"        },	{ "panicarg",  cmd_panicarg,  "",              "Get panic code argument"        },	{ "faultarg",  cmd_faultarg,  "",              "Get fault code argument"        },	{ "coldreset", cmd_coldreset, "",              "Perform cold reset"             },	{ "warmreset", cmd_warmreset, "",              "Perform warm reset"             },	{ "disabletx", cmd_disabletx, "",              "Disable TX on the device"       },	{ "enabletx",  cmd_enabletx,  "",              "Enable TX on the device"        },	{ "memtypes",  cmd_memtypes,  NULL,            "Get memory types"               },	{ "psget",     cmd_psget,     "<key>",         "Get value for PS key"           },	{ "psset",     cmd_psset,     "<key> <value>", "Set value for PS key"           },	{ "psclr",     cmd_psclr,     "<key>",         "Clear value for PS key"         },	{ "pslist",    cmd_pslist,    NULL,            "List all PS keys"               },	{ "psread",    cmd_psread,    NULL,            "Read all PS keys"               },	{ "psload",    cmd_psload,    "<file>",        "Load all PS keys from PSR file" },	{ "pscheck",   cmd_pscheck,   "<file>",        "Check PSR file"                 },	{ NULL }};static void usage(void){	int i, pos = 0;	printf("bccmd - Utility for the CSR BCCMD interface\n\n");	printf("Usage:\n"		"\tbccmd [options] <command>\n\n");	printf("Options:\n"		"\t-t <transport>     Select the transport\n"		"\t-d <device>        Select the device\n"		"\t-h, --help         Display help\n"		"\n");	printf("Transports:\n"		"\tHCI USB BCSP H4 3WIRE\n\n");	printf("Commands:\n");	for (i = 0; commands[i].str; i++)		printf("\t%-10s %-14s\t%s\n", commands[i].str,		commands[i].arg ? commands[i].arg : " ",		commands[i].doc);	printf("\n");	printf("Keys:\n\t");	for (i = 0; storage[i].pskey; i++) {		printf("%s ", storage[i].str);		pos += strlen(storage[i].str) + 1;		if (pos > 60) {			printf("\n\t");			pos = 0;		}	}	printf("\n");}static struct option main_options[] = {	{ "transport",	1, 0, 't' },	{ "device",	1, 0, 'd' },	{ "help",	0, 0, 'h' },	{ 0, 0, 0, 0 }};int main(int argc, char *argv[]){	char *device = NULL;	int i, err, opt, transport = CSR_TRANSPORT_HCI;	while ((opt=getopt_long(argc, argv, "+t:d:i:h", main_options, NULL)) != EOF) {		switch (opt) {		case 't':			if (!strcasecmp(optarg, "hci"))				transport = CSR_TRANSPORT_HCI;			else if (!strcasecmp(optarg, "usb"))				transport = CSR_TRANSPORT_USB;			else if (!strcasecmp(optarg, "bcsp"))				transport = CSR_TRANSPORT_BCSP;			else if (!strcasecmp(optarg, "h4"))				transport = CSR_TRANSPORT_H4;			else if (!strcasecmp(optarg, "h5"))				transport = CSR_TRANSPORT_3WIRE;			else if (!strcasecmp(optarg, "3wire"))				transport = CSR_TRANSPORT_3WIRE;			else if (!strcasecmp(optarg, "twutl"))				transport = CSR_TRANSPORT_3WIRE;			else				transport = CSR_TRANSPORT_UNKNOWN;			break;		case 'd':		case 'i':			device = strdup(optarg);			break;		case 'h':		default:			usage();			exit(0);		}	}	argc -= optind;	argv += optind;	optind = 0;	if (argc < 1) {		usage();		exit(1);	}	if (transport_open(transport, device) < 0)		exit(1);	if (device)		free(device);	for (i = 0; commands[i].str; i++) {		if (strcasecmp(commands[i].str, argv[0]))			continue;		err = commands[i].func(transport, argc, argv);		transport_close(transport);		if (err < 0) {			fprintf(stderr, "Can't execute command: %s (%d)\n",							strerror(errno), errno);			exit(1);		}		exit(0);	}	fprintf(stderr, "Unsupported command\n");	transport_close(transport);	exit(1);}

⌨️ 快捷键说明

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