mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-01-26 12:35:25 +00:00
hid_device: move ID validity check from test to library
This commit is contained in:
parent
662cddc29e
commit
dbcaefc7b3
@ -439,7 +439,6 @@ int btstack_hid_get_report_size_for_id(int report_id, hid_report_type_t report_t
|
|||||||
break;
|
break;
|
||||||
case Main:
|
case Main:
|
||||||
if (current_report_id != report_id) break;
|
if (current_report_id != report_id) break;
|
||||||
// printf("tag %d, report_type %d\n", item.item_tag, report_type);
|
|
||||||
switch ((MainItemTag)item.item_tag){
|
switch ((MainItemTag)item.item_tag){
|
||||||
case Input:
|
case Input:
|
||||||
if (report_type != HID_REPORT_TYPE_INPUT) break;
|
if (report_type != HID_REPORT_TYPE_INPUT) break;
|
||||||
@ -468,4 +467,53 @@ int btstack_hid_get_report_size_for_id(int report_id, hid_report_type_t report_t
|
|||||||
hid_descriptor += item.item_size;
|
hid_descriptor += item.item_size;
|
||||||
}
|
}
|
||||||
return (total_report_size + 7)/8;
|
return (total_report_size + 7)/8;
|
||||||
|
}
|
||||||
|
|
||||||
|
hid_report_id_status_t btstack_hid_id_valid(int report_id, uint16_t hid_descriptor_len, const uint8_t * hid_descriptor){
|
||||||
|
int current_report_id = 0;
|
||||||
|
while (hid_descriptor_len){
|
||||||
|
hid_descriptor_item_t item;
|
||||||
|
btstack_hid_parse_descriptor_item(&item, hid_descriptor, hid_descriptor_len);
|
||||||
|
switch (item.item_type){
|
||||||
|
case Global:
|
||||||
|
switch ((GlobalItemTag)item.item_tag){
|
||||||
|
case ReportID:
|
||||||
|
current_report_id = item.item_value;
|
||||||
|
// printf("current ID %d, searched ID %d\n", current_report_id, report_id);
|
||||||
|
if (current_report_id != report_id) break;
|
||||||
|
return HID_REPORT_ID_VALID;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
hid_descriptor_len -= item.item_size;
|
||||||
|
hid_descriptor += item.item_size;
|
||||||
|
}
|
||||||
|
if (current_report_id != 0) return HID_REPORT_ID_INVALID;
|
||||||
|
return HID_REPORT_ID_UNDECLARED;
|
||||||
|
}
|
||||||
|
|
||||||
|
int btstack_hid_report_id_declared(uint16_t hid_descriptor_len, const uint8_t * hid_descriptor){
|
||||||
|
while (hid_descriptor_len){
|
||||||
|
hid_descriptor_item_t item;
|
||||||
|
btstack_hid_parse_descriptor_item(&item, hid_descriptor, hid_descriptor_len);
|
||||||
|
switch (item.item_type){
|
||||||
|
case Global:
|
||||||
|
switch ((GlobalItemTag)item.item_tag){
|
||||||
|
case ReportID:
|
||||||
|
return 1;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
hid_descriptor_len -= item.item_size;
|
||||||
|
hid_descriptor += item.item_size;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
@ -114,6 +114,12 @@ typedef enum {
|
|||||||
HID_REPORT_TYPE_FEATURE
|
HID_REPORT_TYPE_FEATURE
|
||||||
} hid_report_type_t;
|
} hid_report_type_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
HID_REPORT_ID_UNDECLARED,
|
||||||
|
HID_REPORT_ID_VALID,
|
||||||
|
HID_REPORT_ID_INVALID
|
||||||
|
} hid_report_id_status_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
||||||
// Descriptor
|
// Descriptor
|
||||||
@ -199,6 +205,21 @@ void btstack_hid_parse_descriptor_item(hid_descriptor_item_t * item, const uint8
|
|||||||
* @param hid_descriptor
|
* @param hid_descriptor
|
||||||
*/
|
*/
|
||||||
int btstack_hid_get_report_size_for_id(int report_id, hid_report_type_t report_type, uint16_t hid_descriptor_len, const uint8_t * hid_descriptor);
|
int btstack_hid_get_report_size_for_id(int report_id, hid_report_type_t report_type, uint16_t hid_descriptor_len, const uint8_t * hid_descriptor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Parses descriptor and returns report size for given report ID and report type
|
||||||
|
* @param report_id
|
||||||
|
* @param hid_descriptor_len
|
||||||
|
* @param hid_descriptor
|
||||||
|
*/
|
||||||
|
hid_report_id_status_t btstack_hid_id_valid(int report_id, uint16_t hid_descriptor_len, const uint8_t * hid_descriptor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Parses descriptor and returns 1 if report ID found
|
||||||
|
* @param hid_descriptor_len
|
||||||
|
* @param hid_descriptor
|
||||||
|
*/
|
||||||
|
int btstack_hid_report_id_declared(uint16_t hid_descriptor_len, const uint8_t * hid_descriptor);
|
||||||
/* API_END */
|
/* API_END */
|
||||||
|
|
||||||
#if defined __cplusplus
|
#if defined __cplusplus
|
||||||
|
@ -79,7 +79,6 @@ typedef struct hid_device {
|
|||||||
|
|
||||||
static hid_device_t _hid_device;
|
static hid_device_t _hid_device;
|
||||||
static uint8_t hid_boot_protocol_mode_supported;
|
static uint8_t hid_boot_protocol_mode_supported;
|
||||||
static uint8_t hid_report_ids_declared;
|
|
||||||
static const uint8_t * hid_descriptor;
|
static const uint8_t * hid_descriptor;
|
||||||
static uint16_t hid_descriptor_len;
|
static uint16_t hid_descriptor_len;
|
||||||
|
|
||||||
@ -383,7 +382,7 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t * pack
|
|||||||
switch (device->protocol_mode){
|
switch (device->protocol_mode){
|
||||||
case HID_PROTOCOL_MODE_BOOT:
|
case HID_PROTOCOL_MODE_BOOT:
|
||||||
// printf("HID_PROTOCOL_MODE_BOOT \n");
|
// printf("HID_PROTOCOL_MODE_BOOT \n");
|
||||||
if (!hid_report_ids_declared || packet_size < 2){
|
if (!btstack_hid_report_id_declared(hid_descriptor_len, hid_descriptor) || packet_size < 2){
|
||||||
device->report_status = HID_HANDSHAKE_PARAM_TYPE_ERR_INVALID_PARAMETER;
|
device->report_status = HID_HANDSHAKE_PARAM_TYPE_ERR_INVALID_PARAMETER;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -391,7 +390,7 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t * pack
|
|||||||
break;
|
break;
|
||||||
case HID_PROTOCOL_MODE_REPORT:
|
case HID_PROTOCOL_MODE_REPORT:
|
||||||
// printf("HID_PROTOCOL_MODE_REPORT, hid_report_ids_declared %d\n", hid_report_ids_declared);
|
// printf("HID_PROTOCOL_MODE_REPORT, hid_report_ids_declared %d\n", hid_report_ids_declared);
|
||||||
if (!hid_report_ids_declared) break;
|
if (!btstack_hid_report_id_declared(hid_descriptor_len, hid_descriptor)) break;
|
||||||
|
|
||||||
if (packet_size < 2){
|
if (packet_size < 2){
|
||||||
device->report_status = HID_HANDSHAKE_PARAM_TYPE_ERR_INVALID_PARAMETER;
|
device->report_status = HID_HANDSHAKE_PARAM_TYPE_ERR_INVALID_PARAMETER;
|
||||||
@ -410,7 +409,7 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t * pack
|
|||||||
// l2cap_request_can_send_now_event(device->control_cid);
|
// l2cap_request_can_send_now_event(device->control_cid);
|
||||||
hid_device_request_can_send_now_event(channel);
|
hid_device_request_can_send_now_event(channel);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HID_MESSAGE_TYPE_SET_REPORT:
|
case HID_MESSAGE_TYPE_SET_REPORT:
|
||||||
device->state = HID_DEVICE_W2_SET_REPORT;
|
device->state = HID_DEVICE_W2_SET_REPORT;
|
||||||
device->max_packet_size = l2cap_max_mtu();
|
device->max_packet_size = l2cap_max_mtu();
|
||||||
@ -862,3 +861,18 @@ int hid_report_size_valid(uint16_t cid, int report_id, hid_report_type_t report_
|
|||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
hid_report_id_status_t hid_report_id_status(uint16_t cid, uint16_t report_id){
|
||||||
|
if (hid_device_in_boot_protocol_mode(cid)){
|
||||||
|
switch (report_id){
|
||||||
|
case HID_BOOT_MODE_KEYBOARD_ID:
|
||||||
|
case HID_BOOT_MODE_MOUSE_ID:
|
||||||
|
return HID_REPORT_ID_VALID;
|
||||||
|
default:
|
||||||
|
return HID_REPORT_ID_INVALID;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return btstack_hid_id_valid(report_id, hid_descriptor_len, hid_descriptor);
|
||||||
|
}
|
||||||
|
}
|
@ -90,12 +90,6 @@ typedef enum {
|
|||||||
HID_PROTOCOL_MODE_REPORT
|
HID_PROTOCOL_MODE_REPORT
|
||||||
} hid_protocol_mode_t;
|
} hid_protocol_mode_t;
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
HID_REPORT_ID_UNDECLARED,
|
|
||||||
HID_REPORT_ID_VALID,
|
|
||||||
HID_REPORT_ID_INVALID
|
|
||||||
} hid_report_id_status_t;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Create HID Device SDP service record.
|
* @brief Create HID Device SDP service record.
|
||||||
* @param service Empty buffer in which a new service record will be stored.
|
* @param service Empty buffer in which a new service record will be stored.
|
||||||
@ -197,6 +191,7 @@ int hid_device_in_boot_protocol_mode(uint16_t hid_cid);
|
|||||||
|
|
||||||
|
|
||||||
int hid_report_size_valid(uint16_t cid, int report_id, hid_report_type_t report_type, int report_size);
|
int hid_report_size_valid(uint16_t cid, int report_id, hid_report_type_t report_type, int report_size);
|
||||||
|
hid_report_id_status_t hid_report_id_status(uint16_t cid, uint16_t report_id);
|
||||||
/* API_END */
|
/* API_END */
|
||||||
|
|
||||||
/* Only needed for PTS Testing */
|
/* Only needed for PTS Testing */
|
||||||
|
@ -281,24 +281,6 @@ static int prepare_keyboard_report(hid_report_type_t report_type, int modifier,
|
|||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
static hid_report_id_status_t hid_report_id_status(uint16_t cid, uint16_t report_id){
|
|
||||||
if (hid_device_in_boot_protocol_mode(cid)){
|
|
||||||
switch (report_id){
|
|
||||||
case HID_BOOT_MODE_KEYBOARD_ID:
|
|
||||||
case HID_BOOT_MODE_MOUSE_ID:
|
|
||||||
return HID_REPORT_ID_VALID;
|
|
||||||
default:
|
|
||||||
return HID_REPORT_ID_INVALID;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
#ifdef REPORT_ID_DECLARED
|
|
||||||
if (report_id != 1) return HID_REPORT_ID_INVALID;
|
|
||||||
return HID_REPORT_ID_VALID;
|
|
||||||
#endif
|
|
||||||
return HID_REPORT_ID_UNDECLARED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static hid_handshake_param_type_t hid_get_report_callback(uint16_t cid, hid_report_type_t report_type, uint16_t report_id, uint8_t report_max_size, int * out_report_size, uint8_t * out_report){
|
static hid_handshake_param_type_t hid_get_report_callback(uint16_t cid, hid_report_type_t report_type, uint16_t report_id, uint8_t report_max_size, int * out_report_size, uint8_t * out_report){
|
||||||
UNUSED(cid);
|
UNUSED(cid);
|
||||||
UNUSED(report_max_size);
|
UNUSED(report_max_size);
|
||||||
@ -347,10 +329,6 @@ static hid_handshake_param_type_t hid_set_report_callback(uint16_t cid, hid_repo
|
|||||||
UNUSED(cid);
|
UNUSED(cid);
|
||||||
UNUSED(report);
|
UNUSED(report);
|
||||||
int pos = 0;
|
int pos = 0;
|
||||||
|
|
||||||
printf("set report, size %d\n", report_size);
|
|
||||||
printf_hexdump(report, report_size);
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
int report_id = report[0];
|
int report_id = report[0];
|
||||||
hid_report_id_status_t report_id_status = hid_report_id_status(cid, report_id);
|
hid_report_id_status_t report_id_status = hid_report_id_status(cid, report_id);
|
||||||
@ -365,7 +343,6 @@ static hid_handshake_param_type_t hid_set_report_callback(uint16_t cid, hid_repo
|
|||||||
report_id = 0;
|
report_id = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
printf(" report_id %d \n", report_id);
|
|
||||||
|
|
||||||
if (!hid_report_size_valid(cid, report_id, report_type, report_size-pos)){
|
if (!hid_report_size_valid(cid, report_id, report_type, report_size-pos)){
|
||||||
printf("invalid report size\n");
|
printf("invalid report size\n");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user