2013-11-07 09:26:58

by Ravi kumar Veeramally

[permalink] [raw]
Subject: [RFC 0/3] Fix ascii to hex conversion in HAL to deamon ipc PDU

In case of set report and send data HAL receives the data in ascii format
but it should be in hex. This patch set updates the document, provides
utility and fix the issue in set report case.

Ravi kumar Veeramally (3):
android/hid: Remove fixed number of hid set report data length in ipc
doc
android/hid: Add a ascii2hex utility
android/hid: Fix set report data format

android/Android.mk | 1 +
android/Makefile.am | 2 +-
android/hal-ipc-api.txt | 2 +-
android/hal-msg.h | 2 +-
android/hid.c | 12 +++++++---
android/utils.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++
android/utils.h | 3 +++
7 files changed, 76 insertions(+), 6 deletions(-)
create mode 100644 android/utils.c

--
1.8.3.2



2013-11-07 09:27:00

by Ravi kumar Veeramally

[permalink] [raw]
Subject: [RFC 2/3] android/hid: Add a ascii2hex utility

Data from few interfaces on HAL is in ascii format but it should be
in hex format. This conversion utility does that job.
---
android/Android.mk | 1 +
android/Makefile.am | 2 +-
android/utils.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++
android/utils.h | 3 +++
4 files changed, 65 insertions(+), 1 deletion(-)
create mode 100644 android/utils.c

diff --git a/android/Android.mk b/android/Android.mk
index d76dfaf..9493f89 100644
--- a/android/Android.mk
+++ b/android/Android.mk
@@ -27,6 +27,7 @@ LOCAL_SRC_FILES := \
ipc.c ipc.h \
a2dp.c \
pan.c \
+ utils.c \
../src/log.c \
../src/shared/mgmt.c \
../src/shared/util.c \
diff --git a/android/Makefile.am b/android/Makefile.am
index 8619641..eb0c8d7 100644
--- a/android/Makefile.am
+++ b/android/Makefile.am
@@ -9,7 +9,7 @@ noinst_PROGRAMS += android/bluetoothd
android_bluetoothd_SOURCES = android/main.c \
src/log.c \
android/hal-msg.h \
- android/utils.h \
+ android/utils.h android/utils.c \
src/sdpd-database.c src/sdpd-server.c \
src/sdpd-service.c src/sdpd-request.c \
src/glib-helper.h src/glib-helper.c \
diff --git a/android/utils.c b/android/utils.c
new file mode 100644
index 0000000..9179a6f
--- /dev/null
+++ b/android/utils.c
@@ -0,0 +1,60 @@
+/*
+ *
+ * BlueZ - Bluetooth protocol stack for Linux
+ *
+ * Copyright (C) 2013 Intel Corporation. All rights reserved.
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <glib.h>
+#include "utils.h"
+
+static inline uint8_t ascii2hex_c(uint8_t ascii)
+{
+ return g_ascii_isdigit(ascii) ? (ascii - '0') :
+ (g_ascii_toupper(ascii) - 'A' + 10);
+}
+
+int ascii2hex(const uint8_t *ascii, int ascii_len, uint8_t *hex)
+{
+ uint8_t h;
+ int i;
+
+ if (!ascii || !hex)
+ return -1;
+
+ i = 0;
+
+ while (i < ascii_len) {
+ h = ascii2hex_c(ascii[i++]) << 4;
+
+ if (!(i < ascii_len)) {
+ *hex++ = h;
+ break;
+ }
+
+ h |= ascii2hex_c(ascii[i++]);
+ *hex++ = h;
+ }
+
+ return 0;
+}
diff --git a/android/utils.h b/android/utils.h
index 5b009bc..2ec3fc1 100644
--- a/android/utils.h
+++ b/android/utils.h
@@ -21,6 +21,7 @@
*
*/

+#include "lib/bluetooth.h"

static inline void android2bdaddr(const void *buf, bdaddr_t *dst)
{
@@ -31,3 +32,5 @@ static inline void bdaddr2android(const bdaddr_t *src, void *buf)
{
baswap(buf, src);
}
+
+int ascii2hex(const uint8_t *ascii, int ascii_len, uint8_t *hex);
--
1.8.3.2


2013-11-07 09:26:59

by Ravi kumar Veeramally

[permalink] [raw]
Subject: [RFC 1/3] android/hid: Remove fixed number of hid set report data length in ipc doc

HAL receives data in ascii format but it should be in hex format. So remove
fixed size of report data length and depend on report length parameter.
---
android/hal-ipc-api.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/android/hal-ipc-api.txt b/android/hal-ipc-api.txt
index c39cb0d..297f565 100644
--- a/android/hal-ipc-api.txt
+++ b/android/hal-ipc-api.txt
@@ -553,7 +553,7 @@ Commands and responses:
Command parameters: Remote address (6 octets)
Report type (1 octet)
Report length (2 octets)
- Report data (670 octets)
+ Report data (Report length)

Response parameters: <none>

--
1.8.3.2


2013-11-07 09:27:01

by Ravi kumar Veeramally

[permalink] [raw]
Subject: [RFC 3/3] android/hid: Fix set report data format

Data is in ascii format from HAL. Convert it to hex and send it to
hid device.
---
android/hal-msg.h | 2 +-
android/hid.c | 12 +++++++++---
2 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/android/hal-msg.h b/android/hal-msg.h
index a5e5c76..89366df 100644
--- a/android/hal-msg.h
+++ b/android/hal-msg.h
@@ -293,7 +293,7 @@ struct hal_cmd_hid_set_report {
uint8_t bdaddr[6];
uint8_t type;
uint16_t len;
- uint8_t data[670];
+ uint8_t data[0];
} __attribute__((packed));

#define HAL_OP_HID_SEND_DATA 0x09
diff --git a/android/hid.c b/android/hid.c
index c38c4c1..e28e22d 100644
--- a/android/hid.c
+++ b/android/hid.c
@@ -898,18 +898,24 @@ static uint8_t bt_hid_set_report(struct hal_cmd_hid_set_report *cmd,
return HAL_STATUS_FAILED;

dev = l->data;
- req_size = 1 + cmd->len;
+ /* Report data coming from HAL is in ascii format, so convert
+ * it to hex and calculate length according to it. */
+ req_size = 1 + ((cmd->len + 1) / 2);
req = g_try_malloc0(req_size);
if (!req)
return HAL_STATUS_NOMEM;

req[0] = HID_MSG_SET_REPORT | cmd->type;
- memcpy(req + 1, cmd->data, req_size - 1);
+
+ if (!ascii2hex(cmd->data, cmd->len, (req + 1))) {
+ g_free(req);
+ return HAL_STATUS_FAILED;
+ }

fd = g_io_channel_unix_get_fd(dev->ctrl_io);

if (write(fd, req, req_size) < 0) {
- error("error while querying device protocol");
+ error("error while sending report");
g_free(req);
return HAL_STATUS_FAILED;
}
--
1.8.3.2