115115} while(0)
116116
117117#define OSI_FUNCS_TIME_BLOCKING 0xffffffff
118- #define OSI_VERSION 0x00010008
118+ #define OSI_VERSION 0x00010009
119119#define OSI_MAGIC_VALUE 0xFADEBEAD
120120
121121/* Types definition
@@ -142,15 +142,24 @@ typedef struct {
142142
143143typedef void (* osi_intr_handler )(void );
144144
145+ typedef struct {
146+ int source ; /*!< ISR source */
147+ int flags ; /*!< ISR alloc flag */
148+ void (* fn )(void * ); /*!< ISR function */
149+ void * arg ; /*!< ISR function args*/
150+ intr_handle_t * handle ; /*!< ISR handle */
151+ esp_err_t ret ;
152+ } btdm_isr_alloc_t ;
153+
145154/* OSI function */
146155struct osi_funcs_t {
147156 uint32_t _magic ;
148157 uint32_t _version ;
149- void (* _interrupt_set )(int cpu_no , int intr_source , int interrupt_no , int interrpt_prio );
150- void (* _interrupt_clear )( int interrupt_source , int interrupt_no );
151- void (* _interrupt_handler_set )(int interrupt_no , intr_handler_t fn , void * arg );
152- void (* _interrupt_disable )(void );
153- void (* _interrupt_restore )(void );
158+ int (* _interrupt_alloc )(int cpu_id , int source , intr_handler_t handler , void * arg , void * * ret_handle );
159+ int (* _interrupt_free )( void * handle );
160+ void (* _interrupt_handler_set_rsv )(int interrupt_no , intr_handler_t fn , void * arg );
161+ void (* _global_intr_disable )(void );
162+ void (* _global_intr_restore )(void );
154163 void (* _task_yield )(void );
155164 void (* _task_yield_from_isr )(void );
156165 void * (* _semphr_create )(uint32_t max , uint32_t init );
@@ -195,8 +204,8 @@ struct osi_funcs_t {
195204 uint32_t (* _coex_schm_interval_get )(void );
196205 uint8_t (* _coex_schm_curr_period_get )(void );
197206 void * (* _coex_schm_curr_phase_get )(void );
198- void (* _interrupt_on )( int intr_num );
199- void (* _interrupt_off )( int intr_num );
207+ int (* _interrupt_enable )( void * handle );
208+ int (* _interrupt_disable )( void * handle );
200209 void (* _esp_hw_power_down )(void );
201210 void (* _esp_hw_power_up )(void );
202211 void (* _ets_backup_dma_copy )(uint32_t reg , uint32_t mem_addr , uint32_t num , bool to_rem );
@@ -277,11 +286,10 @@ extern uint32_t _bt_controller_data_end;
277286/* Local Function Declare
278287 *********************************************************************
279288 */
280- static void interrupt_set_wrapper (int cpu_no , int intr_source , int intr_num , int intr_prio );
281- static void interrupt_clear_wrapper (int intr_source , int intr_num );
282- static void interrupt_handler_set_wrapper (int n , intr_handler_t fn , void * arg );
283- static void interrupt_disable (void );
284- static void interrupt_restore (void );
289+ static int interrupt_alloc_wrapper (int cpu_id , int source , intr_handler_t handler , void * arg , void * * ret_handle );
290+ static int interrupt_free_wrapper (void * handle );
291+ static void global_interrupt_disable (void );
292+ static void global_interrupt_restore (void );
285293static void task_yield_from_isr (void );
286294static void * semphr_create_wrapper (uint32_t max , uint32_t init );
287295static void semphr_delete_wrapper (void * semphr );
@@ -319,8 +327,8 @@ static void coex_schm_status_bit_clear_wrapper(uint32_t type, uint32_t status);
319327static uint32_t coex_schm_interval_get_wrapper (void );
320328static uint8_t coex_schm_curr_period_get_wrapper (void );
321329static void * coex_schm_curr_phase_get_wrapper (void );
322- static void interrupt_on_wrapper ( int intr_num );
323- static void interrupt_off_wrapper ( int intr_num );
330+ static int interrupt_enable_wrapper ( void * handle );
331+ static int interrupt_disable_wrapper ( void * handle );
324332static void btdm_hw_mac_power_up_wrapper (void );
325333static void btdm_hw_mac_power_down_wrapper (void );
326334static void btdm_backup_dma_copy_wrapper (uint32_t reg , uint32_t mem_addr , uint32_t num , bool to_mem );
@@ -341,11 +349,11 @@ static void bt_controller_deinit_internal(void);
341349static const struct osi_funcs_t osi_funcs_ro = {
342350 ._magic = OSI_MAGIC_VALUE ,
343351 ._version = OSI_VERSION ,
344- ._interrupt_set = interrupt_set_wrapper ,
345- ._interrupt_clear = interrupt_clear_wrapper ,
346- ._interrupt_handler_set = interrupt_handler_set_wrapper ,
347- ._interrupt_disable = interrupt_disable ,
348- ._interrupt_restore = interrupt_restore ,
352+ ._interrupt_alloc = interrupt_alloc_wrapper ,
353+ ._interrupt_free = interrupt_free_wrapper ,
354+ ._interrupt_handler_set_rsv = NULL ,
355+ ._global_intr_disable = global_interrupt_disable ,
356+ ._global_intr_restore = global_interrupt_restore ,
349357 ._task_yield = vPortYield ,
350358 ._task_yield_from_isr = task_yield_from_isr ,
351359 ._semphr_create = semphr_create_wrapper ,
@@ -390,8 +398,8 @@ static const struct osi_funcs_t osi_funcs_ro = {
390398 ._coex_schm_interval_get = coex_schm_interval_get_wrapper ,
391399 ._coex_schm_curr_period_get = coex_schm_curr_period_get_wrapper ,
392400 ._coex_schm_curr_phase_get = coex_schm_curr_phase_get_wrapper ,
393- ._interrupt_on = interrupt_on_wrapper ,
394- ._interrupt_off = interrupt_off_wrapper ,
401+ ._interrupt_enable = interrupt_enable_wrapper ,
402+ ._interrupt_disable = interrupt_disable_wrapper ,
395403 ._esp_hw_power_down = btdm_hw_mac_power_down_wrapper ,
396404 ._esp_hw_power_up = btdm_hw_mac_power_up_wrapper ,
397405 ._ets_backup_dma_copy = btdm_backup_dma_copy_wrapper ,
@@ -478,35 +486,44 @@ static inline void esp_bt_power_domain_off(void)
478486 esp_wifi_bt_power_domain_off ();
479487}
480488
481- static void interrupt_set_wrapper ( int cpu_no , int intr_source , int intr_num , int intr_prio )
489+ static void btdm_intr_alloc ( void * arg )
482490{
483- esp_rom_route_intr_matrix (cpu_no , intr_source , intr_num );
484- #if __riscv
485- esprv_int_set_priority (intr_num , intr_prio );
486- esprv_int_set_type (intr_num , 0 );
487- #endif
491+ btdm_isr_alloc_t * p = arg ;
492+ p -> ret = esp_intr_alloc (p -> source , p -> flags , p -> fn , p -> arg , p -> handle );
488493}
489494
490- static void interrupt_clear_wrapper (int intr_source , int intr_num )
495+ static int interrupt_alloc_wrapper (int cpu_id , int source , intr_handler_t handler , void * arg , void * * ret_handle )
491496{
497+ btdm_isr_alloc_t p ;
498+ p .source = source ;
499+ p .flags = ESP_INTR_FLAG_LEVEL3 | ESP_INTR_FLAG_IRAM ;
500+ p .fn = handler ;
501+ p .arg = arg ;
502+ p .handle = (intr_handle_t * )ret_handle ;
503+ #if CONFIG_FREERTOS_UNICORE
504+ btdm_intr_alloc (& p );
505+ #else
506+ esp_ipc_call_blocking (cpu_id , btdm_intr_alloc , & p );
507+ #endif
508+ return p .ret ;
492509}
493510
494- static void interrupt_handler_set_wrapper ( int n , intr_handler_t fn , void * arg )
511+ static int interrupt_free_wrapper ( void * handle )
495512{
496- esp_cpu_intr_set_handler ( n , fn , arg );
513+ return esp_intr_free (( intr_handle_t ) handle );
497514}
498515
499- static void interrupt_on_wrapper ( int intr_num )
516+ static int interrupt_enable_wrapper ( void * handle )
500517{
501- esp_cpu_intr_enable ( 1 << intr_num );
518+ return esp_intr_enable (( intr_handle_t ) handle );
502519}
503520
504- static void interrupt_off_wrapper ( int intr_num )
521+ static int interrupt_disable_wrapper ( void * handle )
505522{
506- esp_cpu_intr_disable ( 1 << intr_num );
523+ return esp_intr_disable (( intr_handle_t ) handle );
507524}
508525
509- static void IRAM_ATTR interrupt_disable (void )
526+ static void IRAM_ATTR global_interrupt_disable (void )
510527{
511528 if (xPortInIsrContext ()) {
512529 portENTER_CRITICAL_ISR (& global_int_mux );
@@ -515,7 +532,7 @@ static void IRAM_ATTR interrupt_disable(void)
515532 }
516533}
517534
518- static void IRAM_ATTR interrupt_restore (void )
535+ static void IRAM_ATTR global_interrupt_restore (void )
519536{
520537 if (xPortInIsrContext ()) {
521538 portEXIT_CRITICAL_ISR (& global_int_mux );
0 commit comments