linux-bluetooth.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH BlueZ 1/2] android/hidhost: Rework uHID code to use bt_uhid
@ 2014-05-28 11:27 Luiz Augusto von Dentz
  2014-05-28 11:27 ` [PATCH BlueZ 2/2] input: Do not send UHID_DESTROY Luiz Augusto von Dentz
  2014-05-30  6:25 ` [PATCH BlueZ 1/2] android/hidhost: Rework uHID code to use bt_uhid Luiz Augusto von Dentz
  0 siblings, 2 replies; 3+ messages in thread
From: Luiz Augusto von Dentz @ 2014-05-28 11:27 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

---
 android/Android.mk  |   1 +
 android/Makefile.am |   1 +
 android/hidhost.c   | 143 ++++++++--------------------------------------------
 3 files changed, 23 insertions(+), 122 deletions(-)

diff --git a/android/Android.mk b/android/Android.mk
index afd6e9c..de909d6 100644
--- a/android/Android.mk
+++ b/android/Android.mk
@@ -54,6 +54,7 @@ LOCAL_SRC_FILES := \
 	bluez/src/shared/gatt-db.c \
 	bluez/src/shared/io-glib.c \
 	bluez/src/shared/crypto.c \
+	bluez/src/shared/uhid.c \
 	bluez/src/sdpd-database.c \
 	bluez/src/sdpd-service.c \
 	bluez/src/sdpd-request.c \
diff --git a/android/Makefile.am b/android/Makefile.am
index 2d74505..bcaec4c 100644
--- a/android/Makefile.am
+++ b/android/Makefile.am
@@ -32,6 +32,7 @@ android_bluetoothd_SOURCES = android/main.c \
 				src/shared/hfp.h src/shared/hfp.c \
 				src/shared/gatt-db.h src/shared/gatt-db.c \
 				src/shared/crypto.h src/shared/crypto.c \
+				src/shared/uhid.h src/shared/uhid.c \
 				android/bluetooth.h android/bluetooth.c \
 				android/hidhost.h android/hidhost.c \
 				android/ipc-common.h \
diff --git a/android/hidhost.c b/android/hidhost.c
index 1758020..4a158c6 100644
--- a/android/hidhost.c
+++ b/android/hidhost.c
@@ -40,9 +40,9 @@
 #include "lib/sdp_lib.h"
 #include "src/shared/mgmt.h"
 #include "src/shared/util.h"
+#include "src/shared/uhid.h"
 #include "src/sdp-client.h"
 #include "src/uuid-helper.h"
-#include "profiles/input/uhid_copy.h"
 #include "src/log.h"
 
 #include "hal-msg.h"
@@ -53,7 +53,6 @@
 
 #define L2CAP_PSM_HIDP_CTRL	0x11
 #define L2CAP_PSM_HIDP_INTR	0x13
-#define UHID_DEVICE_FILE	"/dev/uhid"
 
 /* HID message types */
 #define HID_MSG_CONTROL		0x10
@@ -101,8 +100,7 @@ struct hid_device {
 	GIOChannel	*intr_io;
 	guint		ctrl_watch;
 	guint		intr_watch;
-	int		uhid_fd;
-	guint		uhid_watch_id;
+	struct bt_uhid	*uhid;
 	uint8_t		last_hid_msg;
 };
 
@@ -114,21 +112,6 @@ static int device_cmp(gconstpointer s, gconstpointer user_data)
 	return bacmp(&dev->dst, dst);
 }
 
