From d9414ffb28843feecc4470b315224cd017dee1c8 Mon Sep 17 00:00:00 2001 From: Pawit Pornkitprasan Date: Sun, 24 Jul 2011 14:51:54 +0200 Subject: [PATCH] Enable proper bluetooth MAC address on c1 devices The approach here is to used bdaddr_read.c to read the MAC address (it's in a different format than ro.bt.bdaddr_path accepts) at /efs/imei/bt.txt and write it to /data/bdaddr and set ro.bt.bdaddr_path there. This approach was used with device/lge/thunderg and bdaddr_read.c was adapted from there. --- bdaddr_read/Android.mk | 28 ++++++++++++++++++++ bdaddr_read/bdaddr_read.c | 54 +++++++++++++++++++++++++++++++++++++++ common.mk | 3 ++- init.rc | 9 +++++++ 4 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 bdaddr_read/Android.mk create mode 100644 bdaddr_read/bdaddr_read.c diff --git a/bdaddr_read/Android.mk b/bdaddr_read/Android.mk new file mode 100644 index 0000000..46f95cd --- /dev/null +++ b/bdaddr_read/Android.mk @@ -0,0 +1,28 @@ +# Copyright (C) 2010 Ricardo Cerqueira +# Copyright (C) 2011 Pawit Pornkitprasan +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := optional + +LOCAL_SRC_FILES := bdaddr_read.c + +LOCAL_SHARED_LIBRARIES := libcutils + +LOCAL_MODULE := bdaddr_read + +include $(BUILD_EXECUTABLE) + diff --git a/bdaddr_read/bdaddr_read.c b/bdaddr_read/bdaddr_read.c new file mode 100644 index 0000000..c6e08c9 --- /dev/null +++ b/bdaddr_read/bdaddr_read.c @@ -0,0 +1,54 @@ +#include +#include +#include +#include + +#define LOG_TAG "bdaddr" +#define SAMSUNG_BDADDR_PATH "/efs/imei/bt.txt" +#define BDADDR_PATH "/data/bdaddr" + +/* Read bluetooth MAC from SAMSUNG_BDADDR_PATH (different format), + * write it to BDADDR_PATH, and set ro.bt.bdaddr_path to BDADDR_PATH + * + * Adapted from bdaddr_read.c of thunderg + */ + +int main() { + char tmpbdaddr[23]; // bt_macaddr:xxxxxxxxxxxx + char bdaddr[18]; + int count; + int fd; + + fd = open(SAMSUNG_BDADDR_PATH, O_RDONLY); + if(fd < 0) { + fprintf(stderr, "open(%s) failed\n", SAMSUNG_BDADDR_PATH); + LOGE("Can't open %s\n", SAMSUNG_BDADDR_PATH); + return -1; + } + + count = read(fd, tmpbdaddr, sizeof(tmpbdaddr)); + if (count < 0) { + fprintf(stderr, "read(%s) failed\n", SAMSUNG_BDADDR_PATH); + LOGE("Can't read %s\n", SAMSUNG_BDADDR_PATH); + return -1; + } + else if (count != sizeof(tmpbdaddr)) { + fprintf(stderr, "read(%s) unexpected size %d\n", SAMSUNG_BDADDR_PATH, count); + LOGE("Error reading %s (unexpected size %d)\n", SAMSUNG_BDADDR_PATH, count); + return -1; + } + + count = sprintf(bdaddr, "%2.2s:%2.2s:%2.2s:%2.2s:%2.2s:%2.2s\0", + tmpbdaddr+11,tmpbdaddr+13,tmpbdaddr+15,tmpbdaddr+17,tmpbdaddr+19,tmpbdaddr+21); + + fd = open(BDADDR_PATH, O_WRONLY|O_CREAT|O_TRUNC, 00600|00060|00006); + if (fd < 0) { + fprintf(stderr, "open(%s) failed\n", BDADDR_PATH); + LOGE("Can't open %s\n", BDADDR_PATH); + return -2; + } + write(fd, bdaddr, 18); + close(fd); + property_set("ro.bt.bdaddr_path", BDADDR_PATH); + return 0; +} diff --git a/common.mk b/common.mk index 323ceed..6a2f2c1 100644 --- a/common.mk +++ b/common.mk @@ -49,7 +49,8 @@ PRODUCT_PACKAGES := \ libstagefrighthw \ libexifa \ libjpega \ - com.android.future.usb.accessory + com.android.future.usb.accessory \ + bdaddr_read # These are the hardware-specific configuration files PRODUCT_COPY_FILES := \ diff --git a/init.rc b/init.rc index 601d90b..536be8e 100644 --- a/init.rc +++ b/init.rc @@ -681,6 +681,15 @@ service bluetoothd /system/bin/bluetoothd -n group bluetooth net_bt_admin misc disabled +# bluetooth mac address +service bdaddr /system/bin/bdaddr_read + user root + disabled + oneshot + +on property:init.svc.bootanim=running + start bdaddr + service installd /system/bin/installd socket installd stream 600 system system