diff --git a/test/case24/8ape_4cell_case(LTE).txt b/test/case24/8ape_4cell_case(LTE).txt new file mode 100644 index 0000000..e69de29 diff --git a/test/case24/src/testcase24.c b/test/case24/src/testcase24.c new file mode 100644 index 0000000..a2e47b0 --- /dev/null +++ b/test/case24/src/testcase24.c @@ -0,0 +1,479 @@ +// +FHDR------------------------------------------------------------ +// Copyright (c) 2022 SmartLogic. +// ALL RIGHTS RESERVED +// ----------------------------------------------------------------- +// Filename : test.c +// Author : xianfeng.du +// Created On : 2022-11-25 +// Last Modified : +// ----------------------------------------------------------------- +// Description: +// +// +// -FHDR------------------------------------------------------------ + +#include +#include +#include +#include + +#include "typedef.h" +#include "ucp_printf.h" +#include "msg_transfer_mem.h" +#include "pet_sm_mgt.h" +#include "ucp_handshake.h" +#include "ospShell.h" +#include "ospLog.h" +#include "ospCfgToBin.h" +#include "drv_init.h" +#include "stc_drv_api.h" + +uint32_t slot_ind_flag = 0; +uint32_t slot_ind_time_flag = 0; +uint32_t g_slot_time = 0; +uint32_t gu32_value = 0; +uint32_t gu32_tick_receive_ctrl = 0; +uint32_t gu32_tick_from_tx_ctrl = 0; + +uint32_t gu32_rx_callback_data_cnt = 0; + +uint32_t rx_callback_data(const char* buf,uint32_t payloadSize) +{ + uint32_t stc_cnt = read_stc_local_timer(); + uint32_t value = *(uint32_t *)buf; + uint16_t sfn = value >> 16; + uint16_t slot = value & 0xffff; + + uint32_t tick_from_tx_ctrl = *(uint32_t *)(buf+4); + + ++gu32_rx_callback_data_cnt; + slot_ind_flag = 1; + gu32_value = value; + gu32_tick_receive_ctrl = stc_cnt; + gu32_tick_from_tx_ctrl = tick_from_tx_ctrl; + uint32_t diff = stc_cnt - tick_from_tx_ctrl; + + if(0 == slot_ind_time_flag) + { + slot_ind_time_flag = 1; + diff = 1000000; + } + else + { + diff = stc_cnt - g_slot_time; + } + g_slot_time = stc_cnt; + + if ((diff > 1020000) || (diff < 980000)) + { + UCP_PRINT_ERROR("[0],qNO[%d],sfn[%d],slot[%d],diff[%d]",UCP4008_TRAFFIC_NR_eMBB_DATA,sfn,slot,diff); + } + return payloadSize; +} + +uint32_t gu32_rx1_slot_ind_flag = 0; +uint32_t gu32_rx1_slot_ind_time_flag = 0; +uint32_t gu32_rx1_slot_time = 0; + +uint32_t rx1_callback_data(const char* buf,uint32_t payloadSize) +{ + uint32_t stc_cnt = read_stc_local_timer(); + uint32_t value = *(uint32_t *)buf; + uint16_t sfn = value >> 16; + uint16_t slot = value & 0xffff; + uint32_t diff = 0; + + gu32_rx1_slot_ind_flag = 1; + if(0 == gu32_rx1_slot_ind_time_flag) + { + gu32_rx1_slot_ind_time_flag = 1; + diff = 1000000; + } + else + { + diff = stc_cnt - gu32_rx1_slot_time; + } + gu32_rx1_slot_time = stc_cnt; + + if ((diff > 1020000) || (diff < 980000)) + { + UCP_PRINT_ERROR("[1],qNO[%d],sfn[%d],slot[%d],diff[%d]",UCP4008_TRAFFIC_NR_eMBB_DATA,sfn,slot,diff); + } + + return payloadSize; +} + +uint32_t gu32_rx2_slot_ind_flag = 0; +uint32_t gu32_rx2_slot_ind_time_flag = 0; +uint32_t gu32_rx2_slot_time = 0; + +uint32_t rx2_callback_data(const char* buf,uint32_t payloadSize) +{ + uint32_t stc_cnt = read_stc_local_timer(); + uint32_t value = *(uint32_t *)buf; + uint16_t sfn = value >> 16; + uint16_t slot = value & 0xffff; + uint32_t diff = 0; + + gu32_rx2_slot_ind_flag = 1; + if(0 == gu32_rx2_slot_ind_time_flag) + { + gu32_rx2_slot_ind_time_flag = 1; + diff = 1000000; + } + else + { + diff = stc_cnt - gu32_rx2_slot_time; + } + gu32_rx2_slot_time = stc_cnt; + + if ((diff > 1020000) || (diff < 980000)) + { + UCP_PRINT_ERROR("[1],qNO[%d],sfn[%d],slot[%d],diff[%d]",UCP4008_TRAFFIC_NR_eMBB_DATA,sfn,slot,diff); + } + + return payloadSize; +} + +uint32_t gu32_rx3_slot_ind_flag = 0; +uint32_t gu32_rx3_slot_ind_time_flag = 0; +uint32_t gu32_rx3_slot_time = 0; + +uint32_t rx3_callback_data(const char* buf,uint32_t payloadSize) +{ + uint32_t stc_cnt = read_stc_local_timer(); + uint32_t value = *(uint32_t *)buf; + uint16_t sfn = value >> 16; + uint16_t slot = value & 0xffff; + uint32_t diff = 0; + + gu32_rx3_slot_ind_flag = 1; + if(0 == gu32_rx3_slot_ind_time_flag) + { + gu32_rx3_slot_ind_time_flag = 1; + diff = 1000000; + } + else + { + diff = stc_cnt - gu32_rx3_slot_time; + } + gu32_rx3_slot_time = stc_cnt; + + if ((diff > 1020000) || (diff < 980000)) + { + UCP_PRINT_ERROR("[1],qNO[%d],sfn[%d],slot[%d],diff[%d]",UCP4008_TRAFFIC_NR_eMBB_DATA,sfn,slot,diff); + } + + return payloadSize; +} + +uint32_t rx_callback_ctrl(const char* buf,uint32_t payloadSize) +{ + return payloadSize; +} + +static inline void get_msg_transfer_info(uint16_t port_index, uint16_t inst_id, uint16_t transfer_type, transfer_type_info_s* transfer_type_info_ptr) +{ + queue_info_s c_plane,u_plane; + + switch (transfer_type) { + case CU_SPLIT: + c_plane.rx_block_size = 0x25800; + c_plane.rx_block_num = 32; + c_plane.rx_callback = rx_callback_ctrl; + c_plane.tx_block_size = 0x8000; + c_plane.tx_block_num = 8; + c_plane.tx_callback = NULL; + + u_plane.rx_block_size = 0x28000; + u_plane.rx_block_num = 8; + //u_plane.rx_callback = rx_callback_data; + if (0 == inst_id) + { + u_plane.rx_callback = rx_callback_data; + } + else if (1 == inst_id) + { + u_plane.rx_callback = rx1_callback_data; + } + else if (2 == inst_id) + { + u_plane.rx_callback = rx2_callback_data; + } + else + { + u_plane.rx_callback = rx3_callback_data; + } + u_plane.tx_block_size = 0x28000; + u_plane.tx_block_num = 8; + u_plane.tx_callback = NULL; + + transfer_type_info_ptr->queue_cplane_info = c_plane; + transfer_type_info_ptr->queue_uplane_info = u_plane; + break; + case OAM: + c_plane.rx_block_size = 0x100000; + c_plane.rx_block_num = 32; + c_plane.rx_callback = rx_callback_oam; + c_plane.tx_block_size = 0x8000; + c_plane.tx_block_num = 8; + c_plane.tx_callback = NULL; + + transfer_type_info_ptr->queue_cplane_info = c_plane; + break; + default: + UCP_PRINT_ERROR("get_msg_queue_cfg doesn't support transfer_type[%d] .",transfer_type); + break; + } + + return; +} + +static inline void msg_transfer_cfg(void) +{ + uint8_t port_id = 0; + uint16_t inst_id = 0; + uint16_t transfer_type = 0; + int32_t handle_id = 0; + transfer_type_info_s transfer_type_info; + + for (inst_id=0; inst_idpSyncInfo->queueCfgFlag = ++pMsgQueueLocalMgt->localSyncInfo.queueCfgFlag; + + return; +} + +static inline void msg_transfer_queue_polling(void) +{ + uint8_t port_id = 0; + HandleId_t handler; + uint16_t cu_flag; + uint32_t offset = 0; + uint32_t len = 0; + uint8_t* msg_ptr; + + for (uint32_t i = 0; i < MAX_INSTANCE_NUM; i++) { + //for (uint32_t i = 0; i < 4; i++) { + handler.port_id = port_id; + handler.inst_id = i; + handler.type_id = CU_SPLIT; + cu_flag = C_PLANE; + msg_transfer_receive(handler.value, cu_flag, offset, len, &msg_ptr); + + cu_flag = U_PLANE; + msg_transfer_receive(handler.value, cu_flag, offset, len, &msg_ptr); + + handler.type_id = OAM; + msg_transfer_receive(handler.value, cu_flag, offset, len, &msg_ptr); + } + + return; +} + +#define CELL_SETUP_TYPE_SIMULATION (0x5a6b7c8d) + +void cell_setup_simulation(uint8_t scs_id, uint8_t cell_id, uint32_t run_core, uint8_t frame_type) +{ + uint32_t size = 32; + char* buf; + uint32_t availableSize,offset; + + uint16_t cu_flag = C_PLANE; + HandleId_t handler; + handler.port_id = 0; + handler.inst_id = 0; + handler.type_id = CU_SPLIT; + + int32_t ret = msg_transfer_send_start(handler.value,cu_flag); + + /************C_PLANE***************/ + ret = msg_transfer_alloc_msg(handler.value, cu_flag, size, &buf, &availableSize, &offset); + if ( SUCCESS != ret) { + UCP_PRINT_ERROR("cell_setup_simulation call msg_transfer_alloc_msg err."); + return ; + //continue; + } + UCP_PRINT_DEBUG("availableSize = 0x%x.", availableSize); + UCP_PRINT_DEBUG("offset = 0x%x.", offset); + + *(uint32_t*)(buf + 0) = CELL_SETUP_TYPE_SIMULATION; + *(uint32_t*)(buf + 4) = read_stc_local_timer(); + *(uint32_t*)(buf + 12) = 0; // build cell + *(uint32_t*)(buf + 16) = scs_id; + *(uint32_t*)(buf + 20) = cell_id; + *(uint32_t*)(buf + 24) = run_core; + *(uint32_t*)(buf + 28) = frame_type; + + ret = msg_transfer_send_msg(handler.value, cu_flag, (uint8_t *)buf, offset, size); + ret = msg_transfer_send_end(handler.value,cu_flag); + + return; +} + +int32_t test_case(uint32_t argc, int32_t* argvp) +{ + UCP_PRINT_DEBUG("start running testcase 22 (8 ape 15K case)."); + + osp_read_spe_cfg_file("/ramfs/cfgDat"); + + msg_transfer_mem_init(); + msg_transfer_cfg(); + ucp_handshake(); + + UCP_PRINT_DEBUG("start transfering message."); + + uint32_t size = 100; + char* buf; + uint32_t availableSize,offset; + uint8_t* ptr; + uint8_t u8_cell_flag = 0; + + uint16_t cu_flag = C_PLANE; + HandleId_t handler; + handler.port_id = 0; + handler.inst_id = 0; + handler.type_id = CU_SPLIT; + + int32_t ret; + uint8_t scs_id = 0; // LTE + uint8_t cell_id = 0; + uint32_t run_ape = 0x3; + uint8_t frame_type = 1; // tdd + + cell_setup_simulation(scs_id, cell_id, run_ape, frame_type); /* the first cell */ + UCP_PRINT_DEBUG("call cell setup(1)"); + + while(1) + { + if ((100000 == gu32_rx_callback_data_cnt) && (0 == u8_cell_flag)) + { + /* 1st cell build ok after 10s */ + scs_id = 0; // LTE + cell_id = 1; + run_ape = 0xC; + frame_type = 1; // tdd + cell_setup_simulation(scs_id, cell_id, run_ape, frame_type); /* the second cell */ + u8_cell_flag = 1; + UCP_PRINT_DEBUG("call cell setup(2)"); + } + if ((200000 == gu32_rx_callback_data_cnt) && (1 == u8_cell_flag)) + { + /* 1st cell build ok after 10s */ + scs_id = 0; // LTE + cell_id = 2; + run_ape = 0x30; + frame_type = 1; // tdd + cell_setup_simulation(scs_id, cell_id, run_ape, frame_type); /* the second cell */ + u8_cell_flag = 2; + UCP_PRINT_DEBUG("call cell setup(3)"); + } + if ((300000 == gu32_rx_callback_data_cnt) && (2 == u8_cell_flag)) + { + /* 1st cell build ok after 10s */ + scs_id = 0; // LTE + cell_id = 3; + run_ape = 0xC0; + frame_type = 1; // tdd + cell_setup_simulation(scs_id, cell_id, run_ape, frame_type); /* the second cell */ + u8_cell_flag = 3; + UCP_PRINT_DEBUG("call cell setup(4)"); + } + + msg_transfer_queue_polling(); + + if ((1 == slot_ind_flag) || (1 == gu32_rx1_slot_ind_flag) || (1 == gu32_rx2_slot_ind_flag) || (1 == gu32_rx3_slot_ind_flag)) + { + if(1 == slot_ind_flag) + { + slot_ind_flag = 0; + + handler.inst_id = 0; + } + if (1 == gu32_rx1_slot_ind_flag) + { + gu32_rx1_slot_ind_flag = 0; + + handler.inst_id = 1; + } + if (1 == gu32_rx2_slot_ind_flag) + { + gu32_rx2_slot_ind_flag = 0; + + handler.inst_id = 2; + } + if (1 == gu32_rx3_slot_ind_flag) + { + gu32_rx3_slot_ind_flag = 0; + + handler.inst_id = 3; + } + /************C_PLANE***************/ + cu_flag = C_PLANE; + ret = msg_transfer_send_start(handler.value,cu_flag); + + ret = msg_transfer_alloc_msg(handler.value, cu_flag, size, &buf, &availableSize, &offset); + if ( SUCCESS != ret) { + UCP_PRINT_ERROR("1,c_plane alloc error\r\n"); + continue; + } + + ptr = (uint8_t *)buf; + *(uint32_t*)(ptr + 0) = gu32_value; + *(uint32_t*)(ptr + 4) = gu32_tick_from_tx_ctrl; + *(uint32_t*)(ptr + 8) = gu32_tick_receive_ctrl; + *(uint32_t*)(ptr + 12) = read_stc_local_timer(); + + ret = msg_transfer_send_msg(handler.value, cu_flag, (uint8_t *)buf, offset, size); + if ( SUCCESS != ret) { + UCP_PRINT_ERROR("1,c_plane send error\r\n"); + } + + ret = msg_transfer_send_end(handler.value,cu_flag); + + /************U_PLANE***************/ + cu_flag = U_PLANE; + ret = msg_transfer_send_start(handler.value,cu_flag); + + ret = msg_transfer_alloc_msg(handler.value, cu_flag, size, &buf, &availableSize, &offset); + if ( SUCCESS != ret) { + UCP_PRINT_ERROR("1,u_plane alloc error\r\n"); + continue; + } + + ptr = (uint8_t *)buf; + *(uint32_t*)(ptr + 0) = gu32_value; + *(uint32_t*)(ptr + 4) = gu32_tick_from_tx_ctrl; + *(uint32_t*)(ptr + 8) = gu32_tick_receive_ctrl; + *(uint32_t*)(ptr + 12) = read_stc_local_timer(); + + ret = msg_transfer_send_msg(handler.value, cu_flag, (uint8_t *)buf, offset, size); + if ( SUCCESS != ret) { + UCP_PRINT_ERROR("1,u_plane send error\r\n"); + } + + ret = msg_transfer_send_end(handler.value,cu_flag); + } + } + return 0; +} +