All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] android/hog: Remove read Protocol Mode characteristic
@ 2015-03-17 14:57 Mariusz Skamra
  2015-03-17 15:29 ` Luiz Augusto von Dentz
  0 siblings, 1 reply; 2+ messages in thread
From: Mariusz Skamra @ 2015-03-17 14:57 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Mariusz Skamra

We can faster set up a connection with HOG device if we won't
read Protocol Mode characteristic. According to HOGP specification:
"There is no requirements on Report Host to use the Protocol Mode
characteristic" ... "The Report Host may discover the Protocol Mode
characteristic for each HID Service on the GATT server."
It is used mainly by Boot Host to set the value to Boot
Protocol mode.
According to HID specification "Report protocol is the default
mode for all HID devices" so every HID device shall operate in
report protocol mode by default.
---
 android/hog.c | 51 ++-------------------------------------------------
 1 file changed, 2 insertions(+), 49 deletions(-)

diff --git a/android/hog.c b/android/hog.c
index ff77bb3..c27af86 100644
--- a/android/hog.c
+++ b/android/hog.c
@@ -63,16 +63,12 @@
 #define HOG_INFO_UUID		0x2A4A
 #define HOG_REPORT_MAP_UUID	0x2A4B
 #define HOG_REPORT_UUID		0x2A4D
-#define HOG_PROTO_MODE_UUID	0x2A4E
 #define HOG_CONTROL_POINT_UUID	0x2A4C
 
 #define HOG_REPORT_TYPE_INPUT	1
 #define HOG_REPORT_TYPE_OUTPUT	2
 #define HOG_REPORT_TYPE_FEATURE	3
 
-#define HOG_PROTO_MODE_BOOT    0
-#define HOG_PROTO_MODE_REPORT  1
-
 #define HOG_REPORT_MAP_MAX_SIZE        512
 #define HID_INFO_SIZE			4
 #define ATT_NOTIFICATION_HEADER_SIZE	3
@@ -91,7 +87,6 @@ struct bt_hog {
 	gboolean		has_report_id;
 	uint16_t		bcdhid;
 	uint8_t			bcountrycode;
-	uint16_t		proto_mode_handle;
 	uint16_t		ctrlpt_handle;
 	uint8_t			flags;
 	unsigned int		getrep_att;
@@ -1038,49 +1033,16 @@ static void info_read_cb(guint8 status, const guint8 *pdu, guint16 plen,
 			hog->bcdhid, hog->bcountrycode, hog->flags);
 }
 
-static void proto_mode_read_cb(guint8 status, const guint8 *pdu, guint16 plen,
-							gpointer user_data)
-{
-	struct gatt_request *req = user_data;
-	struct bt_hog *hog = req->user_data;
-	uint8_t value;
-	ssize_t vlen;
-
-	destroy_gatt_req(req);
-
-	if (status != 0) {
-		error("Protocol Mode characteristic read failed: %s",
-							att_ecode2str(status));
-		return;
-	}
-
-	vlen = dec_read_resp(pdu, plen, &value, sizeof(value));
-	if (vlen < 0) {
-		error("ATT protocol error");
-		return;
-	}
-
-	if (value == HOG_PROTO_MODE_BOOT) {
-		uint8_t nval = HOG_PROTO_MODE_REPORT;
-
-		DBG("HoG is operating in Boot Procotol Mode");
-
-		gatt_write_cmd(hog->attrib, hog->proto_mode_handle, &nval,
-						sizeof(nval), NULL, NULL);
-	} else if (value == HOG_PROTO_MODE_REPORT)
-		DBG("HoG is operating in Report Protocol Mode");
-}
-
 static void char_discovered_cb(uint8_t status, GSList *chars, void *user_data)
 {
 	struct gatt_request *req = user_data;
 	struct bt_hog *hog = req->user_data;
 	struct gatt_primary *primary = hog->primary;
 	bt_uuid_t report_uuid, report_map_uuid, info_uuid;
-	bt_uuid_t proto_mode_uuid, ctrlpt_uuid;
+	bt_uuid_t ctrlpt_uuid;
 	struct report *report;
 	GSList *l;
-	uint16_t info_handle = 0, proto_mode_handle = 0;
+	uint16_t info_handle = 0;
 
 	destroy_gatt_req(req);
 
@@ -1093,7 +1055,6 @@ static void char_discovered_cb(uint8_t status, GSList *chars, void *user_data)
 	bt_uuid16_create(&report_uuid, HOG_REPORT_UUID);
 	bt_uuid16_create(&report_map_uuid, HOG_REPORT_MAP_UUID);
 	bt_uuid16_create(&info_uuid, HOG_INFO_UUID);
-	bt_uuid16_create(&proto_mode_uuid, HOG_PROTO_MODE_UUID);
 	bt_uuid16_create(&ctrlpt_uuid, HOG_CONTROL_POINT_UUID);
 
 	for (l = chars; l; l = g_slist_next(l)) {
@@ -1121,18 +1082,10 @@ static void char_discovered_cb(uint8_t status, GSList *chars, void *user_data)
 			discover_external(hog, hog->attrib, start, end, hog);
 		} else if (bt_uuid_cmp(&uuid, &info_uuid) == 0)
 			info_handle = chr->value_handle;
-		else if (bt_uuid_cmp(&uuid, &proto_mode_uuid) == 0)
-			proto_mode_handle = chr->value_handle;
 		else if (bt_uuid_cmp(&uuid, &ctrlpt_uuid) == 0)
 			hog->ctrlpt_handle = chr->value_handle;
 	}
 
-	if (proto_mode_handle) {
-		hog->proto_mode_handle = proto_mode_handle;
-		read_char(hog, hog->attrib, proto_mode_handle,
-						proto_mode_read_cb, hog);
-	}
-
 	if (info_handle)
 		read_char(hog, hog->attrib, info_handle, info_read_cb, hog);
 }
-- 
1.9.1


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

* Re: [PATCH] android/hog: Remove read Protocol Mode characteristic
  2015-03-17 14:57 [PATCH] android/hog: Remove read Protocol Mode characteristic Mariusz Skamra
@ 2015-03-17 15:29 ` Luiz Augusto von Dentz
  0 siblings, 0 replies; 2+ messages in thread
