Linux Audio
Check our new training course
Embedded Linux Audio
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
/* * Copyright (c) 2016-2019 Nordic Semiconductor ASA * Copyright (c) 2016 Vinayak Kariappa Chettimada * Copyright 2019 NXP * * SPDX-License-Identifier: Apache-2.0 */ #include <zephyr/types.h> #include <soc.h> #include "hal/RV32M1/swi.h" #include "util/memq.h" #include "util/mayfly.h" #define LOG_MODULE_NAME bt_ctlr_rv32m1_mayfly #include "common/log.h" #include "hal/debug.h" #if defined(CONFIG_BT_LL_SW_SPLIT) #include "ll_sw/lll.h" #define MAYFLY_CALL_ID_LLL TICKER_USER_ID_LLL #define MAYFLY_CALL_ID_WORKER TICKER_USER_ID_ULL_HIGH #define MAYFLY_CALL_ID_JOB TICKER_USER_ID_ULL_LOW #else #error Unknown LL variant. #endif void mayfly_enable_cb(uint8_t caller_id, uint8_t callee_id, uint8_t enable) { (void)caller_id; LL_ASSERT(callee_id == MAYFLY_CALL_ID_JOB); if (enable) { irq_enable(HAL_SWI_JOB_IRQ); } else { irq_disable(HAL_SWI_JOB_IRQ); } } uint32_t mayfly_is_enabled(uint8_t caller_id, uint8_t callee_id) { (void)caller_id; switch (callee_id) { #if defined(CONFIG_BT_LL_SW_SPLIT) case MAYFLY_CALL_ID_LLL: return irq_is_enabled(HAL_SWI_RADIO_IRQ); #endif /* CONFIG_BT_LL_SW_SPLIT */ case MAYFLY_CALL_ID_WORKER: return irq_is_enabled(HAL_SWI_WORKER_IRQ); case MAYFLY_CALL_ID_JOB: return irq_is_enabled(HAL_SWI_JOB_IRQ); default: LL_ASSERT(0); break; } return 0; } uint32_t mayfly_prio_is_equal(uint8_t caller_id, uint8_t callee_id) { return (caller_id == callee_id) || #if defined(CONFIG_BT_LL_SW_SPLIT) #if (CONFIG_BT_CTLR_LLL_PRIO == CONFIG_BT_CTLR_ULL_HIGH_PRIO) ((caller_id == MAYFLY_CALL_ID_LLL) && (callee_id == MAYFLY_CALL_ID_WORKER)) || ((caller_id == MAYFLY_CALL_ID_WORKER) && (callee_id == MAYFLY_CALL_ID_LLL)) || #endif #if (CONFIG_BT_CTLR_LLL_PRIO == CONFIG_BT_CTLR_ULL_LOW_PRIO) ((caller_id == MAYFLY_CALL_ID_LLL) && (callee_id == MAYFLY_CALL_ID_JOB)) || ((caller_id == MAYFLY_CALL_ID_JOB) && (callee_id == MAYFLY_CALL_ID_LLL)) || #endif #if (CONFIG_BT_CTLR_ULL_HIGH_PRIO == CONFIG_BT_CTLR_ULL_LOW_PRIO) ((caller_id == MAYFLY_CALL_ID_WORKER) && (callee_id == MAYFLY_CALL_ID_JOB)) || ((caller_id == MAYFLY_CALL_ID_JOB) && (callee_id == MAYFLY_CALL_ID_WORKER)) || #endif #endif 0; } void mayfly_pend(uint8_t caller_id, uint8_t callee_id) { (void)caller_id; switch (callee_id) { #if defined(CONFIG_BT_LL_SW_SPLIT) case MAYFLY_CALL_ID_LLL: hal_swi_lll_pend(); break; #endif /* CONFIG_BT_LL_SW_SPLIT */ case MAYFLY_CALL_ID_WORKER: hal_swi_worker_pend(); break; case MAYFLY_CALL_ID_JOB: hal_swi_job_pend(); break; default: LL_ASSERT(0); break; } }