308 lines
10 KiB
C
308 lines
10 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 "rf_tx_test_lib.h"
|
|
#include "mac_sys_reg.h"
|
|
#include "hw_reg_api.h"
|
|
#include "mac_tx_hw.h"
|
|
#include "iot_errno.h"
|
|
#include "iot_io.h"
|
|
#include "mac_pdev.h"
|
|
#include "iot_bitops.h"
|
|
#include "hw_phy_init.h"
|
|
#include "hw_tonemap.h"
|
|
#include "phy_chn.h"
|
|
#include "mac_crc.h"
|
|
#include "mpdu_header.h"
|
|
#include "mac_desc_engine.h"
|
|
#include "mac_rx_hw.h"
|
|
#include "mac_cert_test.h"
|
|
#include "tx_desc_reg_api.h"
|
|
#include "tx_test_lib.h"
|
|
#include "rf_hw_tonemap.h"
|
|
#include "phy_rf_chn.h"
|
|
#include "mac_rf_tx_hw.h"
|
|
|
|
#if ((HW_PLATFORM >= HW_PLATFORM_FPGA) && (IOT_FTM_SUPPORT || \
|
|
CPLC_IOT_CERT_SUPPORT) && HPLC_RF_DEV_SUPPORT)
|
|
|
|
#include "mac_rf_sched_hw.h"
|
|
#include "mac_rf_common_hw.h"
|
|
|
|
uint32_t mac_rf_sche_set_cfg(void *vdev, hw_sched_cmd_t *cmdlist,
|
|
uint16_t cmd_num, uint32_t bcn_pd, uint32_t start_ntb)
|
|
{
|
|
(void)vdev;
|
|
mac_rf_sched_enable_bp(NULL, 0);
|
|
//mac_rf_sched_set_bp_ahead_alert(NULL, 10);
|
|
/*set cmd list and cmd num*/
|
|
mac_rf_sched_set_bp_cmd_list(NULL, cmdlist, cmd_num);
|
|
/*set bcn period*/
|
|
mac_rf_sched_set_bp_dur(NULL, bcn_pd);
|
|
mac_rf_sched_set_bp_start_ntb(NULL, start_ntb);
|
|
/*trig*/
|
|
mac_rf_sched_trigger_bp(NULL);
|
|
|
|
mac_rf_sched_enable_bp(NULL, 1);
|
|
|
|
return 0;
|
|
}
|
|
|
|
void rf_mpdu_tx_beacon_test(uint32_t proto, mac_rf_queue_ctxt_t *tx_ctxt,
|
|
rf_tx_mpdu_end *mpdu_end, uint8_t qid, uint8_t bcast,
|
|
uint8_t delimiter_type, uint32_t nid, uint32_t dtei, uint32_t stei,
|
|
uint8_t phr_mcs, uint8_t pld_mcs, uint8_t pld_idx, uint8_t pb_num,
|
|
uint16_t pkt_len, uint8_t *pkt)
|
|
{
|
|
rf_tx_mpdu_start *rf_mpdu;
|
|
rf_tx_pb_start *pb;
|
|
rf_tx_dummy_node *dummy;
|
|
uint32_t pb_sz;
|
|
uint8_t pb_hdr_resv_crc_len;
|
|
uint32_t swq_id = qid;
|
|
uint32_t option = mac_rf_get_option();
|
|
uint32_t tx_fl = 20 * 25000; // 20ms
|
|
|
|
mac_desc_get(&g_mac_desc_eng,PLC_TX_MPDU_START_POOL, (void**)&rf_mpdu);
|
|
mac_desc_get(&g_mac_desc_eng,PLC_TX_DUMMY_NODE_POOL, (void**)&dummy);
|
|
mac_desc_get(&g_mac_desc_eng,PLC_TX_PB_START_POOL, (void**)&pb);
|
|
IOT_ASSERT(rf_mpdu && pb && dummy);
|
|
dummy->desc_type = DESC_TYPE_TX_DUMMY;
|
|
dummy->notify_hw_tx_done = 1;
|
|
dummy->tx_done = 1;
|
|
dummy->next = NULL;
|
|
|
|
pb_sz = phy_rf_get_pbsz(pld_idx);
|
|
|
|
/* get pb header + crc length */
|
|
pb_hdr_resv_crc_len = mac_get_pb_hdr_resv_crc_len(delimiter_type, proto);
|
|
|
|
iot_pkt_t *test_data = ftm_fill_mac_data(delimiter_type,
|
|
(pb_sz - pb_hdr_resv_crc_len), pkt, pkt_len);
|
|
|
|
/* fill rf mac info */
|
|
mac_rf_tx_mpdu_fill_macinfo(rf_mpdu, (rf_tx_mpdu_start *)dummy, pb,
|
|
mpdu_end, proto, 0, 0, 0, 0, 0, 0, 0,
|
|
(uint32_t)iot_pkt_data(test_data)-(uint32_t)test_data, 1, 1, phr_mcs,
|
|
0, 0, pld_mcs, pld_idx, 0, 0, swq_id, option, pb_num, tx_fl);
|
|
|
|
/* fill phyinfo */
|
|
mac_rf_tx_mpdu_fill_phyinfo(rf_mpdu, 0);
|
|
|
|
/* fill fc */
|
|
mac_rf_tx_mpdu_fill_phrinfo(rf_mpdu, proto, delimiter_type, 0, nid, 0, stei,
|
|
dtei, pld_mcs, 0, (uint16_t)pld_idx, 0, 0, 1);
|
|
|
|
iot_printf("rf beacon proto = %d, hwq = %d, phr_mcs = %d, pld_mcs = %d, "
|
|
"pld_idx:%d, pb_num = %d\n", proto, qid, phr_mcs, pld_mcs,
|
|
pld_idx, pb_num);
|
|
|
|
/* send */
|
|
mac_rf_tx_hw_mpdu(tx_ctxt, qid, rf_mpdu);
|
|
}
|
|
|
|
void rf_mpdu_tx_sof_test(uint32_t proto, mac_rf_queue_ctxt_t *tx_ctxt,
|
|
rf_tx_mpdu_end *mpdu_end, uint8_t qid, uint8_t bcast,
|
|
uint8_t delimiter_type,uint32_t nid, uint32_t dtei, uint32_t stei,
|
|
uint8_t phr_mcs, uint8_t pld_mcs, uint8_t pld_idx, uint8_t pb_num,
|
|
uint8_t need_ack, uint16_t pkt_len, uint8_t *pkt)
|
|
{
|
|
rf_tx_mpdu_start *rf_mpdu;
|
|
rf_tx_pb_start *pb;
|
|
rf_tx_dummy_node *dummy;
|
|
uint32_t pb_sz;
|
|
uint32_t bitmap;
|
|
uint32_t swq_id = qid;
|
|
uint32_t option = mac_rf_get_option();
|
|
uint32_t tx_fl = 20 * 25000; // 20ms
|
|
|
|
pb_sz = phy_rf_get_pbsz(pld_idx);
|
|
|
|
/* get header + crc length */
|
|
uint8_t pb_hdr_resv_crc_len =
|
|
mac_get_pb_hdr_resv_crc_len(delimiter_type, proto);
|
|
|
|
iot_pkt_t *test_data = ftm_fill_mac_data(delimiter_type,
|
|
((pb_sz - pb_hdr_resv_crc_len) * pb_num), pkt, pkt_len);
|
|
|
|
bitmap = 0xffffffff >> (32 - pb_num);
|
|
|
|
mac_desc_get(&g_mac_desc_eng, PLC_TX_MPDU_START_POOL, (void**)&rf_mpdu);
|
|
mac_desc_get(&g_mac_desc_eng,PLC_TX_DUMMY_NODE_POOL, (void**)&dummy);
|
|
IOT_ASSERT(rf_mpdu && dummy);
|
|
dummy->desc_type = DESC_TYPE_TX_DUMMY;
|
|
dummy->notify_hw_tx_done = 1;
|
|
dummy->tx_done = 1;
|
|
dummy->next = NULL;
|
|
|
|
mac_rf_tx_mpdu_form_pb(&pb, test_data, bitmap, pb_sz);
|
|
|
|
/* fill rf mac info */
|
|
mac_rf_tx_mpdu_fill_macinfo(rf_mpdu, (rf_tx_mpdu_start *)dummy, pb,
|
|
mpdu_end, proto, need_ack, 0, 0, 0, 0, 0, 0,
|
|
(uint32_t)iot_pkt_data(test_data)-(uint32_t)test_data, 1, 1, phr_mcs,
|
|
0, 0, pld_mcs, pld_idx, 0, 0, swq_id, option, pb_num, tx_fl);
|
|
|
|
/* fill phyinfo */
|
|
mac_rf_tx_mpdu_fill_phyinfo(rf_mpdu, 0);
|
|
|
|
/* fill fc */
|
|
mac_rf_tx_mpdu_fill_phrinfo(rf_mpdu, proto, delimiter_type, 0, nid, 0, stei,
|
|
dtei, pld_mcs, 0, (uint16_t)pld_idx, 0, 0, 1);
|
|
|
|
iot_printf("rf sof proto = %d, hwq = %d, phr_mcs = %d, pld_mcs = %d, "
|
|
"pld_idx:%d, pb_num = %d\n", proto, qid, phr_mcs, pld_mcs,
|
|
pld_idx, pb_num);
|
|
|
|
/* send */
|
|
mac_rf_tx_hw_mpdu(tx_ctxt, qid, rf_mpdu);
|
|
}
|
|
|
|
uint32_t mac_rf_tx_mpdu_fill_ack_fcinfo(rf_tx_mpdu_start *mpdu_start,
|
|
uint32_t proto, uint32_t delimter, uint32_t network, uint32_t nid,
|
|
uint32_t rx_result, uint32_t stei, uint32_t dtei, uint32_t snr,
|
|
uint32_t load, uint32_t ext_deli)
|
|
{
|
|
IOT_ASSERT(mpdu_start);
|
|
frame_control_t *fc = (frame_control_t *)&mpdu_start->phr0;
|
|
fc->delimiter_type = delimter;
|
|
fc->network_type = network;
|
|
fc->nid = nid;
|
|
fc->vf.rf_sack.rx_result = rx_result;
|
|
fc->vf.rf_sack.stei = stei;
|
|
fc->vf.rf_sack.dtei = dtei;
|
|
fc->vf.rf_sack.snr = snr;
|
|
fc->vf.rf_sack.load = load;
|
|
fc->vf.rf_sack.ext_deli = ext_deli;
|
|
fc->vf.rf_sack.version = 0;
|
|
return 0;
|
|
}
|
|
|
|
void rf_mpdu_tx_ack_test(uint32_t proto, mac_rf_queue_ctxt_t *tx_ctxt,
|
|
rf_tx_mpdu_end *mpdu_end, uint8_t qid, uint8_t delimiter_type,
|
|
uint32_t nid, uint32_t phr_mcs, uint32_t rx_result, uint32_t stei,
|
|
uint32_t dtei, uint32_t snr, uint32_t load, uint32_t ext_deli)
|
|
{
|
|
rf_tx_mpdu_start *rf_mpdu;
|
|
rf_tx_dummy_node *dummy;
|
|
uint32_t swq_id = qid;
|
|
uint32_t option = mac_rf_get_option();
|
|
uint32_t tx_fl = 20 * 25000; // 20ms
|
|
mac_desc_get(&g_mac_desc_eng,PLC_TX_MPDU_START_POOL, (void**)&rf_mpdu);
|
|
mac_desc_get(&g_mac_desc_eng,PLC_TX_DUMMY_NODE_POOL, (void**)&dummy);
|
|
IOT_ASSERT(rf_mpdu && dummy);
|
|
dummy->desc_type = DESC_TYPE_TX_DUMMY;
|
|
dummy->notify_hw_tx_done = 1;
|
|
dummy->tx_done = 1;
|
|
dummy->next = NULL;
|
|
|
|
/* fill rf mac info */
|
|
mac_rf_tx_mpdu_fill_macinfo(rf_mpdu, (rf_tx_mpdu_start *)dummy,
|
|
NULL, mpdu_end, proto, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, phr_mcs, 0, 0,
|
|
0, 0, 0, 0, swq_id, option, 0, tx_fl);
|
|
|
|
/* fill phyinfo */
|
|
mac_rf_tx_mpdu_fill_phyinfo(rf_mpdu, 0);
|
|
|
|
mac_rf_tx_mpdu_fill_ack_fcinfo(rf_mpdu, proto, delimiter_type, 0,
|
|
nid, rx_result, stei, dtei, snr, load, ext_deli);
|
|
|
|
iot_printf("rf sack proto = %d, hwq = %d, phr_mcs = %d\n",
|
|
proto, qid, phr_mcs);
|
|
|
|
/* send */
|
|
mac_rf_tx_hw_mpdu(tx_ctxt, qid, rf_mpdu);
|
|
}
|
|
|
|
void rf_mpdu_send_test(mac_rf_queue_ctxt_t *tx_ctxt, uint8_t qid,
|
|
uint8_t bcast, uint8_t delimiter_type,uint32_t nid, uint32_t dtei,
|
|
uint32_t stei,uint8_t phr_mcs, uint8_t pld_mcs, uint8_t pld_idx,
|
|
uint8_t pb_num, uint8_t need_ack, uint32_t rx_result, uint32_t snr,
|
|
uint32_t load, uint32_t ext_deli, uint16_t pkt_len, uint8_t *pkt)
|
|
{
|
|
rf_tx_mpdu_end *end;
|
|
/* mac protocol */
|
|
uint32_t proto = PHY_PROTO_TYPE_GET();
|
|
|
|
mac_desc_get(&g_mac_desc_eng, PLC_TX_MPDU_END_POOL, (void**)&end);
|
|
IOT_ASSERT(end);
|
|
end->tx_done = 0;
|
|
end->tx_ok = 0;
|
|
|
|
switch(delimiter_type){
|
|
case FC_DELIM_BEACON:
|
|
{
|
|
rf_mpdu_tx_beacon_test(proto, tx_ctxt, end, qid, bcast, FC_DELIM_BEACON,
|
|
nid, dtei, stei, phr_mcs, pld_mcs, pld_idx, pb_num, pkt_len, pkt);
|
|
break;
|
|
}
|
|
case FC_DELIM_SOF:
|
|
{
|
|
rf_mpdu_tx_sof_test(proto, tx_ctxt, end, qid, bcast, FC_DELIM_SOF, nid,
|
|
dtei, stei, phr_mcs, pld_mcs, pld_idx, pb_num, need_ack,
|
|
pkt_len, pkt);
|
|
break;
|
|
}
|
|
case FC_DELIM_SACK:
|
|
{
|
|
rf_mpdu_tx_ack_test(proto, tx_ctxt, end, qid, FC_DELIM_SACK, nid,
|
|
phr_mcs, rx_result, stei, dtei, snr, load, ext_deli);
|
|
break;
|
|
}
|
|
default:
|
|
IOT_ASSERT(0);
|
|
}
|
|
}
|
|
|
|
#else
|
|
|
|
uint32_t mac_rf_sche_set_cfg(void *vdev, hw_sched_cmd_t *cmdlist,
|
|
uint16_t cmd_num, uint32_t bcn_pd, uint32_t start_ntb)
|
|
{
|
|
(void)vdev;
|
|
(void)cmdlist;
|
|
(void)cmd_num;
|
|
(void)bcn_pd;
|
|
(void)start_ntb;
|
|
return 0;
|
|
}
|
|
|
|
void rf_mpdu_send_test(mac_rf_queue_ctxt_t *tx_ctxt, uint8_t qid,
|
|
uint8_t bcast, uint8_t delimiter_type,uint32_t nid, uint32_t dtei,
|
|
uint32_t stei,uint8_t phr_mcs, uint8_t pld_mcs, uint8_t pld_idx,
|
|
uint8_t pb_num, uint8_t need_ack, uint32_t rx_result, uint32_t snr,
|
|
uint32_t load, uint32_t ext_deli, uint16_t pkt_len, uint8_t *pkt)
|
|
{
|
|
(void)tx_ctxt;
|
|
(void)qid;
|
|
(void)bcast;
|
|
(void)delimiter_type;
|
|
(void)nid;
|
|
(void)dtei;
|
|
(void)stei;
|
|
(void)phr_mcs;
|
|
(void)pld_mcs;
|
|
(void)pld_idx;
|
|
(void)pb_num;
|
|
(void)need_ack;
|
|
(void)rx_result;
|
|
(void)snr;
|
|
(void)load;
|
|
(void)ext_deli;
|
|
(void)pkt_len;
|
|
(void)pkt;
|
|
}
|
|
|
|
#endif
|