-static void uhid_destroy(int fd)
-{
-	struct uhid_event ev;
-
-	/* destroy uHID device */
-	memset(&ev, 0, sizeof(ev));
-	ev.type = UHID_DESTROY;
-
-	if (write(fd, &ev, sizeof(ev)) < 0)
-		error("hidhost: Failed to destroy uHID device: %s (%d)",
-						strerror(errno), errno);
-
-	close(fd);
-}
-
 static void hid_device_free(void *data)
 {
 	struct hid_device *dev = data;
@@ -145,13 +128,8 @@ static void hid_device_free(void *data)
 	if (dev->ctrl_io)
 		g_io_channel_unref(dev->ctrl_io);
 
-	if (dev->uhid_watch_id) {
-		g_source_remove(dev->uhid_watch_id);
-		dev->uhid_watch_id = 0;
-	}
-
-	if (dev->uhid_fd > 0)
-		uhid_destroy(dev->uhid_fd);
+	if (dev->uhid)
+		bt_uhid_unref(dev->uhid);
 
 	g_free(dev->rd_data);
 	g_free(dev);
@@ -196,9 +174,10 @@ static bool hex2buf(const uint8_t *hex, uint8_t *buf, int buf_size)
 	return true;
 }
 
-static void handle_uhid_output(struct hid_device *dev,
-						struct uhid_output_req *output)
+static void handle_uhid_output(struct uhid_event *event, void *user_data)
 {
+	struct uhid_output_req *output = &event->u.output;
+	struct hid_device *dev = user_data;
 	int fd, req_size;
 	uint8_t *req;
 
@@ -222,87 +201,15 @@ static void handle_uhid_output(struct hid_device *dev,
 	free(req);
 }
 
-static gboolean uhid_event_cb(GIOChannel *io, GIOCondition cond,
-							gpointer user_data)
-{
-	struct hid_device *dev = user_data;
-	struct uhid_event ev;
-	ssize_t bread;
-	int fd;
-
-	DBG("");
-
-	if (cond & (G_IO_ERR | G_IO_NVAL))
-		goto failed;
-
-	fd = g_io_channel_unix_get_fd(io);
-	memset(&ev, 0, sizeof(ev));
-
-	bread = read(fd, &ev, sizeof(ev));
-	if (bread < 0) {
-		DBG("read: %s (%d)", strerror(errno), errno);
-		goto failed;
-	}
-
-	DBG("uHID event type %d received", ev.type);
-
-	switch (ev.type) {
-	case UHID_START:
-	case UHID_STOP:
-		/*
-		 * These are called to start and stop the underlying hardware.
-		 * We open the channels before creating the device so the
-		 * hardware is always ready. No need to handle these.
-		 * The kernel never destroys a device itself! Only an explicit
-		 * UHID_DESTROY request can remove a device.
-		 */
-		break;
-	case UHID_OPEN:
-	case UHID_CLOSE:
-		/*
-		 * OPEN/CLOSE are sent whenever user-space opens any interface
-		 * provided by the kernel HID device. Whenever the open-count
-		 * is non-zero we must be ready for I/O. As long as it is zero,
-		 * we can decide to drop all I/O and put the device
-		 * asleep This is optional, though.
-		 */
-		break;
-	case UHID_OUTPUT:
-		handle_uhid_output(dev, &ev.u.output);
-		break;
-	case UHID_FEATURE:
-		/* TODO */
-		break;
-	case UHID_OUTPUT_EV:
-		/*
-		 * This is only sent by kernels prior to linux-3.11. It
-		 * requires us to parse HID-descriptors in user-space to
-		 * properly handle it. This is redundant as the kernel
-		 * does it already. That's why newer kernels assemble
-		 * the output-reports and send it to us via UHID_OUTPUT.
-		 */
-		DBG("UHID_OUTPUT_EV unsupported");
-		break;
-	default:
-		warn("unexpected uHID event");
-	}
-
-	return TRUE;
-
-failed:
-	dev->uhid_watch_id = 0;
-	return FALSE;
-}
-
 static gboolean intr_io_watch_cb(GIOChannel *chan, gpointer data)
 {
 	struct hid_device *dev = data;
 	uint8_t buf[UHID_DATA_MAX];
 	struct uhid_event ev;
-	int fd, bread;
+	int fd, bread, err;
 
 	/* Wait uHID if not ready */
-	if (dev->uhid_fd < 0)
+	if (!dev->uhid)
 		return TRUE;
 
 	fd = g_io_channel_unix_get_fd(chan);
@@ -323,8 +230,9 @@ static gboolean intr_io_watch_cb(GIOChannel *chan, gpointer data)
 	ev.u.input.size = bread - 1;
 	memcpy(ev.u.input.data, &buf[1], ev.u.input.size);
 
-	if (write(dev->uhid_fd, &ev, sizeof(ev)) < 0)
-		DBG("uhid write: %s (%d)", strerror(errno), errno);
+	err = bt_uhid_send(dev->uhid, &ev);
+	if (err < 0)
+		DBG("bt_uhid_send: %s (%d)", strerror(-err), -err);
 
 	return TRUE;
 }
@@ -571,16 +479,13 @@ static void bt_hid_set_info(struct hid_device *dev)
 
 static int uhid_create(struct hid_device *dev)
 {
-	GIOCondition cond = G_IO_IN | G_IO_ERR | G_IO_NVAL;
 	struct uhid_event ev;
-	GIOChannel *io;
 	int err;
 
-	dev->uhid_fd = open(UHID_DEVICE_FILE, O_RDWR | O_CLOEXEC);
-	if (dev->uhid_fd < 0) {
+	dev->uhid = bt_uhid_new_default();
+	if (!dev->uhid) {
 		err = -errno;
-		error("hidhost: Failed to open uHID device: %s",
-							strerror(errno));
+		error("hidhost: Failed to create bt_uhid instance");
 		return err;
 	}
 
@@ -595,20 +500,16 @@ static int uhid_create(struct hid_device *dev)
 	ev.u.create.rd_size = dev->rd_size;
 	ev.u.create.rd_data = dev->rd_data;
 
-	if (write(dev->uhid_fd, &ev, sizeof(ev)) < 0) {
-		err = -errno;
+	err = bt_uhid_send(dev->uhid, &ev);
+	if (err < 0) {
 		error("hidhost: Failed to create uHID device: %s",
-							strerror(errno));
-		close(dev->uhid_fd);
-		dev->uhid_fd = -1;
+							strerror(-err));
+		bt_uhid_unref(dev->uhid);
+		dev->uhid = NULL;
 		return err;
 	}
 
-	io = g_io_channel_unix_new(dev->uhid_fd);
-	g_io_channel_set_encoding(io, NULL, NULL);
-	dev->uhid_watch_id = g_io_add_watch(io, cond, uhid_event_cb, dev);
-	g_io_channel_unref(io);
-
+	bt_uhid_register(dev->uhid, UHID_OUTPUT, handle_uhid_output, dev);
 	bt_hid_set_info(dev);
 
 	return 0;
@@ -843,7 +744,6 @@ static void bt_hid_connect(const void *buf, uint16_t len)
 
 	dev = g_new0(struct hid_device, 1);
 	bacpy(&dev->dst, &dst);
-	dev->uhid_fd = -1;
 
 	ba2str(&dev->dst, addr);
 	DBG("connecting to %s", addr);
@@ -1361,7 +1261,6 @@ static void connect_cb(GIOChannel *chan, GError *err, gpointer user_data)
 		dev = g_new0(struct hid_device, 1);
 		bacpy(&dev->dst, &dst);
 		dev->ctrl_io = g_io_channel_ref(chan);
-		dev->uhid_fd = -1;
 
 		sdp_uuid16_create(&uuid, PNP_INFO_SVCLASS_ID);
 		if (bt_search_service(&adapter_addr, &dev->dst, &uuid,
-- 
1.9.0


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

* [PATCH BlueZ 2/2] input: Do not send UHID_DESTROY
  2014-05-28 11:27 [PATCH BlueZ 1/2] android/hidhost: Rework uHID code to use bt_uhid Luiz Augusto von Dentz
@ 2014-05-28 11:27 ` Luiz Augusto von Dentz
  2014-05-30  6:25 ` [PATCH BlueZ 1/2] android/hidhost: Rework uHID code to use bt_uhid Luiz Augusto von Dentz
  1 sibling, 0 replies; 3+ messages in thread
From: Luiz Augusto von Dentz @ 2014-05-28 11:27 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

Accourding to uHID documentation when diconnecting the kernel will take
care of cleaning up any device created:

  "If you close() the fd, the device is automatically unregistered and
   destroyed internally."
---
 profiles/input/device.c | 17 +----------------
 profiles/input/hog.c    | 10 ----------
 2 files changed, 1 insertion(+), 26 deletions(-)

diff --git a/profiles/input/device.c b/profiles/input/device.c
index 785b1e9..a61b2c7 100644
--- a/profiles/input/device.c
+++ b/profiles/input/device.c
@@ -108,22 +108,7 @@ static int connection_disconnect(struct input_device *idev, uint32_t flags);
 
 static void input_device_free(struct input_device *idev)
 {
-	if (idev->uhid) {
-		if (idev->uhid_created) {
-			int err;
-			struct uhid_event ev;
-
-			memset(&ev, 0, sizeof(ev));
-			ev.type = UHID_DESTROY;
-			err = bt_uhid_send(idev->uhid, &ev);
-			if (err < 0)
-				error("bt_uhid_send: %s (%d)", strerror(-err),
-									-err);
-		}
-
-		bt_uhid_unref(idev->uhid);
-	}
-
+	bt_uhid_unref(idev->uhid);
 	btd_service_unref(idev->service);
 	btd_device_unref(idev->device);
 	g_free(idev->path);
diff --git a/profiles/input/hog.c b/profiles/input/hog.c
index 47a4fb1..3753343 100644
--- a/profiles/input/hog.c
+++ b/profiles/input/hog.c
@@ -750,17 +750,7 @@ static struct hog_device *hog_register_device(struct btd_device *device,
 
 static int hog_unregister_device(struct hog_device *hogdev)
 {
-	struct uhid_event ev;
-	int err;
-
 	btd_device_remove_attio_callback(hogdev->device, hogdev->attioid);
-
-	memset(&ev, 0, sizeof(ev));
-	ev.type = UHID_DESTROY;
-	err = bt_uhid_send(hogdev->uhid, &ev);
-	if (err < 0)
-		error("bt_uhid_send: %s (%d)", strerror(-err), -err);
-
 	bt_uhid_unref(hogdev->uhid);
 	hog_free_device(hogdev);
 
-- 
1.9.0


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

* Re: [PATCH BlueZ 1/2] android/hidhost: Rework uHID code to use bt_uhid
  2014-05-28 11:27 [PATCH BlueZ 1/2] android/hidhost: Rework uHID code to use bt_uhid Luiz Augusto von Dentz
  2014-05-28 11:27 ` [PATCH BlueZ 2/2] input: Do not send UHID_DESTROY Luiz Augusto von Dentz
@ 2014-05-30  6:25 ` Luiz Augusto von Dentz
  1 sibling, 0 replies; 3+ messages in thread
From: Luiz Augusto von Dentz @ 2014-05-30  6:25 UTC (permalink / raw)
  To: linux-bluetooth@vger.kernel.org

Hi,

On Wed, May 28, 2014 at 2:27 PM, Luiz Augusto von Dentz
<luiz.dentz@gmail.com> wrote:
> From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
>
> ---
>  android/Android.mk  |   1 +
>  android/Makefile.am |   1 +
>  android/hidhost.c   | 143 ++++++++--------------------------------------------
>  3 files changed, 23 insertions(+), 122 deletions(-)
>
> diff --git a/android/Android.mk b/android/Android.mk
> index afd6e9c..de909d6 100644
> --- a/android/Android.mk
> +++ b/android/Android.mk
> @@ -54,6 +54,7 @@ LOCAL_SRC_FILES := \
>         bluez/src/shared/gatt-db.c \
>         bluez/src/shared/io-glib.c \
>         bluez/src/shared/crypto.c \
> +       bluez/src/shared/uhid.c \
>         bluez/src/sdpd-database.c \
>         bluez/src/sdpd-service.c \
>         bluez/src/sdpd-request.c \
> diff --git a/android/Makefile.am b/android/Makefile.am
> index 2d74505..bcaec4c 100644
> --- a/android/Makefile.am
> +++ b/android/Makefile.am
> @@ -32,6 +32,7 @@ android_bluetoothd_SOURCES = android/main.c \
>                                 src/shared/hfp.h src/shared/hfp.c \
>                                 src/shared/gatt-db.h src/shared/gatt-db.c \
>                                 src/shared/crypto.h src/shared/crypto.c \
> +                               src/shared/uhid.h src/shared/uhid.c \
>                                 android/bluetooth.h android/bluetooth.c \
>                                 android/hidhost.h android/hidhost.c \
>                                 android/ipc-common.h \
> diff --git a/android/hidhost.c b/android/hidhost.c
> index 1758020..4a158c6 100644
> --- a/android/hidhost.c
> +++ b/android/hidhost.c
> @@ -40,9 +40,9 @@
>  #include "lib/sdp_lib.h"
>  #include "src/shared/mgmt.h"
>  #include "src/shared/util.h"
> +#include "src/shared/uhid.h"
>  #include "src/sdp-client.h"
>  #include "src/uuid-helper.h"
> -#include "profiles/input/uhid_copy.h"
>  #include "src/log.h"
>
>  #include "hal-msg.h"
> @@ -53,7 +53,6 @@
>
>  #define L2CAP_PSM_HIDP_CTRL    0x11
>  #define L2CAP_PSM_HIDP_INTR    0x13
> -#define UHID_DEVICE_FILE       "/dev/uhid"
>
>  /* HID message types */
>  #define HID_MSG_CONTROL                0x10
> @@ -101,8 +100,7 @@ struct hid_device {
>         GIOChannel      *intr_io;
>         guint           ctrl_watch;
>         guint           intr_watch;
> -       int             uhid_fd;
> -       guint           uhid_watch_id;
> +       struct bt_uhid  *uhid;
>         uint8_t         last_hid_msg;
>  };
>
> @@ -114,21 +112,6 @@ static int device_cmp(gconstpointer s, gconstpointer user_data)
>         return bacmp(&dev->dst, dst);
>  }
>
> -static void uhid_destroy(int fd)
> -{
> -       struct uhid_event ev;
> -
> -       /* destroy uHID device */
> -       memset(&ev, 0, sizeof(ev));
> -       ev.type = UHID_DESTROY;
> -
> -       if (write(fd, &ev, sizeof(ev)) < 0)
> -               error("hidhost: Failed to destroy uHID device: %s (%d)",
> -                                               strerror(errno), errno);
> -
> -       close(fd);
> -}
> -
>  static void hid_device_free(void *data)
>  {
>         struct hid_device *dev = data;
> @@ -145,13 +128,8 @@ static void hid_device_free(void *data)
>         if (dev->ctrl_io)
>                 g_io_channel_unref(dev->ctrl_io);
>
> -       if (dev->uhid_watch_id) {
> -               g_source_remove(dev->uhid_watch_id);
> -               dev->uhid_watch_id = 0;
> -       }
> -
> -       if (dev->uhid_fd > 0)
> -               uhid_destroy(dev->uhid_fd);
> +       if (dev->uhid)
> +               bt_uhid_unref(dev->uhid);
>
>         g_free(dev->rd_data);
>         g_free(dev);
> @@ -196,9 +174,10 @@ static bool hex2buf(const uint8_t *hex, uint8_t *buf, int buf_size)
>         return true;
>  }
>
> -static void handle_uhid_output(struct hid_device *dev,
> -                                               struct uhid_output_req *output)
> +static void handle_uhid_output(struct uhid_event *event, void *user_data)
>  {
> +       struct uhid_output_req *output = &event->u.output;
> +       struct hid_device *dev = user_data;
>         int fd, req_size;
>         uint8_t *req;
>
> @@ -222,87 +201,15 @@ static void handle_uhid_output(struct hid_device *dev,
>         free(req);
>  }
>
> -static gboolean uhid_event_cb(GIOChannel *io, GIOCondition cond,
> -                                                       gpointer user_data)
> -{
> -       struct hid_device *dev = user_data;
> -       struct uhid_event ev;
> -       ssize_t bread;
> -       int fd;
> -
> -       DBG("");
> -
> -       if (cond & (G_IO_ERR | G_IO_NVAL))
> -               goto failed;
> -
> -       fd = g_io_channel_unix_get_fd(io);
> -       memset(&ev, 0, sizeof(ev));
> -
> -       bread = read(fd, &ev, sizeof(ev));
> -       if (bread < 0) {
> -               DBG("read: %s (%d)", strerror(errno), errno);
> -               goto failed;
> -       }
> -
> -       DBG("uHID event type %d received", ev.type);
> -
> -       switch (ev.type) {
> -       case UHID_START:
> -       case UHID_STOP:
> -               /*
> -                * These are called to start and stop the underlying hardware.
> -                * We open the channels before creating the device so the
> -                * hardware is always ready. No need to handle these.
> -                * The kernel never destroys a device itself! Only an explicit
> -                * UHID_DESTROY request can remove a device.
> -                */
> -               break;
> -       case UHID_OPEN:
> -       case UHID_CLOSE:
> -               /*
> -                * OPEN/CLOSE are sent whenever user-space opens any interface
> -                * provided by the kernel HID device. Whenever the open-count
> -                * is non-zero we must be ready for I/O. As long as it is zero,
> -                * we can decide to drop all I/O and put the device
> -                * asleep This is optional, though.
> -                */
> -               break;
> -       case UHID_OUTPUT:
> -               handle_uhid_output(dev, &ev.u.output);
> -               break;
> -       case UHID_FEATURE:
> -               /* TODO */
> -               break;
> -       case UHID_OUTPUT_EV:
> -               /*
> -                * This is only sent by kernels prior to linux-3.11. It
> -                * requires us to parse HID-descriptors in user-space to
> -                * properly handle it. This is redundant as the kernel
> -                * does it already. That's why newer kernels assemble
> -                * the output-reports and send it to us via UHID_OUTPUT.
> -                */
> -               DBG("UHID_OUTPUT_EV unsupported");
> -               break;
> -       default:
> -               warn("unexpected uHID event");
> -       }
> -
> -       return TRUE;
> -
> -failed:
> -       dev->uhid_watch_id = 0;
> -       return FALSE;
> -}
> -
>  static gboolean intr_io_watch_cb(GIOChannel *chan, gpointer data)
>  {
>         struct hid_device *dev = data;
>         uint8_t buf[UHID_DATA_MAX];
>         struct uhid_event ev;
> -       int fd, bread;
> +       int fd, bread, err;
>
>         /* Wait uHID if not ready */
> -       if (dev->uhid_fd < 0)
> +       if (!dev->uhid)
>                 return TRUE;
>
>         fd = g_io_channel_unix_get_fd(chan);
> @@ -323,8 +230,9 @@ static gboolean intr_io_watch_cb(GIOChannel *chan, gpointer data)
>         ev.u.input.size = bread - 1;
>         memcpy(ev.u.input.data, &buf[1], ev.u.input.size);
>
> -       if (write(dev->uhid_fd, &ev, sizeof(ev)) < 0)
> -               DBG("uhid write: %s (%d)", strerror(errno), errno);
> +       err = bt_uhid_send(dev->uhid, &ev);
> +       if (err < 0)
> +               DBG("bt_uhid_send: %s (%d)", strerror(-err), -err);
>
>         return TRUE;
>  }
> @@ -571,16 +479,13 @@ static void bt_hid_set_info(struct hid_device *dev)
>
>  static int uhid_create(struct hid_device *dev)
>  {
> -       GIOCondition cond = G_IO_IN | G_IO_ERR | G_IO_NVAL;
>         struct uhid_event ev;
> -       GIOChannel *io;
>         int err;
>
> -       dev->uhid_fd = open(UHID_DEVICE_FILE, O_RDWR | O_CLOEXEC);
> -       if (dev->uhid_fd < 0) {
> +       dev->uhid = bt_uhid_new_default();
> +       if (!dev->uhid) {
>                 err = -errno;
> -               error("hidhost: Failed to open uHID device: %s",
> -                                                       strerror(errno));
> +               error("hidhost: Failed to create bt_uhid instance");
>                 return err;
>         }
>
> @@ -595,20 +500,16 @@ static int uhid_create(struct hid_device *dev)
>         ev.u.create.rd_size = dev->rd_size;
>         ev.u.create.rd_data = dev->rd_data;
>
> -       if (write(dev->uhid_fd, &ev, sizeof(ev)) < 0) {
> -               err = -errno;
> +       err = bt_uhid_send(dev->uhid, &ev);
> +       if (err < 0) {
>                 error("hidhost: Failed to create uHID device: %s",
> -                                                       strerror(errno));
> -               close(dev->uhid_fd);
> -               dev->uhid_fd = -1;
> +                                                       strerror(-err));
> +               bt_uhid_unref(dev->uhid);
> +               dev->uhid = NULL;
>                 return err;
>         }
>
> -       io = g_io_channel_unix_new(dev->uhid_fd);
> -       g_io_channel_set_encoding(io, NULL, NULL);
> -       dev->uhid_watch_id = g_io_add_watch(io, cond, uhid_event_cb, dev);
> -       g_io_channel_unref(io);
> -
> +       bt_uhid_register(dev->uhid, UHID_OUTPUT, handle_uhid_output, dev);
>         bt_hid_set_info(dev);
>
>         return 0;
> @@ -843,7 +744,6 @@ static void bt_hid_connect(const void *buf, uint16_t len)
>
>         dev = g_new0(struct hid_device, 1);
>         bacpy(&dev->dst, &dst);
> -       dev->uhid_fd = -1;
>
>         ba2str(&dev->dst, addr);
>         DBG("connecting to %s", addr);
> @@ -1361,7 +1261,6 @@ static void connect_cb(GIOChannel *chan, GError *err, gpointer user_data)
>                 dev = g_new0(struct hid_device, 1);
>                 bacpy(&dev->dst, &dst);
>                 dev->ctrl_io = g_io_channel_ref(chan);
> -               dev->uhid_fd = -1;
>
>                 sdp_uuid16_create(&uuid, PNP_INFO_SVCLASS_ID);
>                 if (bt_search_service(&adapter_addr, &dev->dst, &uuid,
> --
> 1.9.0

Pushed.


-- 
Luiz Augusto von Dentz

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

end of thread, other threads:[~2014-05-30  6:25 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-05-28 11:27 [PATCH BlueZ 1/2] android/hidhost: Rework uHID code to use bt_uhid Luiz Augusto von Dentz
2014-05-28 11:27 ` [PATCH BlueZ 2/2] input: Do not send UHID_DESTROY Luiz Augusto von Dentz
2014-05-30  6:25 ` [PATCH BlueZ 1/2] android/hidhost: Rework uHID code to use bt_uhid Luiz Augusto von Dentz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).