1982edd19a092114c479134cb16e0af54730edf1fPrashant Malani/* 2982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * Copyright 2012 The Android Open Source Project 3982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * 4982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * Licensed under the Apache License, Version 2.0 (the "License"); 5982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * you may not use this file except in compliance with the License. 6982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * You may obtain a copy of the License at 7982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * 8982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * http://www.apache.org/licenses/LICENSE-2.0 9982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * 10982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * Unless required by applicable law or agreed to in writing, software 11982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * distributed under the License is distributed on an "AS IS" BASIS, 12982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * See the License for the specific language governing permissions and 14982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * limitations under the License. 15982edd19a092114c479134cb16e0af54730edf1fPrashant Malani */ 16982edd19a092114c479134cb16e0af54730edf1fPrashant Malani 17982edd19a092114c479134cb16e0af54730edf1fPrashant Malani/****************************************************************************** 18982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * 19982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * Filename: hci_smd.c 20982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * 21982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * Description: Contains vendor-specific userial functions 22982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * 23982edd19a092114c479134cb16e0af54730edf1fPrashant Malani ******************************************************************************/ 24982edd19a092114c479134cb16e0af54730edf1fPrashant Malani 25982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define LOG_TAG "bt_vendor" 26982edd19a092114c479134cb16e0af54730edf1fPrashant Malani 27982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#include <utils/Log.h> 28982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#include <termios.h> 29982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#include <fcntl.h> 30982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#include <errno.h> 31982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#include <stdio.h> 32982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#include "bt_vendor_qcom.h" 33982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#include "hci_smd.h" 34982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#include <string.h> 35982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#include <cutils/properties.h> 36982edd19a092114c479134cb16e0af54730edf1fPrashant Malani 37982edd19a092114c479134cb16e0af54730edf1fPrashant Malani/***************************************************************************** 38982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Macros & Constants 39982edd19a092114c479134cb16e0af54730edf1fPrashant Malani*****************************************************************************/ 40982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define NUM_OF_DEVS 2 41982edd19a092114c479134cb16e0af54730edf1fPrashant Malanistatic char *s_pszDevSmd[] = { 42982edd19a092114c479134cb16e0af54730edf1fPrashant Malani "/dev/smd3", 43982edd19a092114c479134cb16e0af54730edf1fPrashant Malani "/dev/smd2" 44982edd19a092114c479134cb16e0af54730edf1fPrashant Malani}; 45982edd19a092114c479134cb16e0af54730edf1fPrashant Malani 46982edd19a092114c479134cb16e0af54730edf1fPrashant Malani/****************************************************************************** 47982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Externs 48982edd19a092114c479134cb16e0af54730edf1fPrashant Malani******************************************************************************/ 49982edd19a092114c479134cb16e0af54730edf1fPrashant Malaniextern int is_bt_ssr_hci; 50982edd19a092114c479134cb16e0af54730edf1fPrashant Malani 51982edd19a092114c479134cb16e0af54730edf1fPrashant Malani 52982edd19a092114c479134cb16e0af54730edf1fPrashant Malani/***************************************************************************** 53982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Functions 54982edd19a092114c479134cb16e0af54730edf1fPrashant Malani*****************************************************************************/ 55982edd19a092114c479134cb16e0af54730edf1fPrashant Malani 56982edd19a092114c479134cb16e0af54730edf1fPrashant Malaniint bt_hci_init_transport_id (int chId ) 57982edd19a092114c479134cb16e0af54730edf1fPrashant Malani{ 58982edd19a092114c479134cb16e0af54730edf1fPrashant Malani struct termios term; 59982edd19a092114c479134cb16e0af54730edf1fPrashant Malani int fd = -1; 60982edd19a092114c479134cb16e0af54730edf1fPrashant Malani int retry = 0; 61982edd19a092114c479134cb16e0af54730edf1fPrashant Malani char ssrvalue[92]= {'\0'}; 62982edd19a092114c479134cb16e0af54730edf1fPrashant Malani 63982edd19a092114c479134cb16e0af54730edf1fPrashant Malani ssrvalue[0] = '0'; 64982edd19a092114c479134cb16e0af54730edf1fPrashant Malani if(chId >= 2 || chId <0) 65982edd19a092114c479134cb16e0af54730edf1fPrashant Malani return -1; 66982edd19a092114c479134cb16e0af54730edf1fPrashant Malani 67982edd19a092114c479134cb16e0af54730edf1fPrashant Malani fd = open(s_pszDevSmd[chId], (O_RDWR | O_NOCTTY)); 68982edd19a092114c479134cb16e0af54730edf1fPrashant Malani 69982edd19a092114c479134cb16e0af54730edf1fPrashant Malani while ((-1 == fd) && (retry < 7)) { 70982edd19a092114c479134cb16e0af54730edf1fPrashant Malani ALOGE("init_transport: Cannot open %s: %s\n. Retry after 2 seconds", 71982edd19a092114c479134cb16e0af54730edf1fPrashant Malani s_pszDevSmd[chId], strerror(errno)); 72982edd19a092114c479134cb16e0af54730edf1fPrashant Malani usleep(2000000); 73982edd19a092114c479134cb16e0af54730edf1fPrashant Malani fd = open(s_pszDevSmd[chId], (O_RDWR | O_NOCTTY)); 74982edd19a092114c479134cb16e0af54730edf1fPrashant Malani retry++; 75982edd19a092114c479134cb16e0af54730edf1fPrashant Malani } 76982edd19a092114c479134cb16e0af54730edf1fPrashant Malani 77982edd19a092114c479134cb16e0af54730edf1fPrashant Malani if (-1 == fd) 78982edd19a092114c479134cb16e0af54730edf1fPrashant Malani { 79982edd19a092114c479134cb16e0af54730edf1fPrashant Malani ALOGE("init_transport: Cannot open %s: %s\n", 80982edd19a092114c479134cb16e0af54730edf1fPrashant Malani s_pszDevSmd[chId], strerror(errno)); 81982edd19a092114c479134cb16e0af54730edf1fPrashant Malani return -1; 82982edd19a092114c479134cb16e0af54730edf1fPrashant Malani } 83982edd19a092114c479134cb16e0af54730edf1fPrashant Malani 84982edd19a092114c479134cb16e0af54730edf1fPrashant Malani /* Sleep (0.5sec) added giving time for the smd port to be successfully 85982edd19a092114c479134cb16e0af54730edf1fPrashant Malani opened internally. Currently successful return from open doesn't 86982edd19a092114c479134cb16e0af54730edf1fPrashant Malani ensure the smd port is successfully opened. 87982edd19a092114c479134cb16e0af54730edf1fPrashant Malani TODO: Following sleep to be removed once SMD port is successfully 88982edd19a092114c479134cb16e0af54730edf1fPrashant Malani opened immediately on return from the aforementioned open call */ 89982edd19a092114c479134cb16e0af54730edf1fPrashant Malani 90982edd19a092114c479134cb16e0af54730edf1fPrashant Malani property_get("bluetooth.isSSR", ssrvalue, ""); 91982edd19a092114c479134cb16e0af54730edf1fPrashant Malani 92982edd19a092114c479134cb16e0af54730edf1fPrashant Malani if(ssrvalue[0] == '1') 93982edd19a092114c479134cb16e0af54730edf1fPrashant Malani { 94982edd19a092114c479134cb16e0af54730edf1fPrashant Malani /*reset the SSR flag */ 95982edd19a092114c479134cb16e0af54730edf1fPrashant Malani if(chId == 1) 96982edd19a092114c479134cb16e0af54730edf1fPrashant Malani { 97982edd19a092114c479134cb16e0af54730edf1fPrashant Malani if(property_set("bluetooth.isSSR", "0") < 0) 98982edd19a092114c479134cb16e0af54730edf1fPrashant Malani { 99982edd19a092114c479134cb16e0af54730edf1fPrashant Malani ALOGE("SSR: hci_smd.c:SSR case : error in setting up property new\n "); 100982edd19a092114c479134cb16e0af54730edf1fPrashant Malani } 101982edd19a092114c479134cb16e0af54730edf1fPrashant Malani else 102982edd19a092114c479134cb16e0af54730edf1fPrashant Malani { 103982edd19a092114c479134cb16e0af54730edf1fPrashant Malani ALOGE("SSR: hci_smd.c:SSR case : Reset the SSr Flag new\n "); 104982edd19a092114c479134cb16e0af54730edf1fPrashant Malani } 105982edd19a092114c479134cb16e0af54730edf1fPrashant Malani } 106982edd19a092114c479134cb16e0af54730edf1fPrashant Malani ALOGE("hci_smd.c:IN SSR sleep for 500 msec New \n"); 107982edd19a092114c479134cb16e0af54730edf1fPrashant Malani usleep(500000); 108982edd19a092114c479134cb16e0af54730edf1fPrashant Malani } 109982edd19a092114c479134cb16e0af54730edf1fPrashant Malani 110982edd19a092114c479134cb16e0af54730edf1fPrashant Malani if (tcflush(fd, TCIOFLUSH) < 0) 111982edd19a092114c479134cb16e0af54730edf1fPrashant Malani { 112982edd19a092114c479134cb16e0af54730edf1fPrashant Malani ALOGE("init_uart: Cannot flush %s\n", s_pszDevSmd[chId]); 113982edd19a092114c479134cb16e0af54730edf1fPrashant Malani close(fd); 114982edd19a092114c479134cb16e0af54730edf1fPrashant Malani return -1; 115982edd19a092114c479134cb16e0af54730edf1fPrashant Malani } 116982edd19a092114c479134cb16e0af54730edf1fPrashant Malani 117982edd19a092114c479134cb16e0af54730edf1fPrashant Malani if (tcgetattr(fd, &term) < 0) 118982edd19a092114c479134cb16e0af54730edf1fPrashant Malani { 119982edd19a092114c479134cb16e0af54730edf1fPrashant Malani ALOGE("init_uart: Error while getting attributes\n"); 120982edd19a092114c479134cb16e0af54730edf1fPrashant Malani close(fd); 121982edd19a092114c479134cb16e0af54730edf1fPrashant Malani return -1; 122982edd19a092114c479134cb16e0af54730edf1fPrashant Malani } 123982edd19a092114c479134cb16e0af54730edf1fPrashant Malani 124982edd19a092114c479134cb16e0af54730edf1fPrashant Malani cfmakeraw(&term); 125982edd19a092114c479134cb16e0af54730edf1fPrashant Malani 126982edd19a092114c479134cb16e0af54730edf1fPrashant Malani /* JN: Do I need to make flow control configurable, since 4020 cannot 127982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * disable it? 128982edd19a092114c479134cb16e0af54730edf1fPrashant Malani */ 129982edd19a092114c479134cb16e0af54730edf1fPrashant Malani term.c_cflag |= (CRTSCTS | CLOCAL); 130982edd19a092114c479134cb16e0af54730edf1fPrashant Malani 131982edd19a092114c479134cb16e0af54730edf1fPrashant Malani if (tcsetattr(fd, TCSANOW, &term) < 0) 132982edd19a092114c479134cb16e0af54730edf1fPrashant Malani { 133982edd19a092114c479134cb16e0af54730edf1fPrashant Malani ALOGE("init_uart: Error while getting attributes\n"); 134982edd19a092114c479134cb16e0af54730edf1fPrashant Malani close(fd); 135982edd19a092114c479134cb16e0af54730edf1fPrashant Malani return -1; 136982edd19a092114c479134cb16e0af54730edf1fPrashant Malani } 137982edd19a092114c479134cb16e0af54730edf1fPrashant Malani 138982edd19a092114c479134cb16e0af54730edf1fPrashant Malani ALOGI("Done intiailizing UART\n"); 139982edd19a092114c479134cb16e0af54730edf1fPrashant Malani return fd; 140982edd19a092114c479134cb16e0af54730edf1fPrashant Malani} 141982edd19a092114c479134cb16e0af54730edf1fPrashant Malani 142982edd19a092114c479134cb16e0af54730edf1fPrashant Malaniint bt_hci_init_transport(int *pFd) 143982edd19a092114c479134cb16e0af54730edf1fPrashant Malani{ 144982edd19a092114c479134cb16e0af54730edf1fPrashant Malani int i = 0; 145982edd19a092114c479134cb16e0af54730edf1fPrashant Malani int fd; 146982edd19a092114c479134cb16e0af54730edf1fPrashant Malani for(i=0; i < NUM_OF_DEVS; i++){ 147982edd19a092114c479134cb16e0af54730edf1fPrashant Malani fd = bt_hci_init_transport_id(i); 148982edd19a092114c479134cb16e0af54730edf1fPrashant Malani if(fd < 0 ){ 149982edd19a092114c479134cb16e0af54730edf1fPrashant Malani return -1; 150982edd19a092114c479134cb16e0af54730edf1fPrashant Malani } 151982edd19a092114c479134cb16e0af54730edf1fPrashant Malani pFd[i] = fd; 152982edd19a092114c479134cb16e0af54730edf1fPrashant Malani } 153982edd19a092114c479134cb16e0af54730edf1fPrashant Malani return 0; 154982edd19a092114c479134cb16e0af54730edf1fPrashant Malani} 155982edd19a092114c479134cb16e0af54730edf1fPrashant Malani 156982edd19a092114c479134cb16e0af54730edf1fPrashant Malaniint bt_hci_deinit_transport(int *pFd) 157982edd19a092114c479134cb16e0af54730edf1fPrashant Malani{ 158982edd19a092114c479134cb16e0af54730edf1fPrashant Malani close(pFd[0]); 159982edd19a092114c479134cb16e0af54730edf1fPrashant Malani close(pFd[1]); 160982edd19a092114c479134cb16e0af54730edf1fPrashant Malani return TRUE; 161982edd19a092114c479134cb16e0af54730edf1fPrashant Malani} 162