1*18945454Schristos /* $NetBSD: init_unistone.c,v 1.2 2015/06/16 23:04:14 christos Exp $ */ 24e74fe32Skiyohara /* 34e74fe32Skiyohara * Copyright (c) 2009 KIYOHARA Takashi 44e74fe32Skiyohara * All rights reserved. 54e74fe32Skiyohara * 64e74fe32Skiyohara * Redistribution and use in source and binary forms, with or without 74e74fe32Skiyohara * modification, are permitted provided that the following conditions 84e74fe32Skiyohara * are met: 94e74fe32Skiyohara * 1. Redistributions of source code must retain the above copyright 104e74fe32Skiyohara * notice, this list of conditions and the following disclaimer. 114e74fe32Skiyohara * 2. Redistributions in binary form must reproduce the above copyright 124e74fe32Skiyohara * notice, this list of conditions and the following disclaimer in the 134e74fe32Skiyohara * documentation and/or other materials provided with the distribution. 144e74fe32Skiyohara * 154e74fe32Skiyohara * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 164e74fe32Skiyohara * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 174e74fe32Skiyohara * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 184e74fe32Skiyohara * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 194e74fe32Skiyohara * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 204e74fe32Skiyohara * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 214e74fe32Skiyohara * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 224e74fe32Skiyohara * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 234e74fe32Skiyohara * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 244e74fe32Skiyohara * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 254e74fe32Skiyohara * POSSIBILITY OF SUCH DAMAGE. 264e74fe32Skiyohara */ 274e74fe32Skiyohara /* 284e74fe32Skiyohara * init information in this file gleaned from hciattach(8) 294e74fe32Skiyohara * command from Gumstix's patch for BlueZ. 304e74fe32Skiyohara */ 314e74fe32Skiyohara 324e74fe32Skiyohara #include <sys/cdefs.h> 33*18945454Schristos __RCSID("$NetBSD: init_unistone.c,v 1.2 2015/06/16 23:04:14 christos Exp $"); 344e74fe32Skiyohara 354e74fe32Skiyohara #include <bluetooth.h> 364e74fe32Skiyohara #include <err.h> 374e74fe32Skiyohara #include <errno.h> 384e74fe32Skiyohara #include <stdlib.h> 394e74fe32Skiyohara #include <termios.h> 404e74fe32Skiyohara 414e74fe32Skiyohara #include <unistd.h> 424e74fe32Skiyohara #include <sys/ioctl.h> 434e74fe32Skiyohara 444e74fe32Skiyohara #include "btattach.h" 454e74fe32Skiyohara 464e74fe32Skiyohara 474e74fe32Skiyohara #define HCI_CMD_INFINEON_SET_UART_BAUDRATE \ 484e74fe32Skiyohara HCI_OPCODE(HCI_OGF_VENDOR, 0x006) 494e74fe32Skiyohara 504e74fe32Skiyohara 514e74fe32Skiyohara static int infineon_manufacturer_mode(int, int); 524e74fe32Skiyohara 534e74fe32Skiyohara static int 544e74fe32Skiyohara infineon_manufacturer_mode(int fd, int enable) 554e74fe32Skiyohara { 564e74fe32Skiyohara hci_status_rp rp; 574e74fe32Skiyohara uint8_t cmd[2]; 584e74fe32Skiyohara int n; 594e74fe32Skiyohara 604e74fe32Skiyohara cmd[0] = enable; 614e74fe32Skiyohara cmd[1] = 0; /* No reset */ 624e74fe32Skiyohara 634e74fe32Skiyohara uart_send_cmd(fd, 0xfc11, cmd, sizeof(cmd)); 644e74fe32Skiyohara n = uart_recv_cc(fd, 0xfc11, &rp, sizeof(rp)); 654e74fe32Skiyohara if (n != sizeof(rp) || rp.status != 0x00) 664e74fe32Skiyohara errx(EXIT_FAILURE, "Manufacturer mode %s failed", 674e74fe32Skiyohara enable ? "enable" : "disable"); 684e74fe32Skiyohara 694e74fe32Skiyohara return 0; 704e74fe32Skiyohara } 714e74fe32Skiyohara 724e74fe32Skiyohara void 734e74fe32Skiyohara init_unistone(int fd, unsigned int speed) 744e74fe32Skiyohara { 754e74fe32Skiyohara hci_command_status_ep cs; 764e74fe32Skiyohara struct termios tio; 774e74fe32Skiyohara uint8_t rate, v[2]; 784e74fe32Skiyohara int n; 794e74fe32Skiyohara 804e74fe32Skiyohara switch(speed) { 814e74fe32Skiyohara case B9600: rate = 0x00; break; 824e74fe32Skiyohara case B19200: rate = 0x01; break; 834e74fe32Skiyohara case B38400: rate = 0x02; break; 844e74fe32Skiyohara case B57600: rate = 0x03; break; 854e74fe32Skiyohara case B115200: rate = 0x04; break; 864e74fe32Skiyohara case B230400: rate = 0x05; break; 874e74fe32Skiyohara case B460800: rate = 0x06; break; 884e74fe32Skiyohara case B921600: rate = 0x07; break; 894e74fe32Skiyohara #if 0 904e74fe32Skiyohara case B1843200: rate = 0x08; break; 914e74fe32Skiyohara #endif 924e74fe32Skiyohara default: 93*18945454Schristos errx(EXIT_FAILURE, "invalid speed for infineon unistone: %u", 944e74fe32Skiyohara speed); 954e74fe32Skiyohara } 964e74fe32Skiyohara 974e74fe32Skiyohara if (tcgetattr(fd, &tio) != 0) 984e74fe32Skiyohara err(EXIT_FAILURE, "can't get baud rate"); 994e74fe32Skiyohara 1004e74fe32Skiyohara infineon_manufacturer_mode(fd, 1); 1014e74fe32Skiyohara 1024e74fe32Skiyohara uart_send_cmd(fd, HCI_CMD_INFINEON_SET_UART_BAUDRATE, &rate, 1034e74fe32Skiyohara sizeof(rate)); 1044e74fe32Skiyohara 1054e74fe32Skiyohara n = uart_recv_ev(fd, HCI_EVENT_COMMAND_STATUS, &cs, sizeof(cs)); 1064e74fe32Skiyohara if (n != sizeof(cs) || 1074e74fe32Skiyohara cs.status != 0x00 || 1084e74fe32Skiyohara cs.opcode != HCI_CMD_INFINEON_SET_UART_BAUDRATE) 1094e74fe32Skiyohara errx(EXIT_FAILURE, "Set_UART_Baudrate failed\n"); 1104e74fe32Skiyohara 1114e74fe32Skiyohara if (cfsetspeed(&tio, speed) != 0 || 1124e74fe32Skiyohara tcsetattr(fd, TCSANOW, &tio) != 0) 1134e74fe32Skiyohara err(EXIT_FAILURE, "can't change baud rate"); 1144e74fe32Skiyohara 1154e74fe32Skiyohara n = uart_recv_ev(fd, HCI_EVENT_VENDOR, &v, sizeof(v)); 1164e74fe32Skiyohara if (n != sizeof(v) || 1174e74fe32Skiyohara v[0] != 0x12 || 1184e74fe32Skiyohara v[1] != 0x00) 1194e74fe32Skiyohara errx(EXIT_FAILURE, "Set_UART_Baudrate not complete\n"); 1204e74fe32Skiyohara 1214e74fe32Skiyohara infineon_manufacturer_mode(fd, 0); 1224e74fe32Skiyohara } 123