controller.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600
  1. /******************************************************************************
  2. *
  3. * Copyright (C) 2014 Google, Inc.
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at:
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. *
  17. ******************************************************************************/
  18. #include <stdbool.h>
  19. #include "common/bt_target.h"
  20. #include "common/bt_trace.h"
  21. #include "device/bdaddr.h"
  22. #include "stack/bt_types.h"
  23. #include "device/controller.h"
  24. #include "device/event_mask.h"
  25. #include "stack/hcimsgs.h"
  26. #include "hci/hci_layer.h"
  27. #include "hci/hci_packet_factory.h"
  28. #include "hci/hci_packet_parser.h"
  29. #include "stack/btm_ble_api.h"
  30. #include "device/version.h"
  31. #include "osi/future.h"
  32. #include "config/stack_config.h"
  33. #if (BLE_50_FEATURE_SUPPORT == TRUE)
  34. const bt_event_mask_t BLE_EVENT_MASK = { "\x00\x00\x00\x00\x00\xff\xff\xff" };
  35. #else
  36. const bt_event_mask_t BLE_EVENT_MASK = { "\x00\x00\x00\x00\x00\x00\x06\x7f" };
  37. #endif
  38. #if (BLE_INCLUDED)
  39. const bt_event_mask_t CLASSIC_EVENT_MASK = { HCI_DUMO_EVENT_MASK_EXT };
  40. #else
  41. const bt_event_mask_t CLASSIC_EVENT_MASK = { HCI_LISBON_EVENT_MASK_EXT };
  42. #endif
  43. // TODO(zachoverflow): factor out into common module
  44. const uint8_t SCO_HOST_BUFFER_SIZE = 0xff;
  45. #define HCI_SUPPORTED_COMMANDS_ARRAY_SIZE 64
  46. #define MAX_FEATURES_CLASSIC_PAGE_COUNT 3
  47. #define BLE_SUPPORTED_STATES_SIZE 8
  48. #define BLE_SUPPORTED_FEATURES_SIZE 8
  49. #define BLE_EXT_ADV_DATA_LEN_MAX 1650
  50. typedef struct {
  51. const hci_t *hci;
  52. const hci_packet_factory_t *packet_factory;
  53. const hci_packet_parser_t *packet_parser;
  54. bt_version_t bt_version;
  55. bt_bdaddr_t address;
  56. uint8_t supported_commands[HCI_SUPPORTED_COMMANDS_ARRAY_SIZE];
  57. uint8_t last_features_classic_page_index;
  58. bt_device_features_t features_classic[MAX_FEATURES_CLASSIC_PAGE_COUNT];
  59. uint16_t acl_data_size_classic;
  60. uint16_t acl_data_size_ble;
  61. uint16_t acl_buffer_count_classic;
  62. uint8_t acl_buffer_count_ble;
  63. uint8_t sco_data_size;
  64. uint16_t sco_buffer_count;
  65. uint8_t ble_white_list_size;
  66. uint8_t ble_resolving_list_max_size;
  67. uint8_t ble_supported_states[BLE_SUPPORTED_STATES_SIZE];
  68. bt_device_features_t features_ble;
  69. uint16_t ble_suggested_default_data_length;
  70. uint16_t ble_suggested_default_data_txtime;
  71. bool readable;
  72. bool ble_supported;
  73. bool simple_pairing_supported;
  74. bool secure_connections_supported;
  75. #if (BLE_50_FEATURE_SUPPORT == TRUE)
  76. uint16_t ble_ext_adv_data_max_len;
  77. #endif //#if (BLE_50_FEATURE_SUPPORT == TRUE)
  78. } controller_local_param_t;
  79. #if BT_BLE_DYNAMIC_ENV_MEMORY == FALSE
  80. static controller_local_param_t controller_param;
  81. #else
  82. static controller_local_param_t *controller_param_ptr;
  83. #define controller_param (*controller_param_ptr)
  84. #endif
  85. #define AWAIT_COMMAND(command) future_await(controller_param.hci->transmit_command_futured(command))
  86. // Module lifecycle functions
  87. static void start_up(void)
  88. {
  89. BT_HDR *response;
  90. // Send the initial reset command
  91. response = AWAIT_COMMAND(controller_param.packet_factory->make_reset());
  92. controller_param.packet_parser->parse_generic_command_complete(response);
  93. #if (CLASSIC_BT_INCLUDED)
  94. // Request the classic buffer size next
  95. response = AWAIT_COMMAND(controller_param.packet_factory->make_read_buffer_size());
  96. controller_param.packet_parser->parse_read_buffer_size_response(
  97. response, &controller_param.acl_data_size_classic, &controller_param.acl_buffer_count_classic,
  98. &controller_param.sco_data_size, &controller_param.sco_buffer_count);
  99. #endif
  100. #if (C2H_FLOW_CONTROL_INCLUDED == TRUE)
  101. // Enable controller to host flow control
  102. response = AWAIT_COMMAND(controller_param.packet_factory->make_set_c2h_flow_control(HCI_HOST_FLOW_CTRL_ACL_ON));
  103. controller_param.packet_parser->parse_generic_command_complete(response);
  104. #endif ///C2H_FLOW_CONTROL_INCLUDED == TRUE
  105. #if (BLE_ADV_REPORT_FLOW_CONTROL == TRUE)
  106. // Enable adv flow control
  107. response = AWAIT_COMMAND(controller_param.packet_factory->make_set_adv_report_flow_control(HCI_HOST_FLOW_CTRL_ADV_REPORT_ON, (uint16_t)BLE_ADV_REPORT_FLOW_CONTROL_NUM, (uint16_t)BLE_ADV_REPORT_DISCARD_THRSHOLD));
  108. controller_param.packet_parser->parse_generic_command_complete(response);
  109. #endif
  110. // Tell the controller about our buffer sizes and buffer counts next
  111. // TODO(zachoverflow): factor this out. eww l2cap contamination. And why just a hardcoded 10?
  112. response = AWAIT_COMMAND(
  113. controller_param.packet_factory->make_host_buffer_size(
  114. L2CAP_MTU_SIZE,
  115. SCO_HOST_BUFFER_SIZE,
  116. L2CAP_HOST_FC_ACL_BUFS,
  117. 10
  118. )
  119. );
  120. controller_param.packet_parser->parse_generic_command_complete(response);
  121. // Read the local version info off the controller next, including
  122. // information such as manufacturer and supported HCI version
  123. response = AWAIT_COMMAND(controller_param.packet_factory->make_read_local_version_info());
  124. controller_param.packet_parser->parse_read_local_version_info_response(response, &controller_param.bt_version);
  125. // Read the bluetooth address off the controller next
  126. response = AWAIT_COMMAND(controller_param.packet_factory->make_read_bd_addr());
  127. controller_param.packet_parser->parse_read_bd_addr_response(response, &controller_param.address);
  128. // Request the controller's supported commands next
  129. response = AWAIT_COMMAND(controller_param.packet_factory->make_read_local_supported_commands());
  130. controller_param.packet_parser->parse_read_local_supported_commands_response(
  131. response,
  132. controller_param.supported_commands,
  133. HCI_SUPPORTED_COMMANDS_ARRAY_SIZE
  134. );
  135. #if (CLASSIC_BT_INCLUDED)
  136. // Read page 0 of the controller features next
  137. uint8_t page_number = 0;
  138. response = AWAIT_COMMAND(controller_param.packet_factory->make_read_local_extended_features(page_number));
  139. controller_param.packet_parser->parse_read_local_extended_features_response(
  140. response,
  141. &page_number,
  142. &controller_param.last_features_classic_page_index,
  143. controller_param.features_classic,
  144. MAX_FEATURES_CLASSIC_PAGE_COUNT
  145. );
  146. assert(page_number == 0);
  147. page_number++;
  148. #endif
  149. // Inform the controller what page 0 features we support, based on what
  150. // it told us it supports. We need to do this first before we request the
  151. // next page, because the controller's response for page 1 may be
  152. // dependent on what we configure from page 0 and host SSP configuration
  153. controller_param.simple_pairing_supported = HCI_SIMPLE_PAIRING_SUPPORTED(
  154. controller_param.features_classic[0].as_array) &&
  155. (bluedriod_config_get()->get_ssp_enabled());
  156. if (controller_param.simple_pairing_supported) {
  157. response = AWAIT_COMMAND(controller_param.packet_factory->make_write_simple_pairing_mode(HCI_SP_MODE_ENABLED));
  158. controller_param.packet_parser->parse_generic_command_complete(response);
  159. }
  160. #if (BLE_INCLUDED == TRUE)
  161. if (HCI_LE_SPT_SUPPORTED(controller_param.features_classic[0].as_array)) {
  162. uint8_t simultaneous_le_host = HCI_SIMUL_LE_BREDR_SUPPORTED(controller_param.features_classic[0].as_array) ? BTM_BLE_SIMULTANEOUS_HOST : 0;
  163. response = AWAIT_COMMAND(
  164. controller_param.packet_factory->make_ble_write_host_support(BTM_BLE_HOST_SUPPORT, simultaneous_le_host)
  165. );
  166. controller_param.packet_parser->parse_generic_command_complete(response);
  167. }
  168. #endif
  169. #if (CLASSIC_BT_INCLUDED)
  170. // Done telling the controller about what page 0 features we support
  171. // Request the remaining feature pages
  172. while (page_number <= controller_param.last_features_classic_page_index &&
  173. page_number < MAX_FEATURES_CLASSIC_PAGE_COUNT) {
  174. response = AWAIT_COMMAND(controller_param.packet_factory->make_read_local_extended_features(page_number));
  175. controller_param.packet_parser->parse_read_local_extended_features_response(
  176. response,
  177. &page_number,
  178. &controller_param.last_features_classic_page_index,
  179. controller_param.features_classic,
  180. MAX_FEATURES_CLASSIC_PAGE_COUNT
  181. );
  182. page_number++;
  183. }
  184. #endif
  185. #if (SC_MODE_INCLUDED == TRUE)
  186. controller_param.secure_connections_supported = HCI_SC_CTRLR_SUPPORTED(controller_param.features_classic[2].as_array);
  187. if (controller_param.secure_connections_supported) {
  188. response = AWAIT_COMMAND(controller_param.packet_factory->make_write_secure_connections_host_support(HCI_SC_MODE_ENABLED));
  189. controller_param.packet_parser->parse_generic_command_complete(response);
  190. }
  191. #endif
  192. #if (BLE_INCLUDED == TRUE)
  193. #if (CLASSIC_BT_INCLUDED)
  194. controller_param.ble_supported = controller_param.last_features_classic_page_index >= 1 && HCI_LE_HOST_SUPPORTED(controller_param.features_classic[1].as_array);
  195. #else
  196. controller_param.ble_supported = true;
  197. #endif
  198. if (controller_param.ble_supported) {
  199. // Request the ble white list size next
  200. response = AWAIT_COMMAND(controller_param.packet_factory->make_ble_read_white_list_size());
  201. controller_param.packet_parser->parse_ble_read_white_list_size_response(response, &controller_param.ble_white_list_size);
  202. // Request the ble buffer size next
  203. response = AWAIT_COMMAND(controller_param.packet_factory->make_ble_read_buffer_size());
  204. controller_param.packet_parser->parse_ble_read_buffer_size_response(
  205. response,
  206. &controller_param.acl_data_size_ble,
  207. &controller_param.acl_buffer_count_ble
  208. );
  209. // Response of 0 indicates ble has the same buffer size as classic
  210. if (controller_param.acl_data_size_ble == 0) {
  211. controller_param.acl_data_size_ble = controller_param.acl_data_size_classic;
  212. }
  213. // Request the ble supported states next
  214. response = AWAIT_COMMAND(controller_param.packet_factory->make_ble_read_supported_states());
  215. controller_param.packet_parser->parse_ble_read_supported_states_response(
  216. response,
  217. controller_param.ble_supported_states,
  218. sizeof(controller_param.ble_supported_states)
  219. );
  220. // Request the ble supported features next
  221. response = AWAIT_COMMAND(controller_param.packet_factory->make_ble_read_local_supported_features());
  222. controller_param.packet_parser->parse_ble_read_local_supported_features_response(
  223. response,
  224. &controller_param.features_ble
  225. );
  226. if (HCI_LE_ENHANCED_PRIVACY_SUPPORTED(controller_param.features_ble.as_array)) {
  227. response = AWAIT_COMMAND(controller_param.packet_factory->make_ble_read_resolving_list_size());
  228. controller_param.packet_parser->parse_ble_read_resolving_list_size_response(
  229. response,
  230. &controller_param.ble_resolving_list_max_size);
  231. }
  232. #if BLE_50_FEATURE_SUPPORT == TRUE
  233. controller_param.ble_ext_adv_data_max_len = BLE_EXT_ADV_DATA_LEN_MAX;
  234. #endif //#if (BLE_50_FEATURE_SUPPORT == TRUE)
  235. #if (BLE_50_FEATURE_SUPPORT == TRUE && BLE_42_FEATURE_SUPPORT == FALSE)
  236. if (HCI_LE_ENHANCED_PRIVACY_SUPPORTED(controller_param.features_ble.as_array)) {
  237. response = AWAIT_COMMAND(controller_param.packet_factory->make_read_max_adv_data_len());
  238. controller_param.packet_parser->parse_ble_read_adv_max_len_response(
  239. response,
  240. &controller_param.ble_ext_adv_data_max_len);
  241. }
  242. #endif // (BLE_50_FEATURE_SUPPORT == TRUE && BLE_42_FEATURE_SUPPORT == FALSE)
  243. if (HCI_LE_DATA_LEN_EXT_SUPPORTED(controller_param.features_ble.as_array)) {
  244. /* set default tx data length to MAX 251 */
  245. response = AWAIT_COMMAND(controller_param.packet_factory->make_ble_write_suggested_default_data_length(BTM_BLE_DATA_SIZE_MAX, BTM_BLE_DATA_TX_TIME_MAX));
  246. controller_param.packet_parser->parse_generic_command_complete(response);
  247. response = AWAIT_COMMAND(controller_param.packet_factory->make_ble_read_suggested_default_data_length());
  248. controller_param.packet_parser->parse_ble_read_suggested_default_data_length_response(
  249. response,
  250. &controller_param.ble_suggested_default_data_length,
  251. &controller_param.ble_suggested_default_data_txtime);
  252. }
  253. // Set the ble event mask next
  254. response = AWAIT_COMMAND(controller_param.packet_factory->make_ble_set_event_mask(&BLE_EVENT_MASK));
  255. controller_param.packet_parser->parse_generic_command_complete(response);
  256. }
  257. #endif
  258. response = AWAIT_COMMAND(controller_param.packet_factory->make_set_event_mask(&CLASSIC_EVENT_MASK));
  259. controller_param.packet_parser->parse_generic_command_complete(response);
  260. #if (BTM_SCO_HCI_INCLUDED == TRUE)
  261. response = AWAIT_COMMAND(controller_param.packet_factory->make_write_sync_flow_control_enable(1));
  262. controller_param.packet_parser->parse_generic_command_complete(response);
  263. response = AWAIT_COMMAND(controller_param.packet_factory->make_write_default_erroneous_data_report(1));
  264. controller_param.packet_parser->parse_generic_command_complete(response);
  265. #endif
  266. controller_param.readable = true;
  267. // return future_new_immediate(FUTURE_SUCCESS);
  268. return;
  269. }
  270. static void shut_down(void)
  271. {
  272. controller_param.readable = false;
  273. }
  274. static bool get_is_ready(void)
  275. {
  276. return controller_param.readable;
  277. }
  278. static const bt_bdaddr_t *get_address(void)
  279. {
  280. assert(controller_param.readable);
  281. return &controller_param.address;
  282. }
  283. static const bt_version_t *get_bt_version(void)
  284. {
  285. assert(controller_param.readable);
  286. return &controller_param.bt_version;
  287. }
  288. // TODO(zachoverflow): hide inside, move decoder inside too
  289. static const bt_device_features_t *get_features_classic(int index)
  290. {
  291. assert(controller_param.readable);
  292. assert(index < MAX_FEATURES_CLASSIC_PAGE_COUNT);
  293. return &controller_param.features_classic[index];
  294. }
  295. static uint8_t get_last_features_classic_index(void)
  296. {
  297. assert(controller_param.readable);
  298. return controller_param.last_features_classic_page_index;
  299. }
  300. static const bt_device_features_t *get_features_ble(void)
  301. {
  302. assert(controller_param.readable);
  303. assert(controller_param.ble_supported);
  304. return &controller_param.features_ble;
  305. }
  306. static const uint8_t *get_ble_supported_states(void)
  307. {
  308. assert(controller_param.readable);
  309. assert(controller_param.ble_supported);
  310. return controller_param.ble_supported_states;
  311. }
  312. static bool supports_simple_pairing(void)
  313. {
  314. assert(controller_param.readable);
  315. return controller_param.simple_pairing_supported;
  316. }
  317. static bool supports_secure_connections(void)
  318. {
  319. assert(controller_param.readable);
  320. return controller_param.secure_connections_supported;
  321. }
  322. static bool supports_simultaneous_le_bredr(void)
  323. {
  324. assert(controller_param.readable);
  325. return HCI_SIMUL_LE_BREDR_SUPPORTED(controller_param.features_classic[0].as_array);
  326. }
  327. static bool supports_reading_remote_extended_features(void)
  328. {
  329. assert(controller_param.readable);
  330. return HCI_READ_REMOTE_EXT_FEATURES_SUPPORTED(controller_param.supported_commands);
  331. }
  332. static bool supports_interlaced_inquiry_scan(void)
  333. {
  334. assert(controller_param.readable);
  335. return HCI_LMP_INTERLACED_INQ_SCAN_SUPPORTED(controller_param.features_classic[0].as_array);
  336. }
  337. static bool supports_rssi_with_inquiry_results(void)
  338. {
  339. assert(controller_param.readable);
  340. return HCI_LMP_INQ_RSSI_SUPPORTED(controller_param.features_classic[0].as_array);
  341. }
  342. static bool supports_extended_inquiry_response(void)
  343. {
  344. assert(controller_param.readable);
  345. return HCI_EXT_INQ_RSP_SUPPORTED(controller_param.features_classic[0].as_array);
  346. }
  347. static bool supports_master_slave_role_switch(void)
  348. {
  349. assert(controller_param.readable);
  350. return HCI_SWITCH_SUPPORTED(controller_param.features_classic[0].as_array);
  351. }
  352. static bool supports_ble(void)
  353. {
  354. assert(controller_param.readable);
  355. return controller_param.ble_supported;
  356. }
  357. static bool supports_ble_privacy(void)
  358. {
  359. assert(controller_param.readable);
  360. assert(controller_param.ble_supported);
  361. return HCI_LE_ENHANCED_PRIVACY_SUPPORTED(controller_param.features_ble.as_array);
  362. }
  363. static bool supports_ble_packet_extension(void)
  364. {
  365. assert(controller_param.readable);
  366. assert(controller_param.ble_supported);
  367. return HCI_LE_DATA_LEN_EXT_SUPPORTED(controller_param.features_ble.as_array);
  368. }
  369. static bool supports_ble_connection_parameters_request(void)
  370. {
  371. assert(controller_param.readable);
  372. assert(controller_param.ble_supported);
  373. return HCI_LE_CONN_PARAM_REQ_SUPPORTED(controller_param.features_ble.as_array);
  374. }
  375. static uint16_t get_acl_data_size_classic(void)
  376. {
  377. assert(controller_param.readable);
  378. return controller_param.acl_data_size_classic;
  379. }
  380. static uint16_t get_acl_data_size_ble(void)
  381. {
  382. assert(controller_param.readable);
  383. assert(controller_param.ble_supported);
  384. return controller_param.acl_data_size_ble;
  385. }
  386. static uint16_t get_acl_packet_size_classic(void)
  387. {
  388. assert(controller_param.readable);
  389. return controller_param.acl_data_size_classic + HCI_DATA_PREAMBLE_SIZE;
  390. }
  391. static uint16_t get_acl_packet_size_ble(void)
  392. {
  393. assert(controller_param.readable);
  394. return controller_param.acl_data_size_ble + HCI_DATA_PREAMBLE_SIZE;
  395. }
  396. static uint16_t get_ble_suggested_default_data_length(void)
  397. {
  398. assert(controller_param.readable);
  399. assert(controller_param.ble_supported);
  400. return controller_param.ble_suggested_default_data_length;
  401. }
  402. static uint16_t get_ble_suggested_default_data_txtime(void)
  403. {
  404. assert(controller_param.readable);
  405. assert(controller_param.ble_supported);
  406. return controller_param.ble_suggested_default_data_txtime;
  407. }
  408. static uint16_t get_acl_buffer_count_classic(void)
  409. {
  410. assert(controller_param.readable);
  411. return controller_param.acl_buffer_count_classic;
  412. }
  413. static uint8_t get_acl_buffer_count_ble(void)
  414. {
  415. assert(controller_param.readable);
  416. assert(controller_param.ble_supported);
  417. return controller_param.acl_buffer_count_ble;
  418. }
  419. static uint8_t get_ble_white_list_size(void)
  420. {
  421. assert(controller_param.readable);
  422. assert(controller_param.ble_supported);
  423. return controller_param.ble_white_list_size;
  424. }
  425. static uint8_t get_ble_resolving_list_max_size(void)
  426. {
  427. assert(controller_param.readable);
  428. assert(controller_param.ble_supported);
  429. return controller_param.ble_resolving_list_max_size;
  430. }
  431. static void set_ble_resolving_list_max_size(int resolving_list_max_size)
  432. {
  433. assert(controller_param.readable);
  434. assert(controller_param.ble_supported);
  435. controller_param.ble_resolving_list_max_size = resolving_list_max_size;
  436. }
  437. #if (BLE_50_FEATURE_SUPPORT == TRUE)
  438. static uint16_t ble_get_ext_adv_data_max_len(void)
  439. {
  440. assert(controller_param.readable);
  441. assert(controller_param.ble_supported);
  442. return controller_param.ble_ext_adv_data_max_len;
  443. }
  444. #endif // #if (BLE_50_FEATURE_SUPPORT == TRUE)
  445. #if (BTM_SCO_HCI_INCLUDED == TRUE)
  446. static uint8_t get_sco_data_size(void)
  447. {
  448. assert(controller_param.readable);
  449. return controller_param.sco_data_size;
  450. }
  451. static uint8_t get_sco_buffer_count(void)
  452. {
  453. assert(controller_param.readable);
  454. return controller_param.sco_buffer_count;
  455. }
  456. #endif /* (BTM_SCO_HCI_INCLUDED == TRUE) */
  457. static const controller_t interface = {
  458. start_up,
  459. shut_down,
  460. get_is_ready,
  461. get_address,
  462. get_bt_version,
  463. get_features_classic,
  464. get_last_features_classic_index,
  465. get_features_ble,
  466. get_ble_supported_states,
  467. supports_simple_pairing,
  468. supports_secure_connections,
  469. supports_simultaneous_le_bredr,
  470. supports_reading_remote_extended_features,
  471. supports_interlaced_inquiry_scan,
  472. supports_rssi_with_inquiry_results,
  473. supports_extended_inquiry_response,
  474. supports_master_slave_role_switch,
  475. supports_ble,
  476. supports_ble_packet_extension,
  477. supports_ble_connection_parameters_request,
  478. supports_ble_privacy,
  479. get_acl_data_size_classic,
  480. get_acl_data_size_ble,
  481. get_acl_packet_size_classic,
  482. get_acl_packet_size_ble,
  483. get_ble_suggested_default_data_length,
  484. get_ble_suggested_default_data_txtime,
  485. get_acl_buffer_count_classic,
  486. get_acl_buffer_count_ble,
  487. get_ble_white_list_size,
  488. get_ble_resolving_list_max_size,
  489. set_ble_resolving_list_max_size,
  490. #if (BLE_50_FEATURE_SUPPORT == TRUE)
  491. ble_get_ext_adv_data_max_len,
  492. #endif // #if (BLE_50_FEATURE_SUPPORT == TRUE)
  493. #if (BTM_SCO_HCI_INCLUDED == TRUE)
  494. get_sco_data_size,
  495. get_sco_buffer_count,
  496. #endif /* (BTM_SCO_HCI_INCLUDED == TRUE) */
  497. };
  498. const controller_t *controller_get_interface(void)
  499. {
  500. static bool loaded = false;
  501. if (!loaded) {
  502. loaded = true;
  503. #if (BT_BLE_DYNAMIC_ENV_MEMORY == TRUE)
  504. controller_param_ptr = (controller_local_param_t *)osi_calloc(sizeof(controller_local_param_t));
  505. assert(controller_param_ptr);
  506. #endif
  507. controller_param.hci = hci_layer_get_interface();
  508. controller_param.packet_factory = hci_packet_factory_get_interface();
  509. controller_param.packet_parser = hci_packet_parser_get_interface();
  510. }
  511. return &interface;
  512. }