176 lines
4.8 KiB
C
176 lines
4.8 KiB
C
/***************************************************************************
|
|
*
|
|
* Copyright 2015-2020 BES.
|
|
* All rights reserved. All unpublished rights reserved.
|
|
*
|
|
* No part of this work may be used or reproduced in any form or by any
|
|
* means, or stored in a database or retrieval system, without prior written
|
|
* permission of BES.
|
|
*
|
|
* Use of this work is governed by a license granted by BES.
|
|
* This work contains confidential and proprietary information of
|
|
* BES. which is protected by copyright, trade secret,
|
|
* trademark and other intellectual property rights.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#include "bt_co_list.h"
|
|
#include "btlib_type.h"
|
|
#include "btm_i.h"
|
|
#include "sdp.h"
|
|
|
|
#ifndef __HID_I_H__
|
|
#define __HID_I_H__
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
typedef enum {
|
|
HID_STATE_CLOSED,
|
|
HID_STATE_STANDBY = 1, // ready
|
|
HID_STATE_QUERING,
|
|
HID_STATE_CONNECTING,
|
|
HID_STATE_WAITING_INTRUPT_CHANNEL,
|
|
HID_STATE_CONNECTING_INTRUPT_CHANNEL,
|
|
HID_STATE_OPEN,
|
|
HID_STATE_DISCONNECTING,
|
|
} hid_state_t;
|
|
|
|
typedef enum {
|
|
HID_EVENT_REMOTE_NOT_SUPPORT = 1,
|
|
HID_EVENT_CONN_OPENED,
|
|
HID_EVENT_CONN_CLOSED,
|
|
} hid_event_t;
|
|
|
|
typedef enum {
|
|
HID_SESSION_CLOSE,
|
|
HID_SESSION_CONNECTING,
|
|
HID_SESSION_OPEN,
|
|
} hid_session_state_t;
|
|
|
|
typedef enum {
|
|
HID_PENDING_OP_NULL = 0,
|
|
HID_PENDING_OP_GET_REPORT,
|
|
HID_PENDING_OP_GET_PROTOCOL,
|
|
HID_PENDING_OP_SET_REPORT,
|
|
HID_PENDING_OP_SET_PROTOCOL,
|
|
} hid_pending_op_t;
|
|
|
|
struct hid_session_t {
|
|
uint32 l2cap_handle;
|
|
hid_session_state_t state;
|
|
};
|
|
|
|
struct hid_callback_parms_t
|
|
{
|
|
hid_event_t event;
|
|
uint8_t error_code;
|
|
struct bdaddr_t remote;
|
|
};
|
|
|
|
#define HID_BOOT_PROTOCOL_MODE 0x0
|
|
#define HID_REPORT_PROTOCOL_MODE 0x1
|
|
|
|
typedef enum {
|
|
HID_REPORT_TYPE_OTHER = 0,
|
|
HID_REPORT_TYPE_INPUT,
|
|
HID_REPORT_TYPE_OUTPUT,
|
|
HID_REPORT_TYPE_FEATURE,
|
|
} hid_report_type_enum_t;
|
|
|
|
#define HID_FRAME_DATA_MAX_LEN 11 /* DM1 is recommended packet */
|
|
extern struct hid_stack_interface_t hid_stack_if;
|
|
|
|
struct hid_report_data_t {
|
|
uint8_t report_id;
|
|
uint8_t data[HID_FRAME_DATA_MAX_LEN];
|
|
uint8_t data_len;
|
|
};
|
|
|
|
struct hid_frame_t {
|
|
uint8_t header;
|
|
uint8_t data[HID_FRAME_DATA_MAX_LEN];
|
|
uint8_t data_len;
|
|
bool waiting_rsp;
|
|
hid_pending_op_t pending_op;
|
|
};
|
|
|
|
struct hid_frame_node_t {
|
|
struct list_node node;
|
|
struct hid_frame_t frame;
|
|
};
|
|
|
|
struct hid_rx_msg_t {
|
|
uint8_t msg_type;
|
|
uint8_t param;
|
|
uint8_t data_len;
|
|
uint8_t *data;
|
|
};
|
|
|
|
struct hid_control_t {
|
|
struct bdaddr_t remote;
|
|
bool initiator;
|
|
bool is_hid_device_role;
|
|
struct hid_session_t control_session;
|
|
struct hid_session_t interrupt_session;
|
|
hid_state_t state;
|
|
hid_pending_op_t pending_op;
|
|
uint8 pending_protocol_set;
|
|
uint8 unplug_op_pending;
|
|
uint8 local_protocol_mode;
|
|
uint8 remote_protocol_mode;
|
|
uint8 remote_report_descriptor_has_report_id;
|
|
uint8 disc_reason;
|
|
void (*hid_callback)(struct hid_control_t *hid_ctl, const struct hid_callback_parms_t *info);
|
|
struct sdp_request sdp_request;
|
|
struct hid_report_data_t device_input_data;
|
|
struct hid_report_data_t device_output_data;
|
|
struct hid_report_data_t device_feature_data;
|
|
struct list_node ctrl_tx_list;
|
|
struct list_node intr_tx_list;
|
|
bool ctrl_tx_busy;
|
|
bool intr_tx_busy;
|
|
bool use_interrupt_channel;
|
|
};
|
|
|
|
struct hid_stack_interface_t {
|
|
struct hid_control_t *(*hid_alloc_standby_control)(void *remote);
|
|
struct hid_control_t *(*hid_search_from_control_handle)(uint32_t l2cap_handle);
|
|
struct hid_control_t *(*hid_search_from_interrupt_handle)(uint32_t l2cap_handle);
|
|
struct hid_control_t *(*hid_search_from_remote_bdaddr)(void *remote);
|
|
};
|
|
|
|
struct hid_ctx_input {
|
|
struct ctx_content ctx;
|
|
struct bdaddr_t *remote;
|
|
struct hid_control_t *hid_ctl;
|
|
uint32 hid_ctrl_handle;
|
|
uint32 hid_intr_handle;
|
|
};
|
|
|
|
int hid_stack_init(struct hid_stack_interface_t *stack_if, uint8_t is_hid_device_role);
|
|
|
|
int hid_connect_req(struct hid_control_t *hid_ctl);
|
|
|
|
void hid_disconnect_req(struct hid_control_t *hid_ctl);
|
|
|
|
hid_state_t hid_get_state(struct hid_control_t *hid_ctl);
|
|
|
|
int hid_send_handshake(struct hid_control_t *hid_ctl, uint8_t code);
|
|
|
|
void hid_keyboard_input_report(struct hid_control_t *hid_ctl, uint8_t modifier_key, uint8_t key_code);
|
|
|
|
void hid_keyboard_send_ctrl_key(struct hid_control_t *hid_ctl, uint8_t ctrl_key);
|
|
|
|
int hid_l2cap_control_notify_callback(enum l2cap_event_enum event, uint32 l2cap_handle, void *pdata, uint8 reason);
|
|
int hid_l2cap_interrupt_notify_callback(enum l2cap_event_enum event, uint32 l2cap_handle, void *pdata, uint8 reason);
|
|
void hid_l2cap_control_data_receive(uint32 l2cap_handle, struct pp_buff *ppb);
|
|
void hid_l2cap_interrupt_data_receive(uint32 l2cap_handle, struct pp_buff *ppb);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __HID_I_H__ */
|
|
|