@@ -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 ssize_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
- STATIC void tl_ble_hci_cmd_resp (uint16_t opcode , const uint8_t * buf , size_t len ) {
520
+ STATIC ssize_t 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
+ return tl_ble_wait_resp (NULL );
526
525
}
527
526
528
527
/******************************************************************************/
@@ -762,4 +761,40 @@ STATIC mp_obj_t rfcore_sys_hci(size_t n_args, const mp_obj_t *args) {
762
761
}
763
762
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (rfcore_sys_hci_obj , 3 , 4 , rfcore_sys_hci );
764
763
764
+ STATIC void rfcore_ble_hci_response_to_buffer (void * env , const uint8_t * buf , size_t len ) {
765
+ // mp_buffer_info_t *respbufinfo = (mp_buffer_info_t *)env;
766
+ DEBUG_printf ("rfcore_ble_hci_response_to_buffer len 0x%x\n" , len );
767
+ mp_obj_t * rsp = (mp_obj_t * )env ;
768
+ * rsp = mp_obj_new_bytes (buf , len );
769
+ }
770
+
771
+ STATIC mp_obj_t rfcore_ble_hci (size_t n_args , const mp_obj_t * args ) {
772
+ if (ipcc_mem_dev_info_tab .fus .table_state == MAGIC_IPCC_MEM_INCORRECT ) {
773
+ mp_raise_OSError (MP_EINVAL );
774
+ }
775
+ mp_buffer_info_t bufinfo = {0 };
776
+ // Can accept either just a raw buffer to send, or (ogf, ocf, buffer, <timeout>) to assemble and send.
777
+ if (mp_get_buffer (args [0 ], & bufinfo , MP_BUFFER_READ )) {
778
+ // Poll for completion rather than wait for IRQ->scheduler.
779
+ LL_C1_IPCC_DisableReceiveChannel (IPCC , IPCC_CH_BLE );
780
+
781
+ rfcore_ble_hci_cmd (bufinfo .len , bufinfo .buf );
782
+
783
+ mp_obj_t rsp = mp_const_none ;
784
+ parse_hci_info_t parse = { rfcore_ble_hci_response_to_buffer , & rsp , false };
785
+ tl_ble_wait_resp (& parse );
786
+ return rsp ;
787
+ } else {
788
+ mp_int_t ogf = mp_obj_get_int (args [0 ]);
789
+ mp_int_t ocf = mp_obj_get_int (args [1 ]);
790
+ mp_get_buffer_raise (args [2 ], & bufinfo , MP_BUFFER_READ );
791
+ size_t len = tl_ble_hci_cmd_resp (HCI_OPCODE (ogf , ocf ), bufinfo .buf , bufinfo .len );
792
+ if (len < 0 ) {
793
+ mp_raise_OSError (- len );
794
+ }
795
+ return mp_obj_new_bytes (ipcc_membuf_ble_cmd_buf , len );
796
+ }
797
+ }
798
+ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (rfcore_ble_hci_obj , 1 , 4 , rfcore_ble_hci );
799
+
765
800
#endif // defined(STM32WB)
0 commit comments