1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
|
//*****************************************************************************
//
// hci.h - This file contains the types, contants, external functions
// etc. for the BLE HCI Transport Layer.
// This file copied most of #defines from BLE-Stack 1.3.2 release
//
// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved.
// Software License Agreement
//
// Texas Instruments (TI) is supplying this software for use solely and
// exclusively on TI's microcontroller products. The software is owned by
// TI and/or its suppliers, and is protected under applicable copyright
// laws. You may not combine this software with "viral" open-source
// software in order to form a larger program.
//
// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
// DAMAGES, FOR ANY REASON WHATSOEVER.
//
// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package.
//
//*****************************************************************************
#ifndef HCI_H
#define HCI_H
#ifdef __cplusplus
extern "C"
{
#endif
//
// Long Term Key info
//
typedef struct
{
bool bValid;
bool bAuth;
uint8_t ui8LTKSize;
uint8_t pui8LTK[16];
uint8_t pui8DIV[2];
uint8_t pui8Rand[8];
} tLTKData;
#define HCI_BDADDR_LEN 6
//
// HCI Packet Types
//
#define HCI_CMD_PACKET 0x01
#define HCI_ACL_DATA_PACKET 0x02
#define HCI_SCO_DATA_PACKET 0x03
#define HCI_EVENT_PACKET 0x04
//
// Vendor Specific Command Opcode
//
#define HCI_VE_GAP_DEVICE_INIT_OPCODE 0xFE00
#define HCI_VE_GAP_DEVICE_DISC_REQ_OPCODE 0xFE04
#define HCI_VE_GAP_DEVICE_EST_LINK_REQ_OPCODE 0xFE09
#define HCI_VE_GAP_DEVICE_TER_LINK_REQ_OPCODE 0xFE0A
#define HCI_VE_GAP_DEVICE_AUTHENTICATE_OPCODE 0xFE0B
#define HCI_VE_GAP_DEVICE_PASSKEY_UPDATE_OPCODE 0xFE0C
#define HCI_VE_GAP_DEVICE_BOND_OPCODE 0xFE0F
#define HCI_VE_GAP_SET_PARAM_OPCODE 0xFE30
#define HCI_VE_GAP_GET_PARAM_OPCODE 0xFE31
#define HCI_VE_GAP_DEVICE_READ_CHAR_VAL_OPCODE 0xFD8A
#define HCI_VE_GAP_DEVICE_WRITE_CHAR_VAL_OPCODE 0xFD92
//
// BLE Command Opcode
//
#define HCI_READ_RSSI_OPCODE 0x1405
//
// Characteristic Value Handle
//
#define GATT_IRTEMP_DATA_UUID_HANDLE 0x25
#define GATT_IRTEMP_NOTIFY_UUID_HANDLE 0x26
#define GATT_IRTEMP_CFG_UUID_HANDLE 0x29
#define GATT_HUMIDITY_DATA_UUID_HANDLE 0x38
#define GATT_HUMIDITY_NOTIDY_UUID_HANDLE 0x39
#define GATT_HUMIDITY_CFG_UUID_HANDLE 0x3C
//
// GAP Profile Roles Bit mask values
//
#define GAP_PROFILE_BROADCASTER 0x01 //A device that sends advertising events only.
#define GAP_PROFILE_OBSERVER 0x02 //A device that receives advertising events only.
#define GAP_PROFILE_PERIPHERAL 0x04 //A device that accepts the establishment of an LE physical link using the connection establishment procedure
#define GAP_PROFILE_CENTRAL 0x08 //A device that supports the Central role initiates the establishment of a physical connection
//
// GAP_PARAMETER_ID_DEFINES GAP Parameter IDs
//
#define TGAP_GEN_DISC_ADV_MIN 0 //!< Minimum time to remain advertising, when in Discoverable mode (mSec). Setting this parameter to 0 turns off the timeout (default).
#define TGAP_LIM_ADV_TIMEOUT 1 //!< Maximum time to remain advertising, when in Limited Discoverable mode. In seconds (default 180 seconds)
#define TGAP_GEN_DISC_SCAN 2 //!< Minimum time to perform scanning, when performing General Discovery proc (mSec)
#define TGAP_LIM_DISC_SCAN 3 //!< Minimum time to perform scanning, when performing Limited Discovery proc (mSec)
#define TGAP_CONN_EST_ADV_TIMEOUT 4 //!< Advertising timeout, when performing Connection Establishment proc (mSec)
#define TGAP_CONN_PARAM_TIMEOUT 5 //!< Link Layer connection parameter update notification timer, connection parameter update proc (mSec)
// Constants
#define TGAP_LIM_DISC_ADV_INT_MIN 6 //!< Minimum advertising interval, when in limited discoverable mode (n * 0.625 mSec)
#define TGAP_LIM_DISC_ADV_INT_MAX 7 //!< Maximum advertising interval, when in limited discoverable mode (n * 0.625 mSec)
#define TGAP_GEN_DISC_ADV_INT_MIN 8 //!< Minimum advertising interval, when in General discoverable mode (n * 0.625 mSec)
#define TGAP_GEN_DISC_ADV_INT_MAX 9 //!< Maximum advertising interval, when in General discoverable mode (n * 0.625 mSec)
#define TGAP_CONN_ADV_INT_MIN 10 //!< Minimum advertising interval, when in Connectable mode (n * 0.625 mSec)
#define TGAP_CONN_ADV_INT_MAX 11 //!< Maximum advertising interval, when in Connectable mode (n * 0.625 mSec)
#define TGAP_CONN_SCAN_INT 12 //!< Scan interval used during Link Layer Initiating state, when in Connectable mode (n * 0.625 mSec)
#define TGAP_CONN_SCAN_WIND 13 //!< Scan window used during Link Layer Initiating state, when in Connectable mode (n * 0.625 mSec)
#define TGAP_CONN_HIGH_SCAN_INT 14 //!< Scan interval used during Link Layer Initiating state, when in Connectable mode, high duty scan cycle scan paramaters (n * 0.625 mSec)
#define TGAP_CONN_HIGH_SCAN_WIND 15 //!< Scan window used during Link Layer Initiating state, when in Connectable mode, high duty scan cycle scan paramaters (n * 0.625 mSec)
#define TGAP_GEN_DISC_SCAN_INT 16 //!< Scan interval used during Link Layer Scanning state, when in General Discovery proc (n * 0.625 mSec)
#define TGAP_GEN_DISC_SCAN_WIND 17 //!< Scan window used during Link Layer Scanning state, when in General Discovery proc (n * 0.625 mSec)
#define TGAP_LIM_DISC_SCAN_INT 18 //!< Scan interval used during Link Layer Scanning state, when in Limited Discovery proc (n * 0.625 mSec)
#define TGAP_LIM_DISC_SCAN_WIND 19 //!< Scan window used during Link Layer Scanning state, when in Limited Discovery proc (n * 0.625 mSec)
#define TGAP_CONN_EST_ADV 20 //!< Advertising interval, when using Connection Establishment proc (n * 0.625 mSec). Obsolete - Do not use.
#define TGAP_CONN_EST_INT_MIN 21 //!< Minimum Link Layer connection interval, when using Connection Establishment proc (n * 1.25 mSec)
#define TGAP_CONN_EST_INT_MAX 22 //!< Maximum Link Layer connection interval, when using Connection Establishment proc (n * 1.25 mSec)
#define TGAP_CONN_EST_SCAN_INT 23 //!< Scan interval used during Link Layer Initiating state, when using Connection Establishment proc (n * 0.625 mSec)
#define TGAP_CONN_EST_SCAN_WIND 24 //!< Scan window used during Link Layer Initiating state, when using Connection Establishment proc (n * 0.625 mSec)
#define TGAP_CONN_EST_SUPERV_TIMEOUT 25 //!< Link Layer connection supervision timeout, when using Connection Establishment proc (n * 10 mSec)
#define TGAP_CONN_EST_LATENCY 26 //!< Link Layer connection slave latency, when using Connection Establishment proc (in number of connection events)
#define TGAP_CONN_EST_MIN_CE_LEN 27 //!< Local informational parameter about min len of connection needed, when using Connection Establishment proc (n * 0.625 mSec)
#define TGAP_CONN_EST_MAX_CE_LEN 28 //!< Local informational parameter about max len of connection needed, when using Connection Establishment proc (n * 0.625 mSec)
#define TGAP_PRIVATE_ADDR_INT 29 //!< Minimum Time Interval between private (resolvable) address changes. In minutes (default 15 minutes)
#define TGAP_CONN_PAUSE_CENTRAL 30 //!< Central idle timer. In seconds (default 1 second)
#define TGAP_CONN_PAUSE_PERIPHERAL 31 //!< Minimum time upon connection establishment before the peripheral starts a connection update procedure. In seconds (default 5 seconds)
// Proprietary
#define TGAP_SM_TIMEOUT 32 //!< SM Message Timeout (milliseconds). Default 30 seconds.
#define TGAP_SM_MIN_KEY_LEN 33 //!< SM Minimum Key Length supported. Default 7.
#define TGAP_SM_MAX_KEY_LEN 34 //!< SM Maximum Key Length supported. Default 16.
#define TGAP_FILTER_ADV_REPORTS 35 //!< Filter duplicate advertising reports. Default TRUE.
#define TGAP_SCAN_RSP_RSSI_MIN 36 //!< Minimum RSSI required for scan responses to be reported to the app. Default -127.
//
// GAP Device Discovery Modes
//
#define DEVDISC_MODE_NONDISCOVERABLE 0x00 //!< No discoverable setting
#define DEVDISC_MODE_GENERAL 0x01 //!< General Discoverable devices
#define DEVDISC_MODE_LIMITED 0x02 //!< Limited Discoverable devices
#define DEVDISC_MODE_ALL 0x03 //!< Not filtered
//
// GAP Address Types
//
#define ADDRTYPE_PUBLIC 0x00 //!< Use the BD_ADDR
#define ADDRTYPE_STATIC 0x01 //!< Static address
#define ADDRTYPE_PRIVATE_NONRESOLVE 0x02 //!< Generate Non-Resolvable Private Address
#define ADDRTYPE_PRIVATE_RESOLVE 0x03 //!< Generate Resolvable Private Address
//
// GAP Advertiser Event Types
//
#define GAP_ADTYPE_ADV_IND 0x00 //!< Connectable undirected advertisement
#define GAP_ADTYPE_ADV_DIRECT_IND 0x01 //!< Connectable directed advertisement
#define GAP_ADTYPE_ADV_DISCOVER_IND 0x02 //!< Discoverable undirected advertisement
#define GAP_ADTYPE_ADV_NONCONN_IND 0x03 //!< Non-Connectable undirected advertisement
#define GAP_ADTYPE_SCAN_RSP_IND 0x04 //!< Only used in gapDeviceInfoEvent_t
//
// Vendor Specific Event Code
//
#define HCI_VE_EVENT_CODE 0xFF
// Vendor Specific Event
#define GAP_HCI_EVENT_EXT_CMD_STATUS 0x067F
#define GAP_HCI_EVENT_EXT_DEVICE_INIT_DONE 0x0600
#define GAP_HCI_EVENT_EXT_DEVICE_INFO 0x060D
#define GAP_HCI_EVENT_EXT_DEVICE_DISC_DONE 0x0601
#define GAP_HCI_EVENT_EXT_DEVICE_LINK_DONE 0x0605
#define GAP_HCI_EVENT_EXT_DEVICE_TERM_LINK_DONE 0x0606
#define GAP_HCI_EVENT_EXT_DEVICE_PASSKEY_NEEDED 0x060B
#define GAP_HCI_EVENT_EXT_DEVICE_AUTHENTICATE_DONE 0x060A
#define GAP_HCI_EVENT_EXT_DEVICE_BOND_DONE 0x060E
#define GAP_HCI_EVENT_EXT_ATT_READ_RSP 0x050B
#define GAP_HCI_EVENT_EXT_ATT_WRITE_RSP 0x0513
#define GAP_HCI_EVENT_CMD_COMPLETE 0x0E
#define HCI_ATT_ERROR_RSP_EVENT 0x0501
#define GAP_HCI_EVENT_HANDLE_VALUE_NOTIFY 0x051B
/*
** HCI Status
**
** Per the Bluetooth Core Specification, V4.0.0, Vol. 2, Part D.
*/
#define HCI_SUCCESS 0x00
#define HCI_ERROR_CODE_UNKNOWN_HCI_CMD 0x01
#define HCI_ERROR_CODE_UNKNOWN_CONN_ID 0x02
#define HCI_ERROR_CODE_HW_FAILURE 0x03
#define HCI_ERROR_CODE_PAGE_TIMEOUT 0x04
#define HCI_ERROR_CODE_AUTH_FAILURE 0x05
#define HCI_ERROR_CODE_PIN_KEY_MISSING 0x06
#define HCI_ERROR_CODE_MEM_CAP_EXCEEDED 0x07
#define HCI_ERROR_CODE_CONN_TIMEOUT 0x08
#define HCI_ERROR_CODE_CONN_LIMIT_EXCEEDED 0x09
#define HCI_ERROR_CODE_SYNCH_CONN_LIMIT_EXCEEDED 0x0A
#define HCI_ERROR_CODE_ACL_CONN_ALREADY_EXISTS 0x0B
#define HCI_ERROR_CODE_CMD_DISALLOWED 0x0C
#define HCI_ERROR_CODE_CONN_REJ_LIMITED_RESOURCES 0x0D
#define HCI_ERROR_CODE_CONN_REJECTED_SECURITY_REASONS 0x0E
#define HCI_ERROR_CODE_CONN_REJECTED_UNACCEPTABLE_BDADDR 0x0F
#define HCI_ERROR_CODE_CONN_ACCEPT_TIMEOUT_EXCEEDED 0x10
#define HCI_ERROR_CODE_UNSUPPORTED_FEATURE_PARAM_VALUE 0x11
#define HCI_ERROR_CODE_INVALID_HCI_CMD_PARAMS 0x12
#define HCI_ERROR_CODE_REMOTE_USER_TERM_CONN 0x13
#define HCI_ERROR_CODE_REMOTE_DEVICE_TERM_CONN_LOW_RESOURCES 0x14
#define HCI_ERROR_CODE_REMOTE_DEVICE_TERM_CONN_POWER_OFF 0x15
#define HCI_ERROR_CODE_CONN_TERM_BY_LOCAL_HOST 0x16
#define HCI_ERROR_CODE_REPEATED_ATTEMPTS 0x17
#define HCI_ERROR_CODE_PAIRING_NOT_ALLOWED 0x18
#define HCI_ERROR_CODE_UNKNOWN_LMP_PDU 0x19
#define HCI_ERROR_CODE_UNSUPPORTED_REMOTE_FEATURE 0x1A
#define HCI_ERROR_CODE_SCO_OFFSET_REJ 0x1B
#define HCI_ERROR_CODE_SCO_INTERVAL_REJ 0x1C
#define HCI_ERROR_CODE_SCO_AIR_MODE_REJ 0x1D
#define HCI_ERROR_CODE_INVALID_LMP_PARAMS 0x1E
#define HCI_ERROR_CODE_UNSPECIFIED_ERROR 0x1F
#define HCI_ERROR_CODE_UNSUPPORTED_LMP_PARAM_VAL 0x20
#define HCI_ERROR_CODE_ROLE_CHANGE_NOT_ALLOWED 0x21
#define HCI_ERROR_CODE_LMP_LL_RESP_TIMEOUT 0x22
#define HCI_ERROR_CODE_LMP_ERR_TRANSACTION_COLLISION 0x23
#define HCI_ERROR_CODE_LMP_PDU_NOT_ALLOWED 0x24
#define HCI_ERROR_CODE_ENCRYPT_MODE_NOT_ACCEPTABLE 0x25
#define HCI_ERROR_CODE_LINK_KEY_CAN_NOT_BE_CHANGED 0x26
#define HCI_ERROR_CODE_REQ_QOS_NOT_SUPPORTED 0x27
#define HCI_ERROR_CODE_INSTANT_PASSED 0x28
#define HCI_ERROR_CODE_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED 0x29
#define HCI_ERROR_CODE_DIFFERENT_TRANSACTION_COLLISION 0x2A
#define HCI_ERROR_CODE_RESERVED1 0x2B
#define HCI_ERROR_CODE_QOS_UNACCEPTABLE_PARAM 0x2C
#define HCI_ERROR_CODE_QOS_REJ 0x2D
#define HCI_ERROR_CODE_CHAN_ASSESSMENT_NOT_SUPPORTED 0x2E
#define HCI_ERROR_CODE_INSUFFICIENT_SECURITY 0x2F
#define HCI_ERROR_CODE_PARAM_OUT_OF_MANDATORY_RANGE 0x30
#define HCI_ERROR_CODE_RESERVED2 0x31
#define HCI_ERROR_CODE_ROLE_SWITCH_PENDING 0x32
#define HCI_ERROR_CODE_RESERVED3 0x33
#define HCI_ERROR_CODE_RESERVED_SLOT_VIOLATION 0x34
#define HCI_ERROR_CODE_ROLE_SWITCH_FAILED 0x35
#define HCI_ERROR_CODE_EXTENDED_INQUIRY_RESP_TOO_LARGE 0x36
#define HCI_ERROR_CODE_SIMPLE_PAIRING_NOT_SUPPORTED_BY_HOST 0x37
#define HCI_ERROR_CODE_HOST_BUSY_PAIRING 0x38
#define HCI_ERROR_CODE_CONN_REJ_NO_SUITABLE_CHAN_FOUND 0x39
#define HCI_ERROR_CODE_CONTROLLER_BUSY 0x3A
#define HCI_ERROR_CODE_UNACCEPTABLE_CONN_INTERVAL 0x3B
#define HCI_ERROR_CODE_DIRECTED_ADV_TIMEOUT 0x3C
#define HCI_ERROR_CODE_CONN_TERM_MIC_FAILURE 0x3D
#define HCI_ERROR_CODE_CONN_FAILED_TO_ESTABLISH 0x3E
#define HCI_ERROR_CODE_MAC_CONN_FAILED 0x3F
//
// Generic Status Return Values
//
#define SUCCESS 0x00
#define FAILURE 0x01
#define INVALIDPARAMETER 0x02
#define INVALID_TASK 0x03
#define MSG_BUFFER_NOT_AVAIL 0x04
#define INVALID_MSG_POINTER 0x05
#define INVALID_EVENT_ID 0x06
#define INVALID_INTERRUPT_ID 0x07
#define NO_TIMER_AVAIL 0x08
#define NV_ITEM_UNINIT 0x09
#define NV_OPER_FAILED 0x0A
#define INVALID_MEM_SIZE 0x0B
#define NV_BAD_ITEM_LEN 0x0C
#define bleNotReady 0x10 //!< Not ready to perform task
#define bleAlreadyInRequestedMode 0x11 //!< Already performing that task
#define bleIncorrectMode 0x12 //!< Not setup properly to perform that task
#define bleMemAllocError 0x13 //!< Memory allocation error occurred
#define bleNotConnected 0x14 //!< Can't perform function when not in a connection
#define bleNoResources 0x15 //!< There are no resource available
#define blePending 0x16 //!< Waiting
#define bleTimeout 0x17 //!< Timed out performing function
#define bleInvalidRange 0x18 //!< A parameter is out of range
#define bleLinkEncrypted 0x19 //!< The link is already encrypted
#define bleProcedureComplete 0x1A //!< The Procedure is completed
// GAP Status Return Values - returned as bStatus_t
#define bleGAPUserCanceled 0x30 //!< The user canceled the task
#define bleGAPConnNotAcceptable 0x31 //!< The connection was not accepted
#define bleGAPBondRejected 0x32 //!< The bound information was rejected.
// ATT Status Return Values - returned as bStatus_t
#define bleInvalidPDU 0x40 //!< The attribute PDU is invalid
#define bleInsufficientAuthen 0x41 //!< The attribute has insufficient authentication
#define bleInsufficientEncrypt 0x42 //!< The attribute has insufficient encryption
#define bleInsufficientKeySize 0x43 //!< The attribute has insufficient encryption key size
// Disconnect Reasons
#define HCI_DISCONNECT_AUTH_FAILURE HCI_ERROR_CODE_AUTH_FAILURE
#define HCI_DISCONNECT_REMOTE_USER_TERM HCI_ERROR_CODE_REMOTE_USER_TERM_CONN
#define HCI_DISCONNECT_REMOTE_DEV_LOW_RESOURCES HCI_ERROR_CODE_REMOTE_DEVICE_TERM_CONN_LOW_RESOURCES
#define HCI_DISCONNECT_REMOTE_DEV_POWER_OFF HCI_ERROR_CODE_REMOTE_DEVICE_TERM_CONN_POWER_OFF
#define HCI_DISCONNECT_UNSUPPORTED_REMOTE_FEATURE HCI_ERROR_CODE_UNSUPPORTED_REMOTE_FEATURE
#define HCI_DISCONNECT_KEY_PAIRING_NOT_SUPPORTED HCI_ERROR_CODE_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED
#define HCI_DISCONNECT_UNACCEPTABLE_CONN_INTERVAL HCI_ERROR_CODE_UNACCEPTABLE_CONN_INTERVAL
extern void GAPDeviceInit(uint8_t ui8ProfileRole,
uint8_t ui8MaxScanRsps,
uint8_t *pui8IRK,
uint8_t *pui8SRK,
uint32_t ui32SignCounter);
extern void GAPGetParam(uint8_t ui8ParamID);
extern void GAPSetParam(uint8_t ui8ParamID, uint16_t ui16Value);
extern void GAPDiscoveryReq(uint8_t ui8Mode, bool bActiveScan, bool bWhiteList);
extern void GAPEstLinkReq(bool bHighDutyCycle, bool bWhiteList,
uint8_t ui8AddrType, uint8_t *pui8DevAddr);
extern void GAPTerLinkReq(uint16_t ui16ConnHandle, uint8_t ui8Reason);
extern void GAPAuthenticate(uint16_t ui16ConnHandle);
extern void GAPPassKeyUpdate(uint16_t ui16ConnHandle, char *pcPassCode);
extern void GAPBond(uint16_t ui16ConnHandle, tLTKData *psSavedKey);
extern void GAPReadCharValue(uint16_t ui16ConnHandle, uint16_t ui16Handle);
extern void GAPWriteCharValue(uint16_t ui16ConnHandle, uint16_t ui16Handle,
uint8_t *pui8Buf, uint8_t ui8Len);
extern void HCIReadRSSI(uint16_t ui16ConnHandle);
#ifdef __cplusplus
}
#endif
#endif /* HCI_H */
|