15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2009-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************ 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Filename: bluedroidtest.c 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Description: Bluedroid Test application 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ***********************************************************************************/ 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h> 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <dlfcn.h> 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdlib.h> 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <errno.h> 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <pthread.h> 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <unistd.h> 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <ctype.h> 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <fcntl.h> 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <sys/prctl.h> 37034f08687a46f26c72a0cac8a14314ce446d17e3Nick Kralevich#include <sys/capability.h> 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <arpa/inet.h> 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <netinet/in.h> 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <netdb.h> 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <private/android_filesystem_config.h> 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <android/log.h> 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <hardware/hardware.h> 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <hardware/bluetooth.h> 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************ 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Constants & Macros 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/ 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define PID_FILE "/data/.bdt_pid" 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef MAX 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define MAX(x, y) ((x) > (y) ? (x) : (y)) 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define CASE_RETURN_STR(const) case const: return #const; 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6131fafe5d31a6dc88013fb7f02f6ef203426ce6c3Sharvil Nanavati#define UNUSED __attribute__((unused)) 6231fafe5d31a6dc88013fb7f02f6ef203426ce6c3Sharvil Nanavati 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************ 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Local type definitions 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/ 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************ 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Static variables 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/ 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic unsigned char main_done = 0; 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic bt_status_t status; 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Main API */ 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic bluetooth_device_t* bt_device; 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst bt_interface_t* sBtInterface = NULL; 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic gid_t groups[] = { AID_NET_BT, AID_INET, AID_NET_BT_ADMIN, 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AID_SYSTEM, AID_MISC, AID_SDCARD_RW, 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AID_NET_ADMIN, AID_VPN}; 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Set to 1 when the Bluedroid stack is enabled */ 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic unsigned char bt_enabled = 0; 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************ 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Static functions 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/ 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void process_cmd(char *p, unsigned char is_job); 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void job_handler(void *param); 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bdt_log(const char *fmt_str, ...); 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************ 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Externs 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/ 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************ 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Functions 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/ 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************ 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Shutdown helper functions 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/ 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bdt_shutdown(void) 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("shutdown bdroid test app\n"); 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project main_done = 1; 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Android's init.rc does not yet support applying linux capabilities 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void config_permissions(void) 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct __user_cap_header_struct header; 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct __user_cap_data_struct cap; 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("set_aid_and_cap : pid %d, uid %d gid %d", getpid(), getuid(), getgid()); 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project header.pid = 0; 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0); 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project setuid(AID_BLUETOOTH); 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project setgid(AID_BLUETOOTH); 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project header.version = _LINUX_CAPABILITY_VERSION; 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cap.effective = cap.permitted = cap.inheritable = 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1 << CAP_NET_RAW | 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1 << CAP_NET_ADMIN | 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1 << CAP_NET_BIND_SERVICE | 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1 << CAP_SYS_RAWIO | 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1 << CAP_SYS_NICE | 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1 << CAP_SETGID; 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project capset(&header, &cap); 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project setgroups(sizeof(groups)/sizeof(groups[0]), groups); 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Logger API 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bdt_log(const char *fmt_str, ...) 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project static char buffer[1024]; 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project va_list ap; 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project va_start(ap, fmt_str); 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project vsnprintf(buffer, 1024, fmt_str, ap); 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project va_end(ap); 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fprintf(stdout, "%s\n", buffer); 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Misc helper functions 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const char* dump_bt_status(bt_status_t status) 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(status) 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BT_STATUS_SUCCESS) 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BT_STATUS_FAIL) 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BT_STATUS_NOT_READY) 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BT_STATUS_NOMEM) 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BT_STATUS_BUSY) 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BT_STATUS_UNSUPPORTED) 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "unknown status code"; 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hex_dump(char *msg, void *data, int size, int trunc) 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project unsigned char *p = data; 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project unsigned char c; 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int n; 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char bytestr[4] = {0}; 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char addrstr[10] = {0}; 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char hexstr[ 16*3 + 5] = {0}; 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char charstr[16*1 + 5] = {0}; 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("%s \n", msg); 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* truncate */ 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(trunc && (size>32)) 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project size = 32; 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(n=1;n<=size;n++) { 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (n%16 == 1) { 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store address for this line */ 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project snprintf(addrstr, sizeof(addrstr), "%.4x", 20422c6e505dc65ab3d624e4ccd7c48c95fe2128703Kévin PETIT (unsigned int)((uintptr_t)p-(uintptr_t)data) ); 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project c = *p; 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (isalnum(c) == 0) { 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project c = '.'; 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store hex str (for left side) */ 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project snprintf(bytestr, sizeof(bytestr), "%02X ", *p); 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project strncat(hexstr, bytestr, sizeof(hexstr)-strlen(hexstr)-1); 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store char str (for right side) */ 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project snprintf(bytestr, sizeof(bytestr), "%c", c); 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project strncat(charstr, bytestr, sizeof(charstr)-strlen(charstr)-1); 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(n%16 == 0) { 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* line completed */ 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("[%4.4s] %-50.50s %s\n", addrstr, hexstr, charstr); 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hexstr[0] = 0; 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project charstr[0] = 0; 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } else if(n%8 == 0) { 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* half line: add whitespaces */ 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project strncat(hexstr, " ", sizeof(hexstr)-strlen(hexstr)-1); 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project strncat(charstr, " ", sizeof(charstr)-strlen(charstr)-1); 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p++; /* next byte */ 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (strlen(hexstr) > 0) { 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* print rest of buffer if not empty */ 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("[%4.4s] %-50.50s %s\n", addrstr, hexstr, charstr); 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Console helper functions 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid skip_blanks(char **p) 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (**p == ' ') 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p)++; 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectuint32_t get_int(char **p, int DefaultValue) 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uint32_t Value = 0; 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project unsigned char UseDefault; 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UseDefault = 1; 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project skip_blanks(p); 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while ( ((**p)<= '9' && (**p)>= '0') ) 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project Value = Value * 10 + (**p) - '0'; 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UseDefault = 0; 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p)++; 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (UseDefault) 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return DefaultValue; 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return Value; 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint get_signed_int(char **p, int DefaultValue) 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int Value = 0; 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project unsigned char UseDefault; 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project unsigned char NegativeNum = 0; 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UseDefault = 1; 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project skip_blanks(p); 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (**p) == '-') 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NegativeNum = 1; 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p)++; 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while ( ((**p)<= '9' && (**p)>= '0') ) 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project Value = Value * 10 + (**p) - '0'; 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UseDefault = 0; 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p)++; 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (UseDefault) 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return DefaultValue; 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ((NegativeNum == 0)? Value : -Value); 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid get_str(char **p, char *Buffer) 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project skip_blanks(p); 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (**p != 0 && **p != ' ') 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *Buffer = **p; 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p)++; 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project Buffer++; 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *Buffer = 0; 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectuint32_t get_hex(char **p, int DefaultValue) 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uint32_t Value = 0; 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project unsigned char UseDefault; 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UseDefault = 1; 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project skip_blanks(p); 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while ( ((**p)<= '9' && (**p)>= '0') || 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((**p)<= 'f' && (**p)>= 'a') || 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((**p)<= 'F' && (**p)>= 'A') ) 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (**p >= 'a') 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project Value = Value * 16 + (**p) - 'a' + 10; 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (**p >= 'A') 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project Value = Value * 16 + (**p) - 'A' + 10; 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project Value = Value * 16 + (**p) - '0'; 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UseDefault = 0; 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p)++; 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (UseDefault) 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return DefaultValue; 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return Value; 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid get_bdaddr(const char *str, bt_bdaddr_t *bd) { 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *d = ((char *)bd), *endp; 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(i = 0; i < 6; i++) { 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *d++ = strtol(str, &endp, 16); 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (*endp != ':' && i != 5) { 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(bd, 0, sizeof(bt_bdaddr_t)); 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project str = endp + 1; 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define is_cmd(str) ((strlen(str) == strlen(cmd)) && strncmp((const char *)&cmd, str, strlen(str)) == 0) 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define if_cmd(str) if (is_cmd(str)) 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef void (t_console_cmd_handler) (char *p); 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct { 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project const char *name; 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project t_console_cmd_handler *handler; 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project const char *help; 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project unsigned char is_job; 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} t_cmd; 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst t_cmd console_cmd_list[]; 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int console_cmd_maxlen = 0; 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void cmdjob_handler(void *param) 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *job_cmd = (char*)param; 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("cmdjob starting (%s)", job_cmd); 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project process_cmd(job_cmd, 1); 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("cmdjob terminating"); 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project free(job_cmd); 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int create_cmdjob(char *cmd) 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_t thread_id; 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *job_cmd; 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project job_cmd = malloc(strlen(cmd)+1); /* freed in job handler */ 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project strcpy(job_cmd, cmd); 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pthread_create(&thread_id, NULL, 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (void*)cmdjob_handler, (void*)job_cmd)!=0) 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project perror("pthread_create"); 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return 0; 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Load stack lib 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint HAL_load(void) 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int err = 0; 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hw_module_t* module; 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hw_device_t* device; 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("Loading HAL lib + extensions"); 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project err = hw_get_module(BT_HARDWARE_MODULE_ID, (hw_module_t const**)&module); 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (err == 0) 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project err = module->methods->open(module, BT_HARDWARE_MODULE_ID, &device); 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (err == 0) { 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bt_device = (bluetooth_device_t *)device; 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sBtInterface = bt_device->get_bluetooth_interface(); 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("HAL library loaded (%s)", strerror(err)); 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return err; 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint HAL_unload(void) 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int err = 0; 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("Unloading HAL lib"); 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sBtInterface = NULL; 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("HAL library unloaded (%s)", strerror(err)); 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return err; 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** HAL test functions & callbacks 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid setup_test_env(void) 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i = 0; 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (console_cmd_list[i].name != NULL) 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project console_cmd_maxlen = MAX(console_cmd_maxlen, (int)strlen(console_cmd_list[i].name)); 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i++; 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid check_return_status(bt_status_t status) 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BT_STATUS_SUCCESS) 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("HAL REQUEST FAILED status : %d (%s)", status, dump_bt_status(status)); 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("HAL REQUEST SUCCESS"); 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void adapter_state_changed(bt_state_t state) 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("ADAPTER STATE UPDATED : %s", (state == BT_STATE_OFF)?"OFF":"ON"); 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (state == BT_STATE_ON) { 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bt_enabled = 1; 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } else { 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bt_enabled = 0; 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47431fafe5d31a6dc88013fb7f02f6ef203426ce6c3Sharvil Nanavatistatic void dut_mode_recv(uint16_t UNUSED opcode, uint8_t UNUSED *buf, uint8_t UNUSED len) 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("DUT MODE RECV : NOT IMPLEMENTED"); 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 479ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void le_test_mode(bt_status_t status, uint16_t packet_count) 480ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 481ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bdt_log("LE TEST MODE END status:%s number_of_packets:%d", dump_bt_status(status), packet_count); 482ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 483ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic bt_callbacks_t bt_callbacks = { 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sizeof(bt_callbacks_t), 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project adapter_state_changed, 48784a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel NULL, /* adapter_properties_cb */ 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, /* remote_device_properties_cb */ 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, /* device_found_cb */ 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, /* discovery_state_changed_cb */ 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, /* pin_request_cb */ 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, /* ssp_request_cb */ 49384a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel NULL, /* bond_state_changed_cb */ 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, /* acl_state_changed_cb */ 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, /* thread_evt_cb */ 49684a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel dut_mode_recv, /* dut_mode_recv_cb */ 497fc4b2f1953dbe60464d0f5ef7daaa10001fbc62fMatthew Xie#if BLE_INCLUDED == TRUE 49884a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel le_test_mode, /* le_test_mode_cb */ 499fc4b2f1953dbe60464d0f5ef7daaa10001fbc62fMatthew Xie#else 50084a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel NULL, /* le_test_mode_cb */ 501fc4b2f1953dbe60464d0f5ef7daaa10001fbc62fMatthew Xie#endif 50284a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel NULL /* energy_info_cb */ 50384a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel}; 50484a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel 50584a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudelstatic bool set_wake_alarm(uint64_t delay_millis, bool should_wake, alarm_cb cb, void *data) { 50684a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel static timer_t timer; 50784a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel static bool timer_created; 50884a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel 50984a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel if (!timer_created) { 51084a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel struct sigevent sigevent; 51184a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel memset(&sigevent, 0, sizeof(sigevent)); 51284a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel sigevent.sigev_notify = SIGEV_THREAD; 51384a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel sigevent.sigev_notify_function = (void (*)(union sigval))cb; 51484a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel sigevent.sigev_value.sival_ptr = data; 51584a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel timer_create(CLOCK_MONOTONIC, &sigevent, &timer); 51684a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel timer_created = true; 51784a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel } 51884a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel 51984a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel struct itimerspec new_value; 52084a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel new_value.it_value.tv_sec = delay_millis / 1000; 52184a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel new_value.it_value.tv_nsec = (delay_millis % 1000) * 1000 * 1000; 52284a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel new_value.it_interval.tv_sec = 0; 52384a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel new_value.it_interval.tv_nsec = 0; 52484a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel timer_settime(timer, 0, &new_value, NULL); 52584a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel 52684a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel return true; 52784a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel} 52884a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel 52984a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudelstatic int acquire_wake_lock(const char *lock_name) { 53084a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel return BT_STATUS_SUCCESS; 53184a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel} 53284a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel 53384a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudelstatic int release_wake_lock(const char *lock_name) { 53484a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel return BT_STATUS_SUCCESS; 53584a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel} 53684a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel 53784a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudelstatic bt_os_callouts_t callouts = { 53884a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel sizeof(bt_os_callouts_t), 53984a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel set_wake_alarm, 54084a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel acquire_wake_lock, 54184a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel release_wake_lock, 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bdt_init(void) 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("INIT BT "); 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = sBtInterface->init(&bt_callbacks); 54884a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel 54984a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel if (status == BT_STATUS_SUCCESS) { 55084a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel status = sBtInterface->set_os_callouts(&callouts); 55184a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel } 55284a3b261821b31ed33c21fe1ed4da918a33901d6Thierry Strudel 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project check_return_status(status); 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bdt_enable(void) 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("ENABLE BT"); 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bt_enabled) { 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("Bluetooth is already enabled"); 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = sBtInterface->enable(); 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project check_return_status(status); 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bdt_disable(void) 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("DISABLE BT"); 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bt_enabled) { 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("Bluetooth is already disabled"); 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = sBtInterface->disable(); 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project check_return_status(status); 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bdt_dut_mode_configure(char *p) 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int32_t mode = -1; 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("BT DUT MODE CONFIGURE"); 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bt_enabled) { 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("Bluetooth must be enabled for test_mode to work."); 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mode = get_signed_int(&p, mode); 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((mode != 0) && (mode != 1)) { 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("Please specify mode: 1 to enter, 0 to exit"); 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = sBtInterface->dut_mode_configure(mode); 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project check_return_status(status); 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 598ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#define HCI_LE_RECEIVER_TEST_OPCODE 0x201D 599ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#define HCI_LE_TRANSMITTER_TEST_OPCODE 0x201E 600ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#define HCI_LE_END_TEST_OPCODE 0x201F 601ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 602ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid bdt_le_test_mode(char *p) 603ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 604ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta int cmd; 605ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta unsigned char buf[3]; 606ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta int arg1, arg2, arg3; 607ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 608ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bdt_log("BT LE TEST MODE"); 609ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!bt_enabled) { 610ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bdt_log("Bluetooth must be enabled for le_test to work."); 611ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 612ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 613ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 614ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta memset(buf, 0, sizeof(buf)); 615ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta cmd = get_int(&p, 0); 616ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta switch (cmd) 617ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 618ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta case 0x1: /* RX TEST */ 619ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta arg1 = get_int(&p, -1); 620ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (arg1 < 0) bdt_log("%s Invalid arguments", __FUNCTION__); 621ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta buf[0] = arg1; 622ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta status = sBtInterface->le_test_mode(HCI_LE_RECEIVER_TEST_OPCODE, buf, 1); 623ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 624ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta case 0x2: /* TX TEST */ 625ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta arg1 = get_int(&p, -1); 626ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta arg2 = get_int(&p, -1); 627ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta arg3 = get_int(&p, -1); 628ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((arg1 < 0) || (arg2 < 0) || (arg3 < 0)) 629ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bdt_log("%s Invalid arguments", __FUNCTION__); 630ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta buf[0] = arg1; 631ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta buf[1] = arg2; 632ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta buf[2] = arg3; 633ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta status = sBtInterface->le_test_mode(HCI_LE_TRANSMITTER_TEST_OPCODE, buf, 3); 634ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 635ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta case 0x3: /* END TEST */ 636ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta status = sBtInterface->le_test_mode(HCI_LE_END_TEST_OPCODE, buf, 0); 637ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 638ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta default: 639ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bdt_log("Unsupported command"); 640ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 641ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 642ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 643ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (status != BT_STATUS_SUCCESS) 644ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 645ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bdt_log("%s Test 0x%x Failed with status:0x%x", __FUNCTION__, cmd, status); 646ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 647ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 648ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 649ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bdt_cleanup(void) 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("CLEANUP"); 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sBtInterface->cleanup(); 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Console commands 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 66031fafe5d31a6dc88013fb7f02f6ef203426ce6c3Sharvil Nanavativoid do_help(char UNUSED *p) 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i = 0; 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int max = 0; 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char line[128]; 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int pos = 0; 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (console_cmd_list[i].name != NULL) 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pos = sprintf(line, "%s", (char*)console_cmd_list[i].name); 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("%s %s\n", (char*)line, (char*)console_cmd_list[i].help); 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i++; 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 67531fafe5d31a6dc88013fb7f02f6ef203426ce6c3Sharvil Nanavativoid do_quit(char UNUSED *p) 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_shutdown(); 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************* 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * BT TEST CONSOLE COMMANDS 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Parses argument lists and passes to API test function 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 68831fafe5d31a6dc88013fb7f02f6ef203426ce6c3Sharvil Nanavativoid do_init(char UNUSED *p) 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_init(); 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 69331fafe5d31a6dc88013fb7f02f6ef203426ce6c3Sharvil Nanavativoid do_enable(char UNUSED *p) 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_enable(); 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 69831fafe5d31a6dc88013fb7f02f6ef203426ce6c3Sharvil Nanavativoid do_disable(char UNUSED *p) 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_disable(); 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid do_dut_mode_configure(char *p) 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_dut_mode_configure(p); 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 707ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid do_le_test_mode(char *p) 708ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 709ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bdt_le_test_mode(p); 710ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 711ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 71231fafe5d31a6dc88013fb7f02f6ef203426ce6c3Sharvil Nanavativoid do_cleanup(char UNUSED *p) 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_cleanup(); 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************* 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * CONSOLE COMMAND TABLE 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst t_cmd console_cmd_list[] = 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * INTERNAL 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { "help", do_help, "lists all available console commands", 0 }, 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { "quit", do_quit, "", 0}, 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * API CONSOLE COMMANDS 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Init and Cleanup shall be called automatically */ 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { "enable", do_enable, ":: enables bluetooth", 0 }, 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { "disable", do_disable, ":: disables bluetooth", 0 }, 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { "dut_mode_configure", do_dut_mode_configure, ":: DUT mode - 1 to enter,0 to exit", 0 }, 740ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { "le_test_mode", do_le_test_mode, ":: LE Test Mode - RxTest - 1 <rx_freq>, \n\t \ 741ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta TxTest - 2 <tx_freq> <test_data_len> <payload_pattern>, \n\t \ 742ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta End Test - 3 <no_args>", 0 }, 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add here */ 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* last entry */ 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {NULL, NULL, "", 0}, 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Main console command handler 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void process_cmd(char *p, unsigned char is_job) 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char cmd[64]; 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i = 0; 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *p_saved = p; 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project get_str(&p, cmd); 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* table commands */ 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (console_cmd_list[i].name != NULL) 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_cmd(console_cmd_list[i].name)) 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!is_job && console_cmd_list[i].is_job) 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project create_cmdjob(p_saved); 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project console_cmd_list[i].handler(p); 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i++; 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("%s : unknown command\n", p_saved); 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project do_help(NULL); 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 78031fafe5d31a6dc88013fb7f02f6ef203426ce6c3Sharvil Nanavatiint main (int UNUSED argc, char UNUSED *argv[]) 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int opt; 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char cmd[128]; 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int args_processed = 0; 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int pid = -1; 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project config_permissions(); 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("\n:::::::::::::::::::::::::::::::::::::::::::::::::::"); 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log(":: Bluedroid test app starting"); 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( HAL_load() < 0 ) { 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project perror("HAL failed to initialize, exit\n"); 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project unlink(PID_FILE); 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project exit(0); 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project setup_test_env(); 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Automatically perform the init */ 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_init(); 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while(!main_done) 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char line[128]; 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* command prompt */ 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project printf( ">" ); 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fflush(stdout); 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fgets (line, 128, stdin); 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (line[0]!= '\0') 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove linefeed */ 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project line[strlen(line)-1] = 0; 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project process_cmd(line, 0); 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(line, '\0', 128); 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* FIXME: Commenting this out as for some reason, the application does not exit otherwise*/ 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project //bdt_cleanup(); 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HAL_unload(); 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log(":: Bluedroid test app terminating"); 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return 0; 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 831