sequenceDiagram App-->>Host: bt_enable() Host-->HCI: bt_hci_open() App-->>Host: bt_le_scan_cb_register() App-->>Host: bt_le_per_adv_sync_cb_register() App-->>Host: bt_le_scan_start() Host-->>HCI: BT_HCI_OP_LE_SET_EXT_SCAN_PARAM HCI-->>ULL_SCAN: ll_scan_params_set() ULL_SCAN-->>HCI: OK or FAIL? HCI-->>Host: cmd_complete_status() Host-->>HCI: BT_HCI_OP_LE_SET_EXT_SCAN_ENABLE HCI-->>ULL_SCAN: ll_scan_enable() ULL_SCAN-->>ULL_SCAN: scan = ull_scan_is_disabled_get(SCAN_HANDLE_1M); ULL_SCAN-->>ULL_SCAN: duration_period_setup() ULL_SCAN-->>ULL_Filter: ull_filter_scan_update() ULL_SCAN-->>ULL_Filter: ull_filter_rpa_update() ULL_SCAN-->>ULL_SCAN: ull_scan_enable() ULL_SCAN-->>HCI: OK or FAIL? HCI-->>Host: cmd_complete_status() ULL_SCAN-->>Ticker: ticker_start() Ticker-->>ULL_SCAN: tickcer_cb() ULL_SCAN-->>Mayfly: mayfly_enqueue() Mayfly-->>LLL_SCAN: lll_scan_prepare() LLL_SCAN-->>LLL_SCAN: prepare_cb() LLL_SCAN-->>+LLL_SCAN: common_prepare_cb() LLL_SCAN-->>Radio: radio_reset() LLL_SCAN-->>Radio: radio_tx_power_set() LLL_SCAN-->>Radio: radio_phy_set() LLL_SCAN-->>Radio: radio_pkt_configure() LLL_SCAN-->>Radio: radio_pkt_rx_set() LLL_SCAN-->>Radio: radio_aa_set() LLL_SCAN-->>Radio: radio_crc_configure() LLL_SCAN-->>Radio: radio_freq_chan_set(chan) LLL_SCAN-->>Radio: radio_whiten_iv_set(chan) LLL_SCAN-->>Radio: radio_isr_set(**isr_rx**, lll); LLL_SCAN-->>Radio: radio_tmr_tifs_set() LLL_SCAN-->>Radio: radio_filter_configure() LLL_SCAN-->>Radio: radio_ar_configure() LLL_SCAN-->>Radio: radio_tmr_start() LLL_SCAN-->>Radio: radio_tmr_end_capture() LLL_SCAN-->>Radio: radio_rssi_measure() LLL_SCAN-->>-Ticker: ticker_start(TICKER_ID_SCAN_STOP) Radio-->>+LLL_SCAN: isr_rx() LLL_SCAN-->>LLL_SCAN: lll_scan_aux_addr_match_get() LLL_SCAN-->>LLL_SCAN: lll_scan_isr_rx_check() LLL_SCAN-->>LLL_SCAN: isr_rx_pdu() LLL_SCAN-->>LLL_SCAN: isr_rx_scan_report() NODE_RX_TYPE_EXT_1M_REPORT opt Active scanner 需要发送Scan Request LLL_SCAN-->>Radio: radio_tmr_tifs_set() LLL_SCAN-->>Radio: radio_switch_complete_and_rx(0) LLL_SCAN-->>LLL_SCAN: isr_rx_scan_report() LLL_SCAN-->>Radio: radio_pkt_tx_set,PDU_ADV_TYPE_SCAN_REQ with radio_pkt_scratch_get(); LLL_SCAN-->>Radio: radio_tmr_end_capture(); LLL_SCAN-->>Radio: radio_isr_set(isr_tx, lll) Radio-->>+LLL_SCAN: isr_tx(void *param) LLL_SCAN-->>Radio: radio_switch_complete_and_disable() LLL_SCAN-->>Radio: radio_pkt_rx_set() LLL_SCAN-->>Radio: radio_tmr_hcto_configure() LLL_SCAN-->>Radio:radio_rssi_measure() LLL_SCAN-->>-Radio: radio_isr_set(isr_rx, param) 切换到RX end opt Passive scanner or scan responses ,LLL处理EXT_IND LLL_SCAN-->>LLL_SCAN_AUX: lll_scan_aux_setup() LLL_SCAN_AUX-->>+LLL_SCAN_AUX: lll_scan_aux_isr_aux_setup() LLL_SCAN_AUX-->>Radio: radio_isr_set(lll_scan_aux_isr_aux_setup) LLL_SCAN_AUX-->>-Radio: radio_disable() end LLL_SCAN-->>ULL: ull_rx_put_sched() NODE_RX_TYPE_EXT_1M_REPORT ULL-->>ULL: ull_rx_sched() ULL-->>Mayfly: mayfly_enqueue() Mayfly-->>ULL: rx_demux() ULL-->>ULL: rx_demux_rx(link, rx); ULL-->>ULL_SCAN_AUX: ull_scan_aux_setup(NODE_RX_TYPE_EXT_1M_REPORT) ULL_SCAN_AUX-->>ULL_Sync: ull_sync_setup() if sync is created ULL_Sync-->>Ticker: ticker_start() Ticker-->>ULL_Sync: ticker_cb() ULL_Sync-->>Mayfly: mayfly_enqueue() Mayfly-->>LLL_Sync: lll_sync_create_prepare() LLL_Sync-->>LLL_Sync: create_prepare_cb() LLL_Sync-->>LLL_Sync: prepare_cb_common() LLL_Sync-->>Radio: radio_isr_set(**isr_rx_adv_sync_estab**, lll) Radio-->>LLL_Sync: isr_rx_adv_sync_estab() opt SYNC_STAT_ALLOWED LLL_Sync-->>LLL_Sync: isr_rx() LLL_Sync-->>LLL_SCAN_AUX: lll_scan_aux_setup() LLL_SCAN_AUX-->>Radio: radio_isr_set(isr_aux_setup) LLL_Sync-->>ULL: ull_rx_put(NODE_RX_TYPE_SYNC, SYNC_STAT_ALLOW); LLL_Sync-->>ULL: ull_rx_sched() 通知ULL ULL-->>ULL: rx_demux_rx(NODE_RX_TYPE_SYNC) ULL-->>ULL_Sync: ull_sync_established_report ULL_Sync-->>ULL_SCAN_AUX: ull_scan_aux_setup(NODE_RX_TYPE_SYNC_REPORT) 如果LLL已经启动,ULL就不会再启动ticker ULL_SCAN_AUX-->>ULL_Sync: ull_sync_setup() if sync is created. ULL_SCAN_AUX-->>Ticker: ticker_start() 如果LLL没有启动AUX,ULL就启动ticker Ticker-->>ULL_SCAN_AUX: ticker_cb() ULL_SCAN_AUX-->>Mayfly: mayfly_enqueue() Mayfly-->>LLL_SCAN_AUX: lll_scan_aux_prepare() LLL_SCAN_AUX-->>LLL_SCAN_AUX: prepare_cb() opt 如果有前序AUX,那后面就是CHAIN IND LLL_SCAN_AUX-->>LLL_SCAN_AUX: lll_sync_aux_prepare_cb() 是PA train LLL_SCAN_AUX-->>Radio: radio_isr_set(isr_rx_aux_chain, lll) end opt 如果没有前序AUX LLL_SCAN_AUX-->>Radio: radio_isr_set(isr_rx_ull_schedule, lll_aux) if NOT PA train. LLL_SCAN_AUX-->>LLL: lll_prepare_done() end Radio-->>LLL_Sync: isr_aux_setup() LLL_Sync-->>Radio: radio_isr_set(isr_rx_aux_chain, lll) LLL_Sync-->>Radio: radio_tmr_start_us() LLL_Sync-->>Radio: radio_tmr_end_capture() Radio->>LLL_Sync: isr_rx_aux_chain() LLL_Sync-->>LLL_Sync: isr_rx(NODE_RX_TYPE_EXT_AUX_REPORT) end opt SYNC_STAT_TERM LLL_Sync-->>ULL: ull_rx_put_sched(SYNC_STAT_TERM) 终结 end opt LLL 层来处理AUX Radio-->>+LLL_SCAN_AUX: lll_scan_aux_isr_aux_setup() LLL_SCAN_AUX-->>LLL: lll_isr_status_reset() LLL_SCAN_AUX-->>Radio: radio_phy_set() LLL_SCAN_AUX-->>Radio:radio_pkt_configure() LLL_SCAN_AUX-->>LLL: lll_chan_set() LLL_SCAN_AUX-->>Radio: radio_pkt_rx_set() LLL_SCAN_AUX-->>Radio: radio_isr_set(isr_rx_lll_schedule, node_rx) LLL_SCAN_AUX-->>Radio: radio_tmr_tifs_set(EVENT_IFS_US) LLL_SCAN_AUX-->>Radio: radio_switch_complete_and_tx(phy_aux, 0, phy_aux, 1); LLL_SCAN_AUX-->>Radio: radio_tmr_start_us(0, aux_start_us) LLL_SCAN_AUX-->>Radio: radio_tmr_hcto_configure(hcto) LLL_SCAN_AUX-->>Radio: radio_tmr_end_capture() LLL_SCAN_AUX-->>-Radio: radio_rssi_measure() Radio-->>LLL_SCAN_AUX: isr_rx_lll_schedule() LLL_SCAN_AUX-->>LLL_SCAN_AUX: isr_rx() LLL_SCAN_AUX-->>LLL_SCAN_AUX: isr_rx_pdu() opt ADV是Scannable的 LLL_SCAN_AUX-->>Radio: radio_pkt_tx_set() PDU_ADV_TYPE_SCAN_REQ LLL_SCAN_AUX-->>Radio: radio_isr_set(isr_tx_scan_req_lll_schedule) LLL_SCAN_AUX-->>ULL: ull_rx_put_sched(),NODE_RX_TYPE_EXT_AUX_REPORT Radio-->>+LLL_SCAN_AUX: isr_tx_scan_req_lll_schedule() LLL_SCAN_AUX-->>LLL_SCAN_AUX: isr_tx() LLL_SCAN_AUX-->>-Radio: radio_isr_set(isr_rx_lll_schedule()) Radio-->>LLL_SCAN_AUX: isr_rx_lll_schedule() LLL_SCAN-->>LLL_SCAN: isr_rx() LLL_SCAN-->>LLL_SCAN: isr_rx_pdu() LLL_SCAN-->>LLL_SCAN: lll_scan_aux_setup() LLL_SCAN-->>Radio: radio_isr_set(lll_scan_aux_isr_aux_setup) LLL_SCAN-->>ULL: ull_rx_put_sched(NODE_RX_TYPE_EXT_AUX_REPORT) end end LLL_SCAN-->>Radio: radio_isr_set(isr_done, lll); LLL_SCAN-->>-Radio: radio_disable() Radio-->>+LLL_SCAN: isr_done() LLL_SCAN-->>Radio: radio_rx_enable() LLL_SCAN-->>-Radio: radio_tmr_end_capture() LLL_SCAN-->>LLL_SCAN: lll_prepare_done() Ticker-->>LLL_SCAN: ticker_stop_cb() LLL_SCAN-->>Mayfly: mayfly_enqueue() Mayfly-->>LLL_SCAN: lll_disable() loop Alaways App-->>App: k_sem_take(&sem_per_adv, K_FOREVER); App-->>Host: bt_le_per_adv_sync_create() Host-->>HCI: BT_HCI_OP_LE_PER_ADV_CREATE_SYNC HCI-->>ULL_Sync: ll_sync_create() ULL_Sync-->>ULL_Sync: scan->periodic.sync = sync,设定Sync Host-->>HCI: BT_HCI_OP_LE_SET_PER_ADV_RECV_ENABLE HCI-->>ULL_Sync: ll_sync_recv_enable() Host-->>HCI: BT_HCI_OP_LE_PER_ADV_TERMINATE_SYNC HCI-->>ULL_Sync: ll_sync_terminate() App-->>App: k_sem_take(&sem_per_sync, TIMEOUT_SYNC_CREATE) end