summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2003-07-02 22:27:41 +0000
committerMarcel Holtmann <marcel@holtmann.org>2003-07-02 22:27:41 +0000
commit49ceef7a27ee6112148f5ef5fe37f1ee6f1f44ea (patch)
tree2db603fc6d14f4666a68776e0bf8b459e0dad146
parent529a4a6e9be63df61d41a82787adae204822a6e7 (diff)
New code for CSR specific revision information
-rw-r--r--tools/Makefile.am2
-rw-r--r--tools/csr.c347
-rw-r--r--tools/csr.h35
-rw-r--r--tools/hciconfig.c126
4 files changed, 442 insertions, 68 deletions
diff --git a/tools/Makefile.am b/tools/Makefile.am
index 0513c83bb..180c0cc19 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -7,6 +7,8 @@ mandir = $(prefix)/usr/share/man
sbin_PROGRAMS = hciattach hciconfig
bin_PROGRAMS = hcitool l2ping
+hciconfig_SOURCES = hciconfig.c csr.h csr.c
+
man_MANS = hciattach.8 hciconfig.8 hcitool.1 l2ping.1
noinst_PROGRAMS = ppporc
diff --git a/tools/csr.c b/tools/csr.c
new file mode 100644
index 000000000..e2069cd77
--- /dev/null
+++ b/tools/csr.c
@@ -0,0 +1,347 @@
+/*
+ *
+ * CSR BlueCore specific functions
+ *
+ * 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 <stdio.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/socket.h>
+
+#include <bluetooth/bluetooth.h>
+#include <bluetooth/hci.h>
+#include <bluetooth/hci_lib.h>
+
+#include "csr.h"
+
+
+static struct {
+ uint16_t id;
+ char *str;
+} csr_map[] = {
+ { 111, "HCI 11.0" },
+ { 112, "HCI 11.1" },
+ { 114, "HCI 11.2" },
+ { 115, "HCI 11.3" },
+ { 117, "HCI 12.0" },
+ { 119, "HCI 12.1" },
+ { 133, "HCI 12.2" },
+ { 134, "HCI 12.3" },
+ { 162, "HCI 12.4" },
+ { 165, "HCI 12.5" },
+ { 169, "HCI 12.6" },
+ { 188, "HCI 12.7" },
+ { 218, "HCI 12.8" },
+ { 283, "HCI 12.9" },
+ { 203, "HCI 13.2" },
+ { 204, "HCI 13.2" },
+ { 210, "HCI 13.3" },
+ { 211, "HCI 13.3" },
+ { 213, "HCI 13.4" },
+ { 214, "HCI 13.4" },
+ { 225, "HCI 13.5" },
+ { 226, "HCI 13.5" },
+ { 237, "HCI 13.6" },
+ { 238, "HCI 13.6" },
+ { 242, "HCI 14.0" },
+ { 243, "HCI 14.0" },
+ { 244, "HCI 14.0" },
+ { 245, "HCI 14.0" },
+ { 254, "HCI 13.7" },
+ { 255, "HCI 13.7" },
+ { 264, "HCI 14.1" },
+ { 265, "HCI 14.1" },
+ { 267, "HCI 14.2" },
+ { 268, "HCI 14.2" },
+ { 272, "HCI 14.3" },
+ { 273, "HCI 14.3" },
+ { 274, "HCI 13.8" },
+ { 275, "HCI 13.8" },
+ { 286, "HCI 13.9" },
+ { 287, "HCI 13.9" },
+ { 309, "HCI 13.10" },
+ { 310, "HCI 13.10" },
+ { 313, "HCI 14.4" },
+ { 314, "HCI 14.4" },
+ { 323, "HCI 14.5" },
+ { 324, "HCI 14.5" },
+ { 336, "HCI 14.6" },
+ { 337, "HCI 14.6" },
+ { 351, "HCI 13.11" },
+ { 352, "HCI 13.11" },
+ { 362, "HCI 15.0" },
+ { 363, "HCI 15.0" },
+ { 364, "HCI 15.0" },
+ { 365, "HCI 15.0" },
+ { 373, "HCI 14.7" },
+ { 374, "HCI 14.7" },
+ { 379, "HCI 15.1" },
+ { 380, "HCI 15.1" },
+ { 381, "HCI 15.1" },
+ { 382, "HCI 15.1" },
+ { 392, "HCI 15.2" },
+ { 393, "HCI 15.2" },
+ { 394, "HCI 15.2" },
+ { 395, "HCI 15.2" },
+ { 436, "HCI 16.0" },
+ { 437, "HCI 16.0" },
+ { 438, "HCI 16.0" },
+ { 439, "HCI 16.0" },
+ { 443, "HCI 15.3" },
+ { 444, "HCI 15.3" },
+ { 465, "HCI 16.1" },
+ { 466, "HCI 16.1" },
+ { 467, "HCI 16.1" },
+ { 468, "HCI 16.1" },
+ { 487, "HCI 14.8" },
+ { 488, "HCI 14.8" },
+ { 492, "HCI 16.2" },
+ { 493, "HCI 16.2" },
+ { 495, "HCI 16.2" },
+ { 496, "HCI 16.2" },
+ { 502, "HCI 16.1.1" },
+ { 503, "HCI 16.1.1" },
+ { 504, "HCI 16.1.1" },
+ { 505, "HCI 16.1.1" },
+ { 506, "HCI 16.1.2" },
+ { 507, "HCI 16.1.2" },
+ { 508, "HCI 16.1.2" },
+ { 509, "HCI 16.1.2" },
+ { 516, "HCI 16.3" },
+ { 517, "HCI 16.3" },
+ { 518, "HCI 16.3" },
+ { 519, "HCI 16.3" },
+ { 523, "HCI 16.4" },
+ { 524, "HCI 16.4" },
+ { 525, "HCI 16.4" },
+ { 526, "HCI 16.4" },
+ { 553, "HCI 15.3" },
+ { 554, "HCI 15.3" },
+ { 562, "HCI 16.5" },
+ { 563, "HCI 16.5" },
+ { 564, "HCI 16.5" },
+ { 565, "HCI 16.5" },
+ { 593, "HCI 17.0" },
+ { 594, "HCI 17.0" },
+ { 595, "HCI 17.0" },
+ { 599, "HCI 17.0" },
+ { 600, "HCI 17.0" },
+ { 608, "HCI 13.10.1" },
+ { 609, "HCI 13.10.1" },
+ { 613, "HCI 17.1" },
+ { 614, "HCI 17.1" },
+ { 615, "HCI 17.1" },
+ { 616, "HCI 17.1" },
+ { 618, "HCI 17.1" },
+ { 624, "HCI 17.2" },
+ { 625, "HCI 17.2" },
+ { 626, "HCI 17.2" },
+ { 627, "HCI 17.2" },
+ { 637, "HCI 16.6" },
+ { 638, "HCI 16.6" },
+ { 639, "HCI 16.6" },
+ { 640, "HCI 16.6" },
+ { 642, "HCI 13.10.2" },
+ { 643, "HCI 13.10.2" },
+ { 644, "HCI 13.10.3" },
+ { 645, "HCI 13.10.3" },
+ { 668, "HCI 13.10.4" },
+ { 669, "HCI 13.10.4" },
+ { 681, "HCI 16.7" },
+ { 682, "HCI 16.7" },
+ { 683, "HCI 16.7" },
+ { 684, "HCI 16.7" },
+ { 704, "HCI 16.8" },
+ { 718, "HCI 16.4.1" },
+ { 719, "HCI 16.4.1" },
+ { 720, "HCI 16.4.1" },
+ { 721, "HCI 16.4.1" },
+ { 722, "HCI 16.7.1" },
+ { 723, "HCI 16.7.1" },
+ { 724, "HCI 16.7.1" },
+ { 725, "HCI 16.7.1" },
+ { 731, "HCI 16.7.2" },
+ { 732, "HCI 16.7.2" },
+ { 733, "HCI 16.7.2" },
+ { 734, "HCI 16.7.2" },
+ { 735, "HCI 16.4.2" },
+ { 736, "HCI 16.4.2" },
+ { 737, "HCI 16.4.2" },
+ { 738, "HCI 16.4.2" },
+ { 750, "HCI 16.7.3" },
+ { 751, "HCI 16.7.3" },
+ { 752, "HCI 16.7.3" },
+ { 753, "HCI 16.7.3" },
+ { 760, "HCI 16.7.4" },
+ { 761, "HCI 16.7.4" },
+ { 762, "HCI 16.7.4" },
+ { 763, "HCI 16.7.4" },
+ { 770, "HCI 16.9" },
+ { 771, "HCI 16.9" },
+ { 772, "HCI 16.9" },
+ { 773, "HCI 16.9" },
+ { 774, "HCI 17.3" },
+ { 775, "HCI 17.3" },
+ { 776, "HCI 17.3" },
+ { 777, "HCI 17.3" },
+ { 781, "HCI 16.7.5" },
+ { 786, "HCI 16.10" },
+ { 787, "HCI 16.10" },
+ { 788, "HCI 16.10" },
+ { 789, "HCI 16.10" },
+ { 791, "HCI 16.4.3" },
+ { 792, "HCI 16.4.3" },
+ { 793, "HCI 16.4.3" },
+ { 794, "HCI 16.4.3" },
+ { 798, "HCI 16.11" },
+ { 799, "HCI 16.11" },
+ { 800, "HCI 16.11" },
+ { 801, "HCI 16.11" },
+ { 806, "HCI 16.7.5" },
+ { 807, "HCI 16.12" },
+ { 808, "HCI 16.12" },
+ { 809, "HCI 16.12" },
+ { 810, "HCI 16.12" },
+ { 817, "HCI 16.13" },
+ { 818, "HCI 16.13" },
+ { 819, "HCI 16.13" },
+ { 820, "HCI 16.13" },
+ { 823, "HCI 13.10.5" },
+ { 824, "HCI 13.10.5" },
+ { 826, "HCI 16.14" },
+ { 827, "HCI 16.14" },
+ { 828, "HCI 16.14" },
+ { 829, "HCI 16.14" },
+ { 843, "HCI 17.3.1" },
+ { 856, "HCI 17.3.2" },
+ { 857, "HCI 17.3.2" },
+ { 858, "HCI 17.3.2" },
+ { 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:
+ if (rev == 0x89)
+ return "BlueCore02 (ES2)";
+ else
+ return "BlueCore02";
+ default:
+ return "Unknown";
+ }
+}
+
+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)
+ return -1;
+
+ *value = rp[11] + (rp[12] << 8);
+
+ 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)
+ return -1;
+
+ *value = rp[17] + (rp[18] << 8);
+
+ return 0;
+}
diff --git a/tools/csr.h b/tools/csr.h
new file mode 100644
index 000000000..254f108ef
--- /dev/null
+++ b/tools/csr.h
@@ -0,0 +1,35 @@
+/*
+ *
+ * CSR BlueCore specific functions
+ *
+ * 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
+ *
+ */
+
+#define CSR_VARID_BUILDID 0x2819
+#define CSR_VARID_CHIPVER 0x281a
+#define CSR_VARID_CHIPREV 0x281b
+#define CSR_VARID_MAX_CRYPT_KEY_LENGTH 0x282c
+
+#define CSR_PSKEY_HOSTIO_MAP_SCO_PCM 0x01ab
+
+char *csr_buildidtostr(uint16_t id);
+char *csr_chipvertostr(uint16_t ver, uint16_t rev);
+
+int csr_read_varid_uint16(int dd, uint16_t seqnum, uint16_t varid, uint16_t *value);
+int csr_read_pskey_uint16(int dd, uint16_t seqnum, uint16_t pskey, uint16_t *value);
diff --git a/tools/hciconfig.c b/tools/hciconfig.c
index 538e03bcc..aa3d9ab43 100644
--- a/tools/hciconfig.c
+++ b/tools/hciconfig.c
@@ -43,6 +43,8 @@
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>
+#include "csr.h"
+
extern int optind,opterr,optopt;
extern char *optarg;
@@ -268,7 +270,7 @@ void cmd_aclmtu(int ctl, int hdev, char *opt)
*((uint16_t *)&dr.dev_opt + 1) = mtu;
*((uint16_t *)&dr.dev_opt + 0) = mpkt;
-
+
if (ioctl(ctl, HCISETACLMTU, (unsigned long)&dr) < 0) {
printf("Can't set ACL mtu on hci%d. %s(%d)\n",
hdev, strerror(errno), errno);
@@ -608,21 +610,21 @@ void cmd_inq_parms(int ctl, int hdev, char *opt)
printf("Invalid argument format\n");
exit(1);
}
-
+
rq.ogf = OGF_HOST_CTL;
rq.ocf = OCF_WRITE_INQ_ACTIVITY;
rq.cparam = &cp;
rq.clen = WRITE_INQ_ACTIVITY_CP_SIZE;
-
+
cp.window = htobs((uint16_t)window);
cp.interval = htobs((uint16_t)interval);
-
+
if (window < 0x12 || window > 0x1000)
printf("Warning: inquiry window out of range!\n");
-
+
if (interval < 0x12 || interval > 0x1000)
printf("Warning: inquiry interval out of range!\n");
-
+
if (hci_send_req(s, &rq, 1000) < 0) {
printf("Can't set inquiry parameters name on hci%d. %s(%d)\n",
hdev, strerror(errno), errno);
@@ -631,12 +633,12 @@ void cmd_inq_parms(int ctl, int hdev, char *opt)
} else {
uint16_t window, interval;
read_inq_activity_rp rp;
-
+
rq.ogf = OGF_HOST_CTL;
rq.ocf = OCF_READ_INQ_ACTIVITY;
rq.rparam = &rp;
rq.rlen = READ_INQ_ACTIVITY_RP_SIZE;
-
+
if (hci_send_req(s, &rq, 1000) < 0) {
printf("Can't read inquiry parameters on hci%d. %s(%d)\n",
hdev, strerror(errno), errno);
@@ -648,7 +650,7 @@ void cmd_inq_parms(int ctl, int hdev, char *opt)
exit(1);
}
print_dev_hdr(&di);
-
+
window = btohs(rp.window);
interval = btohs(rp.interval);
printf("\tInquiry interval: %u slots (%.2f ms), window: %u slots (%.2f ms)\n",
@@ -675,21 +677,21 @@ void cmd_page_parms(int ctl, int hdev, char *opt)
printf("Invalid argument format\n");
exit(1);
}
-
+
rq.ogf = OGF_HOST_CTL;
rq.ocf = OCF_WRITE_PAGE_ACTIVITY;
rq.cparam = &cp;
rq.clen = WRITE_PAGE_ACTIVITY_CP_SIZE;
-
+
cp.window = htobs((uint16_t)window);
cp.interval = htobs((uint16_t)interval);
-
+
if (window < 0x12 || window > 0x1000)
printf("Warning: page window out of range!\n");
-
+
if (interval < 0x12 || interval > 0x1000)
printf("Warning: page interval out of range!\n");
-
+
if (hci_send_req(s, &rq, 1000) < 0) {
printf("Can't set page parameters name on hci%d. %s(%d)\n",
hdev, strerror(errno), errno);
@@ -698,12 +700,12 @@ void cmd_page_parms(int ctl, int hdev, char *opt)
} else {
uint16_t window, interval;
read_page_activity_rp rp;
-
+
rq.ogf = OGF_HOST_CTL;
rq.ocf = OCF_READ_PAGE_ACTIVITY;
rq.rparam = &rp;
rq.rlen = READ_PAGE_ACTIVITY_RP_SIZE;
-
+
if (hci_send_req(s, &rq, 1000) < 0) {
printf("Can't read page parameters on hci%d. %s(%d)\n",
hdev, strerror(errno), errno);
@@ -715,12 +717,12 @@ void cmd_page_parms(int ctl, int hdev, char *opt)
exit(1);
}
print_dev_hdr(&di);
-
+
window = btohs(rp.window);
interval = btohs(rp.interval);
printf("\tPage interval: %u slots (%.2f ms), window: %u slots (%.2f ms)\n",
interval, (float)interval * 0.625, window, (float)window * 0.625);
- }
+ }
}
void cmd_page_to(int ctl, int hdev, char *opt)
@@ -742,17 +744,17 @@ void cmd_page_to(int ctl, int hdev, char *opt)
printf("Invalid argument format\n");
exit(1);
}
-
+
rq.ogf = OGF_HOST_CTL;
rq.ocf = OCF_WRITE_PAGE_TIMEOUT;
rq.cparam = &cp;
rq.clen = WRITE_PAGE_TIMEOUT_CP_SIZE;
-
+
cp.timeout = htobs((uint16_t)timeout);
-
+
if (timeout < 0x01 || timeout > 0xFFFF)
printf("Warning: page timeout out of range!\n");
-
+
if (hci_send_req(s, &rq, 1000) < 0) {
printf("Can't set page timeout on hci%d. %s(%d)\n",
hdev, strerror(errno), errno);
@@ -761,12 +763,12 @@ void cmd_page_to(int ctl, int hdev, char *opt)
} else {
uint16_t timeout;
read_page_timeout_rp rp;
-
+
rq.ogf = OGF_HOST_CTL;
rq.ocf = OCF_READ_PAGE_TIMEOUT;
rq.rparam = &rp;
rq.rlen = READ_PAGE_TIMEOUT_RP_SIZE;
-
+
if (hci_send_req(s, &rq, 1000) < 0) {
printf("Can't read page timeout on hci%d. %s(%d)\n",
hdev, strerror(errno), errno);
@@ -782,7 +784,7 @@ void cmd_page_to(int ctl, int hdev, char *opt)
timeout = btohs(rp.timeout);
printf("\tPage timeout: %u slots (%.2f ms)\n",
timeout, (float)timeout * 0.625);
- }
+ }
}
static void print_rev_ericsson(int dd)
@@ -791,12 +793,12 @@ static void print_rev_ericsson(int dd)
unsigned char buf[102];
memset(&rq, 0, sizeof(rq));
- rq.ogf = 0x3f;
- rq.ocf = 0x000f;
+ rq.ogf = 0x3f;
+ rq.ocf = 0x000f;
rq.cparam = NULL;
- rq.clen = 0;
+ rq.clen = 0;
rq.rparam = &buf;
- rq.rlen = sizeof(buf);
+ rq.rlen = sizeof(buf);
if (hci_send_req(dd, &rq, 1000) < 0) {
printf("\n Can't read revision info. %s(%d)\n", strerror(errno), errno);
@@ -806,40 +808,28 @@ static void print_rev_ericsson(int dd)
printf("\t%s\n", buf + 1);
}
-static struct {
- char *str;
- uint16_t rev;
-} csr_map[] = {
- { "HCI 11.2 (bc01b)", 114 },
- { "HCI 11.3 (bc01b)", 115 },
- { "HCI 12.1 (bc01b)", 119 },
- { "HCI 12.3 (bc01b)", 134 },
- { "HCI 12.7 (bc01b)", 188 },
- { "HCI 12.8 (bc01b)", 218 },
- { "HCI 12.9 (bc01b)", 283 },
- { "HCI 13.10 (bc01b)", 309 },
- { "HCI 13.11 (bc01b)", 351 },
- { "HCI 16.4 (bc01b)", 523 },
- { "HCI 14.3 (bc02x)", 272 },
- { "HCI 14.6 (bc02x)", 336 },
- { "HCI 14.7 (bc02x)", 373 },
- { "HCI 14.8 (bc02x)", 487 },
- { "HCI 15.3 (bc02x)", 443 },
- { "HCI 16.4 (bc02x)", 525 },
- { NULL }
-};
-
-static void print_rev_csr(uint16_t rev)
+static void print_rev_csr(int dd, uint16_t rev)
{
- int i;
+ uint16_t buildid, chipver, chiprev, maxkeylen, mapsco;
- for (i = 0; csr_map[i].str; i++)
- if (csr_map[i].rev == rev) {
- printf("\t%s\n", csr_map[i].str);
- return;
- }
+ if (csr_read_varid_uint16(dd, 0, CSR_VARID_BUILDID, &buildid) < 0) {
+ printf("\t%s\n", csr_buildidtostr(rev));
+ return;
+ }
+
+ printf("\t%s\n", csr_buildidtostr(buildid));
+
+ if (!csr_read_varid_uint16(dd, 1, CSR_VARID_CHIPVER, &chipver)) {
+ if (csr_read_varid_uint16(dd, 2, CSR_VARID_CHIPREV, &chiprev) < 0)
+ chiprev = 0;
+ printf("\tChip version: %s\n", csr_chipvertostr(chipver, chiprev));
+ }
+
+ if (!csr_read_varid_uint16(dd, 3, CSR_VARID_MAX_CRYPT_KEY_LENGTH, &maxkeylen))
+ printf("\tMax key size: %d bit\n", maxkeylen * 8);
- printf("\tUnknown firmware\n");
+ if (!csr_read_pskey_uint16(dd, 4, CSR_PSKEY_HOSTIO_MAP_SCO_PCM, &mapsco))
+ printf("\tSCO mapping: %s\n", mapsco ? "PCM" : "HCI");
}
static void print_rev_avm(uint16_t rev)
@@ -870,7 +860,7 @@ static void cmd_revision(int ctl, int hdev, char *opt)
print_rev_ericsson(dd);
break;
case 10:
- print_rev_csr(ver.hci_rev);
+ print_rev_csr(dd, ver.hci_rev);
break;
case 31:
print_rev_avm(ver.hci_rev);
@@ -890,13 +880,13 @@ void print_dev_hdr(struct hci_dev_info *di)
if (hdr == di->dev_id)
return;
hdr = di->dev_id;
-
+
baswap(&bdaddr, &di->bdaddr);
printf("%s:\tType: %s\n", di->name, hci_dtypetostr(di->type) );
printf("\tBD Address: %s ACL MTU: %d:%d SCO MTU: %d:%d\n",
- batostr(&bdaddr), di->acl_mtu, di->acl_pkts,
- di->sco_mtu, di->sco_pkts);
+ batostr(&bdaddr), di->acl_mtu, di->acl_pkts,
+ di->sco_mtu, di->sco_pkts);
}
void print_dev_info(int ctl, struct hci_dev_info *di)
@@ -908,10 +898,10 @@ void print_dev_info(int ctl, struct hci_dev_info *di)
printf("\t%s\n", hci_dflagstostr(di->flags) );
printf("\tRX bytes:%d acl:%d sco:%d events:%d errors:%d\n",
- st->byte_rx, st->acl_rx, st->sco_rx, st->evt_rx, st->err_rx);
+ st->byte_rx, st->acl_rx, st->sco_rx, st->evt_rx, st->err_rx);
printf("\tTX bytes:%d acl:%d sco:%d commands:%d errors:%d\n",
- st->byte_tx, st->acl_tx, st->sco_tx, st->cmd_tx, st->err_tx);
+ st->byte_tx, st->acl_tx, st->sco_tx, st->cmd_tx, st->err_tx);
if (all) {
print_dev_features(di, 0);
@@ -925,7 +915,7 @@ void print_dev_info(int ctl, struct hci_dev_info *di)
cmd_version(ctl, di->dev_id, NULL);
}
}
-
+
printf("\n");
}
@@ -1033,7 +1023,7 @@ int main(int argc, char **argv, char **env)
if (command[i].opt) {
argc--; argv++;
}
-
+
command[i].func(ctl, di.dev_id, *argv);
cmd = 1;
break;