163bf37cdSMilanka Ringwald /* 263bf37cdSMilanka Ringwald * Copyright (C) 2020 BlueKitchen GmbH 363bf37cdSMilanka Ringwald * 463bf37cdSMilanka Ringwald * Redistribution and use in source and binary forms, with or without 563bf37cdSMilanka Ringwald * modification, are permitted provided that the following conditions 663bf37cdSMilanka Ringwald * are met: 763bf37cdSMilanka Ringwald * 863bf37cdSMilanka Ringwald * 1. Redistributions of source code must retain the above copyright 963bf37cdSMilanka Ringwald * notice, this list of conditions and the following disclaimer. 1063bf37cdSMilanka Ringwald * 2. Redistributions in binary form must reproduce the above copyright 1163bf37cdSMilanka Ringwald * notice, this list of conditions and the following disclaimer in the 1263bf37cdSMilanka Ringwald * documentation and/or other materials provided with the distribution. 1363bf37cdSMilanka Ringwald * 3. Neither the name of the copyright holders nor the names of 1463bf37cdSMilanka Ringwald * contributors may be used to endorse or promote products derived 1563bf37cdSMilanka Ringwald * from this software without specific prior written permission. 1663bf37cdSMilanka Ringwald * 4. Any redistribution, use, or modification is done solely for 1763bf37cdSMilanka Ringwald * personal benefit and not for any commercial purpose or for 1863bf37cdSMilanka Ringwald * monetary gain. 1963bf37cdSMilanka Ringwald * 2063bf37cdSMilanka Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 2163bf37cdSMilanka Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2263bf37cdSMilanka Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 2363bf37cdSMilanka Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS 2463bf37cdSMilanka Ringwald * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 2563bf37cdSMilanka Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 2663bf37cdSMilanka Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 2763bf37cdSMilanka Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 2863bf37cdSMilanka Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 2963bf37cdSMilanka Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 3063bf37cdSMilanka Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3163bf37cdSMilanka Ringwald * SUCH DAMAGE. 3263bf37cdSMilanka Ringwald * 3363bf37cdSMilanka Ringwald * Please inquire about commercial licensing options at 3463bf37cdSMilanka Ringwald * [email protected] 3563bf37cdSMilanka Ringwald * 3663bf37cdSMilanka Ringwald */ 3763bf37cdSMilanka Ringwald 3863bf37cdSMilanka Ringwald #ifndef HID_HOST_H 3963bf37cdSMilanka Ringwald #define HID_HOST_H 4063bf37cdSMilanka Ringwald 4163bf37cdSMilanka Ringwald #include <stdint.h> 4263bf37cdSMilanka Ringwald #include "btstack_defines.h" 4363bf37cdSMilanka Ringwald #include "bluetooth.h" 4463bf37cdSMilanka Ringwald #include "btstack_hid_parser.h" 4563bf37cdSMilanka Ringwald #include "classic/hid.h" 4663bf37cdSMilanka Ringwald 4763bf37cdSMilanka Ringwald #if defined __cplusplus 4863bf37cdSMilanka Ringwald extern "C" { 4963bf37cdSMilanka Ringwald #endif 5063bf37cdSMilanka Ringwald 51fd7ba7a6SMilanka Ringwald typedef enum { 52fd7ba7a6SMilanka Ringwald HID_HOST_IDLE, 53fd7ba7a6SMilanka Ringwald HID_HOST_W2_SEND_SDP_QUERY, 54fd7ba7a6SMilanka Ringwald HID_HOST_W4_SDP_QUERY_RESULT, 55fd7ba7a6SMilanka Ringwald 56fd7ba7a6SMilanka Ringwald HID_HOST_W4_CONTROL_CONNECTION_ESTABLISHED, 57fd7ba7a6SMilanka Ringwald HID_HOST_CONTROL_CONNECTION_ESTABLISHED, 58fd7ba7a6SMilanka Ringwald 59fd7ba7a6SMilanka Ringwald HID_HOST_W4_SET_BOOT_MODE, 60fd7ba7a6SMilanka Ringwald HID_HOST_W4_INTERRUPT_CONNECTION_ESTABLISHED, 61fd7ba7a6SMilanka Ringwald HID_HOST_CONNECTION_ESTABLISHED, 62fd7ba7a6SMilanka Ringwald 63fd7ba7a6SMilanka Ringwald HID_HOST_W2_SEND_GET_REPORT, 64fd7ba7a6SMilanka Ringwald HID_HOST_W4_GET_REPORT_RESPONSE, 65fd7ba7a6SMilanka Ringwald HID_HOST_W2_SEND_SET_REPORT, 66fd7ba7a6SMilanka Ringwald HID_HOST_W4_SET_REPORT_RESPONSE, 67fd7ba7a6SMilanka Ringwald HID_HOST_W2_SEND_GET_PROTOCOL, 68fd7ba7a6SMilanka Ringwald HID_HOST_W4_GET_PROTOCOL_RESPONSE, 69fd7ba7a6SMilanka Ringwald HID_HOST_W2_SEND_SET_PROTOCOL, 70fd7ba7a6SMilanka Ringwald HID_HOST_W4_SET_PROTOCOL_RESPONSE, 71fd7ba7a6SMilanka Ringwald HID_HOST_W2_SEND_REPORT, 72*ab30106eSMilanka Ringwald HID_HOST_W4_SEND_REPORT_RESPONSE, 73*ab30106eSMilanka Ringwald 74*ab30106eSMilanka Ringwald HID_HOST_W4_INTERRUPT_CONNECTION_DISCONNECTED, 75*ab30106eSMilanka Ringwald HID_HOST_W4_CONTROL_CONNECTION_DISCONNECTED 76fd7ba7a6SMilanka Ringwald } hid_host_state_t; 77fd7ba7a6SMilanka Ringwald 78fd7ba7a6SMilanka Ringwald typedef struct { 79*ab30106eSMilanka Ringwald btstack_linked_item_t item; 80*ab30106eSMilanka Ringwald 81fd7ba7a6SMilanka Ringwald uint16_t hid_cid; 82fd7ba7a6SMilanka Ringwald hci_con_handle_t con_handle; 83fd7ba7a6SMilanka Ringwald 84fd7ba7a6SMilanka Ringwald bd_addr_t remote_addr; 85fd7ba7a6SMilanka Ringwald bool incoming; 86fd7ba7a6SMilanka Ringwald bool boot_mode; 87fd7ba7a6SMilanka Ringwald 88fd7ba7a6SMilanka Ringwald uint16_t control_cid; 89fd7ba7a6SMilanka Ringwald uint16_t control_psm; 90fd7ba7a6SMilanka Ringwald uint16_t interrupt_cid; 91fd7ba7a6SMilanka Ringwald uint16_t interrupt_psm; 92fd7ba7a6SMilanka Ringwald 93fd7ba7a6SMilanka Ringwald hid_host_state_t state; 94fd7ba7a6SMilanka Ringwald hid_protocol_mode_t protocol_mode; 95fd7ba7a6SMilanka Ringwald bool unplugged; 96fd7ba7a6SMilanka Ringwald 97fd7ba7a6SMilanka Ringwald uint16_t hid_descriptor_offset; 98fd7ba7a6SMilanka Ringwald uint16_t hid_descriptor_len; 99fd7ba7a6SMilanka Ringwald uint16_t hid_descriptor_max_len; 100fd7ba7a6SMilanka Ringwald 101fd7ba7a6SMilanka Ringwald uint8_t user_request_can_send_now; 102fd7ba7a6SMilanka Ringwald 103fd7ba7a6SMilanka Ringwald // get report 104fd7ba7a6SMilanka Ringwald hid_report_type_t report_type; 105fd7ba7a6SMilanka Ringwald uint8_t report_id; 106fd7ba7a6SMilanka Ringwald 107fd7ba7a6SMilanka Ringwald // set report 108fd7ba7a6SMilanka Ringwald uint8_t * report; 109fd7ba7a6SMilanka Ringwald uint16_t report_len; 110fd7ba7a6SMilanka Ringwald } hid_host_connection_t; 111fd7ba7a6SMilanka Ringwald 11263bf37cdSMilanka Ringwald /* API_START */ 11363bf37cdSMilanka Ringwald /** 11463bf37cdSMilanka Ringwald * @brief Set up HID Host 11563bf37cdSMilanka Ringwald * @param boot_protocol_mode_supported 11663bf37cdSMilanka Ringwald * @param hid_descriptor_storage 11763bf37cdSMilanka Ringwald * @param hid_descriptor_storage_len 11863bf37cdSMilanka Ringwald */ 119fd7ba7a6SMilanka Ringwald void hid_host_init(uint8_t * hid_descriptor_storage, uint16_t hid_descriptor_storage_len); 12063bf37cdSMilanka Ringwald 12163bf37cdSMilanka Ringwald /** 12263bf37cdSMilanka Ringwald * @brief Register callback for the HID Device Host. 12363bf37cdSMilanka Ringwald * @param callback 12463bf37cdSMilanka Ringwald */ 12563bf37cdSMilanka Ringwald void hid_host_register_packet_handler(btstack_packet_handler_t callback); 12663bf37cdSMilanka Ringwald 12763bf37cdSMilanka Ringwald /* 12863bf37cdSMilanka Ringwald * @brief Create HID connection to HID Host 129fd7ba7a6SMilanka Ringwald * @param remote_addr 13063bf37cdSMilanka Ringwald * @param hid_cid to use for other commands 13163bf37cdSMilanka Ringwald * @result status 13263bf37cdSMilanka Ringwald */ 133fd7ba7a6SMilanka Ringwald uint8_t hid_host_connect(bd_addr_t remote_addr, hid_protocol_mode_t protocol_mode, uint16_t * hid_cid); 13463bf37cdSMilanka Ringwald 13563bf37cdSMilanka Ringwald /* 13663bf37cdSMilanka Ringwald * @brief Disconnect from HID Host 13763bf37cdSMilanka Ringwald * @param hid_cid 13863bf37cdSMilanka Ringwald */ 13963bf37cdSMilanka Ringwald void hid_host_disconnect(uint16_t hid_cid); 14063bf37cdSMilanka Ringwald 14163bf37cdSMilanka Ringwald /** 14263bf37cdSMilanka Ringwald * @brief Request can send now event to send HID Report 14363bf37cdSMilanka Ringwald * Generates an HID_SUBEVENT_CAN_SEND_NOW subevent 14463bf37cdSMilanka Ringwald * @param hid_cid 14563bf37cdSMilanka Ringwald */ 14663bf37cdSMilanka Ringwald void hid_host_request_can_send_now_event(uint16_t hid_cid); 14763bf37cdSMilanka Ringwald 14863bf37cdSMilanka Ringwald /** 14963bf37cdSMilanka Ringwald * @brief Send HID message on interrupt channel 15063bf37cdSMilanka Ringwald * @param hid_cid 15163bf37cdSMilanka Ringwald */ 15263bf37cdSMilanka Ringwald void hid_host_send_interrupt_message(uint16_t hid_cid, const uint8_t * message, uint16_t message_len); 15363bf37cdSMilanka Ringwald 15463bf37cdSMilanka Ringwald /** 15563bf37cdSMilanka Ringwald * @brief Send HID message on control channel 15663bf37cdSMilanka Ringwald * @param hid_cid 15763bf37cdSMilanka Ringwald */ 15863bf37cdSMilanka Ringwald void hid_host_send_control_message(uint16_t hid_cid, const uint8_t * message, uint16_t message_len); 15963bf37cdSMilanka Ringwald 16063bf37cdSMilanka Ringwald 161*ab30106eSMilanka Ringwald uint8_t hid_host_send_set_protocol_mode(uint16_t hid_cid, hid_protocol_mode_t protocol_mode); 162*ab30106eSMilanka Ringwald uint8_t hid_host_send_get_protocol(uint16_t hid_cid); 163*ab30106eSMilanka Ringwald 164*ab30106eSMilanka Ringwald uint8_t hid_host_send_suspend(uint16_t hid_cid); 165*ab30106eSMilanka Ringwald uint8_t hid_host_send_exit_suspend(uint16_t hid_cid); 166*ab30106eSMilanka Ringwald 167*ab30106eSMilanka Ringwald uint8_t hid_host_send_virtual_cable_unplug(uint16_t hid_cid); 168*ab30106eSMilanka Ringwald 169*ab30106eSMilanka Ringwald uint8_t hid_host_send_output_report(uint16_t hid_cid, uint8_t report_id, uint8_t * report, uint8_t report_len); 170*ab30106eSMilanka Ringwald 171*ab30106eSMilanka Ringwald uint8_t hid_host_send_set_output_report(uint16_t hid_cid, uint8_t report_id, uint8_t * report, uint8_t report_len); 172*ab30106eSMilanka Ringwald uint8_t hid_host_send_set_feature_report(uint16_t hid_cid, uint8_t report_id, uint8_t * report, uint8_t report_len); 173*ab30106eSMilanka Ringwald uint8_t hid_host_send_set_input_report(uint16_t hid_cid, uint8_t report_id, uint8_t * report, uint8_t report_len); 174*ab30106eSMilanka Ringwald 175*ab30106eSMilanka Ringwald uint8_t hid_host_send_get_output_report(uint16_t hid_cid, uint8_t report_id); 176*ab30106eSMilanka Ringwald uint8_t hid_host_send_get_feature_report(uint16_t hid_cid, uint8_t report_id); 177*ab30106eSMilanka Ringwald uint8_t hid_host_send_get_input_report(uint16_t hid_cid, uint8_t report_id); 178*ab30106eSMilanka Ringwald 17963bf37cdSMilanka Ringwald 18063bf37cdSMilanka Ringwald /* API_END */ 18163bf37cdSMilanka Ringwald 18263bf37cdSMilanka Ringwald 18363bf37cdSMilanka Ringwald #if defined __cplusplus 18463bf37cdSMilanka Ringwald } 18563bf37cdSMilanka Ringwald #endif 18663bf37cdSMilanka Ringwald 18763bf37cdSMilanka Ringwald #endif 188