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