HCI源码:

bt_hci.h

[cpp] view plain copy
  1. /*
  2. * This file is part of the HCI protocal.
  3. * Data  :20160506
  4. * Author: zhongjun
  5. *
  6. */
  7. #ifndef BT_HCI_H_H
  8. #define BT_HCI_H_H
  9. #include "bt_cfg.h"
  10. #ifdef DEBUG_BT_HCI
  11. #define DEBUG(x) {printf x;}
  12. #define BT_HCI_DEBUG(x) DEBUG(x)
  13. #else
  14. #define BT_HCI_DEBUG(x)
  15. #endif
  16. #define TRANSPORT_UART
  17. #define TRANSPORT_USBx
  18. #define TRANSPORT_SDIOx
  19. #define SCAN_DISABLED       0x00
  20. #define SCAN_INQUIRY        0x01
  21. #define SCAN_PAGE       0x02
  22. /* ACL flags */
  23. #define ACL_CONT        0x01
  24. #define ACL_START       0x02
  25. #define ACL_ACTIVE_BCAST    0x04
  26. #define ACL_PICO_BCAST      0x08
  27. /* CMD/EVT/ACL/SCO types */
  28. #define HCI_COMMAND_PKT     0x01
  29. #define HCI_ACLDATA_PKT     0x02
  30. #define HCI_SCODATA_PKT     0x03
  31. #define HCI_EVENT_PKT       0x04
  32. #define HCI_VENDOR_PKT      0xff
  33. /* HCI Packet types */
  34. #define HCI_2DH1    0x0002
  35. #define HCI_3DH1    0x0004
  36. #define HCI_DM1     0x0008
  37. #define HCI_DH1     0x0010
  38. #define HCI_2DH3    0x0100
  39. #define HCI_3DH3    0x0200
  40. #define HCI_DM3     0x0400
  41. #define HCI_DH3     0x0800
  42. #define HCI_2DH5    0x1000
  43. #define HCI_3DH5    0x2000
  44. #define HCI_DM5     0x4000
  45. #define HCI_DH5     0x8000
  46. #define HCI_HV1     0x0020
  47. #define HCI_HV2     0x0040
  48. #define HCI_HV3     0x0080
  49. #define HCI_EV3     0x0008
  50. #define HCI_EV4     0x0010
  51. #define HCI_EV5     0x0020
  52. #define HCI_2EV3    0x0040
  53. #define HCI_3EV3    0x0080
  54. #define HCI_2EV5    0x0100
  55. #define HCI_3EV5    0x0200
  56. /* HCI Error codes */
  57. #define HCI_UNKNOWN_COMMAND         0x01
  58. #define HCI_NO_CONNECTION           0x02
  59. #define HCI_HARDWARE_FAILURE            0x03
  60. #define HCI_PAGE_TIMEOUT            0x04
  61. #define HCI_AUTHENTICATION_FAILURE      0x05
  62. #define HCI_PIN_OR_KEY_MISSING          0x06
  63. #define HCI_MEMORY_FULL             0x07
  64. #define HCI_CONNECTION_TIMEOUT          0x08
  65. #define HCI_MAX_NUMBER_OF_CONNECTIONS       0x09
  66. #define HCI_MAX_NUMBER_OF_SCO_CONNECTIONS   0x0a
  67. #define HCI_ACL_CONNECTION_EXISTS       0x0b
  68. #define HCI_COMMAND_DISALLOWED          0x0c
  69. #define HCI_REJECTED_LIMITED_RESOURCES      0x0d
  70. #define HCI_REJECTED_SECURITY           0x0e
  71. #define HCI_REJECTED_PERSONAL           0x0f
  72. #define HCI_HOST_TIMEOUT            0x10
  73. #define HCI_UNSUPPORTED_FEATURE         0x11
  74. #define HCI_INVALID_PARAMETERS          0x12
  75. #define HCI_OE_USER_ENDED_CONNECTION        0x13
  76. #define HCI_OE_LOW_RESOURCES            0x14
  77. #define HCI_OE_POWER_OFF            0x15
  78. #define HCI_CONNECTION_TERMINATED       0x16
  79. #define HCI_REPEATED_ATTEMPTS           0x17
  80. #define HCI_PAIRING_NOT_ALLOWED         0x18
  81. #define HCI_UNKNOWN_LMP_PDU         0x19
  82. #define HCI_UNSUPPORTED_REMOTE_FEATURE      0x1a
  83. #define HCI_SCO_OFFSET_REJECTED         0x1b
  84. #define HCI_SCO_INTERVAL_REJECTED       0x1c
  85. #define HCI_AIR_MODE_REJECTED           0x1d
  86. #define HCI_INVALID_LMP_PARAMETERS      0x1e
  87. #define HCI_UNSPECIFIED_ERROR           0x1f
  88. #define HCI_UNSUPPORTED_LMP_PARAMETER_VALUE 0x20
  89. #define HCI_ROLE_CHANGE_NOT_ALLOWED     0x21
  90. #define HCI_LMP_RESPONSE_TIMEOUT        0x22
  91. #define HCI_LMP_ERROR_TRANSACTION_COLLISION 0x23
  92. #define HCI_LMP_PDU_NOT_ALLOWED         0x24
  93. #define HCI_ENCRYPTION_MODE_NOT_ACCEPTED    0x25
  94. #define HCI_UNIT_LINK_KEY_USED          0x26
  95. #define HCI_QOS_NOT_SUPPORTED           0x27
  96. #define HCI_INSTANT_PASSED          0x28
  97. #define HCI_PAIRING_NOT_SUPPORTED       0x29
  98. #define HCI_TRANSACTION_COLLISION       0x2a
  99. #define HCI_QOS_UNACCEPTABLE_PARAMETER      0x2c
  100. #define HCI_QOS_REJECTED            0x2d
  101. #define HCI_CLASSIFICATION_NOT_SUPPORTED    0x2e
  102. #define HCI_INSUFFICIENT_SECURITY       0x2f
  103. #define HCI_PARAMETER_OUT_OF_RANGE      0x30
  104. #define HCI_ROLE_SWITCH_PENDING         0x32
  105. #define HCI_SLOT_VIOLATION          0x34
  106. #define HCI_ROLE_SWITCH_FAILED          0x35
  107. #define HCI_EIR_TOO_LARGE           0x36
  108. #define HCI_SIMPLE_PAIRING_NOT_SUPPORTED    0x37
  109. #define HCI_HOST_BUSY_PAIRING           0x38
  110. /* Command opcode pack/unpack */
  111. #define cmd_opcode_pack(ogf, ocf)   (uint16_t)((ocf & 0x03ff)|(ogf << 10))
  112. #define cmd_opcode_ogf(op)      (op >> 10)
  113. #define cmd_opcode_ocf(op)      (op & 0x03ff)
  114. /* ACL handle and flags pack/unpack */
  115. #define acl_handle_pack(h, f)   (uint16_t)((h & 0x0fff)|(f << 12))
  116. #define acl_get_handle(h)       (h & 0x0fff)
  117. #define acl_get_flags(h)        (h >> 12)
  118. /* -----  HCI Commands ----- */
  119. /* Link Control */
  120. #define OGF_LINK_CTL        0x01
  121. #define OCF_INQUIRY         0x0001
  122. #define OCF_INQUIRY_CANCEL      0x0002
  123. #define OCF_PERIODIC_INQUIRY        0x0003
  124. #define OCF_EXIT_PERIODIC_INQUIRY   0x0004
  125. #define OCF_CREATE_CONN         0x0005
  126. #define OCF_DISCONNECT          0x0006
  127. #define OCF_ADD_SCO         0x0007
  128. #define OCF_CREATE_CONN_CANCEL      0x0008
  129. #define OCF_ACCEPT_CONN_REQ     0x0009
  130. #define OCF_REJECT_CONN_REQ     0x000A
  131. #define OCF_LINK_KEY_REPLY      0x000B
  132. #define OCF_LINK_KEY_NEG_REPLY      0x000C
  133. #define OCF_PIN_CODE_REPLY      0x000D
  134. #define OCF_PIN_CODE_NEG_REPLY      0x000E
  135. #define OCF_SET_CONN_PTYPE      0x000F
  136. #define OCF_AUTH_REQUESTED      0x0011
  137. #define OCF_SET_CONN_ENCRYPT        0x0013
  138. #define OCF_CHANGE_CONN_LINK_KEY    0x0015
  139. #define OCF_MASTER_LINK_KEY     0x0017
  140. #define OCF_REMOTE_NAME_REQ     0x0019
  141. #define OCF_REMOTE_NAME_REQ_CANCEL  0x001A
  142. #define OCF_READ_REMOTE_FEATURES    0x001B
  143. #define OCF_READ_REMOTE_EXT_FEATURES    0x001C
  144. #define OCF_READ_REMOTE_VERSION     0x001D
  145. #define OCF_READ_CLOCK_OFFSET       0x001F
  146. #define OCF_READ_LMP_HANDLE     0x0020
  147. #define OCF_SETUP_SYNC_CONN     0x0028
  148. #define OCF_ACCEPT_SYNC_CONN_REQ    0x0029
  149. #define OCF_REJECT_SYNC_CONN_REQ    0x002A
  150. #define OCF_IO_CAPABILITY_REPLY     0x002B
  151. #define OCF_USER_CONFIRM_REPLY      0x002C
  152. #define OCF_USER_CONFIRM_NEG_REPLY  0x002D
  153. #define OCF_USER_PASSKEY_REPLY      0x002E
  154. #define OCF_USER_PASSKEY_NEG_REPLY  0x002F
  155. #define OCF_REMOTE_OOB_DATA_REPLY   0x0030
  156. #define OCF_REMOTE_OOB_DATA_NEG_REPLY   0x0033
  157. #define OCF_IO_CAPABILITY_NEG_REPLY 0x0034
  158. /* Link Policy */
  159. #define OGF_LINK_POLICY     0x02
  160. #define OCF_HOLD_MODE           0x0001
  161. #define OCF_SNIFF_MODE          0x0003
  162. #define OCF_EXIT_SNIFF_MODE     0x0004
  163. #define OCF_PARK_MODE           0x0005
  164. #define OCF_EXIT_PARK_MODE      0x0006
  165. #define OCF_QOS_SETUP           0x0007
  166. #define OCF_ROLE_DISCOVERY      0x0009
  167. #define OCF_SWITCH_ROLE         0x000B
  168. #define OCF_READ_LINK_POLICY        0x000C
  169. #define OCF_WRITE_LINK_POLICY       0x000D
  170. #define OCF_READ_DEFAULT_LINK_POLICY    0x000E
  171. #define OCF_WRITE_DEFAULT_LINK_POLICY   0x000F
  172. #define OCF_FLOW_SPECIFICATION      0x0010
  173. #define OCF_SNIFF_SUBRATING     0x0011
  174. /* Host Controller and Baseband */
  175. #define OGF_HOST_CTL        0x03
  176. #define OCF_SET_EVENT_MASK      0x0001
  177. #define OCF_RESET           0x0003
  178. #define OCF_SET_EVENT_FLT       0x0005
  179. #define OCF_FLUSH           0x0008
  180. #define OCF_READ_PIN_TYPE       0x0009
  181. #define OCF_WRITE_PIN_TYPE      0x000A
  182. #define OCF_CREATE_NEW_UNIT_KEY     0x000B
  183. #define OCF_READ_STORED_LINK_KEY    0x000D
  184. #define OCF_WRITE_STORED_LINK_KEY   0x0011
  185. #define OCF_DELETE_STORED_LINK_KEY  0x0012
  186. #define OCF_CHANGE_LOCAL_NAME       0x0013
  187. #define OCF_READ_LOCAL_NAME     0x0014
  188. #define OCF_READ_CONN_ACCEPT_TIMEOUT    0x0015
  189. #define OCF_WRITE_CONN_ACCEPT_TIMEOUT   0x0016
  190. #define OCF_READ_PAGE_TIMEOUT       0x0017
  191. #define OCF_WRITE_PAGE_TIMEOUT      0x0018
  192. #define OCF_READ_SCAN_ENABLE        0x0019
  193. #define OCF_WRITE_SCAN_ENABLE       0x001A
  194. #define OCF_READ_PAGE_ACTIVITY      0x001B
  195. #define OCF_WRITE_PAGE_ACTIVITY     0x001C
  196. #define OCF_READ_INQ_ACTIVITY       0x001D
  197. #define OCF_WRITE_INQ_ACTIVITY      0x001E
  198. #define OCF_READ_AUTH_ENABLE        0x001F
  199. #define OCF_WRITE_AUTH_ENABLE       0x0020
  200. #define OCF_READ_ENCRYPT_MODE       0x0021
  201. #define OCF_WRITE_ENCRYPT_MODE      0x0022
  202. #define OCF_READ_CLASS_OF_DEV       0x0023
  203. #define OCF_WRITE_CLASS_OF_DEV      0x0024
  204. #define OCF_READ_VOICE_SETTING      0x0025
  205. #define OCF_WRITE_VOICE_SETTING     0x0026
  206. #define OCF_READ_AUTOMATIC_FLUSH_TIMEOUT    0x0027
  207. #define OCF_WRITE_AUTOMATIC_FLUSH_TIMEOUT   0x0028
  208. #define OCF_READ_NUM_BROADCAST_RETRANS  0x0029
  209. #define OCF_WRITE_NUM_BROADCAST_RETRANS 0x002A
  210. #define OCF_READ_HOLD_MODE_ACTIVITY 0x002B
  211. #define OCF_WRITE_HOLD_MODE_ACTIVITY    0x002C
  212. #define OCF_READ_TRANSMIT_POWER_LEVEL   0x002D
  213. #define OCF_READ_SYNC_FLOW_ENABLE   0x002E
  214. #define OCF_WRITE_SYNC_FLOW_ENABLE  0x002F
  215. #define OCF_SET_CONTROLLER_TO_HOST_FC   0x0031
  216. #define OCF_HOST_BUFFER_SIZE        0x0033
  217. #define OCF_HOST_NUM_COMP_PKTS      0x0035
  218. #define OCF_READ_LINK_SUPERVISION_TIMEOUT   0x0036
  219. #define OCF_WRITE_LINK_SUPERVISION_TIMEOUT  0x0037
  220. #define OCF_READ_NUM_SUPPORTED_IAC  0x0038
  221. #define OCF_READ_CURRENT_IAC_LAP    0x0039
  222. #define OCF_WRITE_CURRENT_IAC_LAP   0x003A
  223. #define OCF_READ_PAGE_SCAN_PERIOD_MODE  0x003B
  224. #define OCF_WRITE_PAGE_SCAN_PERIOD_MODE 0x003C
  225. #define OCF_READ_PAGE_SCAN_MODE     0x003D
  226. #define OCF_WRITE_PAGE_SCAN_MODE    0x003E
  227. #define OCF_SET_AFH_CLASSIFICATION  0x003F
  228. #define OCF_READ_INQUIRY_SCAN_TYPE  0x0042
  229. #define OCF_WRITE_INQUIRY_SCAN_TYPE 0x0043
  230. #define OCF_READ_INQUIRY_MODE       0x0044
  231. #define OCF_WRITE_INQUIRY_MODE      0x0045
  232. #define OCF_READ_PAGE_SCAN_TYPE     0x0046
  233. #define OCF_WRITE_PAGE_SCAN_TYPE    0x0047
  234. #define OCF_READ_AFH_MODE       0x0048
  235. #define OCF_WRITE_AFH_MODE      0x0049
  236. #define OCF_READ_EXT_INQUIRY_RESPONSE   0x0051
  237. #define OCF_WRITE_EXT_INQUIRY_RESPONSE  0x0052
  238. #define OCF_REFRESH_ENCRYPTION_KEY  0x0053
  239. #define OCF_READ_SIMPLE_PAIRING_MODE    0x0055
  240. #define OCF_WRITE_SIMPLE_PAIRING_MODE   0x0056
  241. #define OCF_READ_LOCAL_OOB_DATA     0x0057
  242. #define OCF_READ_INQUIRY_TRANSMIT_POWER_LEVEL   0x0058
  243. #define OCF_WRITE_INQUIRY_TRANSMIT_POWER_LEVEL  0x0059
  244. #define OCF_READ_DEFAULT_ERROR_DATA_REPORTING   0x005A
  245. #define OCF_WRITE_DEFAULT_ERROR_DATA_REPORTING  0x005B
  246. #define OCF_ENHANCED_FLUSH      0x005F
  247. #define OCF_SEND_KEYPRESS_NOTIFY    0x0060
  248. /* Informational Parameters */
  249. #define OGF_INFO_PARAM      0x04
  250. #define OCF_READ_LOCAL_VERSION      0x0001
  251. #define OCF_READ_LOCAL_COMMANDS     0x0002
  252. #define OCF_READ_LOCAL_FEATURES     0x0003
  253. #define OCF_READ_LOCAL_EXT_FEATURES 0x0004
  254. #define OCF_READ_BUFFER_SIZE        0x0005
  255. #define OCF_READ_COUNTRY_CODE       0x0007
  256. #define OCF_READ_BD_ADDR        0x0009
  257. /* Status params */
  258. #define OGF_STATUS_PARAM    0x05
  259. #define OCF_READ_FAILED_CONTACT_COUNTER     0x0001
  260. #define OCF_RESET_FAILED_CONTACT_COUNTER    0x0002
  261. #define OCF_READ_LINK_QUALITY       0x0003
  262. #define OCF_READ_RSSI           0x0005
  263. #define OCF_READ_AFH_MAP        0x0006
  264. #define OCF_READ_CLOCK          0x0007
  265. /* Testing commands */
  266. #define OGF_TESTING_CMD     0x06
  267. #define OCF_READ_LOOPBACK_MODE          0x0001
  268. #define OCF_WRITE_LOOPBACK_MODE         0x0002
  269. #define OCF_ENABLE_DEVICE_UNDER_TEST_MODE   0x0003
  270. #define OCF_WRITE_SIMPLE_PAIRING_DEBUG_MODE 0x0004
  271. /* Vendor specific commands */
  272. #define OGF_VENDOR_CMD      0x3f
  273. /* ---- HCI Events ---- */
  274. #define EVT_INQUIRY_COMPLETE        0x01
  275. #define EVT_INQUIRY_RESULT      0x02
  276. #define EVT_CONN_COMPLETE       0x03
  277. #define EVT_CONN_REQUEST        0x04
  278. #define EVT_DISCONN_COMPLETE        0x05
  279. #define EVT_AUTH_COMPLETE       0x06
  280. #define EVT_REMOTE_NAME_REQ_COMPLETE    0x07
  281. #define EVT_ENCRYPT_CHANGE      0x08
  282. #define EVT_CHANGE_CONN_LINK_KEY_COMPLETE   0x09
  283. #define EVT_MASTER_LINK_KEY_COMPLETE        0x0A
  284. #define EVT_READ_REMOTE_FEATURES_COMPLETE   0x0B
  285. #define EVT_READ_REMOTE_VERSION_COMPLETE    0x0C
  286. #define EVT_QOS_SETUP_COMPLETE      0x0D
  287. #define EVT_CMD_COMPLETE        0x0E
  288. #define EVT_CMD_STATUS          0x0F
  289. #define EVT_HARDWARE_ERROR      0x10
  290. #define EVT_FLUSH_OCCURRED      0x11
  291. #define EVT_ROLE_CHANGE         0x12
  292. #define EVT_NUM_COMP_PKTS       0x13
  293. #define EVT_MODE_CHANGE         0x14
  294. #define EVT_RETURN_LINK_KEYS        0x15
  295. #define EVT_PIN_CODE_REQ        0x16
  296. #define EVT_LINK_KEY_REQ        0x17
  297. #define EVT_LINK_KEY_NOTIFY     0x18
  298. #define EVT_LOOPBACK_COMMAND        0x19
  299. #define EVT_DATA_BUFFER_OVERFLOW    0x1A
  300. #define EVT_MAX_SLOTS_CHANGE        0x1B
  301. #define EVT_READ_CLOCK_OFFSET_COMPLETE  0x1C
  302. #define EVT_CONN_PTYPE_CHANGED      0x1D
  303. #define EVT_QOS_VIOLATION       0x1E
  304. #define EVT_PSCAN_REP_MODE_CHANGE   0x20
  305. #define EVT_FLOW_SPEC_COMPLETE      0x21
  306. #define EVT_INQUIRY_RESULT_WITH_RSSI    0x22
  307. #define EVT_READ_REMOTE_EXT_FEATURES_COMPLETE   0x23
  308. #define EVT_SYNC_CONN_COMPLETE      0x2C
  309. #define EVT_SYNC_CONN_CHANGED       0x2D
  310. #define EVT_SNIFF_SUBRATING     0x2E
  311. #define EVT_EXTENDED_INQUIRY_RESULT 0x2F
  312. #define EVT_ENCRYPTION_KEY_REFRESH_COMPLETE 0x30
  313. #define EVT_IO_CAPABILITY_REQUEST   0x31
  314. #define EVT_IO_CAPABILITY_RESPONSE  0x32
  315. #define EVT_USER_CONFIRM_REQUEST    0x33
  316. #define EVT_USER_PASSKEY_REQUEST    0x34
  317. #define EVT_REMOTE_OOB_DATA_REQUEST 0x35
  318. #define EVT_SIMPLE_PAIRING_COMPLETE 0x36
  319. #define EVT_LINK_SUPERVISION_TIMEOUT_CHANGED    0x38
  320. #define EVT_ENHANCED_FLUSH_COMPLETE 0x39
  321. #define EVT_USER_PASSKEY_NOTIFY     0x3B
  322. #define EVT_KEYPRESS_NOTIFY     0x3C
  323. #define EVT_REMOTE_HOST_FEATURES_NOTIFY 0x3D
  324. #define HCI_COMMAND_HDR_SIZE 3
  325. #define HCI_EVENT_HDR_SIZE 3
  326. #define HCI_ACL_HDR_SIZE 4
  327. #define HCI_SCO_HDR_SIZE 3
  328. #pragma pack(1)
  329. /*PDU HDR*/
  330. typedef struct
  331. {
  332. uint16_t opcode;
  333. uint8_t para_total_len;
  334. }HCI_Command_HDR_Format;
  335. typedef struct
  336. {
  337. uint8_t evecode;
  338. uint8_t para_total_len;
  339. }HCI_Event_HDR_Format;
  340. typedef struct {
  341. uint16_t handle;      /* Handle & Flags(PB, BC) */
  342. uint16_t dlen;
  343. }HCI_ACL_HDR_Format;
  344. typedef struct {
  345. uint16_t handle;
  346. uint8_t dlen;
  347. }HCI_SCO_HDR_Format;
  348. /*DEATIL COMMAND PDU FORMAT*/
  349. /* Link Control */
  350. typedef struct
  351. {
  352. HCI_Command_HDR_Format HDR;
  353. uint8_t lap[3];
  354. uint8_t inquiry_time;
  355. uint8_t num_limit;
  356. }COM_Inquiay_Format;
  357. typedef struct
  358. {
  359. HCI_Command_HDR_Format HDR;
  360. uint8_t BD_ADDR[6];
  361. uint16_t pkt_type;
  362. uint8_t pscan_rep_mode;
  363. uint8_t reserved;
  364. uint16_t clock_offset;
  365. uint8_t role_switch;
  366. }COM_Create_Connect_Format;
  367. typedef struct
  368. {
  369. HCI_Command_HDR_Format HDR;
  370. uint16_t con_handle;
  371. uint8_t reason;
  372. }COM_Disconnect_Format;
  373. /* Link Policy */
  374. /* Host Controller and Baseband */
  375. typedef struct
  376. {
  377. HCI_Command_HDR_Format HDR;
  378. }COM_Reset_Format;
  379. typedef struct
  380. {
  381. uint8_t status;
  382. }Reset_rsp_Format;
  383. typedef struct
  384. {
  385. HCI_Command_HDR_Format HDR;
  386. uint8_t scan_enable;
  387. }COM_Write_Scan_Enable_Format;
  388. typedef struct
  389. {
  390. uint8_t status;
  391. }Write_Scan_Enable_rsp_Format;
  392. /* Informational Parameters */
  393. typedef struct
  394. {
  395. HCI_Command_HDR_Format HDR;
  396. }COM_Read_Buffer_Size_Format;
  397. typedef struct
  398. {
  399. uint8_t status;
  400. uint16_t acl_mtu;
  401. uint8_t sco_mtu;
  402. uint16_t acl_max_pkt;
  403. uint16_t sco_max_pkt;
  404. }Read_Buffer_Size_rsp_Format;
  405. typedef struct
  406. {
  407. HCI_Command_HDR_Format HDR;
  408. }COM_Read_BD_ADDR_Format;
  409. typedef struct
  410. {
  411. uint8_t status;
  412. uint8_t BD_ADDR[6];
  413. }Read_BD_ADDR_rsp_Format;
  414. /* Status params */
  415. /* Testing commands */
  416. /* Vendor specific commands */
  417. /* Vendor specific commands */
  418. /*DEATIL EVENT PDU FORMAT*/
  419. typedef struct {
  420. HCI_Event_HDR_Format HDR;
  421. uint8_t ncmd;
  422. uint16_t opcode;
  423. }EVT_Com_Complete_HDR_Format;
  424. typedef struct {
  425. HCI_Event_HDR_Format HDR;
  426. uint8_t status;
  427. uint8_t ncmd;
  428. uint16_t opcode;
  429. }EVT_CMD_Status_Format;
  430. typedef struct {
  431. HCI_Event_HDR_Format HDR;
  432. uint8_t ncmd;
  433. uint8_t bdaddr[6];
  434. uint8_t page_scan_mode;
  435. uint8_t reserved[2];
  436. uint8_t dev_class[3];
  437. uint16_t clock_offset;
  438. }EVT_CMD_Inquiry_result_Format;
  439. typedef struct {
  440. HCI_Event_HDR_Format HDR;
  441. uint8_t status;
  442. uint16_t con_handle;
  443. uint8_t bdaddr[6];
  444. uint8_t link_type;
  445. uint8_t encryption_enabled;
  446. }EVT_CMD_Connect_complete_Format;
  447. typedef struct {
  448. HCI_Event_HDR_Format HDR;
  449. uint8_t status;
  450. uint16_t con_handle;
  451. uint8_t reason;
  452. }EVT_CMD_Disconnect_complete_Format;
  453. typedef struct {
  454. HCI_Event_HDR_Format HDR;
  455. uint8_t status;
  456. }EVT_CMD_Inquiry_complete_Format;
  457. #pragma pack ()
  458. /*HCI API*/
  459. int hci_reset();
  460. int hci_read_buffer_size();
  461. int hci_write_scan_enable(uint8_t scan_enable);
  462. int hci_read_bd_addr();
  463. int hci_connect_req(uint8_t BD_ADDR[6],uint16_t pkt_type,uint8_t pscan_rep_mode,uint8_t allow_role_switch);
  464. int hci_disconnect(uint16_t con_handle,uint8_t reason);
  465. int hci_inquiry(uint8_t lap[3],uint8_t inquiry_time,uint8_t num_limit);
  466. int hci_send_acl_data(uint16_t handle,uint8_t *acl_data,uint16_t acl_length);
  467. int hci_send_cmd(uint8_t *PDU,uint32_t length);
  468. int hci_receive_pdu(uint8_t *PDU,uint32_t length);
  469. int hci_parse_cmd(uint8_t *PDU,uint32_t length);
  470. int hci_parse_evt(uint8_t *PDU,uint32_t length);
  471. int hci_parse_acl(uint8_t *PDU,uint32_t length);
  472. int hci_parse_sco(uint8_t *PDU,uint32_t length);
  473. int hci_parse_evt_complete(uint8_t *PDU,uint32_t length);
  474. int hci_parse_evt_cmd_status(uint8_t *PDU,uint32_t length);
  475. int hci_parse_evt_inquiry_result(uint8_t *PDU,uint32_t length);
  476. int hci_parse_evt_inquiry_complete(uint8_t *PDU,uint32_t length);
  477. int hci_parse_evt_connect_complete(uint8_t *PDU,uint32_t length);
  478. int hci_parse_evt_disconnect_complete(uint8_t *PDU,uint32_t length);
  479. int hci_parse_reset_rsp(uint8_t *PDU,uint32_t length);
  480. int hci_parse_read_buffer_size_rsp(uint8_t *PDU,uint32_t length);
  481. int hci_parse_write_scan_enable_rsp(uint8_t *PDU,uint32_t length);
  482. int hci_parse_read_BD_ADDR_rsp(uint8_t *PDU,uint32_t length);
  483. #endif

