Index: utils/tools/bccmd.c =================================================================== RCS file: /cvsroot/bluez/utils/tools/bccmd.c,v retrieving revision 1.1 diff -u -p -r1.1 bccmd.c --- utils/tools/bccmd.c 16 May 2005 11:51:27 -0000 1.1 +++ utils/tools/bccmd.c 29 Jun 2005 08:16:27 -0000 @@ -79,13 +79,110 @@ static int cmd_keylen(int dd, int argc, return 0; } + + +static int cmd_clock(int dd, int argc, char *argv[]) +{ + uint32_t clk=0; + int err; + + err = csr_read_varid_uint32(dd, 0x2143, CSR_VARID_BT_CLOCK, &clk); + if (err < 0) { + errno = -err; + return -1; + } + + printf("Device local BT-clock: 0x%x\n", clk); + + return 0; +} + + + + +static int cmd_uart_read(int dd, int argc, char *argv[]) +{ + uint16_t baud; + int err; + + err = csr_read_varid_uint16(dd, 0x2145, CSR_VARID_CONFIG_UART, &baud); + if (err < 0) { + errno = -err; + return -1; + } + + printf("Device UART speed: "); + switch(baud & CSR_UART_BAUD_MASK) { + case CSR_UART_BAUD_9K6: + printf("9600"); + break; + case CSR_UART_BAUD_19K2: + printf("19 200"); + break; + case CSR_UART_BAUD_38K4: + printf("38 400"); + break; + case CSR_UART_BAUD_57K6: + printf("57 600"); + break; + case CSR_UART_BAUD_115K2: + printf("115 200"); + break; + case CSR_UART_BAUD_230K4: + printf("230 400"); + break; + case CSR_UART_BAUD_460K8: + printf("460 800"); + break; + case CSR_UART_BAUD_921K6: + printf("921 600"); + break; + case 0: + errno = EIO; + return -1; + break; + default: + printf("%f", (double) baud * 244.140625); + break; + } + printf(" bps,"); + switch(baud & CSR_UART_STOP_MASK) { + case CSR_UART_STOP1: + printf(" 1 stop bit,"); + break; + case CSR_UART_STOP2: + printf(" 2 stop bits,"); + default: + break; + } + switch(baud & CSR_UART_PAR_MASK) { + case CSR_UART_PARNONE: + printf(" no"); + break; + case CSR_UART_PARODD: + printf(" odd"); + break; + case CSR_UART_PAREVEN: + printf(" even"); + default: + break; + } + printf(" parity\n"); + + 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" }, + { "keylen", cmd_keylen, "", "Get current crypt key length" }, + { "clock", cmd_clock, " ", "Get local BT-clock" }, + { "rduart", cmd_uart_read, " ", "Get UART baudrate" }, { NULL }, }; Index: utils/tools/csr.c =================================================================== RCS file: /cvsroot/bluez/utils/tools/csr.c,v retrieving revision 1.27 diff -u -p -r1.27 csr.c --- utils/tools/csr.c 10 Jun 2005 06:59:27 -0000 1.27 +++ utils/tools/csr.c 29 Jun 2005 08:16:27 -0000 @@ -449,12 +449,13 @@ int csr_read_varid_complex(int dd, uint1 if (hci_send_req(dd, &rq, 2000) < 0) return -1; - if (rp[0] != 0xc2) { + if (rp[0] != 0xc2 || rp[5] != (seqnum & 0xff) || + rp[6] != (seqnum >> 8)) { errno = EIO; return -1; } - if ((rp[9] + (rp[10] << 8)) != 0) { + if (rp[9] || rp[10]) { errno = ENXIO; return -1; } @@ -464,46 +465,58 @@ int csr_read_varid_complex(int dd, uint1 return 0; } -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) { - 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 }; + uint8_t buf[] = { 0,0,0,0,0,0,0,0 }; + uint32_t shft; - unsigned char cp[254], rp[254]; - struct hci_request rq; + if(csr_read_varid_complex(dd, seqnum, varid, buf, sizeof(buf))==0) { + shft = buf[1]; + shft <<= 8; + shft |= buf[0]; + shft <<= 8; + shft |= buf[3]; + shft <<= 8; + shft |= buf[2]; + *value = shft; + return 0; + } + + return -1; +} - 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; +int csr_read_varid_uint16(int dd, uint16_t seqnum, uint16_t varid, uint16_t *value) +{ + uint8_t buf[] = { 0,0,0,0,0,0,0,0 }; + uint16_t shft; - if (rp[0] != 0xc2) { - errno = EIO; - return -1; + if(csr_read_varid_complex(dd, seqnum, varid, buf, sizeof(buf))==0) { + shft = buf[1]; + shft <<= 8; + shft |= buf[0]; + *value = shft; + return 0; } + + return -1; +} - if ((rp[9] + (rp[10] << 8)) != 0) { - errno = ENXIO; - return -1; - } - *value = rp[11] + (rp[12] << 8); +int csr_read_varid_uint8(int dd, uint16_t seqnum, uint16_t varid, uint8_t *value) +{ + uint8_t buf[] = { 0,0,0,0,0,0,0,0 }; - return 0; + if(csr_read_varid_complex(dd, seqnum, varid, buf, sizeof(buf))==0) { + *value = buf[1]; + return 0; + } + + return -1; } + int csr_read_pskey_complex(int dd, uint16_t seqnum, uint16_t pskey, uint8_t *value, uint16_t length) { unsigned char cmd[] = { 0x00, 0x00, ((length / 2) + 8) & 0xff, ((length / 2) + 8) >> 8, Index: utils/tools/csr.h =================================================================== RCS file: /cvsroot/bluez/utils/tools/csr.h,v retrieving revision 1.12 diff -u -p -r1.12 csr.h --- utils/tools/csr.h 10 Jun 2005 05:30:28 -0000 1.12 +++ utils/tools/csr.h 29 Jun 2005 08:16:28 -0000 @@ -71,12 +71,33 @@ #define CSR_PSKEY_USB_DFU_PRODUCT_ID 0x02cb #define CSR_PSKEY_INITIAL_BOOTMODE 0x03cd +/* UART speeds */ +#define CSR_UART_BAUD_MASK 0x0fff +#define CSR_UART_BAUD_9K6 0x0027 +#define CSR_UART_BAUD_19K2 0x0047 +#define CSR_UART_BAUD_38K4 0x009d +#define CSR_UART_BAUD_57K6 0x00ec +#define CSR_UART_BAUD_115K2 0x01d8 +#define CSR_UART_BAUD_230K4 0x03b0 +#define CSR_UART_BAUD_460K8 0x075f +#define CSR_UART_BAUD_921K6 0x0ebf +#define CSR_UART_STOP_MASK 0x3000 +#define CSR_UART_STOP1 0x0000 +#define CSR_UART_STOP2 0x2000 +#define CSR_UART_PAR_MASK 0xc000 +#define CSR_UART_PARNONE 0x0000 +#define CSR_UART_PARODD 0x4000 +#define CSR_UART_PAREVEN 0xc000 + + char *csr_buildidtostr(uint16_t id); char *csr_chipvertostr(uint16_t ver, uint16_t rev); char *csr_pskeytostr(uint16_t pskey); int csr_read_varid_complex(int dd, uint16_t seqnum, uint16_t varid, uint8_t *value, uint16_t length); +int csr_read_varid_uint32(int dd, uint16_t seqnum, uint16_t varid, uint32_t *value); int csr_read_varid_uint16(int dd, uint16_t seqnum, uint16_t varid, uint16_t *value); +int csr_read_varid_uint8(int dd, uint16_t seqnum, uint16_t varid, uint8_t *value); 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);