From b207244243cb0407728fbbb5ff8cbe95f9d74260 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Mon, 22 Aug 2005 20:36:28 +0000 Subject: Add support for writing valueless BCCMD variables --- tools/csr.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ tools/csr.h | 1 + 2 files changed, 47 insertions(+) diff --git a/tools/csr.c b/tools/csr.c index 6832ec6d..1f1ab229 100644 --- a/tools/csr.c +++ b/tools/csr.c @@ -427,6 +427,52 @@ char *csr_pskeytostr(uint16_t pskey) } } +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_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, diff --git a/tools/csr.h b/tools/csr.h index 5098a69d..acb30641 100644 --- a/tools/csr.h +++ b/tools/csr.h @@ -75,6 +75,7 @@ char *csr_buildidtostr(uint16_t id); char *csr_chipvertostr(uint16_t ver, uint16_t rev); char *csr_pskeytostr(uint16_t pskey); +int csr_write_varid_valueless(int dd, uint16_t seqnum, uint16_t varid); int csr_read_varid_complex(int dd, uint16_t seqnum, uint16_t varid, uint8_t *value, uint16_t length); int csr_read_varid_uint16(int dd, uint16_t seqnum, uint16_t varid, uint16_t *value); int csr_read_varid_uint32(int dd, uint16_t seqnum, uint16_t varid, uint32_t *value); -- cgit