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