bt_hci.c

[cpp] view plain copy
  1. #include "bt_hci.h"
  2. int hci_reset()
  3. {
  4. COM_Reset_Format PDU;
  5. PDU.HDR.opcode = cmd_opcode_pack(OGF_HOST_CTL,OCF_RESET);
  6. PDU.HDR.para_total_len = sizeof(COM_Reset_Format) - HCI_COMMAND_HDR_SIZE;
  7. hci_send_cmd((uint8_t *)&PDU,sizeof(COM_Reset_Format));
  8. }
  9. int hci_read_buffer_size()
  10. {
  11. COM_Read_Buffer_Size_Format PDU;
  12. PDU.HDR.opcode = cmd_opcode_pack(OGF_INFO_PARAM,OCF_READ_BUFFER_SIZE);
  13. PDU.HDR.para_total_len = sizeof(COM_Read_Buffer_Size_Format) - HCI_COMMAND_HDR_SIZE;
  14. hci_send_cmd((uint8_t *)&PDU,sizeof(COM_Read_Buffer_Size_Format));
  15. }
  16. int hci_write_scan_enable(uint8_t scan_enable)
  17. {
  18. COM_Write_Scan_Enable_Format PDU;
  19. PDU.HDR.opcode = cmd_opcode_pack(OGF_HOST_CTL,OCF_WRITE_SCAN_ENABLE);
  20. PDU.HDR.para_total_len = sizeof(COM_Write_Scan_Enable_Format) - HCI_COMMAND_HDR_SIZE;
  21. PDU.scan_enable = scan_enable;
  22. hci_send_cmd((uint8_t *)&PDU,sizeof(COM_Write_Scan_Enable_Format));
  23. }
  24. int hci_read_bd_addr()
  25. {
  26. COM_Read_BD_ADDR_Format PDU;
  27. PDU.HDR.opcode = cmd_opcode_pack(OGF_INFO_PARAM,OCF_READ_BD_ADDR);
  28. PDU.HDR.para_total_len = sizeof(COM_Read_BD_ADDR_Format) - HCI_COMMAND_HDR_SIZE;
  29. hci_send_cmd((uint8_t *)&PDU,sizeof(COM_Read_BD_ADDR_Format));
  30. }
  31. int hci_connect_req(uint8_t BD_ADDR[6],uint16_t pkt_type,uint8_t pscan_rep_mode,uint8_t allow_role_switch)
  32. {
  33. COM_Create_Connect_Format PDU;
  34. PDU.HDR.opcode = cmd_opcode_pack(OGF_LINK_CTL,OCF_CREATE_CONN);
  35. PDU.HDR.para_total_len = sizeof(COM_Create_Connect_Format) - HCI_COMMAND_HDR_SIZE;
  36. memcpy(PDU.BD_ADDR,BD_ADDR,6);
  37. PDU.pkt_type = pkt_type;
  38. PDU.pscan_rep_mode = pscan_rep_mode;
  39. PDU.reserved = 0;
  40. PDU.clock_offset = 0;
  41. PDU.role_switch = allow_role_switch;
  42. hci_send_cmd((uint8_t *)&PDU,sizeof(COM_Create_Connect_Format));
  43. }
  44. int hci_disconnect(uint16_t con_handle,uint8_t reason)
  45. {
  46. COM_Disconnect_Format PDU;
  47. PDU.HDR.opcode = cmd_opcode_pack(OGF_LINK_CTL,OCF_DISCONNECT);
  48. PDU.HDR.para_total_len = sizeof(COM_Disconnect_Format) - HCI_COMMAND_HDR_SIZE;
  49. PDU.con_handle = con_handle;
  50. PDU.reason = reason;
  51. hci_send_cmd((uint8_t *)&PDU,sizeof(COM_Disconnect_Format));
  52. }
  53. int hci_inquiry(uint8_t lap[3],uint8_t inquiry_time,uint8_t num_limit)
  54. {
  55. COM_Inquiay_Format PDU;
  56. PDU.HDR.opcode = cmd_opcode_pack(OGF_LINK_CTL,OCF_INQUIRY);
  57. PDU.HDR.para_total_len = sizeof(COM_Inquiay_Format) - HCI_COMMAND_HDR_SIZE;
  58. memcpy(PDU.lap,lap,3);
  59. PDU.inquiry_time = inquiry_time;
  60. PDU.num_limit = num_limit;
  61. hci_send_cmd((uint8_t *)&PDU,sizeof(COM_Inquiay_Format));
  62. }
  63. int hci_send_acl_data(uint16_t handle,uint8_t *acl_data,uint16_t acl_length)
  64. {
  65. }
  66. int hci_send_cmd(uint8_t *PDU,uint32_t length)
  67. {
  68. int index = 0;
  69. #if defined(TRANSPORT_UART)
  70. uint8_t HCI_PDU[length+1];
  71. HCI_PDU[0] = HCI_COMMAND_PKT;
  72. memcpy(HCI_PDU+1,PDU,length);
  73. BT_HCI_DEBUG((">> SEDN HCI COMMAND:"));
  74. for(index = 0;index < length+1;index++)
  75. {
  76. BT_HCI_DEBUG(("0x%x ",HCI_PDU[index]));
  77. }
  78. BT_HCI_DEBUG(("\n"));
  79. //NEED TO DO PASS THE DATA TO UART PORT
  80. #elif defined(TRANSPORT_USB)
  81. //TODO
  82. #elif defined(TRANSPORT_SDIO)
  83. //TODO
  84. #endif
  85. }
  86. int hci_receive_pdu(uint8_t *PDU,uint32_t length)
  87. {
  88. #if defined(TRANSPORT_UART)
  89. uint8_t pck_type = *PDU;
  90. switch(pck_type)
  91. {
  92. case HCI_COMMAND_PKT:
  93. {
  94. BT_HCI_DEBUG(("<< COMMAND:"));
  95. hci_parse_cmd(PDU+1,length-1);
  96. break;
  97. }
  98. case HCI_ACLDATA_PKT:
  99. {
  100. BT_HCI_DEBUG(("<< ACL:"));
  101. hci_parse_acl(PDU+1,length-1);
  102. break;
  103. }
  104. case HCI_SCODATA_PKT:
  105. {
  106. BT_HCI_DEBUG(("<< SCO:"));
  107. hci_parse_sco(PDU+1,length-1);
  108. break;
  109. }
  110. case HCI_EVENT_PKT:
  111. {
  112. BT_HCI_DEBUG(("<< HCI_EVENT_PKT:"));
  113. hci_parse_evt(PDU+1,length-1);
  114. break;
  115. }
  116. default:
  117. {
  118. BT_HCI_DEBUG(("WARNING:UNKNOW PDU\n"));
  119. break;
  120. }
  121. }
  122. #elif defined(TRANSPORT_USB)
  123. //TODO
  124. #elif defined(TRANSPORT_SDIO)
  125. //TODO
  126. #endif
  127. }
  128. int hci_parse_cmd(uint8_t *PDU,uint32_t length)
  129. {
  130. HCI_Command_HDR_Format *COM_PDU = (HCI_Command_HDR_Format *)PDU;
  131. }
  132. int hci_parse_evt(uint8_t *PDU,uint32_t length)
  133. {
  134. HCI_Event_HDR_Format *EVT_PDU = (HCI_Event_HDR_Format *)PDU;
  135. switch(EVT_PDU->evecode)
  136. {
  137. case EVT_CMD_COMPLETE:
  138. {
  139. BT_HCI_DEBUG(("EVT_CMD_COMPLETE "));
  140. hci_parse_evt_complete(PDU,length);
  141. break;
  142. }
  143. case EVT_CMD_STATUS:
  144. {
  145. BT_HCI_DEBUG(("EVT_CMD_STATUS \n"));
  146. hci_parse_evt_cmd_status(PDU,length);
  147. break;
  148. }
  149. case EVT_INQUIRY_RESULT:
  150. {
  151. BT_HCI_DEBUG(("EVT_INQUIRY_RESULT"));
  152. hci_parse_evt_inquiry_result(PDU,length);
  153. break;
  154. }
  155. case EVT_INQUIRY_COMPLETE:
  156. {
  157. BT_HCI_DEBUG(("EVT_INQUIRY_COMPLETE"));
  158. hci_parse_evt_inquiry_complete(PDU,length);
  159. break;
  160. }
  161. case EVT_CONN_COMPLETE:
  162. {
  163. BT_HCI_DEBUG(("EVT_CONN_COMPLETE"));
  164. hci_parse_evt_connect_complete(PDU,length);
  165. break;
  166. }
  167. case EVT_DISCONN_COMPLETE:
  168. {
  169. BT_HCI_DEBUG(("EVT_DISCONN_COMPLETE"));
  170. hci_parse_evt_disconnect_complete(PDU,length);
  171. break;
  172. }
  173. default:
  174. {
  175. int index = 0;
  176. BT_HCI_DEBUG(("UNKNOW EVENT:"));
  177. for(index = 0;index < length;index++)
  178. {
  179. BT_HCI_DEBUG(("0x%02x ",PDU[index]));
  180. }
  181. BT_HCI_DEBUG(("\n"));
  182. break;
  183. }
  184. }
  185. }
  186. int hci_parse_acl(uint8_t *PDU,uint32_t length)
  187. {
  188. HCI_ACL_HDR_Format *ACL_PDU = (HCI_ACL_HDR_Format *)PDU;
  189. }
  190. int hci_parse_sco(uint8_t *PDU,uint32_t length)
  191. {
  192. HCI_SCO_HDR_Format *SCO_PDU = (HCI_SCO_HDR_Format *)PDU;
  193. }
  194. int hci_parse_evt_complete(uint8_t *PDU,uint32_t length)
  195. {
  196. EVT_Com_Complete_HDR_Format *EVT_PDU = (EVT_Com_Complete_HDR_Format*)PDU;
  197. switch(cmd_opcode_ogf(EVT_PDU->opcode))
  198. {
  199. case OGF_LINK_CTL:
  200. {
  201. BT_HCI_DEBUG(("OGF_LINK_CTL\n"));
  202. break;
  203. }
  204. case OGF_LINK_POLICY:
  205. {
  206. BT_HCI_DEBUG(("OGF_LINK_POLICY\n"));
  207. break;
  208. }
  209. case OGF_HOST_CTL:
  210. {
  211. BT_HCI_DEBUG(("OGF_HOST_CTL\n"));
  212. switch(cmd_opcode_ocf(EVT_PDU->opcode))
  213. {
  214. case OCF_RESET:
  215. {
  216. hci_parse_reset_rsp((uint8_t *)EVT_PDU+sizeof(EVT_Com_Complete_HDR_Format),length-sizeof(EVT_Com_Complete_HDR_Format));
  217. break;
  218. }
  219. case OCF_WRITE_SCAN_ENABLE:
  220. {
  221. hci_parse_write_scan_enable_rsp((uint8_t *)EVT_PDU+sizeof(EVT_Com_Complete_HDR_Format),length-sizeof(EVT_Com_Complete_HDR_Format));
  222. }
  223. default:
  224. {
  225. break;
  226. }
  227. }
  228. break;
  229. }
  230. case OGF_INFO_PARAM:
  231. {
  232. BT_HCI_DEBUG(("OGF_INFO_PARAM\n"));
  233. switch(cmd_opcode_ocf(EVT_PDU->opcode))
  234. {
  235. case OCF_READ_BUFFER_SIZE:
  236. {
  237. hci_parse_read_buffer_size_rsp((uint8_t *)EVT_PDU+sizeof(EVT_Com_Complete_HDR_Format),length-sizeof(EVT_Com_Complete_HDR_Format));
  238. break;
  239. }
  240. case OCF_READ_BD_ADDR:
  241. {
  242. hci_parse_read_BD_ADDR_rsp((uint8_t *)EVT_PDU+sizeof(EVT_Com_Complete_HDR_Format),length-sizeof(EVT_Com_Complete_HDR_Format));
  243. }
  244. default:
  245. {
  246. break;
  247. }
  248. }
  249. break;
  250. }
  251. case OGF_STATUS_PARAM:
  252. {
  253. BT_HCI_DEBUG(("OGF_STATUS_PARAM\n"));
  254. break;
  255. }
  256. case OGF_TESTING_CMD:
  257. {
  258. BT_HCI_DEBUG(("OGF_TESTING_CMD\n"));
  259. break;
  260. }
  261. case OGF_VENDOR_CMD:
  262. {
  263. BT_HCI_DEBUG(("OGF_VENDOR_CMD\n"));
  264. break;
  265. }
  266. default:
  267. {
  268. break;
  269. }
  270. }
  271. }
  272. int hci_parse_evt_cmd_status(uint8_t *PDU,uint32_t length)
  273. {
  274. EVT_CMD_Status_Format *EVT_PDU = (EVT_CMD_Status_Format*)PDU;
  275. }
  276. int hci_parse_evt_inquiry_result(uint8_t *PDU,uint32_t length)
  277. {
  278. int index = 0;
  279. EVT_CMD_Inquiry_result_Format *EVT_PDU = (EVT_CMD_Inquiry_result_Format*)PDU;
  280. BT_HCI_DEBUG(("Inquiry rep num %d\n",EVT_PDU->ncmd));
  281. BT_HCI_DEBUG(("Inquiry ADDR:"));
  282. for(index = 0;index < 6;index++)
  283. {
  284. BT_HCI_DEBUG(("0x%02x ",EVT_PDU->bdaddr[index]));
  285. }
  286. BT_HCI_DEBUG(("\n"));
  287. BT_HCI_DEBUG(("Inquiry page_scan_mode %d\n",EVT_PDU->page_scan_mode));
  288. BT_HCI_DEBUG(("Inquiry COD:"));
  289. for(index = 0;index < 3;index++)
  290. {
  291. BT_HCI_DEBUG(("0x%02x ",EVT_PDU->dev_class[index]));
  292. }
  293. BT_HCI_DEBUG(("\n"));
  294. BT_HCI_DEBUG(("Inquiry clock_offset %d\n",EVT_PDU->clock_offset));
  295. }
  296. int hci_parse_evt_inquiry_complete(uint8_t *PDU,uint32_t length)
  297. {
  298. EVT_CMD_Inquiry_complete_Format *EVT_PDU = (EVT_CMD_Inquiry_complete_Format *)PDU;
  299. BT_HCI_DEBUG(("status is %d\n",EVT_PDU->status));
  300. }
  301. int hci_parse_evt_connect_complete(uint8_t *PDU,uint32_t length)
  302. {
  303. EVT_CMD_Connect_complete_Format *EVT_PDU = (EVT_CMD_Connect_complete_Format *)PDU;
  304. BT_HCI_DEBUG(("status is %d\n",EVT_PDU->status));
  305. BT_HCI_DEBUG(("con_handle is %d\n",EVT_PDU->con_handle));
  306. BT_HCI_DEBUG(("link_type is %d\n",EVT_PDU->link_type));
  307. }
  308. int hci_parse_evt_disconnect_complete(uint8_t *PDU,uint32_t length)
  309. {
  310. EVT_CMD_Disconnect_complete_Format *EVT_PDU = (EVT_CMD_Disconnect_complete_Format *)PDU;
  311. BT_HCI_DEBUG(("status is %d\n",EVT_PDU->status));
  312. BT_HCI_DEBUG(("con_handle is %d\n",EVT_PDU->con_handle));
  313. BT_HCI_DEBUG(("reason is %d\n",EVT_PDU->reason));
  314. }
  315. int hci_parse_reset_rsp(uint8_t *PDU,uint32_t length)
  316. {
  317. Reset_rsp_Format *RSP = (Reset_rsp_Format *)PDU;
  318. BT_HCI_DEBUG(("status is %d\n",RSP->status));
  319. }
  320. int hci_parse_read_buffer_size_rsp(uint8_t *PDU,uint32_t length)
  321. {
  322. Read_Buffer_Size_rsp_Format *RSP = (Read_Buffer_Size_rsp_Format *)PDU;
  323. BT_HCI_DEBUG(("status is %d\n",RSP->status));
  324. BT_HCI_DEBUG(("acl_mtu is %d\n",RSP->acl_mtu));
  325. BT_HCI_DEBUG(("sco_mtu is %d\n",RSP->sco_mtu));
  326. BT_HCI_DEBUG(("acl_max_pkt is %d\n",RSP->acl_max_pkt));
  327. BT_HCI_DEBUG(("sco_max_pkt is %d\n",RSP->sco_max_pkt));
  328. }
  329. int hci_parse_write_scan_enable_rsp(uint8_t *PDU,uint32_t length)
  330. {
  331. Write_Scan_Enable_rsp_Format *RSP = (Write_Scan_Enable_rsp_Format *)PDU;
  332. BT_HCI_DEBUG(("status is %d\n",RSP->status));
  333. }
  334. int hci_parse_read_BD_ADDR_rsp(uint8_t *PDU,uint32_t length)
  335. {
  336. int index = 0;
  337. Read_BD_ADDR_rsp_Format *RSP = (Read_BD_ADDR_rsp_Format *)PDU;
  338. BT_HCI_DEBUG(("status is %d\n",RSP->status));
  339. BT_HCI_DEBUG(("ADDR:"));
  340. for(index = 0;index<6;index++)
  341. {
  342. BT_HCI_DEBUG(("0x%02x ",(RSP->BD_ADDR)[index]));
  343. }
  344. BT_HCI_DEBUG(("\n"));
  345. }

