258 lines
8.7 KiB
C
258 lines
8.7 KiB
C
|
// Copyright 2017-2019 Espressif Systems (Shanghai) PTE LTD
|
||
|
//
|
||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
// you may not use this file except in compliance with the License.
|
||
|
// You may obtain a copy of the License at
|
||
|
|
||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||
|
//
|
||
|
// Unless required by applicable law or agreed to in writing, software
|
||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
// See the License for the specific language governing permissions and
|
||
|
// limitations under the License.
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
#include <stdint.h>
|
||
|
#include <stddef.h>
|
||
|
#include <stdbool.h>
|
||
|
#include <stdio.h>
|
||
|
|
||
|
/* HID Report Map Values */
|
||
|
#define HID_RM_INPUT 0x80
|
||
|
#define HID_RM_OUTPUT 0x90
|
||
|
#define HID_RM_FEATURE 0xb0
|
||
|
#define HID_RM_COLLECTION 0xa0
|
||
|
#define HID_RM_END_COLLECTION 0xc0
|
||
|
#define HID_RM_USAGE_PAGE 0x04
|
||
|
#define HID_RM_LOGICAL_MINIMUM 0x14
|
||
|
#define HID_RM_LOGICAL_MAXIMUM 0x24
|
||
|
#define HID_RM_PHYSICAL_MINIMUM 0x34
|
||
|
#define HID_RM_PHYSICAL_MAXIMUM 0x44
|
||
|
#define HID_RM_UNIT_EXPONENT 0x54
|
||
|
#define HID_RM_UNIT 0x64
|
||
|
#define HID_RM_REPORT_SIZE 0x74
|
||
|
#define HID_RM_REPORT_ID 0x84
|
||
|
#define HID_RM_REPORT_COUNT 0x94
|
||
|
#define HID_RM_PUSH 0xa4
|
||
|
#define HID_RM_POP 0xb4
|
||
|
#define HID_RM_USAGE 0x08
|
||
|
#define HID_RM_USAGE_MINIMUM 0x18
|
||
|
#define HID_RM_USAGE_MAXIMUM 0x28
|
||
|
#define HID_RM_DESIGNATOR_INDEX 0x38
|
||
|
#define HID_RM_DESIGNATOR_MINIMUM 0x48
|
||
|
#define HID_RM_DESIGNATOR_MAXIMUM 0x58
|
||
|
#define HID_RM_STRING_INDEX 0x78
|
||
|
#define HID_RM_STRING_MINIMUM 0x88
|
||
|
#define HID_RM_STRING_MAXIMUM 0x98
|
||
|
#define HID_RM_DELIMITER 0xa8
|
||
|
|
||
|
/* HID Usage Pages and Usages */
|
||
|
#define HID_USAGE_PAGE_GENERIC_DESKTOP 0x01
|
||
|
#define HID_USAGE_KEYBOARD 0x06
|
||
|
#define HID_USAGE_MOUSE 0x02
|
||
|
#define HID_USAGE_JOYSTICK 0x04
|
||
|
#define HID_USAGE_GAMEPAD 0x05
|
||
|
|
||
|
#define HID_USAGE_PAGE_CONSUMER_DEVICE 0x0C
|
||
|
#define HID_USAGE_CONSUMER_CONTROL 0x01
|
||
|
|
||
|
/* HID BT COD Peripheral Min Values Main Role */
|
||
|
#define ESP_HID_COD_MIN_KEYBOARD 0x10
|
||
|
#define ESP_HID_COD_MIN_MOUSE 0x20
|
||
|
|
||
|
/* HID BLE Appearances */
|
||
|
#define ESP_HID_APPEARANCE_GENERIC 0x03C0
|
||
|
#define ESP_HID_APPEARANCE_KEYBOARD 0x03C1
|
||
|
#define ESP_HID_APPEARANCE_MOUSE 0x03C2
|
||
|
#define ESP_HID_APPEARANCE_JOYSTICK 0x03C3
|
||
|
#define ESP_HID_APPEARANCE_GAMEPAD 0x03C4
|
||
|
|
||
|
/* HID Report Types */
|
||
|
#define ESP_HID_REPORT_TYPE_INPUT 1
|
||
|
#define ESP_HID_REPORT_TYPE_OUTPUT 2
|
||
|
#define ESP_HID_REPORT_TYPE_FEATURE 3
|
||
|
|
||
|
/* HID Protocol Modes */
|
||
|
#define ESP_HID_PROTOCOL_MODE_BOOT 0x00 // Boot Protocol Mode
|
||
|
#define ESP_HID_PROTOCOL_MODE_REPORT 0x01 // Report Protocol Mode
|
||
|
|
||
|
/* HID information flags */
|
||
|
#define ESP_HID_FLAGS_REMOTE_WAKE 0x01 // RemoteWake
|
||
|
#define ESP_HID_FLAGS_NORMALLY_CONNECTABLE 0x02 // NormallyConnectable
|
||
|
|
||
|
/* Control point commands */
|
||
|
#define ESP_HID_CONTROL_SUSPEND 0x00 // Suspend
|
||
|
#define ESP_HID_CONTROL_EXIT_SUSPEND 0x01 // Exit Suspend
|
||
|
|
||
|
/* Client Characteristic Configuration values */
|
||
|
#define ESP_HID_CCC_NOTIFICATIONS_ENABLED 0x01 // Notifications enabled
|
||
|
#define ESP_HID_CCC_INDICATIONS_ENABLED 0x02 // Indications enabled
|
||
|
|
||
|
/* HID Transports */
|
||
|
typedef enum {
|
||
|
ESP_HID_TRANSPORT_BT,
|
||
|
ESP_HID_TRANSPORT_BLE,
|
||
|
ESP_HID_TRANSPORT_USB,
|
||
|
ESP_HID_TRANSPORT_MAX
|
||
|
} esp_hid_transport_t;
|
||
|
|
||
|
/* HID Usage Types */
|
||
|
typedef enum {
|
||
|
ESP_HID_USAGE_GENERIC = 0,
|
||
|
ESP_HID_USAGE_KEYBOARD = 1,
|
||
|
ESP_HID_USAGE_MOUSE = 2,
|
||
|
ESP_HID_USAGE_JOYSTICK = 4,
|
||
|
ESP_HID_USAGE_GAMEPAD = 8,
|
||
|
ESP_HID_USAGE_TABLET = 16,
|
||
|
ESP_HID_USAGE_CCONTROL = 32,
|
||
|
ESP_HID_USAGE_VENDOR = 64
|
||
|
} esp_hid_usage_t;
|
||
|
|
||
|
/* HID BT COD Peripheral Min Values. Mask of (keyboard|mouse|ESP_HIDH_COD_*) */
|
||
|
typedef enum {
|
||
|
ESP_HID_COD_MIN_GENERIC,
|
||
|
ESP_HID_COD_MIN_JOYSTICK,
|
||
|
ESP_HID_COD_MIN_GAMEPAD,
|
||
|
ESP_HID_COD_MIN_REMOTE,
|
||
|
ESP_HID_COD_MIN_SENSOR,
|
||
|
ESP_HID_COD_MIN_TABLET,
|
||
|
ESP_HID_COD_MIN_CARD_READER,
|
||
|
ESP_HID_COD_MIN_MAX
|
||
|
} esp_hid_cod_min_t;
|
||
|
|
||
|
/**
|
||
|
* @brief HID report item structure
|
||
|
*/
|
||
|
typedef struct {
|
||
|
uint8_t map_index; /*!< HID report map index */
|
||
|
uint8_t report_id; /*!< HID report id */
|
||
|
uint8_t report_type; /*!< HID report type */
|
||
|
uint8_t protocol_mode; /*!< HID protocol mode */
|
||
|
esp_hid_usage_t usage; /*!< HID usage type */
|
||
|
uint16_t value_len; /*!< HID report length in bytes */
|
||
|
} esp_hid_report_item_t;
|
||
|
|
||
|
/**
|
||
|
* @brief HID parsed report map structure
|
||
|
*/
|
||
|
typedef struct {
|
||
|
esp_hid_usage_t usage; /*!< Dominant HID usage. (keyboard > mouse > joystick > gamepad > generic) */
|
||
|
uint16_t appearance; /*!< Calculated HID Appearance based on the dominant usage */
|
||
|
uint8_t reports_len; /*!< Number of reports discovered in the report map */
|
||
|
esp_hid_report_item_t *reports; /*!< Reports discovered in the report map */
|
||
|
} esp_hid_report_map_t;
|
||
|
|
||
|
/**
|
||
|
* @brief HID raw report map structure
|
||
|
*/
|
||
|
typedef struct {
|
||
|
const uint8_t *data; /*!< Pointer to the HID report map data */
|
||
|
uint16_t len; /*!< HID report map data length */
|
||
|
} esp_hid_raw_report_map_t;
|
||
|
|
||
|
/**
|
||
|
* @brief HID device config structure
|
||
|
*/
|
||
|
typedef struct {
|
||
|
uint16_t vendor_id; /*!< HID Vendor ID */
|
||
|
uint16_t product_id; /*!< HID Product ID */
|
||
|
uint16_t version; /*!< HID Product Version */
|
||
|
const char *device_name; /*!< HID Device Name */
|
||
|
const char *manufacturer_name; /*!< HID Manufacturer */
|
||
|
const char *serial_number; /*!< HID Serial Number */
|
||
|
esp_hid_raw_report_map_t *report_maps; /*!< Array of the raw HID report maps */
|
||
|
uint8_t report_maps_len; /*!< number of raw report maps in the array */
|
||
|
} esp_hid_device_config_t;
|
||
|
|
||
|
/*
|
||
|
* @brief Parse RAW HID report map
|
||
|
* It is a responsibility of the user to free the parsed report map,
|
||
|
* when it's no longer needed. Use esp_hid_free_report_map
|
||
|
* @param hid_rm : pointer to the hid report map data
|
||
|
* @param hid_rm_len : length to the hid report map data
|
||
|
*
|
||
|
* @return: pointer to the parsed report map
|
||
|
*/
|
||
|
esp_hid_report_map_t *esp_hid_parse_report_map(const uint8_t *hid_rm, size_t hid_rm_len);
|
||
|
|
||
|
/*
|
||
|
* @brief Free parsed HID report map
|
||
|
* @param map : pointer to the parsed hid report map
|
||
|
*/
|
||
|
void esp_hid_free_report_map(esp_hid_report_map_t *map);
|
||
|
|
||
|
/**
|
||
|
* @brief Calculate the HID Device usage type from the BLE Apperance
|
||
|
* @param appearance : BLE Apperance value
|
||
|
*
|
||
|
* @return: the hid usage type
|
||
|
*/
|
||
|
esp_hid_usage_t esp_hid_usage_from_appearance(uint16_t appearance);
|
||
|
|
||
|
/**
|
||
|
* @brief Calculate the HID Device usage type from the BT CoD
|
||
|
* @param cod : BT CoD value
|
||
|
*
|
||
|
* @return: the hid usage type
|
||
|
*/
|
||
|
esp_hid_usage_t esp_hid_usage_from_cod(uint32_t cod);
|
||
|
|
||
|
/**
|
||
|
* @brief Convert device usage type to string
|
||
|
* @param usage : The HID usage type to convert
|
||
|
*
|
||
|
* @return: a pointer to the string or NULL
|
||
|
*/
|
||
|
const char *esp_hid_usage_str(esp_hid_usage_t usage);
|
||
|
|
||
|
/**
|
||
|
* @brief Convert HID protocol mode to string
|
||
|
* @param protocol_mode : The HID protocol mode to convert
|
||
|
* BOOT/REPORT
|
||
|
*
|
||
|
* @return: a pointer to the string or NULL
|
||
|
*/
|
||
|
const char *esp_hid_protocol_mode_str(uint8_t protocol_mode);
|
||
|
|
||
|
/**
|
||
|
* @brief Convert HID report type to string
|
||
|
* @param report_type : The HID report type to convert
|
||
|
* INPUT/OUTPUT/FEATURE
|
||
|
*
|
||
|
* @return: a pointer to the string or NULL
|
||
|
*/
|
||
|
const char *esp_hid_report_type_str(uint8_t report_type);
|
||
|
|
||
|
/**
|
||
|
* @brief Convert BT CoD major to string
|
||
|
* @param cod_major : The CoD major value to convert
|
||
|
*
|
||
|
* @return: a pointer to the string or NULL
|
||
|
*/
|
||
|
const char *esp_hid_cod_major_str(uint8_t cod_major);
|
||
|
|
||
|
/**
|
||
|
* @brief Print BT CoD minor value
|
||
|
* @param cod_min : The CoD minor value to print
|
||
|
* @param fp : pointer to the output file
|
||
|
*/
|
||
|
void esp_hid_cod_minor_print(uint8_t cod_min, FILE *fp);
|
||
|
|
||
|
/**
|
||
|
* @brief Convert BLE disconnect reason to string
|
||
|
* @param reason : The value of the reason
|
||
|
*
|
||
|
* @return: a pointer to the string or NULL
|
||
|
*/
|
||
|
const char *esp_hid_disconnect_reason_str(esp_hid_transport_t transport, int reason);
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|