/**************************************************************************** Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED. This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT be copied by any method or incorporated into another program without the express written consent of Aerospace C.Power. This Information or any portion thereof remains the property of Aerospace C.Power. The Information contained herein is believed to be accurate and Aerospace C.Power assumes no responsibility or liability for its use in any way and conveys no license or title under any patent or copyright and makes no representation or warranty that this Information is free from patent or copyright infringement. ****************************************************************************/ #include "iot_config.h" #include "iot_errno.h" #include "iot_utils.h" #include "iot_system.h" #include "iot_io.h" #include "plc_utils.h" #include "mac_rf.h" #include "mac_vdev.h" #include "phy_bb.h" #include "plc_beacon.h" #if HPLC_RF_CHANNEL_SUPPORT #include "phy_rf_chn.h" #include "phy_rf_init.h" #if HPLC_RF_DEV_SUPPORT #include "mac_rf_common_hw.h" #include "mac_rf_sched_hw.h" #include "mac_rf_pdev.h" #include "mac_rf_sched.h" #include "mac_rf_isr.h" #include "mac_rf_tx_hw.h" #include "mac_rf_rx_hw.h" #include "rf_hw_tonemap.h" #include "mac_rf_rx_buf_ring.h" #include "mac_rf_txq_hw.h" #endif mac_rf_t *mac_rf_init() { mac_rf_t *tmp = os_mem_malloc(PLC_MAC_RF_MID,sizeof(mac_rf_t)); IOT_ASSERT(tmp); #if HPLC_RF_DEV_SUPPORT tmp->rf_channel = mac_rf_get_tobe_set_channel_id(); tmp->rf_option = mac_rf_get_option(); #else uint8_t option, channel; phy_rf_get_default_cfg(&option, &channel); tmp->rf_channel = channel; tmp->rf_option = option; #endif g_phy_cpu_share_ctxt.rf_channel = tmp->rf_channel; g_phy_cpu_share_ctxt.rf_option = tmp->rf_option; return tmp; } static void mac_rf_set_option_channel(uint8_t rf_option, uint8_t rf_channel) { (void)rf_option; (void)rf_channel; #if HPLC_RF_DEV_SUPPORT uint32_t proto = PHY_PROTO_TYPE_GET(); mac_rf_pdev_t *rf_pdev = get_rf_pdev_ptr(PLC_PDEV_ID, RF_PDEV_ID); mac_rf_sched_enable_bp(NULL, 0); /* rf disable rx ring */ mac_rf_rx_all_ring_disable(rf_pdev); /* flush all tdma/csma queue */ mac_rf_tx_flush_all_queue(&rf_pdev->hwq_hdl); /* plc cpu and bbcpu sync init, rf rxdc enable */ phy_rf_init(proto, rf_option, rf_channel, 1, 0, 0); /* rf isr init */ mac_rf_isr_init(mac_rf_get_dsr_callback()); /* init rf pdev */ mac_rf_pdev_init(RF_PDEV_ID); /* rf enable rx ring */ mac_rf_rx_all_ring_enable(rf_pdev); /* start isr */ mac_rf_isr_start(); /* trigger cmdlist */ mac_rf_sched_trigger_bp(NULL); mac_rf_sched_enable_bp(NULL, 1); #endif } void mac_rf_set_self_option_channel(uint8_t rf_option, uint8_t rf_channel) { mac_vdev_t *vdev = get_vdev_ptr(PLC_PDEV_ID, PLC_DEFAULT_VDEV); mac_rf_t *mac_rf = vdev->mac_rf; IOT_ASSERT(mac_rf); /* check option */ if (rf_option >= PHY_RF_OPTION_MAX || rf_option < PHY_RF_OPTION1_1M) { iot_printf("%s set option err: set option:%d, cur option:%d\n", __FUNCTION__, rf_option, mac_rf_get_self_option()); rf_option = mac_rf_get_self_option(); } /* check channel */ if (rf_channel >= phy_rf_get_channel_id_max(rf_option) || rf_channel < RF_CHANNEL_ID_1) { iot_printf("%s set channel err, set channel:%d, cur channel:%d," " set option:%d, cur option:%d\n", __FUNCTION__, rf_channel, mac_rf->rf_channel, rf_option, mac_rf_get_self_option()); return; } uint8_t cur_option = mac_rf_get_self_option(); iot_printf("%s, cur option:%d, channel:%d, set option:%d, channel:%d\n", __FUNCTION__, cur_option, mac_rf->rf_channel, rf_option, rf_channel); if (cur_option != rf_option) { /* update option/channel to mac */ mac_rf_set_option_channel(rf_option, rf_channel); mac_rf->rf_option = rf_option; mac_rf->rf_channel = rf_channel; g_phy_cpu_share_ctxt.rf_channel = rf_channel; g_phy_cpu_share_ctxt.rf_option = rf_option; } else if (rf_channel != mac_rf->rf_channel) { mac_rf->rf_channel = rf_channel; g_phy_cpu_share_ctxt.rf_channel = rf_channel; g_phy_cpu_share_ctxt.rf_option = rf_option; /* set channel to bbcpu */ phy_rf_set_channel(rf_channel); } } uint8_t mac_rf_get_self_channel() { mac_vdev_t *vdev = get_vdev_ptr(PLC_PDEV_ID, PLC_DEFAULT_VDEV); mac_rf_t *mac_rf = vdev->mac_rf; IOT_ASSERT(mac_rf); return (uint8_t)mac_rf->rf_channel; } uint8_t mac_rf_get_self_option() { mac_vdev_t *vdev = get_vdev_ptr(PLC_PDEV_ID, PLC_DEFAULT_VDEV); mac_rf_t *mac_rf = vdev->mac_rf; IOT_ASSERT(mac_rf); return (uint8_t)mac_rf->rf_option; } #else /* HPLC_RF_CHANNEL_SUPPORT */ mac_rf_t *mac_rf_init() { return NULL; } void mac_rf_set_self_option_channel(uint8_t rf_option, uint8_t rf_channel) { (void)rf_option; (void)rf_channel; } uint8_t mac_rf_get_self_channel() { return RF_CHANNEL_ID_INVALID; } uint8_t mac_rf_get_self_option() { return RF_OPTION_INVALID; } #endif /* HPLC_RF_CHANNEL_SUPPORT */