ble_init.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #include "include.h"
  2. #include "wireless_service.h"
  3. #include "ble_client.h"
  4. ///////////////////////////////////////////////////////////////////////////
  5. #define MAX_TX_NUM 8
  6. #define MAX_TX_LEN 128
  7. #define TX_POOL_SIZE (MAX_TX_LEN + sizeof(struct txbuf_tag)) * MAX_TX_NUM
  8. ble_cb_t ble_cb AT(.ble_buf.var);
  9. AT(.ble_cache.att)
  10. uint8_t ble_tx_pool[TX_POOL_SIZE];
  11. #if LE_DUT_UART_EN
  12. BT_WORK_MODE cfg_bt_work_mode = MODE_NORMAL;
  13. void ble_set_work_mode(BT_WORK_MODE mode)
  14. {
  15. cfg_bt_work_mode = mode;
  16. }
  17. BT_WORK_MODE ble_get_work_mode(void)
  18. {
  19. return cfg_bt_work_mode;
  20. }
  21. #endif // LE_DUT_UART_EN
  22. void ble_txpkt_init(void)
  23. {
  24. memset(&ble_tx, 0x00, sizeof(ble_tx));
  25. txpkt_init(&ble_tx, ble_tx_pool, MAX_TX_NUM, MAX_TX_LEN);
  26. ble_tx.send_kick = ble_send_kick;
  27. }
  28. void ble_sm_param_init(void)
  29. {
  30. uint8_t security_req_en = 0;
  31. uint8_t auth_req = SM_AUTHREQ_BONDING | SM_AUTHREQ_MITM_PROTECTION;
  32. uint8_t io_capability = IO_CAPABILITY_NO_INPUT_NO_OUTPUT;
  33. ble_sm_init(security_req_en, io_capability, auth_req);
  34. }
  35. void ble_adv_param_init(bool adv_en)
  36. {
  37. adv_param_t adv_info;
  38. memset(&adv_info,0,sizeof(adv_info));
  39. adv_info.adv_len = ble_get_adv_data(adv_info.adv_data, sizeof(adv_info.adv_data));
  40. adv_info.scan_rsp_len = ble_get_scan_data(adv_info.scan_rsp, sizeof(adv_info.scan_rsp));
  41. adv_info.adv_int_min = adv_info.adv_int_max = 0x30;
  42. adv_info.adv_type = ADV_TYPE_IND;
  43. adv_info.adv_en = adv_en;
  44. adv_info.channel_map = 0x07;
  45. ble_set_adv_param(&adv_info);
  46. }
  47. void ble_dir_adv_param_init(bool adv_en)
  48. {
  49. sm_bonding_info_t bind_info;
  50. adv_param_t adv_info;
  51. memset(&adv_info,0,sizeof(adv_info));
  52. adv_info.adv_len = ble_get_adv_data(adv_info.adv_data, sizeof(adv_info.adv_data));
  53. adv_info.scan_rsp_len = ble_get_scan_data(adv_info.scan_rsp, sizeof(adv_info.scan_rsp));
  54. adv_info.adv_int_min = adv_info.adv_int_max = 0x30;
  55. adv_info.adv_type = ADV_TYPE_DIRECT_LO_IND;
  56. adv_info.adv_en = adv_en;
  57. adv_info.channel_map = 0x07;
  58. adv_info.filter_policy = 3;
  59. if (bsp_ble_bind_state(0, &bind_info)) {
  60. uint8_t addr[7];
  61. param_ble_central_addr_read(addr);
  62. printf("dir adv addr type = %x, addr:", addr[0]);
  63. print_r(&addr[1], 6);
  64. adv_info.direct_address_typ = addr[0];
  65. for (uint8_t i = 0; i < 6; i++) {
  66. adv_info.direct_address[i] = addr[6 - i];
  67. }
  68. }
  69. ble_set_adv_param(&adv_info);
  70. }
  71. void ble_rpa_param_init(void)
  72. {
  73. rpa_param_t rpa_info;
  74. memset(&rpa_info, 0, sizeof(rpa_param_t));
  75. rpa_info.rpa_en = 1;
  76. rpa_info.renew_to = 600;
  77. ble_set_rslv_renew_to(&rpa_info);
  78. }
  79. void ble_periph_init(void)
  80. {
  81. sm_bonding_info_t bind_info;
  82. ble_txpkt_init();
  83. ble_sm_param_init();
  84. gap_random_address_set_mode(GAP_PUBLIC_ADDRESS_TYPE);
  85. att_server_init(ble_get_profile_data());
  86. ble_service_init();
  87. #if LE_CHECK_PEER_TYPE
  88. gatt_client_init();
  89. ble_client_init();
  90. #endif // LE_CHECK_PEER_TYPE
  91. ble_rpa_param_init();
  92. if (bsp_ble_bind_state(0, &bind_info) && (bind_info.real_address_type == 1)) {
  93. gap_ral_dev_info_t ral_dev_info;
  94. ral_dev_info.priv_mode = 1;
  95. memcpy(ral_dev_info.peer_irk, bind_info.peer_irk.key, 16);
  96. ral_dev_info.addr.addr_type = bind_info.address_type;
  97. memcpy(&ral_dev_info.addr.addr, &bind_info.address, 6);
  98. ble_add_dev_to_ral_list(&ral_dev_info);
  99. }
  100. }
  101. void bsp_ble_init(void)
  102. {
  103. memset(&ble_cb, 0x00, sizeof(ble_cb));
  104. bt_init();
  105. ble_init_callback_register(ble_periph_init);
  106. bt_setup();
  107. /* ADV Initialize */
  108. delay_5ms(20);
  109. if (ble_get_bonding_cnt()) {
  110. printf("ADV_DIR_IND!!\n");
  111. ble_dir_adv_param_init(true);
  112. } else {
  113. printf("ADV_UNDIR_IND!!\n");
  114. ble_adv_param_init(true);
  115. }
  116. }
  117. bool bsp_ble_bind_state(uint8_t index, sm_bonding_info_t* bind_info)
  118. {
  119. sm_bonding_info_t* dev_bind_info = ble_get_bonding_info_for_index(index);
  120. memcpy(bind_info, dev_bind_info, sizeof(sm_bonding_info_t));
  121. return (0xff != bind_info->address_type);
  122. }