mako: bluetooth: Implement BT DUT mode
add codes to read bd addr property for DUT mode
Change-Id: I885d15bd14dfb1c81d5bc2c7a7a4479f3b86aa87
diff --git a/bdAddrLoader/addrloader.c b/bdAddrLoader/addrloader.c
index b1d2d81..be0d5b1 100644
--- a/bdAddrLoader/addrloader.c
+++ b/bdAddrLoader/addrloader.c
@@ -32,12 +32,46 @@
#define BD_ADDR_LEN 6
#define BD_ADDR_STR_LEN 18
-#define FTM_PATH_COMMON "/persist"
-#define FTM_PATH_BT_ADDR "bluetooth/.bdaddr"
-#define FTM_PATH_WIFI_ADDR "wifi/.wlanaddr"
+
+#define ARG_TYPE_PATH_FILE 0x11
+#define ARG_TYPE_PATH_PROP 0x12
+
+#define ARG_TYPE_DATA_HEX 0x21
+#define ARG_TYPE_DATA_ASCII 0x22
+
+typedef struct _ArgEl
+{
+ const char *szSrc; // Source Path
+ int nPathType; // Type of Source Path
+ int nDataType; // Type of Data
+}ArgEl;
+
+typedef ArgEl InArg;
#define DEFAULT_BDADDR_PROP "persist.service.bdroid.bdaddr"
+typedef struct _OutArg
+{
+ ArgEl dest;
+ char cSeperator; // a character to be used for sperating like ':' of "XX:XX:XX:XX:XX:XX"
+ char bPrintOut; // Print out bd addr in standard out or not
+}OutArg;
+
+typedef struct _LoadedData
+{
+ union {
+ unsigned char bin[BD_ADDR_LEN];
+ char sz[BD_ADDR_STR_LEN];
+ }data;
+ int nDataType;
+}LoadedBDAddr;
+
+typedef enum _res
+{
+ SUCCESS = 0,
+ FAIL
+}Res;
+
int hexa_to_ascii(const unsigned char* hexa, char* ascii, int nHexLen)
{
int i, j;
@@ -51,7 +85,9 @@
ascii[nHexLen*2] = '\0';
- return 0;
+ ALOGI("hex_to_ascii() - converted Data (%s)", ascii);
+
+ return SUCCESS;
}
int readBDAddrData(const char* szFilePath, unsigned char* addrData, int nDataLen)
@@ -62,16 +98,16 @@
if(nFd < 0){
ALOGW("There is no Address File in FTM area : %s\n", szFilePath);
- return 1;
+ return FAIL;
}
nRdCnt = read(nFd, addrData, nDataLen);
if(nRdCnt != nDataLen){
ALOGE("Fail to read Address data from FTM area\n");
close(nFd);
- return 1;
+ return FAIL;
}
- return 0;
+ return SUCCESS;
}
void formattingBdAddr(char *szBDAddr, const char cSep)
@@ -87,27 +123,149 @@
}
}
+int readBDAddr(InArg inArg, LoadedBDAddr *loadedBDAddr)
+{
+ Res res = FAIL;
+ unsigned char addrData[BD_ADDR_LEN] = {0,};
+ int nDataLen = 0;
+
+ ALOGI("Read From %s by Path type(0x%2x), Data type (0x%2x)", inArg.szSrc, inArg.nPathType, inArg.nDataType);
+
+
+ if(inArg.nPathType == ARG_TYPE_PATH_FILE){
+ switch(inArg.nDataType){
+ case ARG_TYPE_DATA_HEX:
+ if(!readBDAddrData(inArg.szSrc, loadedBDAddr->data.bin, BD_ADDR_LEN)){
+ loadedBDAddr->nDataType = ARG_TYPE_DATA_HEX;
+ return SUCCESS;
+ }
+ break;
+ case ARG_TYPE_DATA_ASCII:
+ if(!readBDAddrData(inArg.szSrc, (unsigned char *)loadedBDAddr->data.sz, BD_ADDR_STR_LEN)){
+ loadedBDAddr->nDataType = ARG_TYPE_DATA_ASCII;
+ return SUCCESS;
+ }
+ break;
+ default:
+ return FAIL;
+ }
+ }else if(inArg.nPathType == ARG_TYPE_PATH_PROP){
+ switch(inArg.nDataType){
+ case ARG_TYPE_DATA_HEX:
+ if(property_get(inArg.szSrc, (char *)loadedBDAddr->data.bin, "")>=0){
+ loadedBDAddr->nDataType = ARG_TYPE_DATA_HEX;
+ return SUCCESS;
+ }
+ break;
+ case ARG_TYPE_DATA_ASCII:
+ if(property_get(inArg.szSrc, loadedBDAddr->data.sz, "")>=0){
+ loadedBDAddr->nDataType = ARG_TYPE_DATA_ASCII;
+ return SUCCESS;
+ }
+ break;
+ default:
+ return FAIL;
+ }
+ }else{
+ ALOGE("Error invalid argument : (%d)", inArg.nPathType);
+ }
+
+ ALOGE("Fail to read BDAddr from %s", inArg.szSrc);
+ return FAIL;
+}
+
+int writeBDAddr(OutArg outArg, LoadedBDAddr *loadedBDAddr)
+{
+ char szTmp[BD_ADDR_STR_LEN] = {0,};
+
+ ALOGI("Output Data type(0x%2x), bPrintout(%d), bPath(%s)",
+ outArg.dest.nDataType, outArg.bPrintOut, outArg.dest.szSrc);
+
+ ALOGI("Loaded Data type(0x%2x)", loadedBDAddr->nDataType);
+
+ if(outArg.dest.nDataType == ARG_TYPE_DATA_ASCII
+ && loadedBDAddr->nDataType == ARG_TYPE_DATA_HEX
+ ){
+ if(!hexa_to_ascii(loadedBDAddr->data.bin, szTmp, BD_ADDR_LEN)){
+ memcpy(loadedBDAddr->data.sz, szTmp, BD_ADDR_STR_LEN);
+ loadedBDAddr->nDataType = ARG_TYPE_DATA_ASCII;
+ }
+ else{
+ ALOGE("Fail to convert data");
+ return FAIL;
+ }
+ }
+
+ if(loadedBDAddr->nDataType == ARG_TYPE_DATA_ASCII){
+ // check out which addr data is already formated
+ if(strchr(loadedBDAddr->data.sz, '.') == NULL
+ && strchr(loadedBDAddr->data.sz, ':') == NULL
+ ){
+ formattingBdAddr(loadedBDAddr->data.sz, outArg.cSeperator);
+ }
+ }
+ // print out szBDAddr
+ if(outArg.bPrintOut
+ && loadedBDAddr->nDataType == ARG_TYPE_DATA_ASCII
+ && strlen(loadedBDAddr->data.sz)==(BD_ADDR_STR_LEN-1)) {
+ printf("%s",loadedBDAddr->data.sz);
+ if (property_set(DEFAULT_BDADDR_PROP, loadedBDAddr->data.sz) < 0)
+ ALOGE("Failed to set address in prop %s", DEFAULT_BDADDR_PROP);
+ }
+ else{
+ ALOGE("Invalid Data is loaded : %s", loadedBDAddr->data.sz);
+ return FAIL;
+ }
+ // TODO :: writing File or Property
+ return SUCCESS;
+}
+
int main(int argc, char *argv[])
{
int nFd, nRdCnt;
- char szFilePath[FILE_PATH_MAX] = {0,};
- unsigned char addrData[BD_ADDR_LEN] = {0,};
- char szBDAddr[BD_ADDR_STR_LEN] = {0,};
- char *szBDAddrPath = NULL;
- char *szProperty = NULL;
- char bStdOut = 0;
int c;
- while((c=getopt(argc, argv, ":i:o:p")) != -1){
+ InArg inArg;
+ OutArg outArg;
+ LoadedBDAddr loadedBDAddr;
+
+ //initialize arg
+ memset(&inArg, 0, sizeof(InArg));
+ memset(&outArg, 0, sizeof(OutArg));
+ memset(&loadedBDAddr, 0, sizeof(LoadedBDAddr));
+
+ //load args;
+ while((c=getopt(argc, argv, ":f:p:hsx")) != -1){
switch(c){
- case 'i': // input file path
- szBDAddrPath = optarg;
+ case 'f': // input path
+ if(optarg != NULL){
+ ALOGI("option : f=%s", optarg);
+ inArg.szSrc = optarg;
+ }else{
+ ALOGW("Invalid Argument(%s) of input path", optarg);
+ }
+ inArg.nPathType = ARG_TYPE_PATH_FILE;
break;
- case 'o': // output : property name
- szProperty = optarg;
+ case 'p': // output path
+ if(optarg != NULL){
+ ALOGI("option : p=%s", optarg);
+ inArg.szSrc = optarg;
+ }else{
+ ALOGW("Invalid Argument(%s) of out Path", optarg);
+ }
+ inArg.nPathType = ARG_TYPE_PATH_PROP;
break;
- case 'p':
- bStdOut = 1;
+ case 'h': // data type to be read is hex
+ ALOGI("option : h");
+ inArg.nDataType = ARG_TYPE_DATA_HEX;
+ break;
+ case 's': // data type to be read is ascii
+ ALOGI("option : s");
+ inArg.nDataType = ARG_TYPE_DATA_ASCII;
+ break;
+ case 'x':
+ ALOGI("option : x");
+ outArg.bPrintOut = 1; //true
break;
default:
ALOGW("Unknown option : %c", c);
@@ -115,26 +273,20 @@
}
}
- if(szBDAddrPath == NULL){
- //set default bd address path
- sprintf(szFilePath, "%s/%s", FTM_PATH_COMMON, FTM_PATH_BT_ADDR);
- szBDAddrPath = szFilePath;
+ // setting up Arguments with default value
+ outArg.cSeperator = ':';
+ outArg.dest.nDataType = ARG_TYPE_DATA_ASCII;
+
+ // load bd addr and print out bd addr in formated ascii
+ if(readBDAddr(inArg, &loadedBDAddr)){
+ ALOGE("Fail to load data !!");
+ return FAIL;
}
- if(!readBDAddrData(szBDAddrPath, addrData, BD_ADDR_LEN)){
- if(!hexa_to_ascii(addrData, szBDAddr, BD_ADDR_LEN)){
- formattingBdAddr(szBDAddr, ':');
- // write loaded bdaddr to property
- if(szProperty != NULL) property_set(szProperty, szBDAddr);
- // print out szBDAddr
- if(bStdOut) printf("%s",szBDAddr);
- if (property_set(DEFAULT_BDADDR_PROP, szBDAddr) < 0)
- ALOGE("Failed to set address in prop %s", DEFAULT_BDADDR_PROP);
- return 0;
- }
- else{
- ALOGE("Fail to convert data from hex to ascii");
- }
+ if(writeBDAddr(outArg, &loadedBDAddr)){
+ ALOGE("Fail to write data !!");
+ return FAIL;
}
+
return 1;
}
diff --git a/init.mako.bt.sh b/init.mako.bt.sh
index 0111434..4fdd065 100644
--- a/init.mako.bt.sh
+++ b/init.mako.bt.sh
@@ -25,12 +25,19 @@
POWER_CLASS=`getprop qcom.bt.dev_power_class`
TRANSPORT=`getprop ro.qualcomm.bt.hci_transport`
+DUTADDR=`getprop net.btdut.address`
#find the transport type
logi "Transport : $TRANSPORT"
+logi "DUTADDR : $DUTADDR"
#load bd addr
-BDADDR=`/system/bin/bdAddrLoader -p`
+if [$DUTADDR == ""]
+then
+BDADDR=`/system/bin/bdAddrLoader -f /persist/bluetooth/.bdaddr -h -x`
+else
+BDADDR=`/system/bin/bdAddrLoader -p net.btdut.address -s -x`
+fi
setprop bluetooth.status off
@@ -48,15 +55,15 @@
logi "Power Class: To override, Before turning BT ON; setprop qcom.bt.dev_power_class <1 or 2 or 3>";;
esac
-if ["$BDADDR" == ""]
+if [$BDADDR == ""]
then
- logwrapper /system/bin/hci_qcomm_init -e $PWR_CLASS -vv
+logwrapper /system/bin/hci_qcomm_init -e $PWR_CLASS -vv
else
- logwrapper /system/bin/hci_qcomm_init -b $BDADDR -e $PWR_CLASS -vv
+logwrapper /system/bin/hci_qcomm_init -b $BDADDR -e $PWR_CLASS -vv
fi
case $? in
- 0) logi "Bluetooth QSoC firmware download succeeded, $BTS_DEVICE $BTS_TYPE $BTS_BAUD $BTS_ADDRESS";;
+ 0) logi "Bluetooth QSoC firmware download succeeded, $PWR_CLASS $BDADDR $TRANSPORT";;
*) failed "Bluetooth QSoC firmware download failed" $exit_code_hci_qcomm_init;
setprop bluetooth.status off;
exit $exit_code_hci_qcomm_init;;
diff --git a/init.mako.rc b/init.mako.rc
index 25d20ff..8fb269b 100644
--- a/init.mako.rc
+++ b/init.mako.rc
@@ -407,7 +407,7 @@
group system wifi
oneshot
-service bdAddrLoader /system/bin/bdAddrLoader -p
+service bdAddrLoader /system/bin/bdAddrLoader -f /persist/bluetooth/.bdaddr -h -x
class main
user bluetooth
group system bluetooth