Home | History | Annotate | Download | only in hardware
      1 /*
      2  * Copyright (C) 2012 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ANDROID_INCLUDE_BT_HH_H
     18 #define ANDROID_INCLUDE_BT_HH_H
     19 
     20 #include <stdint.h>
     21 
     22 __BEGIN_DECLS
     23 
     24 #define BTHH_MAX_DSC_LEN 884
     25 
     26 /* HH connection states */
     27 typedef enum {
     28   BTHH_CONN_STATE_CONNECTED = 0,
     29   BTHH_CONN_STATE_CONNECTING,
     30   BTHH_CONN_STATE_DISCONNECTED,
     31   BTHH_CONN_STATE_DISCONNECTING,
     32   BTHH_CONN_STATE_FAILED_MOUSE_FROM_HOST,
     33   BTHH_CONN_STATE_FAILED_KBD_FROM_HOST,
     34   BTHH_CONN_STATE_FAILED_TOO_MANY_DEVICES,
     35   BTHH_CONN_STATE_FAILED_NO_BTHID_DRIVER,
     36   BTHH_CONN_STATE_FAILED_GENERIC,
     37   BTHH_CONN_STATE_UNKNOWN
     38 } bthh_connection_state_t;
     39 
     40 typedef enum {
     41   BTHH_OK = 0,
     42   BTHH_HS_HID_NOT_READY,  /* handshake error : device not ready */
     43   BTHH_HS_INVALID_RPT_ID, /* handshake error : invalid report ID */
     44   BTHH_HS_TRANS_NOT_SPT,  /* handshake error : transaction not spt */
     45   BTHH_HS_INVALID_PARAM,  /* handshake error : invalid paremter */
     46   BTHH_HS_ERROR,          /* handshake error : unspecified HS error */
     47   BTHH_ERR,               /* general BTA HH error */
     48   BTHH_ERR_SDP,           /* SDP error */
     49   BTHH_ERR_PROTO,         /* SET_Protocol error,
     50                                                         only used in BTA_HH_OPEN_EVT
     51                              callback */
     52   BTHH_ERR_DB_FULL,       /* device database full error, used  */
     53   BTHH_ERR_TOD_UNSPT,     /* type of device not supported */
     54   BTHH_ERR_NO_RES,        /* out of system resources */
     55   BTHH_ERR_AUTH_FAILED,   /* authentication fail */
     56   BTHH_ERR_HDL
     57 } bthh_status_t;
     58 
     59 /* Protocol modes */
     60 typedef enum {
     61   BTHH_REPORT_MODE = 0x00,
     62   BTHH_BOOT_MODE = 0x01,
     63   BTHH_UNSUPPORTED_MODE = 0xff
     64 } bthh_protocol_mode_t;
     65 
     66 /* Report types */
     67 typedef enum {
     68   BTHH_INPUT_REPORT = 1,
     69   BTHH_OUTPUT_REPORT,
     70   BTHH_FEATURE_REPORT
     71 } bthh_report_type_t;
     72 
     73 typedef struct {
     74   int attr_mask;
     75   uint8_t sub_class;
     76   uint8_t app_id;
     77   int vendor_id;
     78   int product_id;
     79   int version;
     80   uint8_t ctry_code;
     81   int dl_len;
     82   uint8_t dsc_list[BTHH_MAX_DSC_LEN];
     83 } bthh_hid_info_t;
     84 
     85 /** Callback for connection state change.
     86  *  state will have one of the values from bthh_connection_state_t
     87  */
     88 typedef void (*bthh_connection_state_callback)(RawAddress* bd_addr,
     89                                                bthh_connection_state_t state);
     90 
     91 /** Callback for vitual unplug api.
     92  *  the status of the vitual unplug
     93  */
     94 typedef void (*bthh_virtual_unplug_callback)(RawAddress* bd_addr,
     95                                              bthh_status_t hh_status);
     96 
     97 /** Callback for get hid info
     98  *  hid_info will contain attr_mask, sub_class, app_id, vendor_id, product_id,
     99  * version, ctry_code, len
    100  */
    101 typedef void (*bthh_hid_info_callback)(RawAddress* bd_addr,
    102                                        bthh_hid_info_t hid_info);
    103 
    104 /** Callback for get protocol api.
    105  *  the protocol mode is one of the value from bthh_protocol_mode_t
    106  */
    107 typedef void (*bthh_protocol_mode_callback)(RawAddress* bd_addr,
    108                                             bthh_status_t hh_status,
    109                                             bthh_protocol_mode_t mode);
    110 
    111 /** Callback for get/set_idle_time api.
    112  */
    113 typedef void (*bthh_idle_time_callback)(RawAddress* bd_addr,
    114                                         bthh_status_t hh_status, int idle_rate);
    115 
    116 /** Callback for get report api.
    117  *  if staus is ok rpt_data contains the report data
    118  */
    119 typedef void (*bthh_get_report_callback)(RawAddress* bd_addr,
    120                                          bthh_status_t hh_status,
    121                                          uint8_t* rpt_data, int rpt_size);
    122 
    123 /** Callback for set_report/set_protocol api and if error
    124  *  occurs for get_report/get_protocol api.
    125  */
    126 typedef void (*bthh_handshake_callback)(RawAddress* bd_addr,
    127                                         bthh_status_t hh_status);
    128 
    129 /** BT-HH callback structure. */
    130 typedef struct {
    131   /** set to sizeof(BtHfCallbacks) */
    132   size_t size;
    133   bthh_connection_state_callback connection_state_cb;
    134   bthh_hid_info_callback hid_info_cb;
    135   bthh_protocol_mode_callback protocol_mode_cb;
    136   bthh_idle_time_callback idle_time_cb;
    137   bthh_get_report_callback get_report_cb;
    138   bthh_virtual_unplug_callback virtual_unplug_cb;
    139   bthh_handshake_callback handshake_cb;
    140 
    141 } bthh_callbacks_t;
    142 
    143 /** Represents the standard BT-HH interface. */
    144 typedef struct {
    145   /** set to sizeof(BtHhInterface) */
    146   size_t size;
    147 
    148   /**
    149    * Register the BtHh callbacks
    150    */
    151   bt_status_t (*init)(bthh_callbacks_t* callbacks);
    152 
    153   /** connect to hid device */
    154   bt_status_t (*connect)(RawAddress* bd_addr);
    155 
    156   /** dis-connect from hid device */
    157   bt_status_t (*disconnect)(RawAddress* bd_addr);
    158 
    159   /** Virtual UnPlug (VUP) the specified HID device */
    160   bt_status_t (*virtual_unplug)(RawAddress* bd_addr);
    161 
    162   /** Set the HID device descriptor for the specified HID device. */
    163   bt_status_t (*set_info)(RawAddress* bd_addr, bthh_hid_info_t hid_info);
    164 
    165   /** Get the HID proto mode. */
    166   bt_status_t (*get_protocol)(RawAddress* bd_addr,
    167                               bthh_protocol_mode_t protocolMode);
    168 
    169   /** Set the HID proto mode. */
    170   bt_status_t (*set_protocol)(RawAddress* bd_addr,
    171                               bthh_protocol_mode_t protocolMode);
    172 
    173   /** Get the HID Idle Time */
    174   bt_status_t (*get_idle_time)(RawAddress* bd_addr);
    175 
    176   /** Set the HID Idle Time */
    177   bt_status_t (*set_idle_time)(RawAddress* bd_addr, uint8_t idleTime);
    178 
    179   /** Send a GET_REPORT to HID device. */
    180   bt_status_t (*get_report)(RawAddress* bd_addr, bthh_report_type_t reportType,
    181                             uint8_t reportId, int bufferSize);
    182 
    183   /** Send a SET_REPORT to HID device. */
    184   bt_status_t (*set_report)(RawAddress* bd_addr, bthh_report_type_t reportType,
    185                             char* report);
    186 
    187   /** Send data to HID device. */
    188   bt_status_t (*send_data)(RawAddress* bd_addr, char* data);
    189 
    190   /** Closes the interface. */
    191   void (*cleanup)(void);
    192 
    193 } bthh_interface_t;
    194 __END_DECLS
    195 
    196 #endif /* ANDROID_INCLUDE_BT_HH_H */
    197