diff -ru bluez-utils-2.19/tools/bccmd.c bluez-utils-2.19-jlw/tools/bccmd.c --- bluez-utils-2.19/tools/bccmd.c 2005-07-03 19:12:08.000000000 -0400 +++ bluez-utils-2.19-jlw/tools/bccmd.c 2005-08-22 14:42:31.000000000 -0400 @@ -129,16 +129,53 @@ return 0; } +static int cmd_disabletx(int dd, int argc, char *argv[]) +{ + return csr_write_varid_uint16(dd, 0, CSR_VARID_DISABLE_TX, 0, 0); +} + +static int cmd_enabletx(int dd, int argc, char *argv[]) +{ + return csr_write_varid_uint16(dd, 0, CSR_VARID_ENABLE_TX, 0, 0); +} + +static int cmd_coldreset(int dd, int argc, char *argv[]) +{ + return csr_write_varid_uint16(dd, 0, CSR_VARID_COLD_RESET, 0, 0); +} + +static int cmd_rand(int dd, int argc, char *argv[]) +{ + uint16_t error = 0; + int err; + + err = csr_read_varid_uint16(dd, 5, CSR_VARID_RAND, &error); + if (err < 0) { + errno = -err; + return -1; + } + + printf("Random number: 0x%02x (%d)\n", error, error); + + return 0; +} + + + static struct { char *str; int (*func)(int dd, int argc, char **argv); char *arg; char *doc; } commands[] = { - { "keylen", cmd_keylen, "", "Get current crypt key length" }, - { "clock", cmd_clock, "", "Get local Bluetooth clock" }, - { "panicarg", cmd_panicarg, "", "Get panic code argument" }, - { "faultarg", cmd_faultarg, "", "Get fault code argument" }, + { "keylen", cmd_keylen, "", "Get current crypt key length" }, + { "clock", cmd_clock, "", "Get local Bluetooth clock" }, + { "panicarg", cmd_panicarg, "", "Get panic code argument" }, + { "faultarg", cmd_faultarg, "", "Get fault code argument" }, + { "coldreset", cmd_coldreset, "", "Perform cold reset" }, + { "disabletx", cmd_disabletx, "", "Disable TX on the device" }, + { "enabletx", cmd_enabletx, "", "Enable TX on the device" }, + { "rand", cmd_rand, "", "Obtain a random number" }, { NULL }, }; diff -ru bluez-utils-2.19/tools/csr.c bluez-utils-2.19-jlw/tools/csr.c --- bluez-utils-2.19/tools/csr.c 2005-07-18 20:12:37.000000000 -0400 +++ bluez-utils-2.19-jlw/tools/csr.c 2005-08-22 14:41:47.000000000 -0400 @@ -668,3 +668,53 @@ return 0; } + + +int csr_write_varid_uint16(int dd, uint16_t seqnum, uint16_t varid, uint16_t value, int chkresp) +{ + unsigned char cmd[] = { 0x02, 0x00, + 0x09, 0x00, + seqnum & 0xff, seqnum >> 8, + varid & 0xff, varid >> 8, + 0x00, 0x00, // status + 0x00, 0x00, // payload + 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); + + /* Only check for a response if the BCCMD warrants it. Reset does not. */ + if (chkresp) { + 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; + } + } else { + hci_send_req(dd, &rq, 2000); + } + + return 0; +} diff -ru bluez-utils-2.19/tools/csr.h bluez-utils-2.19-jlw/tools/csr.h --- bluez-utils-2.19/tools/csr.h 2005-07-03 17:19:51.000000000 -0400 +++ bluez-utils-2.19-jlw/tools/csr.h 2005-08-22 14:37:26.000000000 -0400 @@ -81,3 +81,4 @@ int csr_read_pskey_complex(int dd, uint16_t seqnum, uint16_t pskey, uint8_t *value, uint16_t length); int csr_read_pskey_uint16(int dd, uint16_t seqnum, uint16_t pskey, uint16_t *value); int csr_write_pskey_uint16(int dd, uint16_t seqnum, uint16_t pskey, uint16_t value); +int csr_write_varid_uint16(int dd, uint16_t seqnum, uint16_t varid, uint16_t value, int chkresp);