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