bt_cfg.h

[cpp] view plain copy
  1. #ifndef BT_HCI_CFG_H
  2. #define BT_HCI_CFG_H
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6. #define DEBUG_BT_HCI
  7. typedef unsigned char uint8_t;
  8. typedef unsigned short uint16_t;
  9. typedef unsigned int uint32_t;
  10. typedef unsigned long long uint64_t;
  11. //typedef  char int8_t;
  12. typedef  short int16_t;
  13. typedef  int int32_t;
  14. typedef long long int64_t;
  15. #undef NULL
  16. #if defined(__cplusplus)
  17. #define NULL 0
  18. #else
  19. #define NULL ((void *)0)
  20. #endif
  21. #endif

main.c

[cpp] view plain copy
  1. #include <stdio.h>
  2. #include "bt_hci.h"
  3. #include "memory_pool.h"
  4. void HDR_PAR_UNPAR_Test()
  5. {
  6. uint16_t Reset_opcode_2 = 0x0c03;
  7. uint16_t Read_Buffer_Size = 0x1005;
  8. uint16_t acl_header = 0x204d;
  9. uint16_t handle = 0x004d;
  10. uint8_t flag = ACL_START;
  11. printf("COMMAND HDR SIZE is %d\n",sizeof(HCI_Command_HDR_Format));
  12. printf("EVENT HDR SIZE is %d\n",sizeof(HCI_Event_HDR_Format));
  13. printf("ACL HDR SIZE is %d\n",sizeof(HCI_ACL_HDR_Format));
  14. printf("SCO HDR SIZE is %d\n",sizeof(HCI_SCO_HDR_Format));
  15. printf("OGF is %d\n",cmd_opcode_ogf(Read_Buffer_Size));
  16. printf("OCF is %d\n",cmd_opcode_ocf(Read_Buffer_Size));
  17. printf("Rset opcode is 0x%04x\n",cmd_opcode_pack(3,3));
  18. printf("HANDLE is 0x%04x\n",acl_get_handle(acl_header));
  19. printf("FLAG is %d\n",acl_get_flags(acl_header));
  20. printf("ACL HDR is 0x%04x\n",acl_handle_pack(handle,flag));
  21. }
  22. int main()
  23. {
  24. BT_HCI_DEBUG(("HCI START\n"));
  25. uint8_t BD_ADDR[6] = {0x1,0x1,0x1,0x1,0x1,0x1};
  26. uint8_t inquiry_access[3] = {0x9e,0x8b,0x33};
  27. uint8_t receive_reset_complete_evt[7] = {0x4,0xe,0x4,0x1,0x3,0xc,0x0};
  28. uint8_t receive_read_buffer_size_complete_evt[14] = {0x4,0xe,0xb,0x1,0x5,0x10,0x0,0x80,0x01,0x40,0x04,0x00,0x08,0x00};
  29. uint8_t receive_write_scan_enable_complete_evt[7] = {0x4,0xe,0x4,0x1,0x1a,0xc,0x0};
  30. uint8_t receive_read_BD_ADDR_complete_evt[13] = {0x04,0x0e,0x0a,0x1,0x9,0x10,0x00,0x4e,0xa8,0x00,0x4e,0x49,0x4a};
  31. uint8_t receive_cmd_status_evt_inquiry[7] = {0x4,0xf,0x4,0x0,0x1,0x1,0x4};
  32. uint8_t receive_inquiry_result_evt[18] = {0x4,0x2,0xf,0x1,0x1,0x01,0x1,0x1,0x1,0x1,0x1,0x0,0x0,0x1,0x52,0x2e,0x0,0x0};
  33. uint8_t receive_inquiry_complete_evt[4] = {0x4,0x1,0x1,0x0};
  34. uint8_t receive_cmd_status_evt_connect[7] = {0x4,0xf,0x4,0x0,0x1,0x5,0x4};
  35. uint8_t receive_create_connect_complete_evt[14] = {0x4,0x3,0xb,0x0,0x29,0x0,0x5f,0x21,0xa3,0x60,0x10,0x0,0x1,0x0};
  36. uint8_t receive_cmd_status_evt_disconnect[7] = {0x4,0xf,0x4,0x0,0x1,0x6,0x4};
  37. uint8_t receive_cmd_disconnect_complete_evt[7] = {0x4,0x5,0x4,0x0,0x29,0x0,0x16};
  38. HDR_PAR_UNPAR_Test();
  39. /*HCI TEST*/
  40. hci_reset();
  41. hci_receive_pdu(receive_reset_complete_evt,sizeof(receive_reset_complete_evt));
  42. hci_read_buffer_size();
  43. hci_receive_pdu(receive_read_buffer_size_complete_evt,sizeof(receive_read_buffer_size_complete_evt));
  44. hci_write_scan_enable(SCAN_INQUIRY|SCAN_PAGE);
  45. hci_receive_pdu(receive_write_scan_enable_complete_evt,sizeof(receive_write_scan_enable_complete_evt));
  46. hci_read_bd_addr();
  47. hci_receive_pdu(receive_read_BD_ADDR_complete_evt,sizeof(receive_read_BD_ADDR_complete_evt));
  48. hci_inquiry(inquiry_access,6,1);
  49. hci_receive_pdu(receive_cmd_status_evt_inquiry,sizeof(receive_cmd_status_evt_inquiry));
  50. hci_receive_pdu(receive_inquiry_result_evt,sizeof(receive_inquiry_result_evt));
  51. hci_receive_pdu(receive_inquiry_complete_evt,sizeof(receive_inquiry_complete_evt));
  52. hci_connect_req(BD_ADDR,HCI_DM5|HCI_DH5|HCI_DM3|HCI_DH3|HCI_DH1|HCI_DM1,0,0);
  53. hci_receive_pdu(receive_cmd_status_evt_connect,sizeof(receive_cmd_status_evt_connect));
  54. hci_receive_pdu(receive_create_connect_complete_evt,sizeof(receive_create_connect_complete_evt));
  55. hci_disconnect(0x0029,0x13);
  56. hci_receive_pdu(receive_cmd_status_evt_disconnect,sizeof(receive_cmd_status_evt_disconnect));
  57. hci_receive_pdu(receive_cmd_disconnect_complete_evt,sizeof(receive_cmd_disconnect_complete_evt));
  58. }

