* [Bluez PATCH v2 1/3] input/device: Replace UHID_FEATURE with UHID_GET_REPORT
@ 2020-08-03 6:52 Archie Pusaka
2020-08-03 6:52 ` [Bluez PATCH v2 2/3] input/device: Implement handle for UHID_SET_REPORT Archie Pusaka
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Archie Pusaka @ 2020-08-03 6:52 UTC (permalink / raw)
To: linux-bluetooth, Luiz Augusto von Dentz
Cc: CrosBT Upstreaming, Archie Pusaka, Alain Michaud, Abhishek Pandit-Subedi
From: Archie Pusaka <apusaka@chromium.org>
According to kernel's uhid.h, UHID_FEATURE is obsolete and is
replaced with UHID_GET_REPORT.
Reviewed-by: Alain Michaud <alainm@chromium.org>
Reviewed-by: Abhishek Pandit-Subedi <abhishekpandit@chromium.org>
---
Changes in v2:
-Split into three patches, now this only handles UHID_GET_REPORT
profiles/input/device.c | 41 +++++++++++++++++++-------------------
profiles/input/hidp_defs.h | 2 +-
2 files changed, 22 insertions(+), 21 deletions(-)
diff --git a/profiles/input/device.c b/profiles/input/device.c
index ee0b2404a..ac4487f63 100644
--- a/profiles/input/device.c
+++ b/profiles/input/device.c
@@ -220,7 +220,7 @@ static bool hidp_send_intr_message(struct input_device *idev, uint8_t hdr,
return hidp_send_message(idev->intr_io, hdr, data, size);
}
-static bool uhid_send_feature_answer(struct input_device *idev,
+static bool uhid_send_get_report_reply(struct input_device *idev,
const uint8_t *data, size_t size,
uint32_t id, uint16_t err)
{
@@ -230,8 +230,8 @@ static bool uhid_send_feature_answer(struct input_device *idev,
if (data == NULL)
size = 0;
- if (size > sizeof(ev.u.feature_answer.data))
- size = sizeof(ev.u.feature_answer.data);
+ if (size > sizeof(ev.u.get_report_reply.data))
+ size = sizeof(ev.u.get_report_reply.data);
if (!idev->uhid_created) {
DBG("HID report (%zu bytes) dropped", size);
@@ -239,13 +239,13 @@ static bool uhid_send_feature_answer(struct input_device *idev,
}
memset(&ev, 0, sizeof(ev));
- ev.type = UHID_FEATURE_ANSWER;
- ev.u.feature_answer.id = id;
- ev.u.feature_answer.err = err;
- ev.u.feature_answer.size = size;
+ ev.type = UHID_GET_REPORT_REPLY;
+ ev.u.get_report_reply.id = id;
+ ev.u.get_report_reply.err = err;
+ ev.u.get_report_reply.size = size;
if (size > 0)
- memcpy(ev.u.feature_answer.data, data, size);
+ memcpy(ev.u.get_report_reply.data, data, size);
ret = bt_uhid_send(idev->uhid, &ev);
if (ret < 0) {
@@ -399,7 +399,7 @@ static void hidp_recv_ctrl_handshake(struct input_device *idev, uint8_t param)
case HIDP_HSHK_ERR_FATAL:
if (pending_req_type == HIDP_TRANS_GET_REPORT) {
DBG("GET_REPORT failed (%u)", param);
- uhid_send_feature_answer(idev, NULL, 0,
+ uhid_send_get_report_reply(idev, NULL, 0,
idev->report_rsp_id, EIO);
pending_req_complete = true;
} else if (pending_req_type == HIDP_TRANS_SET_REPORT) {
@@ -460,8 +460,8 @@ static void hidp_recv_ctrl_data(struct input_device *idev, uint8_t param,
switch (param) {
case HIDP_DATA_RTYPE_FEATURE:
case HIDP_DATA_RTYPE_INPUT:
- case HIDP_DATA_RTYPE_OUPUT:
- uhid_send_feature_answer(idev, data + 1, size - 1,
+ case HIDP_DATA_RTYPE_OUTPUT:
+ uhid_send_get_report_reply(idev, data + 1, size - 1,
idev->report_rsp_id, 0);
break;
@@ -626,7 +626,7 @@ static void hidp_send_set_report(struct uhid_event *ev, void *user_data)
break;
case UHID_OUTPUT_REPORT:
/* Send DATA on interrupt channel */
- hdr = HIDP_TRANS_DATA | HIDP_DATA_RTYPE_OUPUT;
+ hdr = HIDP_TRANS_DATA | HIDP_DATA_RTYPE_OUTPUT;
hidp_send_intr_message(idev, hdr, ev->u.output.data,
ev->u.output.size);
break;
@@ -646,13 +646,13 @@ static void hidp_send_get_report(struct uhid_event *ev, void *user_data)
if (idev->report_req_pending) {
DBG("Old GET_REPORT or SET_REPORT still pending");
- uhid_send_feature_answer(idev, NULL, 0, ev->u.feature.id,
+ uhid_send_get_report_reply(idev, NULL, 0, ev->u.get_report.id,
EBUSY);
return;
}
/* Send GET_REPORT on control channel */
- switch (ev->u.feature.rtype) {
+ switch (ev->u.get_report.rtype) {
case UHID_FEATURE_REPORT:
hdr = HIDP_TRANS_GET_REPORT | HIDP_DATA_RTYPE_FEATURE;
break;
@@ -660,21 +660,21 @@ static void hidp_send_get_report(struct uhid_event *ev, void *user_data)
hdr = HIDP_TRANS_GET_REPORT | HIDP_DATA_RTYPE_INPUT;
break;
case UHID_OUTPUT_REPORT:
- hdr = HIDP_TRANS_GET_REPORT | HIDP_DATA_RTYPE_OUPUT;
+ hdr = HIDP_TRANS_GET_REPORT | HIDP_DATA_RTYPE_OUTPUT;
break;
default:
- DBG("Unsupported HID report type %u", ev->u.feature.rtype);
+ DBG("Unsupported HID report type %u", ev->u.get_report.rtype);
return;
}
- sent = hidp_send_ctrl_message(idev, hdr, &ev->u.feature.rnum,
- sizeof(ev->u.feature.rnum));
+ sent = hidp_send_ctrl_message(idev, hdr, &ev->u.get_report.rnum,
+ sizeof(ev->u.get_report.rnum));
if (sent) {
idev->report_req_pending = hdr;
idev->report_req_timer =
g_timeout_add_seconds(REPORT_REQ_TIMEOUT,
hidp_report_req_timeout, idev);
- idev->report_rsp_id = ev->u.feature.id;
+ idev->report_rsp_id = ev->u.get_report.id;
}
}
@@ -909,7 +909,8 @@ static int uhid_connadd(struct input_device *idev, struct hidp_connadd_req *req)
}
bt_uhid_register(idev->uhid, UHID_OUTPUT, hidp_send_set_report, idev);
- bt_uhid_register(idev->uhid, UHID_FEATURE, hidp_send_get_report, idev);
+ bt_uhid_register(idev->uhid, UHID_GET_REPORT, hidp_send_get_report,
+ idev);
idev->uhid_created = true;
diff --git a/profiles/input/hidp_defs.h b/profiles/input/hidp_defs.h
index 5dc479acf..bb9231dbb 100644
--- a/profiles/input/hidp_defs.h
+++ b/profiles/input/hidp_defs.h
@@ -63,7 +63,7 @@
#define HIDP_DATA_RSRVD_MASK 0x0c
#define HIDP_DATA_RTYPE_OTHER 0x00
#define HIDP_DATA_RTYPE_INPUT 0x01
-#define HIDP_DATA_RTYPE_OUPUT 0x02
+#define HIDP_DATA_RTYPE_OUTPUT 0x02
#define HIDP_DATA_RTYPE_FEATURE 0x03
/* HIDP protocol header parameters */
--
2.28.0.163.g6104cc2f0b6-goog
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [Bluez PATCH v2 2/3] input/device: Implement handle for UHID_SET_REPORT
2020-08-03 6:52 [Bluez PATCH v2 1/3] input/device: Replace UHID_FEATURE with UHID_GET_REPORT Archie Pusaka
@ 2020-08-03 6:52 ` Archie Pusaka
2020-08-03 6:52 ` [Bluez PATCH v2 3/3] input/device: Send UHID_DESTROY upon disconnection Archie Pusaka
2020-08-03 20:01 ` [Bluez PATCH v2 1/3] input/device: Replace UHID_FEATURE with UHID_GET_REPORT Luiz Augusto von Dentz
2 siblings, 0 replies; 4+ messages in thread
From: Archie Pusaka @ 2020-08-03 6:52 UTC (permalink / raw)
To: linux-bluetooth, Luiz Augusto von Dentz
Cc: CrosBT Upstreaming, Archie Pusaka, Alain Michaud, Abhishek Pandit-Subedi
From: Archie Pusaka <apusaka@chromium.org>
This patch listens to UHID_SET_REPORT event and forwards this
message to the hid device. Upon reply, we also send a report back
to the kernel as UHID_SET_REPORT_REPLY.
hidp_send_set_report no longer listen UHID_OUTPUT events, that is
handled by hidp_send_output instead.
Reviewed-by: Alain Michaud <alainm@chromium.org>
Reviewed-by: Abhishek Pandit-Subedi <abhishekpandit@chromium.org>
---
Changes in v2:
-Split into three patches, now this only handles UHID_SET_REPORT
profiles/input/device.c | 100 ++++++++++++++++++++++++++++++----------
1 file changed, 76 insertions(+), 24 deletions(-)
diff --git a/profiles/input/device.c b/profiles/input/device.c
index ac4487f63..757290080 100644
--- a/profiles/input/device.c
+++ b/profiles/input/device.c
@@ -258,6 +258,29 @@ static bool uhid_send_get_report_reply(struct input_device *idev,
return true;
}
+static bool uhid_send_set_report_reply(struct input_device *idev,
+ uint32_t id, uint16_t err)
+{
+ struct uhid_event ev;
+ int ret;
+
+ if (!idev->uhid_created)
+ return false;
+
+ memset(&ev, 0, sizeof(ev));
+ ev.type = UHID_SET_REPORT_REPLY;
+ ev.u.set_report_reply.id = id;
+ ev.u.set_report_reply.err = err;
+
+ ret = bt_uhid_send(idev->uhid, &ev);
+ if (ret < 0) {
+ error("bt_uhid_send: %s (%d)", strerror(-ret), -ret);
+ return false;
+ }
+
+ return true;
+}
+
static bool uhid_send_input_report(struct input_device *idev,
const uint8_t *data, size_t size)
{
@@ -404,6 +427,8 @@ static void hidp_recv_ctrl_handshake(struct input_device *idev, uint8_t param)
pending_req_complete = true;
} else if (pending_req_type == HIDP_TRANS_SET_REPORT) {
DBG("SET_REPORT failed (%u)", param);
+ uhid_send_set_report_reply(idev, idev->report_rsp_id,
+ EIO);
pending_req_complete = true;
} else
DBG("Spurious HIDP_HSHK_ERR");
@@ -446,7 +471,8 @@ static void hidp_recv_ctrl_data(struct input_device *idev, uint8_t param,
DBG("");
pending_req_type = idev->report_req_pending & HIDP_HEADER_TRANS_MASK;
- if (pending_req_type != HIDP_TRANS_GET_REPORT) {
+ if (pending_req_type != HIDP_TRANS_GET_REPORT &&
+ pending_req_type != HIDP_TRANS_SET_REPORT) {
DBG("Spurious DATA on control channel");
return;
}
@@ -461,8 +487,12 @@ static void hidp_recv_ctrl_data(struct input_device *idev, uint8_t param,
case HIDP_DATA_RTYPE_FEATURE:
case HIDP_DATA_RTYPE_INPUT:
case HIDP_DATA_RTYPE_OUTPUT:
- uhid_send_get_report_reply(idev, data + 1, size - 1,
+ if (pending_req_type == HIDP_TRANS_GET_REPORT)
+ uhid_send_get_report_reply(idev, data + 1, size - 1,
idev->report_rsp_id, 0);
+ else
+ uhid_send_set_report_reply(idev, idev->report_rsp_id,
+ 0);
break;
case HIDP_DATA_RTYPE_OTHER:
@@ -579,9 +609,13 @@ static gboolean hidp_report_req_timeout(gpointer data)
switch (pending_req_type) {
case HIDP_TRANS_GET_REPORT:
req_type_str = "GET_REPORT";
+ uhid_send_get_report_reply(idev, NULL, 0, idev->report_rsp_id,
+ ETIMEDOUT);
break;
case HIDP_TRANS_SET_REPORT:
req_type_str = "SET_REPORT";
+ uhid_send_set_report_reply(idev, idev->report_rsp_id,
+ ETIMEDOUT);
break;
default:
/* Should never happen */
@@ -598,6 +632,17 @@ static gboolean hidp_report_req_timeout(gpointer data)
return FALSE;
}
+static void hidp_send_output(struct uhid_event *ev, void *user_data)
+{
+ struct input_device *idev = user_data;
+ uint8_t hdr = HIDP_TRANS_DATA | HIDP_DATA_RTYPE_OUTPUT;
+
+ DBG("");
+
+ hidp_send_intr_message(idev, hdr, ev->u.output.data,
+ ev->u.output.size);
+}
+
static void hidp_send_set_report(struct uhid_event *ev, void *user_data)
{
struct input_device *idev = user_data;
@@ -606,34 +651,37 @@ static void hidp_send_set_report(struct uhid_event *ev, void *user_data)
DBG("");
- switch (ev->u.output.rtype) {
+ switch (ev->u.set_report.rtype) {
case UHID_FEATURE_REPORT:
- /* Send SET_REPORT on control channel */
- if (idev->report_req_pending) {
- DBG("Old GET_REPORT or SET_REPORT still pending");
- return;
- }
-
hdr = HIDP_TRANS_SET_REPORT | HIDP_DATA_RTYPE_FEATURE;
- sent = hidp_send_ctrl_message(idev, hdr, ev->u.output.data,
- ev->u.output.size);
- if (sent) {
- idev->report_req_pending = hdr;
- idev->report_req_timer =
- g_timeout_add_seconds(REPORT_REQ_TIMEOUT,
- hidp_report_req_timeout, idev);
- }
+ break;
+ case UHID_INPUT_REPORT:
+ hdr = HIDP_TRANS_SET_REPORT | HIDP_DATA_RTYPE_INPUT;
break;
case UHID_OUTPUT_REPORT:
- /* Send DATA on interrupt channel */
- hdr = HIDP_TRANS_DATA | HIDP_DATA_RTYPE_OUTPUT;
- hidp_send_intr_message(idev, hdr, ev->u.output.data,
- ev->u.output.size);
+ hdr = HIDP_TRANS_SET_REPORT | HIDP_DATA_RTYPE_OUTPUT;
break;
default:
- DBG("Unsupported HID report type %u", ev->u.output.rtype);
+ DBG("Unsupported HID report type %u", ev->u.set_report.rtype);
+ return;
+ }
+
+ if (idev->report_req_pending) {
+ DBG("Old GET_REPORT or SET_REPORT still pending");
+ uhid_send_set_report_reply(idev, ev->u.set_report.id, EBUSY);
return;
}
+
+ sent = hidp_send_ctrl_message(idev, hdr, ev->u.set_report.data,
+ ev->u.set_report.size);
+ if (sent) {
+ idev->report_req_pending = hdr;
+ idev->report_req_timer =
+ g_timeout_add_seconds(REPORT_REQ_TIMEOUT,
+ hidp_report_req_timeout, idev);
+ idev->report_rsp_id = ev->u.set_report.id;
+ } else
+ uhid_send_set_report_reply(idev, ev->u.set_report.id, EIO);
}
static void hidp_send_get_report(struct uhid_event *ev, void *user_data)
@@ -675,7 +723,9 @@ static void hidp_send_get_report(struct uhid_event *ev, void *user_data)
g_timeout_add_seconds(REPORT_REQ_TIMEOUT,
hidp_report_req_timeout, idev);
idev->report_rsp_id = ev->u.get_report.id;
- }
+ } else
+ uhid_send_get_report_reply(idev, NULL, 0, ev->u.get_report.id,
+ EIO);
}
static void epox_endian_quirk(unsigned char *data, int size)
@@ -908,9 +958,11 @@ static int uhid_connadd(struct input_device *idev, struct hidp_connadd_req *req)
return err;
}
- bt_uhid_register(idev->uhid, UHID_OUTPUT, hidp_send_set_report, idev);
+ bt_uhid_register(idev->uhid, UHID_OUTPUT, hidp_send_output, idev);
bt_uhid_register(idev->uhid, UHID_GET_REPORT, hidp_send_get_report,
idev);
+ bt_uhid_register(idev->uhid, UHID_SET_REPORT, hidp_send_set_report,
+ idev);
idev->uhid_created = true;
--
2.28.0.163.g6104cc2f0b6-goog
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [Bluez PATCH v2 3/3] input/device: Send UHID_DESTROY upon disconnection
2020-08-03 6:52 [Bluez PATCH v2 1/3] input/device: Replace UHID_FEATURE with UHID_GET_REPORT Archie Pusaka
2020-08-03 6:52 ` [Bluez PATCH v2 2/3] input/device: Implement handle for UHID_SET_REPORT Archie Pusaka
@ 2020-08-03 6:52 ` Archie Pusaka
2020-08-03 20:01 ` [Bluez PATCH v2 1/3] input/device: Replace UHID_FEATURE with UHID_GET_REPORT Luiz Augusto von Dentz
2 siblings, 0 replies; 4+ messages in thread
From: Archie Pusaka @ 2020-08-03 6:52 UTC (permalink / raw)
To: linux-bluetooth, Luiz Augusto von Dentz
Cc: CrosBT Upstreaming, Archie Pusaka, Alain Michaud, Abhishek Pandit-Subedi
From: Archie Pusaka <apusaka@chromium.org>
According to the uhid documentation: "If your device disconnects,
you should send an UHID_DESTROY event"
Reviewed-by: Alain Michaud <alainm@chromium.org>
Reviewed-by: Abhishek Pandit-Subedi <abhishekpandit@chromium.org>
---
Changes in v2:
-Split into three patches, now this only handles UHID_DESTROY
profiles/input/device.c | 29 ++++++++++++++++++++++++++++-
1 file changed, 28 insertions(+), 1 deletion(-)
diff --git a/profiles/input/device.c b/profiles/input/device.c
index 757290080..8fc04be37 100644
--- a/profiles/input/device.c
+++ b/profiles/input/device.c
@@ -117,6 +117,7 @@ bool input_get_classic_bonded_only(void)
static void input_device_enter_reconnect_mode(struct input_device *idev);
static int connection_disconnect(struct input_device *idev, uint32_t flags);
+static int uhid_disconnect(struct input_device *idev);
static bool input_device_bonded(struct input_device *idev)
{
@@ -393,6 +394,10 @@ static gboolean intr_watch_cb(GIOChannel *chan, GIOCondition cond, gpointer data
if (!idev->ctrl_io && idev->virtual_cable_unplug)
virtual_cable_unplug(idev);
+ /* If connection abruptly ended, uhid might be not yet disconnected */
+ if (idev->uhid_created)
+ uhid_disconnect(idev);
+
return FALSE;
}
@@ -969,6 +974,28 @@ static int uhid_connadd(struct input_device *idev, struct hidp_connadd_req *req)
return err;
}
+static int uhid_disconnect(struct input_device *idev)
+{
+ int err;
+ struct uhid_event ev;
+
+ if (!idev->uhid_created)
+ return 0;
+
+ memset(&ev, 0, sizeof(ev));
+ ev.type = UHID_DESTROY;
+
+ err = bt_uhid_send(idev->uhid, &ev);
+ if (err < 0) {
+ error("bt_uhid_send: %s", strerror(-err));
+ return err;
+ }
+
+ idev->uhid_created = false;
+
+ return err;
+}
+
static gboolean encrypt_notify(GIOChannel *io, GIOCondition condition,
gpointer data)
{
@@ -1127,7 +1154,7 @@ static int connection_disconnect(struct input_device *idev, uint32_t flags)
idev->virtual_cable_unplug = true;
if (idev->uhid)
- return 0;
+ return uhid_disconnect(idev);
else
return ioctl_disconnect(idev, flags);
}
--
2.28.0.163.g6104cc2f0b6-goog
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [Bluez PATCH v2 1/3] input/device: Replace UHID_FEATURE with UHID_GET_REPORT
2020-08-03 6:52 [Bluez PATCH v2 1/3] input/device: Replace UHID_FEATURE with UHID_GET_REPORT Archie Pusaka
2020-08-03 6:52 ` [Bluez PATCH v2 2/3] input/device: Implement handle for UHID_SET_REPORT Archie Pusaka
2020-08-03 6:52 ` [Bluez PATCH v2 3/3] input/device: Send UHID_DESTROY upon disconnection Archie Pusaka
@ 2020-08-03 20:01 ` Luiz Augusto von Dentz
2 siblings, 0 replies; 4+ messages in thread
From: Luiz Augusto von Dentz @ 2020-08-03 20:01 UTC (permalink / raw)
To: Archie Pusaka
Cc: linux-bluetooth, CrosBT Upstreaming, Archie Pusaka,
Alain Michaud, Abhishek Pandit-Subedi
Hi Archie,
On Sun, Aug 2, 2020 at 11:52 PM Archie Pusaka <apusaka@google.com> wrote:
>
> From: Archie Pusaka <apusaka@chromium.org>
>
> According to kernel's uhid.h, UHID_FEATURE is obsolete and is
> replaced with UHID_GET_REPORT.
>
> Reviewed-by: Alain Michaud <alainm@chromium.org>
> Reviewed-by: Abhishek Pandit-Subedi <abhishekpandit@chromium.org>
> ---
>
> Changes in v2:
> -Split into three patches, now this only handles UHID_GET_REPORT
>
> profiles/input/device.c | 41 +++++++++++++++++++-------------------
> profiles/input/hidp_defs.h | 2 +-
> 2 files changed, 22 insertions(+), 21 deletions(-)
>
> diff --git a/profiles/input/device.c b/profiles/input/device.c
> index ee0b2404a..ac4487f63 100644
> --- a/profiles/input/device.c
> +++ b/profiles/input/device.c
> @@ -220,7 +220,7 @@ static bool hidp_send_intr_message(struct input_device *idev, uint8_t hdr,
> return hidp_send_message(idev->intr_io, hdr, data, size);
> }
>
> -static bool uhid_send_feature_answer(struct input_device *idev,
> +static bool uhid_send_get_report_reply(struct input_device *idev,
> const uint8_t *data, size_t size,
> uint32_t id, uint16_t err)
> {
> @@ -230,8 +230,8 @@ static bool uhid_send_feature_answer(struct input_device *idev,
> if (data == NULL)
> size = 0;
>
> - if (size > sizeof(ev.u.feature_answer.data))
> - size = sizeof(ev.u.feature_answer.data);
> + if (size > sizeof(ev.u.get_report_reply.data))
> + size = sizeof(ev.u.get_report_reply.data);
>
> if (!idev->uhid_created) {
> DBG("HID report (%zu bytes) dropped", size);
> @@ -239,13 +239,13 @@ static bool uhid_send_feature_answer(struct input_device *idev,
> }
>
> memset(&ev, 0, sizeof(ev));
> - ev.type = UHID_FEATURE_ANSWER;
> - ev.u.feature_answer.id = id;
> - ev.u.feature_answer.err = err;
> - ev.u.feature_answer.size = size;
> + ev.type = UHID_GET_REPORT_REPLY;
> + ev.u.get_report_reply.id = id;
> + ev.u.get_report_reply.err = err;
> + ev.u.get_report_reply.size = size;
>
> if (size > 0)
> - memcpy(ev.u.feature_answer.data, data, size);
> + memcpy(ev.u.get_report_reply.data, data, size);
>
> ret = bt_uhid_send(idev->uhid, &ev);
> if (ret < 0) {
> @@ -399,7 +399,7 @@ static void hidp_recv_ctrl_handshake(struct input_device *idev, uint8_t param)
> case HIDP_HSHK_ERR_FATAL:
> if (pending_req_type == HIDP_TRANS_GET_REPORT) {
> DBG("GET_REPORT failed (%u)", param);
> - uhid_send_feature_answer(idev, NULL, 0,
> + uhid_send_get_report_reply(idev, NULL, 0,
> idev->report_rsp_id, EIO);
> pending_req_complete = true;
> } else if (pending_req_type == HIDP_TRANS_SET_REPORT) {
> @@ -460,8 +460,8 @@ static void hidp_recv_ctrl_data(struct input_device *idev, uint8_t param,
> switch (param) {
> case HIDP_DATA_RTYPE_FEATURE:
> case HIDP_DATA_RTYPE_INPUT:
> - case HIDP_DATA_RTYPE_OUPUT:
> - uhid_send_feature_answer(idev, data + 1, size - 1,
> + case HIDP_DATA_RTYPE_OUTPUT:
> + uhid_send_get_report_reply(idev, data + 1, size - 1,
> idev->report_rsp_id, 0);
> break;
>
> @@ -626,7 +626,7 @@ static void hidp_send_set_report(struct uhid_event *ev, void *user_data)
> break;
> case UHID_OUTPUT_REPORT:
> /* Send DATA on interrupt channel */
> - hdr = HIDP_TRANS_DATA | HIDP_DATA_RTYPE_OUPUT;
> + hdr = HIDP_TRANS_DATA | HIDP_DATA_RTYPE_OUTPUT;
> hidp_send_intr_message(idev, hdr, ev->u.output.data,
> ev->u.output.size);
> break;
> @@ -646,13 +646,13 @@ static void hidp_send_get_report(struct uhid_event *ev, void *user_data)
>
> if (idev->report_req_pending) {
> DBG("Old GET_REPORT or SET_REPORT still pending");
> - uhid_send_feature_answer(idev, NULL, 0, ev->u.feature.id,
> + uhid_send_get_report_reply(idev, NULL, 0, ev->u.get_report.id,
> EBUSY);
> return;
> }
>
> /* Send GET_REPORT on control channel */
> - switch (ev->u.feature.rtype) {
> + switch (ev->u.get_report.rtype) {
> case UHID_FEATURE_REPORT:
> hdr = HIDP_TRANS_GET_REPORT | HIDP_DATA_RTYPE_FEATURE;
> break;
> @@ -660,21 +660,21 @@ static void hidp_send_get_report(struct uhid_event *ev, void *user_data)
> hdr = HIDP_TRANS_GET_REPORT | HIDP_DATA_RTYPE_INPUT;
> break;
> case UHID_OUTPUT_REPORT:
> - hdr = HIDP_TRANS_GET_REPORT | HIDP_DATA_RTYPE_OUPUT;
> + hdr = HIDP_TRANS_GET_REPORT | HIDP_DATA_RTYPE_OUTPUT;
> break;
> default:
> - DBG("Unsupported HID report type %u", ev->u.feature.rtype);
> + DBG("Unsupported HID report type %u", ev->u.get_report.rtype);
> return;
> }
>
> - sent = hidp_send_ctrl_message(idev, hdr, &ev->u.feature.rnum,
> - sizeof(ev->u.feature.rnum));
> + sent = hidp_send_ctrl_message(idev, hdr, &ev->u.get_report.rnum,
> + sizeof(ev->u.get_report.rnum));
> if (sent) {
> idev->report_req_pending = hdr;
> idev->report_req_timer =
> g_timeout_add_seconds(REPORT_REQ_TIMEOUT,
> hidp_report_req_timeout, idev);
> - idev->report_rsp_id = ev->u.feature.id;
> + idev->report_rsp_id = ev->u.get_report.id;
> }
> }
>
> @@ -909,7 +909,8 @@ static int uhid_connadd(struct input_device *idev, struct hidp_connadd_req *req)
> }
>
> bt_uhid_register(idev->uhid, UHID_OUTPUT, hidp_send_set_report, idev);
> - bt_uhid_register(idev->uhid, UHID_FEATURE, hidp_send_get_report, idev);
> + bt_uhid_register(idev->uhid, UHID_GET_REPORT, hidp_send_get_report,
> + idev);
>
> idev->uhid_created = true;
>
> diff --git a/profiles/input/hidp_defs.h b/profiles/input/hidp_defs.h
> index 5dc479acf..bb9231dbb 100644
> --- a/profiles/input/hidp_defs.h
> +++ b/profiles/input/hidp_defs.h
> @@ -63,7 +63,7 @@
> #define HIDP_DATA_RSRVD_MASK 0x0c
> #define HIDP_DATA_RTYPE_OTHER 0x00
> #define HIDP_DATA_RTYPE_INPUT 0x01
> -#define HIDP_DATA_RTYPE_OUPUT 0x02
> +#define HIDP_DATA_RTYPE_OUTPUT 0x02
> #define HIDP_DATA_RTYPE_FEATURE 0x03
>
> /* HIDP protocol header parameters */
> --
> 2.28.0.163.g6104cc2f0b6-goog
Applied, thanks.
--
Luiz Augusto von Dentz
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2020-08-03 20:01 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-08-03 6:52 [Bluez PATCH v2 1/3] input/device: Replace UHID_FEATURE with UHID_GET_REPORT Archie Pusaka
2020-08-03 6:52 ` [Bluez PATCH v2 2/3] input/device: Implement handle for UHID_SET_REPORT Archie Pusaka
2020-08-03 6:52 ` [Bluez PATCH v2 3/3] input/device: Send UHID_DESTROY upon disconnection Archie Pusaka
2020-08-03 20:01 ` [Bluez PATCH v2 1/3] input/device: Replace UHID_FEATURE with UHID_GET_REPORT 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).