Index: bluez-utils-3.9/tools/hciattach.c =================================================================== --- bluez-utils-3.9.orig/tools/hciattach.c 2007-01-28 21:16:48.000000000 +0100 +++ bluez-utils-3.9/tools/hciattach.c 2007-01-29 22:51:30.000000000 +0100 @@ -59,6 +59,8 @@ #define HCI_UART_3WIRE 2 #define HCI_UART_H4DS 3 +#include "ti_bts.h" + struct uart_t { char *type; int m_id; @@ -68,6 +70,7 @@ int speed; int flags; int (*init) (int fd, struct uart_t *u, struct termios *ti); + char *bts; /* bluetooth script */ }; #define FLOW_CTL 0x0001 @@ -257,6 +260,114 @@ return 0; } +static int brf6150(int fd, struct uart_t *u, struct termios *ti) +{ + bts_t *bfp; + int i; + unsigned long vers; + unsigned char actionbuf[256]; + unsigned char resp[128]; /* Response */ + unsigned long count; + unsigned short atype; + + if (u->bts == NULL) /* no script, ignore */ + return 0; + + bfp = bts_load_script( u->bts, &vers ); + if (bfp == NULL) + return -1; + + fprintf( stderr, "Loading BTS script version %lu\n", vers ); + + while ((count = bts_next_action( bfp, actionbuf, + sizeof actionbuf - 1, &atype )) != 0) { + if (atype == ACTION_REMARKS) { + if (actionbuf[0] != 0) + fprintf( stderr, "%s\n", actionbuf ); + } + else if (atype == ACTION_SEND_COMMAND) { +#if 0 + fprintf( stderr, "ACTION_SEND_COMMAND: ", (int)atype ); + for (i=0; i<count; i++) { + fprintf( stderr, "0x%02x ", actionbuf[i] ); + } + fprintf( stderr, "\n" ); +#endif + int n; + n = write(fd, actionbuf, count); + if (n < 0 || n < count) { + perror("Failed to write TI action command"); + return -1; + } + } + else if (atype == ACTION_WAIT_EVENT) { + action_wait_t *wait = (action_wait_t *)actionbuf; +#if 0 + fprintf( stderr, "ACTION_WAIT_EVENT: %u msec, %u size, data = ", wait->msec, wait->size ); + for (i=0; i<wait->size; i++) { + fprintf( stderr, "0x%02x ", wait->data[i] ); + } + fprintf( stderr, "\n" ); +#endif + usleep(wait->msec); /* seems they give usec, not msec */ + /* Read reply. */ + if ((count = read_hci_event(fd, resp, sizeof resp)) < 0) { + perror("Failed to read TI command response"); + return -1; + } + if (count < wait->size) { + fprintf( stderr, "TI command response is short."); + } + for (i=0; i<wait->size; i++) { + if (i == 3) continue; /* ignore */ + if (resp[i] != wait->data[i]) { + fprintf( stderr, "TI command response does not match expected result.\n" ); + } + } + } + else if (atype == ACTION_SERIAL_PORT_PARAMETERS) { + action_serial_t *sercmd = (action_serial_t *)actionbuf; + + /* Set actual baudrate */ + fprintf( stderr, + "BTS changing baud rate to %u, flow control to %u\n", + sercmd->baud, sercmd->flow_control ); + + tcflush(fd, TCIOFLUSH); + + if (sercmd->flow_control) + ti->c_cflag |= CRTSCTS; + else + ti->c_cflag &= ~CRTSCTS; + if (tcsetattr(fd, TCSANOW, ti) < 0) { + perror("Can't set port settings"); + return -1; + } + + u->speed = sercmd->baud; + + tcflush(fd, TCIOFLUSH); + if (set_speed(fd, ti, sercmd->baud) < 0) { + perror("Can't set baud rate"); + return -1; + } + } + else if (atype == ACTION_DELAY) { + action_delay_t *delay = (action_delay_t *)actionbuf; + usleep(delay->msec); /* seems they give usec, not msec */ + } + else { + fprintf( stderr, "BTS action type = %d: ", (int)atype ); + for (i=0; i<count; i++) { + fprintf( stderr, "0x%02x ", actionbuf[i] ); + } + fprintf( stderr, "\n" ); + } + } + bts_unload_script( bfp ); + return 0; +} + static int texas(int fd, struct uart_t *u, struct termios *ti) { struct timespec tm = {0, 50000}; @@ -297,15 +408,26 @@ } while (resp[4] != cmd[1] && resp[5] != cmd[2]); /* Verify manufacturer */ - if ((resp[11] & 0xFF) != 0x0d) + if (resp[11] != 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); + fprintf(stderr, "TI module LMP version : 0x%02x\n", resp[10]); /* Print LMP subversion */ - fprintf(stderr, "Texas module LMP sub-version : 0x%02x%02x\n", resp[14] & 0xFF, resp[13] & 0xFF); - + fprintf(stderr, "TI module LMP sub-version : 0x%02x%02x\n", resp[14], resp[13]); + if ((resp[14] >> 2) == 3) { + int err; + nanosleep(&tm, NULL); + + /* BRF6150 */ + if ((err=brf6150( fd, u, ti )) != 0) { + fprintf( stderr, "TI script failed (err=%d)\n", + err ); + return -1; + } + } + nanosleep(&tm, NULL); return 0; } @@ -1128,7 +1250,7 @@ { printf("hciattach - HCI UART driver initialization utility\n"); printf("Usage:\n"); - printf("\thciattach [-n] [-p] [-b] [-t timeout] [-s initial_speed] <tty> <type | id> [speed] [flow|noflow]\n"); + printf("\thciattach [-n] [-p] [-b] [-t timeout] [-s initial_speed] [-S bts-script] <tty> <type | id> [speed] [flow|noflow]\n"); printf("\thciattach -l\n"); } @@ -1143,11 +1265,12 @@ struct sigaction sa; struct pollfd p; char dev[PATH_MAX]; + char *bts = NULL; detach = 1; printpid = 0; - while ((opt=getopt(argc, argv, "bnpt:s:l")) != EOF) { + while ((opt=getopt(argc, argv, "bnpt:s:S:l")) != EOF) { switch(opt) { case 'b': send_break = 1; @@ -1169,6 +1292,10 @@ init_speed = atoi(optarg); break; + case 'S': + bts = optarg; + break; + case 'l': for (i = 0; uart[i].type; i++) { printf("%-10s0x%04x,0x%04x\n", uart[i].type, @@ -1240,6 +1367,8 @@ if (init_speed) u->init_speed = init_speed; + u->bts = bts; + memset(&sa, 0, sizeof(sa)); sa.sa_flags = SA_NOCLDSTOP; sa.sa_handler = sig_alarm; Index: bluez-utils-3.9/tools/Makefile.am =================================================================== --- bluez-utils-3.9.orig/tools/Makefile.am 2007-01-28 21:16:48.000000000 +0100 +++ bluez-utils-3.9/tools/Makefile.am 2007-01-29 22:54:22.000000000 +0100 @@ -37,7 +37,7 @@ noinst_PROGRAMS = hcisecfilter ppporc -hciattach_SOURCES = hciattach.c hciattach_st.c +hciattach_SOURCES = hciattach.c hciattach_st.c ti_bts.h ti_bts.c hciattach_LDADD = @BLUEZ_LIBS@ hciconfig_SOURCES = hciconfig.c csr.h csr.c Index: bluez-utils-3.9/tools/ti_bts.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ bluez-utils-3.9/tools/ti_bts.h 2007-01-29 22:51:30.000000000 +0100 @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2005 Texas Instruments, Inc. + * Ported by SDG Systems, LLC + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY + * CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, + * COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS + * SOFTWARE IS DISCLAIMED. + * + */ + +#ifndef BT_SCRIPT_H +#define BT_SCRIPT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Define the interface of Bluetooth Script + */ + +typedef void bts_t; + + +#define ACTION_SEND_COMMAND 1 /* Send out raw data (as is) */ +#define ACTION_WAIT_EVENT 2 /* Wait for data */ +#define ACTION_SERIAL_PORT_PARAMETERS 3 +#define ACTION_DELAY 4 +#define ACTION_RUN_SCRIPT 5 +#define ACTION_REMARKS 6 + +/* + * Structure for ACTION_SEND_COMMAND + */ +typedef struct tagCActionCommand +{ + unsigned char data[1]; /* Data to send */ +} action_command_t; + +/* + * Structure for ACTION_WAIT_EVENT + */ +typedef struct tagCActionWaitEvent +{ + unsigned long msec; /* in milliseconds */ + unsigned long size; + unsigned char data[1]; /* Data to wait for */ +} action_wait_t; + + +/* + * Structure for ACTION_SERIAL_PORT_PARAMETERS + */ +typedef struct tagCActionSerialPortParameters +{ + unsigned long baud; + unsigned long flow_control; +} action_serial_t; + +/* Flow Control Type */ +#define FCT_NONE 0 +#define FCT_HARDWARE 1 + +#define DONT_CHANGE 0xFFFFFFFF /* For both baud rate and flow control */ + + +/* + * Structure for ACTION_DELAY + */ +typedef struct tagCActionDelay +{ + unsigned long msec; /* in milliseconds */ +} action_delay_t; + +/* + * Structure for ACTION_RUN_SCRIPT + */ +typedef struct tagCActionRunScript +{ + char filename[1]; +} action_run_t; + +/* + * Structure for ACTION_REMARKS + */ +typedef struct tagCActionRemarks +{ + char m_szRemarks[1]; +} action_remarks_t; + + +const char *cis_create_filename(const unsigned char* cmdparms); +bts_t * bts_load_script(const char* fname, unsigned long* version); +unsigned long bts_next_action(const bts_t* bts_fp, unsigned char* action_buf, + unsigned long nMaxSize, unsigned short* ptype); +void bts_unload_script(bts_t* bts_fp); + +#ifdef __cplusplus +}; +#endif + +#endif /* BT_SCRIPT_H */ + Index: bluez-utils-3.9/tools/ti_bts.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ bluez-utils-3.9/tools/ti_bts.c 2007-01-29 22:51:30.000000000 +0100 @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2005 Texas Instruments, Inc. + * Ported by SDG Systems, LLC + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY + * CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, + * COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS + * SOFTWARE IS DISCLAIMED. + * + */ + + +#include <stdio.h> +#include <stdlib.h> +#include "ti_bts.h" + +#ifndef MAKEWORD +#define MAKEWORD(a, b) ((unsigned short)(((unsigned char)(a)) | ((unsigned short)((unsigned char)(b))) << 8)) +#endif + +#define TI_MANUFACTURER_ID 13 + +/* + * Common Init Script specific + */ +const char * +cis_create_filename(const unsigned char* cmdparms) +{ + static char bts_file[50]; + + /* Check for TI's id */ + unsigned short manfid = MAKEWORD(cmdparms[8], cmdparms[9]); + + if (TI_MANUFACTURER_ID == manfid) { + unsigned short version = MAKEWORD(cmdparms[10], cmdparms[11]); + + unsigned short chip = (version & 0x7C00) >> 10; + unsigned short min_ver = (version & 0x007F); + unsigned short maj_ver = (version & 0x0380) >> 7; + + if (0 != (version & 0x8000)) { + maj_ver |= 0x0008; + } + + sprintf( bts_file, "TIInit_%d.%d.%d.bts", + (int)chip, (int)maj_ver, (int)min_ver); + + return &bts_file[0]; + } + return NULL; +} + +typedef struct tagCHeader +{ + unsigned long magic; + unsigned long version; + unsigned char future[24]; +} cheader_t; + + +/* The value 0x42535442 stands for (in ASCII) BTSB */ +/* which is Bluetooth Script Binary */ +#define FILE_HEADER_MAGIC 0x42535442 + + +bts_t * +bts_load_script(const char* fname, unsigned long* version) +{ + bts_t* bts = NULL; + FILE* fp = fopen(fname, "rb"); + + if (NULL != fp) { + /* Read header */ + cheader_t header; + + /* Read header */ + if (1 == fread(&header, sizeof(header), 1, fp)) { + /* Check magic number for correctness */ + if (header.magic == FILE_HEADER_MAGIC) { + /* If user wants the version number */ + if (NULL != version) { + *version = header.version; + } + bts = (bts_t*)fp; + } + } + /* If failed reading the file, close it */ + if (NULL == bts) { + fclose(fp); + } + } + return bts; +} + +unsigned long +bts_next_action(const bts_t* bts_fp, unsigned char* action_buf, + unsigned long nMaxSize, unsigned short* ptype) +{ + unsigned long bytes = 0; + FILE* fp = (FILE*)bts_fp; + unsigned char action_hdr[4]; + + if (bts_fp == NULL) + return 0; + + /* Each Action has the following: */ + /* UINT16 type of this action */ + /* UINT16 size of rest */ + /* BYTE[] action buffer (for HCI, includes the type byte e.g. 1 for hci command) */ + + if (1 == fread(&action_hdr[0], sizeof(action_hdr), 1, fp)) { + unsigned short type = *(unsigned short*)&action_hdr[0]; + unsigned short size = *(unsigned short*)&action_hdr[2]; + + if (size <= nMaxSize) { + int nread = fread(action_buf, sizeof(action_buf[0]), size, fp); + + if (nread == size) { + *ptype = type; + bytes = (unsigned long)size; + } + } + } + + return bytes; +} + +void +bts_unload_script(bts_t* bts_fp) +{ + FILE* fp = (FILE*)bts_fp; + + if (NULL != fp) { + fclose(fp); + } +} +