summaryrefslogtreecommitdiffstats
path: root/tools/pskey.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/pskey.c')
-rw-r--r--tools/pskey.c581
1 files changed, 0 insertions, 581 deletions
diff --git a/tools/pskey.c b/tools/pskey.c
deleted file mode 100644
index c185cf58..00000000
--- a/tools/pskey.c
+++ /dev/null
@@ -1,581 +0,0 @@
-/*
- *
- * BlueZ - Bluetooth protocol stack for Linux
- *
- * Copyright (C) 2004-2005 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 <stdlib.h>
-#include <getopt.h>
-#include <sys/socket.h>
-
-#include <bluetooth/bluetooth.h>
-#include <bluetooth/hci.h>
-#include <bluetooth/hci_lib.h>
-
-#include "csr.h"
-
-#define CSR_TYPE_NULL 0
-#define CSR_TYPE_ARRAY 1
-#define CSR_TYPE_UINT8 2
-#define CSR_TYPE_UINT16 3
-#define CSR_TYPE_UINT32 4
-
-enum {
- NONE = 0,
- MEMORY,
- LIST,
- READ,
-};
-
-static char *storestostr(uint16_t stores)
-{
- switch (stores) {
- case 0x0000:
- return "Default";
- case 0x0001:
- return "psi";
- case 0x0002:
- return "psf";
- case 0x0004:
- return "psrom";
- case 0x0008:
- return "psram";
- default:
- return "Unknown";
- }
-}
-
-static char *memorytostr(uint16_t type)
-{
- switch (type) {
- case 0x0000:
- return "Flash memory";
- case 0x0001:
- return "EEPROM";
- case 0x0002:
- return "RAM (transient)";
- case 0x0003:
- return "ROM (or \"read-only\" flash memory)";
- default:
- return "Unknown";
- }
-}
-
-static int cmd_memory(int dd, uint16_t stores, int argc, char *argv[])
-{
- uint8_t array[8];
- uint16_t type;
- int err;
-
- memset(array, 0, sizeof(array));
- array[2] = stores & 0xff;
- array[3] = stores >> 8;
-
- err = csr_read_varid_complex(dd, 0x4711,
- CSR_VARID_PS_MEMORY_TYPE, array, sizeof(array));
- if (err < 0)
- return err;
-
- type = array[4] + (array[5] << 8);
-
- printf("%s (0x%04x) = %s (%d)\n", storestostr(stores), stores,
- memorytostr(type), type);
-
- return 0;
-}
-
-static int cmd_list(int dd, uint16_t stores, int argc, char *argv[])
-{
- uint8_t array[8];
- uint16_t length, seqnum = 0x0000, pskey = 0x0000;
- int err;
-
- while (1) {
- memset(array, 0, sizeof(array));
- array[0] = pskey & 0xff;
- array[1] = pskey >> 8;
- array[2] = stores & 0xff;
- array[3] = stores >> 8;
-
- err = csr_read_varid_complex(dd, seqnum++,
- CSR_VARID_PS_NEXT, array, sizeof(array));
- if (err < 0)
- break;
-
- pskey = array[4] + (array[5] << 8);
- if (pskey == 0x0000)
- break;
-
- memset(array, 0, sizeof(array));
- array[0] = pskey & 0xff;
- array[1] = pskey >> 8;
- array[2] = stores & 0xff;
- array[3] = stores >> 8;
-
- err = csr_read_varid_complex(dd, seqnum++,
- CSR_VARID_PS_SIZE, array, sizeof(array));
- if (err < 0)
- continue;
-
- length = array[2] + (array[3] << 8);
-
- printf("0x%04x - %s (%d bytes)\n", pskey,
- csr_pskeytostr(pskey), length * 2);
- }
-
- return 0;
-}
-
-static int cmd_read(int dd, uint16_t stores, int argc, char *argv[])
-{
- uint8_t array[256];
- uint16_t length, seqnum = 0x0000, pskey = 0x0000;
- char *str, val[7];
- int i, err;
-
- while (1) {
- memset(array, 0, sizeof(array));
- array[0] = pskey & 0xff;
- array[1] = pskey >> 8;
- array[2] = stores & 0xff;
- array[3] = stores >> 8;
-
- err = csr_read_varid_complex(dd, seqnum++,
- CSR_VARID_PS_NEXT, array, 8);
- if (err < 0)
- break;
-
- pskey = array[4] + (array[5] << 8);
- if (pskey == 0x0000)
- break;
-
- memset(array, 0, sizeof(array));
- array[0] = pskey & 0xff;
- array[1] = pskey >> 8;
- array[2] = stores & 0xff;
- array[3] = stores >> 8;
-
- err = csr_read_varid_complex(dd, seqnum++,
- CSR_VARID_PS_SIZE, array, 8);
- if (err < 0)
- continue;
-
- length = array[2] + (array[3] << 8);
- if (length > sizeof(array) / 2)
- continue;
-
- err = csr_read_pskey_complex(dd, seqnum++, pskey,
- stores, array, length * 2);
- if (err < 0)
- continue;
-
- str = csr_pskeytoval(pskey);
- if (!strcasecmp(str, "UNKNOWN")) {
- sprintf(val, "0x%04x", pskey);
- str = NULL;
- }
-
- printf("// %s%s\n&%04x =", str ? "PSKEY_" : "",
- str ? str : val, pskey);
- for (i = 0; i < length; i++)
- printf(" %02x%02x", array[i * 2 + 1], array[i * 2]);
- printf("\n");
- }
-
- return 0;
-}
-
-static int pskey_size(uint16_t pskey)
-{
- switch (pskey) {
- case CSR_PSKEY_BDADDR:
- return 8;
- case CSR_PSKEY_LOCAL_SUPPORTED_FEATURES:
- return 8;
- case CSR_PSKEY_LOCAL_SUPPORTED_COMMANDS:
- return 18;
- default:
- return 64;
- }
-}
-
-static int write_pskey(int dd, uint16_t pskey, uint16_t stores, int type, int argc, char *argv[])
-{
- uint8_t array[64];
- uint16_t value;
- uint32_t val32;
- int i, err, size = sizeof(array);
-
- memset(array, 0, sizeof(array));
-
- switch (type) {
- case CSR_TYPE_ARRAY:
- size = pskey_size(pskey);
-
- if (argc != size) {
- errno = EINVAL;
- return -1;
- }
-
- for (i = 0; i < size; i++)
- if (!strncasecmp(argv[0], "0x", 2))
- array[i] = strtol(argv[i] + 2, NULL, 16);
- else
- array[i] = atoi(argv[i]);
-
- err = csr_write_pskey_complex(dd, 0x4711, pskey,
- stores, array, size);
- break;
-
- case CSR_TYPE_UINT8:
- case CSR_TYPE_UINT16:
- if (argc != 1) {
- errno = E2BIG;
- return -1;
- }
-
- if (!strncasecmp(argv[0], "0x", 2))
- value = strtol(argv[0] + 2, NULL, 16);
- else
- value = atoi(argv[0]);
-
- err = csr_write_pskey_uint16(dd, 0x4711, pskey, stores, value);
- break;
-
- case CSR_TYPE_UINT32:
- if (argc != 1) {
- errno = E2BIG;
- return -1;
- }
-
- if (!strncasecmp(argv[0], "0x", 2))
- val32 = strtol(argv[0] + 2, NULL, 16);
- else
- val32 = atoi(argv[0]);
-
- err = csr_write_pskey_uint32(dd, 0x4711, pskey, stores, val32);
- break;
-
- default:
- errno = EFAULT;
- err = -1;
- break;
- }
-
- return err;
-}
-
-static int read_pskey(int dd, uint16_t pskey, uint16_t stores, int type)
-{
- uint8_t array[64];
- uint16_t value = 0;
- uint32_t val32 = 0;
- int i, err, size = sizeof(array);
-
- memset(array, 0, sizeof(array));
-
- switch (type) {
- case CSR_TYPE_ARRAY:
- size = pskey_size(pskey);
-
- err = csr_read_pskey_complex(dd, 0x4711, pskey, stores, array, size);
- if (err < 0)
- return err;
-
- printf("%s:", csr_pskeytostr(pskey));
- for (i = 0; i < size; i++)
- printf(" 0x%02x", array[i]);
- printf("\n");
- break;
-
- case CSR_TYPE_UINT8:
- case CSR_TYPE_UINT16:
- err = csr_read_pskey_uint16(dd, 0x4711, pskey, stores, &value);
- if (err < 0)
- return err;
-
- printf("%s: 0x%04x (%d)\n", csr_pskeytostr(pskey), value, value);
- break;
-
- case CSR_TYPE_UINT32:
- err = csr_read_pskey_uint32(dd, 0x4711, pskey, stores, &val32);
- if (err < 0)
- return err;
-
- printf("%s: 0x%08x (%d)\n", csr_pskeytostr(pskey), val32, val32);
- break;
-
- default:
- errno = EFAULT;
- err = -1;
- break;
- }
-
- return err;
-}
-
-static int delete_pskey(int dd, uint16_t pskey, uint16_t stores)
-{
- uint8_t array[8];
- int err;
-
- memset(array, 0, sizeof(array));
- array[0] = pskey & 0xff;
- array[1] = pskey >> 8;
- array[2] = stores & 0xff;
- array[3] = stores >> 8;
-
- err = csr_write_varid_complex(dd, 0x4711,
- CSR_VARID_PS_CLR_STORES, array, sizeof(array));
-
- return err;
-}
-
-static struct {
- uint16_t pskey;
- int type;
- char *str;
-} storage[] = {
- { CSR_PSKEY_BDADDR, CSR_TYPE_ARRAY, "bdaddr" },
- { CSR_PSKEY_COUNTRYCODE, CSR_TYPE_UINT16, "country" },
- { CSR_PSKEY_CLASSOFDEVICE, CSR_TYPE_UINT32, "devclass" },
- { CSR_PSKEY_ENC_KEY_LMIN, CSR_TYPE_UINT16, "keymin" },
- { CSR_PSKEY_ENC_KEY_LMAX, CSR_TYPE_UINT16, "keymax" },
- { CSR_PSKEY_LOCAL_SUPPORTED_FEATURES, CSR_TYPE_ARRAY, "features" },
- { CSR_PSKEY_LOCAL_SUPPORTED_COMMANDS, CSR_TYPE_ARRAY, "commands" },
- { CSR_PSKEY_HCI_LMP_LOCAL_VERSION, CSR_TYPE_UINT16, "version" },
- { CSR_PSKEY_LMP_REMOTE_VERSION, CSR_TYPE_UINT8, "remver" },
- { CSR_PSKEY_HOSTIO_USE_HCI_EXTN, CSR_TYPE_UINT16, "hciextn" },
- { CSR_PSKEY_HOSTIO_MAP_SCO_PCM, CSR_TYPE_UINT16, "mapsco" },
- { CSR_PSKEY_UART_BAUDRATE, CSR_TYPE_UINT16, "baudrate" },
- { CSR_PSKEY_HOST_INTERFACE, CSR_TYPE_UINT16, "hostintf" },
- { CSR_PSKEY_ANA_FREQ, CSR_TYPE_UINT16, "anafreq" },
- { CSR_PSKEY_ANA_FTRIM, CSR_TYPE_UINT16, "anaftrim" },
- { CSR_PSKEY_USB_VENDOR_ID, CSR_TYPE_UINT16, "usbvid" },
- { CSR_PSKEY_USB_PRODUCT_ID, CSR_TYPE_UINT16, "usbpid" },
- { CSR_PSKEY_USB_DFU_PRODUCT_ID, CSR_TYPE_UINT16, "dfupid" },
- { CSR_PSKEY_INITIAL_BOOTMODE, CSR_TYPE_UINT16, "bootmode" },
- { 0x0000, CSR_TYPE_NULL, NULL },
-};
-
-static void usage(void)
-{
- int i, pos = 0;
-
- printf("pskey - Utility for changing CSR persistent storage\n\n");
- printf("Usage:\n"
- "\tpskey [-i <dev>] [-r] [-s stores] <key> [value]\n"
- "\tpskey [-i <dev>] [-r] [-s stores] --clear <key>\n"
- "\tpskey [-i <dev>] [-s stores] --memory\n"
- "\tpskey [-i <dev>] [-s stores] --list\n"
- "\tpskey [-i <dev>] [-s stores] --read\n\n");
-
- printf("Keys:\n\t");
- for (i = 0; storage[i].pskey; i++) {
- printf("%s ", storage[i].str);
- pos += strlen(storage[i].str) + 1;
- if (pos > 60) {
- printf("\n\t");
- pos = 0;
- }
- }
- printf("\n");
-}
-
-static struct option main_options[] = {
- { "device", 1, 0, 'i' },
- { "reset", 0, 0, 'r' },
- { "stores", 1, 0, 's' },
- { "clear", 0, 0, 'c' },
- { "memory", 0, 0, 'M' },
- { "list", 0, 0, 'L' },
- { "read", 0, 0, 'R' },
- { "help", 0, 0, 'h' },
- { 0, 0, 0, 0 }
-};
-
-int main(int argc, char *argv[])
-{
- struct hci_dev_info di;
- struct hci_version ver;
- uint16_t stores = 0x0001 | 0x0002 | 0x0008;
- int i, err, dd, opt, dev = 0, reset = 0, clear = 0, mode = NONE;
-
- while ((opt=getopt_long(argc, argv, "+i:rs:cMLRh", main_options, NULL)) != -1) {
- switch (opt) {
- case 'i':
- dev = hci_devid(optarg);
- if (dev < 0) {
- perror("Invalid device");
- exit(1);
- }
- break;
-
- case 'r':
- reset = 1;
- break;
-
- case 's':
- if (!strcasecmp(optarg, "default"))
- stores = 0x0000;
- else if (!strcasecmp(optarg, "implementation"))
- stores = 0x0001;
- else if (!strcasecmp(optarg, "factory"))
- stores = 0x0002;
- else if (!strcasecmp(optarg, "rom"))
- stores = 0x0004;
- else if (!strcasecmp(optarg, "ram"))
- stores = 0x0008;
- else if (!strcasecmp(optarg, "psi"))
- stores = 0x0001;
- else if (!strcasecmp(optarg, "psf"))
- stores = 0x0002;
- else if (!strcasecmp(optarg, "psrom"))
- stores = 0x0004;
- else if (!strcasecmp(optarg, "psram"))
- stores = 0x0008;
- else if (!strncasecmp(optarg, "0x", 2))
- stores = strtol(optarg, NULL, 16);
- else
- stores = atoi(optarg);
- break;
-
- case 'c':
- clear = 1;
- break;
-
- case 'M':
- mode = MEMORY;
- break;
-
- case 'L':
- mode = LIST;
- break;
-
- case 'R':
- mode = READ;
- break;
-
- case 'h':
- default:
- usage();
- exit(0);
- }
- }
-
- argc -= optind;
- argv += optind;
- optind = 0;
-
- if (mode == NONE && argc < 1) {
- usage();
- exit(1);
- }
-
- dd = hci_open_dev(dev);
- if (dd < 0) {
- fprintf(stderr, "Can't open device hci%d: %s (%d)\n",
- dev, strerror(errno), errno);
- exit(1);
- }
-
- if (hci_devinfo(dev, &di) < 0) {
- fprintf(stderr, "Can't get device info for hci%d: %s (%d)\n",
- dev, strerror(errno), errno);
- hci_close_dev(dd);
- exit(1);
- }
-
- if (hci_read_local_version(dd, &ver, 1000) < 0) {
- fprintf(stderr, "Can't read version info for hci%d: %s (%d)\n",
- dev, strerror(errno), errno);
- hci_close_dev(dd);
- exit(1);
- }
-
- if (ver.manufacturer != 10) {
- fprintf(stderr, "Unsupported manufacturer\n");
- hci_close_dev(dd);
- exit(1);
- }
-
- if (mode > 0) {
- switch (mode) {
- case MEMORY:
- err = cmd_memory(dd, stores, argc, argv);
- break;
- case LIST:
- err = cmd_list(dd, stores, argc, argv);
- break;
- case READ:
- err = cmd_read(dd, stores, argc, argv);
- break;
- default:
- usage();
- err = -1;
- break;
- }
-
- hci_close_dev(dd);
- exit(err < 0 ? 1 : 0);
- }
-
- for (i = 0; storage[i].pskey; i++) {
- if (strcasecmp(storage[i].str, argv[0]))
- continue;
-
- if (argc > 1) {
- err = write_pskey(dd, storage[i].pskey, stores,
- storage[i].type, argc - 1, argv + 1);
-
- if (!err && reset)
- csr_write_varid_valueless(dd, 0x0000,
- CSR_VARID_WARM_RESET);
- } else {
- if (clear)
- err = delete_pskey(dd, storage[i].pskey, stores);
- else
- err = read_pskey(dd, storage[i].pskey,
- stores, storage[i].type);
- }
-
- hci_close_dev(dd);
-
- if (err < 0) {
- fprintf(stderr, "Can't %s persistent storage: %s (%d)\n",
- argc > 1 ? "write" : "read", strerror(errno), errno);
- exit(1);
- }
-
- exit(0);
- }
-
- fprintf(stderr, "Unsupported persistent storage\n");
-
- hci_close_dev(dd);
-
- exit(1);
-}