diff options
-rw-r--r-- | tools/hciattach.c | 65 |
1 files changed, 63 insertions, 2 deletions
diff --git a/tools/hciattach.c b/tools/hciattach.c index b6aa7376..0131dcb6 100644 --- a/tools/hciattach.c +++ b/tools/hciattach.c @@ -230,14 +230,74 @@ static int digi(int fd, struct uart_t *u, struct termios *ti) return 0; } +static int texas(int fd, struct uart_t *u, struct termios *ti) +{ + struct timespec tm = {0, 50000}; + char cmd[10]; + unsigned char resp[100]; /* Response */ + int n; + + memset(resp,'\0', 100); + + /* Switch to default Texas baudrate*/ + if (set_speed(fd, ti, 115200) < 0) { + perror("Can't set default baud rate"); + return -1; + } + + /* It is possible to get software version with manufacturer specific + HCI command HCI_VS_TI_Version_Number. But the only thing you get more + is if this is point-to-point or point-to-multipoint module */ + + /* Get Manufacturer and LMP version */ + cmd[0] = HCI_COMMAND_PKT; + cmd[1] = 0x01; + cmd[2] = 0x10; + cmd[3] = 0x00; + + do { + n = write(fd, cmd, 4); + if (n < 0) { + perror("Failed to write init command (READ_LOCAL_VERSION_INFORMATION)"); + return -1; + } + if (n < 4) { + fprintf(stderr, "Wanted to write 4 bytes, could only write %d. Stop\n", n); + return -1; + } + + /* Read reply. */ + if (read_hci_event(fd, resp, 100) < 0) { + perror("Failed to read init response (READ_LOCAL_VERSION_INFORMATION)"); + return -1; + } + + /* Wait for command complete event for our Opcode */ + } while (resp[4] != cmd[1] && resp[5] != cmd[2]); + + /* Verify manufacturer */ + if ((resp[11] & 0xFF) != 0x0d) + fprintf(stderr,"WARNING : module's manufacturer is not Texas Instrument\n"); + + /* Print LMP version */ + fprintf(stderr, "Texas module LMP version : 0x%02x\n", resp[10] & 0xFF); + + /* Print LMP subversion */ + fprintf(stderr, "Texas module LMP sub-version : 0x%02x%02x\n", resp[14] & 0xFF, resp[13] & 0xFF); + + nanosleep(&tm, NULL); + return 0; +} + static int read_check(int fd, void *buf, int count) { int res; - do{ + do { res = read(fd, buf, count); if (res != -1) { - buf += res; count -= res; + buf += res; + count -= res; } } while (count && (errno == 0 || errno == EINTR)); @@ -704,6 +764,7 @@ struct uart_t uart[] = { { "any", 0x0000, 0x0000, HCI_UART_H4, 115200, FLOW_CTL, NULL }, { "ericsson", 0x0000, 0x0000, HCI_UART_H4, 115200, FLOW_CTL, ericsson }, { "digi", 0x0000, 0x0000, HCI_UART_H4, 115200, FLOW_CTL, digi }, + { "texas", 0x0000, 0x0000, HCI_UART_H4, 115200, FLOW_CTL, texas}, { "bcsp", 0x0000, 0x0000, HCI_UART_BCSP, 115200, 0, bcsp }, |