📄 csr.c
字号:
{ 2033, "Sniff 44 (2005-04-18)" }, { 2034, "Sniff 44 (2005-04-18)" }, { 0, }};char *csr_buildidtostr(uint16_t id){ static char str[12]; int i; for (i = 0; csr_map[i].id; i++) if (csr_map[i].id == id) return csr_map[i].str; snprintf(str, 11, "Build %d", id); return str;}char *csr_chipvertostr(uint16_t ver, uint16_t rev){ switch (ver) { case 0x00: return "BlueCore01a"; case 0x01: if (rev == 0x64) return "BlueCore01b (ES)"; else return "BlueCore01b"; case 0x02: switch (rev) { case 0x89: return "BlueCore02-External (ES2)"; case 0x8a: return "BlueCore02-External"; case 0x28: return "BlueCore02-ROM/Audio/Flash"; default: return "BlueCore02"; } case 0x03: switch (rev) { case 0x43: return "BlueCore3-MM"; case 0x15: return "BlueCore3-ROM"; case 0xe2: return "BlueCore3-Flash"; case 0x26: return "BlueCore4-External"; case 0x30: return "BlueCore4-ROM"; default: return "BlueCore3 or BlueCore4"; } default: return "Unknown"; }}char *csr_pskeytostr(uint16_t pskey){ switch (pskey) { case CSR_PSKEY_ENC_KEY_LMIN: return "Minimum encryption key length"; case CSR_PSKEY_ENC_KEY_LMAX: return "Maximum encryption key length"; case CSR_PSKEY_LOCAL_SUPPORTED_FEATURES: return "Local supported features block"; case CSR_PSKEY_HCI_LMP_LOCAL_VERSION: return "The HCI and LMP version reported locally"; case CSR_PSKEY_LMP_REMOTE_VERSION: return "The LMP version reported remotely"; case CSR_PSKEY_HOSTIO_MAP_SCO_PCM: return "Map SCO over PCM"; case CSR_PSKEY_UART_BAUDRATE: return "UART Baud rate"; case CSR_PSKEY_HOST_INTERFACE: return "Host interface"; case CSR_PSKEY_USB_VENDOR_ID: return "USB vendor identifier"; case CSR_PSKEY_USB_PRODUCT_ID: return "USB product identifier"; case CSR_PSKEY_USB_DFU_PRODUCT_ID: return "USB DFU product ID"; case CSR_PSKEY_INITIAL_BOOTMODE: return "Initial device bootmode"; default: return "Unknown"; }}int csr_read_varid_complex(int dd, uint16_t seqnum, uint16_t varid, uint8_t *value, uint16_t length){ unsigned char cmd[] = { 0x00, 0x00, ((length / 2) + 5) & 0xff, ((length / 2) + 5) >> 8, seqnum & 0xff, seqnum >> 8, varid & 0xff, varid >> 8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; unsigned char cp[254], rp[254]; struct hci_request rq; memset(&cp, 0, sizeof(cp)); cp[0] = 0xc2; memcpy(cp + 1, cmd, sizeof(cmd)); memcpy(cp + 11, value, length); memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_VENDOR_CMD; rq.ocf = 0x00; rq.event = EVT_VENDOR; rq.cparam = cp; rq.clen = sizeof(cmd) + 1; rq.rparam = rp; rq.rlen = sizeof(rp); if (hci_send_req(dd, &rq, 2000) < 0) return -1; if (rp[0] != 0xc2) { errno = EIO; return -1; } if ((rp[9] + (rp[10] << 8)) != 0) { errno = ENXIO; return -1; } memcpy(value, rp + 11, length); return 0;}int csr_read_varid_uint16(int dd, uint16_t seqnum, uint16_t varid, uint16_t *value){ unsigned char cmd[] = { 0x00, 0x00, 0x09, 0x00, seqnum & 0xff, seqnum >> 8, varid & 0xff, varid >> 8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; unsigned char cp[254], rp[254]; struct hci_request rq; memset(&cp, 0, sizeof(cp)); cp[0] = 0xc2; memcpy(cp + 1, cmd, sizeof(cmd)); memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_VENDOR_CMD; rq.ocf = 0x00; rq.event = EVT_VENDOR; rq.cparam = cp; rq.clen = sizeof(cmd) + 1; rq.rparam = rp; rq.rlen = sizeof(rp); if (hci_send_req(dd, &rq, 2000) < 0) return -1; if (rp[0] != 0xc2) { errno = EIO; return -1; } if ((rp[9] + (rp[10] << 8)) != 0) { errno = ENXIO; return -1; } *value = rp[11] + (rp[12] << 8); return 0;}int csr_read_varid_uint32(int dd, uint16_t seqnum, uint16_t varid, uint32_t *value){ unsigned char cmd[] = { 0x00, 0x00, 0x09, 0x00, seqnum & 0xff, seqnum >> 8, varid & 0xff, varid >> 8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; unsigned char cp[254], rp[254]; struct hci_request rq; memset(&cp, 0, sizeof(cp)); cp[0] = 0xc2; memcpy(cp + 1, cmd, sizeof(cmd)); memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_VENDOR_CMD; rq.ocf = 0x00; rq.event = EVT_VENDOR; rq.cparam = cp; rq.clen = sizeof(cmd) + 1; rq.rparam = rp; rq.rlen = sizeof(rp); if (hci_send_req(dd, &rq, 2000) < 0) return -1; if (rp[0] != 0xc2) { errno = EIO; return -1; } if ((rp[9] + (rp[10] << 8)) != 0) { errno = ENXIO; return -1; } *value = ((rp[11] + (rp[12] << 8)) << 16) + (rp[13] + (rp[14] << 8)); return 0;}int csr_read_pskey_complex(int dd, uint16_t seqnum, uint16_t pskey, uint8_t *value, uint16_t length){ unsigned char cmd[] = { 0x00, 0x00, ((length / 2) + 8) & 0xff, ((length / 2) + 8) >> 8, seqnum & 0xff, seqnum >> 8, 0x03, 0x70, 0x00, 0x00, pskey & 0xff, pskey >> 8, (length / 2) & 0xff, (length / 2) >> 8, 0x00, 0x00, 0x00, 0x00 }; unsigned char cp[254], rp[254]; struct hci_request rq; memset(&cp, 0, sizeof(cp)); cp[0] = 0xc2; memcpy(cp + 1, cmd, sizeof(cmd)); memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_VENDOR_CMD; rq.ocf = 0x00; rq.event = EVT_VENDOR; rq.cparam = cp; rq.clen = sizeof(cmd) + 1; rq.rparam = rp; rq.rlen = sizeof(rp); if (hci_send_req(dd, &rq, 2000) < 0) return -1; if (rp[0] != 0xc2) { errno = EIO; return -1; } if ((rp[9] + (rp[10] << 8)) != 0) { errno = ENXIO; return -1; } memcpy(value, rp + 17, length); return 0;}int csr_read_pskey_uint16(int dd, uint16_t seqnum, uint16_t pskey, uint16_t *value){ unsigned char cmd[] = { 0x00, 0x00, 0x09, 0x00, seqnum & 0xff, seqnum >> 8, 0x03, 0x70, 0x00, 0x00, pskey & 0xff, pskey >> 8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 }; unsigned char cp[254], rp[254]; struct hci_request rq; memset(&cp, 0, sizeof(cp)); cp[0] = 0xc2; memcpy(cp + 1, cmd, sizeof(cmd)); memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_VENDOR_CMD; rq.ocf = 0x00; rq.event = EVT_VENDOR; rq.cparam = cp; rq.clen = sizeof(cmd) + 1; rq.rparam = rp; rq.rlen = sizeof(rp); if (hci_send_req(dd, &rq, 2000) < 0) return -1; if (rp[0] != 0xc2) { errno = EIO; return -1; } if ((rp[9] + (rp[10] << 8)) != 0) { errno = ENXIO; return -1; } *value = rp[17] + (rp[18] << 8); return 0;}int csr_write_pskey_uint16(int dd, uint16_t seqnum, uint16_t pskey, uint16_t value){ unsigned char cmd[] = { 0x02, 0x00, 0x09, 0x00, seqnum & 0xff, seqnum >> 8, 0x03, 0x70, 0x00, 0x00, pskey & 0xff, pskey >> 8, 0x01, 0x00, 0x00, 0x00, value & 0xff, value >> 8 }; unsigned char cp[254], rp[254]; struct hci_request rq; memset(&cp, 0, sizeof(cp)); cp[0] = 0xc2; memcpy(cp + 1, cmd, sizeof(cmd)); memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_VENDOR_CMD; rq.ocf = 0x00; rq.event = EVT_VENDOR; rq.cparam = cp; rq.clen = sizeof(cmd) + 1; rq.rparam = rp; rq.rlen = sizeof(rp); if (hci_send_req(dd, &rq, 2000) < 0) return -1; if (rp[0] != 0xc2) { errno = EIO; return -1; } if ((rp[9] + (rp[10] << 8)) != 0) { errno = ENXIO; return -1; } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -