1635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch/* 2635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch * Copyright 2012 The Android Open Source Project 3635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch * 4635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch * Licensed under the Apache License, Version 2.0 (the "License"); 5635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch * you may not use this file except in compliance with the License. 6635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch * You may obtain a copy of the License at 7635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch * 8635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch * http://www.apache.org/licenses/LICENSE-2.0 9635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch * 10635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch * Unless required by applicable law or agreed to in writing, software 11635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch * distributed under the License is distributed on an "AS IS" BASIS, 12635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch * See the License for the specific language governing permissions and 14635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch * limitations under the License. 15635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch */ 16635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch 17635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch/****************************************************************************** 18635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch * 19635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch * Filename: hci_smd.c 20635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch * 21635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch * Description: Contains vendor-specific userial functions 22635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch * 23635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch ******************************************************************************/ 24635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch 25635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch#define LOG_TAG "bt_vendor" 26635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch 27635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch#include <utils/Log.h> 28635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch#include <termios.h> 29635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch#include <fcntl.h> 30635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch#include <errno.h> 31635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch#include <stdio.h> 32635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch#include <string.h> 33635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch#include <cutils/properties.h> 34635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch#include "bt_vendor_qcom.h" 35635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch#include "hci_smd.h" 36635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch#include <string.h> 37635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch#include <cutils/properties.h> 38635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch 39635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch/***************************************************************************** 40635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch** Macros & Constants 41635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch*****************************************************************************/ 42635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch#define NUM_OF_DEVS 2 43635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetschstatic char *s_pszDevSmd[] = { 44635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch "/dev/smd3", 45635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch "/dev/smd2" 46635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch}; 47635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch 48635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch/****************************************************************************** 49635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch** Externs 50635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch******************************************************************************/ 51635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetschextern int is_bt_ssr_hci; 52635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch 53635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch 54635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch/***************************************************************************** 55635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch** Functions 56635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch*****************************************************************************/ 57635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch 58635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetschint bt_hci_init_transport_id (int chId ) 59635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch{ 60635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch struct termios term; 61635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch int fd = -1; 62635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch int retry = 0; 63635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch char ssrvalue[92]= {'\0'}; 64635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch 65635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch ssrvalue[0] = '0'; 66635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch if(chId >= 2 || chId <0) 67635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch return -1; 68635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch 69635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch fd = open(s_pszDevSmd[chId], (O_RDWR | O_NOCTTY)); 70635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch 71635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch while ((-1 == fd) && (retry < 7)) { 72635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch ALOGE("init_transport: Cannot open %s: %s\n. Retry after 2 seconds", 73635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch s_pszDevSmd[chId], strerror(errno)); 74635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch usleep(2000000); 75635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch fd = open(s_pszDevSmd[chId], (O_RDWR | O_NOCTTY)); 76635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch retry++; 77635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch } 78635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch 79635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch if (-1 == fd) 80635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch { 81635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch ALOGE("init_transport: Cannot open %s: %s\n", 82635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch s_pszDevSmd[chId], strerror(errno)); 83635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch return -1; 84635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch } 85635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch 86635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch /* Sleep (0.5sec) added giving time for the smd port to be successfully 87635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch opened internally. Currently successful return from open doesn't 88635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch ensure the smd port is successfully opened. 89635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch TODO: Following sleep to be removed once SMD port is successfully 90635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch opened immediately on return from the aforementioned open call */ 91635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch 92635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch property_get("bluetooth.isSSR", ssrvalue, ""); 93635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch 94635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch if(ssrvalue[0] == '1') 95635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch { 96635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch /*reset the SSR flag */ 97635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch if(chId == 1) 98635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch { 99635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch if(property_set("bluetooth.isSSR", "0") < 0) 100635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch { 101635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch ALOGE("SSR: hci_smd.c:SSR case : error in setting up property new\n "); 102635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch } 103635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch else 104635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch { 105635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch ALOGE("SSR: hci_smd.c:SSR case : Reset the SSr Flag new\n "); 106635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch } 107635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch } 108635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch ALOGE("hci_smd.c:IN SSR sleep for 500 msec New \n"); 109635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch usleep(500000); 110635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch } 111635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch 112635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch if (tcflush(fd, TCIOFLUSH) < 0) 113635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch { 114635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch ALOGE("init_uart: Cannot flush %s\n", s_pszDevSmd[chId]); 115635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch close(fd); 116635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch return -1; 117635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch } 118635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch 119635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch if (tcgetattr(fd, &term) < 0) 120635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch { 121635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch ALOGE("init_uart: Error while getting attributes\n"); 122635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch close(fd); 123635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch return -1; 124635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch } 125635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch 126635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch cfmakeraw(&term); 127635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch 128635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch /* JN: Do I need to make flow control configurable, since 4020 cannot 129635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch * disable it? 130635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch */ 131635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch term.c_cflag |= (CRTSCTS | CLOCAL); 132635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch 133635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch if (tcsetattr(fd, TCSANOW, &term) < 0) 134635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch { 135635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch ALOGE("init_uart: Error while getting attributes\n"); 136635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch close(fd); 137635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch return -1; 138635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch } 139635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch 140635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch ALOGI("Done intiailizing UART\n"); 141635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch return fd; 142635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch} 143635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch 144635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetschint bt_hci_init_transport(int *pFd) 145635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch{ 146635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch int i = 0; 147635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch int fd; 148635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch for(i=0; i < NUM_OF_DEVS; i++){ 149635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch fd = bt_hci_init_transport_id(i); 150635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch if(fd < 0 ){ 151635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch return -1; 152635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch } 153635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch pFd[i] = fd; 154635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch } 155635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch return 0; 156635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch} 157635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch 158635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetschint bt_hci_deinit_transport(int *pFd) 159635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch{ 160635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch close(pFd[0]); 161635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch close(pFd[1]); 162635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch return TRUE; 163635682da6daf370cdba78511b917e166f0b6dbecSteve Pfetsch} 164