Zephyr PA_Sync sequence flow

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