10ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/* 20ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel * Copyright (c) 2013, The Linux Foundation. All rights reserved. 30ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel * Not a Contribution. 40ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel * Copyright 2012 The Android Open Source Project 50ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel * 60ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel * Licensed under the Apache License, Version 2.0 (the "License"); 70ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel * you may not use this file except in compliance with the License. 80ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel * You may obtain a copy of the License at 90ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel * 100ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel * http://www.apache.org/licenses/LICENSE-2.0 110ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel * 120ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel * Unless required by applicable law or agreed to in writing, software 130ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel * distributed under the License is distributed on an "AS IS" BASIS, 140ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 150ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel * See the License for the specific language governing permissions and 160ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel * limitations under the License. 170ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel */ 180ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 190ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/****************************************************************************** 200ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel * 210ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel * Filename: userial_vendor.c 220ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel * 230ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel * Description: Contains vendor-specific userial functions 240ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel * 250ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel ******************************************************************************/ 260ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 270ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define LOG_TAG "bt_vendor" 280ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 290ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#include "bt_vendor_qcom.h" 300ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#include "hci_uart.h" 31abb4fd870fa1a3dd91a71f6e0d33d6aaa44079c1Jiyong Park 32abb4fd870fa1a3dd91a71f6e0d33d6aaa44079c1Jiyong Park#include <asm-generic/ioctls.h> 33abb4fd870fa1a3dd91a71f6e0d33d6aaa44079c1Jiyong Park#include <errno.h> 34abb4fd870fa1a3dd91a71f6e0d33d6aaa44079c1Jiyong Park#include <fcntl.h> 35abb4fd870fa1a3dd91a71f6e0d33d6aaa44079c1Jiyong Park#include <stdio.h> 360ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#include <string.h> 37abb4fd870fa1a3dd91a71f6e0d33d6aaa44079c1Jiyong Park#include <termios.h> 38abb4fd870fa1a3dd91a71f6e0d33d6aaa44079c1Jiyong Park#include <unistd.h> 39abb4fd870fa1a3dd91a71f6e0d33d6aaa44079c1Jiyong Park 40abb4fd870fa1a3dd91a71f6e0d33d6aaa44079c1Jiyong Park#include <utils/Log.h> 410ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 420ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/****************************************************************************** 430ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Constants & Macros 440ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel******************************************************************************/ 450ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 460ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#ifndef VNDUSERIAL_DBG 470ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define VNDUSERIAL_DBG TRUE 480ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#endif 490ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 500ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#if (VNDUSERIAL_DBG == TRUE) 510ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define VNDUSERIALDBG(param, ...) {ALOGI(param, ## __VA_ARGS__);} 520ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#else 530ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define VNDUSERIALDBG(param, ...) {} 540ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#endif 550ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 560ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#define RESERVED(p) if(p) ALOGI( "%s: reserved param", __FUNCTION__); 570ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 580ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/****************************************************************************** 590ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Global variables 600ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel******************************************************************************/ 610ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudelvnd_userial_cb_t vnd_userial; 620ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 630ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/***************************************************************************** 640ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Functions 650ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel*****************************************************************************/ 660ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 670ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/******************************************************************************* 680ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 690ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Function userial_to_tcio_baud 700ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 710ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Description helper function converts USERIAL baud rates into TCIO 720ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** conforming baud rates 730ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 740ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Returns TRUE/FALSE 750ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 760ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel*******************************************************************************/ 770ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudeluint8_t userial_to_tcio_baud(uint8_t cfg_baud, uint32_t *baud) 780ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel{ 790ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel if (cfg_baud == USERIAL_BAUD_115200) 800ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel *baud = B115200; 810ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel else if (cfg_baud == USERIAL_BAUD_4M) 820ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel *baud = B4000000; 830ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel else if (cfg_baud == USERIAL_BAUD_3M) 840ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel *baud = B3000000; 850ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel else if (cfg_baud == USERIAL_BAUD_2M) 860ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel *baud = B2000000; 870ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel else if (cfg_baud == USERIAL_BAUD_1M) 880ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel *baud = B1000000; 890ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel else if (cfg_baud == USERIAL_BAUD_921600) 900ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel *baud = B921600; 910ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel else if (cfg_baud == USERIAL_BAUD_460800) 920ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel *baud = B460800; 930ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel else if (cfg_baud == USERIAL_BAUD_230400) 940ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel *baud = B230400; 950ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel else if (cfg_baud == USERIAL_BAUD_57600) 960ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel *baud = B57600; 970ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel else if (cfg_baud == USERIAL_BAUD_19200) 980ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel *baud = B19200; 990ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel else if (cfg_baud == USERIAL_BAUD_9600) 1000ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel *baud = B9600; 1010ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel else if (cfg_baud == USERIAL_BAUD_1200) 1020ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel *baud = B1200; 1030ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel else if (cfg_baud == USERIAL_BAUD_600) 1040ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel *baud = B600; 1050ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel else 1060ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel { 1070ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel ALOGE( "userial vendor open: unsupported baud idx %i", cfg_baud); 1080ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel *baud = B115200; 1090ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel return FALSE; 1100ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel } 1110ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 1120ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel return TRUE; 1130ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel} 1140ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 1150ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/******************************************************************************* 1160ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 1170ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Function userial_to_baud_tcio 1180ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 1190ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Description helper function converts TCIO baud rate into integer 1200ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 1210ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Returns uint32_t 1220ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 1230ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel*******************************************************************************/ 1240ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudelint userial_tcio_baud_to_int(uint32_t baud) 1250ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel{ 1260ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel int baud_rate =0; 1270ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 1280ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel switch (baud) 1290ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel { 1300ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel case B600: 1310ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel baud_rate = 600; 1320ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel break; 1330ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel case B1200: 1340ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel baud_rate = 1200; 1350ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel break; 1360ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel case B9600: 1370ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel baud_rate = 9600; 1380ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel break; 1390ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel case B19200: 1400ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel baud_rate = 19200; 1410ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel break; 1420ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel case B57600: 1430ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel baud_rate = 57600; 1440ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel break; 1450ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel case B115200: 1460ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel baud_rate = 115200; 1470ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel break; 1480ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel case B230400: 1490ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel baud_rate = 230400; 1500ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel break; 1510ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel case B460800: 1520ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel baud_rate = 460800; 1530ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel break; 1540ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel case B921600: 1550ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel baud_rate = 921600; 1560ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel break; 1570ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel case B1000000: 1580ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel baud_rate = 1000000; 1590ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel break; 1600ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel case B2000000: 1610ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel baud_rate = 2000000; 1620ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel break; 1630ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel case B3000000: 1640ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel baud_rate = 3000000; 1650ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel break; 1660ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel case B4000000: 1670ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel baud_rate = 4000000; 1680ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel break; 1690ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel default: 1700ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel ALOGE( "%s: unsupported baud %d", __FUNCTION__, baud); 1710ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel break; 1720ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel } 1730ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 1740ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel ALOGI( "%s: Current Baudrate = %d bps", __FUNCTION__, baud_rate); 1750ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel return baud_rate; 1760ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel} 1770ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 1780ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 1790ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE) 1800ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/******************************************************************************* 1810ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 1820ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Function userial_ioctl_init_bt_wake 1830ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 1840ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Description helper function to set the open state of the bt_wake if ioctl 1850ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** is used. it should not hurt in the rfkill case but it might 1860ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** be better to compile it out. 1870ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 1880ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Returns none 1890ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 1900ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel*******************************************************************************/ 1910ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudelvoid userial_ioctl_init_bt_wake(int fd) 1920ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel{ 1930ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel uint32_t bt_wake_state; 1940ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 1950ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel /* assert BT_WAKE through ioctl */ 1960ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel ioctl(fd, USERIAL_IOCTL_BT_WAKE_ASSERT, NULL); 1970ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel ioctl(fd, USERIAL_IOCTL_BT_WAKE_GET_ST, &bt_wake_state); 1980ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel VNDUSERIALDBG("userial_ioctl_init_bt_wake read back BT_WAKE state=%i", \ 1990ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel bt_wake_state); 2000ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel} 2010ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#endif // (BT_WAKE_VIA_USERIAL_IOCTL==TRUE) 2020ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 2030ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 2040ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/***************************************************************************** 2050ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Userial Vendor API Functions 2060ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel*****************************************************************************/ 2070ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 2080ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/******************************************************************************* 2090ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 2100ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Function userial_vendor_init 2110ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 2120ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Description Initialize userial vendor-specific control block 2130ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 2140ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Returns None 2150ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 2160ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel*******************************************************************************/ 2170ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudelvoid userial_vendor_init(void) 2180ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel{ 2190ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel vnd_userial.fd = -1; 2200ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel snprintf(vnd_userial.port_name, VND_PORT_NAME_MAXLEN, "%s", BT_HS_UART_DEVICE); 2210ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel} 2220ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 2230ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/******************************************************************************* 2240ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 2250ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Function userial_vendor_open 2260ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 2270ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Description Open the serial port with the given configuration 2280ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 2290ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Returns device fd 2300ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 2310ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel*******************************************************************************/ 2320ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudelint userial_vendor_open(tUSERIAL_CFG *p_cfg) 2330ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel{ 2340ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel uint32_t baud; 2350ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel uint8_t data_bits; 2360ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel uint16_t parity; 2370ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel uint8_t stop_bits; 2380ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 2390ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel vnd_userial.fd = -1; 2400ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 2410ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel if (!userial_to_tcio_baud(p_cfg->baud, &baud)) 2420ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel { 2430ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel return -1; 2440ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel } 2450ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 2460ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel if(p_cfg->fmt & USERIAL_DATABITS_8) 2470ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel data_bits = CS8; 2480ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel else if(p_cfg->fmt & USERIAL_DATABITS_7) 2490ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel data_bits = CS7; 2500ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel else if(p_cfg->fmt & USERIAL_DATABITS_6) 2510ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel data_bits = CS6; 2520ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel else if(p_cfg->fmt & USERIAL_DATABITS_5) 2530ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel data_bits = CS5; 2540ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel else 2550ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel { 2560ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel ALOGE("userial vendor open: unsupported data bits"); 2570ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel return -1; 2580ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel } 2590ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 2600ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel if(p_cfg->fmt & USERIAL_PARITY_NONE) 2610ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel parity = 0; 2620ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel else if(p_cfg->fmt & USERIAL_PARITY_EVEN) 2630ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel parity = PARENB; 2640ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel else if(p_cfg->fmt & USERIAL_PARITY_ODD) 2650ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel parity = (PARENB | PARODD); 2660ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel else 2670ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel { 2680ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel ALOGE("userial vendor open: unsupported parity bit mode"); 2690ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel return -1; 2700ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel } 2710ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 2720ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel if(p_cfg->fmt & USERIAL_STOPBITS_1) 2730ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel stop_bits = 0; 2740ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel else if(p_cfg->fmt & USERIAL_STOPBITS_2) 2750ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel stop_bits = CSTOPB; 2760ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel else 2770ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel { 2780ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel ALOGE("userial vendor open: unsupported stop bits"); 2790ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel return -1; 2800ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel } 2810ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 2820ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel ALOGI("userial vendor open: opening %s", vnd_userial.port_name); 2830ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 2840ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel if ((vnd_userial.fd = open(vnd_userial.port_name, O_RDWR|O_NOCTTY)) == -1) 2850ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel { 2860ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel ALOGE("userial vendor open: unable to open %s: %s(%d)", vnd_userial.port_name, 2870ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel strerror(errno), errno); 2880ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel return -1; 2890ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel } 2900ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 2910ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel tcflush(vnd_userial.fd, TCIOFLUSH); 2920ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 2930ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel tcgetattr(vnd_userial.fd, &vnd_userial.termios); 2940ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel cfmakeraw(&vnd_userial.termios); 2950ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 2960ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel /* Set UART Control Modes */ 2970ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel vnd_userial.termios.c_cflag |= CLOCAL; 2980ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel vnd_userial.termios.c_cflag |= (CRTSCTS | stop_bits); 2990ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 3000ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel tcsetattr(vnd_userial.fd, TCSANOW, &vnd_userial.termios); 3010ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 3020ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel /* set input/output baudrate */ 3030ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel cfsetospeed(&vnd_userial.termios, baud); 3040ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel cfsetispeed(&vnd_userial.termios, baud); 3050ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel tcsetattr(vnd_userial.fd, TCSANOW, &vnd_userial.termios); 3060ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 3070ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel tcflush(vnd_userial.fd, TCIOFLUSH); 3080ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 3090ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE) 3100ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel userial_ioctl_init_bt_wake(vnd_userial.fd); 3110ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#endif 3120ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 3130ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel ALOGI("device fd = %d open", vnd_userial.fd); 3140ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 3150ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel return vnd_userial.fd; 3160ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel} 3170ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 3180ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/******************************************************************************* 3190ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 3200ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Function userial_vendor_close 3210ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 3220ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Description Conduct vendor-specific close work 3230ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 3240ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Returns None 3250ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 3260ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel*******************************************************************************/ 3270ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudelvoid userial_vendor_close(void) 3280ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel{ 3290ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel int result; 3300ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 3310ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel if (vnd_userial.fd == -1) 3320ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel return; 3330ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 3340ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE) 3350ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel /* de-assert bt_wake BEFORE closing port */ 3360ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel ioctl(vnd_userial.fd, USERIAL_IOCTL_BT_WAKE_DEASSERT, NULL); 3370ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#endif 3380ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 3390ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel ALOGI("device fd = %d close", vnd_userial.fd); 3400ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 3410ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel if ((result = close(vnd_userial.fd)) < 0) 3420ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel ALOGE( "close(fd:%d) FAILED result:%d", vnd_userial.fd, result); 3430ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 3440ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel vnd_userial.fd = -1; 3450ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel} 3460ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 3470ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/******************************************************************************* 3480ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 3490ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Function userial_vendor_set_baud 3500ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 3510ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Description Set new baud rate 3520ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 3530ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Returns None 3540ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 3550ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel*******************************************************************************/ 3560ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudelvoid userial_vendor_set_baud(uint8_t userial_baud) 3570ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel{ 3580ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel uint32_t tcio_baud; 3590ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 3600ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel VNDUSERIALDBG("## userial_vendor_set_baud: %d", userial_baud); 3610ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 3620ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel userial_to_tcio_baud(userial_baud, &tcio_baud); 3630ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 3640ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel cfsetospeed(&vnd_userial.termios, tcio_baud); 3650ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel cfsetispeed(&vnd_userial.termios, tcio_baud); 3660ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel tcsetattr(vnd_userial.fd, TCSADRAIN, &vnd_userial.termios); /* don't change speed until last write done */ 3670ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel// tcflush(vnd_userial.fd, TCIOFLUSH); 3680ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel} 3690ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 3700ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/******************************************************************************* 3710ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 3720ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Function userial_vendor_get_baud 3730ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 3740ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Description Get current baud rate 3750ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 3760ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Returns int 3770ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 3780ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel*******************************************************************************/ 3790ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudelint userial_vendor_get_baud(void) 3800ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel{ 3810ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel if (vnd_userial.fd == -1) 3820ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel { 3830ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel ALOGE( "%s: uart port(%s) has not been opened", __FUNCTION__, BT_HS_UART_DEVICE ); 3840ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel return -1; 3850ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel } 3860ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 3870ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel return userial_tcio_baud_to_int(cfgetispeed(&vnd_userial.termios)); 3880ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel} 3890ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 3900ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/******************************************************************************* 3910ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 3920ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Function userial_vendor_ioctl 3930ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 3940ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Description ioctl inteface 3950ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 3960ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Returns None 3970ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 3980ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel*******************************************************************************/ 3990ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudelint userial_vendor_ioctl(userial_vendor_ioctl_op_t op, int *p_data) 4000ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel{ 4010ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel int err = -1; 4020ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 4030ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel switch(op) 4040ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel { 4050ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE) 4060ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel case USERIAL_OP_ASSERT_BT_WAKE: 4070ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel VNDUSERIALDBG("## userial_vendor_ioctl: Asserting BT_Wake ##"); 4080ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel err = ioctl(vnd_userial.fd, USERIAL_IOCTL_BT_WAKE_ASSERT, NULL); 4090ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel break; 4100ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 4110ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel case USERIAL_OP_DEASSERT_BT_WAKE: 4120ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel VNDUSERIALDBG("## userial_vendor_ioctl: De-asserting BT_Wake ##"); 4130ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel err = ioctl(vnd_userial.fd, USERIAL_IOCTL_BT_WAKE_DEASSERT, NULL); 4140ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel break; 4150ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 4160ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel case USERIAL_OP_GET_BT_WAKE_STATE: 4170ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel err = ioctl(vnd_userial.fd, USERIAL_IOCTL_BT_WAKE_GET_ST, p_data); 4180ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel break; 4190ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel#endif // (BT_WAKE_VIA_USERIAL_IOCTL==TRUE) 4200ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel case USERIAL_OP_FLOW_ON: 4210ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel ALOGI("## userial_vendor_ioctl: UART Flow On "); 4220ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel *p_data |=TIOCM_RTS; 4230ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel err = ioctl(vnd_userial.fd, TIOCMSET, p_data); 4240ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel break; 4250ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 4260ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel case USERIAL_OP_FLOW_OFF: 4270ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel ALOGI("## userial_vendor_ioctl: UART Flow Off "); 4280ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel ioctl(vnd_userial.fd, TIOCMGET, p_data); 4290ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel *p_data &= ~TIOCM_RTS; 4300ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel err = ioctl(vnd_userial.fd, TIOCMSET, p_data); 4310ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel break; 4320ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 4330ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel default: 4340ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel break; 4350ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel } 4360ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 4370ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel return err; 4380ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel} 4390ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 4400ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/******************************************************************************* 4410ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 4420ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Function userial_set_port 4430ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 4440ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Description Configure UART port name 4450ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 4460ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Returns 0 : Success 4470ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Otherwise : Fail 4480ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 4490ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel*******************************************************************************/ 4500ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudelint userial_set_port(char *p_conf_name, char *p_conf_value, int param) 4510ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel{ 4520ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel RESERVED(p_conf_name); 4530ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel RESERVED(param); 4540ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel strlcpy(vnd_userial.port_name, p_conf_value, VND_PORT_NAME_MAXLEN); 4550ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 4560ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel return 0; 4570ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel} 4580ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 4590ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel/******************************************************************************* 4600ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 4610ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Function read_hci_event 4620ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 4630ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Description Read HCI event during vendor initialization 4640ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 4650ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** Returns int: size to read 4660ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel** 4670ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel*******************************************************************************/ 4680ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudelint read_hci_event(int fd, unsigned char* buf, int size) 4690ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel{ 4700ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel int remain, r; 4710ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel int count = 0; 4720ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 4730ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel if (size <= 0) { 4740ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel ALOGE("Invalid size arguement!"); 4750ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel return -1; 4760ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel } 4770ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 4780ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel ALOGI("%s: Wait for Command Compete Event from SOC", __FUNCTION__); 4790ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 4800ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel /* The first byte identifies the packet type. For HCI event packets, it 4810ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel * should be 0x04, so we read until we get to the 0x04. */ 4820ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel while (1) { 4830ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel r = read(fd, buf, 1); 4840ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel if (r <= 0) 4850ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel return -1; 4860ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel if (buf[0] == 0x04) 4870ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel break; 4880ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel } 4890ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel count++; 4900ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 4910ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel /* The next two bytes are the event code and parameter total length. */ 4920ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel while (count < 3) { 4930ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel r = read(fd, buf + count, 3 - count); 4940ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel if (r <= 0) 4950ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel return -1; 4960ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel count += r; 4970ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel } 4980ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 4990ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel /* Now we read the parameters. */ 5000ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel if (buf[2] < (size - 3)) 5010ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel remain = buf[2]; 5020ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel else 5030ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel remain = size - 3; 5040ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 5050ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel while ((count - 3) < remain) { 5060ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel r = read(fd, buf + count, remain - (count - 3)); 5070ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel if (r <= 0) 5080ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel return -1; 5090ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel count += r; 5100ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel } 5110ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel return count; 5120ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel} 5130ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 5140ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudelint userial_clock_operation(int fd, int cmd) 5150ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel{ 5160ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel int ret = 0; 5170ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 5180ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel switch (cmd) 5190ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel { 5200ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel case USERIAL_OP_CLK_ON: 5210ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel case USERIAL_OP_CLK_OFF: 5220ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel ioctl(fd, cmd); 5230ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel break; 5240ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel case USERIAL_OP_CLK_STATE: 5250ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel ret = ioctl(fd, cmd); 5260ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel break; 5270ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel } 5280ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel 5290ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel return ret; 5300ebd0bab066cd86d7a19f4646e0686dae885004eThierry Strudel} 531