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