From: Ronny L Nilsson <bb@arbetsmyra.dyndns.org>
To: bluez-devel@lists.sourceforge.net
Subject: Re: [Bluez-devel] bccmd reading clock
Date: Wed, 29 Jun 2005 10:26:02 +0200 [thread overview]
Message-ID: <20050629082735.CC3AC84E@arbetsmyra.dyndns.org> (raw)
In-Reply-To: <1119973364.15397.77.camel@pegasus>
[-- Attachment #1: Type: text/plain, Size: 706 bytes --]
> > I was in the need for an enhancement of the bccmd tool and thus
> > made a small change. The supplied patch adds a command for reading
> > the the BT-clock of local device. In the process I also made some
> > minor changes to utils/tools/csr.c to reuse existing code. Besided
> > reading 16-bit variables it can now also read 32- and 8-bits alike.
>
> don't do type conversion like this. Use varid_complex for it if you
> wanna support uint32 and unit8 without copying code.
As you command.... :) Perhaps like this then? Added parsing read of
uart speed setting too. I'm a bit uncertain however of where to put
corresponding uart config write. Both BCCMD and PSKEY seems adequate.
/Ronny
[-- Attachment #2: bccmd.patch --]
[-- Type: text/x-diff, Size: 6958 bytes --]
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, "<handle>", "Get current crypt key length" },
+ { "keylen", cmd_keylen, "<handle>", "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);
next prev parent reply other threads:[~2005-06-29 8:26 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-06-27 22:37 [Bluez-devel] bccmd reading clock Ronny L Nilsson
2005-06-28 15:42 ` Marcel Holtmann
2005-06-29 8:26 ` Ronny L Nilsson [this message]
2005-07-01 8:43 ` Ronny L Nilsson
2005-07-03 10:16 ` Marcel Holtmann
2005-07-03 16:33 ` Ronny L Nilsson
2005-07-03 16:56 ` Marcel Holtmann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20050629082735.CC3AC84E@arbetsmyra.dyndns.org \
--to=bb@arbetsmyra.dyndns.org \
--cc=bluez-devel@lists.sourceforge.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox