/** **************************************************************************************** * * @file sch_prog.h * * @brief Scheduling Programmer API * * Copyright (C) RivieraWaves 2009-2017 * **************************************************************************************** */ #ifndef SCH_PROG_H_ #define SCH_PROG_H_ /** **************************************************************************************** * @defgroup SCH_PROG Scheduling Programmer * @ingroup SCH * @brief Responsible for programming BT/BLE frames. * @{ **************************************************************************************** */ /* * INCLUDE FILES **************************************************************************************** */ #include "rwip_config.h" // stack configuration #include // integer #include // boolean /* * DEFINES **************************************************************************************** */ /* * ENUMERATIONS **************************************************************************************** */ /// Mode enum SCH_FRAME_TYPE { SCH_PROG_BLE, SCH_PROG_BT, }; /// Frame type enum SCH_FRAME_IRQ { /// Normal End of Event SCH_FRAME_IRQ_EOF = 0x00, /// End of event due to an abort SCH_FRAME_IRQ_EOF_ABORT = 0x01, /// SKIP Event IRQ SCH_FRAME_IRQ_SKIP = 0x04, /// RX ACL IRQ SCH_FRAME_IRQ_RX = 0x02, /// TX ACL IRQ SCH_FRAME_IRQ_TX = 0x03, #if (BLE_ISO_PRESENT) /// RX ISO IRQ SCH_FRAME_IRQ_RX_ISO = 0x05, /// TX ISO IRQ SCH_FRAME_IRQ_TX_ISO = 0x06, #endif // (BLE_ISO_PRESENT) }; #if BT_EMB_PRESENT /// Frame type enum SCH_BT_FRAME_TYPE { SCH_BT_FRAME_TYPE_NORMAL = 0x00, SCH_BT_FRAME_TYPE_SNIFF = 0x01, SCH_BT_FRAME_TYPE_ESCO = 0x02, SCH_BT_FRAME_TYPE_CSB = 0x03, SCH_BT_FRAME_TYPE_ESCO_RETX = 0x04, }; #endif //BT_EMB_PRESENT /* * STRUCTURE DEFINITIONS **************************************************************************************** */ /** **************************************************************************************** * @brief Callback for interrupt related to the frame * * @param[in] timestamp Timestamp of the programmed frame (in BLE slots, based on local clock) * @param[in] dummy Dummy value (provided by the driver when programming the frame via sch_prog_push) * @param[in] irq_type IRQ type (0: End Of Frame | 1: RX) **************************************************************************************** */ typedef void (*frm_cbk_t)(uint32_t timestamp, uint32_t dummy, uint8_t irq_type); #if BT_EMB_PRESENT /** **************************************************************************************** * @brief Callback for interrupt related to the clock IRQ * * @param[in] clock Clock when the IRQ happened * @param[in] id Identification value **************************************************************************************** */ typedef void (*clk_cbk_t)(uint32_t clock, uint8_t id); #endif //BT_EMB_PRESENT #if BLE_EMB_PRESENT /// Additional parameters for BLE frame struct sch_prog_params_ble { /// Advertising channel type: 0x0: AE Start on Primary channel | 0x1: AE Start on Secondary channel uint8_t ae_nps; /// Reserved audio event (0: reTx, 1:primary) uint8_t rsvd; /// Isochronous event (0: normal event | 1: iso event) uint8_t iso; /// Start Instant Correction (SIC) bit value uint8_t sic; }; #endif //BLE_EMB_PRESENT #if BT_EMB_PRESENT /// Additional parameters for BT frame struct sch_prog_params_bt { /// Frame type (0: normal | 1: sniff | 2: ESCO | 3: CSB) uint8_t frm_type; /// Voice channel uint8_t vxchan; }; #endif //BT_EMB_PRESENT /// Parameters for a programmed frame struct sch_prog_params { /// Callback for handling interrupts related to the frame frm_cbk_t frm_cbk; /// Timestamp (in half-slots, based on local clock) and event offset (in half-us) of the programmed frame rwip_time_t time; /// Bandwidth duration of the event using priority 1 (in half us) uint32_t bandwidth; /// Dummy value reported when an event happen during the frame or the frame is completed uint32_t dummy; /// Priority during duration of bandwidth uint8_t prio_1; /// Priority after bandwidth elapsed uint8_t prio_2; /// Priority after trigger conditions uint8_t prio_3; /// Priority when specific action occurs during the event uint8_t pti_prio; /// Control structure index uint8_t cs_idx; /// Mode (0: BLE, 1:BT) uint8_t mode; union { #if BLE_EMB_PRESENT /// Additional parameters for BLE frame struct sch_prog_params_ble ble; #endif //BLE_EMB_PRESENT #if BT_EMB_PRESENT /// Additional parameters for BT frame struct sch_prog_params_bt bt; #endif //BT_EMB_PRESENT } add; }; /* * FUNCTIONS DECLARATION **************************************************************************************** */ /** **************************************************************************************** * @brief Initialize the SCH_PROG module * * @param[in] init_type Type of initialization (@see enum rwip_init_type) **************************************************************************************** */ void sch_prog_init(uint8_t init_type); /** **************************************************************************************** * @brief Handle "RX" interrupt * * @param[in] et_idx Entry index that trigger the ISR (@note Valid only with 5.0 + ISO HW) **************************************************************************************** */ void sch_prog_rx_isr(uint8_t et_idx); /** **************************************************************************************** * @brief Handle FIFO interrupt **************************************************************************************** */ void sch_prog_fifo_isr(void); /** **************************************************************************************** * @brief Push a new programmed frame * * @param[in] params Parameters structure **************************************************************************************** */ void sch_prog_push(struct sch_prog_params* params); #if BT_EMB_PRESENT /** **************************************************************************************** * @brief Enable the programming of an activity * * @param[in] clk_cbk Callback for handling interrupts related to the clock * @param[in] id Identification value * @param[in] sr_size Size of the sub rating pattern (in number of bits), 0 if no sub rating * @param[in] sr_val Sub rating pattern value, representing the clock LSBs when interrupt is raised **************************************************************************************** */ void sch_prog_enable(clk_cbk_t clk_cbk, uint8_t id, uint8_t sr_size, uint8_t sr_val); /** **************************************************************************************** * @brief Disable the programming of an activity * * @param[in] id Identification value **************************************************************************************** */ void sch_prog_disable(uint8_t id); /** **************************************************************************************** * @brief Handle "clock" interrupt **************************************************************************************** */ void sch_prog_clk_isr(void); /** **************************************************************************************** * @brief Handle "Skip" interrupt * * @param[in] et_idx Entry index that trigger the ISR (@note Valid only with 5.0 + ISO HW) **************************************************************************************** */ void sch_prog_skip_isr(uint8_t et_idx); /** **************************************************************************************** * @brief Handle "End of Event" interrupt * * @param[in] et_idx Entry index that trigger the ISR (@note Valid only with 5.0 + ISO HW) **************************************************************************************** */ void sch_prog_end_isr(uint8_t et_idx); #endif //BT_EMB_PRESENT /// @} SCH_PROG #endif // SCH_PROG_H_