/*
*
* BlueZ - Bluetooth protocol stack for Linux
*
* Copyright (C) 2003-2009 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 <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>
#include "csr.h"
struct psr_data {
uint16_t pskey;
uint8_t *value;
uint8_t size;
struct psr_data *next;
};
static struct psr_data *head = NULL, *tail = NULL;
static struct {
uint16_t id;
char *str;
} csr_map[] = {
{ 66, "HCI 9.8" },
{ 97, "HCI 10.3" },
{ 101, "HCI 10.5" },
{ 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" },
{ 1120, "HCI 17.11" },
{ 1168, "HCI 18.1" },
{ 1169, "HCI 18.1" },
{ 1241, "HCI 18.x" },
{ 1298, "HCI 18.2" },
{ 1354, "HCI 18.2" },
{ 1392, "HCI 18.2" },
{ 1393, "HCI 18.2" },
{ 1501, "HCI 18.2" },
{ 1503, "HCI 18.2" },
{ 1504, "HCI 18.2" },
{ 1505, "HCI 18.2" },
{ 1506, "HCI 18.2" },
{ 1520, "HCI 18.2" },
{ 1586, "HCI 18.2" },
{ 1591, "HCI 18.2" },
{ 1592, "HCI 18.2" },
{ 1593, "HCI 18.2.1" },
{ 1733, "HCI 18.3" },
{ 1734, "HCI 18.3" },
{ 1735, "HCI 18.3" },
{ 1737, "HCI 18.3" },
{ 1915, "HCI 19.2" },
{ 1916, "HCI 19.2" },
{ 1958, "HCI 19.2" },
{ 1981, "Unified 20a" },
{ 1982, "Unified 20a" },
{ 1989, "HCI 18.4" },
{ 2062, "Unified 20a1" },
{ 2063, "Unified 20a1" },
{ 2067, "Unified 18f" },
{ 2068, "Unified 18f" },
{ 2243, "Unified 18e" },
{ 2244, "Unified 18e" },
{ 2258, "Unified 20d" },
{ 2259, "Unified 20d" },
{ 2361, "Unified 20e" },
{ 2362, "Unified 20e" },
{ 2386, "Unified 21a" },
{ 2387, "Unified 21a" },
{ 2423, "Unified 21a" },
{ 2424, "Unified 21a" },
{ 2623, "Unified 21c" },
{ 2624, "Unified 21c" },
{ 2625, "Unified 21c" },
{ 2626, "Unified 21c" },
{ 2627, "Unified 21c" },
{ 2628, "Unified 21c" },
{ 2629, "Unified 21c" },
{ 2630, "Unified 21c" },
{ 2631, "Unified 21c" },
{ 2632, "Unified 21c" },
{ 2633, "Unified 21c" },
{ 2634, "Unified 21c" },
{ 2635, "Unified 21c" },
{ 2636, "Unified 21c" },
{ 2649, "Unified 21c" },
{ 2650, "Unified 21c" },
{ 2651, "Unified 21c" },
{ 2652, "Unified 21c" },
{ 2653, "Unified 21c" },
{ 2654, "Unified 21c" },
{ 2655, "Unified 21c" },
{ 2656, "Unified 21c" },
{ 2658, "Unified 21c" },
{ 3057, "Unified 21d" },
{ 3058, "Unified 21d" },
{ 3059, "Unified 21d" },
{ 3060, "Unified 21d" },
{ 3062, "Unified 21d" },
{ 3063, "Unified 21d" },
{ 3064, "Unified 21d" },
{ 3164, "Unified 21e" },
{ 3413, "Unified 21f" },
{ 3414, "Unified 21f" },
{ 3415, "Unified 21f" },
{ 3424, "Unified 21f" },
{ 3454, "Unified 21f" },
{ 3684, "Unified 21f" },
{ 3764, "Unified 21f" },
{ 4276, "Unified 22b" },
{ 4277, "Unified 22b" },
{ 4279, "Unified 22b" },
{ 4281, "Unified 22b" },
{ 4282, "Unified 22b" },
{ 4283, "Unified 22b" },
{ 4284, "Unified 22b" },
{ 4285, "Unified 22b" },
{ 4289, "Unified 22b" },
{ 4290, "Unified 22b" },
{ 4291, "Unified 22b" },
{ 4292, "Unified 22b" },
{ 4293, "Unified 22b" },
{ 4294, "Unified 22b" },
{ 4295, "Unified 22b" },
{ 4363, "Unified 22c" },
{ 4373, "Unified 22c" },
{ 4374, "Unified 22c" },
{ 4532, "Unified 22d" },
{ 4533, "Unified 22d" },
{ 4698, "Unified 23c" },
{ 4839, "Unified 23c" },
{ 4841, "Unified 23c" },
{ 4866, "Unified 23c" },
{ 4867, "Unified 23c" },
{ 4868, "Unified 23c" },
{ 4869, "Unified 23c" },
{ 4870, "Unified 23c" },
{ 4871, "Unified 23c" },
{ 4872, "Unified 23c" },
{ 4874, "Unified 23c" },
{ 4875, "Unified 23c" },
{ 4876, "Unified 23c" },
{ 4877, "Unified 23c" },
{ 2526, "Marcel 1 (2005-09-26)" },
{ 2543, "Marcel 2 (2005-09-28)" },
{ 2622, "Marcel 3 (2005-10-27)" },
{ 3326, "Marcel 4 (2006-06-16)" },
{ 3612, "Marcel 5 (2006-10-24)" },
{ 4509, "Marcel 6 (2007-06-11)" },
{ 5417, "Marcel 7 (2008-08-26)" },
{ 195, "Sniff 1 (2001-11-27)" },
{ 220, "Sniff 2 (2002-01-03)" },
{ 269, "Sniff 3 (2002-02-22)" },
{ 270, "Sniff 4 (2002-02-26)" },
{ 284, "Sniff 5 (2002-03-12)" },
{ 292, "Sniff 6 (2002-03-20)" },
{ 305, "Sniff 7 (2002-04-12)" },
{ 306, "Sniff 8 (2002-04-12)" },
{ 343, "Sniff 9 (2002-05-02)" },
{ 346, "Sniff 10 (2002-05-03)" },
{ 355, "Sniff 11 (2002-05-16)" },
{ 256, "Sniff 11 (2002-05-16)" },
{ 390, "Sniff 12 (2002-06-26)" },
{ 450, "Sniff 13 (2002-08-16)" },
{ 451, "Sniff 13 (2002-08-16)" },
{ 533, "Sniff 14 (2002-10-11)" },
{ 580, "Sniff 15 (2002-11-14)" },
{ 623, "Sniff 16 (2002-12-12)" },
{ 678, "Sniff 17 (2003-01-29)" },
{ 847, "Sniff 18 (2003-04-17)" },
{ 876, "Sniff 19 (2003-06-10)" },
{ 997, "Sniff 22 (2003-09-05)" },
{ 1027, "Sniff 23 (2003-10-03)" },
{ 1029, "Sniff 24 (2003-10-03)" },
{ 1112, "Sniff 25 (2003-12-03)" },
{ 1113, "Sniff 25 (2003-12-03)" },
{ 1133, "Sniff 26 (2003-12-18)" },
{ 1134, "Sniff 26 (2003-12-18)" },
{ 1223, "Sniff 27 (2004-03-08)" },
{ 1224, "Sniff 27 (2004-03-08)" },
{ 1319, "Sniff 31 (2004-04-22)" },
{ 1320, "Sniff 31 (2004-04-22)" },
{ 1427, "Sniff 34 (2004-06-16)" },
{ 1508, "Sniff 35 (2004-07-19)" },
{ 1509, "Sniff 35 (2004-07-19)" },
{ 1587, "Sniff 36 (2004-08-18)" },
{ 1588, "Sniff 36 (2004-08-18)" },
{ 1641, "Sniff 37 (2004-09-16)" },
{ 1642, "Sniff 37 (2004-09-16)" },
{ 1699, "Sniff 38 (2004-10-07)" },
{ 1700, "Sniff 38 (2004-10-07)" },
{ 1752, "Sniff 39 (2004-11-02)" },
{ 1753, "Sniff 39 (2004-11-02)" },
{ 1759, "Sniff 40 (2004-11-03)" },
{ 1760, "Sniff 40 (2004-11-03)" },
{ 1761, "Sniff 40 (2004-11-03)" },
{ 2009, "Sniff 41 (2005-04-06)" },
{ 2010, "Sniff 41 (2005-04-06)" },
{ 2011, "Sniff 41 (2005-04-06)" },
{ 2016, "Sniff 42 (2005-04-11)" },
{ 2017, "Sniff 42 (2005-04-11)" },
{ 2018, "Sniff 42 (2005-04-11)" },
{ 2023, "Sniff 43 (2005-04-14)" },
{ 2024, "Sniff 43 (2005-04-14)" },
{ 2025, "Sniff 43 (2005-04-14)" },
{ 2032, "Sniff 44 (2005-04-18)" },
{ 2033, "Sniff 44 (2005-04-18)" },
{ 2034, "Sniff 44 (2005-04-18)" },
{ 2288, "Sniff 45 (2005-07-08)" },
{ 2289, "Sniff 45 (2005-07-08)" },
{ 2290, "Sniff 45 (2005-07-08)" },
{ 2388, "Sniff 46 (2005-08-17)" },
{ 2389, "Sniff 46 (2005-08-17)" },
{ 2390, "Sniff 46 (2005-08-17)" },
{ 2869, "Sniff 47 (2006-02-15)" },
{ 2870, "Sniff 47 (2006-02-15)" },
{ 2871, "Sniff 47 (2006-02-15)" },
{ 3214, "Sniff 48 (2006-05-16)" },
{ 3215, "Sniff 48 (2006-05-16)" },
{ 3216, "Sniff 48 (2006-05-16)" },
{ 3356, "Sniff 49 (2006-07-17)" },
{ 3529, "Sniff 50 (2006-09-21)" },
{ 3546, "Sniff 51 (2006-09-29)" },
{ 3683, "Sniff 52 (2006-11-03)" },
{ 0, }
};
char *csr_builddeftostr(uint16_t def)
{
switch (def) {
case 0x0000:
return "NONE";
case 0x0001:
return "CHIP_BASE_BC01";
case 0x0002:
return "CHIP_BASE_BC02";
case 0x0003:
return "CHIP_BC01B";
case 0x0004:
return "CHIP_BC02_EXTERNAL";
case 0x0005:
return "BUILD_HCI";
case 0x0006:
return "BUILD_RFCOMM";
case 0x0007:
return "BT_VER_1_1";
case 0x0008:
return "TRANSPORT_ALL";
case 0x0009:
return "TRANSPORT_BCSP";
case 0x000a:
return "TRANSPORT_H4";
case 0x000b:
return "TRANSPORT_USB";
case 0x000c:
return "MAX_CRYPT_KEY_LEN_56";
case 0x000d:
return "MAX_CRYPT_KEY_LEN_128";
case 0x000e:
return "TRANSPORT_USER";
case 0x000f:
return "CHIP_BC02_KATO";
case 0x0010:
return "TRANSPORT_NONE";
case 0x0012:
return "REQUIRE_8MBIT";
case 0x0013:
return "RADIOTEST";
case 0x0014:
return "RADIOTEST_LITE";
case 0x0015:
return "INSTALL_FLASH";
case 0x0016:
return "INSTALL_EEPROM";
case 0x0017:
return "INSTALL_COMBO_DOT11";
case 0x0018:
return "LOWPOWER_TX";
case 0x0019:
return "TRANSPORT_TWUTL";
case 0x001a:
return "COMPILER_GCC";
case 0x001b:
return "CHIP_BC02_CLOUSEAU";
case 0x001c:
return "CHIP_BC02_TOULOUSE";
case 0x001d:
return "CHIP_BASE_BC3";
case 0x001e:
return "CHIP_BC3_NICKNACK";
case 0x001f:
return "CHIP_BC3_KALIMBA";
case 0x0020:
return "INSTALL_HCI_MODULE";
case 0x0021:
return "INSTALL_L2CAP_MODULE";
case 0x0022:
return "INSTALL_DM_MODULE";
case 0x0023:
return "INSTALL_SDP_MODULE";
case 0x0024:
return "INSTALL_RFCOMM_MODULE";
case 0x0025:
return "INSTALL_HIDIO_MODULE";
case 0x0026:
return "INSTALL_PAN_MODULE";
case 0x0027:
return "INSTALL_IPV4_MODULE";
case 0x0028:
return "INSTALL_IPV6_MODULE";
case 0x0029:
return "INSTALL_TCP_MODULE";
case 0x002a:
return "BT_VER_1_2";
case 0x002b:
return "INSTALL_UDP_MODULE";
case 0x002c:
return "REQUIRE_0_WAIT_STATES";
case 0x002d:
return "CHIP_BC3_PADDYWACK";
case 0x002e:
return "CHIP_BC4_COYOTE";
case 0x002f:
return "CHIP_BC4_ODDJOB";
case 0x0030:
return "TRANSPORT_H4DS";
case 0x0031:
return "CHIP_BASE_BC4";
default:
return "UNKNOWN";
}
}
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:
switch (rev) {
case 0x64:
return "BlueCore01b (ES)";
case 0x65:
default:
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_BDADDR:
return "Bluetooth address";
case CSR_PSKEY_COUNTRYCODE:
return "Country code";
case CSR_PSKEY_CLASSOFDEVICE:
return "Class of device";
case CSR_PSKEY_DEVICE_DRIFT:
return "Device drift";
case CSR_PSKEY_DEVICE_JITTER:
return "Device jitter";
case CSR_PSKEY_MAX_ACLS:
return "Maximum ACL links";
case CSR_PSKEY_MAX_SCOS:
return "Maximum SCO links";
case CSR_PSKEY_MAX_REMOTE_MASTERS:
return "Maximum remote masters";
case CSR_PSKEY_ENABLE_MASTERY_WITH_SLAVERY:
return "Support master and slave roles simultaneously";
case CSR_PSKEY_H_HC_FC_MAX_ACL_PKT_LEN:
return "Maximum HCI ACL packet length";
case CSR_PSKEY_H_HC_FC_MAX_SCO_PKT_LEN:
return "Maximum HCI SCO packet length";
case CSR_PSKEY_H_HC_FC_MAX_ACL_PKTS:
return "Maximum number of HCI ACL packets";
case CSR_PSKEY_H_HC_FC_MAX_SCO_PKTS:
return "Maximum number of HCI SCO packets";
case CSR_PSKEY_LC_FC_BUFFER_LOW_WATER_MARK:
return "Flow control low water mark";
case CSR_PSKEY_LC_MAX_TX_POWER:
return "Maximum transmit power";
case CSR_PSKEY_TX_GAIN_RAMP:
return "Transmit gain ramp rate";
case CSR_PSKEY_LC_POWER_TABLE:
return "Radio power table";
case CSR_PSKEY_LC_PEER_POWER_PERIOD:
return "Peer transmit power control interval";
case CSR_PSKEY_LC_FC_POOLS_LOW_WATER_MARK:
return "Flow control pool low water mark";
case CSR_PSKEY_LC_DEFAULT_TX_POWER:
return "Default transmit power";
case CSR_PSKEY_LC_RSSI_GOLDEN_RANGE:
return "RSSI at bottom of golden receive range";
case CSR_PSKEY_LC_COMBO_DISABLE_PIO_MASK:
return "Combo: PIO lines and logic to disable transmit";
case CSR_PSKEY_LC_COMBO_PRIORITY_PIO_MASK:
return "Combo: priority activity PIO lines and logic";
case CSR_PSKEY_LC_COMBO_DOT11_CHANNEL_PIO_BASE:
return "Combo: 802.11b channel number base PIO line";
case CSR_PSKEY_LC_COMBO_DOT11_BLOCK_CHANNELS:
return "Combo: channels to block either side of 802.11b";
case CSR_PSKEY_LC_MAX_TX_POWER_NO_RSSI:
return "Maximum transmit power when peer has no RSSI";
case CSR_PSKEY_LC_CONNECTION_RX_WINDOW:
return "Receive window size during connections";
case CSR_PSKEY_LC_COMBO_DOT11_TX_PROTECTION_MODE:
return "Combo: which TX packets shall we protect";
case CSR_PSKEY_LC_ENHANCED_POWER_TABLE:
return "Radio power table";
case CSR_PSKEY_LC_WIDEBAND_RSSI_CONFIG:
return "RSSI configuration for use with wideband RSSI";
case CSR_PSKEY_LC_COMBO_DOT11_PRIORITY_LEAD:
return "Combo: How much notice will we give the Combo Card";
case CSR_PSKEY_BT_CLOCK_INIT:
return "Initial value of Bluetooth clock";
case CSR_PSKEY_TX_MR_MOD_DELAY:
return "TX Mod delay";
case CSR_PSKEY_RX_MR_SYNC_TIMING:
return "RX MR Sync Timing";
case CSR_PSKEY_RX_MR_SYNC_CONFIG:
return "RX MR Sync Configuration";
case CSR_PSKEY_LC_LOST_SYNC_SLOTS:
return "Time in ms for lost sync in low power modes";
case CSR_PSKEY_RX_MR_SAMP_CONFIG:
return "RX MR Sync Configuration";
case CSR_PSKEY_AGC_HYST_LEVELS:
return "AGC hysteresis levels";
case CSR_PSKEY_RX_LEVEL_LOW_SIGNAL:
return "ANA_RX_LVL at low signal strengths";
case CSR_PSKEY_AGC_IQ_LVL_VALUES:
return "ANA_IQ_LVL values for AGC algorithmn";
case CSR_PSKEY_MR_FTRIM_OFFSET_12DB:
return "ANA_RX_FTRIM offset when using 12 dB IF atten ";
case CSR_PSKEY_MR_FTRIM_OFFSET_6DB:
return "ANA_RX_FTRIM offset when using 6 dB IF atten ";
case CSR_PSKEY_NO_CAL_ON_BOOT:
return "Do not calibrate radio on boot";
case CSR_PSKEY_RSSI_HI_TARGET:
return "RSSI high target";
case CSR_PSKEY_PREFERRED_MIN_ATTENUATION:
return "Preferred minimum attenuator setting";
case CSR_PSKEY_LC_COMBO_DOT11_PRIORITY_OVERRIDE:
return "Combo: Treat all packets as high priority";
case CSR_PSKEY_LC_MULTISLOT_HOLDOFF:
return "Time till single slot packets are used for resync";
case CSR_PSKEY_FREE_KEY_PIGEON_HOLE:
return "Link key store bitfield";
case CSR_PSKEY_LINK_KEY_BD_ADDR0:
return "Bluetooth address + link key 0";
case CSR_PSKEY_LINK_KEY_BD_ADDR1:
return "Bluetooth address + link key 1";
case CSR_PSKEY_LINK_KEY_BD_ADDR2:
return "Bluetooth address + link key 2";
case CSR_PSKEY_LINK_KEY_BD_ADDR3:
return "Bluetooth address + link key 3";
case CSR_PSKEY_LINK_KEY_BD_ADDR4:
return "Bluetooth address + link key 4";
case CSR_PSKEY_LINK_KEY_BD_ADDR5:
return "Bluetooth address + link key 5";
case CSR_PSKEY_LINK_KEY_BD_ADDR6:
return "Bluetooth address + link key 6";
case CSR_PSKEY_LINK_KEY_BD_ADDR7:
return "Bluetooth address + link key 7";
case CSR_PSKEY_LINK_KEY_BD_ADDR8:
return "Bluetooth address + link key 8";
case CSR_PSKEY_LINK_KEY_BD_ADDR9:
return "Bluetooth address + link key 9";
case CSR_PSKEY_LINK_KEY_BD_ADDR10:
return "Bluetooth address + link key 10";
case CSR_PSKEY_LINK_KEY_BD_ADDR11:
return "Bluetooth address + link key 11";
case CSR_PSKEY_LINK_KEY_BD_ADDR12:
return "Bluetooth address + link key 12";
case CSR_PSKEY_LINK_KEY_BD_ADDR13:
return "Bluetooth address + link key 13";
case CSR_PSKEY_LINK_KEY_BD_ADDR14:
return "Bluetooth address + link key 14";
case CSR_PSKEY_LINK_KEY_BD_ADDR15:
return "Bluetooth address + link key 15";
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_LM_USE_UNIT_KEY:
return "Allow use of unit key for authentication?";
case CSR_PSKEY_HCI_NOP_DISABLE:
return "Disable the HCI Command_Status event on boot";
case CSR_PSKEY_LM_MAX_EVENT_FILTERS:
return "Maximum number of event filters";
case CSR_PSKEY_LM_USE_ENC_MODE_BROADCAST:
return "Allow LM to use enc_mode=2";
case CSR_PSKEY_LM_TEST_SEND_ACCEPTED_TWICE:
return "LM sends two LMP_accepted messages in test mode";
case CSR_PSKEY_LM_MAX_PAGE_HOLD_TIME:
return "Maximum time we hold a device around page";
case CSR_PSKEY_AFH_ADAPTATION_RESPONSE_TIME:
return "LM period for AFH adaption";
case CSR_PSKEY_AFH_OPTIONS:
return "Options to configure AFH";
case CSR_PSKEY_AFH_RSSI_RUN_PERIOD:
return "AFH RSSI reading period";
case CSR_PSKEY_AFH_REENABLE_CHANNEL_TIME:
return "AFH good channel adding time";
case CSR_PSKEY_NO_DROP_ON_ACR_MS_FAIL:
return "Complete link if acr barge-in role switch refused";
case CSR_PSKEY_MAX_PRIVATE_KEYS:
return "Max private link keys stored";
case CSR_PSKEY_PRIVATE_LINK_KEY_BD_ADDR0:
return "Bluetooth address + link key 0";
case CSR_PSKEY_PRIVATE_LINK_KEY_BD_ADDR1:
return "Bluetooth address + link key 1";
case CSR_PSKEY_PRIVATE_LINK_KEY_BD_ADDR2:
return "Bluetooth address + link key 2";
case CSR_PSKEY_PRIVATE_LINK_KEY_BD_ADDR3:
return "Bluetooth address + link key 3";
case CSR_PSKEY_PRIVATE_LINK_KEY_BD_ADDR4:
return "Bluetooth address + link key 4";
case CSR_PSKEY_PRIVATE_LINK_KEY_BD_ADDR5:
return "Bluetooth address + link key 5";
case CSR_PSKEY_PRIVATE_LINK_KEY_BD_ADDR6:
return "Bluetooth address + link key 6";
case CSR_PSKEY_PRIVATE_LINK_KEY_BD_ADDR7:
return "Bluetooth address + link key 7";
case CSR_PSKEY_LOCAL_SUPPORTED_COMMANDS:
return "Local supported commands";
case CSR_PSKEY_LM_MAX_ABSENCE_INDEX:
return "Maximum absence index allowed";
case CSR_PSKEY_DEVICE_NAME:
return "Local device's \"user friendly\" name";
case CSR_PSKEY_AFH_RSSI_THRESHOLD:
return "AFH RSSI threshold";
case CSR_PSKEY_LM_CASUAL_SCAN_INTERVAL:
return "Scan interval in slots for casual scanning";
case CSR_PSKEY_AFH_MIN_MAP_CHANGE:
return "The minimum amount to change an AFH map by";
case CSR_PSKEY_AFH_RSSI_LP_RUN_PERIOD:
return "AFH RSSI reading period when in low power mode";
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_HOLD_ERROR_MESSAGE_NUMBER:
return "Maximum number of queued HCI Hardware Error Events";
case CSR_PSKEY_DFU_ATTRIBUTES:
return "DFU attributes";
case CSR_PSKEY_DFU_DETACH_TO:
return "DFU detach timeout";
case CSR_PSKEY_DFU_TRANSFER_SIZE:
return "DFU transfer size";
case CSR_PSKEY_DFU_ENABLE:
return "DFU enable";
case CSR_PSKEY_DFU_LIN_REG_ENABLE:
return "Linear Regulator enabled at boot in DFU mode";
case CSR_PSKEY_DFUENC_VMAPP_PK_MODULUS_MSB:
return "DFU encryption VM application public key MSB";
case CSR_PSKEY_DFUENC_VMAPP_PK_MODULUS_LSB:
return "DFU encryption VM application public key LSB";
case CSR_PSKEY_DFUENC_VMAPP_PK_M_DASH:
return "DFU encryption VM application M dash";
case CSR_PSKEY_DFUENC_VMAPP_PK_R2N_MSB:
return "DFU encryption VM application public key R2N MSB";
case CSR_PSKEY_DFUENC_VMAPP_PK_R2N_LSB:
return "DFU encryption VM application public key R2N LSB";
case CSR_PSKEY_BCSP_LM_PS_BLOCK:
return "BCSP link establishment block";
case CSR_PSKEY_HOSTIO_FC_PS_BLOCK:
return "HCI flow control block";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO0:
return "Host transport channel 0 settings (BCSP ACK)";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO1:
return "Host transport channel 1 settings (BCSP-LE)";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO2:
return "Host transport channel 2 settings (BCCMD)";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO3:
return "Host transport channel 3 settings (HQ)";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO4:
return "Host transport channel 4 settings (DM)";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO5:
return "Host transport channel 5 settings (HCI CMD/EVT)";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO6:
return "Host transport channel 6 settings (HCI ACL)";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO7:
return "Host transport channel 7 settings (HCI SCO)";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO8:
return "Host transport channel 8 settings (L2CAP)";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO9:
return "Host transport channel 9 settings (RFCOMM)";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO10:
return "Host transport channel 10 settings (SDP)";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO11:
return "Host transport channel 11 settings (TEST)";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO12:
return "Host transport channel 12 settings (DFU)";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO13:
return "Host transport channel 13 settings (VM)";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO14:
return "Host transport channel 14 settings";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO15:
return "Host transport channel 15 settings";
case CSR_PSKEY_HOSTIO_UART_RESET_TIMEOUT:
return "UART reset counter timeout";
case CSR_PSKEY_HOSTIO_USE_HCI_EXTN:
return "Use hci_extn to route non-hci channels";
case CSR_PSKEY_HOSTIO_USE_HCI_EXTN_CCFC:
return "Use command-complete flow control for hci_extn";
case CSR_PSKEY_HOSTIO_HCI_EXTN_PAYLOAD_SIZE:
return "Maximum hci_extn payload size";
case CSR_PSKEY_BCSP_LM_CNF_CNT_LIMIT:
return "BCSP link establishment conf message count";
case CSR_PSKEY_HOSTIO_MAP_SCO_PCM:
return "Map SCO over PCM";
case CSR_PSKEY_HOSTIO_AWKWARD_PCM_SYNC:
return "PCM interface synchronisation is difficult";
case CSR_PSKEY_HOSTIO_BREAK_POLL_PERIOD:
return "Break poll period (microseconds)";
case CSR_PSKEY_HOSTIO_MIN_UART_HCI_SCO_SIZE:
return "Minimum SCO packet size sent to host over UART HCI";
case CSR_PSKEY_HOSTIO_MAP_SCO_CODEC:
return "Map SCO over the built-in codec";
case CSR_PSKEY_PCM_CVSD_TX_HI_FREQ_BOOST:
return "High frequency boost for PCM when transmitting CVSD";
case CSR_PSKEY_PCM_CVSD_RX_HI_FREQ_BOOST:
return "High frequency boost for PCM when receiving CVSD";
case CSR_PSKEY_PCM_CONFIG32:
return "PCM interface settings bitfields";
case CSR_PSKEY_USE_OLD_BCSP_LE:
return "Use the old version of BCSP link establishment";
case CSR_PSKEY_PCM_CVSD_USE_NEW_FILTER:
return "CVSD uses the new filter if available";
case CSR_PSKEY_PCM_FORMAT:
return "PCM data format";
case CSR_PSKEY_CODEC_OUT_GAIN:
return "Audio output gain when using built-in codec";
case CSR_PSKEY_CODEC_IN_GAIN:
return "Audio input gain when using built-in codec";
case CSR_PSKEY_CODEC_PIO:
return "PIO to enable when built-in codec is enabled";
case CSR_PSKEY_PCM_LOW_JITTER_CONFIG:
return "PCM interface settings for low jitter master mode";
case CSR_PSKEY_HOSTIO_SCO_PCM_THRESHOLDS:
return "Thresholds for SCO PCM buffers";
case CSR_PSKEY_HOSTIO_SCO_HCI_THRESHOLDS:
return "Thresholds for SCO HCI buffers";
case CSR_PSKEY_HOSTIO_MAP_SCO_PCM_SLOT:
return "Route SCO data to specified slot in pcm frame";
case CSR_PSKEY_UART_BAUDRATE:
return "UART Baud rate";
case CSR_PSKEY_UART_CONFIG_BCSP:
return "UART configuration when using BCSP";
case CSR_PSKEY_UART_CONFIG_H4:
return "UART configuration when using H4";
case CSR_PSKEY_UART_CONFIG_H5:
return "UART configuration when using H5";
case CSR_PSKEY_UART_CONFIG_USR:
return "UART configuration when under VM control";
case CSR_PSKEY_UART_TX_CRCS:
return "Use CRCs for BCSP or H5";
case CSR_PSKEY_UART_ACK_TIMEOUT:
return "Acknowledgement timeout for BCSP and H5";
case CSR_PSKEY_UART_TX_MAX_ATTEMPTS:
return "Max times to send reliable BCSP or H5 message";
case CSR_PSKEY_UART_TX_WINDOW_SIZE:
return "Transmit window size for BCSP and H5";
case CSR_PSKEY_UART_HOST_WAKE:
return "UART host wakeup";
case CSR_PSKEY_HOSTIO_THROTTLE_TIMEOUT:
return "Host interface performance control.";
case CSR_PSKEY_PCM_ALWAYS_ENABLE:
return "PCM port is always enable when chip is running";
case CSR_PSKEY_UART_HOST_WAKE_SIGNAL:
return "Signal to use for uart host wakeup protocol";
case CSR_PSKEY_UART_CONFIG_H4DS:
return "UART configuration when using H4DS";
case CSR_PSKEY_H4DS_WAKE_DURATION:
return "How long to spend waking the host when using H4DS";
case CSR_PSKEY_H4DS_MAXWU:
return "Maximum number of H4DS Wake-Up messages to send";
case CSR_PSKEY_H4DS_LE_TIMER_PERIOD:
return "H4DS Link Establishment Tsync and Tconf period";
case CSR_PSKEY_H4DS_TWU_TIMER_PERIOD:
return "H4DS Twu timer period";
case CSR_PSKEY_H4DS_UART_IDLE_TIMER_PERIOD:
return "H4DS Tuart_idle timer period";
case CSR_PSKEY_ANA_FTRIM:
return "Crystal frequency trim";
case CSR_PSKEY_WD_TIMEOUT:
return "Watchdog timeout (microseconds)";
case CSR_PSKEY_WD_PERIOD:
return "Watchdog period (microseconds)";
case CSR_PSKEY_HOST_INTERFACE:
return "Host interface";
case CSR_PSKEY_HQ_HOST_TIMEOUT:
return "HQ host command timeout";
case CSR_PSKEY_HQ_ACTIVE:
return "Enable host query task?";
case CSR_PSKEY_BCCMD_SECURITY_ACTIVE:
return "Enable configuration security";
case CSR_PSKEY_ANA_FREQ:
return "Crystal frequency";
case CSR_PSKEY_PIO_PROTECT_MASK:
return "Access to PIO pins";
case CSR_PSKEY_PMALLOC_SIZES:
return "pmalloc sizes array";
case CSR_PSKEY_UART_BAUD_RATE:
return "UART Baud rate (pre 18)";
case CSR_PSKEY_UART_CONFIG:
return "UART configuration bitfield";
case CSR_PSKEY_STUB:
return "Stub";
case CSR_PSKEY_TXRX_PIO_CONTROL:
return "TX and RX PIO control";
case CSR_PSKEY_ANA_RX_LEVEL:
return "ANA_RX_LVL register initial value";
case CSR_PSKEY_ANA_RX_FTRIM:
return "ANA_RX_FTRIM register initial value";
case CSR_PSKEY_PSBC_DATA_VERSION:
return "Persistent store version";
case CSR_PSKEY_PCM0_ATTENUATION:
return "Volume control on PCM channel 0";
case CSR_PSKEY_LO_LVL_MAX:
return "Maximum value of LO level control register";
case CSR_PSKEY_LO_ADC_AMPL_MIN:
return "Minimum value of the LO amplitude measured on the ADC";
case CSR_PSKEY_LO_ADC_AMPL_MAX:
return "Maximum value of the LO amplitude measured on the ADC";
case CSR_PSKEY_IQ_TRIM_CHANNEL:
return "IQ calibration channel";
case CSR_PSKEY_IQ_TRIM_GAIN:
return "IQ calibration gain";
case CSR_PSKEY_IQ_TRIM_ENABLE:
return "IQ calibration enable";
case CSR_PSKEY_TX_OFFSET_HALF_MHZ:
return "Transmit offset";
case CSR_PSKEY_GBL_MISC_ENABLES:
return "Global miscellaneous hardware enables";
case CSR_PSKEY_UART_SLEEP_TIMEOUT:
return "Time in ms to deep sleep if nothing received";
case CSR_PSKEY_DEEP_SLEEP_STATE:
return "Deep sleep state usage";
case CSR_PSKEY_IQ_ENABLE_PHASE_TRIM:
return "IQ phase enable";
case CSR_PSKEY_HCI_HANDLE_FREEZE_PERIOD:
return "Time for which HCI handle is frozen after link removal";
case CSR_PSKEY_MAX_FROZEN_HCI_HANDLES:
return "Maximum number of frozen HCI handles";
case CSR_PSKEY_PAGETABLE_DESTRUCTION_DELAY:
return "Delay from freezing buf handle to deleting page table";
case CSR_PSKEY_IQ_TRIM_PIO_SETTINGS:
return "IQ PIO settings";
case CSR_PSKEY_USE_EXTERNAL_CLOCK:
return "Device uses an external clock";
case CSR_PSKEY_DEEP_SLEEP_WAKE_CTS:
return "Exit deep sleep on CTS line activity";
case CSR_PSKEY_FC_HC2H_FLUSH_DELAY:
return "Delay from disconnect to flushing HC->H FC tokens";
case CSR_PSKEY_RX_HIGHSIDE:
return "Disable the HIGHSIDE bit in ANA_CONFIG";
case CSR_PSKEY_TX_PRE_LVL:
return "TX pre-amplifier level";
case CSR_PSKEY_RX_SINGLE_ENDED:
return "RX single ended";
case CSR_PSKEY_TX_FILTER_CONFIG:
return "TX filter configuration";
case CSR_PSKEY_CLOCK_REQUEST_ENABLE:
return "External clock request enable";
case CSR_PSKEY_RX_MIN_ATTEN:
return "Minimum attenuation allowed for receiver";
case CSR_PSKEY_XTAL_TARGET_AMPLITUDE:
return "Crystal target amplitude";
case CSR_PSKEY_PCM_MIN_CPU_CLOCK:
return "Minimum CPU clock speed with PCM port running";
case CSR_PSKEY_HOST_INTERFACE_PIO_USB:
return "USB host interface selection PIO line";
case CSR_PSKEY_CPU_IDLE_MODE:
return "CPU idle mode when radio is active";
case CSR_PSKEY_DEEP_SLEEP_CLEAR_RTS:
return "Deep sleep clears the UART RTS line";
case CSR_PSKEY_RF_RESONANCE_TRIM:
return "Frequency trim for IQ and LNA resonant circuits";
case CSR_PSKEY_DEEP_SLEEP_PIO_WAKE:
return "PIO line to wake the chip from deep sleep";
case CSR_PSKEY_DRAIN_BORE_TIMERS:
return "Energy consumption measurement settings";
case CSR_PSKEY_DRAIN_TX_POWER_BASE:
return "Energy consumption measurement settings";
case CSR_PSKEY_MODULE_ID:
return "Module serial number";
case CSR_PSKEY_MODULE_DESIGN:
return "Module design ID";
case CSR_PSKEY_MODULE_SECURITY_CODE:
return "Module security code";
case CSR_PSKEY_VM_DISABLE:
return "VM disable";
case CSR_PSKEY_MOD_MANUF0:
return "Module manufactuer data 0";
case CSR_PSKEY_MOD_MANUF1:
return "Module manufactuer data 1";
case CSR_PSKEY_MOD_MANUF2:
return "Module manufactuer data 2";
case CSR_PSKEY_MOD_MANUF3:
return "Module manufactuer data 3";
case CSR_PSKEY_MOD_MANUF4:
return "Module manufactuer data 4";
case CSR_PSKEY_MOD_MANUF5:
return "Module manufactuer data 5";
case CSR_PSKEY_MOD_MANUF6:
return "Module manufactuer data 6";
case CSR_PSKEY_MOD_MANUF7:
return "Module manufactuer data 7";
case CSR_PSKEY_MOD_MANUF8:
return "Module manufactuer data 8";
case CSR_PSKEY_MOD_MANUF9:
return "Module manufactuer data 9";
case CSR_PSKEY_DUT_VM_DISABLE:
return "VM disable when entering radiotest modes";
case CSR_PSKEY_USR0:
return "User configuration data 0";
case CSR_PSKEY_USR1:
return "User configuration data 1";
case CSR_PSKEY_USR2:
return "User configuration data 2";
case CSR_PSKEY_USR3:
return "User configuration data 3";
case CSR_PSKEY_USR4:
return "User configuration data 4";
case CSR_PSKEY_USR5:
return "User configuration data 5";
case CSR_PSKEY_USR6:
return "User configuration data 6";
case CSR_PSKEY_USR7:
return "User configuration data 7";
case CSR_PSKEY_USR8:
return "User configuration data 8";
case CSR_PSKEY_USR9:
return "User configuration data 9";
case CSR_PSKEY_USR10:
return "User configuration data 10";
case CSR_PSKEY_USR11:
return "User configuration data 11";
case CSR_PSKEY_USR12:
return "User configuration data 12";
case CSR_PSKEY_USR13:
return "User configuration data 13";
case CSR_PSKEY_USR14:
return "User configuration data 14";
case CSR_PSKEY_USR15:
return "User configuration data 15";
case CSR_PSKEY_USR16:
return "User configuration data 16";
case CSR_PSKEY_USR17:
return "User configuration data 17";
case CSR_PSKEY_USR18:
return "User configuration data 18";
case CSR_PSKEY_USR19:
return "User configuration data 19";
case CSR_PSKEY_USR20:
return "User configuration data 20";
case CSR_PSKEY_USR21:
return "User configuration data 21";
case CSR_PSKEY_USR22:
return "User configuration data 22";
case CSR_PSKEY_USR23:
return "User configuration data 23";
case CSR_PSKEY_USR24:
return "User configuration data 24";
case CSR_PSKEY_USR25:
return "User configuration data 25";
case CSR_PSKEY_USR26:
return "User configuration data 26";
case CSR_PSKEY_USR27:
return "User configuration data 27";
case CSR_PSKEY_USR28:
return "User configuration data 28";
case CSR_PSKEY_USR29:
return "User configuration data 29";
case CSR_PSKEY_USR30:
return "User configuration data 30";
case CSR_PSKEY_USR31:
return "User configuration data 31";
case CSR_PSKEY_USR32:
return "User configuration data 32";
case CSR_PSKEY_USR33:
return "User configuration data 33";
case CSR_PSKEY_USR34:
return "User configuration data 34";
case CSR_PSKEY_USR35:
return "User configuration data 35";
case CSR_PSKEY_USR36:
return "User configuration data 36";
case CSR_PSKEY_USR37:
return "User configuration data 37";
case CSR_PSKEY_USR38:
return "User configuration data 38";
case CSR_PSKEY_USR39:
return "User configuration data 39";
case CSR_PSKEY_USR40:
return "User configuration data 40";
case CSR_PSKEY_USR41:
return "User configuration data 41";
case CSR_PSKEY_USR42:
return "User configuration data 42";
case CSR_PSKEY_USR43:
return "User configuration data 43";
case CSR_PSKEY_USR44:
return "User configuration data 44";
case CSR_PSKEY_USR45:
return "User configuration data 45";
case CSR_PSKEY_USR46:
return "User configuration data 46";
case CSR_PSKEY_USR47:
return "User configuration data 47";
case CSR_PSKEY_USR48:
return "User configuration data 48";
case CSR_PSKEY_USR49:
return "User configuration data 49";
case CSR_PSKEY_USB_VERSION:
return "USB specification version number";
case CSR_PSKEY_USB_DEVICE_CLASS_CODES:
return "USB device class codes";
case CSR_PSKEY_USB_VENDOR_ID:
return "USB vendor identifier";
case CSR_PSKEY_USB_PRODUCT_ID:
return "USB product identifier";
case CSR_PSKEY_USB_MANUF_STRING:
return "USB manufacturer string";
case CSR_PSKEY_USB_PRODUCT_STRING:
return "USB product string";
case CSR_PSKEY_USB_SERIAL_NUMBER_STRING:
return "USB serial number string";
case CSR_PSKEY_USB_CONFIG_STRING:
return "USB configuration string";
case CSR_PSKEY_USB_ATTRIBUTES:
return "USB attributes bitmap";
case CSR_PSKEY_USB_MAX_POWER:
return "USB device maximum power consumption";
case CSR_PSKEY_USB_BT_IF_CLASS_CODES:
return "USB Bluetooth interface class codes";
case CSR_PSKEY_USB_LANGID:
return "USB language strings supported";
case CSR_PSKEY_USB_DFU_CLASS_CODES:
return "USB DFU class codes block";
case CSR_PSKEY_USB_DFU_PRODUCT_ID:
return "USB DFU product ID";
case CSR_PSKEY_USB_PIO_DETACH:
return "USB detach/attach PIO line";
case CSR_PSKEY_USB_PIO_WAKEUP:
return "USB wakeup PIO line";
case CSR_PSKEY_USB_PIO_PULLUP:
return "USB D+ pullup PIO line";
case CSR_PSKEY_USB_PIO_VBUS:
return "USB VBus detection PIO Line";
case CSR_PSKEY_USB_PIO_WAKE_TIMEOUT:
return "Timeout for assertion of USB PIO wake signal";
case CSR_PSKEY_USB_PIO_RESUME:
return "PIO signal used in place of bus resume";
case CSR_PSKEY_USB_BT_SCO_IF_CLASS_CODES:
return "USB Bluetooth SCO interface class codes";
case CSR_PSKEY_USB_SUSPEND_PIO_LEVEL:
return "USB PIO levels to set when suspended";
case CSR_PSKEY_USB_SUSPEND_PIO_DIR:
return "USB PIO I/O directions to set when suspended";
case CSR_PSKEY_USB_SUSPEND_PIO_MASK:
return "USB PIO lines to be set forcibly in suspend";
case CSR_PSKEY_USB_ENDPOINT_0_MAX_PACKET_SIZE:
return "The maxmimum packet size for USB endpoint 0";
case CSR_PSKEY_USB_CONFIG:
return "USB config params for new chips (>bc2)";
case CSR_PSKEY_RADIOTEST_ATTEN_INIT:
return "Radio test initial attenuator";
case CSR_PSKEY_RADIOTEST_FIRST_TRIM_TIME:
return "IQ first calibration period in test";
case CSR_PSKEY_RADIOTEST_SUBSEQUENT_TRIM_TIME:
return "IQ subsequent calibration period in test";
case CSR_PSKEY_RADIOTEST_LO_LVL_TRIM_ENABLE:
return "LO_LVL calibration enable";
case CSR_PSKEY_RADIOTEST_DISABLE_MODULATION:
return "Disable modulation during radiotest transmissions";
case CSR_PSKEY_RFCOMM_FCON_THRESHOLD:
return "RFCOMM aggregate flow control on threshold";
case CSR_PSKEY_RFCOMM_FCOFF_THRESHOLD:
return "RFCOMM aggregate flow control off threshold";
case CSR_PSKEY_IPV6_STATIC_ADDR:
return "Static IPv6 address";
case CSR_PSKEY_IPV4_STATIC_ADDR:
return "Static IPv4 address";
case CSR_PSKEY_IPV6_STATIC_PREFIX_LEN:
return "Static IPv6 prefix length";
case CSR_PSKEY_IPV6_STATIC_ROUTER_ADDR:
return "Static IPv6 router address";
case CSR_PSKEY_IPV4_STATIC_SUBNET_MASK:
return "Static IPv4 subnet mask";
case CSR_PSKEY_IPV4_STATIC_ROUTER_ADDR:
return "Static IPv4 router address";
case CSR_PSKEY_MDNS_NAME:
return "Multicast DNS name";
case CSR_PSKEY_FIXED_PIN:
return "Fixed PIN";
case CSR_PSKEY_MDNS_PORT:
return "Multicast DNS port";
case CSR_PSKEY_MDNS_TTL:
return "Multicast DNS TTL";
case CSR_PSKEY_MDNS_IPV4_ADDR:
return "Multicast DNS IPv4 address";
case CSR_PSKEY_ARP_CACHE_TIMEOUT:
return "ARP cache timeout";
case CSR_PSKEY_HFP_POWER_TABLE:
return "HFP power table";
case CSR_PSKEY_DRAIN_BORE_TIMER_COUNTERS:
return "Energy consumption estimation timer counters";
case CSR_PSKEY_DRAIN_BORE_COUNTERS:
return "Energy consumption estimation counters";
case CSR_PSKEY_LOOP_FILTER_TRIM:
return "Trim value to optimise loop filter";
case CSR_PSKEY_DRAIN_BORE_CURRENT_PEAK:
return "Energy consumption estimation current peak";
case CSR_PSKEY_VM_E2_CACHE_LIMIT:
return "Maximum RAM for caching EEPROM VM application";
case CSR_PSKEY_FORCE_16MHZ_REF_PIO:
return "PIO line to force 16 MHz reference to be assumed";
case CSR_PSKEY_CDMA_LO_REF_LIMITS:
return "Local oscillator frequency reference limits for CDMA";
case CSR_PSKEY_CDMA_LO_ERROR_LIMITS:
return "Local oscillator frequency error limits for CDMA";
case CSR_PSKEY_CLOCK_STARTUP_DELAY:
return "Clock startup delay in milliseconds";
case CSR_PSKEY_DEEP_SLEEP_CORRECTION_FACTOR:
return "Deep sleep clock correction factor";
case CSR_PSKEY_TEMPERATURE_CALIBRATION:
return "Temperature in deg C for a given internal setting";
case CSR_PSKEY_TEMPERATURE_VS_DELTA_INTERNAL_PA:
return "Temperature for given internal PA adjustment";
case CSR_PSKEY_TEMPERATURE_VS_DELTA_TX_PRE_LVL:
return "Temperature for a given TX_PRE_LVL adjustment";
case CSR_PSKEY_TEMPERATURE_VS_DELTA_TX_BB:
return "Temperature for a given TX_BB adjustment";
case CSR_PSKEY_TEMPERATURE_VS_DELTA_ANA_FTRIM:
return "Temperature for given crystal trim adjustment";
case CSR_PSKEY_TEST_DELTA_OFFSET:
return "Frequency offset applied to synthesiser in test mode";
case CSR_PSKEY_RX_DYNAMIC_LVL_OFFSET:
return "Receiver dynamic level offset depending on channel";
case CSR_PSKEY_TEST_FORCE_OFFSET:
return "Force use of exact value in PSKEY_TEST_DELTA_OFFSET";
case CSR_PSKEY_RF_TRAP_BAD_DIVISION_RATIOS:
return "Trap bad division ratios in radio frequency tables";
case CSR_PSKEY_RADIOTEST_CDMA_LO_REF_LIMITS:
return "LO frequency reference limits for CDMA in radiotest";
case CSR_PSKEY_INITIAL_BOOTMODE:
return "Initial device bootmode";
case CSR_PSKEY_ONCHIP_HCI_CLIENT:
return "HCI traffic routed internally";
case CSR_PSKEY_RX_ATTEN_BACKOFF:
return "Receiver attenuation back-off";
case CSR_PSKEY_RX_ATTEN_UPDATE_RATE:
return "Receiver attenuation update rate";
case CSR_PSKEY_SYNTH_TXRX_THRESHOLDS:
return "Local oscillator tuning voltage limits for tx and rx";
case CSR_PSKEY_MIN_WAIT_STATES:
return "Flash wait state indicator";
case CSR_PSKEY_RSSI_CORRECTION:
return "RSSI correction factor.";
case CSR_PSKEY_SCHED_THROTTLE_TIMEOUT:
return "Scheduler performance control.";
case CSR_PSKEY_DEEP_SLEEP_USE_EXTERNAL_CLOCK:
return "Deep sleep uses external 32 kHz clock source";
case CSR_PSKEY_TRIM_RADIO_FILTERS:
return "Trim rx and tx radio filters if true.";
case CSR_PSKEY_TRANSMIT_OFFSET:
return "Transmit offset in units of 62.5 kHz";
case CSR_PSKEY_USB_VM_CONTROL:
return "VM application will supply USB descriptors";
case CSR_PSKEY_MR_ANA_RX_FTRIM:
return "Medium rate value for the ANA_RX_FTRIM register";
case CSR_PSKEY_I2C_CONFIG:
return "I2C configuration";
case CSR_PSKEY_IQ_LVL_RX:
return "IQ demand level for reception";
case CSR_PSKEY_MR_TX_FILTER_CONFIG:
return "TX filter configuration used for enhanced data rate";
case CSR_PSKEY_MR_TX_CONFIG2:
return "TX filter configuration used for enhanced data rate";
case CSR_PSKEY_USB_DONT_RESET_BOOTMODE_ON_HOST_RESET:
return "Don't reset bootmode if USB host resets";
case CSR_PSKEY_LC_USE_THROTTLING:
return "Adjust packet selection on packet error rate";
case CSR_PSKEY_CHARGER_TRIM:
return "Trim value for the current charger";
case CSR_PSKEY_CLOCK_REQUEST_FEATURES:
return "Clock request is tristated if enabled";
case CSR_PSKEY_TRANSMIT_OFFSET_CLASS1:
return "Transmit offset / 62.5 kHz for class 1 radios";
case CSR_PSKEY_TX_AVOID_PA_CLASS1_PIO:
return "PIO line asserted in class1 operation to avoid PA";
case CSR_PSKEY_MR_PIO_CONFIG:
return "PIO line asserted in class1 operation to avoid PA";
case CSR_PSKEY_UART_CONFIG2:
return "The UART Sampling point";
case CSR_PSKEY_CLASS1_IQ_LVL:
return "IQ demand level for class 1 power level";
case CSR_PSKEY_CLASS1_TX_CONFIG2:
return "TX filter configuration used for class 1 tx power";
case CSR_PSKEY_TEMPERATURE_VS_DELTA_INTERNAL_PA_CLASS1:
return "Temperature for given internal PA adjustment";
case CSR_PSKEY_TEMPERATURE_VS_DELTA_EXTERNAL_PA_CLASS1:
return "Temperature for given internal PA adjustment";
case CSR_PSKEY_TEMPERATURE_VS_DELTA_TX_PRE_LVL_MR:
return "Temperature adjustment for TX_PRE_LVL in EDR";
case CSR_PSKEY_TEMPERATURE_VS_DELTA_TX_BB_MR_HEADER:
return "Temperature for a given TX_BB in EDR header";
case CSR_PSKEY_TEMPERATURE_VS_DELTA_TX_BB_MR_PAYLOAD:
return "Temperature for a given TX_BB in EDR payload";
case CSR_PSKEY_RX_MR_EQ_TAPS:
return "Adjust receiver configuration for EDR";
case CSR_PSKEY_TX_PRE_LVL_CLASS1:
return "TX pre-amplifier level in class 1 operation";
case CSR_PSKEY_ANALOGUE_ATTENUATOR:
return "TX analogue attenuator setting";
case CSR_PSKEY_MR_RX_FILTER_TRIM:
return "Trim for receiver used in EDR.";
case CSR_PSKEY_MR_RX_FILTER_RESPONSE:
return "Filter response for receiver used in EDR.";
case CSR_PSKEY_PIO_WAKEUP_STATE:
return "PIO deep sleep wake up state ";
case CSR_PSKEY_MR_TX_IF_ATTEN_OFF_TEMP:
return "TX IF atten off temperature when using EDR.";
case CSR_PSKEY_LO_DIV_LATCH_BYPASS:
return "Bypass latch for LO dividers";
case CSR_PSKEY_LO_VCO_STANDBY:
return "Use standby mode for the LO VCO";
case CSR_PSKEY_SLOW_CLOCK_FILTER_SHIFT:
return "Slow clock sampling filter constant";
case CSR_PSKEY_SLOW_CLOCK_FILTER_DIVIDER:
return "Slow clock filter fractional threshold";
case CSR_PSKEY_USB_ATTRIBUTES_POWER:
return "USB self powered";
case CSR_PSKEY_USB_ATTRIBUTES_WAKEUP:
return "USB responds to wake-up";
case CSR_PSKEY_DFU_ATTRIBUTES_MANIFESTATION_TOLERANT:
return "DFU manifestation tolerant";
case CSR_PSKEY_DFU_ATTRIBUTES_CAN_UPLOAD:
return "DFU can upload";
case CSR_PSKEY_DFU_ATTRIBUTES_CAN_DOWNLOAD:
return "DFU can download";
case CSR_PSKEY_UART_CONFIG_STOP_BITS:
return "UART: stop bits";
case CSR_PSKEY_UART_CONFIG_PARITY_BIT:
return "UART: parity bit";
case CSR_PSKEY_UART_CONFIG_FLOW_CTRL_EN:
return "UART: hardware flow control";
case CSR_PSKEY_UART_CONFIG_RTS_AUTO_EN:
return "UART: RTS auto-enabled";
case CSR_PSKEY_UART_CONFIG_RTS:
return "UART: RTS asserted";
case CSR_PSKEY_UART_CONFIG_TX_ZERO_EN:
return "UART: TX zero enable";
case CSR_PSKEY_UART_CONFIG_NON_BCSP_EN:
return "UART: enable BCSP-specific hardware";
case CSR_PSKEY_UART_CONFIG_RX_RATE_DELAY:
return "UART: RX rate delay";
case CSR_PSKEY_UART_SEQ_TIMEOUT:
return "UART: BCSP ack timeout";
case CSR_PSKEY_UART_SEQ_RETRIES:
return "UART: retry limit in sequencing layer";
case CSR_PSKEY_UART_SEQ_WINSIZE:
return "UART: BCSP transmit window size";
case CSR_PSKEY_UART_USE_CRC_ON_TX:
return "UART: use BCSP CRCs";
case CSR_PSKEY_UART_HOST_INITIAL_STATE:
return "UART: initial host state";
case CSR_PSKEY_UART_HOST_ATTENTION_SPAN:
return "UART: host attention span";
case CSR_PSKEY_UART_HOST_WAKEUP_TIME:
return "UART: host wakeup time";
case CSR_PSKEY_UART_HOST_WAKEUP_WAIT:
return "UART: host wakeup wait";
case CSR_PSKEY_BCSP_LM_MODE:
return "BCSP link establishment mode";
case CSR_PSKEY_BCSP_LM_SYNC_RETRIES:
return "BCSP link establishment sync retries";
case CSR_PSKEY_BCSP_LM_TSHY:
return "BCSP link establishment Tshy";
case CSR_PSKEY_UART_DFU_CONFIG_STOP_BITS:
return "DFU mode UART: stop bits";
case CSR_PSKEY_UART_DFU_CONFIG_PARITY_BIT:
return "DFU mode UART: parity bit";
case CSR_PSKEY_UART_DFU_CONFIG_FLOW_CTRL_EN:
return "DFU mode UART: hardware flow control";
case CSR_PSKEY_UART_DFU_CONFIG_RTS_AUTO_EN:
return "DFU mode UART: RTS auto-enabled";
case CSR_PSKEY_UART_DFU_CONFIG_RTS:
return "DFU mode UART: RTS asserted";
case CSR_PSKEY_UART_DFU_CONFIG_TX_ZERO_EN:
return "DFU mode UART: TX zero enable";
case CSR_PSKEY_UART_DFU_CONFIG_NON_BCSP_EN:
return "DFU mode UART: enable BCSP-specific hardware";
case CSR_PSKEY_UART_DFU_CONFIG_RX_RATE_DELAY:
return "DFU mode UART: RX rate delay";
case CSR_PSKEY_AMUX_AIO0:
return "Multiplexer for AIO 0";
case CSR_PSKEY_AMUX_AIO1:
return "Multiplexer for AIO 1";
case CSR_PSKEY_AMUX_AIO2:
return "Multiplexer for AIO 2";
case CSR_PSKEY_AMUX_AIO3:
return "Multiplexer for AIO 3";
case CSR_PSKEY_LOCAL_NAME_SIMPLIFIED:
return "Local Name (simplified)";
case CSR_PSKEY_EXTENDED_STUB:
return "Extended stub";
default:
return "Unknown";
}
}
char *csr_pskeytoval(uint16_t pskey)
{
switch (pskey) {
case CSR_PSKEY_BDADDR:
return "BDADDR";
case CSR_PSKEY_COUNTRYCODE:
return "COUNTRYCODE";
case CSR_PSKEY_CLASSOFDEVICE:
return "CLASSOFDEVICE";
case CSR_PSKEY_DEVICE_DRIFT:
return "DEVICE_DRIFT";
case CSR_PSKEY_DEVICE_JITTER:
return "DEVICE_JITTER";
case CSR_PSKEY_MAX_ACLS:
return "MAX_ACLS";
case CSR_PSKEY_MAX_SCOS:
return "MAX_SCOS";
case CSR_PSKEY_MAX_REMOTE_MASTERS:
return "MAX_REMOTE_MASTERS";
case CSR_PSKEY_ENABLE_MASTERY_WITH_SLAVERY:
return "ENABLE_MASTERY_WITH_SLAVERY";
case CSR_PSKEY_H_HC_FC_MAX_ACL_PKT_LEN:
return "H_HC_FC_MAX_ACL_PKT_LEN";
case CSR_PSKEY_H_HC_FC_MAX_SCO_PKT_LEN:
return "H_HC_FC_MAX_SCO_PKT_LEN";
case CSR_PSKEY_H_HC_FC_MAX_ACL_PKTS:
return "H_HC_FC_MAX_ACL_PKTS";
case CSR_PSKEY_H_HC_FC_MAX_SCO_PKTS:
return "H_HC_FC_MAX_SCO_PKTS";
case CSR_PSKEY_LC_FC_BUFFER_LOW_WATER_MARK:
return "LC_FC_BUFFER_LOW_WATER_MARK";
case CSR_PSKEY_LC_MAX_TX_POWER:
return "LC_MAX_TX_POWER";
case CSR_PSKEY_TX_GAIN_RAMP:
return "TX_GAIN_RAMP";
case CSR_PSKEY_LC_POWER_TABLE:
return "LC_POWER_TABLE";
case CSR_PSKEY_LC_PEER_POWER_PERIOD:
return "LC_PEER_POWER_PERIOD";
case CSR_PSKEY_LC_FC_POOLS_LOW_WATER_MARK:
return "LC_FC_POOLS_LOW_WATER_MARK";
case CSR_PSKEY_LC_DEFAULT_TX_POWER:
return "LC_DEFAULT_TX_POWER";
case CSR_PSKEY_LC_RSSI_GOLDEN_RANGE:
return "LC_RSSI_GOLDEN_RANGE";
case CSR_PSKEY_LC_COMBO_DISABLE_PIO_MASK:
return "LC_COMBO_DISABLE_PIO_MASK";
case CSR_PSKEY_LC_COMBO_PRIORITY_PIO_MASK:
return "LC_COMBO_PRIORITY_PIO_MASK";
case CSR_PSKEY_LC_COMBO_DOT11_CHANNEL_PIO_BASE:
return "LC_COMBO_DOT11_CHANNEL_PIO_BASE";
case CSR_PSKEY_LC_COMBO_DOT11_BLOCK_CHANNELS:
return "LC_COMBO_DOT11_BLOCK_CHANNELS";
case CSR_PSKEY_LC_MAX_TX_POWER_NO_RSSI:
return "LC_MAX_TX_POWER_NO_RSSI";
case CSR_PSKEY_LC_CONNECTION_RX_WINDOW:
return "LC_CONNECTION_RX_WINDOW";
case CSR_PSKEY_LC_COMBO_DOT11_TX_PROTECTION_MODE:
return "LC_COMBO_DOT11_TX_PROTECTION_MODE";
case CSR_PSKEY_LC_ENHANCED_POWER_TABLE:
return "LC_ENHANCED_POWER_TABLE";
case CSR_PSKEY_LC_WIDEBAND_RSSI_CONFIG:
return "LC_WIDEBAND_RSSI_CONFIG";
case CSR_PSKEY_LC_COMBO_DOT11_PRIORITY_LEAD:
return "LC_COMBO_DOT11_PRIORITY_LEAD";
case CSR_PSKEY_BT_CLOCK_INIT:
return "BT_CLOCK_INIT";
case CSR_PSKEY_TX_MR_MOD_DELAY:
return "TX_MR_MOD_DELAY";
case CSR_PSKEY_RX_MR_SYNC_TIMING:
return "RX_MR_SYNC_TIMING";
case CSR_PSKEY_RX_MR_SYNC_CONFIG:
return "RX_MR_SYNC_CONFIG";
case CSR_PSKEY_LC_LOST_SYNC_SLOTS:
return "LC_LOST_SYNC_SLOTS";
case CSR_PSKEY_RX_MR_SAMP_CONFIG:
return "RX_MR_SAMP_CONFIG";
case CSR_PSKEY_AGC_HYST_LEVELS:
return "AGC_HYST_LEVELS";
case CSR_PSKEY_RX_LEVEL_LOW_SIGNAL:
return "RX_LEVEL_LOW_SIGNAL";
case CSR_PSKEY_AGC_IQ_LVL_VALUES:
return "AGC_IQ_LVL_VALUES";
case CSR_PSKEY_MR_FTRIM_OFFSET_12DB:
return "MR_FTRIM_OFFSET_12DB";
case CSR_PSKEY_MR_FTRIM_OFFSET_6DB:
return "MR_FTRIM_OFFSET_6DB";
case CSR_PSKEY_NO_CAL_ON_BOOT:
return "NO_CAL_ON_BOOT";
case CSR_PSKEY_RSSI_HI_TARGET:
return "RSSI_HI_TARGET";
case CSR_PSKEY_PREFERRED_MIN_ATTENUATION:
return "PREFERRED_MIN_ATTENUATION";
case CSR_PSKEY_LC_COMBO_DOT11_PRIORITY_OVERRIDE:
return "LC_COMBO_DOT11_PRIORITY_OVERRIDE";
case CSR_PSKEY_LC_MULTISLOT_HOLDOFF:
return "LC_MULTISLOT_HOLDOFF";
case CSR_PSKEY_FREE_KEY_PIGEON_HOLE:
return "FREE_KEY_PIGEON_HOLE";
case CSR_PSKEY_LINK_KEY_BD_ADDR0:
return "LINK_KEY_BD_ADDR0";
case CSR_PSKEY_LINK_KEY_BD_ADDR1:
return "LINK_KEY_BD_ADDR1";
case CSR_PSKEY_LINK_KEY_BD_ADDR2:
return "LINK_KEY_BD_ADDR2";
case CSR_PSKEY_LINK_KEY_BD_ADDR3:
return "LINK_KEY_BD_ADDR3";
case CSR_PSKEY_LINK_KEY_BD_ADDR4:
return "LINK_KEY_BD_ADDR4";
case CSR_PSKEY_LINK_KEY_BD_ADDR5:
return "LINK_KEY_BD_ADDR5";
case CSR_PSKEY_LINK_KEY_BD_ADDR6:
return "LINK_KEY_BD_ADDR6";
case CSR_PSKEY_LINK_KEY_BD_ADDR7:
return "LINK_KEY_BD_ADDR7";
case CSR_PSKEY_LINK_KEY_BD_ADDR8:
return "LINK_KEY_BD_ADDR8";
case CSR_PSKEY_LINK_KEY_BD_ADDR9:
return "LINK_KEY_BD_ADDR9";
case CSR_PSKEY_LINK_KEY_BD_ADDR10:
return "LINK_KEY_BD_ADDR10";
case CSR_PSKEY_LINK_KEY_BD_ADDR11:
return "LINK_KEY_BD_ADDR11";
case CSR_PSKEY_LINK_KEY_BD_ADDR12:
return "LINK_KEY_BD_ADDR12";
case CSR_PSKEY_LINK_KEY_BD_ADDR13:
return "LINK_KEY_BD_ADDR13";
case CSR_PSKEY_LINK_KEY_BD_ADDR14:
return "LINK_KEY_BD_ADDR14";
case CSR_PSKEY_LINK_KEY_BD_ADDR15:
return "LINK_KEY_BD_ADDR15";
case CSR_PSKEY_ENC_KEY_LMIN:
return "ENC_KEY_LMIN";
case CSR_PSKEY_ENC_KEY_LMAX:
return "ENC_KEY_LMAX";
case CSR_PSKEY_LOCAL_SUPPORTED_FEATURES:
return "LOCAL_SUPPORTED_FEATURES";
case CSR_PSKEY_LM_USE_UNIT_KEY:
return "LM_USE_UNIT_KEY";
case CSR_PSKEY_HCI_NOP_DISABLE:
return "HCI_NOP_DISABLE";
case CSR_PSKEY_LM_MAX_EVENT_FILTERS:
return "LM_MAX_EVENT_FILTERS";
case CSR_PSKEY_LM_USE_ENC_MODE_BROADCAST:
return "LM_USE_ENC_MODE_BROADCAST";
case CSR_PSKEY_LM_TEST_SEND_ACCEPTED_TWICE:
return "LM_TEST_SEND_ACCEPTED_TWICE";
case CSR_PSKEY_LM_MAX_PAGE_HOLD_TIME:
return "LM_MAX_PAGE_HOLD_TIME";
case CSR_PSKEY_AFH_ADAPTATION_RESPONSE_TIME:
return "AFH_ADAPTATION_RESPONSE_TIME";
case CSR_PSKEY_AFH_OPTIONS:
return "AFH_OPTIONS";
case CSR_PSKEY_AFH_RSSI_RUN_PERIOD:
return "AFH_RSSI_RUN_PERIOD";
case CSR_PSKEY_AFH_REENABLE_CHANNEL_TIME:
return "AFH_REENABLE_CHANNEL_TIME";
case CSR_PSKEY_NO_DROP_ON_ACR_MS_FAIL:
return "NO_DROP_ON_ACR_MS_FAIL";
case CSR_PSKEY_MAX_PRIVATE_KEYS:
return "MAX_PRIVATE_KEYS";
case CSR_PSKEY_PRIVATE_LINK_KEY_BD_ADDR0:
return "PRIVATE_LINK_KEY_BD_ADDR0";
case CSR_PSKEY_PRIVATE_LINK_KEY_BD_ADDR1:
return "PRIVATE_LINK_KEY_BD_ADDR1";
case CSR_PSKEY_PRIVATE_LINK_KEY_BD_ADDR2:
return "PRIVATE_LINK_KEY_BD_ADDR2";
case CSR_PSKEY_PRIVATE_LINK_KEY_BD_ADDR3:
return "PRIVATE_LINK_KEY_BD_ADDR3";
case CSR_PSKEY_PRIVATE_LINK_KEY_BD_ADDR4:
return "PRIVATE_LINK_KEY_BD_ADDR4";
case CSR_PSKEY_PRIVATE_LINK_KEY_BD_ADDR5:
return "PRIVATE_LINK_KEY_BD_ADDR5";
case CSR_PSKEY_PRIVATE_LINK_KEY_BD_ADDR6:
return "PRIVATE_LINK_KEY_BD_ADDR6";
case CSR_PSKEY_PRIVATE_LINK_KEY_BD_ADDR7:
return "PRIVATE_LINK_KEY_BD_ADDR7";
case CSR_PSKEY_LOCAL_SUPPORTED_COMMANDS:
return "LOCAL_SUPPORTED_COMMANDS";
case CSR_PSKEY_LM_MAX_ABSENCE_INDEX:
return "LM_MAX_ABSENCE_INDEX";
case CSR_PSKEY_DEVICE_NAME:
return "DEVICE_NAME";
case CSR_PSKEY_AFH_RSSI_THRESHOLD:
return "AFH_RSSI_THRESHOLD";
case CSR_PSKEY_LM_CASUAL_SCAN_INTERVAL:
return "LM_CASUAL_SCAN_INTERVAL";
case CSR_PSKEY_AFH_MIN_MAP_CHANGE:
return "AFH_MIN_MAP_CHANGE";
case CSR_PSKEY_AFH_RSSI_LP_RUN_PERIOD:
return "AFH_RSSI_LP_RUN_PERIOD";
case CSR_PSKEY_HCI_LMP_LOCAL_VERSION:
return "HCI_LMP_LOCAL_VERSION";
case CSR_PSKEY_LMP_REMOTE_VERSION:
return "LMP_REMOTE_VERSION";
case CSR_PSKEY_HOLD_ERROR_MESSAGE_NUMBER:
return "HOLD_ERROR_MESSAGE_NUMBER";
case CSR_PSKEY_DFU_ATTRIBUTES:
return "DFU_ATTRIBUTES";
case CSR_PSKEY_DFU_DETACH_TO:
return "DFU_DETACH_TO";
case CSR_PSKEY_DFU_TRANSFER_SIZE:
return "DFU_TRANSFER_SIZE";
case CSR_PSKEY_DFU_ENABLE:
return "DFU_ENABLE";
case CSR_PSKEY_DFU_LIN_REG_ENABLE:
return "DFU_LIN_REG_ENABLE";
case CSR_PSKEY_DFUENC_VMAPP_PK_MODULUS_MSB:
return "DFUENC_VMAPP_PK_MODULUS_MSB";
case CSR_PSKEY_DFUENC_VMAPP_PK_MODULUS_LSB:
return "DFUENC_VMAPP_PK_MODULUS_LSB";
case CSR_PSKEY_DFUENC_VMAPP_PK_M_DASH:
return "DFUENC_VMAPP_PK_M_DASH";
case CSR_PSKEY_DFUENC_VMAPP_PK_R2N_MSB:
return "DFUENC_VMAPP_PK_R2N_MSB";
case CSR_PSKEY_DFUENC_VMAPP_PK_R2N_LSB:
return "DFUENC_VMAPP_PK_R2N_LSB";
case CSR_PSKEY_BCSP_LM_PS_BLOCK:
return "BCSP_LM_PS_BLOCK";
case CSR_PSKEY_HOSTIO_FC_PS_BLOCK:
return "HOSTIO_FC_PS_BLOCK";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO0:
return "HOSTIO_PROTOCOL_INFO0";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO1:
return "HOSTIO_PROTOCOL_INFO1";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO2:
return "HOSTIO_PROTOCOL_INFO2";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO3:
return "HOSTIO_PROTOCOL_INFO3";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO4:
return "HOSTIO_PROTOCOL_INFO4";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO5:
return "HOSTIO_PROTOCOL_INFO5";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO6:
return "HOSTIO_PROTOCOL_INFO6";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO7:
return "HOSTIO_PROTOCOL_INFO7";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO8:
return "HOSTIO_PROTOCOL_INFO8";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO9:
return "HOSTIO_PROTOCOL_INFO9";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO10:
return "HOSTIO_PROTOCOL_INFO10";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO11:
return "HOSTIO_PROTOCOL_INFO11";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO12:
return "HOSTIO_PROTOCOL_INFO12";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO13:
return "HOSTIO_PROTOCOL_INFO13";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO14:
return "HOSTIO_PROTOCOL_INFO14";
case CSR_PSKEY_HOSTIO_PROTOCOL_INFO15:
return "HOSTIO_PROTOCOL_INFO15";
case CSR_PSKEY_HOSTIO_UART_RESET_TIMEOUT:
return "HOSTIO_UART_RESET_TIMEOUT";
case CSR_PSKEY_HOSTIO_USE_HCI_EXTN:
return "HOSTIO_USE_HCI_EXTN";
case CSR_PSKEY_HOSTIO_USE_HCI_EXTN_CCFC:
return "HOSTIO_USE_HCI_EXTN_CCFC";
case CSR_PSKEY_HOSTIO_HCI_EXTN_PAYLOAD_SIZE:
return "HOSTIO_HCI_EXTN_PAYLOAD_SIZE";
case CSR_PSKEY_BCSP_LM_CNF_CNT_LIMIT:
return "BCSP_LM_CNF_CNT_LIMIT";
case CSR_PSKEY_HOSTIO_MAP_SCO_PCM:
return "HOSTIO_MAP_SCO_PCM";
case CSR_PSKEY_HOSTIO_AWKWARD_PCM_SYNC:
return "HOSTIO_AWKWARD_PCM_SYNC";
case CSR_PSKEY_HOSTIO_BREAK_POLL_PERIOD:
return "HOSTIO_BREAK_POLL_PERIOD";
case CSR_PSKEY_HOSTIO_MIN_UART_HCI_SCO_SIZE:
return "HOSTIO_MIN_UART_HCI_SCO_SIZE";
case CSR_PSKEY_HOSTIO_MAP_SCO_CODEC:
return "HOSTIO_MAP_SCO_CODEC";
case CSR_PSKEY_PCM_CVSD_TX_HI_FREQ_BOOST:
return "PCM_CVSD_TX_HI_FREQ_BOOST";
case CSR_PSKEY_PCM_CVSD_RX_HI_FREQ_BOOST:
return "PCM_CVSD_RX_HI_FREQ_BOOST";
case CSR_PSKEY_PCM_CONFIG32:
return "PCM_CONFIG32";
case CSR_PSKEY_USE_OLD_BCSP_LE:
return "USE_OLD_BCSP_LE";
case CSR_PSKEY_PCM_CVSD_USE_NEW_FILTER:
return "PCM_CVSD_USE_NEW_FILTER";
case CSR_PSKEY_PCM_FORMAT:
return "PCM_FORMAT";
case CSR_PSKEY_CODEC_OUT_GAIN:
return "CODEC_OUT_GAIN";
case CSR_PSKEY_CODEC_IN_GAIN:
return "CODEC_IN_GAIN";
case CSR_PSKEY_CODEC_PIO:
return "CODEC_PIO";
case CSR_PSKEY_PCM_LOW_JITTER_CONFIG:
return "PCM_LOW_JITTER_CONFIG";
case CSR_PSKEY_HOSTIO_SCO_PCM_THRESHOLDS:
return "HOSTIO_SCO_PCM_THRESHOLDS";
case CSR_PSKEY_HOSTIO_SCO_HCI_THRESHOLDS:
return "HOSTIO_SCO_HCI_THRESHOLDS";
case CSR_PSKEY_HOSTIO_MAP_SCO_PCM_SLOT:
return "HOSTIO_MAP_SCO_PCM_SLOT";
case CSR_PSKEY_UART_BAUDRATE:
return "UART_BAUDRATE";
case CSR_PSKEY_UART_CONFIG_BCSP:
return "UART_CONFIG_BCSP";
case CSR_PSKEY_UART_CONFIG_H4:
return "UART_CONFIG_H4";
case CSR_PSKEY_UART_CONFIG_H5:
return "UART_CONFIG_H5";
case CSR_PSKEY_UART_CONFIG_USR:
return "UART_CONFIG_USR";
case CSR_PSKEY_UART_TX_CRCS:
return "UART_TX_CRCS";
case CSR_PSKEY_UART_ACK_TIMEOUT:
return "UART_ACK_TIMEOUT";
case CSR_PSKEY_UART_TX_MAX_ATTEMPTS:
return "UART_TX_MAX_ATTEMPTS";
case CSR_PSKEY_UART_TX_WINDOW_SIZE:
return "UART_TX_WINDOW_SIZE";
case CSR_PSKEY_UART_HOST_WAKE:
return "UART_HOST_WAKE";
case CSR_PSKEY_HOSTIO_THROTTLE_TIMEOUT:
return "HOSTIO_THROTTLE_TIMEOUT";
case CSR_PSKEY_PCM_ALWAYS_ENABLE:
return "PCM_ALWAYS_ENABLE";
case CSR_PSKEY_UART_HOST_WAKE_SIGNAL:
return "UART_HOST_WAKE_SIGNAL";
case CSR_PSKEY_UART_CONFIG_H4DS:
return "UART_CONFIG_H4DS";
case CSR_PSKEY_H4DS_WAKE_DURATION:
return "H4DS_WAKE_DURATION";
case CSR_PSKEY_H4DS_MAXWU:
return "H4DS_MAXWU";
case CSR_PSKEY_H4DS_LE_TIMER_PERIOD:
return "H4DS_LE_TIMER_PERIOD";
case CSR_PSKEY_H4DS_TWU_TIMER_PERIOD:
return "H4DS_TWU_TIMER_PERIOD";
case CSR_PSKEY_H4DS_UART_IDLE_TIMER_PERIOD:
return "H4DS_UART_IDLE_TIMER_PERIOD";
case CSR_PSKEY_ANA_FTRIM:
return "ANA_FTRIM";
case CSR_PSKEY_WD_TIMEOUT:
return "WD_TIMEOUT";
case CSR_PSKEY_WD_PERIOD:
return "WD_PERIOD";
case CSR_PSKEY_HOST_INTERFACE:
return "HOST_INTERFACE";
case CSR_PSKEY_HQ_HOST_TIMEOUT:
return "HQ_HOST_TIMEOUT";
case CSR_PSKEY_HQ_ACTIVE:
return "HQ_ACTIVE";
case CSR_PSKEY_BCCMD_SECURITY_ACTIVE:
return "BCCMD_SECURITY_ACTIVE";
case CSR_PSKEY_ANA_FREQ:
return "ANA_FREQ";
case CSR_PSKEY_PIO_PROTECT_MASK:
return "PIO_PROTECT_MASK";
case CSR_PSKEY_PMALLOC_SIZES:
return "PMALLOC_SIZES";
case CSR_PSKEY_UART_BAUD_RATE:
return "UART_BAUD_RATE";
case CSR_PSKEY_UART_CONFIG:
return "UART_CONFIG";
case CSR_PSKEY_STUB:
return "STUB";
case CSR_PSKEY_TXRX_PIO_CONTROL:
return "TXRX_PIO_CONTROL";
case CSR_PSKEY_ANA_RX_LEVEL:
return "ANA_RX_LEVEL";
case CSR_PSKEY_ANA_RX_FTRIM:
return "ANA_RX_FTRIM";
case CSR_PSKEY_PSBC_DATA_VERSION:
return "PSBC_DATA_VERSION";
case CSR_PSKEY_PCM0_ATTENUATION:
return "PCM0_ATTENUATION";
case CSR_PSKEY_LO_LVL_MAX:
return "LO_LVL_MAX";
case CSR_PSKEY_LO_ADC_AMPL_MIN:
return "LO_ADC_AMPL_MIN";
case CSR_PSKEY_LO_ADC_AMPL_MAX:
return "LO_ADC_AMPL_MAX";
case CSR_PSKEY_IQ_TRIM_CHANNEL:
return "IQ_TRIM_CHANNEL";
case CSR_PSKEY_IQ_TRIM_GAIN:
return "IQ_TRIM_GAIN";
case CSR_PSKEY_IQ_TRIM_ENABLE:
return "IQ_TRIM_ENABLE";
case CSR_PSKEY_TX_OFFSET_HALF_MHZ:
return "TX_OFFSET_HALF_MHZ";
case CSR_PSKEY_GBL_MISC_ENABLES:
return "GBL_MISC_ENABLES";
case CSR_PSKEY_UART_SLEEP_TIMEOUT:
return "UART_SLEEP_TIMEOUT";
case CSR_PSKEY_DEEP_SLEEP_STATE:
return "DEEP_SLEEP_STATE";
case CSR_PSKEY_IQ_ENABLE_PHASE_TRIM:
return "IQ_ENABLE_PHASE_TRIM";
case CSR_PSKEY_HCI_HANDLE_FREEZE_PERIOD:
return "HCI_HANDLE_FREEZE_PERIOD";
case CSR_PSKEY_MAX_FROZEN_HCI_HANDLES:
return "MAX_FROZEN_HCI_HANDLES";
case CSR_PSKEY_PAGETABLE_DESTRUCTION_DELAY:
return "PAGETABLE_DESTRUCTION_DELAY";
case CSR_PSKEY_IQ_TRIM_PIO_SETTINGS:
return "IQ_TRIM_PIO_SETTINGS";
case CSR_PSKEY_USE_EXTERNAL_CLOCK:
return "USE_EXTERNAL_CLOCK";
case CSR_PSKEY_DEEP_SLEEP_WAKE_CTS:
return "DEEP_SLEEP_WAKE_CTS";
case CSR_PSKEY_FC_HC2H_FLUSH_DELAY:
return "FC_HC2H_FLUSH_DELAY";
case CSR_PSKEY_RX_HIGHSIDE:
return "RX_HIGHSIDE";
case CSR_PSKEY_TX_PRE_LVL:
return "TX_PRE_LVL";
case CSR_PSKEY_RX_SINGLE_ENDED:
return "RX_SINGLE_ENDED";
case CSR_PSKEY_TX_FILTER_CONFIG:
return "TX_FILTER_CONFIG";
case CSR_PSKEY_CLOCK_REQUEST_ENABLE:
return "CLOCK_REQUEST_ENABLE";
case CSR_PSKEY_RX_MIN_ATTEN:
return "RX_MIN_ATTEN";
case CSR_PSKEY_XTAL_TARGET_AMPLITUDE:
return "XTAL_TARGET_AMPLITUDE";
case CSR_PSKEY_PCM_MIN_CPU_CLOCK:
return "PCM_MIN_CPU_CLOCK";
case CSR_PSKEY_HOST_INTERFACE_PIO_USB:
return "HOST_INTERFACE_PIO_USB";
case CSR_PSKEY_CPU_IDLE_MODE:
return "CPU_IDLE_MODE";
case CSR_PSKEY_DEEP_SLEEP_CLEAR_RTS:
return "DEEP_SLEEP_CLEAR_RTS";
case CSR_PSKEY_RF_RESONANCE_TRIM:
return "RF_RESONANCE_TRIM";
case CSR_PSKEY_DEEP_SLEEP_PIO_WAKE:
return "DEEP_SLEEP_PIO_WAKE";
case CSR_PSKEY_DRAIN_BORE_TIMERS:
return "DRAIN_BORE_TIMERS";
case CSR_PSKEY_DRAIN_TX_POWER_BASE:
return "DRAIN_TX_POWER_BASE";
case CSR_PSKEY_MODULE_ID:
return "MODULE_ID";
case CSR_PSKEY_MODULE_DESIGN:
return "MODULE_DESIGN";
case CSR_PSKEY_MODULE_SECURITY_CODE:
return "MODULE_SECURITY_CODE";
case CSR_PSKEY_VM_DISABLE:
return "VM_DISABLE";
case CSR_PSKEY_MOD_MANUF0:
return "MOD_MANUF0";
case CSR_PSKEY_MOD_MANUF1:
return "MOD_MANUF1";
case CSR_PSKEY_MOD_MANUF2:
return "MOD_MANUF2";
case CSR_PSKEY_MOD_MANUF3:
return "MOD_MANUF3";
case CSR_PSKEY_MOD_MANUF4:
return "MOD_MANUF4";
case CSR_PSKEY_MOD_MANUF5:
return "MOD_MANUF5";
case CSR_PSKEY_MOD_MANUF6:
return "MOD_MANUF6";
case CSR_PSKEY_MOD_MANUF7:
return "MOD_MANUF7";
case CSR_PSKEY_MOD_MANUF8:
return "MOD_MANUF8";
case CSR_PSKEY_MOD_MANUF9:
return "MOD_MANUF9";
case CSR_PSKEY_DUT_VM_DISABLE:
return "DUT_VM_DISABLE";
case CSR_PSKEY_USR0:
return "USR0";
case CSR_PSKEY_USR1:
return "USR1";
case CSR_PSKEY_USR2:
return "USR2";
case CSR_PSKEY_USR3:
return "USR3";
case CSR_PSKEY_USR4:
return "USR4";
case CSR_PSKEY_USR5:
return "USR5";
case CSR_PSKEY_USR6:
return "USR6";
case CSR_PSKEY_USR7:
return "USR7";
case CSR_PSKEY_USR8:
return "USR8";
case CSR_PSKEY_USR9:
return "USR9";
case CSR_PSKEY_USR10:
return "USR10";
case CSR_PSKEY_USR11:
return "USR11";
case CSR_PSKEY_USR12:
return "USR12";
case CSR_PSKEY_USR13:
return "USR13";
case CSR_PSKEY_USR14:
return "USR14";
case CSR_PSKEY_USR15:
return "USR15";
case CSR_PSKEY_USR16:
return "USR16";
case CSR_PSKEY_USR17:
return "USR17";
case CSR_PSKEY_USR18:
return "USR18";
case CSR_PSKEY_USR19:
return "USR19";
case CSR_PSKEY_USR20:
return "USR20";
case CSR_PSKEY_USR21:
return "USR21";
case CSR_PSKEY_USR22:
return "USR22";
case CSR_PSKEY_USR23:
return "USR23";
case CSR_PSKEY_USR24:
return "USR24";
case CSR_PSKEY_USR25:
return "USR25";
case CSR_PSKEY_USR26:
return "USR26";
case CSR_PSKEY_USR27:
return "USR27";
case CSR_PSKEY_USR28:
return "USR28";
case CSR_PSKEY_USR29:
return "USR29";
case CSR_PSKEY_USR30:
return "USR30";
case CSR_PSKEY_USR31:
return "USR31";
case CSR_PSKEY_USR32:
return "USR32";
case CSR_PSKEY_USR33:
return "USR33";
case CSR_PSKEY_USR34:
return "USR34";
case CSR_PSKEY_USR35:
return "USR35";
case CSR_PSKEY_USR36:
return "USR36";
case CSR_PSKEY_USR37:
return "USR37";
case CSR_PSKEY_USR38:
return "USR38";
case CSR_PSKEY_USR39:
return "USR39";
case CSR_PSKEY_USR40:
return "USR40";
case CSR_PSKEY_USR41:
return "USR41";
case CSR_PSKEY_USR42:
return "USR42";
case CSR_PSKEY_USR43:
return "USR43";
case CSR_PSKEY_USR44:
return "USR44";
case CSR_PSKEY_USR45:
return "USR45";
case CSR_PSKEY_USR46:
return "USR46";
case CSR_PSKEY_USR47:
return "USR47";
case CSR_PSKEY_USR48:
return "USR48";
case CSR_PSKEY_USR49:
return "USR49";
case CSR_PSKEY_USB_VERSION:
return "USB_VERSION";
case CSR_PSKEY_USB_DEVICE_CLASS_CODES:
return "USB_DEVICE_CLASS_CODES";
case CSR_PSKEY_USB_VENDOR_ID:
return "USB_VENDOR_ID";
case CSR_PSKEY_USB_PRODUCT_ID:
return "USB_PRODUCT_ID";
case CSR_PSKEY_USB_MANUF_STRING:
return "USB_MANUF_STRING";
case CSR_PSKEY_USB_PRODUCT_STRING:
return "USB_PRODUCT_STRING";
case CSR_PSKEY_USB_SERIAL_NUMBER_STRING:
return "USB_SERIAL_NUMBER_STRING";
case CSR_PSKEY_USB_CONFIG_STRING:
return "USB_CONFIG_STRING";
case CSR_PSKEY_USB_ATTRIBUTES:
return "USB_ATTRIBUTES";
case CSR_PSKEY_USB_MAX_POWER:
return "USB_MAX_POWER";
case CSR_PSKEY_USB_BT_IF_CLASS_CODES:
return "USB_BT_IF_CLASS_CODES";
case CSR_PSKEY_USB_LANGID:
return "USB_LANGID";
case CSR_PSKEY_USB_DFU_CLASS_CODES:
return "USB_DFU_CLASS_CODES";
case CSR_PSKEY_USB_DFU_PRODUCT_ID:
return "USB_DFU_PRODUCT_ID";
case CSR_PSKEY_USB_PIO_DETACH:
return "USB_PIO_DETACH";
case CSR_PSKEY_USB_PIO_WAKEUP:
return "USB_PIO_WAKEUP";
case CSR_PSKEY_USB_PIO_PULLUP:
return "USB_PIO_PULLUP";
case CSR_PSKEY_USB_PIO_VBUS:
return "USB_PIO_VBUS";
case CSR_PSKEY_USB_PIO_WAKE_TIMEOUT:
return "USB_PIO_WAKE_TIMEOUT";
case CSR_PSKEY_USB_PIO_RESUME:
return "USB_PIO_RESUME";
case CSR_PSKEY_USB_BT_SCO_IF_CLASS_CODES:
return "USB_BT_SCO_IF_CLASS_CODES";
case CSR_PSKEY_USB_SUSPEND_PIO_LEVEL:
return "USB_SUSPEND_PIO_LEVEL";
case CSR_PSKEY_USB_SUSPEND_PIO_DIR:
return "USB_SUSPEND_PIO_DIR";
case CSR_PSKEY_USB_SUSPEND_PIO_MASK:
return "USB_SUSPEND_PIO_MASK";
case CSR_PSKEY_USB_ENDPOINT_0_MAX_PACKET_SIZE:
return "USB_ENDPOINT_0_MAX_PACKET_SIZE";
case CSR_PSKEY_USB_CONFIG:
return "USB_CONFIG";
case CSR_PSKEY_RADIOTEST_ATTEN_INIT:
return "RADIOTEST_ATTEN_INIT";
case CSR_PSKEY_RADIOTEST_FIRST_TRIM_TIME:
return "RADIOTEST_FIRST_TRIM_TIME";
case CSR_PSKEY_RADIOTEST_SUBSEQUENT_TRIM_TIME:
return "RADIOTEST_SUBSEQUENT_TRIM_TIME";
case CSR_PSKEY_RADIOTEST_LO_LVL_TRIM_ENABLE:
return "RADIOTEST_LO_LVL_TRIM_ENABLE";
case CSR_PSKEY_RADIOTEST_DISABLE_MODULATION:
return "RADIOTEST_DISABLE_MODULATION";
case CSR_PSKEY_RFCOMM_FCON_THRESHOLD:
return "RFCOMM_FCON_THRESHOLD";
case CSR_PSKEY_RFCOMM_FCOFF_THRESHOLD:
return "RFCOMM_FCOFF_THRESHOLD";
case CSR_PSKEY_IPV6_STATIC_ADDR:
return "IPV6_STATIC_ADDR";
case CSR_PSKEY_IPV4_STATIC_ADDR:
return "IPV4_STATIC_ADDR";
case CSR_PSKEY_IPV6_STATIC_PREFIX_LEN:
return "IPV6_STATIC_PREFIX_LEN";
case CSR_PSKEY_IPV6_STATIC_ROUTER_ADDR:
return "IPV6_STATIC_ROUTER_ADDR";
case CSR_PSKEY_IPV4_STATIC_SUBNET_MASK:
return "IPV4_STATIC_SUBNET_MASK";
case CSR_PSKEY_IPV4_STATIC_ROUTER_ADDR:
return "IPV4_STATIC_ROUTER_ADDR";
case CSR_PSKEY_MDNS_NAME:
return "MDNS_NAME";
case CSR_PSKEY_FIXED_PIN:
return "FIXED_PIN";
case CSR_PSKEY_MDNS_PORT:
return "MDNS_PORT";
case CSR_PSKEY_MDNS_TTL:
return "MDNS_TTL";
case CSR_PSKEY_MDNS_IPV4_ADDR:
return "MDNS_IPV4_ADDR";
case CSR_PSKEY_ARP_CACHE_TIMEOUT:
return "ARP_CACHE_TIMEOUT";
case CSR_PSKEY_HFP_POWER_TABLE:
return "HFP_POWER_TABLE";
case CSR_PSKEY_DRAIN_BORE_TIMER_COUNTERS:
return "DRAIN_BORE_TIMER_COUNTERS";
case CSR_PSKEY_DRAIN_BORE_COUNTERS:
return "DRAIN_BORE_COUNTERS";
case CSR_PSKEY_LOOP_FILTER_TRIM:
return "LOOP_FILTER_TRIM";
case CSR_PSKEY_DRAIN_BORE_CURRENT_PEAK:
return "DRAIN_BORE_CURRENT_PEAK";
case CSR_PSKEY_VM_E2_CACHE_LIMIT:
return "VM_E2_CACHE_LIMIT";
case CSR_PSKEY_FORCE_16MHZ_REF_PIO:
return "FORCE_16MHZ_REF_PIO";
case CSR_PSKEY_CDMA_LO_REF_LIMITS:
return "CDMA_LO_REF_LIMITS";
case CSR_PSKEY_CDMA_LO_ERROR_LIMITS:
return "CDMA_LO_ERROR_LIMITS";
case CSR_PSKEY_CLOCK_STARTUP_DELAY:
return "CLOCK_STARTUP_DELAY";
case CSR_PSKEY_DEEP_SLEEP_CORRECTION_FACTOR:
return "DEEP_SLEEP_CORRECTION_FACTOR";
case CSR_PSKEY_TEMPERATURE_CALIBRATION:
return "TEMPERATURE_CALIBRATION";
case CSR_PSKEY_TEMPERATURE_VS_DELTA_INTERNAL_PA:
return "TEMPERATURE_VS_DELTA_INTERNAL_PA";
case CSR_PSKEY_TEMPERATURE_VS_DELTA_TX_PRE_LVL:
return "TEMPERATURE_VS_DELTA_TX_PRE_LVL";
case CSR_PSKEY_TEMPERATURE_VS_DELTA_TX_BB:
return "TEMPERATURE_VS_DELTA_TX_BB";
case CSR_PSKEY_TEMPERATURE_VS_DELTA_ANA_FTRIM:
return "TEMPERATURE_VS_DELTA_ANA_FTRIM";
case CSR_PSKEY_TEST_DELTA_OFFSET:
return "TEST_DELTA_OFFSET";
case CSR_PSKEY_RX_DYNAMIC_LVL_OFFSET:
return "RX_DYNAMIC_LVL_OFFSET";
case CSR_PSKEY_TEST_FORCE_OFFSET:
return "TEST_FORCE_OFFSET";
case CSR_PSKEY_RF_TRAP_BAD_DIVISION_RATIOS:
return "RF_TRAP_BAD_DIVISION_RATIOS";
case CSR_PSKEY_RADIOTEST_CDMA_LO_REF_LIMITS:
return "RADIOTEST_CDMA_LO_REF_LIMITS";
case CSR_PSKEY_INITIAL_BOOTMODE:
return "INITIAL_BOOTMODE";
case CSR_PSKEY_ONCHIP_HCI_CLIENT:
return "ONCHIP_HCI_CLIENT";
case CSR_PSKEY_RX_ATTEN_BACKOFF:
return "RX_ATTEN_BACKOFF";
case CSR_PSKEY_RX_ATTEN_UPDATE_RATE:
return "RX_ATTEN_UPDATE_RATE";
case CSR_PSKEY_SYNTH_TXRX_THRESHOLDS:
return "SYNTH_TXRX_THRESHOLDS";
case CSR_PSKEY_MIN_WAIT_STATES:
return "MIN_WAIT_STATES";
case CSR_PSKEY_RSSI_CORRECTION:
return "RSSI_CORRECTION";
case CSR_PSKEY_SCHED_THROTTLE_TIMEOUT:
return "SCHED_THROTTLE_TIMEOUT";
case CSR_PSKEY_DEEP_SLEEP_USE_EXTERNAL_CLOCK:
return "DEEP_SLEEP_USE_EXTERNAL_CLOCK";
case CSR_PSKEY_TRIM_RADIO_FILTERS:
return "TRIM_RADIO_FILTERS";
case CSR_PSKEY_TRANSMIT_OFFSET:
return "TRANSMIT_OFFSET";
case CSR_PSKEY_USB_VM_CONTROL:
return "USB_VM_CONTROL";
case CSR_PSKEY_MR_ANA_RX_FTRIM:
return "MR_ANA_RX_FTRIM";
case CSR_PSKEY_I2C_CONFIG:
return "I2C_CONFIG";
case CSR_PSKEY_IQ_LVL_RX:
return "IQ_LVL_RX";
case CSR_PSKEY_MR_TX_FILTER_CONFIG:
return "MR_TX_FILTER_CONFIG";
case CSR_PSKEY_MR_TX_CONFIG2:
return "MR_TX_CONFIG2";
case CSR_PSKEY_USB_DONT_RESET_BOOTMODE_ON_HOST_RESET:
return "USB_DONT_RESET_BOOTMODE_ON_HOST_RESET";
case CSR_PSKEY_LC_USE_THROTTLING:
return "LC_USE_THROTTLING";
case CSR_PSKEY_CHARGER_TRIM:
return "CHARGER_TRIM";
case CSR_PSKEY_CLOCK_REQUEST_FEATURES:
return "CLOCK_REQUEST_FEATURES";
case CSR_PSKEY_TRANSMIT_OFFSET_CLASS1:
return "TRANSMIT_OFFSET_CLASS1";
case CSR_PSKEY_TX_AVOID_PA_CLASS1_PIO:
return "TX_AVOID_PA_CLASS1_PIO";
case CSR_PSKEY_MR_PIO_CONFIG:
return "MR_PIO_CONFIG";
case CSR_PSKEY_UART_CONFIG2:
return "UART_CONFIG2";
case CSR_PSKEY_CLASS1_IQ_LVL:
return "CLASS1_IQ_LVL";
case CSR_PSKEY_CLASS1_TX_CONFIG2:
return "CLASS1_TX_CONFIG2";
case CSR_PSKEY_TEMPERATURE_VS_DELTA_INTERNAL_PA_CLASS1:
return "TEMPERATURE_VS_DELTA_INTERNAL_PA_CLASS1";
case CSR_PSKEY_TEMPERATURE_VS_DELTA_EXTERNAL_PA_CLASS1:
return "TEMPERATURE_VS_DELTA_EXTERNAL_PA_CLASS1";
case CSR_PSKEY_TEMPERATURE_VS_DELTA_TX_PRE_LVL_MR:
return "TEMPERATURE_VS_DELTA_TX_PRE_LVL_MR";
case CSR_PSKEY_TEMPERATURE_VS_DELTA_TX_BB_MR_HEADER:
return "TEMPERATURE_VS_DELTA_TX_BB_MR_HEADER";
case CSR_PSKEY_TEMPERATURE_VS_DELTA_TX_BB_MR_PAYLOAD:
return "TEMPERATURE_VS_DELTA_TX_BB_MR_PAYLOAD";
case CSR_PSKEY_RX_MR_EQ_TAPS:
return "RX_MR_EQ_TAPS";
case CSR_PSKEY_TX_PRE_LVL_CLASS1:
return "TX_PRE_LVL_CLASS1";
case CSR_PSKEY_ANALOGUE_ATTENUATOR:
return "ANALOGUE_ATTENUATOR";
case CSR_PSKEY_MR_RX_FILTER_TRIM:
return "MR_RX_FILTER_TRIM";
case CSR_PSKEY_MR_RX_FILTER_RESPONSE:
return "MR_RX_FILTER_RESPONSE";
case CSR_PSKEY_PIO_WAKEUP_STATE:
return "PIO_WAKEUP_STATE";
case CSR_PSKEY_MR_TX_IF_ATTEN_OFF_TEMP:
return "MR_TX_IF_ATTEN_OFF_TEMP";
case CSR_PSKEY_LO_DIV_LATCH_BYPASS:
return "LO_DIV_LATCH_BYPASS";
case CSR_PSKEY_LO_VCO_STANDBY:
return "LO_VCO_STANDBY";
case CSR_PSKEY_SLOW_CLOCK_FILTER_SHIFT:
return "SLOW_CLOCK_FILTER_SHIFT";
case CSR_PSKEY_SLOW_CLOCK_FILTER_DIVIDER:
return "SLOW_CLOCK_FILTER_DIVIDER";
case CSR_PSKEY_USB_ATTRIBUTES_POWER:
return "USB_ATTRIBUTES_POWER";
case CSR_PSKEY_USB_ATTRIBUTES_WAKEUP:
return "USB_ATTRIBUTES_WAKEUP";
case CSR_PSKEY_DFU_ATTRIBUTES_MANIFESTATION_TOLERANT:
return "DFU_ATTRIBUTES_MANIFESTATION_TOLERANT";
case CSR_PSKEY_DFU_ATTRIBUTES_CAN_UPLOAD:
return "DFU_ATTRIBUTES_CAN_UPLOAD";
case CSR_PSKEY_DFU_ATTRIBUTES_CAN_DOWNLOAD:
return "DFU_ATTRIBUTES_CAN_DOWNLOAD";
case CSR_PSKEY_UART_CONFIG_STOP_BITS:
return "UART_CONFIG_STOP_BITS";
case CSR_PSKEY_UART_CONFIG_PARITY_BIT:
return "UART_CONFIG_PARITY_BIT";
case CSR_PSKEY_UART_CONFIG_FLOW_CTRL_EN:
return "UART_CONFIG_FLOW_CTRL_EN";
case CSR_PSKEY_UART_CONFIG_RTS_AUTO_EN:
return "UART_CONFIG_RTS_AUTO_EN";
case CSR_PSKEY_UART_CONFIG_RTS:
return "UART_CONFIG_RTS";
case CSR_PSKEY_UART_CONFIG_TX_ZERO_EN:
return "UART_CONFIG_TX_ZERO_EN";
case CSR_PSKEY_UART_CONFIG_NON_BCSP_EN:
return "UART_CONFIG_NON_BCSP_EN";
case CSR_PSKEY_UART_CONFIG_RX_RATE_DELAY:
return "UART_CONFIG_RX_RATE_DELAY";
case CSR_PSKEY_UART_SEQ_TIMEOUT:
return "UART_SEQ_TIMEOUT";
case CSR_PSKEY_UART_SEQ_RETRIES:
return "UART_SEQ_RETRIES";
case CSR_PSKEY_UART_SEQ_WINSIZE:
return "UART_SEQ_WINSIZE";
case CSR_PSKEY_UART_USE_CRC_ON_TX:
return "UART_USE_CRC_ON_TX";
case CSR_PSKEY_UART_HOST_INITIAL_STATE:
return "UART_HOST_INITIAL_STATE";
case CSR_PSKEY_UART_HOST_ATTENTION_SPAN:
return "UART_HOST_ATTENTION_SPAN";
case CSR_PSKEY_UART_HOST_WAKEUP_TIME:
return "UART_HOST_WAKEUP_TIME";
case CSR_PSKEY_UART_HOST_WAKEUP_WAIT:
return "UART_HOST_WAKEUP_WAIT";
case CSR_PSKEY_BCSP_LM_MODE:
return "BCSP_LM_MODE";
case CSR_PSKEY_BCSP_LM_SYNC_RETRIES:
return "BCSP_LM_SYNC_RETRIES";
case CSR_PSKEY_BCSP_LM_TSHY:
return "BCSP_LM_TSHY";
case CSR_PSKEY_UART_DFU_CONFIG_STOP_BITS:
return "UART_DFU_CONFIG_STOP_BITS";
case CSR_PSKEY_UART_DFU_CONFIG_PARITY_BIT:
return "UART_DFU_CONFIG_PARITY_BIT";
case CSR_PSKEY_UART_DFU_CONFIG_FLOW_CTRL_EN:
return "UART_DFU_CONFIG_FLOW_CTRL_EN";
case CSR_PSKEY_UART_DFU_CONFIG_RTS_AUTO_EN:
return "UART_DFU_CONFIG_RTS_AUTO_EN";
case CSR_PSKEY_UART_DFU_CONFIG_RTS:
return "UART_DFU_CONFIG_RTS";
case CSR_PSKEY_UART_DFU_CONFIG_TX_ZERO_EN:
return "UART_DFU_CONFIG_TX_ZERO_EN";
case CSR_PSKEY_UART_DFU_CONFIG_NON_BCSP_EN:
return "UART_DFU_CONFIG_NON_BCSP_EN";
case CSR_PSKEY_UART_DFU_CONFIG_RX_RATE_DELAY:
return "UART_DFU_CONFIG_RX_RATE_DELAY";
case CSR_PSKEY_AMUX_AIO0:
return "AMUX_AIO0";
case CSR_PSKEY_AMUX_AIO1:
return "AMUX_AIO1";
case CSR_PSKEY_AMUX_AIO2:
return "AMUX_AIO2";
case CSR_PSKEY_AMUX_AIO3:
return "AMUX_AIO3";
case CSR_PSKEY_LOCAL_NAME_SIMPLIFIED:
return "LOCAL_NAME_SIMPLIFIED";
case CSR_PSKEY_EXTENDED_STUB:
return "EXTENDED_STUB";
default:
return "UNKNOWN";
}
}
int csr_write_varid_valueless(int dd, uint16_t seqnum, uint16_t varid)
{
unsigned char cmd[] = { 0x02, 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));
switch (varid) {
case CSR_VARID_COLD_RESET:
case CSR_VARID_WARM_RESET:
case CSR_VARID_COLD_HALT:
case CSR_VARID_WARM_HALT:
return hci_send_cmd(dd, OGF_VENDOR_CMD, 0x00, sizeof(cmd) + 1, cp);
}
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;
}
int csr_write_varid_complex(int dd, uint16_t seqnum, uint16_t varid, uint8_t *value, uint16_t length)
{
unsigned char cmd[] = { 0x02, 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) + length + 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;
}
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) + length + 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, uint16_t stores, 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,
stores & 0xff, stores >> 8, 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) + length - 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_write_pskey_complex(int dd, uint16_t seqnum, uint16_t pskey, uint16_t stores, uint8_t *value, uint16_t length)
{
unsigned char cmd[] = { 0x02, 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,
stores & 0xff, stores >> 8, 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 + 17, 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) + length - 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;
}
int csr_read_pskey_uint16(int dd, uint16_t seqnum, uint16_t pskey, uint16_t stores, uint16_t *value)
{
uint8_t array[2] = { 0x00, 0x00 };
int err;
err = csr_read_pskey_complex(dd, seqnum, pskey, stores, array, 2);
*value = array[0] + (array[1] << 8);
return err;
}
int csr_write_pskey_uint16(int dd, uint16_t seqnum, uint16_t pskey, uint16_t stores, uint16_t value)
{
uint8_t array[2] = { value & 0xff, value >> 8 };
return csr_write_pskey_complex(dd, seqnum, pskey, stores, array, 2);
}
int csr_read_pskey_uint32(int dd, uint16_t seqnum, uint16_t pskey, uint16_t stores, uint32_t *value)
{
uint8_t array[4] = { 0x00, 0x00, 0x00, 0x00 };
int err;
err = csr_read_pskey_complex(dd, seqnum, pskey, stores, array, 4);
*value = ((array[0] + (array[1] << 8)) << 16) +
(array[2] + (array[3] << 8));
return err;
}
int csr_write_pskey_uint32(int dd, uint16_t seqnum, uint16_t pskey, uint16_t stores, uint32_t value)
{
uint8_t array[4] = { (value & 0xff0000) >> 16, value >> 24,
value & 0xff, (value & 0xff00) >> 8 };
return csr_write_pskey_complex(dd, seqnum, pskey, stores, array, 4);
}
int psr_put(uint16_t pskey, uint8_t *value, uint16_t size)
{
struct psr_data *item;
item = malloc(sizeof(*item));
if (!item)
return -ENOMEM;
item->pskey = pskey;
if (size > 0) {
item->value = malloc(size);
if (!item->value) {
free(item);
return -ENOMEM;
}
memcpy(item->value, value, size);
item->size = size;
} else {
item->value = NULL;
item->size = 0;
}
item->next = NULL;
if (!head)
head = item;
else
tail->next = item;
tail = item;
return 0;
}
int psr_get(uint16_t *pskey, uint8_t *value, uint16_t *size)
{
struct psr_data *item = head;
if (!head)
return -ENOENT;
*pskey = item->pskey;
if (item->value) {
if (value && item->size > 0)
memcpy(value, item->value, item->size);
free(item->value);
*size = item->size;
} else
*size = 0;
if (head == tail)
tail = NULL;
head = head->next;
free(item);
return 0;
}
static int parse_line(char *str)
{
uint8_t array[256];
uint16_t value, pskey, length = 0;
char *off, *end;
pskey = strtol(str + 1, NULL, 16);
off = strstr(str, "=") + 1;
if (!off)
return -EIO;
while (1) {
value = strtol(off, &end, 16);
if (value == 0 && off == end)
break;
array[length++] = value & 0xff;
array[length++] = value >> 8;
if (*end == '\0')
break;
off = end + 1;
}
return psr_put(pskey, array, length);
}
int psr_read(const char *filename)
{
struct stat st;
char *str, *map, *off, *end;
int fd, err = 0;
fd = open(filename, O_RDONLY);
if (fd < 0)
return fd;
if (fstat(fd, &st) < 0) {
err = -errno;
goto close;
}
map = mmap(0, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
if (!map || map == MAP_FAILED) {
err = -errno;
goto close;
}
off = map;
while (1) {
if (*off == '\r' || *off == '\n') {
off++;
continue;
}
end = strpbrk(off, "\r\n");
if (!end)
break;
str = malloc(end - off + 1);
if (!str)
break;
memset(str, 0, end - off + 1);
strncpy(str, off, end - off);
if (*str == '&')
parse_line(str);
free(str);
off = end + 1;
}
munmap(map, st.st_size);
close:
close(fd);
return err;
}
int psr_print(void)
{
uint8_t array[256];
uint16_t pskey, length;
char *str, val[7];
int i;
while (1) {
if (psr_get(&pskey, array, &length) < 0)
break;
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 / 2; i++)
printf(" %02x%02x", array[i * 2 + 1], array[i * 2]);
printf("\n");
}
return 0;
}