Home | History | Annotate | Download | only in tools
      1 /*
      2  *
      3  *  BlueZ - Bluetooth protocol stack for Linux
      4  *
      5  *  Copyright (C) 2000-2001  Qualcomm Incorporated
      6  *  Copyright (C) 2002-2003  Maxim Krasnyansky <maxk (at) qualcomm.com>
      7  *  Copyright (C) 2002-2010  Marcel Holtmann <marcel (at) holtmann.org>
      8  *
      9  *
     10  *  This program is free software; you can redistribute it and/or modify
     11  *  it under the terms of the GNU General Public License as published by
     12  *  the Free Software Foundation; either version 2 of the License, or
     13  *  (at your option) any later version.
     14  *
     15  *  This program is distributed in the hope that it will be useful,
     16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     18  *  GNU General Public License for more details.
     19  *
     20  *  You should have received a copy of the GNU General Public License
     21  *  along with this program; if not, write to the Free Software
     22  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     23  *
     24  */
     25 
     26 #ifdef HAVE_CONFIG_H
     27 #include <config.h>
     28 #endif
     29 
     30 #define _GNU_SOURCE
     31 #include <stdio.h>
     32 #include <errno.h>
     33 #include <fcntl.h>
     34 #include <unistd.h>
     35 #include <stdlib.h>
     36 #include <string.h>
     37 #include <signal.h>
     38 #include <syslog.h>
     39 #include <termios.h>
     40 #include <time.h>
     41 #include <sys/time.h>
     42 #include <sys/poll.h>
     43 #include <sys/param.h>
     44 #include <sys/ioctl.h>
     45 #include <sys/socket.h>
     46 #include <sys/uio.h>
     47 
     48 #include <bluetooth/bluetooth.h>
     49 #include <bluetooth/hci.h>
     50 #include <bluetooth/hci_lib.h>
     51 
     52 #include "hciattach.h"
     53 
     54 #include "ppoll.h"
     55 
     56 struct uart_t {
     57 	char *type;
     58 	int  m_id;
     59 	int  p_id;
     60 	int  proto;
     61 	int  init_speed;
     62 	int  speed;
     63 	int  flags;
     64 	int  pm;
     65 	char *bdaddr;
     66 	int  (*init) (int fd, struct uart_t *u, struct termios *ti);
     67 	int  (*post) (int fd, struct uart_t *u, struct termios *ti);
     68 };
     69 
     70 #define FLOW_CTL	0x0001
     71 #define ENABLE_PM	1
     72 #define DISABLE_PM	0
     73 
     74 static volatile sig_atomic_t __io_canceled = 0;
     75 
     76 static void sig_hup(int sig)
     77 {
     78 }
     79 
     80 static void sig_term(int sig)
     81 {
     82 	__io_canceled = 1;
     83 }
     84 
     85 static void sig_alarm(int sig)
     86 {
     87 	fprintf(stderr, "Initialization timed out.\n");
     88 	exit(1);
     89 }
     90 
     91 static int uart_speed(int s)
     92 {
     93 	switch (s) {
     94 	case 9600:
     95 		return B9600;
     96 	case 19200:
     97 		return B19200;
     98 	case 38400:
     99 		return B38400;
    100 	case 57600:
    101 		return B57600;
    102 	case 115200:
    103 		return B115200;
    104 	case 230400:
    105 		return B230400;
    106 	case 460800:
    107 		return B460800;
    108 	case 500000:
    109 		return B500000;
    110 	case 576000:
    111 		return B576000;
    112 	case 921600:
    113 		return B921600;
    114 	case 1000000:
    115 		return B1000000;
    116 	case 1152000:
    117 		return B1152000;
    118 	case 1500000:
    119 		return B1500000;
    120 	case 2000000:
    121 		return B2000000;
    122 #ifdef B2500000
    123 	case 2500000:
    124 		return B2500000;
    125 #endif
    126 #ifdef B3000000
    127 	case 3000000:
    128 		return B3000000;
    129 #endif
    130 #ifdef B3500000
    131 	case 3500000:
    132 		return B3500000;
    133 #endif
    134 #ifdef B4000000
    135 	case 4000000:
    136 		return B4000000;
    137 #endif
    138 	default:
    139 		return B57600;
    140 	}
    141 }
    142 
    143 int set_speed(int fd, struct termios *ti, int speed)
    144 {
    145 	if (cfsetospeed(ti, uart_speed(speed)) < 0)
    146 		return -errno;
    147 
    148 	if (cfsetispeed(ti, uart_speed(speed)) < 0)
    149 		return -errno;
    150 
    151 	if (tcsetattr(fd, TCSANOW, ti) < 0)
    152 		return -errno;
    153 
    154 	return 0;
    155 }
    156 
    157 /*
    158  * Read an HCI event from the given file descriptor.
    159  */
    160 int read_hci_event(int fd, unsigned char* buf, int size)
    161 {
    162 	int remain, r;
    163 	int count = 0;
    164 
    165 	if (size <= 0)
    166 		return -1;
    167 
    168 	/* The first byte identifies the packet type. For HCI event packets, it
    169 	 * should be 0x04, so we read until we get to the 0x04. */
    170 	while (1) {
    171 		r = read(fd, buf, 1);
    172 		if (r <= 0)
    173 			return -1;
    174 		if (buf[0] == 0x04)
    175 			break;
    176 	}
    177 	count++;
    178 
    179 	/* The next two bytes are the event code and parameter total length. */
    180 	while (count < 3) {
    181 		r = read(fd, buf + count, 3 - count);
    182 		if (r <= 0)
    183 			return -1;
    184 		count += r;
    185 	}
    186 
    187 	/* Now we read the parameters. */
    188 	if (buf[2] < (size - 3))
    189 		remain = buf[2];
    190 	else
    191 		remain = size - 3;
    192 
    193 	while ((count - 3) < remain) {
    194 		r = read(fd, buf + count, remain - (count - 3));
    195 		if (r <= 0)
    196 			return -1;
    197 		count += r;
    198 	}
    199 
    200 	return count;
    201 }
    202 
    203 /*
    204  * Ericsson specific initialization
    205  */
    206 static int ericsson(int fd, struct uart_t *u, struct termios *ti)
    207 {
    208 	struct timespec tm = {0, 50000};
    209 	char cmd[5];
    210 
    211 	cmd[0] = HCI_COMMAND_PKT;
    212 	cmd[1] = 0x09;
    213 	cmd[2] = 0xfc;
    214 	cmd[3] = 0x01;
    215 
    216 	switch (u->speed) {
    217 	case 57600:
    218 		cmd[4] = 0x03;
    219 		break;
    220 	case 115200:
    221 		cmd[4] = 0x02;
    222 		break;
    223 	case 230400:
    224 		cmd[4] = 0x01;
    225 		break;
    226 	case 460800:
    227 		cmd[4] = 0x00;
    228 		break;
    229 	case 921600:
    230 		cmd[4] = 0x20;
    231 		break;
    232 	case 2000000:
    233 		cmd[4] = 0x25;
    234 		break;
    235 	case 3000000:
    236 		cmd[4] = 0x27;
    237 		break;
    238 	case 4000000:
    239 		cmd[4] = 0x2B;
    240 		break;
    241 	default:
    242 		cmd[4] = 0x03;
    243 		u->speed = 57600;
    244 		fprintf(stderr, "Invalid speed requested, using %d bps instead\n", u->speed);
    245 		break;
    246 	}
    247 
    248 	/* Send initialization command */
    249 	if (write(fd, cmd, 5) != 5) {
    250 		perror("Failed to write init command");
    251 		return -1;
    252 	}
    253 
    254 	nanosleep(&tm, NULL);
    255 	return 0;
    256 }
    257 
    258 /*
    259  * Digianswer specific initialization
    260  */
    261 static int digi(int fd, struct uart_t *u, struct termios *ti)
    262 {
    263 	struct timespec tm = {0, 50000};
    264 	char cmd[5];
    265 
    266 	/* DigiAnswer set baud rate command */
    267 	cmd[0] = HCI_COMMAND_PKT;
    268 	cmd[1] = 0x07;
    269 	cmd[2] = 0xfc;
    270 	cmd[3] = 0x01;
    271 
    272 	switch (u->speed) {
    273 	case 57600:
    274 		cmd[4] = 0x08;
    275 		break;
    276 	case 115200:
    277 		cmd[4] = 0x09;
    278 		break;
    279 	default:
    280 		cmd[4] = 0x09;
    281 		u->speed = 115200;
    282 		break;
    283 	}
    284 
    285 	/* Send initialization command */
    286 	if (write(fd, cmd, 5) != 5) {
    287 		perror("Failed to write init command");
    288 		return -1;
    289 	}
    290 
    291 	nanosleep(&tm, NULL);
    292 	return 0;
    293 }
    294 
    295 static int texas(int fd, struct uart_t *u, struct termios *ti)
    296 {
    297 	return texas_init(fd, ti);
    298 }
    299 
    300 static int texas2(int fd, struct uart_t *u, struct termios *ti)
    301 {
    302 	return texas_post(fd, ti);
    303 }
    304 
    305 static int texasalt(int fd, struct uart_t *u, struct termios *ti)
    306 {
    307 	return texasalt_init(fd, u->speed, ti);
    308 }
    309 
    310 static int ath3k_ps(int fd, struct uart_t *u, struct termios *ti)
    311 {
    312 	return ath3k_init(fd, u->speed, u->init_speed, u->bdaddr, ti);
    313 }
    314 
    315 static int ath3k_pm(int fd, struct uart_t *u, struct termios *ti)
    316 {
    317 	return ath3k_post(fd, u->pm);
    318 }
    319 
    320 static int qualcomm(int fd, struct uart_t *u, struct termios *ti)
    321 {
    322 	return qualcomm_init(fd, u->speed, ti, u->bdaddr);
    323 }
    324 
    325 static int read_check(int fd, void *buf, int count)
    326 {
    327 	int res;
    328 
    329 	do {
    330 		res = read(fd, buf, count);
    331 		if (res != -1) {
    332 			buf += res;
    333 			count -= res;
    334 		}
    335 	} while (count && (errno == 0 || errno == EINTR));
    336 
    337 	if (count)
    338 		return -1;
    339 
    340 	return 0;
    341 }
    342 
    343 /*
    344  * BCSP specific initialization
    345  */
    346 static int serial_fd;
    347 static int bcsp_max_retries = 10;
    348 
    349 static void bcsp_tshy_sig_alarm(int sig)
    350 {
    351 	unsigned char bcsp_sync_pkt[10] = {0xc0,0x00,0x41,0x00,0xbe,0xda,0xdc,0xed,0xed,0xc0};
    352 	static int retries = 0;
    353 
    354 	if (retries < bcsp_max_retries) {
    355 		retries++;
    356 		if (write(serial_fd, &bcsp_sync_pkt, 10) < 0)
    357 			return;
    358 		alarm(1);
    359 		return;
    360 	}
    361 
    362 	tcflush(serial_fd, TCIOFLUSH);
    363 	fprintf(stderr, "BCSP initialization timed out\n");
    364 	exit(1);
    365 }
    366 
    367 static void bcsp_tconf_sig_alarm(int sig)
    368 {
    369 	unsigned char bcsp_conf_pkt[10] = {0xc0,0x00,0x41,0x00,0xbe,0xad,0xef,0xac,0xed,0xc0};
    370 	static int retries = 0;
    371 
    372 	if (retries < bcsp_max_retries){
    373 		retries++;
    374 		if (write(serial_fd, &bcsp_conf_pkt, 10) < 0)
    375 			return;
    376 		alarm(1);
    377 		return;
    378 	}
    379 
    380 	tcflush(serial_fd, TCIOFLUSH);
    381 	fprintf(stderr, "BCSP initialization timed out\n");
    382 	exit(1);
    383 }
    384 
    385 static int bcsp(int fd, struct uart_t *u, struct termios *ti)
    386 {
    387 	unsigned char byte, bcsph[4], bcspp[4],
    388 		bcsp_sync_resp_pkt[10] = {0xc0,0x00,0x41,0x00,0xbe,0xac,0xaf,0xef,0xee,0xc0},
    389 		bcsp_conf_resp_pkt[10] = {0xc0,0x00,0x41,0x00,0xbe,0xde,0xad,0xd0,0xd0,0xc0},
    390 		bcspsync[4]     = {0xda, 0xdc, 0xed, 0xed},
    391 		bcspsyncresp[4] = {0xac,0xaf,0xef,0xee},
    392 		bcspconf[4]     = {0xad,0xef,0xac,0xed},
    393 		bcspconfresp[4] = {0xde,0xad,0xd0,0xd0};
    394 	struct sigaction sa;
    395 	int len;
    396 
    397 	if (set_speed(fd, ti, u->speed) < 0) {
    398 		perror("Can't set default baud rate");
    399 		return -1;
    400 	}
    401 
    402 	ti->c_cflag |= PARENB;
    403 	ti->c_cflag &= ~(PARODD);
    404 
    405 	if (tcsetattr(fd, TCSANOW, ti) < 0) {
    406 		perror("Can't set port settings");
    407 		return -1;
    408 	}
    409 
    410 	alarm(0);
    411 
    412 	serial_fd = fd;
    413 	memset(&sa, 0, sizeof(sa));
    414 	sa.sa_flags = SA_NOCLDSTOP;
    415 	sa.sa_handler = bcsp_tshy_sig_alarm;
    416 	sigaction(SIGALRM, &sa, NULL);
    417 
    418 	/* State = shy */
    419 
    420 	bcsp_tshy_sig_alarm(0);
    421 	while (1) {
    422 		do {
    423 			if (read_check(fd, &byte, 1) == -1){
    424 				perror("Failed to read");
    425 				return -1;
    426 			}
    427 		} while (byte != 0xC0);
    428 
    429 		do {
    430 			if ( read_check(fd, &bcsph[0], 1) == -1){
    431 				perror("Failed to read");
    432 				return -1;
    433 			}
    434 		} while (bcsph[0] == 0xC0);
    435 
    436 		if ( read_check(fd, &bcsph[1], 3) == -1){
    437 			perror("Failed to read");
    438 			return -1;
    439 		}
    440 
    441 		if (((bcsph[0] + bcsph[1] + bcsph[2]) & 0xFF) != (unsigned char)~bcsph[3])
    442 			continue;
    443 		if (bcsph[1] != 0x41 || bcsph[2] != 0x00)
    444 			continue;
    445 
    446 		if (read_check(fd, &bcspp, 4) == -1){
    447 			perror("Failed to read");
    448 			return -1;
    449 		}
    450 
    451 		if (!memcmp(bcspp, bcspsync, 4)) {
    452 			if (write(fd, &bcsp_sync_resp_pkt,10) < 0)
    453 				return -1;
    454 		} else if (!memcmp(bcspp, bcspsyncresp, 4))
    455 			break;
    456 	}
    457 
    458 	/* State = curious */
    459 
    460 	alarm(0);
    461 	sa.sa_handler = bcsp_tconf_sig_alarm;
    462 	sigaction(SIGALRM, &sa, NULL);
    463 	alarm(1);
    464 
    465 	while (1) {
    466 		do {
    467 			if (read_check(fd, &byte, 1) == -1){
    468 				perror("Failed to read");
    469 				return -1;
    470 			}
    471 		} while (byte != 0xC0);
    472 
    473 		do {
    474 			if (read_check(fd, &bcsph[0], 1) == -1){
    475 				perror("Failed to read");
    476 				return -1;
    477 			}
    478 		} while (bcsph[0] == 0xC0);
    479 
    480 		if (read_check(fd, &bcsph[1], 3) == -1){
    481 			perror("Failed to read");
    482 			return -1;
    483 		}
    484 
    485 		if (((bcsph[0] + bcsph[1] + bcsph[2]) & 0xFF) != (unsigned char)~bcsph[3])
    486 			continue;
    487 
    488 		if (bcsph[1] != 0x41 || bcsph[2] != 0x00)
    489 			continue;
    490 
    491 		if (read_check(fd, &bcspp, 4) == -1){
    492 			perror("Failed to read");
    493 			return -1;
    494 		}
    495 
    496 		if (!memcmp(bcspp, bcspsync, 4))
    497 			len = write(fd, &bcsp_sync_resp_pkt, 10);
    498 		else if (!memcmp(bcspp, bcspconf, 4))
    499 			len = write(fd, &bcsp_conf_resp_pkt, 10);
    500 		else if (!memcmp(bcspp, bcspconfresp,  4))
    501 			break;
    502 		else
    503 			continue;
    504 
    505 		if (len < 0)
    506 			return -errno;
    507 	}
    508 
    509 	/* State = garrulous */
    510 
    511 	return 0;
    512 }
    513 
    514 /*
    515  * CSR specific initialization
    516  * Inspired strongly by code in OpenBT and experimentations with Brainboxes
    517  * Pcmcia card.
    518  * Jean Tourrilhes <jt (at) hpl.hp.com> - 14.11.01
    519  */
    520 static int csr(int fd, struct uart_t *u, struct termios *ti)
    521 {
    522 	struct timespec tm = {0, 10000000};	/* 10ms - be generous */
    523 	unsigned char cmd[30];		/* Command */
    524 	unsigned char resp[30];		/* Response */
    525 	int  clen = 0;		/* Command len */
    526 	static int csr_seq = 0;	/* Sequence number of command */
    527 	int  divisor;
    528 
    529 	/* It seems that if we set the CSR UART speed straight away, it
    530 	 * won't work, the CSR UART gets into a state where we can't talk
    531 	 * to it anymore.
    532 	 * On the other hand, doing a read before setting the CSR speed
    533 	 * seems to be ok.
    534 	 * Therefore, the strategy is to read the build ID (useful for
    535 	 * debugging) and only then set the CSR UART speed. Doing like
    536 	 * this is more complex but at least it works ;-)
    537 	 * The CSR UART control may be slow to wake up or something because
    538 	 * every time I read its speed, its bogus...
    539 	 * Jean II */
    540 
    541 	/* Try to read the build ID of the CSR chip */
    542 	clen = 5 + (5 + 6) * 2;
    543 	/* HCI header */
    544 	cmd[0] = HCI_COMMAND_PKT;
    545 	cmd[1] = 0x00;		/* CSR command */
    546 	cmd[2] = 0xfc;		/* MANUFACTURER_SPEC */
    547 	cmd[3] = 1 + (5 + 6) * 2;	/* len */
    548 	/* CSR MSG header */
    549 	cmd[4] = 0xC2;		/* first+last+channel=BCC */
    550 	/* CSR BCC header */
    551 	cmd[5] = 0x00;		/* type = GET-REQ */
    552 	cmd[6] = 0x00;		/* - msB */
    553 	cmd[7] = 5 + 4;		/* len */
    554 	cmd[8] = 0x00;		/* - msB */
    555 	cmd[9] = csr_seq & 0xFF;/* seq num */
    556 	cmd[10] = (csr_seq >> 8) & 0xFF;	/* - msB */
    557 	csr_seq++;
    558 	cmd[11] = 0x19;		/* var_id = CSR_CMD_BUILD_ID */
    559 	cmd[12] = 0x28;		/* - msB */
    560 	cmd[13] = 0x00;		/* status = STATUS_OK */
    561 	cmd[14] = 0x00;		/* - msB */
    562 	/* CSR BCC payload */
    563 	memset(cmd + 15, 0, 6 * 2);
    564 
    565 	/* Send command */
    566 	do {
    567 		if (write(fd, cmd, clen) != clen) {
    568 			perror("Failed to write init command (GET_BUILD_ID)");
    569 			return -1;
    570 		}
    571 
    572 		/* Read reply. */
    573 		if (read_hci_event(fd, resp, 100) < 0) {
    574 			perror("Failed to read init response (GET_BUILD_ID)");
    575 			return -1;
    576 		}
    577 
    578 	/* Event code 0xFF is for vendor-specific events, which is
    579 	 * what we're looking for. */
    580 	} while (resp[1] != 0xFF);
    581 
    582 #ifdef CSR_DEBUG
    583 	{
    584 	char temp[512];
    585 	int i;
    586 	for (i=0; i < rlen; i++)
    587 		sprintf(temp + (i*3), "-%02X", resp[i]);
    588 	fprintf(stderr, "Reading CSR build ID %d [%s]\n", rlen, temp + 1);
    589 	// In theory, it should look like :
    590 	// 04-FF-13-FF-01-00-09-00-00-00-19-28-00-00-73-00-00-00-00-00-00-00
    591 	}
    592 #endif
    593 	/* Display that to user */
    594 	fprintf(stderr, "CSR build ID 0x%02X-0x%02X\n",
    595 		resp[15] & 0xFF, resp[14] & 0xFF);
    596 
    597 	/* Try to read the current speed of the CSR chip */
    598 	clen = 5 + (5 + 4)*2;
    599 	/* -- HCI header */
    600 	cmd[3] = 1 + (5 + 4)*2;	/* len */
    601 	/* -- CSR BCC header -- */
    602 	cmd[9] = csr_seq & 0xFF;	/* seq num */
    603 	cmd[10] = (csr_seq >> 8) & 0xFF;	/* - msB */
    604 	csr_seq++;
    605 	cmd[11] = 0x02;		/* var_id = CONFIG_UART */
    606 	cmd[12] = 0x68;		/* - msB */
    607 
    608 #ifdef CSR_DEBUG
    609 	/* Send command */
    610 	do {
    611 		if (write(fd, cmd, clen) != clen) {
    612 			perror("Failed to write init command (GET_BUILD_ID)");
    613 			return -1;
    614 		}
    615 
    616 		/* Read reply. */
    617 		if (read_hci_event(fd, resp, 100) < 0) {
    618 			perror("Failed to read init response (GET_BUILD_ID)");
    619 			return -1;
    620 		}
    621 
    622 	/* Event code 0xFF is for vendor-specific events, which is
    623 	 * what we're looking for. */
    624 	} while (resp[1] != 0xFF);
    625 
    626 	{
    627 	char temp[512];
    628 	int i;
    629 	for (i=0; i < rlen; i++)
    630 		sprintf(temp + (i*3), "-%02X", resp[i]);
    631 	fprintf(stderr, "Reading CSR UART speed %d [%s]\n", rlen, temp+1);
    632 	}
    633 #endif
    634 
    635 	if (u->speed > 1500000) {
    636 		fprintf(stderr, "Speed %d too high. Remaining at %d baud\n",
    637 			u->speed, u->init_speed);
    638 		u->speed = u->init_speed;
    639 	} else if (u->speed != 57600 && uart_speed(u->speed) == B57600) {
    640 		/* Unknown speed. Why oh why can't we just pass an int to the kernel? */
    641 		fprintf(stderr, "Speed %d unrecognised. Remaining at %d baud\n",
    642 			u->speed, u->init_speed);
    643 		u->speed = u->init_speed;
    644 	}
    645 	if (u->speed == u->init_speed)
    646 		return 0;
    647 
    648 	/* Now, create the command that will set the UART speed */
    649 	/* CSR BCC header */
    650 	cmd[5] = 0x02;			/* type = SET-REQ */
    651 	cmd[6] = 0x00;			/* - msB */
    652 	cmd[9] = csr_seq & 0xFF;	/* seq num */
    653 	cmd[10] = (csr_seq >> 8) & 0xFF;/* - msB */
    654 	csr_seq++;
    655 
    656 	divisor = (u->speed*64+7812)/15625;
    657 
    658 	/* No parity, one stop bit -> divisor |= 0x0000; */
    659 	cmd[15] = (divisor) & 0xFF;		/* divider */
    660 	cmd[16] = (divisor >> 8) & 0xFF;	/* - msB */
    661 	/* The rest of the payload will be 0x00 */
    662 
    663 #ifdef CSR_DEBUG
    664 	{
    665 	char temp[512];
    666 	int i;
    667 	for(i = 0; i < clen; i++)
    668 		sprintf(temp + (i*3), "-%02X", cmd[i]);
    669 	fprintf(stderr, "Writing CSR UART speed %d [%s]\n", clen, temp + 1);
    670 	// In theory, it should look like :
    671 	// 01-00-FC-13-C2-02-00-09-00-03-00-02-68-00-00-BF-0E-00-00-00-00-00-00
    672 	// 01-00-FC-13-C2-02-00-09-00-01-00-02-68-00-00-D8-01-00-00-00-00-00-00
    673 	}
    674 #endif
    675 
    676 	/* Send the command to set the CSR UART speed */
    677 	if (write(fd, cmd, clen) != clen) {
    678 		perror("Failed to write init command (SET_UART_SPEED)");
    679 		return -1;
    680 	}
    681 
    682 	nanosleep(&tm, NULL);
    683 	return 0;
    684 }
    685 
    686 /*
    687  * Silicon Wave specific initialization
    688  * Thomas Moser <thomas.moser (at) tmoser.ch>
    689  */
    690 static int swave(int fd, struct uart_t *u, struct termios *ti)
    691 {
    692 	struct timespec tm = { 0, 500000 };
    693 	char cmd[10], rsp[100];
    694 	int r;
    695 
    696 	// Silicon Wave set baud rate command
    697 	// see HCI Vendor Specific Interface from Silicon Wave
    698 	// first send a "param access set" command to set the
    699 	// appropriate data fields in RAM. Then send a "HCI Reset
    700 	// Subcommand", e.g. "soft reset" to make the changes effective.
    701 
    702 	cmd[0] = HCI_COMMAND_PKT;	// it's a command packet
    703 	cmd[1] = 0x0B;			// OCF 0x0B	= param access set
    704 	cmd[2] = 0xfc;			// OGF bx111111 = vendor specific
    705 	cmd[3] = 0x06;			// 6 bytes of data following
    706 	cmd[4] = 0x01;			// param sub command
    707 	cmd[5] = 0x11;			// tag 17 = 0x11 = HCI Transport Params
    708 	cmd[6] = 0x03;			// length of the parameter following
    709 	cmd[7] = 0x01;			// HCI Transport flow control enable
    710 	cmd[8] = 0x01;			// HCI Transport Type = UART
    711 
    712 	switch (u->speed) {
    713 	case 19200:
    714 		cmd[9] = 0x03;
    715 		break;
    716 	case 38400:
    717 		cmd[9] = 0x02;
    718 		break;
    719 	case 57600:
    720 		cmd[9] = 0x01;
    721 		break;
    722 	case 115200:
    723 		cmd[9] = 0x00;
    724 		break;
    725 	default:
    726 		u->speed = 115200;
    727 		cmd[9] = 0x00;
    728 		break;
    729 	}
    730 
    731 	/* Send initialization command */
    732 	if (write(fd, cmd, 10) != 10) {
    733 		perror("Failed to write init command");
    734 		return -1;
    735 	}
    736 
    737 	// We should wait for a "GET Event" to confirm the success of
    738 	// the baud rate setting. Wait some time before reading. Better:
    739 	// read with timeout, parse data
    740 	// until correct answer, else error handling ... todo ...
    741 
    742 	nanosleep(&tm, NULL);
    743 
    744 	r = read(fd, rsp, sizeof(rsp));
    745 	if (r > 0) {
    746 		// guess it's okay, but we should parse the reply. But since
    747 		// I don't react on an error anyway ... todo
    748 		// Response packet format:
    749 		//  04	Event
    750 		//  FF	Vendor specific
    751 		//  07	Parameter length
    752 		//  0B	Subcommand
    753 		//  01	Setevent
    754 		//  11	Tag specifying HCI Transport Layer Parameter
    755 		//  03	length
    756 		//  01	flow on
    757 		//  01 	Hci Transport type = Uart
    758 		//  xx	Baud rate set (see above)
    759 	} else {
    760 		// ups, got error.
    761 		return -1;
    762 	}
    763 
    764 	// we probably got the reply. Now we must send the "soft reset"
    765 	// which is standard HCI RESET.
    766 
    767 	cmd[0] = HCI_COMMAND_PKT;	// it's a command packet
    768 	cmd[1] = 0x03;
    769 	cmd[2] = 0x0c;
    770 	cmd[3] = 0x00;
    771 
    772 	/* Send reset command */
    773 	if (write(fd, cmd, 4) != 4) {
    774 		perror("Can't write Silicon Wave reset cmd.");
    775 		return -1;
    776 	}
    777 
    778 	nanosleep(&tm, NULL);
    779 
    780 	// now the uart baud rate on the silicon wave module is set and effective.
    781 	// change our own baud rate as well. Then there is a reset event comming in
    782  	// on the *new* baud rate. This is *undocumented*! The packet looks like this:
    783 	// 04 FF 01 0B (which would make that a confirmation of 0x0B = "Param
    784 	// subcommand class". So: change to new baud rate, read with timeout, parse
    785 	// data, error handling. BTW: all param access in Silicon Wave is done this way.
    786 	// Maybe this code would belong in a seperate file, or at least code reuse...
    787 
    788 	return 0;
    789 }
    790 
    791 /*
    792  * ST Microelectronics specific initialization
    793  * Marcel Holtmann <marcel (at) holtmann.org>
    794  */
    795 static int st(int fd, struct uart_t *u, struct termios *ti)
    796 {
    797 	struct timespec tm = {0, 50000};
    798 	char cmd[5];
    799 
    800 	/* ST Microelectronics set baud rate command */
    801 	cmd[0] = HCI_COMMAND_PKT;
    802 	cmd[1] = 0x46;			// OCF = Hci_Cmd_ST_Set_Uart_Baud_Rate
    803 	cmd[2] = 0xfc;			// OGF = Vendor specific
    804 	cmd[3] = 0x01;
    805 
    806 	switch (u->speed) {
    807 	case 9600:
    808 		cmd[4] = 0x09;
    809 		break;
    810 	case 19200:
    811 		cmd[4] = 0x0b;
    812 		break;
    813 	case 38400:
    814 		cmd[4] = 0x0d;
    815 		break;
    816 	case 57600:
    817 		cmd[4] = 0x0e;
    818 		break;
    819 	case 115200:
    820 		cmd[4] = 0x10;
    821 		break;
    822 	case 230400:
    823 		cmd[4] = 0x12;
    824 		break;
    825 	case 460800:
    826 		cmd[4] = 0x13;
    827 		break;
    828 	case 921600:
    829 		cmd[4] = 0x14;
    830 		break;
    831 	default:
    832 		cmd[4] = 0x10;
    833 		u->speed = 115200;
    834 		break;
    835 	}
    836 
    837 	/* Send initialization command */
    838 	if (write(fd, cmd, 5) != 5) {
    839 		perror("Failed to write init command");
    840 		return -1;
    841 	}
    842 
    843 	nanosleep(&tm, NULL);
    844 	return 0;
    845 }
    846 
    847 static int stlc2500(int fd, struct uart_t *u, struct termios *ti)
    848 {
    849 	bdaddr_t bdaddr;
    850 	unsigned char resp[10];
    851 	int n;
    852 	int rvalue;
    853 
    854 	/* STLC2500 has an ericsson core */
    855 	rvalue = ericsson(fd, u, ti);
    856 	if (rvalue != 0)
    857 		return rvalue;
    858 
    859 #ifdef STLC2500_DEBUG
    860 	fprintf(stderr, "Setting speed\n");
    861 #endif
    862 	if (set_speed(fd, ti, u->speed) < 0) {
    863 		perror("Can't set baud rate");
    864 		return -1;
    865 	}
    866 
    867 #ifdef STLC2500_DEBUG
    868 	fprintf(stderr, "Speed set...\n");
    869 #endif
    870 
    871 	/* Read reply */
    872 	if ((n = read_hci_event(fd, resp, 10)) < 0) {
    873 		fprintf(stderr, "Failed to set baud rate on chip\n");
    874 		return -1;
    875 	}
    876 
    877 #ifdef STLC2500_DEBUG
    878 	for (i = 0; i < n; i++) {
    879 		fprintf(stderr, "resp[%d] = %02x\n", i, resp[i]);
    880 	}
    881 #endif
    882 
    883 	str2ba(u->bdaddr, &bdaddr);
    884 	return stlc2500_init(fd, &bdaddr);
    885 }
    886 
    887 static int bgb2xx(int fd, struct uart_t *u, struct termios *ti)
    888 {
    889 	bdaddr_t bdaddr;
    890 
    891 	str2ba(u->bdaddr, &bdaddr);
    892 
    893 	return bgb2xx_init(fd, &bdaddr);
    894 }
    895 
    896 /*
    897  * Broadcom specific initialization
    898  * Extracted from Jungo openrg
    899  */
    900 static int bcm2035(int fd, struct uart_t *u, struct termios *ti)
    901 {
    902 	int n;
    903 	unsigned char cmd[30], resp[30];
    904 
    905 	/* Reset the BT Chip */
    906 	memset(cmd, 0, sizeof(cmd));
    907 	memset(resp, 0, sizeof(resp));
    908 	cmd[0] = HCI_COMMAND_PKT;
    909 	cmd[1] = 0x03;
    910 	cmd[2] = 0x0c;
    911 	cmd[3] = 0x00;
    912 
    913 	/* Send command */
    914 	if (write(fd, cmd, 4) != 4) {
    915 		fprintf(stderr, "Failed to write reset command\n");
    916 		return -1;
    917 	}
    918 
    919 	/* Read reply */
    920 	if ((n = read_hci_event(fd, resp, 4)) < 0) {
    921 		fprintf(stderr, "Failed to reset chip\n");
    922 		return -1;
    923 	}
    924 
    925 	if (u->bdaddr != NULL) {
    926 		/* Set BD_ADDR */
    927 		memset(cmd, 0, sizeof(cmd));
    928 		memset(resp, 0, sizeof(resp));
    929 		cmd[0] = HCI_COMMAND_PKT;
    930 		cmd[1] = 0x01;
    931 		cmd[2] = 0xfc;
    932 		cmd[3] = 0x06;
    933 		str2ba(u->bdaddr, (bdaddr_t *) (cmd + 4));
    934 
    935 		/* Send command */
    936 		if (write(fd, cmd, 10) != 10) {
    937 			fprintf(stderr, "Failed to write BD_ADDR command\n");
    938 			return -1;
    939 		}
    940 
    941 		/* Read reply */
    942 		if ((n = read_hci_event(fd, resp, 10)) < 0) {
    943 			fprintf(stderr, "Failed to set BD_ADDR\n");
    944 			return -1;
    945 		}
    946 	}
    947 
    948 	/* Read the local version info */
    949 	memset(cmd, 0, sizeof(cmd));
    950 	memset(resp, 0, sizeof(resp));
    951 	cmd[0] = HCI_COMMAND_PKT;
    952 	cmd[1] = 0x01;
    953 	cmd[2] = 0x10;
    954 	cmd[3] = 0x00;
    955 
    956 	/* Send command */
    957 	if (write(fd, cmd, 4) != 4) {
    958 		fprintf(stderr, "Failed to write \"read local version\" "
    959 			"command\n");
    960 		return -1;
    961 	}
    962 
    963 	/* Read reply */
    964 	if ((n = read_hci_event(fd, resp, 4)) < 0) {
    965 		fprintf(stderr, "Failed to read local version\n");
    966 		return -1;
    967 	}
    968 
    969 	/* Read the local supported commands info */
    970 	memset(cmd, 0, sizeof(cmd));
    971 	memset(resp, 0, sizeof(resp));
    972 	cmd[0] = HCI_COMMAND_PKT;
    973 	cmd[1] = 0x02;
    974 	cmd[2] = 0x10;
    975 	cmd[3] = 0x00;
    976 
    977 	/* Send command */
    978 	if (write(fd, cmd, 4) != 4) {
    979 		fprintf(stderr, "Failed to write \"read local supported "
    980 						"commands\" command\n");
    981 		return -1;
    982 	}
    983 
    984 	/* Read reply */
    985 	if ((n = read_hci_event(fd, resp, 4)) < 0) {
    986 		fprintf(stderr, "Failed to read local supported commands\n");
    987 		return -1;
    988 	}
    989 
    990 	/* Set the baud rate */
    991 	memset(cmd, 0, sizeof(cmd));
    992 	memset(resp, 0, sizeof(resp));
    993 	cmd[0] = HCI_COMMAND_PKT;
    994 	cmd[1] = 0x18;
    995 	cmd[2] = 0xfc;
    996 	cmd[3] = 0x02;
    997 	switch (u->speed) {
    998 	case 57600:
    999 		cmd[4] = 0x00;
   1000 		cmd[5] = 0xe6;
   1001 		break;
   1002 	case 230400:
   1003 		cmd[4] = 0x22;
   1004 		cmd[5] = 0xfa;
   1005 		break;
   1006 	case 460800:
   1007 		cmd[4] = 0x22;
   1008 		cmd[5] = 0xfd;
   1009 		break;
   1010 	case 921600:
   1011 		cmd[4] = 0x55;
   1012 		cmd[5] = 0xff;
   1013 		break;
   1014 	default:
   1015 		/* Default is 115200 */
   1016 		cmd[4] = 0x00;
   1017 		cmd[5] = 0xf3;
   1018 		break;
   1019 	}
   1020 	fprintf(stderr, "Baud rate parameters: DHBR=0x%2x,DLBR=0x%2x\n",
   1021 		cmd[4], cmd[5]);
   1022 
   1023 	/* Send command */
   1024 	if (write(fd, cmd, 6) != 6) {
   1025 		fprintf(stderr, "Failed to write \"set baud rate\" command\n");
   1026 		return -1;
   1027 	}
   1028 
   1029 	if ((n = read_hci_event(fd, resp, 6)) < 0) {
   1030 		fprintf(stderr, "Failed to set baud rate\n");
   1031 		return -1;
   1032 	}
   1033 
   1034 	return 0;
   1035 }
   1036 
   1037 struct uart_t uart[] = {
   1038 	{ "any",        0x0000, 0x0000, HCI_UART_H4,   115200, 115200,
   1039 				FLOW_CTL, DISABLE_PM, NULL, NULL     },
   1040 
   1041 	{ "ericsson",   0x0000, 0x0000, HCI_UART_H4,   57600,  115200,
   1042 				FLOW_CTL, DISABLE_PM, NULL, ericsson },
   1043 
   1044 	{ "digi",       0x0000, 0x0000, HCI_UART_H4,   9600,   115200,
   1045 				FLOW_CTL, DISABLE_PM, NULL, digi     },
   1046 
   1047 	{ "bcsp",       0x0000, 0x0000, HCI_UART_BCSP, 115200, 115200,
   1048 				0, DISABLE_PM, NULL, bcsp     },
   1049 
   1050 	/* Xircom PCMCIA cards: Credit Card Adapter and Real Port Adapter */
   1051 	{ "xircom",     0x0105, 0x080a, HCI_UART_H4,   115200, 115200,
   1052 				FLOW_CTL, DISABLE_PM,  NULL, NULL     },
   1053 
   1054 	/* CSR Casira serial adapter or BrainBoxes serial dongle (BL642) */
   1055 	{ "csr",        0x0000, 0x0000, HCI_UART_H4,   115200, 115200,
   1056 				FLOW_CTL, DISABLE_PM, NULL, csr      },
   1057 
   1058 	/* BrainBoxes PCMCIA card (BL620) */
   1059 	{ "bboxes",     0x0160, 0x0002, HCI_UART_H4,   115200, 460800,
   1060 				FLOW_CTL, DISABLE_PM, NULL, csr      },
   1061 
   1062 	/* Silicon Wave kits */
   1063 	{ "swave",      0x0000, 0x0000, HCI_UART_H4,   115200, 115200,
   1064 				FLOW_CTL, DISABLE_PM, NULL, swave    },
   1065 
   1066 	/* Texas Instruments Bluelink (BRF) modules */
   1067 	{ "texas",      0x0000, 0x0000, HCI_UART_LL,   115200, 115200,
   1068 				FLOW_CTL, DISABLE_PM, NULL, texas,    texas2 },
   1069 
   1070 	{ "texasalt",   0x0000, 0x0000, HCI_UART_LL,   115200, 115200,
   1071 				FLOW_CTL, DISABLE_PM, NULL, texasalt, NULL   },
   1072 
   1073 	/* ST Microelectronics minikits based on STLC2410/STLC2415 */
   1074 	{ "st",         0x0000, 0x0000, HCI_UART_H4,    57600, 115200,
   1075 				FLOW_CTL, DISABLE_PM,  NULL, st       },
   1076 
   1077 	/* ST Microelectronics minikits based on STLC2500 */
   1078 	{ "stlc2500",   0x0000, 0x0000, HCI_UART_H4, 115200, 115200,
   1079 			FLOW_CTL, DISABLE_PM, "00:80:E1:00:AB:BA", stlc2500 },
   1080 
   1081 	/* Philips generic Ericsson IP core based */
   1082 	{ "philips",    0x0000, 0x0000, HCI_UART_H4,   115200, 115200,
   1083 				FLOW_CTL, DISABLE_PM, NULL, NULL     },
   1084 
   1085 	/* Philips BGB2xx Module */
   1086 	{ "bgb2xx",    0x0000, 0x0000, HCI_UART_H4,   115200, 115200,
   1087 			FLOW_CTL, DISABLE_PM, "BD:B2:10:00:AB:BA", bgb2xx },
   1088 
   1089 	/* Sphinx Electronics PICO Card */
   1090 	{ "picocard",   0x025e, 0x1000, HCI_UART_H4, 115200, 115200,
   1091 				FLOW_CTL, DISABLE_PM, NULL, NULL     },
   1092 
   1093 	/* Inventel BlueBird Module */
   1094 	{ "inventel",   0x0000, 0x0000, HCI_UART_H4, 115200, 115200,
   1095 				FLOW_CTL, DISABLE_PM, NULL, NULL     },
   1096 
   1097 	/* COM One Platinium Bluetooth PC Card */
   1098 	{ "comone",     0xffff, 0x0101, HCI_UART_BCSP, 115200, 115200,
   1099 				0, DISABLE_PM,  NULL, bcsp     },
   1100 
   1101 	/* TDK Bluetooth PC Card and IBM Bluetooth PC Card II */
   1102 	{ "tdk",        0x0105, 0x4254, HCI_UART_BCSP, 115200, 115200,
   1103 				0, DISABLE_PM, NULL, bcsp     },
   1104 
   1105 	/* Socket Bluetooth CF Card (Rev G) */
   1106 	{ "socket",     0x0104, 0x0096, HCI_UART_BCSP, 230400, 230400,
   1107 				0, DISABLE_PM, NULL, bcsp     },
   1108 
   1109 	/* 3Com Bluetooth Card (Version 3.0) */
   1110 	{ "3com",       0x0101, 0x0041, HCI_UART_H4,   115200, 115200,
   1111 				FLOW_CTL, DISABLE_PM, NULL, csr      },
   1112 
   1113 	/* AmbiCom BT2000C Bluetooth PC/CF Card */
   1114 	{ "bt2000c",    0x022d, 0x2000, HCI_UART_H4,    57600, 460800,
   1115 				FLOW_CTL, DISABLE_PM, NULL, csr      },
   1116 
   1117 	/* Zoom Bluetooth PCMCIA Card */
   1118 	{ "zoom",       0x0279, 0x950b, HCI_UART_BCSP, 115200, 115200,
   1119 				0, DISABLE_PM, NULL, bcsp     },
   1120 
   1121 	/* Sitecom CN-504 PCMCIA Card */
   1122 	{ "sitecom",    0x0279, 0x950b, HCI_UART_BCSP, 115200, 115200,
   1123 				0, DISABLE_PM, NULL, bcsp     },
   1124 
   1125 	/* Billionton PCBTC1 PCMCIA Card */
   1126 	{ "billionton", 0x0279, 0x950b, HCI_UART_BCSP, 115200, 115200,
   1127 				0, DISABLE_PM, NULL, bcsp     },
   1128 
   1129 	/* Broadcom BCM2035 */
   1130 	{ "bcm2035",    0x0A5C, 0x2035, HCI_UART_H4,   115200, 460800,
   1131 				FLOW_CTL, DISABLE_PM, NULL, bcm2035  },
   1132 
   1133 	{ "ath3k",    0x0000, 0x0000, HCI_UART_ATH3K, 115200, 115200,
   1134 			FLOW_CTL, DISABLE_PM, NULL, ath3k_ps, ath3k_pm  },
   1135 
   1136 	/* QUALCOMM BTS */
   1137 	{ "qualcomm",   0x0000, 0x0000, HCI_UART_H4,   115200, 115200,
   1138 			FLOW_CTL, DISABLE_PM, NULL, qualcomm, NULL },
   1139 
   1140 	{ NULL, 0 }
   1141 };
   1142 
   1143 static struct uart_t * get_by_id(int m_id, int p_id)
   1144 {
   1145 	int i;
   1146 	for (i = 0; uart[i].type; i++) {
   1147 		if (uart[i].m_id == m_id && uart[i].p_id == p_id)
   1148 			return &uart[i];
   1149 	}
   1150 	return NULL;
   1151 }
   1152 
   1153 static struct uart_t * get_by_type(char *type)
   1154 {
   1155 	int i;
   1156 	for (i = 0; uart[i].type; i++) {
   1157 		if (!strcmp(uart[i].type, type))
   1158 			return &uart[i];
   1159 	}
   1160 	return NULL;
   1161 }
   1162 
   1163 /* Initialize UART driver */
   1164 static int init_uart(char *dev, struct uart_t *u, int send_break, int raw)
   1165 {
   1166 	struct termios ti;
   1167 	int fd, i;
   1168 	unsigned long flags = 0;
   1169 
   1170 	if (raw)
   1171 		flags |= 1 << HCI_UART_RAW_DEVICE;
   1172 
   1173 	fd = open(dev, O_RDWR | O_NOCTTY);
   1174 	if (fd < 0) {
   1175 		perror("Can't open serial port");
   1176 		return -1;
   1177 	}
   1178 
   1179 	tcflush(fd, TCIOFLUSH);
   1180 
   1181 	if (tcgetattr(fd, &ti) < 0) {
   1182 		perror("Can't get port settings");
   1183 		return -1;
   1184 	}
   1185 
   1186 	cfmakeraw(&ti);
   1187 
   1188 	ti.c_cflag |= CLOCAL;
   1189 	if (u->flags & FLOW_CTL)
   1190 		ti.c_cflag |= CRTSCTS;
   1191 	else
   1192 		ti.c_cflag &= ~CRTSCTS;
   1193 
   1194 	if (tcsetattr(fd, TCSANOW, &ti) < 0) {
   1195 		perror("Can't set port settings");
   1196 		return -1;
   1197 	}
   1198 
   1199 	/* Set initial baudrate */
   1200 	if (set_speed(fd, &ti, u->init_speed) < 0) {
   1201 		perror("Can't set initial baud rate");
   1202 		return -1;
   1203 	}
   1204 
   1205 	tcflush(fd, TCIOFLUSH);
   1206 
   1207 	if (send_break) {
   1208 		tcsendbreak(fd, 0);
   1209 		usleep(500000);
   1210 	}
   1211 
   1212 	if (u->init && u->init(fd, u, &ti) < 0)
   1213 		return -1;
   1214 
   1215 	tcflush(fd, TCIOFLUSH);
   1216 
   1217 	/* Set actual baudrate */
   1218 	if (set_speed(fd, &ti, u->speed) < 0) {
   1219 		perror("Can't set baud rate");
   1220 		return -1;
   1221 	}
   1222 
   1223 	/* Set TTY to N_HCI line discipline */
   1224 	i = N_HCI;
   1225 	if (ioctl(fd, TIOCSETD, &i) < 0) {
   1226 		perror("Can't set line discipline");
   1227 		return -1;
   1228 	}
   1229 
   1230 	if (flags && ioctl(fd, HCIUARTSETFLAGS, flags) < 0) {
   1231 		perror("Can't set UART flags");
   1232 		return -1;
   1233 	}
   1234 
   1235 	if (ioctl(fd, HCIUARTSETPROTO, u->proto) < 0) {
   1236 		perror("Can't set device");
   1237 		return -1;
   1238 	}
   1239 
   1240 	if (u->post && u->post(fd, u, &ti) < 0)
   1241 		return -1;
   1242 
   1243 	return fd;
   1244 }
   1245 
   1246 static void usage(void)
   1247 {
   1248 	printf("hciattach - HCI UART driver initialization utility\n");
   1249 	printf("Usage:\n");
   1250 	printf("\thciattach [-n] [-p] [-b] [-r] [-t timeout] [-s initial_speed] <tty> <type | id> [speed] [flow|noflow] [bdaddr]\n");
   1251 	printf("\thciattach -l\n");
   1252 }
   1253 
   1254 int main(int argc, char *argv[])
   1255 {
   1256 	struct uart_t *u = NULL;
   1257 	int detach, printpid, raw, opt, i, n, ld, err;
   1258 	int to = 10;
   1259 	int init_speed = 0;
   1260 	int send_break = 0;
   1261 	pid_t pid;
   1262 	struct sigaction sa;
   1263 	struct pollfd p;
   1264 	sigset_t sigs;
   1265 	char dev[PATH_MAX];
   1266 
   1267 	detach = 1;
   1268 	printpid = 0;
   1269 	raw = 0;
   1270 
   1271 	while ((opt=getopt(argc, argv, "bnpt:s:lr")) != EOF) {
   1272 		switch(opt) {
   1273 		case 'b':
   1274 			send_break = 1;
   1275 			break;
   1276 
   1277 		case 'n':
   1278 			detach = 0;
   1279 			break;
   1280 
   1281 		case 'p':
   1282 			printpid = 1;
   1283 			break;
   1284 
   1285 		case 't':
   1286 			to = atoi(optarg);
   1287 			break;
   1288 
   1289 		case 's':
   1290 			init_speed = atoi(optarg);
   1291 			break;
   1292 
   1293 		case 'l':
   1294 			for (i = 0; uart[i].type; i++) {
   1295 				printf("%-10s0x%04x,0x%04x\n", uart[i].type,
   1296 							uart[i].m_id, uart[i].p_id);
   1297 			}
   1298 			exit(0);
   1299 
   1300 		case 'r':
   1301 			raw = 1;
   1302 			break;
   1303 
   1304 		default:
   1305 			usage();
   1306 			exit(1);
   1307 		}
   1308 	}
   1309 
   1310 	n = argc - optind;
   1311 	if (n < 2) {
   1312 		usage();
   1313 		exit(1);
   1314 	}
   1315 
   1316 	for (n = 0; optind < argc; n++, optind++) {
   1317 		char *opt;
   1318 
   1319 		opt = argv[optind];
   1320 
   1321 		switch(n) {
   1322 		case 0:
   1323 			dev[0] = 0;
   1324 			if (!strchr(opt, '/'))
   1325 				strcpy(dev, "/dev/");
   1326 			strcat(dev, opt);
   1327 			break;
   1328 
   1329 		case 1:
   1330 			if (strchr(argv[optind], ',')) {
   1331 				int m_id, p_id;
   1332 				sscanf(argv[optind], "%x,%x", &m_id, &p_id);
   1333 				u = get_by_id(m_id, p_id);
   1334 			} else {
   1335 				u = get_by_type(opt);
   1336 			}
   1337 
   1338 			if (!u) {
   1339 				fprintf(stderr, "Unknown device type or id\n");
   1340 				exit(1);
   1341 			}
   1342 
   1343 			break;
   1344 
   1345 		case 2:
   1346 			u->speed = atoi(argv[optind]);
   1347 			break;
   1348 
   1349 		case 3:
   1350 			if (!strcmp("flow", argv[optind]))
   1351 				u->flags |=  FLOW_CTL;
   1352 			else
   1353 				u->flags &= ~FLOW_CTL;
   1354 			break;
   1355 
   1356 		case 4:
   1357 			if (!strcmp("sleep", argv[optind]))
   1358 				u->pm = ENABLE_PM;
   1359 			else
   1360 				u->pm = DISABLE_PM;
   1361 			break;
   1362 
   1363 		case 5:
   1364 			u->bdaddr = argv[optind];
   1365 			break;
   1366 		}
   1367 	}
   1368 
   1369 	if (!u) {
   1370 		fprintf(stderr, "Unknown device type or id\n");
   1371 		exit(1);
   1372 	}
   1373 
   1374 	/* If user specified a initial speed, use that instead of
   1375 	   the hardware's default */
   1376 	if (init_speed)
   1377 		u->init_speed = init_speed;
   1378 
   1379 	memset(&sa, 0, sizeof(sa));
   1380 	sa.sa_flags   = SA_NOCLDSTOP;
   1381 	sa.sa_handler = sig_alarm;
   1382 	sigaction(SIGALRM, &sa, NULL);
   1383 
   1384 	/* 10 seconds should be enough for initialization */
   1385 	alarm(to);
   1386 	bcsp_max_retries = to;
   1387 
   1388 	n = init_uart(dev, u, send_break, raw);
   1389 	if (n < 0) {
   1390 		perror("Can't initialize device");
   1391 		exit(1);
   1392 	}
   1393 
   1394 	printf("Device setup complete\n");
   1395 
   1396 	alarm(0);
   1397 
   1398 	memset(&sa, 0, sizeof(sa));
   1399 	sa.sa_flags   = SA_NOCLDSTOP;
   1400 	sa.sa_handler = SIG_IGN;
   1401 	sigaction(SIGCHLD, &sa, NULL);
   1402 	sigaction(SIGPIPE, &sa, NULL);
   1403 
   1404 	sa.sa_handler = sig_term;
   1405 	sigaction(SIGTERM, &sa, NULL);
   1406 	sigaction(SIGINT,  &sa, NULL);
   1407 
   1408 	sa.sa_handler = sig_hup;
   1409 	sigaction(SIGHUP, &sa, NULL);
   1410 
   1411 	if (detach) {
   1412 		if ((pid = fork())) {
   1413 			if (printpid)
   1414 				printf("%d\n", pid);
   1415 			return 0;
   1416 		}
   1417 
   1418 		for (i = 0; i < 20; i++)
   1419 			if (i != n)
   1420 				close(i);
   1421 	}
   1422 
   1423 	p.fd = n;
   1424 	p.events = POLLERR | POLLHUP;
   1425 
   1426 	sigfillset(&sigs);
   1427 	sigdelset(&sigs, SIGCHLD);
   1428 	sigdelset(&sigs, SIGPIPE);
   1429 	sigdelset(&sigs, SIGTERM);
   1430 	sigdelset(&sigs, SIGINT);
   1431 	sigdelset(&sigs, SIGHUP);
   1432 
   1433 	while (!__io_canceled) {
   1434 		p.revents = 0;
   1435 		err = ppoll(&p, 1, NULL, &sigs);
   1436 		if (err < 0 && errno == EINTR)
   1437 			continue;
   1438 		if (err)
   1439 			break;
   1440 	}
   1441 
   1442 	/* Restore TTY line discipline */
   1443 	ld = N_TTY;
   1444 	if (ioctl(n, TIOCSETD, &ld) < 0) {
   1445 		perror("Can't restore line discipline");
   1446 		exit(1);
   1447 	}
   1448 
   1449 	return 0;
   1450 }
   1451