From: Luiz Augusto von Dentz @ 2015-03-17 15:29 UTC (permalink / raw)
  To: Mariusz Skamra; +Cc: linux-bluetooth

Hi Mariusz,

On Tue, Mar 17, 2015 at 4:57 PM, Mariusz Skamra
<mariusz.skamra@tieto.com> wrote:
> We can faster set up a connection with HOG device if we won't
> read Protocol Mode characteristic. According to HOGP specification:
> "There is no requirements on Report Host to use the Protocol Mode
> characteristic" ... "The Report Host may discover the Protocol Mode
> characteristic for each HID Service on the GATT server."
> It is used mainly by Boot Host to set the value to Boot
> Protocol mode.
> According to HID specification "Report protocol is the default
> mode for all HID devices" so every HID device shall operate in
> report protocol mode by default.

I wonder if this would break if for example a bios setup the for boot
mode and set CCC then upon reconnecting I think it would remember its
mode, anyway this only speed up things for the first connection for
reconnecting we are not rediscovering anything.

> ---
>  android/hog.c | 51 ++-------------------------------------------------
>  1 file changed, 2 insertions(+), 49 deletions(-)
>
> diff --git a/android/hog.c b/android/hog.c
> index ff77bb3..c27af86 100644
> --- a/android/hog.c
> +++ b/android/hog.c
> @@ -63,16 +63,12 @@
>  #define HOG_INFO_UUID          0x2A4A
>  #define HOG_REPORT_MAP_UUID    0x2A4B
>  #define HOG_REPORT_UUID                0x2A4D
> -#define HOG_PROTO_MODE_UUID    0x2A4E
>  #define HOG_CONTROL_POINT_UUID 0x2A4C
>
>  #define HOG_REPORT_TYPE_INPUT  1
>  #define HOG_REPORT_TYPE_OUTPUT 2
>  #define HOG_REPORT_TYPE_FEATURE        3
>
> -#define HOG_PROTO_MODE_BOOT    0
> -#define HOG_PROTO_MODE_REPORT  1
> -
>  #define HOG_REPORT_MAP_MAX_SIZE        512
>  #define HID_INFO_SIZE                  4
>  #define ATT_NOTIFICATION_HEADER_SIZE   3
> @@ -91,7 +87,6 @@ struct bt_hog {
>         gboolean                has_report_id;
>         uint16_t                bcdhid;
>         uint8_t                 bcountrycode;
> -       uint16_t                proto_mode_handle;
>         uint16_t                ctrlpt_handle;
>         uint8_t                 flags;
>         unsigned int            getrep_att;
> @@ -1038,49 +1033,16 @@ static void info_read_cb(guint8 status, const guint8 *pdu, guint16 plen,
>                         hog->bcdhid, hog->bcountrycode, hog->flags);
>  }
>
> -static void proto_mode_read_cb(guint8 status, const guint8 *pdu, guint16 plen,
> -                                                       gpointer user_data)
> -{
> -       struct gatt_request *req = user_data;
> -       struct bt_hog *hog = req->user_data;
> -       uint8_t value;
> -       ssize_t vlen;
> -
> -       destroy_gatt_req(req);
> -
> -       if (status != 0) {
> -               error("Protocol Mode characteristic read failed: %s",
> -                                                       att_ecode2str(status));
> -               return;
> -       }
> -
> -       vlen = dec_read_resp(pdu, plen, &value, sizeof(value));
> -       if (vlen < 0) {
> -               error("ATT protocol error");
> -               return;
> -       }
> -
> -       if (value == HOG_PROTO_MODE_BOOT) {
> -               uint8_t nval = HOG_PROTO_MODE_REPORT;
> -
> -               DBG("HoG is operating in Boot Procotol Mode");
> -
> -               gatt_write_cmd(hog->attrib, hog->proto_mode_handle, &nval,
> -                                               sizeof(nval), NULL, NULL);
> -       } else if (value == HOG_PROTO_MODE_REPORT)
> -               DBG("HoG is operating in Report Protocol Mode");
> -}
> -
>  static void char_discovered_cb(uint8_t status, GSList *chars, void *user_data)
>  {
>         struct gatt_request *req = user_data;
>         struct bt_hog *hog = req->user_data;
>         struct gatt_primary *primary = hog->primary;
>         bt_uuid_t report_uuid, report_map_uuid, info_uuid;
> -       bt_uuid_t proto_mode_uuid, ctrlpt_uuid;
> +       bt_uuid_t ctrlpt_uuid;
>         struct report *report;
>         GSList *l;
> -       uint16_t info_handle = 0, proto_mode_handle = 0;
> +       uint16_t info_handle = 0;
>
>         destroy_gatt_req(req);
>
> @@ -1093,7 +1055,6 @@ static void char_discovered_cb(uint8_t status, GSList *chars, void *user_data)
>         bt_uuid16_create(&report_uuid, HOG_REPORT_UUID);
>         bt_uuid16_create(&report_map_uuid, HOG_REPORT_MAP_UUID);
>         bt_uuid16_create(&info_uuid, HOG_INFO_UUID);
> -       bt_uuid16_create(&proto_mode_uuid, HOG_PROTO_MODE_UUID);
>         bt_uuid16_create(&ctrlpt_uuid, HOG_CONTROL_POINT_UUID);
>
>         for (l = chars; l; l = g_slist_next(l)) {
> @@ -1121,18 +1082,10 @@ static void char_discovered_cb(uint8_t status, GSList *chars, void *user_data)
>                         discover_external(hog, hog->attrib, start, end, hog);
>                 } else if (bt_uuid_cmp(&uuid, &info_uuid) == 0)
>                         info_handle = chr->value_handle;
> -               else if (bt_uuid_cmp(&uuid, &proto_mode_uuid) == 0)
> -                       proto_mode_handle = chr->value_handle;
>                 else if (bt_uuid_cmp(&uuid, &ctrlpt_uuid) == 0)
>                         hog->ctrlpt_handle = chr->value_handle;
>         }
>
> -       if (proto_mode_handle) {
> -               hog->proto_mode_handle = proto_mode_handle;
> -               read_char(hog, hog->attrib, proto_mode_handle,
> -                                               proto_mode_read_cb, hog);
> -       }
> -
>         if (info_handle)
>                 read_char(hog, hog->attrib, info_handle, info_read_cb, hog);
>  }
> --
> 1.9.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html



-- 
Luiz Augusto von Dentz

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

end of thread, other threads:[~2015-03-17 15:29 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-03-17 14:57 [PATCH] android/hog: Remove read Protocol Mode characteristic Mariusz Skamra
2015-03-17 15:29 ` Luiz Augusto von Dentz

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.