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