@@ -215,7 +215,7 @@ STATIC void process_evt_pkt(size_t pkt_len, uint8_t pkt[])
215215 //FIX
216216 // ATT.removeConnection(disconn_complete->handle, disconn_complete->reason);
217217 // L2CAPSignaling.removeConnection(disconn_complete->handle, disconn_complete->reason);
218- hci_le_set_advertise_enable (0x01 );
218+ hci_le_set_advertising_enable (0x01 );
219219 break ;
220220 }
221221
@@ -365,7 +365,7 @@ hci_result_t hci_poll_for_incoming_pkt(void) {
365365 // Stop incoming data while processing packet.
366366 common_hal_digitalio_digitalinout_set_value (adapter -> rts_digitalinout , true);
367367 size_t pkt_len = rx_idx ;
368- // Reset for next pack
368+ // Reset for next packet.
369369 rx_idx = 0 ;
370370
371371 switch (rx_buffer [0 ]) {
@@ -395,7 +395,6 @@ hci_result_t hci_poll_for_incoming_pkt(void) {
395395}
396396
397397
398- // Returns
399398STATIC hci_result_t write_pkt (uint8_t * buffer , size_t len ) {
400399 // Wait for CTS to go low before writing to HCI adapter.
401400 uint64_t start = supervisor_ticks_ms64 ();
@@ -555,7 +554,7 @@ hci_result_t hci_set_evt_mask(uint64_t event_mask) {
555554 return send_command (BT_HCI_OP_SET_EVENT_MASK , sizeof (event_mask ), & event_mask );
556555}
557556
558- hci_result_t hci_read_le_buffer_size (uint16_t * le_max_len , uint8_t * le_max_num ) {
557+ hci_result_t hci_le_read_buffer_size (uint16_t * le_max_len , uint8_t * le_max_num ) {
559558 int result = send_command (BT_HCI_OP_LE_READ_BUFFER_SIZE , 0 , NULL );
560559 if (result == HCI_OK ) {
561560 struct bt_hci_rp_le_read_buffer_size * response =
@@ -567,6 +566,20 @@ hci_result_t hci_read_le_buffer_size(uint16_t *le_max_len, uint8_t *le_max_num)
567566 return result ;
568567}
569568
569+ hci_result_t hci_read_buffer_size (uint16_t * acl_max_len , uint8_t * sco_max_len , uint16_t * acl_max_num , uint16_t * sco_max_num ) {
570+ int result = send_command (BT_HCI_OP_READ_BUFFER_SIZE , 0 , NULL );
571+ if (result == HCI_OK ) {
572+ struct bt_hci_rp_read_buffer_size * response =
573+ (struct bt_hci_rp_read_buffer_size * ) cmd_response_data ;
574+ * acl_max_len = response -> acl_max_len ;
575+ * sco_max_len = response -> sco_max_len ;
576+ * acl_max_num = response -> acl_max_num ;
577+ * sco_max_num = response -> sco_max_num ;
578+ }
579+
580+ return result ;
581+ }
582+
570583hci_result_t hci_le_set_random_address (uint8_t addr [6 ]) {
571584 return send_command (BT_HCI_OP_LE_SET_RANDOM_ADDRESS , 6 , addr );
572585}
@@ -587,7 +600,30 @@ hci_result_t hci_le_set_advertising_parameters(uint16_t min_interval, uint16_t m
587600 return send_command (BT_HCI_OP_LE_SET_ADV_PARAM , sizeof (params ), & params );
588601}
589602
590- hci_result_t hci_le_read_maximum_advertising_data_length (int * max_adv_data_len ) {
603+ hci_result_t hci_le_set_extended_advertising_parameters (uint8_t handle , uint16_t props , uint32_t prim_min_interval , uint32_t prim_max_interval , uint8_t prim_channel_map , uint8_t own_addr_type , bt_addr_le_t * peer_addr , uint8_t filter_policy , int8_t tx_power , uint8_t prim_adv_phy , uint8_t sec_adv_max_skip , uint8_t sec_adv_phy , uint8_t sid , uint8_t scan_req_notify_enable ) {
604+ struct bt_hci_cp_le_set_ext_adv_param params = {
605+ .handle = handle ,
606+ .props = props ,
607+ // .prim_min_interval and .prim_max_interval set below
608+ .prim_channel_map = prim_channel_map ,
609+ .own_addr_type = own_addr_type ,
610+ // .peer_addr set below.
611+ .tx_power = tx_power ,
612+ .sec_adv_max_skip = sec_adv_max_skip ,
613+ .sec_adv_phy = sec_adv_phy ,
614+ .sid = sid ,
615+ .scan_req_notify_enable = scan_req_notify_enable ,
616+ };
617+ // Assumes little-endian.
618+ memcpy (params .prim_min_interval , (void * ) & prim_min_interval ,
619+ sizeof_field (struct bt_hci_cp_le_set_ext_adv_param , prim_min_interval ));
620+ memcpy (params .prim_max_interval , (void * ) & prim_max_interval ,
621+ sizeof_field (struct bt_hci_cp_le_set_ext_adv_param , prim_max_interval ));
622+ memcpy (params .peer_addr .a .val , peer_addr -> a .val , sizeof_field (bt_addr_le_t , a .val ));
623+ return send_command (BT_HCI_OP_LE_SET_EXT_ADV_PARAM , sizeof (params ), & params );
624+ }
625+
626+ hci_result_t hci_le_read_maximum_advertising_data_length (uint16_t * max_adv_data_len ) {
591627 int result = send_command (BT_HCI_OP_LE_READ_MAX_ADV_DATA_LEN , 0 , NULL );
592628 if (result == HCI_OK ) {
593629 struct bt_hci_rp_le_read_max_adv_data_len * response =
@@ -625,10 +661,25 @@ hci_result_t hci_le_set_scan_response_data(uint8_t len, uint8_t data[]) {
625661 return send_command (BT_HCI_OP_LE_SET_SCAN_RSP_DATA , sizeof (params ), & params );
626662}
627663
628- hci_result_t hci_le_set_advertise_enable (uint8_t enable ) {
664+ hci_result_t hci_le_set_advertising_enable (uint8_t enable ) {
629665 return send_command (BT_HCI_OP_LE_SET_ADV_ENABLE , sizeof (enable ), & enable );
630666}
631667
668+ hci_result_t hci_le_set_extended_advertising_enable (uint8_t enable , uint8_t set_num , uint8_t handle [], uint16_t duration [], uint8_t max_ext_adv_evts []) {
669+ uint8_t params [sizeof (struct bt_hci_cp_le_set_ext_adv_enable ) +
670+ set_num * (sizeof (struct bt_hci_ext_adv_set ))];
671+ struct bt_hci_cp_le_set_ext_adv_enable * params_p = (struct bt_hci_cp_le_set_ext_adv_enable * ) & params ;
672+ params_p -> enable = enable ;
673+ params_p -> set_num = set_num ;
674+ for (size_t i = 0 ; i < set_num ; i ++ ) {
675+ params_p -> s [i ].handle = handle [i ];
676+ params_p -> s [i ].duration = duration [i ];
677+ params_p -> s [i ].max_ext_adv_evts = max_ext_adv_evts [i ];
678+ }
679+
680+ return send_command (BT_HCI_OP_LE_SET_EXT_ADV_ENABLE , sizeof (params ), & params );
681+ }
682+
632683hci_result_t hci_le_set_scan_parameters (uint8_t scan_type , uint16_t interval , uint16_t window , uint8_t addr_type , uint8_t filter_policy ) {
633684 struct bt_hci_cp_le_set_scan_param params = {
634685 .scan_type = scan_type ,
0 commit comments