蓝牙HCI剖析(三)相关推荐

  1. 蓝牙HCI剖析(一)

    关键字:bluetooth 蓝牙协议  HCI剖析 HCI概述 HCI笔记 LMP L2CAP SDP RFCOMM  作者:zhongjun 本着互相学习的目的,来分享此一系列的文章,欢迎转载,请注 ...

  2. 蓝牙HCI剖析(二)

    一.概述: 此篇文章主要是总结下HCI command 和 event 二.command 三.event: 四.此command和event是参照之前的一本书截图的,对于最新的core 4.2有很多 ...

  3. 蓝牙HCI Dongle说明

    Chipsets 本项目主要实现了蓝牙Host协议栈,并没有包含Controller部分,如果需要实现蓝牙交互,按照Core Spec,需要通过HCI接口连接其他蓝牙芯片实现蓝牙功能. 由于HCI接口 ...

  4. libevent源码深度剖析三

    libevent源码深度剖析三 --libevent基本使用场景和事件流程 张亮 1 前言 学习源代码该从哪里入手?我觉得从程序的基本使用场景和代码的整体处理流程入手是个不错的方法,至少从个人的经验上 ...

  5. 【es】es 分布式一致性原理剖析(三)-Data篇

    1.概述 转载:Elasticsearch分布式一致性原理剖析(三)-Data篇 前言 "Elasticsearch分布式一致性原理剖析"系列将会对Elasticsearch的分布 ...

  6. Android O HIDL的使用例子 -- 蓝牙HCI 服务进程

    1.1.Treble 计划概览 Android O 引入" Treble" 计划,目标是通过重构 Android OS 的 framework,使 Android 设备制造商能更快 ...

  7. 获取Android蓝牙HCI日志

    在我刚在开发者选项下开启开启蓝牙HCI信息搜集日志时, 使用adb并无法拿到btsnoop_hci.log. 随后查阅了许多资料, 折腾了许久, 包括什么要获取root权限等等. 最终在把USB连接方 ...

  8. Android 蓝牙抓包和分析 (1) 启用蓝牙HCI信息收集日志

    蓝牙通信其实和http通信有点类似,http通过接口交互抓取数据包也很方便,但是到了蓝牙就没那么方便了,本文就是介绍如何实现蓝牙数据包的抓取. 怎么抓包 另一种更为简便的抓包方式请阅读Android ...

  9. 蓝牙HCI command/event/acl/sco格式介绍

    一. 声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: 第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍. 第二篇:Transp ...

