All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC 1/3] android: Update HAL API to Android 4.4.3-r1.1
@ 2014-06-11 11:30 Szymon Janc
  2014-06-11 11:31 ` [RFC 2/3] android/gatt: Update set_adv_data IPC to HAL API change Szymon Janc
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Szymon Janc @ 2014-06-11 11:30 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Szymon Janc

---
 android/hal-gatt.c                | 4 +++-
 android/hardware/bt_gatt_client.h | 4 +++-
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/android/hal-gatt.c b/android/hal-gatt.c
index 6f0d2c5..a4ad0f2 100644
--- a/android/hal-gatt.c
+++ b/android/hal-gatt.c
@@ -975,7 +975,9 @@ static bt_status_t set_adv_data(int server_if, bool set_scan_rsp,
 				bool include_name, bool include_txpower,
 				int min_interval, int max_interval,
 				int appearance, uint16_t manufacturer_len,
-				char *manufacturer_data)
+				char *manufacturer_data,
+				uint16_t service_data_len, char *service_data,
+				uint16_t service_uuid_len, char *service_uuid)
 {
 	char buf[IPC_MTU];
 	struct hal_cmd_gatt_client_set_adv_data *cmd = (void *) buf;
diff --git a/android/hardware/bt_gatt_client.h b/android/hardware/bt_gatt_client.h
index d6b0cb4..cf4fabe 100644
--- a/android/hardware/bt_gatt_client.h
+++ b/android/hardware/bt_gatt_client.h
@@ -278,7 +278,9 @@ typedef struct {
     /** Set the advertising data or scan response data */
     bt_status_t (*set_adv_data)(int server_if, bool set_scan_rsp, bool include_name,
                     bool include_txpower, int min_interval, int max_interval, int appearance,
-                    uint16_t manufacturer_len, char* manufacturer_data);
+                    uint16_t manufacturer_len, char* manufacturer_data,
+                    uint16_t service_data_len, char* service_data,
+                    uint16_t service_uuid_len, char* service_uuid);
 
     /** Test mode interface */
     bt_status_t (*test_command)( int command, btgatt_test_params_t* params);
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [RFC 2/3] android/gatt: Update set_adv_data IPC to HAL API change
  2014-06-11 11:30 [RFC 1/3] android: Update HAL API to Android 4.4.3-r1.1 Szymon Janc
@ 2014-06-11 11:31 ` Szymon Janc
  2014-06-11 11:31 ` [RFC 3/3] android: Re-enable support for Android 4.4.2 Szymon Janc
  2014-06-12 10:21 ` [RFC 1/3] android: Update HAL API to Android 4.4.3-r1.1 Szymon Janc
  2 siblings, 0 replies; 4+ messages in thread
From: Szymon Janc @ 2014-06-11 11:31 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Szymon Janc

---
 android/gatt.c     | 19 +++++++++----------
 android/hal-gatt.c | 28 ++++++++++++++++++++++++++--
 android/hal-msg.h  |  4 +++-
 3 files changed, 38 insertions(+), 13 deletions(-)

diff --git a/android/gatt.c b/android/gatt.c
index 558b203..649a482 100644
--- a/android/gatt.c
+++ b/android/gatt.c
@@ -3464,19 +3464,18 @@ static void handle_client_set_adv_data(const void *buf, uint16_t len)
 		return;
 	}
 
-	DBG("scan_rsp=%u name=%u tx=%u min=%d max=%d app=%d manufacturer=%u",
+	DBG("scan_rsp=%u name=%u tx=%u min=%d max=%d app=%d",
 		cmd->set_scan_rsp, cmd->include_name, cmd->include_txpower,
-		cmd->min_interval, cmd->max_interval, cmd->appearance,
-		cmd->manufacturer_len);
+		cmd->min_interval, cmd->max_interval, cmd->appearance);
 
-	/*
-	 * TODO
-	 * Currently kernel is setting all except for vendor data.
-	 * This should be implemented when kernel supports it.
-	 */
+	DBG("manufacturer=%u service_data=%u service_uuid=%u",
+				cmd->manufacturer_len, cmd->service_data_len,
+				cmd->service_uuid_len);
 
