@@ -503,7 +503,7 @@ static ssize_t tl_sys_hci_cmd_resp(uint16_t opcode, const uint8_t *buf, size_t l
503
503
return tl_sys_wait_ack (ipcc_membuf_sys_cmd_buf , timeout_ms );
504
504
}
505
505
506
- static int tl_ble_wait_resp (void ) {
506
+ static size_t tl_ble_wait_resp (parse_hci_info_t * parse ) {
507
507
uint32_t t0 = mp_hal_ticks_ms ();
508
508
while (!LL_C2_IPCC_IsActiveFlag_CHx (IPCC , IPCC_CH_BLE )) {
509
509
if (mp_hal_ticks_ms () - t0 > BLE_ACK_TIMEOUT_MS ) {
@@ -513,16 +513,15 @@ static int tl_ble_wait_resp(void) {
513
513
}
514
514
515
515
// C2 set IPCC flag -- process the data, clear the flag, and re-enable IRQs.
516
- tl_check_msg (& ipcc_mem_ble_evt_queue , IPCC_CH_BLE , NULL );
517
- return 0 ;
516
+ return tl_check_msg (& ipcc_mem_ble_evt_queue , IPCC_CH_BLE , parse );
518
517
}
519
518
520
519
// Synchronously send a BLE command.
521
520
static void tl_ble_hci_cmd_resp (uint16_t opcode , const uint8_t * buf , size_t len ) {
522
521
// Poll for completion rather than wait for IRQ->scheduler.
523
522
LL_C1_IPCC_DisableReceiveChannel (IPCC , IPCC_CH_BLE );
524
523
tl_hci_cmd (ipcc_membuf_ble_cmd_buf , IPCC_CH_BLE , HCI_KIND_BT_CMD , opcode , buf , len );
525
- tl_ble_wait_resp ();
524
+ tl_ble_wait_resp (NULL );
526
525
}
527
526
528
527
/******************************************************************************/
@@ -797,4 +796,49 @@ static mp_obj_t rfcore_sys_hci(size_t n_args, const mp_obj_t *args) {
797
796
}
798
797
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (rfcore_sys_hci_obj , 3 , 4 , rfcore_sys_hci );
799
798
799
+ static void rfcore_ble_hci_response_to_buffer (void * env , const uint8_t * buf , size_t len ) {
800
+ DEBUG_printf ("rfcore_ble_hci_response_to_buffer len 0x%x\n" , len );
801
+ mp_obj_t * rsp = (mp_obj_t * )env ;
802
+ if (* rsp == mp_const_none ) {
803
+ * rsp = mp_obj_new_bytes (buf , len );
804
+ } else {
805
+ mp_buffer_info_t bufinfo ;;
806
+ mp_get_buffer_raise (* rsp , & bufinfo , MP_BUFFER_WRITE );
807
+ if (bufinfo .len < len ) {
808
+ mp_raise_OSError (- len );
809
+ }
810
+ memcpy (bufinfo .buf , buf , len );
811
+ }
812
+ }
813
+
814
+ static mp_obj_t rfcore_ble_hci (size_t n_args , const mp_obj_t * args ) {
815
+ if (ipcc_mem_dev_info_tab .fus .table_state == MAGIC_IPCC_MEM_INCORRECT ) {
816
+ mp_raise_OSError (MP_EINVAL );
817
+ }
818
+ mp_obj_t cmd = args [0 ];
819
+ mp_obj_t rsp = mp_const_none ;
820
+ bool return_len = false;
821
+ if (n_args == 2 ) {
822
+ rsp = args [1 ];
823
+ // response buffer passed in, so return rsp length.
824
+ return_len = true;
825
+ }
826
+
827
+ mp_buffer_info_t bufinfo = {0 };
828
+ mp_get_buffer_raise (cmd , & bufinfo , MP_BUFFER_READ );
829
+
830
+ // Poll for completion rather than wait for IRQ->scheduler. Is re-enabled in tl_check_msg.
831
+ LL_C1_IPCC_DisableReceiveChannel (IPCC , IPCC_CH_BLE );
832
+
833
+ rfcore_ble_hci_cmd (bufinfo .len , bufinfo .buf );
834
+
835
+ parse_hci_info_t parse = { rfcore_ble_hci_response_to_buffer , & rsp , false };
836
+ size_t ret_len = tl_ble_wait_resp (& parse );
837
+ if (return_len ) {
838
+ return MP_OBJ_NEW_SMALL_INT (ret_len );
839
+ }
840
+ return rsp ;
841
+ }
842
+ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (rfcore_ble_hci_obj , 1 , 2 , rfcore_ble_hci );
843
+
800
844
#endif // defined(STM32WB)
0 commit comments