最新文章

  1. vue与html优势与缺点,vue优缺点详解
  2. 40.QT-QPropertyAnimationdong和QParallelAnimationGroup动画实现
  3. (实模式+保护模式)模式切换的过程步骤(代码+文字解析)
  4. api报错 javaee maven_maven test 换javaee6 无法加载spring的配置文件 ?报错-问答-阿里云开发者社区-阿里云...
  5. 关于编写流程的一些经验
  6. opencv-python 鼠标事件和坐标点截图
  7. 什么是Hadoop,怎样学习Hadoop
  8. Bailian4018 子串【字符串】
  9. Spring总结七:AOP动态代理的实现
  10. [Gdiplus]_[初级]_[使用插值模式控制图片的缩放质量]
  11. WPS无法使用复制粘贴快捷键
  12. 小熊的果篮 2021 CSP J2
  13. win7找不到win10计算机图标,win7电脑桌面图标不见了怎么办
  14. html的table 菜鸟,HTML table 标签 | 菜鸟教程
  15. C语言有必要学的很深入细致吗?
  16. 随机种子 seed()到底是怎么回事。
  17. 实验2:MIPS指令系统和MIPS体系结构
  18. 计算机在生活中的应用论文2000字,浅议计算机在生活中的应用论文(2)
  19. 基于Andriod的连锁药店管理系统-计算机毕业设计源码+LW文档
  20. 少说话多写代码之Python学习048——类的成员(supper函数)

热门文章

  1. 关于 Java 性能调优的 11个简单技巧,多少人知道?
  2. promethues集成nomad
  3. 多线程:中断(interrupt、interrupted、executor)
  4. 数据结构-树和二叉树01(定义、度、深度、有序树、森林)
  5. #中regex的命名空间_Python命名空间实例解析
  6. 5G边缘计算与算力网络(PPT)
  7. 深度解析:服务器架构和技术变革
  8. 为什么说红外热成像测温设备是2020年最火的弱电设备?
  9. 这些机房布线规范你都知道吗
  10. 运维不得不知道的事 数据中心断电如何做