diff options
| -rw-r--r-- | tools/hcitool.1 | 9 | ||||
| -rw-r--r-- | tools/hcitool.c | 79 | 
2 files changed, 88 insertions, 0 deletions
| diff --git a/tools/hcitool.1 b/tools/hcitool.1 index 07f41421..d863e7d1 100644 --- a/tools/hcitool.1 +++ b/tools/hcitool.1 @@ -174,6 +174,15 @@ Change the connection link key for the device with Bluetooth address  .BI clkoff " <bdaddr>"  Read the clock offset for the device with Bluetooth address  .IR bdaddr . +.TP +.BI clock " <bdaddr> [which clock]" +Read the clock for the device with Bluetooth address +.IR bdaddr . +The clock can be +.BR 0 +for the local clock or +.BR 1 +for the piconet clock (which is default).  .SH AUTHORS  Written by Maxim Krasnyansky <maxk@qualcomm.com> and Marcel Holtmann <marcel@holtmann.org>  .PP diff --git a/tools/hcitool.c b/tools/hcitool.c index 9f69ed01..8b7131a0 100644 --- a/tools/hcitool.c +++ b/tools/hcitool.c @@ -1545,6 +1545,84 @@ static void cmd_clkoff(int dev_id, int argc, char **argv)  	free(cr);  } +/* Read clock */ + +static struct option clock_options[] = { +	{ "help",	0, 0, 'h' }, +	{ 0, 0, 0, 0 } +}; + +static char *clock_help = +	"Usage:\n" +	"\tclock <bdaddr> [which clock]\n"; + +static void cmd_clock(int dev_id, int argc, char **argv) +{ +	struct hci_conn_info_req *cr; +	bdaddr_t bdaddr; +	uint8_t which; +	uint32_t clock; +	uint16_t accuracy; +	int opt, dd; + +	for_each_opt(opt, clock_options, NULL) { +		switch (opt) { +		default: +			printf(clock_help); +			return; +		} +	} +	argc -= optind; +	argv += optind; + +	if (argc < 1) { +		printf(clock_help); +		return; +	} + +	str2ba(argv[0], &bdaddr); + +	if (dev_id < 0) { +		dev_id = hci_for_each_dev(HCI_UP, find_conn, (long) &bdaddr); +		if (dev_id < 0) { +			fprintf(stderr, "Not connected.\n"); +			exit(1); +		} +	} + +	dd = hci_open_dev(dev_id); +	if (dd < 0) { +		perror("HCI device open failed"); +		exit(1); +	} + +	cr = malloc(sizeof(*cr) + sizeof(struct hci_conn_info)); +	if (!cr) +		return; + +	bacpy(&cr->bdaddr, &bdaddr); +	cr->type = ACL_LINK; +	if (ioctl(dd, HCIGETCONNINFO, (unsigned long) cr) < 0) { +		perror("Get connection info failed"); +		exit(1); +	} + +	which = (argc > 1) ? atoi(argv[1]) : 0x01; + +	if (hci_read_clock(dd, htobs(cr->conn_info->handle), which, &clock, &accuracy, 1000) < 0) { +		perror("Reading clock failed"); +		exit(1); +	} + +	accuracy = btohs(accuracy); + +	printf("Clock:    0x%4.4x\n", btohl(clock)); +	printf("Accuracy: %.2f msec\n", (float) accuracy * 0.3125); + +	close(dd); +	free(cr); +} +  static struct {  	char *cmd;  	void (*func)(int dev_id, int argc, char **argv); @@ -1570,6 +1648,7 @@ static struct {  	{ "enc",    cmd_enc,    "Set connection encryption"            },  	{ "key",    cmd_key,    "Change connection link key"           },  	{ "clkoff", cmd_clkoff, "Read clock offset"                    }, +	{ "clock",  cmd_clock,  "Read local or remote clock"           },  	{ NULL, NULL, 0 }  }; | 
