| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #pragma once |
| |
| #include <stdbool.h> |
| |
| #include <ddk/binding.h> |
| #include <ddk/debug.h> |
| #include <ddk/device.h> |
| #include <ddk/driver.h> |
| #include <ddk/protocol/bt/gattsvc.h> |
| #include <ddk/protocol/hidbus.h> |
| |
| #include <threads.h> |
| |
| // org.bluetooth.characteristic.protocol_mode |
| #define BT_HOG_PROTOCOL_MODE 0x2A4E |
| #define BT_HOG_PROTOCOL_MODE_BOOT_MODE 0 |
| #define BT_HOG_PROTOCOL_MODE_REPORT_MODE 1 |
| |
| // org.bluetooth.characteristic.report_map |
| #define BT_HOG_REPORT_MAP 0x2A4B |
| |
| // org.bluetooth.characteristic.report |
| #define BT_HOG_REPORT 0x2A4D |
| |
| // org.bluetooth.characteristic.boot_keyboard_input_report |
| #define BT_HOG_BOOT_KEYBOARD_INPUT_REPORT 0x2A22 |
| |
| // org.bluetooth.characteristic.boot_keyboard_output_report |
| #define BT_HOG_BOOT_KEYBOARD_OUTPUT_REPORT 0x2A32 |
| |
| // org.bluetooth.characteristic.boot_mouse_input_report |
| #define BT_HOG_BOOT_MOUSE_INPUT_REPORT 0x2A33 |
| |
| typedef enum { |
| HOGD_DEVICE_BOOT_KEYBOARD, |
| HOGD_DEVICE_BOOT_MOUSE, |
| HOGD_DEVICE_REPORT, |
| } hogd_device_type_t; |
| |
| typedef struct hogd_t hogd_t; |
| typedef struct hogd_device_t hogd_device_t; |
| struct hogd_device_t { |
| hogd_device_type_t device_type; |
| |
| bt_gatt_id_t input_report_id; |
| bool has_input_report_id; |
| bt_gatt_id_t output_report_id; |
| bool has_output_report_id; |
| |
| bool is_initialized; |
| zx_device_t* dev; |
| mtx_t lock; |
| hidbus_ifc_t ifc; |
| |
| // Reference to owner. |
| hogd_t *parent; |
| |
| // Report devices are stored as a singly linked list. Currently unused. |
| hogd_device_t *next; |
| }; |
| |
| struct hogd_t { |
| bt_gatt_svc_protocol_t gatt_svc; |
| |
| bool has_report_map; |
| bt_gatt_id_t report_map_id; |
| |
| bool has_protocol_mode; |
| bt_gatt_id_t protocol_mode_id; |
| |
| uint8_t protocol_mode; |
| |
| void* hid_descriptor; |
| size_t hid_descriptor_len; |
| |
| zx_device_t* bus_dev; |
| |
| hogd_device_t boot_keyboard_device; |
| hogd_device_t boot_mouse_device; |
| |
| // Report devices are stored as a singly linked list. |
| hogd_device_t *report_device; |
| }; |