📄 bccmd.c
字号:
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 + -