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 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************ 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Local type definitions 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/ 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************ 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Static variables 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/ 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic unsigned char main_done = 0; 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic bt_status_t status; 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Main API */ 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic bluetooth_device_t* bt_device; 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst bt_interface_t* sBtInterface = NULL; 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic gid_t groups[] = { AID_NET_BT, AID_INET, AID_NET_BT_ADMIN, 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AID_SYSTEM, AID_MISC, AID_SDCARD_RW, 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AID_NET_ADMIN, AID_VPN}; 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Set to 1 when the Bluedroid stack is enabled */ 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic unsigned char bt_enabled = 0; 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************ 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Static functions 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/ 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void process_cmd(char *p, unsigned char is_job); 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void job_handler(void *param); 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bdt_log(const char *fmt_str, ...); 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************ 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Externs 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/ 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************ 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Functions 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/ 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************ 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Shutdown helper functions 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/ 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bdt_shutdown(void) 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("shutdown bdroid test app\n"); 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project main_done = 1; 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Android's init.rc does not yet support applying linux capabilities 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void config_permissions(void) 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct __user_cap_header_struct header; 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct __user_cap_data_struct cap; 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("set_aid_and_cap : pid %d, uid %d gid %d", getpid(), getuid(), getgid()); 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project header.pid = 0; 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0); 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project setuid(AID_BLUETOOTH); 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project setgid(AID_BLUETOOTH); 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project header.version = _LINUX_CAPABILITY_VERSION; 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cap.effective = cap.permitted = cap.inheritable = 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1 << CAP_NET_RAW | 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1 << CAP_NET_ADMIN | 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1 << CAP_NET_BIND_SERVICE | 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1 << CAP_SYS_RAWIO | 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1 << CAP_SYS_NICE | 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1 << CAP_SETGID; 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project capset(&header, &cap); 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project setgroups(sizeof(groups)/sizeof(groups[0]), groups); 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Logger API 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bdt_log(const char *fmt_str, ...) 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project static char buffer[1024]; 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project va_list ap; 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project va_start(ap, fmt_str); 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project vsnprintf(buffer, 1024, fmt_str, ap); 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project va_end(ap); 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fprintf(stdout, "%s\n", buffer); 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Misc helper functions 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const char* dump_bt_status(bt_status_t status) 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(status) 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BT_STATUS_SUCCESS) 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BT_STATUS_FAIL) 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BT_STATUS_NOT_READY) 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BT_STATUS_NOMEM) 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BT_STATUS_BUSY) 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BT_STATUS_UNSUPPORTED) 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "unknown status code"; 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hex_dump(char *msg, void *data, int size, int trunc) 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project unsigned char *p = data; 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project unsigned char c; 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int n; 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char bytestr[4] = {0}; 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char addrstr[10] = {0}; 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char hexstr[ 16*3 + 5] = {0}; 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char charstr[16*1 + 5] = {0}; 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("%s \n", msg); 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* truncate */ 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(trunc && (size>32)) 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project size = 32; 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(n=1;n<=size;n++) { 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (n%16 == 1) { 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store address for this line */ 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project snprintf(addrstr, sizeof(addrstr), "%.4x", 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((unsigned int)p-(unsigned int)data) ); 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project c = *p; 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (isalnum(c) == 0) { 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project c = '.'; 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store hex str (for left side) */ 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project snprintf(bytestr, sizeof(bytestr), "%02X ", *p); 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project strncat(hexstr, bytestr, sizeof(hexstr)-strlen(hexstr)-1); 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store char str (for right side) */ 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project snprintf(bytestr, sizeof(bytestr), "%c", c); 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project strncat(charstr, bytestr, sizeof(charstr)-strlen(charstr)-1); 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(n%16 == 0) { 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* line completed */ 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("[%4.4s] %-50.50s %s\n", addrstr, hexstr, charstr); 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hexstr[0] = 0; 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project charstr[0] = 0; 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } else if(n%8 == 0) { 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* half line: add whitespaces */ 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project strncat(hexstr, " ", sizeof(hexstr)-strlen(hexstr)-1); 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project strncat(charstr, " ", sizeof(charstr)-strlen(charstr)-1); 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p++; /* next byte */ 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (strlen(hexstr) > 0) { 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* print rest of buffer if not empty */ 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("[%4.4s] %-50.50s %s\n", addrstr, hexstr, charstr); 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Console helper functions 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid skip_blanks(char **p) 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (**p == ' ') 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p)++; 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectuint32_t get_int(char **p, int DefaultValue) 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uint32_t Value = 0; 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project unsigned char UseDefault; 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UseDefault = 1; 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project skip_blanks(p); 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while ( ((**p)<= '9' && (**p)>= '0') ) 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project Value = Value * 10 + (**p) - '0'; 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UseDefault = 0; 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p)++; 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (UseDefault) 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return DefaultValue; 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return Value; 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint get_signed_int(char **p, int DefaultValue) 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int Value = 0; 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project unsigned char UseDefault; 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project unsigned char NegativeNum = 0; 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UseDefault = 1; 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project skip_blanks(p); 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (**p) == '-') 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NegativeNum = 1; 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p)++; 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while ( ((**p)<= '9' && (**p)>= '0') ) 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project Value = Value * 10 + (**p) - '0'; 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UseDefault = 0; 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p)++; 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (UseDefault) 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return DefaultValue; 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ((NegativeNum == 0)? Value : -Value); 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid get_str(char **p, char *Buffer) 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project skip_blanks(p); 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (**p != 0 && **p != ' ') 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *Buffer = **p; 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p)++; 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project Buffer++; 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *Buffer = 0; 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectuint32_t get_hex(char **p, int DefaultValue) 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uint32_t Value = 0; 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project unsigned char UseDefault; 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UseDefault = 1; 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project skip_blanks(p); 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while ( ((**p)<= '9' && (**p)>= '0') || 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((**p)<= 'f' && (**p)>= 'a') || 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((**p)<= 'F' && (**p)>= 'A') ) 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (**p >= 'a') 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project Value = Value * 16 + (**p) - 'a' + 10; 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (**p >= 'A') 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project Value = Value * 16 + (**p) - 'A' + 10; 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project Value = Value * 16 + (**p) - '0'; 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UseDefault = 0; 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p)++; 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (UseDefault) 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return DefaultValue; 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return Value; 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid get_bdaddr(const char *str, bt_bdaddr_t *bd) { 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *d = ((char *)bd), *endp; 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(i = 0; i < 6; i++) { 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *d++ = strtol(str, &endp, 16); 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (*endp != ':' && i != 5) { 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(bd, 0, sizeof(bt_bdaddr_t)); 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project str = endp + 1; 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define is_cmd(str) ((strlen(str) == strlen(cmd)) && strncmp((const char *)&cmd, str, strlen(str)) == 0) 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define if_cmd(str) if (is_cmd(str)) 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef void (t_console_cmd_handler) (char *p); 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct { 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project const char *name; 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project t_console_cmd_handler *handler; 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project const char *help; 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project unsigned char is_job; 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} t_cmd; 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst t_cmd console_cmd_list[]; 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int console_cmd_maxlen = 0; 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void cmdjob_handler(void *param) 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *job_cmd = (char*)param; 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("cmdjob starting (%s)", job_cmd); 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project process_cmd(job_cmd, 1); 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("cmdjob terminating"); 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project free(job_cmd); 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int create_cmdjob(char *cmd) 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_t thread_id; 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *job_cmd; 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project job_cmd = malloc(strlen(cmd)+1); /* freed in job handler */ 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project strcpy(job_cmd, cmd); 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pthread_create(&thread_id, NULL, 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (void*)cmdjob_handler, (void*)job_cmd)!=0) 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project perror("pthread_create"); 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return 0; 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Load stack lib 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint HAL_load(void) 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int err = 0; 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hw_module_t* module; 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hw_device_t* device; 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("Loading HAL lib + extensions"); 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project err = hw_get_module(BT_HARDWARE_MODULE_ID, (hw_module_t const**)&module); 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (err == 0) 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project err = module->methods->open(module, BT_HARDWARE_MODULE_ID, &device); 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (err == 0) { 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bt_device = (bluetooth_device_t *)device; 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sBtInterface = bt_device->get_bluetooth_interface(); 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("HAL library loaded (%s)", strerror(err)); 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return err; 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint HAL_unload(void) 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int err = 0; 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("Unloading HAL lib"); 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sBtInterface = NULL; 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("HAL library unloaded (%s)", strerror(err)); 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return err; 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** HAL test functions & callbacks 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid setup_test_env(void) 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i = 0; 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (console_cmd_list[i].name != NULL) 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project console_cmd_maxlen = MAX(console_cmd_maxlen, (int)strlen(console_cmd_list[i].name)); 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i++; 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid check_return_status(bt_status_t status) 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BT_STATUS_SUCCESS) 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("HAL REQUEST FAILED status : %d (%s)", status, dump_bt_status(status)); 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("HAL REQUEST SUCCESS"); 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void adapter_state_changed(bt_state_t state) 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("ADAPTER STATE UPDATED : %s", (state == BT_STATE_OFF)?"OFF":"ON"); 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (state == BT_STATE_ON) { 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bt_enabled = 1; 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } else { 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bt_enabled = 0; 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void dut_mode_recv(uint16_t opcode, uint8_t *buf, uint8_t len) 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("DUT MODE RECV : NOT IMPLEMENTED"); 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 477ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void le_test_mode(bt_status_t status, uint16_t packet_count) 478ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 479ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bdt_log("LE TEST MODE END status:%s number_of_packets:%d", dump_bt_status(status), packet_count); 480ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 481ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic bt_callbacks_t bt_callbacks = { 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sizeof(bt_callbacks_t), 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project adapter_state_changed, 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, /*adapter_properties_cb */ 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, /* remote_device_properties_cb */ 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, /* device_found_cb */ 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, /* discovery_state_changed_cb */ 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, /* pin_request_cb */ 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, /* ssp_request_cb */ 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, /*bond_state_changed_cb */ 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, /* acl_state_changed_cb */ 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, /* thread_evt_cb */ 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dut_mode_recv, /*dut_mode_recv_cb */ 495fc4b2f1953dbe60464d0f5ef7daaa10001fbc62fMatthew Xie// NULL, /*authorize_request_cb */ 496fc4b2f1953dbe60464d0f5ef7daaa10001fbc62fMatthew Xie#if BLE_INCLUDED == TRUE 497ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta le_test_mode /* le_test_mode_cb */ 498fc4b2f1953dbe60464d0f5ef7daaa10001fbc62fMatthew Xie#else 499fc4b2f1953dbe60464d0f5ef7daaa10001fbc62fMatthew Xie NULL 500fc4b2f1953dbe60464d0f5ef7daaa10001fbc62fMatthew Xie#endif 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bdt_init(void) 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("INIT BT "); 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = sBtInterface->init(&bt_callbacks); 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project check_return_status(status); 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bdt_enable(void) 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("ENABLE BT"); 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bt_enabled) { 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("Bluetooth is already enabled"); 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = sBtInterface->enable(); 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project check_return_status(status); 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bdt_disable(void) 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("DISABLE BT"); 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bt_enabled) { 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("Bluetooth is already disabled"); 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = sBtInterface->disable(); 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project check_return_status(status); 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bdt_dut_mode_configure(char *p) 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int32_t mode = -1; 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("BT DUT MODE CONFIGURE"); 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bt_enabled) { 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("Bluetooth must be enabled for test_mode to work."); 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mode = get_signed_int(&p, mode); 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((mode != 0) && (mode != 1)) { 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("Please specify mode: 1 to enter, 0 to exit"); 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = sBtInterface->dut_mode_configure(mode); 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project check_return_status(status); 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 552ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#define HCI_LE_RECEIVER_TEST_OPCODE 0x201D 553ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#define HCI_LE_TRANSMITTER_TEST_OPCODE 0x201E 554ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#define HCI_LE_END_TEST_OPCODE 0x201F 555ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 556ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid bdt_le_test_mode(char *p) 557ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 558ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta int cmd; 559ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta unsigned char buf[3]; 560ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta int arg1, arg2, arg3; 561ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 562ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bdt_log("BT LE TEST MODE"); 563ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!bt_enabled) { 564ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bdt_log("Bluetooth must be enabled for le_test to work."); 565ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 566ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 567ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 568ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta memset(buf, 0, sizeof(buf)); 569ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta cmd = get_int(&p, 0); 570ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta switch (cmd) 571ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 572ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta case 0x1: /* RX TEST */ 573ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta arg1 = get_int(&p, -1); 574ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (arg1 < 0) bdt_log("%s Invalid arguments", __FUNCTION__); 575ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta buf[0] = arg1; 576ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta status = sBtInterface->le_test_mode(HCI_LE_RECEIVER_TEST_OPCODE, buf, 1); 577ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 578ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta case 0x2: /* TX TEST */ 579ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta arg1 = get_int(&p, -1); 580ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta arg2 = get_int(&p, -1); 581ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta arg3 = get_int(&p, -1); 582ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((arg1 < 0) || (arg2 < 0) || (arg3 < 0)) 583ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bdt_log("%s Invalid arguments", __FUNCTION__); 584ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta buf[0] = arg1; 585ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta buf[1] = arg2; 586ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta buf[2] = arg3; 587ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta status = sBtInterface->le_test_mode(HCI_LE_TRANSMITTER_TEST_OPCODE, buf, 3); 588ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 589ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta case 0x3: /* END TEST */ 590ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta status = sBtInterface->le_test_mode(HCI_LE_END_TEST_OPCODE, buf, 0); 591ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 592ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta default: 593ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bdt_log("Unsupported command"); 594ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 595ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 596ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 597ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (status != BT_STATUS_SUCCESS) 598ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 599ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bdt_log("%s Test 0x%x Failed with status:0x%x", __FUNCTION__, cmd, status); 600ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 601ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 602ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 603ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bdt_cleanup(void) 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("CLEANUP"); 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sBtInterface->cleanup(); 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Console commands 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid do_help(char *p) 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i = 0; 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int max = 0; 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char line[128]; 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int pos = 0; 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (console_cmd_list[i].name != NULL) 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pos = sprintf(line, "%s", (char*)console_cmd_list[i].name); 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("%s %s\n", (char*)line, (char*)console_cmd_list[i].help); 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i++; 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid do_quit(char *p) 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_shutdown(); 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************* 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * BT TEST CONSOLE COMMANDS 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Parses argument lists and passes to API test function 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid do_init(char *p) 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_init(); 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid do_enable(char *p) 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_enable(); 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid do_disable(char *p) 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_disable(); 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid do_dut_mode_configure(char *p) 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_dut_mode_configure(p); 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 661ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid do_le_test_mode(char *p) 662ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 663ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bdt_le_test_mode(p); 664ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 665ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid do_cleanup(char *p) 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_cleanup(); 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************* 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * CONSOLE COMMAND TABLE 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst t_cmd console_cmd_list[] = 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * INTERNAL 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { "help", do_help, "lists all available console commands", 0 }, 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { "quit", do_quit, "", 0}, 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * API CONSOLE COMMANDS 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Init and Cleanup shall be called automatically */ 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { "enable", do_enable, ":: enables bluetooth", 0 }, 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { "disable", do_disable, ":: disables bluetooth", 0 }, 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { "dut_mode_configure", do_dut_mode_configure, ":: DUT mode - 1 to enter,0 to exit", 0 }, 694ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { "le_test_mode", do_le_test_mode, ":: LE Test Mode - RxTest - 1 <rx_freq>, \n\t \ 695ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta TxTest - 2 <tx_freq> <test_data_len> <payload_pattern>, \n\t \ 696ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta End Test - 3 <no_args>", 0 }, 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add here */ 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* last entry */ 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {NULL, NULL, "", 0}, 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Main console command handler 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void process_cmd(char *p, unsigned char is_job) 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char cmd[64]; 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i = 0; 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *p_saved = p; 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project get_str(&p, cmd); 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* table commands */ 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (console_cmd_list[i].name != NULL) 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_cmd(console_cmd_list[i].name)) 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!is_job && console_cmd_list[i].is_job) 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project create_cmdjob(p_saved); 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project console_cmd_list[i].handler(p); 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i++; 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("%s : unknown command\n", p_saved); 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project do_help(NULL); 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint main (int argc, char * argv[]) 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int opt; 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char cmd[128]; 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int args_processed = 0; 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int pid = -1; 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project config_permissions(); 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log("\n:::::::::::::::::::::::::::::::::::::::::::::::::::"); 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log(":: Bluedroid test app starting"); 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( HAL_load() < 0 ) { 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project perror("HAL failed to initialize, exit\n"); 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project unlink(PID_FILE); 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project exit(0); 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project setup_test_env(); 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Automatically perform the init */ 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_init(); 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while(!main_done) 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char line[128]; 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* command prompt */ 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project printf( ">" ); 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fflush(stdout); 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fgets (line, 128, stdin); 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (line[0]!= '\0') 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove linefeed */ 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project line[strlen(line)-1] = 0; 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project process_cmd(line, 0); 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(line, '\0', 128); 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* FIXME: Commenting this out as for some reason, the application does not exit otherwise*/ 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project //bdt_cleanup(); 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HAL_unload(); 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdt_log(":: Bluedroid test app terminating"); 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return 0; 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 785