userial_linux.c revision e9df6ba5a8fcccf306a80b1670b423be8fe7746
1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
3e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Copyright (C) 1999-2012 Broadcom Corporation
4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  you may not use this file except in compliance with the License.
7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  You may obtain a copy of the License at:
8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  See the License for the specific language governing permissions and
15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  limitations under the License.
16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
19e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "OverrideLog.h"
20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h>
21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "gki.h"
22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_hal_api.h"
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_hal_int.h"
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "userial.h"
25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_target.h"
26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <pthread.h>
28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <termios.h>
29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <fcntl.h>
30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <errno.h>
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <stdio.h>
32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <gki_int.h>
33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "hcidefs.h"
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <poll.h>
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "upio.h"
36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "bcm2079x.h"
37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "config.h"
38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define HCISU_EVT                           EVENT_MASK(APPL_EVT_0)
40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define MAX_ERROR                           10
41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define default_transport                   "/dev/bcm2079x"
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define NUM_RESET_ATTEMPTS                  5
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#ifndef BTE_APPL_MAX_USERIAL_DEV_NAME
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define BTE_APPL_MAX_USERIAL_DEV_NAME           (256)
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectextern UINT8 appl_trace_level;
49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Mapping of USERIAL_PORT_x to linux */
51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectextern UINT32 ScrProtocolTraceFlag;
52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tUPIO_STATE current_nfc_wake_state = UPIO_OFF;
53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectint uart_port  = 0;
54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectint isLowSpeedTransport = 0;
55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectint nfc_wake_delay = 0;
56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectint nfc_write_delay = 0;
57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectint gPowerOnDelay = 300;
58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic int gPrePowerOffDelay = 0;    // default value
59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic int gPostPowerOffDelay = 0;     // default value
60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic pthread_mutex_t close_thread_mutex = PTHREAD_MUTEX_INITIALIZER;
61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectchar userial_dev[BTE_APPL_MAX_USERIAL_DEV_NAME+1];
63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectchar power_control_dev[BTE_APPL_MAX_USERIAL_DEV_NAME+1];
64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttSNOOZE_MODE_CONFIG gSnoozeModeCfg = {
65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFC_HAL_LP_SNOOZE_MODE_SPI_I2C,     /* Sleep Mode (0=Disabled 1=UART 8=SPI/I2C) */
66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFC_HAL_LP_IDLE_THRESHOLD_HOST,     /* Idle Threshold Host */
67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFC_HAL_LP_IDLE_THRESHOLD_HC,       /* Idle Threshold HC */
68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFC_HAL_LP_ACTIVE_LOW,              /* NFC Wake active mode (0=ActiveLow 1=ActiveHigh) */
69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFC_HAL_LP_ACTIVE_HIGH              /* Host Wake active mode (0=ActiveLow 1=ActiveHigh) */
70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project};
71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT8 bcmi2cnfc_client_addr = 0;
73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT8 bcmi2cnfc_read_multi_packets = 0;
74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define USERIAL_Debug_verbose     ((ScrProtocolTraceFlag & 0x80000000) == 0x80000000)
76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <sys/socket.h>
78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define LOG_TAG "USERIAL_LINUX"
80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT8 spi_negotiation[10] = { 0xF0, /* CMD */
82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                    0x00, /* SPI PARM Negotiation */
83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                    0x01, /* SPI Version */
84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                    0x00, /* SPI Mode:0, SPI_INT active low */
85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                    0x00, /* 8Bit, MSB first, Little Endian byte order */
86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                    0x00, /* Reserved */
87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                    0xFF, /* Sleep timeout Lower Byte */
88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                    0xFF, /* Sleep timeout Upper Byte */
89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                    0x00, /* Reserved */
90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                    0x00 /* Reserved */
91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project};
92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT8 spi_nego_res[20];
93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <ctype.h>
95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define USING_BRCM_USB TRUE
97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* use tc interface to change baudrate instead of close/open sequence which can fail on some platforms
99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * due to tx line movement when opeing/closing the UART. the 43xx do not like this. */
100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#ifndef USERIAL_USE_TCIO_BAUD_CHANGE
101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define USERIAL_USE_TCIO_BAUD_CHANGE FALSE
102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#ifndef USERIAL_USE_IO_BT_WAKE
105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define USERIAL_USE_IO_BT_WAKE FALSE
106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* this are the ioctl values used for bt_wake ioctl via UART driver. you may need to redefine at for
109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * you platform! Logically they need to be unique and not colide with existing uart ioctl's.
110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project */
111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#ifndef USERIAL_IO_BT_WAKE_ASSERT
112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define USERIAL_IO_BT_WAKE_ASSERT   0x8003
113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#ifndef USERIAL_IO_BT_WAKE_DEASSERT
115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define USERIAL_IO_BT_WAKE_DEASSERT 0x8004
116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#ifndef USERIAL_IO_BT_WAKE_GET_ST
118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define USERIAL_IO_BT_WAKE_GET_ST   0x8005
119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* the read limit in this current implementation depends on the GKI_BUF3_SIZE
122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * It would be better to use some ring buffer from the USERIAL_Read() is reading
123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * instead of putting it into GKI buffers.
124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project */
125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define READ_LIMIT (USERIAL_POOL_BUF_SIZE-BT_HDR_SIZE)
126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*
127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * minimum buffer size requirement to read a full sized packet from NFCC = 255 + 4 byte header
128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project */
129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define MIN_BUFSIZE 259
130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define     POLL_TIMEOUT    1000
131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* priority of the reader thread */
132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define USERIAL_READ_TRHEAD_PRIO 90
133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* time (ms) to wait before trying to allocate again a GKI buffer */
134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define NO_GKI_BUFFER_RECOVER_TIME 100
135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define MAX_SERIAL_PORT (USERIAL_PORT_15 + 1)
136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectextern void dumpbin(const char* data, int size);
138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectextern UINT8 *scru_dump_hex (UINT8 *p, char *p_title, UINT32 len, UINT32 trace_layer, UINT32 trace_type);
139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic pthread_t      worker_thread1 = 0;
141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projecttypedef struct  {
143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    volatile unsigned long bt_wake_state;
144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int             sock;
145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tUSERIAL_CBACK      *ser_cb;
146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16      baud;
147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       data_bits;
148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16      parity;
149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       stop_bits;
150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       port;
151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tUSERIAL_OPEN_CFG open_cfg;
152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int         sock_power_control;
153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int         client_device_address;
154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    struct timespec write_time;
155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} tLINUX_CB;
156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tLINUX_CB linux_cb;  /* case of multipel port support use array : [MAX_SERIAL_PORT] */
158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid userial_close_thread(UINT32 params);
160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT8 device_name[20];
162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic int   bSerialPortDevice = FALSE;
163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic int _timeout = POLL_TIMEOUT;
164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN is_close_thread_is_waiting = FALSE;
165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectint   perf_log_every_count = 0;
168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projecttypedef struct {
169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    const char* label;
170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    long    lapse;
171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    long    bytes;
172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    long    count;
173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    long    overhead;
174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} tPERF_DATA;
175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         perf_reset
179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      reset performance measurement data
181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid perf_reset(tPERF_DATA* t)
186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    t->count =
188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    t->bytes =
189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    t->lapse = 0;
190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         perf_log
195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      produce a log entry of cvurrent performance data
197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid perf_log(tPERF_DATA* t)
202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    // round to nearest ms
204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    // t->lapse += 500;
205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    // t->lapse /= 1000;
206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (t->lapse)
207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (t->bytes)
209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ALOGD( "%s:%s, bytes=%ld, lapse=%ld (%d.%02d kbps) (bus data rate %d.%02d kbps) overhead %d(%d percent)\n",
210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    __func__,
211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    t->label, t->bytes, t->lapse,
212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    (int)(8 * t->bytes / t->lapse), (int)(800 * t->bytes / (t->lapse)) % 100,
213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    (int)(9 * (t->bytes + t->count * t->overhead) / t->lapse), (int)(900 * (t->bytes + t->count * t->overhead) / (t->lapse)) % 100,
214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    (int)(t->count * t->overhead), (int)(t->count * t->overhead * 100 / t->bytes)
215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    );
216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ALOGD( "%s:%s, lapse=%ld (average %ld)\n", __func__,
218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    t->label, t->lapse, (int)t->lapse / t->count
219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    );
220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    perf_reset(t);
222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         perf_update
227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      update perforamnce measurement data
229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid perf_update(tPERF_DATA* t, long lapse, long bytes)
234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!perf_log_every_count)
236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    // round to nearest ms
238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    lapse += 500;
239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    lapse /= 1000;
240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    t->count++;
241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    t->bytes += bytes;
242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    t->lapse += lapse;
243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (t->count == perf_log_every_count)
244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        perf_log(t);
245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tPERF_DATA   perf_poll = {"USERIAL_Poll", 0, 0, 0, 0};
248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tPERF_DATA   perf_read = {"USERIAL_Read", 0, 0, 0, 9};
249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tPERF_DATA   perf_write = {"USERIAL_Write", 0, 0, 0, 3};
250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tPERF_DATA   perf_poll_2_poll = {"USERIAL_Poll_to_Poll", 0, 0, 0, 0};
251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic clock_t      _poll_t0 = 0;
252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT32 userial_baud_tbl[] =
254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    300,        /* USERIAL_BAUD_300          0 */
256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    600,        /* USERIAL_BAUD_600          1 */
257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    1200,       /* USERIAL_BAUD_1200         2 */
258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    2400,       /* USERIAL_BAUD_2400         3 */
259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    9600,       /* USERIAL_BAUD_9600         4 */
260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    19200,      /* USERIAL_BAUD_19200        5 */
261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    57600,      /* USERIAL_BAUD_57600        6 */
262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    115200,     /* USERIAL_BAUD_115200       7 */
263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    230400,     /* USERIAL_BAUD_230400       8 */
264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    460800,     /* USERIAL_BAUD_460800       9 */
265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    921600,     /* USERIAL_BAUD_921600       10 */
266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    1000000,    /* USERIAL_BAUD_1M           11 */
267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    1500000,    /* USERIAL_BAUD_1_5M         12 */
268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    2000000,    /* USERIAL_BAUD_2M           13 */
269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    3000000,    /* USERIAL_BAUD_3M           14 */
270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    4000000     /* USERIAL_BAUD_4M           15 */
271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project};
272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         wake_state
276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      return current state of NFC_WAKE gpio
278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          GPIO value to wake NFCC
280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic inline int wake_state()
283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return ((gSnoozeModeCfg.nfc_wake_active_mode == NFC_HAL_LP_ACTIVE_HIGH) ? UPIO_ON : UPIO_OFF);
285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         sleep_state
290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      return current state of NFC_WAKE gpio
292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          GPIO value to allow NFCC to goto sleep
294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic inline int sleep_state()
297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return ((gSnoozeModeCfg.nfc_wake_active_mode == NFC_HAL_LP_ACTIVE_HIGH) ? UPIO_OFF : UPIO_ON);
299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         isWake
304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      return current state of NFC_WAKE gpio based on the active mode setting
306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          asserted_state if it's awake, deasserted_state if it's allowed to sleep
308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic inline int isWake(int state)
311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int     asserted_state = ((gSnoozeModeCfg.nfc_wake_active_mode == NFC_HAL_LP_ACTIVE_HIGH) ? UPIO_ON : UPIO_OFF);
313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (state != -1) ?
314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        state == asserted_state :
315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        current_nfc_wake_state == asserted_state;
316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function           setWriteDelay
321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description        Record a delay for the next write operation
323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Input Parameter    delay in milliseconds
325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Comments           use this function to register a delay before next write,
327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                    This is used in three instances: power up delay, wake delay
328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                    and write delay
329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void setWriteDelay(int delay)
332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (delay <= 0) {
334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        // Set a minimum delay of 5ms between back-to-back writes
335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        delay = 5;
336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    clock_gettime(CLOCK_MONOTONIC, &linux_cb.write_time);
339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (delay > 1000)
340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        linux_cb.write_time.tv_sec += delay / 1000;
342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        delay %= 1000;
343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    unsigned long write_delay = delay * 1000 * 1000;
345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    linux_cb.write_time.tv_nsec += write_delay;
346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (linux_cb.write_time.tv_nsec > 1000*1000*1000)
347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        linux_cb.write_time.tv_nsec -= 1000*1000*1000;
349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        linux_cb.write_time.tv_sec++;
350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function           doWriteDelay
356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description        Execute a delay as registered in setWriteDelay()
358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Output Parameter   none
360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns            none
362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Comments           This function calls GKI_Delay to execute a delay to fulfill
364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                    the delay registered earlier.
365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void doWriteDelay()
368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    struct timespec now;
370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    clock_gettime(CLOCK_MONOTONIC, &now);
371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    long delay = 0;
372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (now.tv_sec > linux_cb.write_time.tv_sec)
374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (now.tv_sec == linux_cb.write_time.tv_sec)
376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (now.tv_nsec > linux_cb.write_time.tv_nsec)
378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return;
379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        delay = (linux_cb.write_time.tv_nsec - now.tv_nsec) / 1000000;
380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        delay = (linux_cb.write_time.tv_sec - now.tv_sec) * 1000 + linux_cb.write_time.tv_nsec / 1000000 - now.tv_nsec / 1000000;
383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (delay > 0 && delay < 1000)
385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGD_IF((appl_trace_level>=BT_TRACE_LEVEL_DEBUG), "doWriteDelay() delay %ld ms", delay);
387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_delay(delay);
388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         create_signal_fds
394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      create a socketpair for read thread to use
396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          file descriptor
398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic int signal_fds[2];
402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic inline int create_signal_fds(struct pollfd* set)
403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (signal_fds[0] == 0 && socketpair(AF_UNIX, SOCK_STREAM, 0, signal_fds) < 0)
405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGE("%s create_signal_sockets:socketpair failed, errno: %d", __func__, errno);
407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return -1;
408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    set->fd = signal_fds[0];
410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return signal_fds[0];
411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         close_signal_fds
416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      close the socketpair
418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic inline void close_signal_fds()
423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    close(signal_fds[0]);
425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    signal_fds[0] = 0;
426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    close(signal_fds[1]);
428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    signal_fds[1] = 0;
429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         send_wakeup_signal
434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      send a one byte data to the socket as signal to the read thread
436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  for it to stop
437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          number of bytes sent, or error no
439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic inline int send_wakeup_signal()
442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    char sig_on = 1;
444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD("%s: Sending signal to %d", __func__, signal_fds[1]);
445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return send(signal_fds[1], &sig_on, sizeof(sig_on), 0);
446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         reset_signal
451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      read the one byte data from the socket
453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          received data
455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic inline int reset_signal()
458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    char sig_recv = 0;
460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD("%s: Receiving signal from %d", __func__, signal_fds[0]);
461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    recv(signal_fds[0], &sig_recv, sizeof(sig_recv), MSG_WAITALL);
462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (int)sig_recv;
463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         is_signaled
468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      test if there's data waiting on the socket
470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE is data is available
472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic inline int is_signaled(struct pollfd* set)
475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return ((set->revents & POLLIN) == POLLIN) || ((set->revents & POLLRDNORM) == POLLRDNORM) ;
477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************/
480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projecttypedef unsigned char uchar;
482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectBUFFER_Q Userial_in_q;
484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **
487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** Function           USERIAL_GetLineSpeed
488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **
489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** Description        This function convert USERIAL baud to line speed.
490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **
491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** Output Parameter   None
492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **
493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** Returns            line speed
494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **
495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *******************************************************************************/
496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUDRV_API extern UINT32 USERIAL_GetLineSpeed(UINT8 baud)
497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (baud <= USERIAL_BAUD_4M) ?
499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            userial_baud_tbl[baud-USERIAL_BAUD_300] : 0;
500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **
504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** Function           USERIAL_GetBaud
505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **
506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** Description        This function convert line speed to USERIAL baud.
507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **
508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** Output Parameter   None
509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **
510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** Returns            line speed
511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **
512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *******************************************************************************/
513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUDRV_API extern UINT8 USERIAL_GetBaud(UINT32 line_speed)
514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 i;
516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (i = USERIAL_BAUD_300; i <= USERIAL_BAUD_921600; i++)
517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (userial_baud_tbl[i-USERIAL_BAUD_300] == line_speed)
519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return i;
520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return USERIAL_BAUD_AUTO;
523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function           USERIAL_Init
528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description        This function initializes the  serial driver.
530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Output Parameter   None
532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns            Nothing
534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUDRV_API void    USERIAL_Init(void * p_cfg)
538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGI(__FUNCTION__);
540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    memset(&linux_cb, 0, sizeof(linux_cb));
542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    linux_cb.sock = -1;
543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    linux_cb.ser_cb = NULL;
544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    linux_cb.sock_power_control = -1;
545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    linux_cb.client_device_address = 0;
546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    GKI_init_q(&Userial_in_q);
547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return;
548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **
552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** Function           my_read
553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **
554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** Description        This function read a packet from driver.
555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **
556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** Output Parameter   None
557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **
558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** Returns            number of bytes in the packet or error code
559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **
560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *******************************************************************************/
561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectint my_read(int fd, uchar *pbuf, int len)
562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    struct pollfd fds[2];
564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int n = 0;
566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int ret = 0;
567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int count = 0;
568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int offset = 0;
569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    clock_t t1, t2;
570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!isLowSpeedTransport && _timeout != POLL_TIMEOUT)
572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGD_IF((appl_trace_level>=BT_TRACE_LEVEL_DEBUG), "%s: enter, pbuf=%lx, len = %d\n", __func__, (unsigned long)pbuf, len);
573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    memset(pbuf, 0, len);
574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* need to use select in order to avoid collistion between read and close on same fd */
575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Initialize the input set */
576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    fds[0].fd = fd;
577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    fds[0].events = POLLIN | POLLERR | POLLRDNORM;
578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    fds[0].revents = 0;
579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    create_signal_fds(&fds[1]);
581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    fds[1].events = POLLIN | POLLERR | POLLRDNORM;
582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    fds[1].revents = 0;
583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    t1 = clock();
584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    n = poll(fds, 2, _timeout);
585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    t2 = clock();
586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    perf_update(&perf_poll, t2 - t1, 0);
587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (_poll_t0)
588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        perf_update(&perf_poll_2_poll, t2 - _poll_t0, 0);
589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    _poll_t0 = t2;
591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* See if there was an error */
592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (n < 0)
593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGD( "select failed; errno = %d\n", errno);
595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return -errno;
596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (n == 0)
598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return -EAGAIN;
599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (is_signaled(&fds[1]))
601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGD( "%s: exit signal received\n", __func__);
603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        reset_signal();
604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return -1;
605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!bSerialPortDevice || len < MIN_BUFSIZE)
607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        count = len;
608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        count = 1;
610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    do {
611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        t2 = clock();
612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ret = read(fd, pbuf+offset, (size_t)count);
613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (ret > 0)
614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            perf_update(&perf_read, clock()-t2, ret);
615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (ret <= 0 || !bSerialPortDevice || len < MIN_BUFSIZE)
617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (isLowSpeedTransport)
620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            goto done;
621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (offset == 0)
623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (pbuf[offset] == HCIT_TYPE_NFC)
625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                count = 3;
626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else if (pbuf[offset] == HCIT_TYPE_EVENT)
627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                count = 2;
628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ALOGD( "%s: unknown HCIT type header pbuf[%d] = %x\n", __func__, offset, pbuf[offset]);
631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                break;
632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            offset = 1;
634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (offset == 1)
636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            offset += count;
638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            count = pbuf[offset-1];
639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            offset += ret;
643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            count -= ret;
644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (count == 0)
646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ret = offset;
648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    } while (count > 0);
651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project #if VALIDATE_PACKET
652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*
653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * vallidate the packet structure
654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project */
655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (ret > 0 && len >= MIN_BUFSIZE)
656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        count = 0;
658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        while (count < ret)
659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (pbuf[count] == HCIT_TYPE_NFC)
661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (USERIAL_Debug_verbose)
663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    scru_dump_hex(pbuf+count, NULL, pbuf[count+3]+4, 0, 0);
664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                count += pbuf[count+3]+4;
665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else if (pbuf[count] == HCIT_TYPE_EVENT)
667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (USERIAL_Debug_verbose)
669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    scru_dump_hex(pbuf+count, NULL, pbuf[count+2]+3, 0, 0);
670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                count += pbuf[count+2]+3;
671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ALOGD( "%s: unknown HCIT type header pbuf[%d] = %x, remain %d bytes\n", __func__, count, pbuf[count], ret-count);
675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                scru_dump_hex(pbuf+count, NULL, ret - count, 0, 0);
676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                break;
677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        } /* while*/
679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectdone:
682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!isLowSpeedTransport)
683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGD_IF((appl_trace_level>=BT_TRACE_LEVEL_DEBUG), "%s: return %d(0x%x) bytes, errno=%d count=%d, n=%d, timeout=%d\n", __func__,
684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ret, ret, errno, count, n, _timeout);
685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (_timeout == POLL_TIMEOUT)
686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        _timeout = -1;
687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return ret;
688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectextern BOOLEAN gki_chk_buf_damage(void *p_buf);
690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic int sRxLength = 0;
691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **
694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** Function           userial_read_thread
695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **
696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** Description        entry point of read thread.
697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **
698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** Output Parameter   None
699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **
700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** Returns            0
701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **
702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *******************************************************************************/
703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT32 userial_read_thread(UINT32 arg)
704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int rx_length;
706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int error_count = 0;
707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int bErrorReported = 0;
708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int iMaxError = MAX_ERROR;
709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BT_HDR *p_buf = NULL;
710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    worker_thread1 = pthread_self();
712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD( "start userial_read_thread, id=%lx", worker_thread1);
714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    _timeout = POLL_TIMEOUT;
715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (;linux_cb.sock > 0;)
717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        BT_HDR *p_buf;
719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8 *current_packet;
720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if ((p_buf = (BT_HDR *) GKI_getpoolbuf( USERIAL_POOL_ID ) )!= NULL)
722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_buf->offset = 0;
724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_buf->layer_specific = 0;
725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            current_packet = (UINT8 *) (p_buf + 1);
727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            rx_length = my_read(linux_cb.sock, current_packet, READ_LIMIT);
728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ALOGE( "userial_read_thread(): unable to get buffer from GKI p_buf = %p poolid = %d\n", p_buf, USERIAL_POOL_ID);
733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            rx_length = 0;  /* paranoia setting */
734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            GKI_delay( NO_GKI_BUFFER_RECOVER_TIME );
735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            continue;
736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (rx_length > 0)
738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            bErrorReported = 0;
740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            error_count = 0;
741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            iMaxError = 3;
742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (rx_length > sRxLength)
743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                sRxLength = rx_length;
744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_buf->len = (UINT16)rx_length;
745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            GKI_enqueue(&Userial_in_q, p_buf);
746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (!isLowSpeedTransport)
747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ALOGD_IF((appl_trace_level>=BT_TRACE_LEVEL_DEBUG), "userial_read_thread(): enqueued p_buf=%p, count=%d, length=%d\n",
748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            p_buf, Userial_in_q.count, rx_length);
749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (linux_cb.ser_cb != NULL)
751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                (*linux_cb.ser_cb)(linux_cb.port, USERIAL_RX_READY_EVT, (tUSERIAL_EVT_DATA *)p_buf);
752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            GKI_send_event(USERIAL_HAL_TASK, HCISU_EVT);
754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            GKI_freebuf( p_buf );
758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (rx_length == -EAGAIN)
759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                continue;
760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else if (rx_length == -1)
761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ALOGD( "userial_read_thread(): exiting\n");
763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                break;
764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else if (rx_length == 0 && !isWake(-1))
766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                continue;
767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ++error_count;
768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (rx_length <= 0 && ((error_count > 0) && ((error_count % iMaxError) == 0)))
769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (bErrorReported == 0)
771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ALOGE( "userial_read_thread(): my_read returned (%d) error count = %d, errno=%d return USERIAL_ERR_EVT\n",
773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            rx_length, error_count, errno);
774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (linux_cb.ser_cb != NULL)
775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        (*linux_cb.ser_cb)(linux_cb.port, USERIAL_ERR_EVT, (tUSERIAL_EVT_DATA *)p_buf);
776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    GKI_send_event(USERIAL_HAL_TASK, HCISU_EVT);
778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ++bErrorReported;
779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (sRxLength == 0)
781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ALOGE( "userial_read_thread(): my_read returned (%d) error count = %d, errno=%d exit read thread\n",
783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            rx_length, error_count, errno);
784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    break;
785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    } /* for */
789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD( "userial_read_thread(): freeing GKI_buffers\n");
791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    while ((p_buf = (BT_HDR *) GKI_dequeue (&Userial_in_q)) != NULL)
792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf(p_buf);
794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGD("userial_read_thread: dequeued buffer from Userial_in_q\n");
795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    GKI_exit_task (GKI_get_taskid ());
798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD( "USERIAL READ: EXITING TASK\n");
799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return 0;
801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **
805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** Function           userial_to_tcio_baud
806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **
807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** Description        helper function converts USERIAL baud rates into TCIO conforming baud rates
808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **
809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** Output Parameter   None
810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **
811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** Returns            TRUE - success
812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **                    FALSE - unsupported baud rate, default of 115200 is used
813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **
814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *******************************************************************************/
815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectBOOLEAN userial_to_tcio_baud(UINT8 cfg_baud, UINT32 * baud)
816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (cfg_baud == USERIAL_BAUD_600)
818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        *baud = B600;
819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (cfg_baud == USERIAL_BAUD_1200)
820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        *baud = B1200;
821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (cfg_baud == USERIAL_BAUD_9600)
822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        *baud = B9600;
823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (cfg_baud == USERIAL_BAUD_19200)
824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        *baud = B19200;
825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (cfg_baud == USERIAL_BAUD_57600)
826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        *baud = B57600;
827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (cfg_baud == USERIAL_BAUD_115200)
828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        *baud = B115200 | CBAUDEX;
829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (cfg_baud == USERIAL_BAUD_230400)
830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        *baud = B230400;
831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (cfg_baud == USERIAL_BAUD_460800)
832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        *baud = B460800;
833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (cfg_baud == USERIAL_BAUD_921600)
834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        *baud = B921600;
835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (cfg_baud == USERIAL_BAUD_1M)
836e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        *baud = B1000000;
837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (cfg_baud == USERIAL_BAUD_2M)
838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        *baud = B2000000;
839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (cfg_baud == USERIAL_BAUD_3M)
840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        *baud = B3000000;
841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (cfg_baud == USERIAL_BAUD_4M)
842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        *baud = B4000000;
843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGE( "USERIAL_Open: unsupported baud idx %i", cfg_baud );
846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        *baud = B115200;
847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
848e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
849e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return TRUE;
850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
852e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (USERIAL_USE_IO_BT_WAKE==TRUE)
853e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
854e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **
855e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** Function           userial_io_init_bt_wake
856e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **
857e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** Description        helper function to set the open state of the bt_wake if ioctl
858e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **                    is used. it should not hurt in the rfkill case but it might
859e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **                    be better to compile it out.
860e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **
861e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** Returns            none
862e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project **
863e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *******************************************************************************/
864e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid userial_io_init_bt_wake( int fd, unsigned long * p_wake_state )
865e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
866e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* assert BT_WAKE for ioctl. should NOT hurt on rfkill version */
867e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ioctl( fd, USERIAL_IO_BT_WAKE_ASSERT, NULL);
868e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ioctl( fd, USERIAL_IO_BT_WAKE_GET_ST, p_wake_state );
869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ( *p_wake_state == 0)
870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGI("\n***userial_io_init_bt_wake(): Ooops, asserted BT_WAKE signal, but still got BT_WAKE state == to %d\n",
871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             *p_wake_state );
872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    *p_wake_state = 1;
874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function           USERIAL_Open
880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description        Open the indicated serial port with the given configuration
882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Output Parameter   None
884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns            Nothing
886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUDRV_API void USERIAL_Open(tUSERIAL_PORT port, tUSERIAL_OPEN_CFG *p_cfg, tUSERIAL_CBACK *p_cback)
889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT32 baud = 0;
891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 data_bits = 0;
892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16 parity = 0;
893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 stop_bits = 0;
894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    struct termios termios;
895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    const char ttyusb[] = "/dev/ttyUSB";
896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    const char devtty[] = "/dev/tty";
897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    unsigned long num = 0;
898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int     ret = 0;
899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGI("USERIAL_Open(): enter");
901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    //if userial_close_thread() is waiting to run; let it go first;
903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    //let it finish; then continue this function
904e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    while (TRUE)
905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        pthread_mutex_lock(&close_thread_mutex);
907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (is_close_thread_is_waiting)
908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            pthread_mutex_unlock(&close_thread_mutex);
910e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ALOGI("USERIAL_Open(): wait for close-thread");
911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            sleep (1);
912e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
913e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    // restore default power off delay settings incase they were changed in userial_set_poweroff_delays()
918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    gPrePowerOffDelay = 0;
919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    gPostPowerOffDelay = 0;
920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ( !GetStrValue ( NAME_TRANSPORT_DRIVER, userial_dev, sizeof ( userial_dev ) ) )
922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        strcpy ( userial_dev, default_transport );
923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ( GetNumValue ( NAME_UART_PORT, &num, sizeof ( num ) ) )
924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        uart_port = num;
925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ( GetNumValue ( NAME_LOW_SPEED_TRANSPORT, &num, sizeof ( num ) ) )
926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        isLowSpeedTransport = num;
927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ( GetNumValue ( NAME_NFC_WAKE_DELAY, &num, sizeof ( num ) ) )
928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_wake_delay = num;
929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ( GetNumValue ( NAME_NFC_WRITE_DELAY, &num, sizeof ( num ) ) )
930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_write_delay = num;
931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ( GetNumValue ( NAME_PERF_MEASURE_FREQ, &num, sizeof ( num ) ) )
932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        perf_log_every_count = num;
933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ( GetNumValue ( NAME_POWER_ON_DELAY, &num, sizeof ( num ) ) )
934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        gPowerOnDelay = num;
935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ( GetNumValue ( NAME_PRE_POWER_OFF_DELAY, &num, sizeof ( num ) ) )
936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        gPrePowerOffDelay = num;
937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ( GetNumValue ( NAME_POST_POWER_OFF_DELAY, &num, sizeof ( num ) ) )
938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        gPostPowerOffDelay = num;
939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGI("USERIAL_Open() device: %s port=%d, uart_port=%d WAKE_DELAY(%d) WRITE_DELAY(%d) POWER_ON_DELAY(%d) PRE_POWER_OFF_DELAY(%d) POST_POWER_OFF_DELAY(%d)",
940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            (char*)userial_dev, port, uart_port, nfc_wake_delay, nfc_write_delay, gPowerOnDelay, gPrePowerOffDelay,
941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            gPostPowerOffDelay);
942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    GetStrValue( NAME_SNOOZE_MODE_CFG, (char*)&gSnoozeModeCfg, sizeof(gSnoozeModeCfg) );
943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    strcpy((char*)device_name, (char*)userial_dev);
945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    sRxLength = 0;
946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    _poll_t0 = 0;
947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((strncmp(userial_dev, ttyusb, sizeof(ttyusb)-1) == 0) ||
949e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        (strncmp(userial_dev, devtty, sizeof(devtty)-1) == 0) )
950e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (uart_port >= MAX_SERIAL_PORT)
952e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ALOGD( "Port > MAX_SERIAL_PORT\n");
954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            goto done_open;
955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        bSerialPortDevice = TRUE;
957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        sprintf((char*)device_name, "%s%d", (char*)userial_dev, uart_port);
958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGI("USERIAL_Open() using device_name: %s ", (char*)device_name);
959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (!userial_to_tcio_baud(p_cfg->baud, &baud))
960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            goto done_open;
961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
962e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_cfg->fmt & USERIAL_DATABITS_8)
963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            data_bits = CS8;
964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (p_cfg->fmt & USERIAL_DATABITS_7)
965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            data_bits = CS7;
966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (p_cfg->fmt & USERIAL_DATABITS_6)
967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            data_bits = CS6;
968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (p_cfg->fmt & USERIAL_DATABITS_5)
969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            data_bits = CS5;
970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
971e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            goto done_open;
972e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_cfg->fmt & USERIAL_PARITY_NONE)
974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            parity = 0;
975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (p_cfg->fmt & USERIAL_PARITY_EVEN)
976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            parity = PARENB;
977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (p_cfg->fmt & USERIAL_PARITY_ODD)
978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            parity = (PARENB | PARODD);
979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            goto done_open;
981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_cfg->fmt & USERIAL_STOPBITS_1)
983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            stop_bits = 0;
984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (p_cfg->fmt & USERIAL_STOPBITS_2)
985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            stop_bits = CSTOPB;
986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            goto done_open;
988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        strcpy((char*)device_name, (char*)userial_dev);
991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGD("%s Opening %s\n",  __FUNCTION__, device_name);
994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if ((linux_cb.sock = open((char*)device_name, O_RDWR | O_NOCTTY )) == -1)
995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ALOGI("%s unable to open %s",  __FUNCTION__, device_name);
997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            GKI_send_event(NFC_HAL_TASK, NFC_HAL_TASK_EVT_TERMINATE);
998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            goto done_open;
999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGD( "sock = %d\n", linux_cb.sock);
1001e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (GetStrValue ( NAME_POWER_CONTROL_DRIVER, power_control_dev, sizeof ( power_control_dev ) ) &&
1002e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            power_control_dev[0] != '\0')
1003e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1004e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (strcmp(power_control_dev, userial_dev) == 0)
1005e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                linux_cb.sock_power_control = linux_cb.sock;
1006e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
1007e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if ((linux_cb.sock_power_control = open((char*)power_control_dev, O_RDWR | O_NOCTTY )) == -1)
1009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ALOGI("%s unable to open %s",  __FUNCTION__, power_control_dev);
1011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1015e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        USERIAL_PowerupDevice(port);
1016e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1017e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    linux_cb.ser_cb     = p_cback;
1019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    linux_cb.port = port;
1020e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    memcpy(&linux_cb.open_cfg, p_cfg, sizeof(tUSERIAL_OPEN_CFG));
1021e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    GKI_create_task ((TASKPTR)userial_read_thread, USERIAL_HAL_TASK, (INT8*)"USERIAL_HAL_TASK", 0, 0, (pthread_cond_t*)NULL, NULL);
1022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (defined USERIAL_DEBUG) && (USERIAL_DEBUG == TRUE)
1025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD( "Leaving USERIAL_Open\n");
1026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
1027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (SERIAL_AMBA == TRUE)
1029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* give 20ms time for reader thread */
1030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    GKI_delay(20);
1031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
1032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1033e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectdone_open:
1034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    pthread_mutex_unlock(&close_thread_mutex);
1035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGI("USERIAL_Open(): exit");
1036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return;
1037e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1038e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1040e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1041e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function           USERIAL_Read
1042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1043e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description        Read data from a serial port using byte buffers.
1044e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1045e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Output Parameter   None
1046e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1047e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns            Number of bytes actually read from the serial port and
1048e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                    copied into p_data.  This may be less than len.
1049e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1050e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1051e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1052e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BT_HDR *pbuf_USERIAL_Read = NULL;
1053e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUDRV_API UINT16  USERIAL_Read(tUSERIAL_PORT port, UINT8 *p_data, UINT16 len)
1055e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16 total_len = 0;
1057e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16 copy_len = 0;
1058e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 * current_packet = NULL;
1059e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1060e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (defined USERIAL_DEBUG) && (USERIAL_DEBUG == TRUE)
1061e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD( "%s ++ len=%d pbuf_USERIAL_Read=%p, p_data=%p\n", __func__, len, pbuf_USERIAL_Read, p_data);
1062e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
1063e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    do
1064e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1065e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (pbuf_USERIAL_Read != NULL)
1066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1067e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            current_packet = ((UINT8 *)(pbuf_USERIAL_Read + 1)) + (pbuf_USERIAL_Read->offset);
1068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if ((pbuf_USERIAL_Read->len) <= (len - total_len))
1070e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                copy_len = pbuf_USERIAL_Read->len;
1071e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
1072e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                copy_len = (len - total_len);
1073e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1074e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            memcpy((p_data + total_len), current_packet, copy_len);
1075e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1076e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            total_len += copy_len;
1077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            pbuf_USERIAL_Read->offset += copy_len;
1079e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            pbuf_USERIAL_Read->len -= copy_len;
1080e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1081e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (pbuf_USERIAL_Read->len == 0)
1082e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                GKI_freebuf(pbuf_USERIAL_Read);
1084e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                pbuf_USERIAL_Read = NULL;
1085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1086e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1087e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1088e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (pbuf_USERIAL_Read == NULL && (total_len < len))
1089e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            pbuf_USERIAL_Read = (BT_HDR *)GKI_dequeue(&Userial_in_q);
1090e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1091e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    } while ((pbuf_USERIAL_Read != NULL) && (total_len < len));
1092e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (defined USERIAL_DEBUG) && (USERIAL_DEBUG == TRUE)
1094e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD( "%s: returned %d bytes", __func__, total_len);
1095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
1096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return total_len;
1097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function           USERIAL_Readbuf
1102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description        Read data from a serial port using GKI buffers.
1104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Output Parameter   Pointer to a GKI buffer which contains the data.
1106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns            Nothing
1108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Comments           The caller of this function is responsible for freeing the
1110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                    GKI buffer when it is finished with the data.  If there is
1111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                    no data to be read, the value of the returned pointer is
1112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                    NULL.
1113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUDRV_API void    USERIAL_ReadBuf(tUSERIAL_PORT port, BT_HDR **p_buf)
1117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function           USERIAL_WriteBuf
1124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description        Write data to a serial port using a GKI buffer.
1126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Output Parameter   None
1128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns            TRUE  if buffer accepted for write.
1130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                    FALSE if there is already a buffer being processed.
1131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Comments           The buffer will be freed by the serial driver.  Therefore,
1133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                    the application calling this function must not free the
1134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                    buffer.
1135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUDRV_API BOOLEAN USERIAL_WriteBuf(tUSERIAL_PORT port, BT_HDR *p_buf)
1139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return FALSE;
1141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function           USERIAL_Write
1146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description        Write data to a serial port using a byte buffer.
1148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Output Parameter   None
1150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns            Number of bytes actually written to the transport.  This
1152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                    may be less than len.
1153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUDRV_API UINT16  USERIAL_Write(tUSERIAL_PORT port, UINT8 *p_data, UINT16 len)
1156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int ret = 0, total = 0;
1158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int i = 0;
1159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    clock_t t;
1160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    doWriteDelay();
1162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD_IF((appl_trace_level>=BT_TRACE_LEVEL_DEBUG), "USERIAL_Write: (%d bytes) - \n", len);
1163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    t = clock();
1164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    while (len != 0)
1165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ret = write(linux_cb.sock, p_data + total, len);
1167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (ret < 0)
1168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
1169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        total += ret;
1170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        len -= ret;
1171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    perf_update(&perf_write, clock() - t, total);
1173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD_IF((appl_trace_level>=BT_TRACE_LEVEL_DEBUG), "USERIAL_Write len = %d, ret =  %d, errno = %d\n", len, ret, errno);
1175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* register a delay for next write
1177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project     */
1178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    setWriteDelay(total * nfc_write_delay / 1000);
1179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return ((UINT16)total);
1180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function           userial_change_rate
1185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description        change naud rate
1187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Output Parameter   None
1189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns            None
1191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid userial_change_rate(UINT8 baud)
1194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if defined (USING_BRCM_USB) && (USING_BRCM_USB == FALSE)
1196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    struct termios termios;
1197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
1198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (USERIAL_USE_TCIO_BAUD_CHANGE==TRUE)
1199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT32 tcio_baud;
1200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
1201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if defined (USING_BRCM_USB) && (USING_BRCM_USB == FALSE)
1203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tcflush(linux_cb.sock, TCIOFLUSH);
1204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tcgetattr(linux_cb.sock, &termios);
1206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    cfmakeraw(&termios);
1208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    cfsetospeed(&termios, baud);
1209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    cfsetispeed(&termios, baud);
1210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    termios.c_cflag |= (CLOCAL | CREAD | CRTSCTS | stop_bits);
1212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tcsetattr(linux_cb.sock, TCSANOW, &termios);
1214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tcflush(linux_cb.sock, TCIOFLUSH);
1215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else
1217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (USERIAL_USE_TCIO_BAUD_CHANGE==FALSE)
1218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    fprintf(stderr, "userial_change_rate: Closing UART Port\n");
1219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGI("userial_change_rate: Closing UART Port\n");
1220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    USERIAL_Close(linux_cb.port);
1221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    GKI_delay(50);
1223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* change baud rate in settings - leave everything else the same  */
1225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    linux_cb.open_cfg.baud = baud;
1226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD( "userial_change_rate: Attempting to reopen the UART Port at 0x%08x\n", (unsigned int)USERIAL_GetLineSpeed(baud));
1228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGI("userial_change_rate: Attempting to reopen the UART Port at %i\n", (unsigned int)USERIAL_GetLineSpeed(baud));
1229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    USERIAL_Open(linux_cb.port, &linux_cb.open_cfg, linux_cb.ser_cb);
1231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else /* amba uart */
1232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    fprintf(stderr, "userial_change_rate(): changeing baud rate via TCIO \n");
1233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGI( "userial_change_rate: (): changeing baud rate via TCIO \n");
1234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* change baud rate in settings - leave everything else the same  */
1235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    linux_cb.open_cfg.baud = baud;
1236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!userial_to_tcio_baud(linux_cb.open_cfg.baud, &tcio_baud))
1237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
1238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tcflush(linux_cb.sock, TCIOFLUSH);
1240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* get current settings. they should be fine besides baud rate we want to change */
1242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tcgetattr(linux_cb.sock, &termios);
1243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* set input/output baudrate */
1245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    cfsetospeed(&termios, tcio_baud);
1246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    cfsetispeed(&termios, tcio_baud);
1247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tcsetattr(linux_cb.sock, TCSANOW, &termios);
1248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tcflush(linux_cb.sock, TCIOFLUSH);
1250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
1251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif   /* USING_BRCM_USB  */
1252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function           userial_close_port
1257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description        close the transport driver
1259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns            Nothing
1261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid userial_close_port( void )
1264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    USERIAL_Close(linux_cb.port);
1266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function           USERIAL_Ioctl
1271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description        Perform an operation on a serial port.
1273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Output Parameter   The p_data parameter is either an input or output depending
1275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                    on the operation.
1276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns            Nothing
1278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUDRV_API void    USERIAL_Ioctl(tUSERIAL_PORT port, tUSERIAL_OP op, tUSERIAL_IOCTL_DATA *p_data)
1282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (defined LINUX_OS) && (LINUX_OS == TRUE)
1284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    USB_SCO_CONTROL ioctl_data;
1285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* just ignore port parameter as we are using USB in this case  */
1287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
1288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (op)
1290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case USERIAL_OP_FLUSH:
1292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case USERIAL_OP_FLUSH_RX:
1294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case USERIAL_OP_FLUSH_TX:
1296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case USERIAL_OP_BAUD_WR:
1298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGI( "USERIAL_Ioctl: Received USERIAL_OP_BAUD_WR on port: %d, ioctl baud%i\n", port, p_data->baud);
1299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        linux_cb.port = port;
1300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        userial_change_rate(p_data->baud);
1301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
1304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return;
1308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function           USERIAL_Close
1313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description        Close a serial port
1315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Output Parameter   None
1317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns            Nothing
1319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUDRV_API void    USERIAL_Close(tUSERIAL_PORT port)
1322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    pthread_attr_t attr;
1324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    pthread_t      close_thread;
1325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: enter", __FUNCTION__);
1327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    // check to see if thread is already running
1328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (pthread_mutex_trylock(&close_thread_mutex) == 0)
1329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        // mutex aquired so thread is not running
1331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        is_close_thread_is_waiting = TRUE;
1332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        pthread_mutex_unlock(&close_thread_mutex);
1333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        // close transport in a new thread so we don't block the caller
1335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        // make thread detached, no other thread will join
1336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        pthread_attr_init(&attr);
1337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
1338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        pthread_create( &close_thread, &attr, (void *)userial_close_thread,(void*)port);
1339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        pthread_attr_destroy(&attr);
1340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        // mutex not aquired to thread is already running
1344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGD( "USERIAL_Close(): already closing \n");
1345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: exit", __FUNCTION__);
1347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         userial_close_thread
1353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Thread to close USERIAL
1355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None.
1357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid userial_close_thread(UINT32 params)
1360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tUSERIAL_PORT port = (tUSERIAL_PORT )params;
1362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BT_HDR                  *p_buf = NULL;
1363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int result;
1364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD( "%s: closing transport (%d)\n", __FUNCTION__, linux_cb.sock);
1366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    pthread_mutex_lock(&close_thread_mutex);
1367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    is_close_thread_is_waiting = FALSE;
1368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (linux_cb.sock <= 0)
1370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGD( "%s: already closed (%d)\n", __FUNCTION__, linux_cb.sock);
1372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        pthread_mutex_unlock(&close_thread_mutex);
1373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
1374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    send_wakeup_signal();
1377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    result = pthread_join( worker_thread1, NULL );
1378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ( result < 0 )
1379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGE( "%s: pthread_join() FAILED: result: %d", __FUNCTION__, result );
1380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGD( "%s: pthread_join() joined: result: %d", __FUNCTION__, result );
1382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (linux_cb.sock_power_control > 0)
1384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        result = ioctl(linux_cb.sock_power_control, BCMNFC_WAKE_CTL, sleep_state());
1386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGD("%s: Delay %dms before turning off the chip", __FUNCTION__, gPrePowerOffDelay);
1387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_delay(gPrePowerOffDelay);
1388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        result = ioctl(linux_cb.sock_power_control, BCMNFC_POWER_CTL, 0);
1389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGD("%s: Delay %dms after turning off the chip", __FUNCTION__, gPostPowerOffDelay);
1390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_delay(gPostPowerOffDelay);
1391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    result = close(linux_cb.sock);
1393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (result<0)
1394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGD("%s: close return %d", __FUNCTION__, result);
1395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (linux_cb.sock_power_control > 0 && linux_cb.sock_power_control != linux_cb.sock)
1397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    result = close(linux_cb.sock_power_control);
1398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (result<0)
1399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGD("%s: close return %d", __FUNCTION__, result);
1400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    linux_cb.sock_power_control = -1;
1402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    linux_cb.sock = -1;
1403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    close_signal_fds();
1405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    pthread_mutex_unlock(&close_thread_mutex);
1406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD("%s: exiting", __FUNCTION__);
1407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function           USERIAL_Feature
1412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description        Check whether a feature of the serial API is supported.
1414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Output Parameter   None
1416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns            TRUE  if the feature is supported
1418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                    FALSE if the feature is not supported
1419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUDRV_API BOOLEAN USERIAL_Feature(tUSERIAL_FEATURE feature)
1423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (feature)
1425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case USERIAL_FEAT_PORT_1:
1427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case USERIAL_FEAT_PORT_2:
1428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case USERIAL_FEAT_PORT_3:
1429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case USERIAL_FEAT_PORT_4:
1430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case USERIAL_FEAT_BAUD_600:
1432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case USERIAL_FEAT_BAUD_1200:
1433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case USERIAL_FEAT_BAUD_9600:
1434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case USERIAL_FEAT_BAUD_19200:
1435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case USERIAL_FEAT_BAUD_57600:
1436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case USERIAL_FEAT_BAUD_115200:
1437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case USERIAL_FEAT_STOPBITS_1:
1439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case USERIAL_FEAT_STOPBITS_2:
1440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case USERIAL_FEAT_PARITY_NONE:
1442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case USERIAL_FEAT_PARITY_EVEN:
1443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case USERIAL_FEAT_PARITY_ODD:
1444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case USERIAL_FEAT_DATABITS_5:
1446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case USERIAL_FEAT_DATABITS_6:
1447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case USERIAL_FEAT_DATABITS_7:
1448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case USERIAL_FEAT_DATABITS_8:
1449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case USERIAL_FEAT_FC_HW:
1451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case USERIAL_FEAT_BUF_BYTE:
1452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case USERIAL_FEAT_OP_FLUSH_RX:
1454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case USERIAL_FEAT_OP_FLUSH_TX:
1455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return TRUE;
1456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
1457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
1458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return FALSE;
1461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
1464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         UPIO_Set
1466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description
1468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      This function sets one or more GPIO devices to the given state.
1469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      Multiple GPIOs of the same type can be masked together to set more
1470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      than one GPIO. This function can only be used on types UPIO_LED and
1471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      UPIO_GENERAL.
1472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Input Parameters:
1474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      type    The type of device.
1475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      pio     Indicates the particular GPIOs.
1476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      state   The desired state.
1477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Output Parameter:
1479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      None.
1480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:
1482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      None.
1483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
1485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUDRV_API void UPIO_Set(tUPIO_TYPE type, tUPIO pio, tUPIO_STATE new_state)
1486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int     ret;
1488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (type == UPIO_GENERAL)
1489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (pio == NFC_HAL_LP_NFC_WAKE_GPIO)
1491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (new_state == UPIO_ON || new_state == UPIO_OFF)
1493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (linux_cb.sock_power_control > 0)
1495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ALOGD("%s: ioctl, state=%d", __func__, new_state);
1497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ret = ioctl(linux_cb.sock_power_control, BCMNFC_WAKE_CTL, new_state);
1498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (isWake(new_state) && nfc_wake_delay > 0 && new_state != current_nfc_wake_state)
1499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
1500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        ALOGD("%s: ioctl, old state=%d, insert delay for %d ms", __func__, current_nfc_wake_state, nfc_wake_delay);
1501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        setWriteDelay(nfc_wake_delay);
1502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
1503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    current_nfc_wake_state = new_state;
1504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
1511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         setReadPacketSize
1513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description
1515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      This function sets the packetSize to the driver.
1516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      this enables faster read operation of NCI/HCI responses
1517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Input Parameters:
1519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      len     number of bytes to read per operation.
1520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Output Parameter:
1522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      None.
1523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:
1525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      None.
1526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
1528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid setReadPacketSize(int len)
1529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int ret;
1531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD("%s: ioctl, len=%d", __func__, len);
1532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ret = ioctl(linux_cb.sock, BCMNFC_READ_FULL_PACKET, len);
1533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUDRV_API BOOLEAN USERIAL_IsClosed()
1537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (linux_cb.sock == -1) ? TRUE : FALSE;
1539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUDRV_API void USERIAL_PowerupDevice(tUSERIAL_PORT port)
1542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int ret = -1;
1544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    unsigned long num = 0;
1545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    unsigned int resetSuccess = 0;
1546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    unsigned int numTries = 0;
1547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    unsigned char spi_negotiation[64];
1548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ( GetNumValue ( NAME_READ_MULTI_PACKETS, &num, sizeof ( num ) ) )
1550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        bcmi2cnfc_read_multi_packets = num;
1551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (bcmi2cnfc_read_multi_packets > 0)
1553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ioctl(linux_cb.sock, BCMNFC_READ_MULTI_PACKETS, bcmi2cnfc_read_multi_packets);
1554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    while (!resetSuccess && numTries < NUM_RESET_ATTEMPTS) {
1556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (numTries++ > 0) {
1557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ALOGW("BCM2079x: retrying reset, attempt %d/%d", numTries, NUM_RESET_ATTEMPTS);
1558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (linux_cb.sock_power_control > 0)
1560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ioctl(linux_cb.sock_power_control, BCMNFC_POWER_CTL, 0);
1562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            GKI_delay(10);
1563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ioctl(linux_cb.sock_power_control, BCMNFC_POWER_CTL, 1);
1564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            current_nfc_wake_state = wake_state();
1565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ret = ioctl(linux_cb.sock_power_control, BCMNFC_WAKE_CTL, current_nfc_wake_state);
1566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ret = GetStrValue ( NAME_SPI_NEGOTIATION, (char*)spi_negotiation, sizeof ( spi_negotiation ) );
1569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (ret > 0 && spi_negotiation[0] > 0 && spi_negotiation[0] < sizeof ( spi_negotiation ) - 1)
1570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            int len = spi_negotiation[0];
1572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Wake control is not available: Start SPI negotiation*/
1573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            USERIAL_Write(port, &spi_negotiation[1], len);
1574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            USERIAL_Read(port, spi_negotiation, sizeof ( spi_negotiation ));
1575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if ( GetNumValue ( NAME_CLIENT_ADDRESS, &num, sizeof ( num ) ) )
1578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            bcmi2cnfc_client_addr = num & 0xFF;
1579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (bcmi2cnfc_client_addr != 0 &&
1580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            0x07 < bcmi2cnfc_client_addr &&
1581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            bcmi2cnfc_client_addr < 0x78)
1582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ALOGD( "Change client address to %x\n", bcmi2cnfc_client_addr);
1584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            GKI_delay(gPowerOnDelay);
1585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ret = ioctl(linux_cb.sock, BCMNFC_CHANGE_ADDR, bcmi2cnfc_client_addr);
1586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (!ret) {
1587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                resetSuccess = 1;
1588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                linux_cb.client_device_address = bcmi2cnfc_client_addr;
1589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        } else {
1591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            resetSuccess = 1;
1592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!resetSuccess) {
1596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGE("BCM2079x: failed to initialize NFC controller");
1597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    GKI_delay(gPowerOnDelay);
1599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1600