Files
kunlun/plc/halmac/rf/mac_rf.c
2024-09-28 14:24:04 +08:00

175 lines
5.3 KiB
C

/****************************************************************************
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 */