-	if (cmd->manufacturer_len) {
-		error("gatt: Manufacturer advertising data not supported");
+	/* TODO This should be implemented when kernel supports it */
+	if (cmd->manufacturer_len || cmd->service_data_len ||
+							cmd->service_uuid_len) {
+		error("gatt: Extra advertising data not supported");
 		status = HAL_STATUS_FAILED;
 		goto failed;
 	}
diff --git a/android/hal-gatt.c b/android/hal-gatt.c
index a4ad0f2..a8f5bd1 100644
--- a/android/hal-gatt.c
+++ b/android/hal-gatt.c
@@ -981,11 +981,18 @@ static bt_status_t set_adv_data(int server_if, bool set_scan_rsp,
 {
 	char buf[IPC_MTU];
 	struct hal_cmd_gatt_client_set_adv_data *cmd = (void *) buf;
-	size_t cmd_len = sizeof(*cmd) + manufacturer_len;
+	size_t cmd_len;
+	uint8_t *data;
 
 	if (!interface_ready())
 		return BT_STATUS_NOT_READY;
 
+	cmd_len = sizeof(*cmd) + manufacturer_len + service_data_len +
+							service_uuid_len;
+
+	if (cmd_len > IPC_MTU)
+		return BT_STATUS_FAIL;
+
 	cmd->server_if = server_if;
 	cmd->set_scan_rsp = set_scan_rsp;
 	cmd->include_name = include_name;
@@ -994,8 +1001,25 @@ static bt_status_t set_adv_data(int server_if, bool set_scan_rsp,
 	cmd->max_interval = max_interval;
 	cmd->appearance = appearance;
 	cmd->manufacturer_len = manufacturer_len;
+	cmd->service_data_len = service_data_len;
+	cmd->service_uuid_len = service_uuid_len;
+
+	data = cmd->data;
+
+	if (manufacturer_data && manufacturer_len) {
+		memcpy(data, manufacturer_data, manufacturer_len);
+		data += manufacturer_len;
+	}
+
+	if (service_data && service_data_len) {
+		memcpy(data, service_data, service_data_len);
+		data += service_data_len;
+	}
 
-	memcpy(cmd->manufacturer_data, manufacturer_data, manufacturer_len);
+	if (service_uuid && service_uuid_len) {
+		memcpy(data, service_uuid, service_uuid_len);
+		data += service_uuid_len;
+	}
 
 	return hal_ipc_cmd(HAL_SERVICE_ID_GATT, HAL_OP_GATT_CLIENT_SET_ADV_DATA,
 						cmd_len, cmd, 0, NULL, NULL);
diff --git a/android/hal-msg.h b/android/hal-msg.h
index 65cf81f..50ae914 100644
--- a/android/hal-msg.h
+++ b/android/hal-msg.h
@@ -745,7 +745,9 @@ struct hal_cmd_gatt_client_set_adv_data {
 	int32_t  max_interval;
 	int32_t  appearance;
 	uint16_t manufacturer_len;
-	uint8_t  manufacturer_data[0];
+	uint16_t service_data_len;
+	uint16_t service_uuid_len;
+	uint8_t  data[0];
 } __attribute__((packed));
 
 #define GATT_CLIENT_TEST_CMD_ENABLE		0x01
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [RFC 3/3] android: Re-enable support for Android 4.4.2
  2014-06-11 11:30 [RFC 1/3] android: Update HAL API to Android 4.4.3-r1.1 Szymon Janc
  2014-06-11 11:31 ` [RFC 2/3] android/gatt: Update set_adv_data IPC to HAL API change Szymon Janc
@ 2014-06-11 11:31 ` Szymon Janc
  2014-06-12 10:21 ` [RFC 1/3] android: Update HAL API to Android 4.4.3-r1.1 Szymon Janc
  2 siblings, 0 replies; 4+ messages in thread
From: Szymon Janc @ 2014-06-11 11:31 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Szymon Janc

Due to very unfortunate change Android 4.4.3-r1.1 BT GATT HAL API is
not backward compatible. This adds support for 4.4.3-r1.1 and 4.4.2.

On android PLATFORM_VERSION is used to determine which API should be
used. On Linux we always build with latest API.
---
 android/Android.mk  |  3 +++
 android/Makefile.am |  3 +++
 android/hal-gatt.c  | 37 ++++++++++++++++++++++++++++++++++++-
 android/hal-utils.h |  2 ++
 4 files changed, 44 insertions(+), 1 deletion(-)

diff --git a/android/Android.mk b/android/Android.mk
index a9a0982..199334f 100644
--- a/android/Android.mk
+++ b/android/Android.mk
@@ -3,12 +3,15 @@ LOCAL_PATH := external/bluetooth
 # Retrieve BlueZ version from configure.ac file
 BLUEZ_VERSION := `grep "^AC_INIT" $(LOCAL_PATH)/bluez/configure.ac | sed -e "s/.*,.\(.*\))/\1/"`
 
+ANDROID_VERSION := `echo $(PLATFORM_VERSION) | awk -F. '{ printf "0x%02d%02d%02d",$$1,$$2,$$3 }'`
+
 # Specify pathmap for glib and sbc
 pathmap_INCL += glib:external/bluetooth/glib \
 		sbc:external/bluetooth/sbc \
 
 # Specify common compiler flags
 BLUEZ_COMMON_CFLAGS := -DVERSION=\"$(BLUEZ_VERSION)\" \
+			-DANDROID_VERSION=$(ANDROID_VERSION) \
 			-DANDROID_STORAGEDIR=\"/data/misc/bluetooth\" \
 
 # Enable warnings enabled in autotools build
diff --git a/android/Makefile.am b/android/Makefile.am
index 3429adb..a9a9e7d 100644
--- a/android/Makefile.am
+++ b/android/Makefile.am
@@ -1,4 +1,7 @@
 if ANDROID
+
+AM_CFLAGS += -DANDROID_VERSION=0xFFFFFF
+
 android_plugindir = $(abs_top_srcdir)/android/.libs
 
 noinst_PROGRAMS += android/system-emulator
diff --git a/android/hal-gatt.c b/android/hal-gatt.c
index a8f5bd1..043c379 100644
--- a/android/hal-gatt.c
+++ b/android/hal-gatt.c
@@ -971,7 +971,7 @@ static int get_device_type(const bt_bdaddr_t *bd_addr)
 	return dev_type;
 }
 
-static bt_status_t set_adv_data(int server_if, bool set_scan_rsp,
+static bt_status_t set_adv_data_real(int server_if, bool set_scan_rsp,
 				bool include_name, bool include_txpower,
 				int min_interval, int max_interval,
 				int appearance, uint16_t manufacturer_len,
@@ -1025,6 +1025,41 @@ static bt_status_t set_adv_data(int server_if, bool set_scan_rsp,
 						cmd_len, cmd, 0, NULL, NULL);
 }
 
+/*
+ * This is temporary solution and support for older Android versions might
+ * be removed at any time.
+ */
+#if ANDROID_VERSION < PLATFORM_VER(4,4,3)
+static bt_status_t set_adv_data(int server_if, bool set_scan_rsp,
+				bool include_name, bool include_txpower,
+				int min_interval, int max_interval,
+				int appearance, uint16_t manufacturer_len,
+				char *manufacturer_data)
+{
+	return set_adv_data_real(server_if, set_scan_rsp, include_name,
+					include_txpower, min_interval,
+					max_interval, appearance,
+					manufacturer_len, manufacturer_data,
+					0, NULL, 0, NULL);
+}
+#else
+static bt_status_t set_adv_data(int server_if, bool set_scan_rsp,
+				bool include_name, bool include_txpower,
+				int min_interval, int max_interval,
+				int appearance, uint16_t manufacturer_len,
+				char *manufacturer_data,
+				uint16_t service_data_len, char *service_data,
+				uint16_t service_uuid_len, char *service_uuid)
+{
+	return set_adv_data_real(server_if, set_scan_rsp, include_name,
+					include_txpower, min_interval,
+					max_interval, appearance,
+					manufacturer_len, manufacturer_data,
+					service_data_len, service_data,
+					service_uuid_len, service_uuid);
+}
+#endif
+
 static bt_status_t test_command(int command, btgatt_test_params_t *params)
 {
 	struct hal_cmd_gatt_client_test_command cmd;
diff --git a/android/hal-utils.h b/android/hal-utils.h
index 8a1d015..0c994ee 100644
--- a/android/hal-utils.h
+++ b/android/hal-utils.h
@@ -17,6 +17,8 @@
 
 #include <hardware/bluetooth.h>
 
+#define PLATFORM_VER(a,b,c) ((a << 16) | ( b << 8) | c)
+
 #define MAX_UUID_STR_LEN	37
 #define HAL_UUID_LEN		16
 #define MAX_ADDR_STR_LEN	18
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [RFC 1/3] android: Update HAL API to Android 4.4.3-r1.1
  2014-06-11 11:30 [RFC 1/3] android: Update HAL API to Android 4.4.3-r1.1 Szymon Janc
  2014-06-11 11:31 ` [RFC 2/3] android/gatt: Update set_adv_data IPC to HAL API change Szymon Janc
  2014-06-11 11:31 ` [RFC 3/3] android: Re-enable support for Android 4.4.2 Szymon Janc
@ 2014-06-12 10:21 ` Szymon Janc
  2 siblings, 0 replies; 4+ messages in thread
From: Szymon Janc @ 2014-06-12 10:21 UTC (permalink / raw)
  To: linux-bluetooth

On Wednesday 11 of June 2014 13:30:59 Szymon Janc wrote:
> ---
>  android/hal-gatt.c                | 4 +++-
>  android/hardware/bt_gatt_client.h | 4 +++-
>  2 files changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/android/hal-gatt.c b/android/hal-gatt.c
> index 6f0d2c5..a4ad0f2 100644
> --- a/android/hal-gatt.c
> +++ b/android/hal-gatt.c
> @@ -975,7 +975,9 @@ static bt_status_t set_adv_data(int server_if, bool set_scan_rsp,
>  				bool include_name, bool include_txpower,
>  				int min_interval, int max_interval,
>  				int appearance, uint16_t manufacturer_len,
> -				char *manufacturer_data)
> +				char *manufacturer_data,
> +				uint16_t service_data_len, char *service_data,
> +				uint16_t service_uuid_len, char *service_uuid)
>  {
>  	char buf[IPC_MTU];
>  	struct hal_cmd_gatt_client_set_adv_data *cmd = (void *) buf;
> diff --git a/android/hardware/bt_gatt_client.h b/android/hardware/bt_gatt_client.h
> index d6b0cb4..cf4fabe 100644
> --- a/android/hardware/bt_gatt_client.h
> +++ b/android/hardware/bt_gatt_client.h
> @@ -278,7 +278,9 @@ typedef struct {
>      /** Set the advertising data or scan response data */
>      bt_status_t (*set_adv_data)(int server_if, bool set_scan_rsp, bool include_name,
>                      bool include_txpower, int min_interval, int max_interval, int appearance,
> -                    uint16_t manufacturer_len, char* manufacturer_data);
> +                    uint16_t manufacturer_len, char* manufacturer_data,
> +                    uint16_t service_data_len, char* service_data,
> +                    uint16_t service_uuid_len, char* service_uuid);
>  
>      /** Test mode interface */
>      bt_status_t (*test_command)( int command, btgatt_test_params_t* params);
> 

Applied.

-- 
Best regards, 
Szymon Janc

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2014-06-12 10:21 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-06-11 11:30 [RFC 1/3] android: Update HAL API to Android 4.4.3-r1.1 Szymon Janc
2014-06-11 11:31 ` [RFC 2/3] android/gatt: Update set_adv_data IPC to HAL API change Szymon Janc
2014-06-11 11:31 ` [RFC 3/3] android: Re-enable support for Android 4.4.2 Szymon Janc
2014-06-12 10:21 ` [RFC 1/3] android: Update HAL API to Android 4.4.3-r1.1 Szymon Janc

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.