diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index c2e3e56bb297eabfe27aba7baa803ae8732abf82..94ff4b239a4a91c6359f687d5b2248e57d604c96 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -37,11 +37,6 @@ set (OPENAIR_BIN_DIR ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}) project (OpenAirInterface) -#add_definitions("-DEMIT_ASN_DEBUG=1") -add_subdirectory(${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms7002m lms7002m) -add_subdirectory(${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR lmsSDR) -add_subdirectory(${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/Si5351C Si5351C) - ########################################### # macros to define options as there is numerous options in oai ################################################ @@ -512,7 +507,7 @@ set(HWLIB_BLADERF_SOURCE add_library(oai_bladerfdevif MODULE ${HWLIB_BLADERF_SOURCE} ) include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/") -set (option_HWLMSSDRLIB_lib "-l LMS_SDR -l LMS7002M -l Si5351C") + set(HWLIB_LMSSDR_SOURCE ${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp ) @@ -559,16 +554,14 @@ elseif (${RF_BOARD} STREQUAL "OAI_BLADERF") elseif (${RF_BOARD} STREQUAL "OAI_LMSSDR") include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB") - include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR") - include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms7002m") - include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/Si5351C") - include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard") + include_directories("/usr/local/include/lime") + include_directories("/usr/include/lime") LINK_DIRECTORIES("/usr/lib/x86_64-linux-gnu") LINK_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/lmsSDR") LINK_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/lms7002m") LINK_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/Si5351C") set(HW_SOURCE ${HW_SOURCE} ${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp) - set(option_HW_lib "-lLMS_SDR -lLMS7002M -lSi5351C -rdynamic -ldl") + set(option_HW_lib "-lLimeSuite -rdynamic -ldl") elseif (${RF_BOARD} STREQUAL "CPRIGW") set(HW_SOURCE ${HW_SOURCE} @@ -1845,14 +1838,6 @@ Message("-- HW_SOURCE=${HW_SOURCE}") Message("-- option_TP_lib=${option_TP_lib}") Message("-- TRANSPORT_SOURCE=${TRANSPORT_SOURCE}") -if (${RF_BOARD} STREQUAL "OAI_LMSSDR") - add_dependencies(lte-softmodem LMS7002M LMS_SDR Si5351C) - add_dependencies(lte-softmodem-nos1 LMS7002M LMS_SDR Si5351C) - add_dependencies(rrh_gw LMS7002M LMS_SDR Si5351C) -endif (${RF_BOARD} STREQUAL "OAI_LMSSDR") - - - # USIM process ################# #add_executable(usim diff --git a/cmake_targets/autotests/v2/actions/execution.bash b/cmake_targets/autotests/v2/actions/execution.bash index 503b6b963d8f29e0204915ca398b2f6bc198ccce..0e05014888ccb5cefc1900e79d3df3622bc2dbcb 100644 --- a/cmake_targets/autotests/v2/actions/execution.bash +++ b/cmake_targets/autotests/v2/actions/execution.bash @@ -1,2 +1,4 @@ +cd /tmp/oai_test_setup/oai +source oaienv echo $EXEC $EXEC_ARGS $EXEC $EXEC_ARGS diff --git a/cmake_targets/autotests/v2/main.py b/cmake_targets/autotests/v2/main.py index a006a63d141e2f2403dcbc302599ebb0e85b3a4f..6cf3b97c3608579706058f0ba465c84f86fbb734 100644 --- a/cmake_targets/autotests/v2/main.py +++ b/cmake_targets/autotests/v2/main.py @@ -233,7 +233,7 @@ class ExecutionThread(threading.Thread): for arg in args.splitlines(): i = i+1 runenv2 = list(runenv) - runenv2.append('OPENAIR_TARGET=/tmp/oai_test_setup/oai/targets') + runenv2.append('OPENAIR_TARGETS=/tmp/oai_test_setup/oai/targets') runenv2.append('EXEC="' + test.findtext('main_exec') + '"') diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai index 0a64c0a672b416bdb2ed991ce60d051c42c3a026..b6f2d2c6c562496cbb459114cd323fb49a63cfed 100755 --- a/cmake_targets/build_oai +++ b/cmake_targets/build_oai @@ -661,9 +661,9 @@ function main() { CMakeFiles/nasmesh/nasmesh.ko $dbin/nasmesh.ko #oai_nw_drv - compilations \ - $oaisim_build_dir oai_nw_drv \ - CMakeFiles/oai_nw_drv/oai_nw_drv.ko $dbin/oai_nw_drv.ko + #compilations \ + # $oaisim_build_dir oai_nw_drv \ + # CMakeFiles/oai_nw_drv/oai_nw_drv.ko $dbin/oai_nw_drv.ko fi cmake_file=$DIR/oaisim_mme_build_oai/CMakeLists.txt diff --git a/cmake_targets/tools/init_nas_s1 b/cmake_targets/tools/init_nas_s1 new file mode 100644 index 0000000000000000000000000000000000000000..5f27c5283741a122fadce4cb0c94ca0b05af58bd --- /dev/null +++ b/cmake_targets/tools/init_nas_s1 @@ -0,0 +1,71 @@ +#!/bin/bash + +#WARNING: this file may not work properly, be sure to know what you +#do when using it + +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + +################################################################################ +# file init_nas_s1 +# brief loads the ue_ip module and sets up IP for the UE +# you may want to edit it to fit your settings (replace oip0 by oipX for +# instance) +# author Florian Kaltenberger +# +####################################### + +LTEIF=oip0 +#OPENAIR_DIR=/home/oai/svn-oai/openair4G + +load_module() { + mod_name=${1##*/} + mod_name=${mod_name%.*} + if awk "/$mod_name/ {found=1 ;exit} END {if (found!=1) exit 1}" /proc/modules + then + echo "module $mod_name already loaded: I remove it first" + sudo rmmod $mod_name + fi + echo loading $mod_name + sudo insmod $1 +} + +load_module $OPENAIR_DIR/targets/bin/ue_ip.ko + +if [ "$1" = "UE" ]; then + echo "bring up oip0 interface for UE" + ifconfig oip0 up +fi + +ip route flush cache +sleep 1 +sysctl -w net.ipv4.conf.all.log_martians=1 +echo "Disabling reverse path filtering" +sysctl -w net.ipv4.conf.all.rp_filter=0 +ip route flush cache + +# Check table 200 lte in /etc/iproute2/rt_tables +fgrep lte /etc/iproute2/rt_tables > /dev/null +if [ $? -ne 0 ]; then + echo "200 lte " >> /etc/iproute2/rt_tables +fi +ip rule add fwmark 1 table lte +ip route add default dev $LTEIF table lte diff --git a/common/utils/itti/itti_types.h b/common/utils/itti/itti_types.h index 8cf0d7a58146e4da8dbc73897658f95f5b1d6551..e5bbf448308cbaba0976c63bb819c81f38882274 100644 --- a/common/utils/itti/itti_types.h +++ b/common/utils/itti/itti_types.h @@ -71,7 +71,5 @@ typedef struct { #define INSTANCE_DEFAULT (UINT16_MAX - 1) #define INSTANCE_ALL (UINT16_MAX) -typedef uint16_t instance_t; - #endif diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index 17338d85b531b89f7d8993689b3ef3340bd8fc56..f6f8d8f858cfc5e9c8a46927a0555b47456081c2 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -29,7 +29,7 @@ #include "LAYER2/MAC/extern.h" #include "MBSFN-SubframeConfigList.h" #include "UTIL/LOG/vcd_signal_dumper.h" -//#define DEBUG_PHY +#define DEBUG_PHY #include "assertions.h" #include <math.h> @@ -211,7 +211,7 @@ void phy_config_sib2_eNB(uint8_t Mod_id, if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame) { fp->MBSFN_config[i].fourFrames_flag = 0; fp->MBSFN_config[i].mbsfn_SubframeConfig = mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]; // 6-bit subframe configuration - LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %ld\n", i, + LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %d\n", i, fp->MBSFN_config[i].mbsfn_SubframeConfig); } else if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_fourFrames) { // 24-bit subframe configuration fp->MBSFN_config[i].fourFrames_flag = 1; @@ -220,7 +220,7 @@ void phy_config_sib2_eNB(uint8_t Mod_id, (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[1]<<8)| (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[2]<<16); - LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %ld\n", i, + LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %d\n", i, fp->MBSFN_config[i].mbsfn_SubframeConfig); } } @@ -331,7 +331,7 @@ void phy_config_sib2_ue(uint8_t Mod_id,int CC_id, if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame) { fp->MBSFN_config[i].fourFrames_flag = 0; fp->MBSFN_config[i].mbsfn_SubframeConfig = mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]; // 6-bit subframe configuration - LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %ld\n", i, + LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %d\n", i, fp->MBSFN_config[i].mbsfn_SubframeConfig); } else if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_fourFrames) { // 24-bit subframe configuration fp->MBSFN_config[i].fourFrames_flag = 1; @@ -340,7 +340,7 @@ void phy_config_sib2_ue(uint8_t Mod_id,int CC_id, (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[1]<<8)| (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[2]<<16); - LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %ld\n", i, + LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %d\n", i, fp->MBSFN_config[i].mbsfn_SubframeConfig); } } @@ -357,7 +357,7 @@ void phy_config_sib13_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id,int mbsfn_Area_ LTE_DL_FRAME_PARMS *fp = &PHY_vars_UE_g[Mod_id][CC_id]->frame_parms; - LOG_I(PHY,"[UE%d] Applying MBSFN_Area_id %d for index %d\n",Mod_id,mbsfn_AreaId_r9,mbsfn_Area_idx); + LOG_I(PHY,"[UE%d] Applying MBSFN_Area_id %ld for index %d\n",Mod_id,mbsfn_AreaId_r9,mbsfn_Area_idx); if (mbsfn_Area_idx == 0) { fp->Nid_cell_mbsfn = (uint16_t)mbsfn_AreaId_r9; @@ -376,7 +376,7 @@ void phy_config_sib13_eNB(uint8_t Mod_id,int CC_id,int mbsfn_Area_idx, LTE_DL_FRAME_PARMS *fp = &PHY_vars_eNB_g[Mod_id][CC_id]->frame_parms; - LOG_I(PHY,"[eNB%d] Applying MBSFN_Area_id %d for index %d\n",Mod_id,mbsfn_AreaId_r9,mbsfn_Area_idx); + LOG_I(PHY,"[eNB%d] Applying MBSFN_Area_id %ld for index %d\n",Mod_id,mbsfn_AreaId_r9,mbsfn_Area_idx); if (mbsfn_Area_idx == 0) { fp->Nid_cell_mbsfn = (uint16_t)mbsfn_AreaId_r9; @@ -398,7 +398,7 @@ void phy_config_dedicated_eNB_step2(PHY_VARS_eNB *eNB) physicalConfigDedicated = eNB->physicalConfigDedicated[UE_id]; if (physicalConfigDedicated != NULL) { - LOG_I(PHY,"[eNB %d] Frame %d: Sent physicalConfigDedicated=%p for UE %d\n",eNB->Mod_id,physicalConfigDedicated,UE_id); + LOG_I(PHY,"[eNB %d] Sent physicalConfigDedicated=%p for UE %d\n",eNB->Mod_id,physicalConfigDedicated,UE_id); LOG_D(PHY,"------------------------------------------------------------------------\n"); if (physicalConfigDedicated->pdsch_ConfigDedicated) { @@ -653,7 +653,7 @@ void phy_config_dedicated_eNB(uint8_t Mod_id, int8_t UE_id = find_ue(rnti,eNB); if (UE_id == -1) { - LOG_E( PHY, "[eNB %"PRIu8"] find_ue() returns -1\n"); + LOG_E( PHY, "[eNB %"PRIu8"] find_ue() returns -1\n", Mod_id); return; } @@ -684,6 +684,7 @@ void phy_config_dedicated_eNB(uint8_t Mod_id, break; case AntennaInfoDedicated__transmissionMode_tm7: lte_gold_ue_spec_port5(eNB->lte_gold_uespec_port5_table[0],eNB->frame_parms.Nid_cell,rnti); + eNB->do_precoding = 1; eNB->transmission_mode[UE_id] = 7; break; default: @@ -725,13 +726,13 @@ void phy_config_dedicated_scell_eNB(uint8_t Mod_id, if ((dl_CarrierFreq_r10>=36000) && (dl_CarrierFreq_r10<=36199)) { carrier_freq_local = 1900000000 + (dl_CarrierFreq_r10-36000)*100000; //band 33 from 3GPP 36.101 v 10.9 Table 5.7.3-1 - LOG_I(PHY,"[eNB %d] Frame %d: Configured SCell %d to frequency %d (ARFCN %d) for UE %d\n",Mod_id,/*eNB->frame*/0,CC_id,carrier_freq_local,dl_CarrierFreq_r10,UE_id); + LOG_I(PHY,"[eNB %d] Frame %d: Configured SCell %d to frequency %d (ARFCN %ld) for UE %d\n",Mod_id,/*eNB->frame*/0,CC_id,carrier_freq_local,dl_CarrierFreq_r10,UE_id); } else if ((dl_CarrierFreq_r10>=6150) && (dl_CarrierFreq_r10<=6449)) { carrier_freq_local = 832000000 + (dl_CarrierFreq_r10-6150)*100000; //band 20 from 3GPP 36.101 v 10.9 Table 5.7.3-1 // this is actually for the UL only, but we use it for DL too, since there is no TDD mode for this band - LOG_I(PHY,"[eNB %d] Frame %d: Configured SCell %d to frequency %d (ARFCN %d) for UE %d\n",Mod_id,/*eNB->frame*/0,CC_id,carrier_freq_local,dl_CarrierFreq_r10,UE_id); + LOG_I(PHY,"[eNB %d] Frame %d: Configured SCell %d to frequency %d (ARFCN %ld) for UE %d\n",Mod_id,/*eNB->frame*/0,CC_id,carrier_freq_local,dl_CarrierFreq_r10,UE_id); } else { - LOG_E(PHY,"[eNB %d] Frame %d: ARFCN %d of SCell %d for UE %d not supported\n",Mod_id,/*eNB->frame*/0,dl_CarrierFreq_r10,CC_id,UE_id); + LOG_E(PHY,"[eNB %d] Frame %d: ARFCN %ld of SCell %d for UE %d not supported\n",Mod_id,/*eNB->frame*/0,dl_CarrierFreq_r10,CC_id,UE_id); } if (physicalConfigDedicatedSCell_r10) { @@ -1062,7 +1063,8 @@ int phy_init_lte_ue(PHY_VARS_UE *ue, // create shortcuts LTE_DL_FRAME_PARMS* const fp = &ue->frame_parms; LTE_UE_COMMON* const common_vars = &ue->common_vars; - LTE_UE_PDSCH** const pdsch_vars = ue->pdsch_vars; + LTE_UE_PDSCH** const pdsch_vars_th0 = ue->pdsch_vars[0]; + LTE_UE_PDSCH** const pdsch_vars_th1 = ue->pdsch_vars[1]; LTE_UE_PDSCH** const pdsch_vars_SI = ue->pdsch_vars_SI; LTE_UE_PDSCH** const pdsch_vars_ra = ue->pdsch_vars_ra; LTE_UE_PDSCH** const pdsch_vars_mch = ue->pdsch_vars_MCH; @@ -1115,32 +1117,37 @@ int phy_init_lte_ue(PHY_VARS_UE *ue, // init RX buffers common_vars->rxdata = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); - common_vars->rxdataF = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); - common_vars->rxdataF2 = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); + common_vars->common_vars_rx_data_per_thread[0].rxdataF = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); + common_vars->common_vars_rx_data_per_thread[1].rxdataF = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); for (i=0; i<fp->nb_antennas_rx; i++) { common_vars->rxdata[i] = (int32_t*) malloc16_clear( (fp->samples_per_tti*10+2048)*sizeof(int32_t) ); - common_vars->rxdataF[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->ofdm_symbol_size*14) ); - common_vars->rxdataF2[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->ofdm_symbol_size*fp->symbols_per_tti*10) ); + common_vars->common_vars_rx_data_per_thread[0].rxdataF[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->ofdm_symbol_size*14) ); + common_vars->common_vars_rx_data_per_thread[1].rxdataF[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->ofdm_symbol_size*14) ); } } // Channel estimates for (eNB_id=0; eNB_id<7; eNB_id++) { - common_vars->dl_ch_estimates[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*)); - common_vars->dl_ch_estimates_time[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*)); + common_vars->common_vars_rx_data_per_thread[0].dl_ch_estimates[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*)); + common_vars->common_vars_rx_data_per_thread[1].dl_ch_estimates[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*)); + common_vars->common_vars_rx_data_per_thread[0].dl_ch_estimates_time[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*)); + common_vars->common_vars_rx_data_per_thread[1].dl_ch_estimates_time[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*)); for (i=0; i<fp->nb_antennas_rx; i++) for (j=0; j<4; j++) { int idx = (j<<1) + i; - common_vars->dl_ch_estimates[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->symbols_per_tti*(fp->ofdm_symbol_size+LTE_CE_FILTER_LENGTH) ); - common_vars->dl_ch_estimates_time[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2 ); + common_vars->common_vars_rx_data_per_thread[0].dl_ch_estimates[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->symbols_per_tti*(fp->ofdm_symbol_size+LTE_CE_FILTER_LENGTH) ); + common_vars->common_vars_rx_data_per_thread[1].dl_ch_estimates[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->symbols_per_tti*(fp->ofdm_symbol_size+LTE_CE_FILTER_LENGTH) ); + common_vars->common_vars_rx_data_per_thread[0].dl_ch_estimates_time[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2 ); + common_vars->common_vars_rx_data_per_thread[1].dl_ch_estimates_time[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2 ); } } // DLSCH for (eNB_id=0; eNB_id<ue->n_connected_eNB; eNB_id++) { - pdsch_vars[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH)); + pdsch_vars_th0[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH)); + pdsch_vars_th1[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH)); pdsch_vars_SI[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH)); pdsch_vars_ra[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH)); pdsch_vars_mch[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH)); @@ -1149,25 +1156,43 @@ int phy_init_lte_ue(PHY_VARS_UE *ue, pbch_vars[eNB_id] = (LTE_UE_PBCH *)malloc16_clear(sizeof(LTE_UE_PBCH)); if (abstraction_flag == 0) { - phy_init_lte_ue__PDSCH( pdsch_vars[eNB_id], fp ); + phy_init_lte_ue__PDSCH( pdsch_vars_th0[eNB_id], fp ); + phy_init_lte_ue__PDSCH( pdsch_vars_th1[eNB_id], fp ); - pdsch_vars[eNB_id]->llr_shifts = (uint8_t*)malloc16_clear(7*2*fp->N_RB_DL*12); - pdsch_vars[eNB_id]->llr_shifts_p = pdsch_vars[eNB_id]->llr_shifts; - pdsch_vars[eNB_id]->dl_ch_mag1 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - pdsch_vars[eNB_id]->dl_ch_magb1 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - pdsch_vars[eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); + // thread 0 + pdsch_vars_th0[eNB_id]->llr_shifts = (uint8_t*)malloc16_clear(7*2*fp->N_RB_DL*12); + pdsch_vars_th0[eNB_id]->llr_shifts_p = pdsch_vars_th0[eNB_id]->llr_shifts; + pdsch_vars_th0[eNB_id]->dl_ch_mag1 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + pdsch_vars_th0[eNB_id]->dl_ch_magb1 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + pdsch_vars_th0[eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); for (k=0; k<8; k++) - pdsch_vars[eNB_id]->rxdataF_comp1[k] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + pdsch_vars_th0[eNB_id]->rxdataF_comp1[k] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + + // thread 1 + pdsch_vars_th1[eNB_id]->llr_shifts = (uint8_t*)malloc16_clear(7*2*fp->N_RB_DL*12); + pdsch_vars_th1[eNB_id]->llr_shifts_p = pdsch_vars_th1[eNB_id]->llr_shifts; + pdsch_vars_th1[eNB_id]->dl_ch_mag1 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + pdsch_vars_th1[eNB_id]->dl_ch_magb1 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + pdsch_vars_th1[eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); + + for (k=0; k<8; k++) + pdsch_vars_th1[eNB_id]->rxdataF_comp1[k] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); for (i=0; i<fp->nb_antennas_rx; i++) for (j=0; j<4; j++) { int idx = (j<<1)+i; - pdsch_vars[eNB_id]->dl_ch_mag1[idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) ); - pdsch_vars[eNB_id]->dl_ch_magb1[idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) ); + pdsch_vars_th0[eNB_id]->dl_ch_mag1[idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) ); + pdsch_vars_th0[eNB_id]->dl_ch_magb1[idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) ); + + pdsch_vars_th1[eNB_id]->dl_ch_mag1[idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) ); + pdsch_vars_th1[eNB_id]->dl_ch_magb1[idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) ); for (k=0; k<8; k++) - pdsch_vars[eNB_id]->rxdataF_comp1[idx][k] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->N_RB_DL*12*14) ); + { + pdsch_vars_th0[eNB_id]->rxdataF_comp1[idx][k] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->N_RB_DL*12*14) ); + pdsch_vars_th1[eNB_id]->rxdataF_comp1[idx][k] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->N_RB_DL*12*14) ); + } } phy_init_lte_ue__PDSCH( pdsch_vars_SI[eNB_id], fp ); @@ -1224,14 +1249,17 @@ int phy_init_lte_ue(PHY_VARS_UE *ue, // initialization for the last instance of pdsch_vars (used for MU-MIMO) - pdsch_vars[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear( sizeof(LTE_UE_PDSCH) ); + pdsch_vars_th0[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear( sizeof(LTE_UE_PDSCH) ); + pdsch_vars_th1[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear( sizeof(LTE_UE_PDSCH) ); pdsch_vars_SI[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear( sizeof(LTE_UE_PDSCH) ); pdsch_vars_ra[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear( sizeof(LTE_UE_PDSCH) ); if (abstraction_flag == 0) { - phy_init_lte_ue__PDSCH( pdsch_vars[eNB_id], fp ); - pdsch_vars[eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); + phy_init_lte_ue__PDSCH( pdsch_vars_th0[eNB_id], fp ); + pdsch_vars_th0[eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); + phy_init_lte_ue__PDSCH( pdsch_vars_th1[eNB_id], fp ); + pdsch_vars_th1[eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); } else { //abstraction == 1 ue->sinr_dB = (double*) malloc16_clear( fp->N_RB_DL*12*sizeof(double) ); } @@ -1304,49 +1332,54 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, common_vars->txdataF[eNB_id] = (int32_t **)malloc16(NB_ANTENNA_PORTS_ENB*sizeof(int32_t*)); common_vars->txdataF_BF[eNB_id] = (int32_t **)malloc16(fp->nb_antennas_tx*sizeof(int32_t*)); - for (i=0; i<14; i++) { - common_vars->txdataF[eNB_id][i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*fp->symbols_per_tti*10*sizeof(int32_t) ); + if (eNB->node_function != NGFI_RRU_IF5) { + for (i=0; i<NB_ANTENNA_PORTS_ENB; i++) { + if (i<fp->nb_antenna_ports_eNB || i==5) { + common_vars->txdataF[eNB_id][i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*fp->symbols_per_tti*10*sizeof(int32_t) ); #ifdef DEBUG_PHY - msg("[openair][LTE_PHY][INIT] lte_common_vars->txdataF[%d][%d] = %p (%d bytes)\n", - eNB_id,i,common_vars->txdataF[eNB_id][i], - fp->ofdm_symbol_size*fp->symbols_per_tti*10*sizeof(int32_t)); + printf("[openair][LTE_PHY][INIT] common_vars->txdataF[%d][%d] = %p (%lu bytes)\n", + eNB_id,i,common_vars->txdataF[eNB_id][i], + fp->ofdm_symbol_size*fp->symbols_per_tti*10*sizeof(int32_t)); #endif + } + } } - for (i=0; i<fp->nb_antennas_tx; i++) { common_vars->txdataF_BF[eNB_id][i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*sizeof(int32_t) ); if (eNB->node_function != NGFI_RCC_IF4p5) - common_vars->txdata[eNB_id][i] = (int32_t*)malloc16_clear(fp->samples_per_tti*10*sizeof(int32_t) ); + + // Allocate 10 subframes of I/Q TX signal data (time) if not + common_vars->txdata[eNB_id][i] = (int32_t*)malloc16_clear( fp->samples_per_tti*10*sizeof(int32_t) ); #ifdef DEBUG_PHY - msg("[openair][LTE_PHY][INIT] lte_common_vars->txdataF_BF[%d][%d] = %p (%d bytes)\n", - eNB_id,i,common_vars->txdataF_BF[eNB_id][i], - fp->ofdm_symbol_size*sizeof(int32_t)); - msg("[openair][LTE_PHY][INIT] lte_common_vars->txdata[%d][%d] = %p\n",eNB_id,i,common_vars->txdata[eNB_id][i]); + printf("[openair][LTE_PHY][INIT] common_vars->txdata[%d][%d] = %p (%lu bytes)\n",eNB_id,i,common_vars->txdata[eNB_id][i], + fp->samples_per_tti*10*sizeof(int32_t)); #endif } - for (i=0; i<14; i++) { // 14 is the total number of antenna ports - common_vars->beam_weights[eNB_id][i] = (int32_t **)malloc16_clear(fp->nb_antennas_tx*sizeof(int32_t*)); - for (j=0; j<fp->nb_antennas_tx; j++) { - common_vars->beam_weights[eNB_id][i][j] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*sizeof(int32_t)); - // antenna ports 0-3 are mapped on antennas 0-3 - // antenna port 4 is mapped on antenna 0 - // antenna ports 5-14 are mapped on all antennas - if (((i<4) && (i==j)) || ((i==4) && (j==0))) { - for (re=0; re<fp->ofdm_symbol_size; re++) - common_vars->beam_weights[eNB_id][i][j][re] = 0x00007fff; - } - else if (i>4) { - for (re=0; re<fp->ofdm_symbol_size; re++) - common_vars->beam_weights[eNB_id][i][j][re] = 0x00007fff/fp->nb_antennas_tx; - } + for (i=0; i<NB_ANTENNA_PORTS_ENB; i++) { + if (i<fp->nb_antenna_ports_eNB || i==5) { + common_vars->beam_weights[eNB_id][i] = (int32_t **)malloc16_clear(fp->nb_antennas_tx*sizeof(int32_t*)); + for (j=0; j<fp->nb_antennas_tx; j++) { + common_vars->beam_weights[eNB_id][i][j] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*sizeof(int32_t)); + // antenna ports 0-3 are mapped on antennas 0-3 + // antenna port 4 is mapped on antenna 0 + // antenna ports 5-14 are mapped on all antennas + if (((i<4) && (i==j)) || ((i==4) && (j==0))) { + for (re=0; re<fp->ofdm_symbol_size; re++) + common_vars->beam_weights[eNB_id][i][j][re] = 0x00007fff; + } + else if (i>4) { + for (re=0; re<fp->ofdm_symbol_size; re++) + common_vars->beam_weights[eNB_id][i][j][re] = 0x00007fff/fp->nb_antennas_tx; + } #ifdef DEBUG_PHY - msg("[openair][LTE_PHY][INIT] lte_common_vars->beam_weights[%d][%d][%d] = %p (%d bytes)\n", - eNB_id,i,j,common_vars->beam_weights[eNB_id][i][j], - fp->ofdm_symbol_size*sizeof(int32_t)); + msg("[openair][LTE_PHY][INIT] lte_common_vars->beam_weights[%d][%d][%d] = %p (%d bytes)\n", + eNB_id,i,j,common_vars->beam_weights[eNB_id][i][j], + fp->ofdm_symbol_size*sizeof(int32_t)); #endif - } + } + } } // RX vars @@ -1358,17 +1391,25 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, for (i=0; i<fp->nb_antennas_rx; i++) { if (eNB->node_function != NGFI_RCC_IF4p5) { + // allocate 2 subframes of I/Q signal data (time) if not an RCC (no time-domain signals) common_vars->rxdata[eNB_id][i] = (int32_t*)malloc16_clear( fp->samples_per_tti*10*sizeof(int32_t) ); - common_vars->rxdata_7_5kHz[eNB_id][i] = (int32_t*)malloc16_clear( fp->samples_per_tti*sizeof(int32_t) ); + + if (eNB->node_function != NGFI_RRU_IF5) + // allocate 2 subframes of I/Q signal data (time, 7.5 kHz offset) + common_vars->rxdata_7_5kHz[eNB_id][i] = (int32_t*)malloc16_clear( 2*fp->samples_per_tti*2*sizeof(int32_t) ); + } + if (eNB->node_function != NGFI_RRU_IF5) + // allocate 2 subframes of I/Q signal data (frequency) + common_vars->rxdataF[eNB_id][i] = (int32_t*)malloc16_clear(sizeof(int32_t)*(2*fp->ofdm_symbol_size*fp->symbols_per_tti) ); #ifdef DEBUG_PHY - printf("[openair][LTE_PHY][INIT] common_vars->rxdata[%d][%d] = %p\n",eNB_id,i,common_vars->rxdata[eNB_id][i]); - printf("[openair][LTE_PHY][INIT] common_vars->rxdata_7_5kHz[%d][%d] = %p\n",eNB_id,i,common_vars->rxdata_7_5kHz[eNB_id][i]); + printf("[openair][LTE_PHY][INIT] common_vars->rxdata[%d][%d] = %p (%lu bytes)\n",eNB_id,i,common_vars->rxdata[eNB_id][i],fp->samples_per_tti*10*sizeof(int32_t)); + if (eNB->node_function != NGFI_RRU_IF5) + printf("[openair][LTE_PHY][INIT] common_vars->rxdata_7_5kHz[%d][%d] = %p (%lu bytes)\n",eNB_id,i,common_vars->rxdata_7_5kHz[eNB_id][i],fp->samples_per_tti*2*sizeof(int32_t)); #endif - } common_vars->rxdataF[eNB_id][i] = (int32_t*)malloc16_clear(sizeof(int32_t)*(fp->ofdm_symbol_size*fp->symbols_per_tti) ); } - if (eNB->node_function != NGFI_RRU_IF4p5) { + if ((eNB->node_function != NGFI_RRU_IF4p5)&&(eNB->node_function != NGFI_RRU_IF5)) { // Channel estimates for SRS for (UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) { @@ -1383,7 +1424,8 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, common_vars->sync_corr[eNB_id] = (uint32_t*)malloc16_clear( LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(uint32_t)*fp->samples_per_tti ); } - } else { //UPLINK abstraction = 1 + } // abstraction_flag = 0 + else { //UPLINK abstraction = 1 eNB->sinr_dB = (double*) malloc16_clear( fp->N_RB_DL*12*sizeof(double) ); } } //eNB_id @@ -1391,7 +1433,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, if (abstraction_flag==0) { - if (eNB->node_function != NGFI_RRU_IF4p5) { + if ((eNB->node_function != NGFI_RRU_IF4p5)&&(eNB->node_function != NGFI_RRU_IF5)) { generate_ul_ref_sigs_rx(); // SRS @@ -1405,7 +1447,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, // ULSCH VARS, skip if NFGI_RRU_IF4 - if (eNB->node_function!=NGFI_RRU_IF4p5) + if ((eNB->node_function!=NGFI_RRU_IF4p5)&&(eNB->node_function != NGFI_RRU_IF5)) prach_vars->prachF = (int16_t*)malloc16_clear( 1024*2*sizeof(int16_t) ); /* number of elements of an array X is computed as sizeof(X) / sizeof(X[0]) */ @@ -1418,7 +1460,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, #endif } - if (eNB->node_function != NGFI_RRU_IF4p5) { + if ((eNB->node_function != NGFI_RRU_IF4p5)&&(eNB->node_function != NGFI_RRU_IF5)) { AssertFatal(fp->nb_antennas_rx <= sizeof(prach_vars->prach_ifft) / sizeof(prach_vars->prach_ifft[0]), "nb_antennas_rx too large"); for (i=0; i<fp->nb_antennas_rx; i++) { diff --git a/openair1/PHY/INIT/lte_parms.c b/openair1/PHY/INIT/lte_parms.c index cd879b1a90e6634ef02de54d2adea067e6bdb7ee..f0c63df9e6c2caebc13fd5e7b7366c80dc44518a 100644 --- a/openair1/PHY/INIT/lte_parms.c +++ b/openair1/PHY/INIT/lte_parms.c @@ -22,6 +22,23 @@ #include "defs.h" #include "log.h" +uint16_t dl_S_table_normal[10]={3,9,10,11,12,3,9,10,11,6}; +uint16_t dl_S_table_extended[10]={3,8,9,10,3,8,9,5,0,0}; + +void set_S_config(LTE_DL_FRAME_PARMS *fp) { + + int X = fp->srsX; + + fp->ul_symbols_in_S_subframe=(1+X); + + if ((fp->Ncp==EXTENDED) && (fp->tdd_config_S>7)) + AssertFatal(1==0,"Illegal S subframe configuration for Extended Prefix mode\n"); + + fp->dl_symbols_in_S_subframe = (fp->Ncp==NORMAL)?dl_S_table_normal[fp->tdd_config_S] : dl_S_table_extended[fp->tdd_config_S]; + + +} + int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf) { @@ -29,7 +46,7 @@ int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf) LOG_I(PHY,"Initializing frame parms for N_RB_DL %d, Ncp %d, osf %d\n",frame_parms->N_RB_DL,frame_parms->Ncp,osf); - if (frame_parms->Ncp==1) { + if (frame_parms->Ncp==EXTENDED) { frame_parms->nb_prefix_samples0=512; frame_parms->nb_prefix_samples = 512; frame_parms->symbols_per_tti = 12; @@ -37,8 +54,10 @@ int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf) frame_parms->nb_prefix_samples0 = 160; frame_parms->nb_prefix_samples = 144; frame_parms->symbols_per_tti = 14; + } + switch(osf) { case 1: log2_osf = 0; @@ -167,6 +186,8 @@ int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf) printf("lte_parms.c: Setting N_RB_DL to %d, ofdm_symbol_size %d\n",frame_parms->N_RB_DL, frame_parms->ofdm_symbol_size); + if (frame_parms->frame_type == TDD) set_S_config(frame_parms); + // frame_parms->tdd_config=3; return(0); } diff --git a/openair1/PHY/LTE_ESTIMATION/defs.h b/openair1/PHY/LTE_ESTIMATION/defs.h index 3af9c2471f140cacdb0a84d8829d976cba237be8..08615119ef613667c78ac6b63aafc3355d79aeef 100644 --- a/openair1/PHY/LTE_ESTIMATION/defs.h +++ b/openair1/PHY/LTE_ESTIMATION/defs.h @@ -34,7 +34,7 @@ */ /*!\brief Timing drift hysterisis in samples*/ -#define SYNCH_HYST 1 +#define SYNCH_HYST 2 /*! \brief This function is used for time-frequency scanning prior to complete cell search. It scans @@ -180,6 +180,7 @@ This function computes the time domain channel response, finds the peak and adju void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms, PHY_VARS_UE *phy_vars_ue, module_id_t eNb_id, + uint8_t subframe, unsigned char clear, short coef); @@ -187,7 +188,8 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms, void lte_ue_measurements(PHY_VARS_UE *phy_vars_ue, unsigned int subframe_offset, unsigned char N0_symbol, - unsigned char abstraction_flag); + unsigned char abstraction_flag, + uint8_t subframe); //! \brief This function performance RSRP/RSCP measurements void ue_rrc_measurements(PHY_VARS_UE *phy_vars_ue, diff --git a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c index 8f9b9cc047638c58e5c70d36ecea40088d4f2ca7..cefa6fd99f91d083914a111642649ab270800680 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c @@ -34,6 +34,7 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms, PHY_VARS_UE *ue, unsigned char eNB_id, + uint8_t subframe, unsigned char clear, short coef) { @@ -48,7 +49,7 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms, ncoef = 32767 - coef; #ifdef DEBUG_PHY - LOG_D(PHY,"frame %d: rx_offset (before) = %d\n",ue->proc.proc_rxtx[0].frame_rx,ue->rx_offset); + LOG_D(PHY,"AbsSubframe %d.%d: rx_offset (before) = %d\n",ue->proc.proc_rxtx[0].frame_rx%1024,subframe,ue->rx_offset); #endif //DEBUG_PHY @@ -57,8 +58,8 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms, temp = 0; for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) { - Re = ((int16_t*)ue->common_vars.dl_ch_estimates_time[eNB_id][aa])[(i<<2)]; - Im = ((int16_t*)ue->common_vars.dl_ch_estimates_time[eNB_id][aa])[1+(i<<2)]; + Re = ((int16_t*)ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates_time[eNB_id][aa])[(i<<2)]; + Im = ((int16_t*)ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates_time[eNB_id][aa])[1+(i<<2)]; temp += (Re*Re/2) + (Im*Im/2); } @@ -74,13 +75,15 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms, else max_pos_fil = ((max_pos_fil * coef) + (max_pos * ncoef)) >> 15; + // do not filter to have proactive timing adjustment + max_pos_fil = max_pos; - diff = max_pos_fil - frame_parms->nb_prefix_samples/8; + diff = max_pos_fil - (frame_parms->nb_prefix_samples>>3); - if ( diff > SYNCH_HYST ) - ue->rx_offset++; - else if (diff < -SYNCH_HYST) - ue->rx_offset--; + if ( abs(diff) < SYNCH_HYST ) + ue->rx_offset = 0; + else + ue->rx_offset = diff; if ( ue->rx_offset < 0 ) ue->rx_offset += FRAME_LENGTH_COMPLEX_SAMPLES; @@ -91,8 +94,8 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms, #ifdef DEBUG_PHY - LOG_D(PHY,"frame %d: rx_offset (after) = %d : max_pos = %d,max_pos_fil = %d (peak %d)\n", - ue->proc.proc_rxtx[0].frame_rx,ue->rx_offset,max_pos,max_pos_fil,temp); + LOG_D(PHY,"AbsSubframe %d.%d: rx_offset (after) = %d : max_pos = %d,max_pos_fil = %d (peak %d) target_pos %d \n", + ue->proc.proc_rxtx[0].frame_rx,subframe,ue->rx_offset,max_pos,max_pos_fil,temp,(frame_parms->nb_prefix_samples>>3)); #endif //DEBUG_PHY VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_OUT); diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_bf_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_bf_channel_estimation.c index 0b220c2c391897a8f5283c450fa75ab5d42232b0..df6a55eaf35560a90f619b01e824e145cea2e212 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_dl_bf_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_bf_channel_estimation.c @@ -70,9 +70,9 @@ int lte_dl_bf_channel_estimation(PHY_VARS_UE *phy_vars_ue, else rballoc = dlsch0_harq->rb_alloc_even; - rxdataF = phy_vars_ue->common_vars.rxdataF; + rxdataF = phy_vars_ue->common_vars.common_vars_rx_data_per_thread[(Ns>>1)&0x1].rxdataF; - dl_bf_ch_estimates = phy_vars_ue->pdsch_vars[eNB_id]->dl_bf_ch_estimates; + dl_bf_ch_estimates = phy_vars_ue->pdsch_vars[(Ns>>1)&0x1][eNB_id]->dl_bf_ch_estimates; beamforming_mode = phy_vars_ue->transmission_mode[eNB_id]>6 ? phy_vars_ue->transmission_mode[eNB_id] : 0; if (phy_vars_ue->high_speed_flag == 0) // use second channel estimate position for temporary storage diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c index 760486933ae19337e16512e2c867096da4e5b68d..b34331eb8d4614d3a13b83c9583b722d89b0d649 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c @@ -44,12 +44,14 @@ int lte_dl_channel_estimation(PHY_VARS_UE *ue, int ch_offset,symbol_offset; // unsigned int n; // int i; + static int interpolateS11S12 = 1; uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1]; uint8_t nushift,pilot1,pilot2,pilot3; - int **dl_ch_estimates=ue->common_vars.dl_ch_estimates[eNB_offset]; - int **rxdataF=ue->common_vars.rxdataF; + int **dl_ch_estimates =ue->common_vars.common_vars_rx_data_per_thread[(Ns>>1)&0x1].dl_ch_estimates[eNB_offset]; + int **dl_ch_estimates_previous=ue->common_vars.common_vars_rx_data_per_thread[((Ns>>1)+1)&0x1].dl_ch_estimates[eNB_offset]; + int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[(Ns>>1)&0x1].rxdataF; if (ue->frame_parms.Ncp == 0) { // normal prefix pilot1 = 4; @@ -638,13 +640,19 @@ int lte_dl_channel_estimation(PHY_VARS_UE *ue, if (symbol == 0) { // printf("Interpolating %d->0\n",4-ue->frame_parms.Ncp); // dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][(4-ue->frame_parms.Ncp)*(ue->frame_parms.ofdm_symbol_size)]; - dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][pilot3*(ue->frame_parms.ofdm_symbol_size)]; + if(((Ns>>1)!=0) || ( ((Ns>>1)==0) && interpolateS11S12)) + { + //LOG_D(PHY,"Interpolate s11-->s0 to get s12 and s13 Ns %d \n", Ns); + dl_ch_prev = (int16_t *)&dl_ch_estimates_previous[(p<<1)+aarx][pilot3*(ue->frame_parms.ofdm_symbol_size)]; - multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),1,ue->frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),0,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),0,ue->frame_parms.ofdm_symbol_size); + } + + interpolateS11S12 = 1; } // this is 1/3,2/3 combination for pilots spaced by 3 symbols else if (symbol == pilot1) { dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][0]; @@ -693,6 +701,38 @@ int lte_dl_channel_estimation(PHY_VARS_UE *ue, multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)<<1),1,ue->frame_parms.ofdm_symbol_size); multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),0,ue->frame_parms.ofdm_symbol_size); } // pilot spacing 3 symbols (1/3,2/3 combination) + + if((ue->rx_offset_diff !=0) && ((Ns>>1) == 9)) + { + //LOG_D(PHY,"Extrapolate s7-->s11 to get s12 and s13 Ns %d\n", Ns); + interpolateS11S12 = 0; + //LOG_E(PHY,"Interpolate s7--s11 s12 s13 pilot 3 Ns %d l %d symbol %d \n", Ns, l, symbol); + int16_t *dlChEst_ofdm11 = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][pilot3*(ue->frame_parms.ofdm_symbol_size)]; + int16_t *dlChEst_ofdm7 = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][pilot2*(ue->frame_parms.ofdm_symbol_size)]; + + // interpolate ofdm s12: 5/4*ofdms11 + -1/4*ofdms7 5/4 q1.15 40960 -1/4 q1.15 8192 + int16_t *dlChEst_ofdm12 = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][12*ue->frame_parms.ofdm_symbol_size]; + for(int i=0; i<(2*ue->frame_parms.ofdm_symbol_size); i++) + { + int64_t tmp_mult = 0; + tmp_mult = ((int64_t)dlChEst_ofdm11[i] * 40960 - (int64_t)dlChEst_ofdm7[i] * 8192); + + tmp_mult = tmp_mult >> 15; + dlChEst_ofdm12[i] = tmp_mult; + } + + // interpolate ofdm s13: 3/2*ofdms11 + -1/2*ofdms7 3/2 q1.15 49152 1/2 q1.15 16384 + int16_t *dlChEst_ofdm13 = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][13*ue->frame_parms.ofdm_symbol_size]; + for(int i=0; i<(2*ue->frame_parms.ofdm_symbol_size); i++) + { + int64_t tmp_mult = 0; + tmp_mult = ((int64_t)dlChEst_ofdm11[i] * 49152 - (int64_t)dlChEst_ofdm7[i] * 16384); + + tmp_mult = tmp_mult >> 15; + dlChEst_ofdm13[i] = tmp_mult; + } + } + } } @@ -734,15 +774,15 @@ int lte_dl_channel_estimation(PHY_VARS_UE *ue, // do ifft of channel estimate for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) for (p=0; p<ue->frame_parms.nb_antenna_ports_eNB; p++) { - if (ue->common_vars.dl_ch_estimates[eNB_offset][(p<<1)+aarx]) - idft((int16_t*) &ue->common_vars.dl_ch_estimates[eNB_offset][(p<<1)+aarx][8], - (int16_t*) ue->common_vars.dl_ch_estimates_time[eNB_offset][(p<<1)+aarx],1); + if (ue->common_vars.common_vars_rx_data_per_thread[(Ns>>1)&0x1].dl_ch_estimates[eNB_offset][(p<<1)+aarx]) + idft((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[(Ns>>1)&0x1].dl_ch_estimates[eNB_offset][(p<<1)+aarx][8], + (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[(Ns>>1)&0x1].dl_ch_estimates_time[eNB_offset][(p<<1)+aarx],1); } #if T_TRACER T(T_UE_PHY_DL_CHANNEL_ESTIMATE, T_INT(eNB_id), T_INT(ue->Mod_id), T_INT(ue->proc.proc_rxtx[(Ns>>1)&1].frame_rx%1024), T_INT(ue->proc.proc_rxtx[(Ns>>1)&1].subframe_rx), - T_INT(0), T_BUFFER(&ue->common_vars.dl_ch_estimates_time[eNB_offset][0][0], 512 * 4)); + T_INT(0), T_BUFFER(&ue->common_vars.common_vars_rx_data_per_thread[(Ns>>1)&0x1].dl_ch_estimates_time[eNB_offset][0][0], 512 * 4)); #endif return(0); diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c index 271187b4474eea1491834e878ff83fe8ba1b30f1..2ce0e45b14988c390b70a36f0dc5821f0da5047f 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c @@ -44,8 +44,8 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *ue, // unsigned int n; // int i; - int **dl_ch_estimates=ue->common_vars.dl_ch_estimates[0]; - int **rxdataF=ue->common_vars.rxdataF; + int **dl_ch_estimates=ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0]; + int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF; ch_offset = (l*(ue->frame_parms.ofdm_symbol_size)); symbol_offset = ch_offset;//phy_vars_ue->lte_frame_parms.ofdm_symbol_size*l; @@ -734,31 +734,31 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *ue, // do ifft of channel estimate for (aa=0; aa<ue->frame_parms.nb_antennas_rx*ue->frame_parms.nb_antennas_tx; aa++) { - if (ue->common_vars.dl_ch_estimates[eNB_offset][aa]) { + if (ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_offset][aa]) { switch (ue->frame_parms.N_RB_DL) { case 6: - idft128((int16_t*) &ue->common_vars.dl_ch_estimates[eNB_offset][aa][8], - (int16_t*) ue->common_vars.dl_ch_estimates_time[eNB_offset][aa], + idft128((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_offset][aa][8], + (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates_time[eNB_offset][aa], 1); break; case 25: - idft512((int16_t*) &ue->common_vars.dl_ch_estimates[eNB_offset][aa][8], - (int16_t*) ue->common_vars.dl_ch_estimates_time[eNB_offset][aa], + idft512((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_offset][aa][8], + (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates_time[eNB_offset][aa], 1); break; case 50: - idft1024((int16_t*) &ue->common_vars.dl_ch_estimates[eNB_offset][aa][8], - (int16_t*) ue->common_vars.dl_ch_estimates_time[eNB_offset][aa], + idft1024((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_offset][aa][8], + (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates_time[eNB_offset][aa], 1); break; case 75: - idft1536((int16_t*) &ue->common_vars.dl_ch_estimates[eNB_offset][aa][8], - (int16_t*) ue->common_vars.dl_ch_estimates_time[eNB_offset][aa], + idft1536((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_offset][aa][8], + (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates_time[eNB_offset][aa], 1); break; case 100: - idft2048((int16_t*) &ue->common_vars.dl_ch_estimates[eNB_offset][aa][8], - (int16_t*) ue->common_vars.dl_ch_estimates_time[eNB_offset][aa], + idft2048((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_offset][aa][8], + (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates_time[eNB_offset][aa], 1); break; default: diff --git a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c index 6c7399fcbec215509cd49a20cfaa2a4360c244b9..e6551033f31fc1891dda98b0401cc1da959b63b4 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c @@ -510,14 +510,15 @@ int lte_sync_time_eNB(int32_t **rxdata, ///rx data in time domain // perform a time domain correlation using the oversampled sync sequence - unsigned int n, ar, peak_val, peak_pos, mean_val; + unsigned int n, ar, peak_val, peak_pos; + uint64_t mean_val; int result; short *primary_synch_time; int eNB_id = frame_parms->Nid_cell%3; // msg("[SYNC TIME] Calling sync_time_eNB(%p,%p,%d,%d)\n",rxdata,frame_parms,eNB_id,length); if (sync_corr_eNB == NULL) { - msg("[SYNC TIME] sync_corr_eNB not yet allocated! Exiting.\n"); + LOG_E(PHY,"[SYNC TIME] sync_corr_eNB not yet allocated! Exiting.\n"); return(-1); } @@ -535,7 +536,7 @@ int lte_sync_time_eNB(int32_t **rxdata, ///rx data in time domain break; default: - msg("[SYNC TIME] Illegal eNB_id!\n"); + LOG_E(PHY,"[SYNC TIME] Illegal eNB_id!\n"); return (-1); } @@ -567,7 +568,7 @@ int lte_sync_time_eNB(int32_t **rxdata, ///rx data in time domain peak_val); } */ - mean_val += (sync_corr_eNB[n]>>10); + mean_val += sync_corr_eNB[n]; if (sync_corr_eNB[n]>peak_val) { peak_val = sync_corr_eNB[n]; @@ -575,17 +576,15 @@ int lte_sync_time_eNB(int32_t **rxdata, ///rx data in time domain } } + mean_val/=length; + *peak_val_out = peak_val; - if (peak_val <= (40*mean_val)) { -#ifdef DEBUG_PHY - msg("[SYNC TIME] No peak found (%u,%u,%u,%u)\n",peak_pos,peak_val,mean_val,40*mean_val); -#endif + if (peak_val <= (40*(uint32_t)mean_val)) { + LOG_D(PHY,"[SYNC TIME] No peak found (%u,%u,%u,%u)\n",peak_pos,peak_val,mean_val,40*mean_val); return(-1); } else { -#ifdef DEBUG_PHY - msg("[SYNC TIME] Peak found at pos %u, val = %u, mean_val = %u\n",peak_pos,peak_val,mean_val); -#endif + LOG_D(PHY,"[SYNC TIME] Peak found at pos %u, val = %u, mean_val = %u\n",peak_pos,peak_val,mean_val); return(peak_pos); } diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c index 51dc933db3e728112e3cb5c4ce2040eddb0497d5..db8fe548a295382ddebbd2a143236183ae7077b7 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c @@ -197,9 +197,8 @@ void ue_rrc_measurements(PHY_VARS_UE *ue, if (ue->frame_parms.Ncp==NORMAL) { for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) { - - rxF_sss = (int16_t *)&ue->common_vars.rxdataF[aarx][(5*ue->frame_parms.ofdm_symbol_size)]; - rxF_pss = (int16_t *)&ue->common_vars.rxdataF[aarx][(6*ue->frame_parms.ofdm_symbol_size)]; + rxF_sss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aarx][(5*ue->frame_parms.ofdm_symbol_size)]; + rxF_pss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aarx][(6*ue->frame_parms.ofdm_symbol_size)]; //-ve spectrum from SSS @@ -224,7 +223,7 @@ void ue_rrc_measurements(PHY_VARS_UE *ue, ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+66]*rxF_pss[2+66])+((int32_t)rxF_pss[2+65]*rxF_pss[2+65])); // ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+64]*rxF_pss[2+64])+((int32_t)rxF_pss[2+63]*rxF_pss[2+63])); // printf("pss32 %d\n",ue->measurements.n0_power[aarx]); //-ve spectrum from PSS - rxF_pss = (int16_t *)&ue->common_vars.rxdataF[aarx][(7*ue->frame_parms.ofdm_symbol_size)]; + rxF_pss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aarx][(7*ue->frame_parms.ofdm_symbol_size)]; // ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71])); // printf("pssm36 %d\n",ue->measurements.n0_power[aarx]); ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-70]*rxF_pss[-70])+((int32_t)rxF_pss[-69]*rxF_pss[-69])); @@ -296,10 +295,10 @@ void ue_rrc_measurements(PHY_VARS_UE *ue, if (ue->frame_parms.Ncp==NORMAL) { for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) { - rxF_sss = (int16_t *)&ue->common_vars.rxdataF[aarx][(6*ue->frame_parms.ofdm_symbol_size)]; + rxF_sss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aarx][(6*ue->frame_parms.ofdm_symbol_size)]; // note this is a dummy pointer, the pss is not really there! // in FDD the pss is in the symbol after the sss, but not in TDD - rxF_pss = (int16_t *)&ue->common_vars.rxdataF[aarx][(7*ue->frame_parms.ofdm_symbol_size)]; + rxF_pss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aarx][(7*ue->frame_parms.ofdm_symbol_size)]; //-ve spectrum from SSS // ue->measurements.n0_power[aarx] = (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71])); @@ -351,7 +350,7 @@ void ue_rrc_measurements(PHY_VARS_UE *ue, #endif for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) { - rxF = (int16_t *)&ue->common_vars.rxdataF[aarx][(l*ue->frame_parms.ofdm_symbol_size)]; + rxF = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aarx][(l*ue->frame_parms.ofdm_symbol_size)]; off = (ue->frame_parms.first_carrier_offset+k)<<1; if (l==(4-ue->frame_parms.Ncp)) { @@ -457,7 +456,8 @@ void ue_rrc_measurements(PHY_VARS_UE *ue, void lte_ue_measurements(PHY_VARS_UE *ue, unsigned int subframe_offset, unsigned char N0_symbol, - unsigned char abstraction_flag) + unsigned char abstraction_flag, + uint8_t subframe) { @@ -507,7 +507,7 @@ void lte_ue_measurements(PHY_VARS_UE *ue, for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { for (aatx=0; aatx<frame_parms->nb_antenna_ports_eNB; aatx++) { ue->measurements.rx_spatial_power[eNB_id][aatx][aarx] = - (signal_energy_nodc(&ue->common_vars.dl_ch_estimates[eNB_id][(aatx<<1) + aarx][0], + (signal_energy_nodc(&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][(aatx<<1) + aarx][0], (N_RB_DL*12))); //- ue->measurements.n0_power[aarx]; @@ -575,8 +575,8 @@ void lte_ue_measurements(PHY_VARS_UE *ue, // cqi/pmi information for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { - dl_ch0 = &ue->common_vars.dl_ch_estimates[eNB_id][aarx][4]; - dl_ch1 = &ue->common_vars.dl_ch_estimates[eNB_id][2+aarx][4]; + dl_ch0 = &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][aarx][4]; + dl_ch1 = &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][2+aarx][4]; for (subband=0; subband<nb_subbands; subband++) { @@ -630,13 +630,13 @@ void lte_ue_measurements(PHY_VARS_UE *ue, #if defined(__x86_64__) || defined(__i386__) __m128i pmi128_re,pmi128_im,mmtmpPMI0,mmtmpPMI1 /* ,mmtmpPMI2,mmtmpPMI3 */ ; - dl_ch0_128 = (__m128i *)&ue->common_vars.dl_ch_estimates[eNB_id][aarx][4]; - dl_ch1_128 = (__m128i *)&ue->common_vars.dl_ch_estimates[eNB_id][2+aarx][4]; + dl_ch0_128 = (__m128i *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][aarx][4]; + dl_ch1_128 = (__m128i *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][2+aarx][4]; #elif defined(__arm__) int32x4_t pmi128_re,pmi128_im,mmtmpPMI0,mmtmpPMI1,mmtmpPMI0b,mmtmpPMI1b; - dl_ch0_128 = (int16x8_t *)&ue->common_vars.dl_ch_estimates[eNB_id][aarx][4]; - dl_ch1_128 = (int16x8_t *)&ue->common_vars.dl_ch_estimates[eNB_id][2+aarx][4]; + dl_ch0_128 = (int16x8_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][aarx][4]; + dl_ch1_128 = (int16x8_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][2+aarx][4]; #endif for (subband=0; subband<nb_subbands; subband++) { @@ -694,7 +694,7 @@ void lte_ue_measurements(PHY_VARS_UE *ue, else { // cqi information only for mode 1 for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { - dl_ch0 = &ue->common_vars.dl_ch_estimates[eNB_id][aarx][4]; + dl_ch0 = &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][aarx][4]; for (subband=0; subband<7; subband++) { diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c index d2bc2e27c0750b7e68a97c461f4fac2d29f1e519..4fef74dd1cc2bb1a714b42081793001fd008f9cd 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c @@ -720,10 +720,11 @@ int32_t lte_srs_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms, //write_output("eNB_srs.m","srs_eNB",common_vars->srs,(frame_parms->ofdm_symbol_size),1,1); mult_cpx_conj_vector((int16_t*) &common_vars->rxdataF[eNB_id][aa][2*frame_parms->ofdm_symbol_size*symbol], - (int16_t*) srs_vars->srs, - (int16_t*) srs_vars->srs_ch_estimates[eNB_id][aa], - frame_parms->ofdm_symbol_size, - 15); + (int16_t*) srs_vars->srs, + (int16_t*) srs_vars->srs_ch_estimates[eNB_id][aa], + frame_parms->ofdm_symbol_size, + 15, + 0); //msg("SRS channel estimation cmult out\n"); #ifdef USER_MODE diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c index 55a12a253a44509935e786b76a49bab5ad5c6ca5..49fe90bf15c0f58668d8e12f010aa4b46a2fe842 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci.c +++ b/openair1/PHY/LTE_TRANSPORT/dci.c @@ -1705,16 +1705,16 @@ int32_t rx_pdcch(LTE_UE_COMMON *common_vars, for (s=0; s<n_pdcch_symbols; s++) { if (is_secondary_ue == 1) { - pdcch_extract_rbs_single(common_vars->rxdataF, - common_vars->dl_ch_estimates[eNB_id+1], //add 1 to eNB_id to compensate for the shifted B/F'd pilots from the SeNB + pdcch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF, + common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id+1], //add 1 to eNB_id to compensate for the shifted B/F'd pilots from the SeNB pdcch_vars[eNB_id]->rxdataF_ext, pdcch_vars[eNB_id]->dl_ch_estimates_ext, s, high_speed_flag, frame_parms); #ifdef MU_RECEIVER - pdcch_extract_rbs_single(common_vars->rxdataF, - common_vars->dl_ch_estimates[eNB_id_i - 1],//subtract 1 to eNB_id_i to compensate for the non-shifted pilots from the PeNB + pdcch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF, + common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id_i - 1],//subtract 1 to eNB_id_i to compensate for the non-shifted pilots from the PeNB pdcch_vars[eNB_id_i]->rxdataF_ext,//shift by two to simulate transmission from a second antenna pdcch_vars[eNB_id_i]->dl_ch_estimates_ext,//shift by two to simulate transmission from a second antenna s, @@ -1722,16 +1722,16 @@ int32_t rx_pdcch(LTE_UE_COMMON *common_vars, frame_parms); #endif //MU_RECEIVER } else if (frame_parms->nb_antenna_ports_eNB>1) { - pdcch_extract_rbs_dual(common_vars->rxdataF, - common_vars->dl_ch_estimates[eNB_id], + pdcch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF, + common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id], pdcch_vars[eNB_id]->rxdataF_ext, pdcch_vars[eNB_id]->dl_ch_estimates_ext, s, high_speed_flag, frame_parms); } else { - pdcch_extract_rbs_single(common_vars->rxdataF, - common_vars->dl_ch_estimates[eNB_id], + pdcch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF, + common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id], pdcch_vars[eNB_id]->rxdataF_ext, pdcch_vars[eNB_id]->dl_ch_estimates_ext, s, diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c index 328479e7465d29ab1f3153227c4d116381f42fb4..b262dbccf90de727c6af5aa173ed66684218ee3f 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c @@ -1329,7 +1329,7 @@ int generate_eNB_dlsch_params_from_dci(int frame, tpmi = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->tpmi; } } else { - LOG_E(PHY,"eNB: subframe %d UE %x, Format2 DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx); + LOG_E(PHY,"eNB: subframe %d UE %x, Format2 DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antennas_tx); } break; @@ -1380,7 +1380,7 @@ int generate_eNB_dlsch_params_from_dci(int frame, tpmi = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->tpmi; } } else { - LOG_E(PHY,"eNB: subframe %d UE %x, Format2 DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx); + LOG_E(PHY,"eNB: subframe %d UE %x, Format2 DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antennas_tx); } break; @@ -1431,7 +1431,7 @@ int generate_eNB_dlsch_params_from_dci(int frame, tpmi = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->tpmi; } } else { - LOG_E(PHY,"eNB: subframe %d UE %x, Format2 DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx); + LOG_E(PHY,"eNB: subframe %d UE %x, Format2 DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antennas_tx); } break; @@ -1482,7 +1482,7 @@ int generate_eNB_dlsch_params_from_dci(int frame, tpmi = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->tpmi; } } else { - LOG_E(PHY,"eNB: subframe %d UE %x, Format2 DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx); + LOG_E(PHY,"eNB: subframe %d UE %x, Format2 DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antennas_tx); } break; @@ -1687,7 +1687,7 @@ int generate_eNB_dlsch_params_from_dci(int frame, tpmi = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->tpmi; } } else { - LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx); + LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antennas_tx); } break; @@ -1736,7 +1736,7 @@ int generate_eNB_dlsch_params_from_dci(int frame, tpmi = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->tpmi; } } else { - LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx); + LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antennas_tx); } break; @@ -1785,7 +1785,7 @@ int generate_eNB_dlsch_params_from_dci(int frame, tpmi = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->tpmi; } } else { - LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx); + LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antennas_tx); } break; @@ -1834,7 +1834,7 @@ int generate_eNB_dlsch_params_from_dci(int frame, tpmi = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->tpmi; } } else { - LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx); + LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antennas_tx); } break; @@ -3115,7 +3115,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) if (frame_parms->nb_antennas_tx == 2) { switch(frame_parms->N_RB_DL) { case 6: - LOG_D(PHY,"DCI format2 2 antennas (TDD 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d, tbswap %d, tpmi %d\n", + LOG_D(PHY,"DCI format2 2 antennas (TDD 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tbswap %d, tpmi %d\n", dci->rnti, ((uint32_t*)&dci->dci_pdu)[0], ((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc, @@ -3134,7 +3134,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 25: - LOG_D(PHY,"DCI format2 2 antennas (TDD 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d, tb_swap %d, tpmi %d\n", + LOG_D(PHY,"DCI format2 2 antennas (TDD 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n", dci->rnti, ((uint32_t*)&dci->dci_pdu)[0], ((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah, @@ -3153,7 +3153,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 50: - LOG_D(PHY,"DCI format2 2 antennas (TDD 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d\n", + LOG_D(PHY,"DCI format2 2 antennas (TDD 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n", dci->rnti, ((uint32_t*)&dci->dci_pdu)[0], ((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah, @@ -3172,7 +3172,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 100: - LOG_D(PHY,"DCI format2 2 antennas (TDD 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d, tb_swap %d, tpmi %d\n", + LOG_D(PHY,"DCI format2 2 antennas (TDD 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n", dci->rnti, ((uint32_t*)&dci->dci_pdu)[0], ((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah, @@ -3198,7 +3198,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) } else if (frame_parms->nb_antennas_tx == 4) { switch(frame_parms->N_RB_DL) { case 6: - LOG_D(PHY,"DCI format2 2 antennas (TDD 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d, tbswap %d, tpmi %d\n", + LOG_D(PHY,"DCI format2 2 antennas (TDD 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tbswap %d, tpmi %d\n", dci->rnti, ((uint32_t*)&dci->dci_pdu)[0], ((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc, @@ -3217,7 +3217,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 25: - LOG_D(PHY,"DCI format2 2 antennas (TDD 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d, tb_swap %d, tpmi %d\n", + LOG_D(PHY,"DCI format2 2 antennas (TDD 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n", dci->rnti, ((uint32_t*)&dci->dci_pdu)[0], ((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah, @@ -3236,7 +3236,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 50: - LOG_D(PHY,"DCI format2 2 antennas (TDD 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d\n", + LOG_D(PHY,"DCI format2 2 antennas (TDD 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n", dci->rnti, ((uint32_t*)&dci->dci_pdu)[0], ((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah, @@ -3255,7 +3255,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 100: - LOG_D(PHY,"DCI format2 2 antennas (TDD 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d, tb_swap %d, tpmi %d\n", + LOG_D(PHY,"DCI format2 2 antennas (TDD 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n", dci->rnti, ((uint32_t*)&dci->dci_pdu)[0], ((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah, @@ -3300,7 +3300,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 25: - LOG_D(PHY,"DCI format2 2 antennas (FDD, 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d\n", + LOG_D(PHY,"DCI format2 2 antennas (FDD, 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, tb_swap %d, tpmi %d, TPC %d\n", dci->rnti, ((uint32_t*)&dci->dci_pdu)[0], ((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah, @@ -3318,7 +3318,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 50: - LOG_D(PHY,"DCI format2 2 antennas (FDD, 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d\n", + LOG_D(PHY,"DCI format2 2 antennas (FDD, 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, tb_swap %d, tpmi %d, TPC %d\n", dci->rnti, ((uint32_t*)&dci->dci_pdu)[0], ((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah, @@ -3336,7 +3336,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 100: - LOG_D(PHY,"DCI format2 2 antennas (FDD, 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d\n", + LOG_D(PHY,"DCI format2 2 antennas (FDD, 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, tb_swap %d, tpmi %d, TPC %d\n", dci->rnti, ((uint32_t*)&dci->dci_pdu)[0], ((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah, @@ -3379,7 +3379,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 25: - LOG_D(PHY,"DCI format2 4 antennas (FDD, 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d\n", + LOG_D(PHY,"DCI format2 4 antennas (FDD, 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, tb_swap %d, tpmi %d, TPC %d\n", dci->rnti, ((uint32_t*)&dci->dci_pdu)[0], ((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah, @@ -3397,7 +3397,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 50: - LOG_D(PHY,"DCI format2 4 antennas (FDD, 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d\n", + LOG_D(PHY,"DCI format2 4 antennas (FDD, 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, tb_swap %d, tpmi %d, TPC %d\n", dci->rnti, ((uint32_t*)&dci->dci_pdu)[0], ((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah, @@ -3415,7 +3415,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 100: - LOG_D(PHY,"DCI format2 4 antennas (FDD, 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d\n", + LOG_D(PHY,"DCI format2 4 antennas (FDD, 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, tb_swap %d, tpmi %d, TPC %d\n", dci->rnti, ((uint32_t*)&dci->dci_pdu)[0], ((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah, @@ -3470,7 +3470,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 25: - LOG_D(PHY,"DCI format2A 2 antennas (FDD 5 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n", + LOG_D(PHY,"DCI format2A 2 antennas (FDD 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n", dci->rnti, ((uint64_t*)&dci->dci_pdu)[0], ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah, @@ -3488,7 +3488,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 50: - LOG_D(PHY,"DCI format2A 2 antennas (FDD 10 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n", + LOG_D(PHY,"DCI format2A 2 antennas (FDD 10 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n", dci->rnti, ((uint64_t*)&dci->dci_pdu)[0], ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah, @@ -3506,7 +3506,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 100: - LOG_D(PHY,"DCI format2A 2 antennas (FDD 20 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n", + LOG_D(PHY,"DCI format2A 2 antennas (FDD 20 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n", dci->rnti, ((uint64_t*)&dci->dci_pdu)[0], ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah, @@ -3531,7 +3531,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) } else if (frame_parms->nb_antenna_ports_eNB == 4) { switch(frame_parms->N_RB_DL) { case 6: - LOG_D(PHY,"DCI format2A 4 antennas (TDD 1.5 MHz), rnti %x (%llx): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n", + LOG_D(PHY,"DCI format2A 4 antennas (TDD 1.5 MHz), rnti %x (%"PRIu64"): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n", dci->rnti, ((uint64_t*)&dci->dci_pdu)[0], ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc, @@ -3550,7 +3550,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 25: - LOG_D(PHY,"DCI format2A 4 antennas (TDD 5 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n", + LOG_D(PHY,"DCI format2A 4 antennas (TDD 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n", dci->rnti, ((uint64_t*)&dci->dci_pdu)[0], ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah, @@ -3569,7 +3569,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 50: - LOG_D(PHY,"DCI format2A 4 antennas (TDD 10 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n", + LOG_D(PHY,"DCI format2A 4 antennas (TDD 10 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n", dci->rnti, ((uint64_t*)&dci->dci_pdu)[0], ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah, @@ -3588,7 +3588,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 100: - LOG_D(PHY,"DCI format2A 4 antennas (TDD 20 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n", + LOG_D(PHY,"DCI format2A 4 antennas (TDD 20 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n", dci->rnti, ((uint64_t*)&dci->dci_pdu)[0], ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah, @@ -3632,7 +3632,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 25: - LOG_D(PHY,"DCI format2A 2 antennas (FDD, 5 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n", + LOG_D(PHY,"DCI format2A 2 antennas (FDD, 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n", dci->rnti, ((uint64_t*)&dci->dci_pdu)[0], ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah, @@ -3649,7 +3649,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 50: - LOG_D(PHY,"DCI format2A 2 antennas (FDD, 10 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n", + LOG_D(PHY,"DCI format2A 2 antennas (FDD, 10 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n", dci->rnti, ((uint64_t*)&dci->dci_pdu)[0], ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah, @@ -3666,7 +3666,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 100: - LOG_D(PHY,"DCI format2A 2 antennas (FDD, 20 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n", + LOG_D(PHY,"DCI format2A 2 antennas (FDD, 20 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n", dci->rnti, ((uint64_t*)&dci->dci_pdu)[0], ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah, @@ -3691,7 +3691,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) switch(frame_parms->N_RB_DL) { case 6: - LOG_D(PHY,"DCI format2A 4 antennas (FDD, 1.5 MHz), rnti %x (%llx): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n", + LOG_D(PHY,"DCI format2A 4 antennas (FDD, 1.5 MHz), rnti %x (%"PRIu64"): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n", dci->rnti, ((uint64_t*)&dci->dci_pdu)[0], ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc, @@ -3708,7 +3708,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 25: - LOG_D(PHY,"DCI format2A 4 antennas (FDD, 5 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n", + LOG_D(PHY,"DCI format2A 4 antennas (FDD, 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n", dci->rnti, ((uint64_t*)&dci->dci_pdu)[0], ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah, @@ -3726,7 +3726,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 50: - LOG_D(PHY,"DCI format2A 4 antennas (FDD, 5 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n", + LOG_D(PHY,"DCI format2A 4 antennas (FDD, 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n", dci->rnti, ((uint64_t*)&dci->dci_pdu)[0], ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah, @@ -3744,7 +3744,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 100: - LOG_D(PHY,"DCI format2A 4 antennas (FDD, 5 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n", + LOG_D(PHY,"DCI format2A 4 antennas (FDD, 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n", dci->rnti, ((uint64_t*)&dci->dci_pdu)[0], ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah, @@ -4529,7 +4529,7 @@ int generate_ue_dlsch_params_from_dci(int frame, dlsch[0]->harq_ack[subframe].send_harq_status = 1; if (dlsch0_harq->first_tx==1) { - LOG_D(PHY,"[PDSCH %x/%d] Format 1 DCI First TX: Clearing flag\n"); + LOG_D(PHY,"[PDSCH %x/%d] Format 1 DCI First TX: Clearing flag\n",rnti,harq_pid); dlsch0_harq->first_tx = 0; } } @@ -5288,7 +5288,7 @@ int generate_ue_dlsch_params_from_dci(int frame, dlsch0_harq->DCINdi = ndi1; if (dlsch0_harq->first_tx==1) { - LOG_D(PHY,"[PDSCH %x/%d] Format 2A DCI First TX0: Clearing flag\n"); + LOG_D(PHY,"[PDSCH %x/%d] Format 2A DCI First TX0: Clearing flag\n",rnti,harq_pid); dlsch0_harq->first_tx = 0; } } else if (dlsch0_harq->status == SCH_IDLE) { // we got an Ndi = 0 for a previously decoded process, @@ -7202,8 +7202,8 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, // ulsch->n_DMRS2 = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->cshift; - #ifdef DEBUG_DCI - printf("Format 0 DCI : ulsch (ue): AbsSubframe %d.%d\n",proc->frame_rx,subframe); + #ifdef DEBUG_DCI + printf("Format 0 DCI : ulsch (ue): AbsSubframe %d.%d\n",proc->frame_rx%1024,subframe); printf("Format 0 DCI : ulsch (ue): NBRB %d\n",ulsch->harq_processes[harq_pid]->nb_rb); printf("Format 0 DCI :ulsch (ue): first_rb %d\n",ulsch->harq_processes[harq_pid]->first_rb); printf("Format 0 DCI :ulsch (ue): rballoc %d\n",rballoc); @@ -7211,14 +7211,14 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, printf("Format 0 DCI :ulsch (ue): first_tx %d\n",ulsch->harq_processes[harq_pid]->first_tx); printf("Format 0 DCI :ulsch (ue): DCINdi %d\n",ulsch->harq_processes[harq_pid]->DCINdi); printf("Format 0 DCI :ulsch (ue): round %d\n",ulsch->harq_processes[harq_pid]->round); - printf("Format 0 DCI :ulsch (ue): TBS %d\n",ulsch->harq_processes[harq_pid]->TBS); + //printf("Format 0 DCI :ulsch (ue): TBS %d\n",ulsch->harq_processes[harq_pid]->TBS); printf("Format 0 DCI :ulsch (ue): mcs %d\n",ulsch->harq_processes[harq_pid]->mcs); - printf("Format 0 DCI :ulsch (ue): O %d\n",ulsch->O); - printf("Format 0 DCI :ulsch (ue): cqiReq %d\n",cqi_req); - if (frame_parms->frame_type == TDD) - printf("Format 0 DCI :ulsch (ue): O_ACK/DAI %d/%d\n",ulsch->harq_processes[harq_pid]->O_ACK,dai); - else - printf("Format 0 DCI :ulsch (ue): O_ACK %d\n",ulsch->harq_processes[harq_pid]->O_ACK); + //printf("Format 0 DCI :ulsch (ue): O %d\n",ulsch->O); + //printf("Format 0 DCI :ulsch (ue): cqiReq %d\n",cqi_req); + //if (frame_parms->frame_type == TDD) + // printf("Format 0 DCI :ulsch (ue): O_ACK/DAI %d/%d\n",ulsch->harq_processes[harq_pid]->O_ACK,dai); + //else + // printf("Format 0 DCI :ulsch (ue): O_ACK %d\n",ulsch->harq_processes[harq_pid]->O_ACK); printf("Format 0 DCI :ulsch (ue): Nsymb_pusch %d\n",ulsch->Nsymb_pusch); printf("Format 0 DCI :ulsch (ue): cshift %d\n",ulsch->harq_processes[harq_pid]->n_DMRS2); @@ -7873,12 +7873,12 @@ int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *eNB, } -double sinr_eff_cqi_calc(PHY_VARS_UE *ue, uint8_t eNB_id) +double sinr_eff_cqi_calc(PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe) { uint8_t transmission_mode = ue->transmission_mode[eNB_id]; PHY_MEASUREMENTS *meas = &ue->measurements; LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; - int32_t **dl_channel_est = ue->common_vars.dl_ch_estimates[eNB_id]; + int32_t **dl_channel_est = ue->common_vars.common_vars_rx_data_per_thread[subframe &0x1].dl_ch_estimates[eNB_id]; double *s_dB; s_dB = ue->sinr_CQI_dB; // LTE_UE_ULSCH_t *ulsch = ue->ulsch[eNB_id]; diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c index 08279188639a026527a514c2327188aa266d8bc9..8ec2a40d8de12b481fd90ad783595698de551dcb 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c @@ -118,7 +118,6 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_ unsigned char exit_flag = 0,i,j,r,aa,layer; int re; unsigned char bw_scaling =1; - uint8_t nb_antennas_tx = frame_parms->nb_antennas_tx; switch (N_RB_DL) { case 6: diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c index 11d7fcacda4b51324239bb1c6329cdcc10990881..7d14e8aca716942346e5c6b1d930321aee1e0221 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c @@ -113,7 +113,7 @@ int rx_pdsch(PHY_VARS_UE *ue, break; case PDSCH: - pdsch_vars = &ue->pdsch_vars[eNB_id]; + pdsch_vars = &ue->pdsch_vars[subframe&0x1][eNB_id]; dlsch = ue->dlsch[eNB_id]; dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; dlsch1_harq = dlsch[1]->harq_processes[harq_pid]; @@ -121,7 +121,7 @@ int rx_pdsch(PHY_VARS_UE *ue, break; default: - LOG_E(PHY,"[UE %d][FATAL] Frame %d subframe %d: Unknown PDSCH format %d\n",ue->proc.proc_rxtx[0].frame_rx,subframe,type); + LOG_E(PHY,"[UE][FATAL] Frame %d subframe %d: Unknown PDSCH format %d\n",ue->proc.proc_rxtx[0].frame_rx,subframe,type); return(-1); break; } @@ -163,8 +163,8 @@ int rx_pdsch(PHY_VARS_UE *ue, #ifdef DEBUG_DLSCH_MOD LOG_I(PHY,"dlsch: using pmi %x (%p), rb_alloc %x\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc),dlsch[0],dlsch0_harq->rb_alloc_even[0]); #endif - nb_rb = dlsch_extract_rbs_dual(common_vars->rxdataF, - common_vars->dl_ch_estimates[eNB_id], + nb_rb = dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF, + common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id], pdsch_vars[eNB_id]->rxdataF_ext, pdsch_vars[eNB_id]->dl_ch_estimates_ext, dlsch0_harq->pmi_alloc, @@ -177,8 +177,8 @@ int rx_pdsch(PHY_VARS_UE *ue, if (dual_stream_flag==1) { if (eNB_id_i<ue->n_connected_eNB) - nb_rb = dlsch_extract_rbs_dual(common_vars->rxdataF, - common_vars->dl_ch_estimates[eNB_id_i], + nb_rb = dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF, + common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id_i], pdsch_vars[eNB_id_i]->rxdataF_ext, pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, dlsch0_harq->pmi_alloc, @@ -189,8 +189,8 @@ int rx_pdsch(PHY_VARS_UE *ue, ue->high_speed_flag, frame_parms); else - nb_rb = dlsch_extract_rbs_dual(common_vars->rxdataF, - common_vars->dl_ch_estimates[eNB_id], + nb_rb = dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF, + common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id], pdsch_vars[eNB_id_i]->rxdataF_ext, pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, dlsch0_harq->pmi_alloc, @@ -202,8 +202,8 @@ int rx_pdsch(PHY_VARS_UE *ue, frame_parms); } } else if (beamforming_mode==0) { //else if nb_antennas_ports_eNB==1 && beamforming_mode == 0 - nb_rb = dlsch_extract_rbs_single(common_vars->rxdataF, - common_vars->dl_ch_estimates[eNB_id], + nb_rb = dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF, + common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id], pdsch_vars[eNB_id]->rxdataF_ext, pdsch_vars[eNB_id]->dl_ch_estimates_ext, dlsch0_harq->pmi_alloc, @@ -216,8 +216,8 @@ int rx_pdsch(PHY_VARS_UE *ue, if (dual_stream_flag==1) { if (eNB_id_i<ue->n_connected_eNB) - nb_rb = dlsch_extract_rbs_single(common_vars->rxdataF, - common_vars->dl_ch_estimates[eNB_id_i], + nb_rb = dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF, + common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id_i], pdsch_vars[eNB_id_i]->rxdataF_ext, pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, dlsch0_harq->pmi_alloc, @@ -228,8 +228,8 @@ int rx_pdsch(PHY_VARS_UE *ue, ue->high_speed_flag, frame_parms); - nb_rb = dlsch_extract_rbs_single(common_vars->rxdataF, - common_vars->dl_ch_estimates[eNB_id], + nb_rb = dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF, + common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id], pdsch_vars[eNB_id_i]->rxdataF_ext, pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, dlsch0_harq->pmi_alloc, @@ -241,7 +241,7 @@ int rx_pdsch(PHY_VARS_UE *ue, frame_parms); } } else if (beamforming_mode==7) { //else if beamforming_mode == 7 - nb_rb = dlsch_extract_rbs_TM7(common_vars->rxdataF, + nb_rb = dlsch_extract_rbs_TM7(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF, pdsch_vars[eNB_id]->dl_bf_ch_estimates, pdsch_vars[eNB_id]->rxdataF_ext, pdsch_vars[eNB_id]->dl_bf_ch_estimates_ext, @@ -5161,7 +5161,7 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF, #ifdef USER_MODE -void dump_dlsch2(PHY_VARS_UE *ue,uint8_t eNB_id,uint16_t coded_bits_per_codeword,int round) +void dump_dlsch2(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe,uint16_t coded_bits_per_codeword,int round) { unsigned int nsymb = (ue->frame_parms.Ncp == 0) ? 14 : 12; @@ -5170,50 +5170,50 @@ void dump_dlsch2(PHY_VARS_UE *ue,uint8_t eNB_id,uint16_t coded_bits_per_codeword sprintf(fname,"dlsch%d_rxF_r%d_ext0.m",eNB_id,round); sprintf(vname,"dl%d_rxF_r%d_ext0",eNB_id,round); - write_output(fname,vname,ue->pdsch_vars[eNB_id]->rxdataF_ext[0],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_ext[0],12*N_RB_DL*nsymb,1,1); if (ue->frame_parms.nb_antennas_rx >1) { sprintf(fname,"dlsch%d_rxF_r%d_ext1.m",eNB_id,round); sprintf(vname,"dl%d_rxF_r%d_ext1",eNB_id,round); - write_output(fname,vname,ue->pdsch_vars[eNB_id]->rxdataF_ext[1],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_ext[1],12*N_RB_DL*nsymb,1,1); } sprintf(fname,"dlsch%d_ch_r%d_ext00.m",eNB_id,round); sprintf(vname,"dl%d_ch_r%d_ext00",eNB_id,round); - write_output(fname,vname,ue->pdsch_vars[eNB_id]->dl_ch_estimates_ext[0],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_estimates_ext[0],12*N_RB_DL*nsymb,1,1); if (ue->transmission_mode[eNB_id]==7){ sprintf(fname,"dlsch%d_bf_ch_r%d.m",eNB_id,round); sprintf(vname,"dl%d_bf_ch_r%d",eNB_id,round); - write_output(fname,vname,ue->pdsch_vars[eNB_id]->dl_bf_ch_estimates[0],512*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->dl_bf_ch_estimates[0],512*nsymb,1,1); //write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_bf_ch_estimates[0],512,1,1); sprintf(fname,"dlsch%d_bf_ch_r%d_ext00.m",eNB_id,round); sprintf(vname,"dl%d_bf_ch_r%d_ext00",eNB_id,round); - write_output(fname,vname,ue->pdsch_vars[eNB_id]->dl_bf_ch_estimates_ext[0],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->dl_bf_ch_estimates_ext[0],12*N_RB_DL*nsymb,1,1); } if (ue->frame_parms.nb_antennas_rx == 2) { sprintf(fname,"dlsch%d_ch_r%d_ext01.m",eNB_id,round); sprintf(vname,"dl%d_ch_r%d_ext01",eNB_id,round); - write_output(fname,vname,ue->pdsch_vars[eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb,1,1); } if (ue->frame_parms.nb_antenna_ports_eNB == 2) { sprintf(fname,"dlsch%d_ch_r%d_ext10.m",eNB_id,round); sprintf(vname,"dl%d_ch_r%d_ext10",eNB_id,round); - write_output(fname,vname,ue->pdsch_vars[eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb,1,1); if (ue->frame_parms.nb_antennas_rx == 2) { sprintf(fname,"dlsch%d_ch_r%d_ext11.m",eNB_id,round); sprintf(vname,"dl%d_ch_r%d_ext11",eNB_id,round); - write_output(fname,vname,ue->pdsch_vars[eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb,1,1); } } sprintf(fname,"dlsch%d_rxF_r%d_uespec0.m",eNB_id,round); sprintf(vname,"dl%d_rxF_r%d_uespec0",eNB_id,round); - write_output(fname,vname,ue->pdsch_vars[eNB_id]->rxdataF_uespec_pilots[0],12*N_RB_DL,1,1); + write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_uespec_pilots[0],12*N_RB_DL,1,1); /* write_output("dlsch%d_ch_ext01.m","dl01_ch0_ext",pdsch_vars[eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb,1,1); @@ -5222,26 +5222,26 @@ void dump_dlsch2(PHY_VARS_UE *ue,uint8_t eNB_id,uint16_t coded_bits_per_codeword */ sprintf(fname,"dlsch%d_r%d_rho.m",eNB_id,round); sprintf(vname,"dl_rho_r%d_%d",eNB_id,round); - write_output(fname,vname,ue->pdsch_vars[eNB_id]->dl_ch_rho_ext[0],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_rho_ext[0],12*N_RB_DL*nsymb,1,1); sprintf(fname,"dlsch%d_rxF_r%d_comp0.m",eNB_id,round); sprintf(vname,"dl%d_rxF_r%d_comp0",eNB_id,round); - write_output(fname,vname,ue->pdsch_vars[eNB_id]->rxdataF_comp0[0],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_comp0[0],12*N_RB_DL*nsymb,1,1); if (ue->frame_parms.nb_antenna_ports_eNB == 2) { sprintf(fname,"dlsch%d_rxF_r%d_comp1.m",eNB_id,round); sprintf(vname,"dl%d_rxF_r%d_comp1",eNB_id,round); - write_output(fname,vname,ue->pdsch_vars[eNB_id]->rxdataF_comp1[0][round],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_comp1[0][round],12*N_RB_DL*nsymb,1,1); } sprintf(fname,"dlsch%d_rxF_r%d_llr.m",eNB_id,round); sprintf(vname,"dl%d_r%d_llr",eNB_id,round); - write_output(fname,vname, ue->pdsch_vars[eNB_id]->llr[0],coded_bits_per_codeword,1,0); + write_output(fname,vname, ue->pdsch_vars[subframe&0x1][eNB_id]->llr[0],coded_bits_per_codeword,1,0); sprintf(fname,"dlsch%d_r%d_mag1.m",eNB_id,round); sprintf(vname,"dl%d_r%d_mag1",eNB_id,round); - write_output(fname,vname,ue->pdsch_vars[eNB_id]->dl_ch_mag0[0],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_mag0[0],12*N_RB_DL*nsymb,1,1); sprintf(fname,"dlsch%d_r%d_mag2.m",eNB_id,round); sprintf(vname,"dl%d_r%d_mag2",eNB_id,round); - write_output(fname,vname,ue->pdsch_vars[eNB_id]->dl_ch_magb0[0],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_magb0[0],12*N_RB_DL*nsymb,1,1); // printf("log2_maxh = %d\n",ue->pdsch_vars[eNB_id]->log2_maxh); } diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c index d6e680344be663c9d330249ae627eb3006f51920..1875ada878a6d5ba6c7842133039051216237b9d 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c @@ -595,7 +595,7 @@ int allocate_REs_in_RB(PHY_VARS_eNB* phy_vars_eNB, int use2ndpilots = (frame_parms->mode1_flag==1)?1:0; - uint32_t tti_offset,aa; + uint32_t tti_offset; //,aa; uint8_t re; uint8_t qam64_table_offset_re = 0; uint8_t qam64_table_offset_im = 0; diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c old mode 100644 new mode 100755 index 68bf46da789e1c42d32ea55c2e9f40d56ae6e3c5..924eef11b97a562a4fa7913b9db80ee54c63294e --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -32,16 +32,20 @@ #include "PHY/defs.h" #include "PHY/TOOLS/alaw_lut.h" +#include "PHY/extern.h" +#include "SCHED/defs.h" -#include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h" +//#include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h" +#include "targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h" #include "UTIL/LOG/vcd_signal_dumper.h" void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, int k) { LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; - int32_t **txdataF = eNB->common_vars.txdataF[0]; - int32_t **rxdataF = eNB->common_vars.rxdataF[0]; - int16_t **rxsigF = eNB->prach_vars.rxsigF; - void *tx_buffer = eNB->ifbuffer.tx; + int32_t **txdataF = (eNB->CC_id==0) ? eNB->common_vars.txdataF[0] : PHY_vars_eNB_g[0][0]->common_vars.txdataF[0]; + int32_t **rxdataF = eNB->common_vars.rxdataF[0]; + int16_t **rxsigF = eNB->prach_vars.rxsigF; + void *tx_buffer = eNB->ifbuffer.tx[subframe&1]; + void *tx_buffer_prach = eNB->ifbuffer.tx_prach; uint16_t symbol_id=0, element_id=0; uint16_t db_fulllength, db_halflength; @@ -49,31 +53,44 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type uint16_t *data_block=NULL, *i=NULL; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); + IF4p5_header_t *packet_header=NULL; + eth_state_t *eth = (eth_state_t*) (eNB->ifdevice.priv); + int nsym = fp->symbols_per_tti; + + if (eNB->CC_id==0) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); if (packet_type == IF4p5_PDLFFT) { + if (subframe_select(fp,subframe)==SF_S) + nsym=fp->dl_symbols_in_S_subframe; + db_fulllength = 12*fp->N_RB_DL; db_halflength = (db_fulllength)>>1; slotoffsetF = (subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength - 1; - IF4p5_header_t *dl_header = (IF4p5_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); - data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t); - gen_IF4p5_dl_header(dl_header, frame, subframe); + if (eth->flags == ETH_RAW_IF4p5_MODE) { + packet_header = (IF4p5_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); + data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t); + } else { + packet_header = (IF4p5_header_t *)(tx_buffer); + data_block = (uint16_t*)(tx_buffer + sizeof_IF4p5_header_t); + } + gen_IF4p5_dl_header(packet_header, frame, subframe); - for (symbol_id=0; symbol_id<fp->symbols_per_tti; symbol_id++) { + for (symbol_id=0; symbol_id<nsym; symbol_id++) { + if (eNB->CC_id==1) LOG_I(PHY,"DL_IF4p5: CC_id %d : frame %d, subframe %d, symbol %d\n",eNB->CC_id,frame,subframe,symbol_id); for (element_id=0; element_id<db_halflength; element_id++) { - i = (uint16_t*) &txdataF[0][blockoffsetF+element_id]; + i = (uint16_t*) &txdataF[eNB->CC_id][blockoffsetF+element_id]; data_block[element_id] = ((uint16_t) lin2alaw[*i]) | (lin2alaw[*(i+1)]<<8); - i = (uint16_t*) &txdataF[0][slotoffsetF+element_id]; + i = (uint16_t*) &txdataF[eNB->CC_id][slotoffsetF+element_id]; data_block[element_id+db_halflength] = ((uint16_t) lin2alaw[*i]) | (lin2alaw[*(i+1)]<<8); } - dl_header->frame_status &= ~(0x000f<<26); - dl_header->frame_status |= (symbol_id&0x000f)<<26; + packet_header->frame_status &= ~(0x000f<<26); + packet_header->frame_status |= (symbol_id&0x000f)<<26; if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice, symbol_id, @@ -87,58 +104,92 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type slotoffsetF += fp->ofdm_symbol_size; blockoffsetF += fp->ofdm_symbol_size; } - } else if (packet_type == IF4p5_PULFFT) { + } else if ((packet_type == IF4p5_PULFFT)|| + (packet_type == IF4p5_PULTICK)){ db_fulllength = 12*fp->N_RB_UL; db_halflength = (db_fulllength)>>1; slotoffsetF = 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength - 1; - IF4p5_header_t *ul_header = (IF4p5_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); - data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t); - - gen_IF4p5_ul_header(ul_header, frame, subframe); - - for (symbol_id=0; symbol_id<fp->symbols_per_tti; symbol_id++) { - - for (element_id=0; element_id<db_halflength; element_id++) { - i = (uint16_t*) &rxdataF[0][blockoffsetF+element_id]; - data_block[element_id] = ((uint16_t) lin2alaw[*i]) | (lin2alaw[*(i+1)]<<8); + if (subframe_select(fp,subframe)==SF_S) { + nsym=fp->ul_symbols_in_S_subframe; + slotoffsetF += (fp->ofdm_symbol_size*(fp->symbols_per_tti-nsym)); + blockoffsetF += (fp->ofdm_symbol_size*(fp->symbols_per_tti-nsym)); + } - i = (uint16_t*) &rxdataF[0][slotoffsetF+element_id]; - data_block[element_id+db_halflength] = ((uint16_t) lin2alaw[*i]) | (lin2alaw[*(i+1)]<<8); - } - - ul_header->frame_status &= ~(0x000f<<26); - ul_header->frame_status |= (symbol_id&0x000f)<<26; - + if (eth->flags == ETH_RAW_IF4p5_MODE) { + packet_header = (IF4p5_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); + data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t); + } else { + packet_header = (IF4p5_header_t *)(tx_buffer); + data_block = (uint16_t*)(tx_buffer + sizeof_IF4p5_header_t); + } + gen_IF4p5_ul_header(packet_header, packet_type, frame, subframe); + + if (packet_type == IF4p5_PULFFT) { + for (symbol_id=fp->symbols_per_tti-nsym; symbol_id<fp->symbols_per_tti; symbol_id++) { + LOG_D(PHY,"IF4p5_PULFFT: frame %d, subframe %d, symbol %d\n",frame,subframe,symbol_id); + for (element_id=0; element_id<db_halflength; element_id++) { + i = (uint16_t*) &rxdataF[0][blockoffsetF+element_id]; + data_block[element_id] = ((uint16_t) lin2alaw[*i]) | (lin2alaw[*(i+1)]<<8); + + i = (uint16_t*) &rxdataF[0][slotoffsetF+element_id]; + data_block[element_id+db_halflength] = ((uint16_t) lin2alaw[*i]) | (lin2alaw[*(i+1)]<<8); + } + + packet_header->frame_status &= ~(0x000f<<26); + packet_header->frame_status |= (symbol_id&0x000f)<<26; + + if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice, + symbol_id, + &tx_buffer, + db_fulllength, + 1, + IF4p5_PULFFT)) < 0) { + perror("ETHERNET write for IF4p5_PULFFT\n"); + } + + slotoffsetF += fp->ofdm_symbol_size; + blockoffsetF += fp->ofdm_symbol_size; + } + } + else { if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice, - symbol_id, - &tx_buffer, - db_fulllength, - 1, - IF4p5_PULFFT)) < 0) { - perror("ETHERNET write for IF4p5_PULFFT\n"); + 0, + &tx_buffer, + 0, + 1, + IF4p5_PULTICK)) < 0) { + perror("ETHERNET write for IF4p5_PULFFT\n"); } - - slotoffsetF += fp->ofdm_symbol_size; - blockoffsetF += fp->ofdm_symbol_size; - } + } } else if (packet_type == IF4p5_PRACH) { // FIX: hard coded prach samples length - db_fulllength = 840*2; - - IF4p5_header_t *prach_header = (IF4p5_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); - data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t); + LOG_D(PHY,"IF4p5_PRACH: frame %d, subframe %d\n",frame,subframe); + db_fulllength = PRACH_HARD_CODED_NUM_SAMPLES; + + if (eth->flags == ETH_RAW_IF4p5_MODE) { + packet_header = (IF4p5_header_t *)(tx_buffer_prach + MAC_HEADER_SIZE_BYTES); + data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t); + } else { + packet_header = (IF4p5_header_t *)(tx_buffer_prach); + data_block = (uint16_t*)(tx_buffer_prach + sizeof_IF4p5_header_t); + } + gen_IF4p5_prach_header(packet_header, frame, subframe); + + if (eth->flags == ETH_RAW_IF4p5_MODE) { + memcpy((int16_t*)(tx_buffer_prach + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t), + (&rxsigF[0][k]), + PRACH_BLOCK_SIZE_BYTES); + } else { + memcpy((int16_t*)(tx_buffer_prach + sizeof_IF4p5_header_t), + (&rxsigF[0][k]), + PRACH_BLOCK_SIZE_BYTES); + } - gen_IF4p5_prach_header(prach_header, frame, subframe); - - memcpy((int16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t), - (&rxsigF[0][k]), - db_fulllength*sizeof(int16_t)); - if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice, symbol_id, - &tx_buffer, + &tx_buffer_prach, db_fulllength, 1, IF4p5_PRACH)) < 0) { @@ -148,7 +199,7 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type AssertFatal(1==0, "send_IF4p5 - Unknown packet_type %x", packet_type); } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); + if (eNB->CC_id==0) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); return; } @@ -163,8 +214,9 @@ void recv_IF4p5(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_t uint16_t element_id; uint16_t db_fulllength, db_halflength; int slotoffsetF=0, blockoffsetF=0; + eth_state_t *eth = (eth_state_t*) (eNB->ifdevice.priv); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); + if (eNB->CC_id==0) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); if (eNB->node_function == NGFI_RRU_IF4p5) { db_fulllength = (12*fp->N_RB_DL); @@ -183,17 +235,28 @@ void recv_IF4p5(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_t 0) < 0) { perror("ETHERNET read"); } - - packet_header = (IF4p5_header_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES); - data_block = (uint16_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES+sizeof_IF4p5_header_t); + if (eth->flags == ETH_RAW_IF4p5_MODE) { + packet_header = (IF4p5_header_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES); + data_block = (uint16_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES+sizeof_IF4p5_header_t); + } else { + packet_header = (IF4p5_header_t*) (rx_buffer); + data_block = (uint16_t*) (rx_buffer+sizeof_IF4p5_header_t); + } + + + *frame = ((packet_header->frame_status)>>6)&0xffff; - *subframe = ((packet_header->frame_status)>>22)&0x000f; + *subframe = ((packet_header->frame_status)>>22)&0x000f; + + *packet_type = packet_header->sub_type; if (*packet_type == IF4p5_PDLFFT) { *symbol_number = ((packet_header->frame_status)>>26)&0x000f; + LOG_D(PHY,"DL_IF4p5: CC_id %d : frame %d, subframe %d, symbol %d\n",eNB->CC_id,*frame,*subframe,*symbol_number); + slotoffsetF = (*symbol_number)*(fp->ofdm_symbol_size) + (*subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength - 1; @@ -210,6 +273,8 @@ void recv_IF4p5(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_t } else if (*packet_type == IF4p5_PULFFT) { *symbol_number = ((packet_header->frame_status)>>26)&0x000f; + if (eNB->CC_id==1) LOG_I(PHY,"UL_IF4p5: CC_id %d : frame %d, subframe %d, symbol %d\n",eNB->CC_id,*frame,*subframe,*symbol_number); + slotoffsetF = (*symbol_number)*(fp->ofdm_symbol_size) + 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength - 1; @@ -224,18 +289,27 @@ void recv_IF4p5(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_t } } else if (*packet_type == IF4p5_PRACH) { + if (eNB->CC_id==1) LOG_I(PHY,"PRACH_IF4p5: CC_id %d : frame %d, subframe %d, symbol %d\n",eNB->CC_id,*frame,*subframe); + // FIX: hard coded prach samples length - db_fulllength = 840*2; - - memcpy((&rxsigF[0][0]), - (int16_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES+sizeof_IF4p5_header_t), - db_fulllength*sizeof(int16_t)); - + db_fulllength = PRACH_HARD_CODED_NUM_SAMPLES; + + if (eth->flags == ETH_RAW_IF4p5_MODE) { + memcpy((&rxsigF[0][0]), + (int16_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES+sizeof_IF4p5_header_t), + PRACH_BLOCK_SIZE_BYTES); + } else { + memcpy((&rxsigF[0][0]), + (int16_t*) (rx_buffer+sizeof_IF4p5_header_t), + PRACH_BLOCK_SIZE_BYTES); + } + } else if (*packet_type == IF4p5_PULTICK) { + } else { AssertFatal(1==0, "recv_IF4p5 - Unknown packet_type %x", *packet_type); } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); + if (eNB->CC_id==0) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); return; } @@ -253,10 +327,10 @@ void gen_IF4p5_dl_header(IF4p5_header_t *dl_packet, int frame, int subframe) { } -void gen_IF4p5_ul_header(IF4p5_header_t *ul_packet, int frame, int subframe) { +void gen_IF4p5_ul_header(IF4p5_header_t *ul_packet, uint16_t packet_subtype, int frame, int subframe) { ul_packet->type = IF4p5_PACKET_TYPE; - ul_packet->sub_type = IF4p5_PULFFT; + ul_packet->sub_type = packet_subtype; ul_packet->rsvd = 0; @@ -282,6 +356,18 @@ void gen_IF4p5_prach_header(IF4p5_header_t *prach_packet, int frame, int subfram void malloc_IF4p5_buffer(PHY_VARS_eNB *eNB) { // Keep the size large enough - eNB->ifbuffer.tx = malloc(RAW_IF4p5_PRACH_SIZE_BYTES); - eNB->ifbuffer.rx = malloc(RAW_IF4p5_PRACH_SIZE_BYTES); + eth_state_t *eth = (eth_state_t*) (eNB->ifdevice.priv); + int i; + + if (eth->flags == ETH_RAW_IF4p5_MODE) { + for (i=0;i<10;i++) + eNB->ifbuffer.tx[i] = malloc(RAW_IF4p5_PRACH_SIZE_BYTES); + eNB->ifbuffer.tx_prach = malloc(RAW_IF4p5_PRACH_SIZE_BYTES); + eNB->ifbuffer.rx = malloc(RAW_IF4p5_PRACH_SIZE_BYTES); + } else { + for (i=0;i<10;i++) + eNB->ifbuffer.tx[i] = malloc(UDP_IF4p5_PRACH_SIZE_BYTES); + eNB->ifbuffer.tx_prach = malloc(UDP_IF4p5_PRACH_SIZE_BYTES); + eNB->ifbuffer.rx = malloc(UDP_IF4p5_PRACH_SIZE_BYTES); + } } diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.h b/openair1/PHY/LTE_TRANSPORT/if4_tools.h index 1f78e7f77afea2f8bdb43fc988fe36e239d0cf62..e2d4f1f7de0b6cb413eb4479664ebabd0fc53db7 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.h @@ -37,6 +37,7 @@ #define IF4p5_PULFFT 0x0019 #define IF4p5_PDLFFT 0x0020 #define IF4p5_PRACH 0x0021 +#define IF4p5_PULTICK 0x0022 struct IF4p5_header { /// Type @@ -55,7 +56,7 @@ typedef struct IF4p5_header IF4p5_header_t; void gen_IF4p5_dl_header(IF4p5_header_t*, int, int); -void gen_IF4p5_ul_header(IF4p5_header_t*, int, int); +void gen_IF4p5_ul_header(IF4p5_header_t*, uint16_t, int, int); void gen_IF4p5_prach_header(IF4p5_header_t*, int, int); diff --git a/openair1/PHY/LTE_TRANSPORT/if5_tools.c b/openair1/PHY/LTE_TRANSPORT/if5_tools.c index 7be4c8d1df9051e0e86adaa59e91019bf1318a52..5b1c8347053e5bd0e1a1c5709f053bc8f2430eff 100644 --- a/openair1/PHY/LTE_TRANSPORT/if5_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if5_tools.c @@ -21,11 +21,11 @@ /*! \file PHY/LTE_TRANSPORT/if5_tools.c * \brief -* \author S. Sandeep Kumar, Raymond Knopp +* \author S. Sandeep Kumar, Raymond Knopp, Tien-Thinh Nguyen * \date 2016 * \version 0.1 * \company Eurecom -* \email: ee13b1025@iith.ac.in, knopp@eurecom.fr +* \email: ee13b1025@iith.ac.in, knopp@eurecom.fr, tien-thinh.nguyen@eurecom.fr * \note * \warning */ @@ -34,13 +34,21 @@ #include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h" #include "UTIL/LOG/vcd_signal_dumper.h" +//#define DEBUG_DL_MOBIPASS +//#define DEBUG_UL_MOBIPASS +#define SUBFRAME_SKIP_NUM_MOBIPASS 8 +int dummy_cnt = 0; +int subframe_skip_extra = 0; +int start_flag = 1; +int offset_cnt = 1; void send_IF5(PHY_VARS_eNB *eNB, openair0_timestamp proc_timestamp, int subframe, uint8_t *seqno, uint16_t packet_type) { LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; int32_t *txp[fp->nb_antennas_tx], *rxp[fp->nb_antennas_rx]; int32_t *tx_buffer=NULL; + int8_t dummy_buffer[fp->samples_per_tti*2]; uint16_t packet_id=0, i=0; uint32_t spp_eth = (uint32_t) eNB->ifdevice.openair0_cfg->samples_per_packet; @@ -89,17 +97,18 @@ void send_IF5(PHY_VARS_eNB *eNB, openair0_timestamp proc_timestamp, int subframe } } else if (packet_type == IF5_MOBIPASS) { - uint16_t db_fulllength=640; + uint16_t db_fulllength = PAYLOAD_MOBIPASS_NUM_SAMPLES; __m128i *data_block=NULL, *data_block_head=NULL; __m128i *txp128; __m128i t0, t1; - tx_buffer = memalign(16, MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t)); + // tx_buffer = memalign(16, MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t)); + tx_buffer = malloc(MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t)); IF5_mobipass_header_t *header = (IF5_mobipass_header_t *)((uint8_t *)tx_buffer + MAC_HEADER_SIZE_BYTES); - data_block_head = (__m128i *)((uint8_t *)tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + 4); - + data_block_head = (__m128i *)((uint8_t *)tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t); + header->flags = 0; header->fifo_status = 0; header->seqno = *seqno; @@ -110,14 +119,14 @@ void send_IF5(PHY_VARS_eNB *eNB, openair0_timestamp proc_timestamp, int subframe txp128 = (__m128i *) txp[0]; for (packet_id=0; packet_id<fp->samples_per_tti/db_fulllength; packet_id++) { - header->time_stamp = (uint32_t)(proc_timestamp + packet_id*db_fulllength); + header->time_stamp = htonl((uint32_t)(proc_timestamp + packet_id*db_fulllength)); data_block = data_block_head; for (i=0; i<db_fulllength>>2; i+=2) { t0 = _mm_srai_epi16(*txp128++, 4); t1 = _mm_srai_epi16(*txp128++, 4); - - *data_block++ = _mm_packs_epi16(t0, t1); +// *data_block++ = _mm_packs_epi16(t0, t1); + _mm_storeu_si128(data_block++, _mm_packs_epi16(t0, t1)); } // Write the packet to the fronthaul @@ -129,18 +138,38 @@ void send_IF5(PHY_VARS_eNB *eNB, openair0_timestamp proc_timestamp, int subframe IF5_MOBIPASS)) < 0) { perror("ETHERNET write for IF5_MOBIPASS\n"); } - +#ifdef DEBUG_DL_MOBIPASS + if ((subframe==0)&&(dummy_cnt == 100)) { + memcpy((void*)&dummy_buffer[packet_id*db_fulllength*2],(void*)data_block_head,db_fulllength*2); + } +#endif header->seqno += 1; } *seqno = header->seqno; - + +#ifdef DEBUG_DL_MOBIPASS + uint8_t txe; + txe = dB_fixed(signal_energy(txp[0],fp->samples_per_tti)); + if (txe > 0){ + LOG_D(PHY,"[Mobipass] frame:%d, subframe:%d, energy %d\n", (proc_timestamp/(10*fp->samples_per_tti))&1023,subframe, txe); + } +#endif } else { AssertFatal(1==0, "send_IF5 - Unknown packet_type %x", packet_type); } free(tx_buffer); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 0 ); - +#ifdef DEBUG_DL_MOBIPASS + if(subframe==0) { + if (dummy_cnt==100) { + write_output("txsigmb.m","txs",(void*)dummy_buffer, fp->samples_per_tti,1, 5); + exit(-1); + } else { + dummy_cnt++; + } + } +#endif return; } @@ -151,6 +180,8 @@ void recv_IF5(PHY_VARS_eNB *eNB, openair0_timestamp *proc_timestamp, int subfram int32_t *txp[fp->nb_antennas_tx], *rxp[fp->nb_antennas_rx]; uint16_t packet_id=0, i=0; + int8_t dummy_buffer_rx[fp->samples_per_tti*2]; + uint8_t rxe; int32_t spp_eth = (int32_t) eNB->ifdevice.openair0_cfg->samples_per_packet; int32_t spsf = (int32_t) eNB->ifdevice.openair0_cfg->samples_per_frame/10; @@ -202,7 +233,128 @@ void recv_IF5(PHY_VARS_eNB *eNB, openair0_timestamp *proc_timestamp, int subfram } else if (packet_type == IF5_MOBIPASS) { - + uint16_t db_fulllength = PAYLOAD_MOBIPASS_NUM_SAMPLES; + openair0_timestamp timestamp_mobipass[fp->samples_per_tti/db_fulllength]; + int lower_offset = 0; + int upper_offset = 70000; + int subframe_skip = 0; + int reset_flag = 0; + int32_t *rx_buffer=NULL; + __m128i *data_block=NULL, *data_block_head=NULL; + __m128i *rxp128; + __m128i r0, r1; + + //rx_buffer = memalign(16, MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t)); + rx_buffer = malloc(MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t)); + IF5_mobipass_header_t *header = (IF5_mobipass_header_t *)((uint8_t *)rx_buffer + MAC_HEADER_SIZE_BYTES); + data_block_head = (__m128i *)((uint8_t *)rx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t); + + rxp[0] = (void*)&eNB->common_vars.rxdata[0][0][subframe*eNB->frame_parms.samples_per_tti]; + rxp128 = (__m128i *) (rxp[0]); + + eNB_proc_t *proc = &eNB->proc; +/* + // while(packet_id<fp->samples_per_tti/db_fulllength) { + data_block = data_block_head; + + eNB->ifdevice.trx_read_func(&eNB->ifdevice, + &ts0, + (void**)&rx_buffer, + db_fulllength, + 1 + ); + + if ((header->seqno == 1)&&(first_packet==1)) { + first_packet = 0; //ignore the packets before synchnorization + packet_id = 0; + ts_offset = ntohl(ts0); + } + if (first_packet==0) { + packet_cnt++; + ts = ntohl(ts0); + packet_id = (ts-ts_offset)/db_fulllength; + packet_id = packet_id % (fp->samples_per_tti/db_fulllength); + + printf("[IF5_tools]packet_id:%d\n", packet_id); + // if (ts_stored == 0) { + // ts_stored = 1; + *proc_timestamp = ntohl(ts - (packet_id*db_fulllength)); + // } + rxp[0] = (void*)&eNB->common_vars.rxdata[0][0][(subframe*eNB->frame_parms.samples_per_tti)+packet_id*db_fulllength]; + rxp128 = (__m128i *) (rxp[0]); + + for (i=0; i<db_fulllength>>2; i+=2) { + r0 = _mm_loadu_si128(data_block++); + *rxp128++ =_mm_slli_epi16(_mm_srai_epi16(_mm_unpacklo_epi8(r0,r0),8),4); + *rxp128++ =_mm_slli_epi16(_mm_srai_epi16(_mm_unpackhi_epi8(r0,r0),8),4); + } + } + // }//end while +*/ + + + packet_id=0; + while(packet_id<fp->samples_per_tti/db_fulllength) { + data_block = data_block_head; + + eNB->ifdevice.trx_read_func(&eNB->ifdevice, + ×tamp_mobipass[packet_id], + (void**)&rx_buffer, + db_fulllength, + 1 + ); +#ifdef DEBUG_UL_MOBIPASS + if (((proc->timestamp_tx + lower_offset) > ntohl(timestamp_mobipass[packet_id])) || ((proc->timestamp_tx + upper_offset) < ntohl(timestamp_mobipass[packet_id]))) { + //ignore the packet + subframe_skip_extra = (subframe_skip_extra + 1)%67; + LOG_D("[Mobipass] ignored packet, id:[%d,%d], proc->timestamp_tx:%llu, proc->timestamp_rx:%llu, seqno:%d\n", packet_id,subframe_skip_extra, proc->timestamp_tx, ntohl(timestamp_mobipass[packet_id]), header->seqno); + } +#endif + //skip SUBFRAME_SKIP_NUM_MOBIPASS additional UL packets + if ((start_flag == 1) && (subframe_skip < SUBFRAME_SKIP_NUM_MOBIPASS)){ + subframe_skip++; + offset_cnt = header->seqno; + } else { + if ((offset_cnt != header->seqno) && (start_flag == 0) && (proc->first_rx > 3)){ +#ifdef DEBUG_UL_MOBIPASS + LOG_D(PHY,"[Mobipass] Reset sequence number, offset_cnt:%d, header->seqno:%d, packet_id:%d\n", offset_cnt, header->seqno, packet_id); +#endif + reset_flag=1; + } + if ((reset_flag == 1) && (proc->first_rx > 3 ) && (start_flag == 0) && (packet_id == 0)) { + packet_id = 1; + reset_flag = 0; + } + start_flag = 0; + + //store rxdata and increase packet_id + rxp[0] = (void*)&eNB->common_vars.rxdata[0][0][(subframe*eNB->frame_parms.samples_per_tti)+packet_id*db_fulllength]; + rxp128 = (__m128i *) (rxp[0]); + for (i=0; i<db_fulllength>>2; i+=2) { + r0 = _mm_loadu_si128(data_block++); + *rxp128++ =_mm_slli_epi16(_mm_srai_epi16(_mm_unpacklo_epi8(r0,r0),8),4); + *rxp128++ =_mm_slli_epi16(_mm_srai_epi16(_mm_unpackhi_epi8(r0,r0),8),4); + } + packet_id++; + offset_cnt = (header->seqno+1)&255; + } + }//end while + + *proc_timestamp = ntohl(timestamp_mobipass[0]); +#ifdef DEBUG_UL_MOBIPASS + LOG_I(PHY,"[Mobipass][Recv_MOBIPASS] timestamp: %llu\n ", *proc_timestamp); +if (eNB->CC_id>0) { + rxe = dB_fixed(signal_energy(rxp[0],fp->samples_per_tti)); + if (rxe > 0){ + LOG_I(PHY,"[Mobipass] frame:%d, subframe:%d, energy %d\n", (*proc_timestamp/(10*fp->samples_per_tti))&1023,subframe, rxe); +// write_output("rxsigmb.m","rxs",(void*)dummy_buffer_rx, fp->samples_per_tti,1, 5); +// exit(-1); + } +} +#endif + + + } else { AssertFatal(1==0, "recv_IF5 - Unknown packet_type %x", packet_type); } diff --git a/openair1/PHY/LTE_TRANSPORT/initial_sync.c b/openair1/PHY/LTE_TRANSPORT/initial_sync.c index 9ba6f2e2ac6fb8ef74bb1a93ab8dcbfb0cbdc1fd..c29562b6cdbc3e40cce3d0d8f54515f12368dd88 100644 --- a/openair1/PHY/LTE_TRANSPORT/initial_sync.c +++ b/openair1/PHY/LTE_TRANSPORT/initial_sync.c @@ -83,7 +83,7 @@ int pbch_detection(PHY_VARS_UE *ue, runmode_t mode) lte_ue_measurements(ue, ue->rx_offset, 0, - 0); + 0,0); if (ue->frame_parms.frame_type == TDD) { diff --git a/openair1/PHY/LTE_TRANSPORT/pbch.c b/openair1/PHY/LTE_TRANSPORT/pbch.c index 8f6489861bcbba82daa2599e3927b86076be4fd9..e28e179b07a3b21bee4b60e6005d5d19a1617312 100644 --- a/openair1/PHY/LTE_TRANSPORT/pbch.c +++ b/openair1/PHY/LTE_TRANSPORT/pbch.c @@ -900,8 +900,8 @@ uint16_t rx_pbch(LTE_UE_COMMON *lte_ue_common_vars, #ifdef DEBUG_PBCH msg("[PBCH] starting extract\n"); #endif - pbch_extract(lte_ue_common_vars->rxdataF, - lte_ue_common_vars->dl_ch_estimates[eNB_id], + pbch_extract(lte_ue_common_vars->common_vars_rx_data_per_thread[0].rxdataF, + lte_ue_common_vars->common_vars_rx_data_per_thread[0].dl_ch_estimates[eNB_id], lte_ue_pbch_vars->rxdataF_ext, lte_ue_pbch_vars->dl_ch_estimates_ext, symbol, diff --git a/openair1/PHY/LTE_TRANSPORT/pcfich.c b/openair1/PHY/LTE_TRANSPORT/pcfich.c index 08a3d80904fb886948898cd227f45842f0e56d42..3b141372f03dd0e12e7077c69903c0033862b9e2 100644 --- a/openair1/PHY/LTE_TRANSPORT/pcfich.c +++ b/openair1/PHY/LTE_TRANSPORT/pcfich.c @@ -191,7 +191,7 @@ void generate_pcfich(uint8_t num_pdcch_symbols, // mapping nsymb = (frame_parms->Ncp==0) ? 14:12; - symbol_offset = (uint32_t)frame_parms->ofdm_symbol_size*((subframe*nsymb)); + symbol_offset = (uint32_t)frame_parms->ofdm_symbol_size*(subframe*nsymb); re_offset = frame_parms->first_carrier_offset; // loop over 4 quadruplets and lookup REGs diff --git a/openair1/PHY/LTE_TRANSPORT/phich.c b/openair1/PHY/LTE_TRANSPORT/phich.c index 64daa949d15cef6c3c18135a7fb8907c55888e5f..b46c4167061a35147a9f3d8a94d3b83d89a5f39f 100644 --- a/openair1/PHY/LTE_TRANSPORT/phich.c +++ b/openair1/PHY/LTE_TRANSPORT/phich.c @@ -1393,13 +1393,13 @@ void rx_phich(PHY_VARS_UE *ue, } } else { //#ifdef DEBUG_PHICH - LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH, received NAK (%d) nseq %d, ngroup %d\n", + LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH, received NAK (%d) nseq %d, ngroup %d (Mlimit %d)\n", ue->Mod_id,harq_pid, - proc->frame_rx, + proc->frame_rx%1024, subframe, HI16, nseq_PHICH, - ngroup_PHICH, + ngroup_PHICH,ulsch->harq_processes[harq_pid]->round+1, ulsch->Mlimit); //#endif @@ -1450,7 +1450,7 @@ void rx_phich(PHY_VARS_UE *ue, //#ifdef PHICH_DEBUG LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH, received ACK (%d) nseq %d, ngroup %d\n\n", ue->Mod_id,harq_pid, - proc->frame_rx, + proc->frame_rx%1024, subframe, HI16, nseq_PHICH,ngroup_PHICH); //#endif diff --git a/openair1/PHY/LTE_TRANSPORT/pmch.c b/openair1/PHY/LTE_TRANSPORT/pmch.c index 1a2838e5cfa3aa86839c9a56e4f4ed95dc60e8c9..3bd327588316856414ef781e1bf5fc9ff5b48767 100644 --- a/openair1/PHY/LTE_TRANSPORT/pmch.c +++ b/openair1/PHY/LTE_TRANSPORT/pmch.c @@ -74,7 +74,7 @@ void dump_mch(PHY_VARS_UE *ue,uint8_t eNB_id,uint16_t coded_bits_per_codeword,in write_output(fname,vname,ue->pdsch_vars_MCH[eNB_id]->dl_ch_magb0[0],12*N_RB_DL*nsymb_pmch,1,1); write_output("mch00_ch0.m","pmch00_ch0", - &(ue->common_vars.dl_ch_estimates[eNB_id][0][0]), + &(ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][0][0]), ue->frame_parms.ofdm_symbol_size*12,1,1); write_output("rxsig_mch.m","rxs_mch", @@ -969,8 +969,8 @@ int rx_pmch(PHY_VARS_UE *ue, //printf("*********************mch: symbol %d\n",symbol); - mch_extract_rbs(common_vars->rxdataF, - common_vars->dl_ch_estimates[eNB_id], + mch_extract_rbs(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF, + common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id], pdsch_vars[eNB_id]->rxdataF_ext, pdsch_vars[eNB_id]->dl_ch_estimates_ext, symbol, diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index 33780a7defc05282a7f465088aa8c188a206b26f..489fdb0f71dae676914243a7d93c2ed59f4eb8eb 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.c +++ b/openair1/PHY/LTE_TRANSPORT/prach.c @@ -1185,9 +1185,7 @@ void rx_prach(PHY_VARS_eNB *eNB, break; } - if (eNB->frame_parms.threequarter_fs == 1) - Ncp=(Ncp*3)>>2; - + // Adjust CP length based on UL bandwidth switch (eNB->frame_parms.N_RB_UL) { case 6: Ncp>>=4; @@ -1208,6 +1206,11 @@ void rx_prach(PHY_VARS_eNB *eNB, case 75: Ncp=(Ncp*3)>>2; break; + + case 100: + if (eNB->frame_parms.threequarter_fs == 1) + Ncp=(Ncp*3)>>2; + break; } diff --git a/openair1/PHY/LTE_TRANSPORT/proto.h b/openair1/PHY/LTE_TRANSPORT/proto.h index 94fa78a14bd00d138ce61898118107965ccf0fd8..a9674ca21e44518062fb23822f1ca41b17404ad6 100644 --- a/openair1/PHY/LTE_TRANSPORT/proto.h +++ b/openair1/PHY/LTE_TRANSPORT/proto.h @@ -1570,7 +1570,8 @@ int32_t generate_ue_ulsch_params_from_rar(PHY_VARS_UE *phy_vars_ue, UE_rxtx_proc_t *proc, uint8_t eNB_id); double sinr_eff_cqi_calc(PHY_VARS_UE *phy_vars_ue, - uint8_t eNB_id); + uint8_t eNB_id, + uint8_t subframe); uint8_t sinr2cqi(double sinr,uint8_t trans_mode); diff --git a/openair1/PHY/LTE_TRANSPORT/pucch.c b/openair1/PHY/LTE_TRANSPORT/pucch.c index 34e64dfd5f74b325cbc68747c3e63b1962508cc0..db671f048c9d066c5413742e0b94ab51d6b37816 100644 --- a/openair1/PHY/LTE_TRANSPORT/pucch.c +++ b/openair1/PHY/LTE_TRANSPORT/pucch.c @@ -555,6 +555,7 @@ void generate_pucch2x(int32_t **txdataF, N_UL_symb = (fp->Ncp==0) ? 7 : 6; data_ind = 0; zptr = z; + nprime = 0; for (ns=(subframe<<1),u=u0,v=v0; ns<(2+(subframe<<1)); ns++,u=u1,v=v1) { if ((ns&1) == 0) diff --git a/openair1/PHY/LTE_TRANSPORT/sss.c b/openair1/PHY/LTE_TRANSPORT/sss.c index b3970a442957364a6f7bb2fa11cbcb3684690705..85398edddba052105db304a77176aabe9987724a 100644 --- a/openair1/PHY/LTE_TRANSPORT/sss.c +++ b/openair1/PHY/LTE_TRANSPORT/sss.c @@ -163,7 +163,7 @@ int _do_pss_sss_extract(PHY_VARS_UE *ue, int rx_offset = frame_parms->ofdm_symbol_size-3*12; uint8_t pss_symb,sss_symb; - int32_t **rxdataF = ue->common_vars.rxdataF; + int32_t **rxdataF = ue->common_vars.common_vars_rx_data_per_thread[0].rxdataF; if (frame_parms->frame_type == FDD) { pss_symb = 6-frame_parms->Ncp; diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c index 6cb732573b873b7610b221d9281a83f95ef436ff..9571ea6cd52823d8409a2781bdd1c2ab5fc7c6e4 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c @@ -190,7 +190,7 @@ LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag) return(ulsch); } - LOG_E(PHY,"new_ue_ulsch exit flag, size of %d , %d\n",exit_flag, sizeof(LTE_UE_ULSCH_t)); + LOG_E(PHY,"new_ue_ulsch exit flag, size of %d , %zu\n",exit_flag, sizeof(LTE_UE_ULSCH_t)); free_ue_ulsch(ulsch); return(NULL); @@ -234,7 +234,7 @@ uint32_t ulsch_encoding(uint8_t *a, PHY_MEASUREMENTS *meas = &ue->measurements; LTE_UE_ULSCH_t *ulsch=ue->ulsch[eNB_id]; LTE_UE_DLSCH_t **dlsch = ue->dlsch[eNB_id]; - uint16_t rnti; + uint16_t rnti = 0xffff; if (!ulsch) { LOG_E(PHY,"Null ulsch ptr %p\n",ulsch); diff --git a/openair1/PHY/MODULATION/beamforming.c b/openair1/PHY/MODULATION/beamforming.c index 6557a47ee7a35c6d31ea267cdb7762c0ffede9d5..88ac12b0a711a71bac32e18f0de528cfccd425f5 100644 --- a/openair1/PHY/MODULATION/beamforming.c +++ b/openair1/PHY/MODULATION/beamforming.c @@ -63,28 +63,30 @@ int beam_precoding(int32_t **txdataF, // clear txdata_BF[aa][re] for each call of ue_spec_beamforming memset(txdataF_BF[aa],0,sizeof(int32_t)*(frame_parms->ofdm_symbol_size)); - for (p=0; p<14; p++) { - //if (p==0 || p==1 || p==5 || p>7) - // mult_cpx_conj_vector((int16_t*)txdataF[p], (int16_t*)beam_weights[p][aa], (int16_t*)txdataF_BF[aa], frame_parms->ofdm_symbol_size, 15); - for (re=0;re<frame_parms->ofdm_symbol_size;re++) { - if ((p==0 || p==1 || p==5 || p>=7) && txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re]!=0) { - ((int16_t*)&txdataF_BF[aa][re])[0] += (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0]*((int16_t*)&beam_weights[p][aa][re])[0])>>15); - ((int16_t*)&txdataF_BF[aa][re])[0] -= (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1]*((int16_t*)&beam_weights[p][aa][re])[1])>>15); - ((int16_t*)&txdataF_BF[aa][re])[1] += (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0]*((int16_t*)&beam_weights[p][aa][re])[1])>>15); - ((int16_t*)&txdataF_BF[aa][re])[1] += (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1]*((int16_t*)&beam_weights[p][aa][re])[0])>>15); + for (p=0; p<NB_ANTENNA_PORTS_ENB; p++) { + if (p<frame_parms->nb_antenna_ports_eNB || p==5) { + multadd_cpx_vector((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size],(int16_t*)beam_weights[p][aa], (int16_t*)txdataF_BF[aa], 0, frame_parms->ofdm_symbol_size, 15); + //mult_cpx_conj_vector((int16_t*)beam_weights[p][aa], (int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size], (int16_t*)txdataF_BF[aa], frame_parms->ofdm_symbol_size, 15, 1); - /* - printf("beamforming.c:txdataF[%d][%d]=%d+j%d, beam_weights[%d][%d][%d]=%d+j%d,txdata_BF[%d][%d]=%d+j%d\n", - p,slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re, - ((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0], - ((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1], - p,aa,re, - ((int16_t*)&beam_weights[p][aa][re])[0],((int16_t*)&beam_weights[p][aa][re])[1], - aa,re, - ((int16_t*)&txdataF_BF[aa][re])[0], - ((int16_t*)&txdataF_BF[aa][re])[1]); - */ - } + // if check version + /*for (re=0;re<frame_parms->ofdm_symbol_size;re++) { + if (txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re]!=0) { + ((int16_t*)&txdataF_BF[aa][re])[0] += (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0]*((int16_t*)&beam_weights[p][aa][re])[0])>>15); + ((int16_t*)&txdataF_BF[aa][re])[0] -= (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1]*((int16_t*)&beam_weights[p][aa][re])[1])>>15); + ((int16_t*)&txdataF_BF[aa][re])[1] += (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0]*((int16_t*)&beam_weights[p][aa][re])[1])>>15); + ((int16_t*)&txdataF_BF[aa][re])[1] += (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1]*((int16_t*)&beam_weights[p][aa][re])[0])>>15); + + printf("beamforming.c:txdataF[%d][%d]=%d+j%d, beam_weights[%d][%d][%d]=%d+j%d,txdata_BF[%d][%d]=%d+j%d\n", + p,slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re, + ((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0], + ((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1], + p,aa,re, + ((int16_t*)&beam_weights[p][aa][re])[0],((int16_t*)&beam_weights[p][aa][re])[1], + aa,re, + ((int16_t*)&txdataF_BF[aa][re])[0], + ((int16_t*)&txdataF_BF[aa][re])[1]); + } + }*/ } } return 0; diff --git a/openair1/PHY/MODULATION/compute_bf_weights.c b/openair1/PHY/MODULATION/compute_bf_weights.c index 32a91c11f50706718e3c75823ec48a67c6d9806c..4ef8e88ca6652433efbad3ce761463bd41836325 100644 --- a/openair1/PHY/MODULATION/compute_bf_weights.c +++ b/openair1/PHY/MODULATION/compute_bf_weights.c @@ -1,11 +1,12 @@ #include <stdio.h> #include <stdint.h> +#include <stdlib.h> #include "PHY/impl_defs_lte.h" int f_read(char *calibF_fname, int nb_ant, int nb_freq, int32_t **tdd_calib_coeffs){ FILE *calibF_fd; - int i,j,l,calibF_e; + int i,j,calibF_e; calibF_fd = fopen(calibF_fname,"r"); @@ -14,7 +15,7 @@ int f_read(char *calibF_fname, int nb_ant, int nb_freq, int32_t **tdd_calib_coef for(i=0;i<nb_ant;i++){ for(j=0;j<nb_freq*2;j++){ - fscanf(calibF_fd, "%d", &calibF_e); + if (fscanf(calibF_fd, "%d", &calibF_e) != 1) abort(); tdd_calib_coeffs[i][j] = (int16_t)calibF_e; } } @@ -22,11 +23,15 @@ int f_read(char *calibF_fname, int nb_ant, int nb_freq, int32_t **tdd_calib_coef printf("%d\n",(int)tdd_calib_coeffs[1][599]); } else printf("%s not found, running with defaults\n",calibF_fname); + /* TODO: what to return? is this code used at all? */ + return 0; } int estimate_DLCSI_from_ULCSI(int32_t **calib_dl_ch_estimates, int32_t **ul_ch_estimates, int32_t **tdd_calib_coeffs, int nb_ant, int nb_freq) { + /* TODO: what to return? is this code used at all? */ + return 0; } @@ -44,6 +49,8 @@ int compute_BF_weights(int32_t **beam_weights, int32_t **calib_dl_ch_estimates, default : break; } + /* TODO: what to return? is this code used at all? */ + return 0; } // temporal test function diff --git a/openair1/PHY/MODULATION/defs.h b/openair1/PHY/MODULATION/defs.h index 6937db6d9bb19241c282ac115d82aa8a88f754d6..da599114a91919c05cb66631bc751c2dc1ce3ab4 100644 --- a/openair1/PHY/MODULATION/defs.h +++ b/openair1/PHY/MODULATION/defs.h @@ -82,7 +82,7 @@ void normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,LTE_DL_FRA void do_OFDM_mod(int32_t **txdataF, int32_t **txdata, uint32_t frame,uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms); -void do_OFDM_mod_symbol(LTE_eNB_COMMON *eNB_common_vars, int eNB_id, uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms); +void do_OFDM_mod_symbol(LTE_eNB_COMMON *eNB_common_vars, int eNB_id, uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms,int do_precoding); void remove_7_5_kHz(PHY_VARS_eNB *phy_vars_eNB,uint8_t subframe); diff --git a/openair1/PHY/MODULATION/ofdm_mod.c b/openair1/PHY/MODULATION/ofdm_mod.c index 74037b4a6e0f9ba04432beacb239e1b8ac8bd368..f6f0c1f6185a0955b9bd7e7622dbe137fd6b754f 100644 --- a/openair1/PHY/MODULATION/ofdm_mod.c +++ b/openair1/PHY/MODULATION/ofdm_mod.c @@ -145,7 +145,7 @@ void PHY_ofdm_mod(int *input, /// pointer to complex input #else // on AVX2 need 256-bit alignment idft((int16_t *)&input[i*fftsize], - (fftsize<=512) ? (int16_t *)temp : (int16_t *)&output[(i*fftsize) + ((1+i)*nb_prefix_samples)], + (int16_t *)temp, 1); #endif @@ -163,8 +163,6 @@ void PHY_ofdm_mod(int *input, /// pointer to complex input #ifndef __AVX2__ if (fftsize==128) -#else - if (fftsize<=512) #endif { for (j=0; j<fftsize ; j++) { @@ -285,16 +283,16 @@ void do_OFDM_mod(int32_t **txdataF, int32_t **txdata, uint32_t frame,uint16_t ne } // OFDM modulation for each symbol -void do_OFDM_mod_symbol(LTE_eNB_COMMON *eNB_common_vars, int eNB_id, uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms) +void do_OFDM_mod_symbol(LTE_eNB_COMMON *eNB_common_vars, int eNB_id, uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms,int do_precoding) { - int aa, l, slot_offset; - int32_t **txdataF = eNB_common_vars->txdataF[eNB_id]; + int aa, l, slot_offset, slot_offsetF; + int32_t **txdataF = eNB_common_vars->txdataF[eNB_id]; int32_t **txdataF_BF = eNB_common_vars->txdataF_BF[eNB_id]; - int32_t **txdata = eNB_common_vars->txdata[eNB_id]; - - slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1); + int32_t **txdata = eNB_common_vars->txdata[eNB_id]; + slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1); + slot_offsetF = (next_slot)*(frame_parms->ofdm_symbol_size)*((frame_parms->Ncp==EXTENDED) ? 6 : 7); //printf("Thread %d starting ... aa %d (%llu)\n",omp_get_thread_num(),aa,rdtsc()); for (l=0; l<frame_parms->symbols_per_tti>>1; l++) { @@ -302,13 +300,13 @@ void do_OFDM_mod_symbol(LTE_eNB_COMMON *eNB_common_vars, int eNB_id, uint16_t ne //printf("do_OFDM_mod_l, slot=%d, l=%d, NUMBER_OF_OFDM_CARRIERS=%d,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES=%d\n",next_slot, l,NUMBER_OF_OFDM_CARRIERS,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_BEAM_PRECODING,1); - beam_precoding(txdataF,txdataF_BF,frame_parms,eNB_common_vars->beam_weights[eNB_id],next_slot,l,aa); + if (do_precoding==1) beam_precoding(txdataF,txdataF_BF,frame_parms,eNB_common_vars->beam_weights[eNB_id],next_slot,l,aa); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_BEAM_PRECODING,0); //PMCH case not implemented... - if (frame_parms->Ncp == 1) - PHY_ofdm_mod(txdataF_BF[aa], // input + if (frame_parms->Ncp == EXTENDED) + PHY_ofdm_mod((do_precoding == 1)?txdataF_BF[aa]:&txdataF[aa][slot_offsetF+l*frame_parms->ofdm_symbol_size], // input &txdata[aa][slot_offset+l*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES], // output frame_parms->ofdm_symbol_size, 1, // number of symbols @@ -316,7 +314,7 @@ void do_OFDM_mod_symbol(LTE_eNB_COMMON *eNB_common_vars, int eNB_id, uint16_t ne CYCLIC_PREFIX); else { if (l==0) { - PHY_ofdm_mod(txdataF_BF[aa], // input + PHY_ofdm_mod((do_precoding==1)?txdataF_BF[aa]:&txdataF[aa][slot_offsetF+l*frame_parms->ofdm_symbol_size], // input &txdata[aa][slot_offset], // output frame_parms->ofdm_symbol_size, 1, // number of symbols @@ -324,7 +322,7 @@ void do_OFDM_mod_symbol(LTE_eNB_COMMON *eNB_common_vars, int eNB_id, uint16_t ne CYCLIC_PREFIX); } else { - PHY_ofdm_mod(txdataF_BF[aa], // input + PHY_ofdm_mod((do_precoding==1)?txdataF_BF[aa]:&txdataF[aa][slot_offsetF+l*frame_parms->ofdm_symbol_size], // input &txdata[aa][slot_offset+OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES0+(l-1)*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES], // output frame_parms->ofdm_symbol_size, 1, // number of symbols diff --git a/openair1/PHY/MODULATION/slot_fep.c b/openair1/PHY/MODULATION/slot_fep.c index 94de0d3cbcae958fc5fd50d99186736a2f209973..3a3b3b4c0d48ed810ba7c1236314b7e994c2a24f 100644 --- a/openair1/PHY/MODULATION/slot_fep.c +++ b/openair1/PHY/MODULATION/slot_fep.c @@ -109,18 +109,12 @@ int slot_fep(PHY_VARS_UE *ue, for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) { - memset(&common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int)); + memset(&common_vars->common_vars_rx_data_per_thread[(Ns>>1)&0x1].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int)); rx_offset = sample_offset + slot_offset + nb_prefix_samples0 + subframe_offset - SOFFSET; // Align with 256 bit // rx_offset = rx_offset&0xfffffff8; -#ifdef DEBUG_FEP - // if (ue->frame <100) - printf("slot_fep: frame %d: slot %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, slot_offset %d, subframe_offset %d, sample_offset %d,rx_offset %d\n", ue->proc.proc_rxtx[(Ns>>1)&1].frame_rx,Ns, symbol, - nb_prefix_samples,nb_prefix_samples0,slot_offset,subframe_offset,sample_offset,rx_offset); -#endif - if (l==0) { if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size)) @@ -133,12 +127,12 @@ int slot_fep(PHY_VARS_UE *ue, (void *)&common_vars->rxdata[aa][rx_offset % frame_length_samples], frame_parms->ofdm_symbol_size*sizeof(int)); dft((int16_t *)tmp_dft_in, - (int16_t *)&common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); + (int16_t *)&common_vars->common_vars_rx_data_per_thread[(Ns>>1)&0x1].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); } else { // use dft input from RX buffer directly start_meas(&ue->rx_dft_stats); dft((int16_t *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples], - (int16_t *)&common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); + (int16_t *)&common_vars->common_vars_rx_data_per_thread[(Ns>>1)&0x1].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); stop_meas(&ue->rx_dft_stats); } @@ -148,8 +142,8 @@ int slot_fep(PHY_VARS_UE *ue, #ifdef DEBUG_FEP // if (ue->frame <100) - printf("slot_fep: frame %d: slot %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, slot_offset %d, subframe_offset %d, sample_offset %d,rx_offset %d\n", ue->proc.proc_rxtx[(Ns>>1)&1].frame_rx,Ns, symbol, - nb_prefix_samples,nb_prefix_samples0,slot_offset,subframe_offset,sample_offset,rx_offset); + LOG_I(PHY,"slot_fep: frame %d: slot %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, slot_offset %d, subframe_offset %d, sample_offset %d,rx_offset %d, frame_length_samples %d\n", ue->proc.proc_rxtx[(Ns>>1)&1].frame_rx,Ns, symbol, + nb_prefix_samples,nb_prefix_samples0,slot_offset,subframe_offset,sample_offset,rx_offset,frame_length_samples); #endif if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size)) @@ -164,11 +158,11 @@ int slot_fep(PHY_VARS_UE *ue, (void *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples], frame_parms->ofdm_symbol_size*sizeof(int)); dft((int16_t *)tmp_dft_in, - (int16_t *)&common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); + (int16_t *)&common_vars->common_vars_rx_data_per_thread[(Ns>>1)&0x1].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); } else { // use dft input from RX buffer directly dft((int16_t *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples], - (int16_t *)&common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); + (int16_t *)&common_vars->common_vars_rx_data_per_thread[(Ns>>1)&0x1].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); } stop_meas(&ue->rx_dft_stats); @@ -176,6 +170,10 @@ int slot_fep(PHY_VARS_UE *ue, } + #ifdef DEBUG_FEP + // if (ue->frame <100) + printf("slot_fep: frame %d: symbol %d rx_offset %d\n", ue->proc.proc_rxtx[(Ns>>1)&1].frame_rx, symbol,rx_offset); + #endif } if (ue->perfect_ce == 0) { @@ -211,7 +209,7 @@ int slot_fep(PHY_VARS_UE *ue, if (l==(4-frame_parms->Ncp)) { start_meas(&ue->dlsch_freq_offset_estimation_stats); - lte_est_freq_offset(common_vars->dl_ch_estimates[0], + lte_est_freq_offset(common_vars->common_vars_rx_data_per_thread[(Ns>>1)&0x1].dl_ch_estimates[0], frame_parms, l, &common_vars->freq_offset, diff --git a/openair1/PHY/MODULATION/slot_fep_mbsfn.c b/openair1/PHY/MODULATION/slot_fep_mbsfn.c index 850ea47916d62fcc52ba9184caf84fc36ae707b5..bead242dd8b9608a53e83a44fd9bec00aaaa1fcb 100644 --- a/openair1/PHY/MODULATION/slot_fep_mbsfn.c +++ b/openair1/PHY/MODULATION/slot_fep_mbsfn.c @@ -109,14 +109,14 @@ int slot_fep_mbsfn(PHY_VARS_UE *ue, #endif for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) { - memset(&common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*l],0,frame_parms->ofdm_symbol_size*sizeof(int)); + memset(&common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aa][frame_parms->ofdm_symbol_size*l],0,frame_parms->ofdm_symbol_size*sizeof(int)); if (l==0) { start_meas(&ue->rx_dft_stats); dft((int16_t *)&common_vars->rxdata[aa][(sample_offset + nb_prefix_samples0 + subframe_offset - SOFFSET) % frame_length_samples], - (int16_t *)&common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*l],1); + (int16_t *)&common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aa][frame_parms->ofdm_symbol_size*l],1); stop_meas(&ue->rx_dft_stats); } else { if ((sample_offset + @@ -134,7 +134,7 @@ int slot_fep_mbsfn(PHY_VARS_UE *ue, (frame_parms->ofdm_symbol_size+nb_prefix_samples)*(l-1) + subframe_offset- SOFFSET) % frame_length_samples], - (int16_t *)&common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*l],1); + (int16_t *)&common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aa][frame_parms->ofdm_symbol_size*l],1); stop_meas(&ue->rx_dft_stats); } } diff --git a/openair1/PHY/MODULATION/slot_fep_ul.c b/openair1/PHY/MODULATION/slot_fep_ul.c index b0798965807c1a8ac8511f775fded7dd2bff0615..e05f5361de0d21de4e198d91e6c5c34c724e475c 100644 --- a/openair1/PHY/MODULATION/slot_fep_ul.c +++ b/openair1/PHY/MODULATION/slot_fep_ul.c @@ -79,10 +79,10 @@ int slot_fep_ul(LTE_DL_FRAME_PARMS *frame_parms, if (no_prefix) { // subframe_offset = frame_parms->ofdm_symbol_size * frame_parms->symbols_per_tti * (Ns>>1); - slot_offset = frame_parms->ofdm_symbol_size * (frame_parms->symbols_per_tti>>1) * (Ns%2); + slot_offset = frame_parms->ofdm_symbol_size * (frame_parms->symbols_per_tti>>1) * (Ns&1); } else { // subframe_offset = frame_parms->samples_per_tti * (Ns>>1); - slot_offset = (frame_parms->samples_per_tti>>1) * (Ns%2); + slot_offset = (frame_parms->samples_per_tti>>1) * (Ns&1); } if (l<0 || l>=7-frame_parms->Ncp) { @@ -108,18 +108,22 @@ int slot_fep_ul(LTE_DL_FRAME_PARMS *frame_parms, 1 ); } else { + rx_offset += (frame_parms->ofdm_symbol_size+nb_prefix_samples)*l; + /* should never happen for eNB if(rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size)) { memcpy((void *)&eNB_common_vars->rxdata_7_5kHz[eNB_id][aa][frame_length_samples], (void *)&eNB_common_vars->rxdata_7_5kHz[eNB_id][aa][0], frame_parms->ofdm_symbol_size*sizeof(int)); } + */ - if( (rx_offset & 7) != 0){ + // check for 256-bit alignment of input buffer and do DFT directly, else do via intermediate buffer + if( (rx_offset & 15) != 0){ memcpy((void *)&tmp_dft_in, - (void *)&eNB_common_vars->rxdata_7_5kHz[eNB_id][aa][(rx_offset % frame_length_samples)], - frame_parms->ofdm_symbol_size*sizeof(int)); + (void *)&eNB_common_vars->rxdata_7_5kHz[eNB_id][aa][(rx_offset % frame_length_samples)], + frame_parms->ofdm_symbol_size*sizeof(int)); dft( (short *) tmp_dft_in, (short*) &eNB_common_vars->rxdataF[eNB_id][aa][frame_parms->ofdm_symbol_size*symbol], 1 diff --git a/openair1/PHY/TOOLS/cmult_vv.c b/openair1/PHY/TOOLS/cmult_vv.c index cefa972061efb6d54b8eafe337e30094493d94d1..9d5079f52b6ad938e83d9f55762f01f515639a24 100644 --- a/openair1/PHY/TOOLS/cmult_vv.c +++ b/openair1/PHY/TOOLS/cmult_vv.c @@ -27,6 +27,7 @@ #if defined(__x86_64__) || defined(__i386__) int16_t conjug[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1} ; +int16_t conjug2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1} ; #define simd_q15_t __m128i #define simdshort_q15_t __m64 #elif defined(__arm__) @@ -41,7 +42,8 @@ int mult_cpx_conj_vector(int16_t *x1, int16_t *x2, int16_t *y, uint32_t N, - int output_shift) + int output_shift, + int madd) { // Multiply elementwise the complex conjugate of x1 with x2. // x1 - input 1 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)| @@ -55,6 +57,8 @@ int mult_cpx_conj_vector(int16_t *x1, // N - the size f the vectors (this function does N cpx mpy. WARNING: N>=4; // // output_shift - shift to be applied to generate output + // + // madd - add the output to y uint32_t i; // loop counter @@ -88,7 +92,11 @@ int mult_cpx_conj_vector(int16_t *x1, tmp_im = _mm_srai_epi32(tmp_im,output_shift); tmpy0 = _mm_unpacklo_epi32(tmp_re,tmp_im); tmpy1 = _mm_unpackhi_epi32(tmp_re,tmp_im); - *y_128 = _mm_packs_epi32(tmpy0,tmpy1); + if (madd==0) + *y_128 = _mm_packs_epi32(tmpy0,tmpy1); + else + *y_128 += _mm_packs_epi32(tmpy0,tmpy1); + #elif defined(__arm__) tmp_re = vmull_s16(((simdshort_q15_t *)x1_128)[0], ((simdshort_q15_t*)x2_128)[0]); @@ -110,7 +118,10 @@ int mult_cpx_conj_vector(int16_t *x1, tmp_re = vqshlq_s32(tmp_re,shift); tmp_im = vqshlq_s32(tmp_im,shift); tmpy = vzip_s16(vmovn_s32(tmp_re),vmovn_s32(tmp_im)); - *y_128 = vcombine_s16(tmpy.val[0],tmpy.val[1]); + if (madd==0) + *y_128 = vcombine_s16(tmpy.val[0],tmpy.val[1]); + else + *y_128 += vcombine_s16(tmpy.val[0],tmpy.val[1]); #endif x1_128++; x2_128++; @@ -124,3 +135,81 @@ int mult_cpx_conj_vector(int16_t *x1, return(0); } +int multadd_cpx_vector(int16_t *x1, + int16_t *x2, + int16_t *y, + uint8_t zero_flag, + uint32_t N, + int output_shift) +{ + // Multiply elementwise the complex conjugate of x1 with x2. + // x1 - input 1 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)| + // We assume x1 with a dinamic of 15 bit maximum + // + // x2 - input 2 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)| + // We assume x2 with a dinamic of 14 bit maximum + /// + // y - output in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)| + // + // zero_flag - Set output (y) to zero prior to disable accumulation + // + // N - the size f the vectors (this function does N cpx mpy. WARNING: N>=4; + // + // output_shift - shift to be applied to generate output + + uint32_t i; // loop counter + + simd_q15_t *x1_128; + simd_q15_t *x2_128; + simd_q15_t *y_128; +#if defined(__x86_64__) || defined(__i386__) + simd_q15_t tmp_re,tmp_im; + simd_q15_t tmpy0,tmpy1; +#elif defined(__arm__) + int32x4_t tmp_re,tmp_im; + int32x4_t tmp_re1,tmp_im1; + int16x4x2_t tmpy; + int32x4_t shift = vdupq_n_s32(-output_shift); +#endif + + x1_128 = (simd_q15_t *)&x1[0]; + x2_128 = (simd_q15_t *)&x2[0]; + y_128 = (simd_q15_t *)&y[0]; + + + // we compute 4 cpx multiply for each loop + for(i=0; i<(N>>2); i++) { +#if defined(__x86_64__) || defined(__i386__) + tmp_re = _mm_sign_epi16(*x1_128,*(__m128i*)&conjug2[0]); + tmp_re = _mm_madd_epi16(tmp_re,*x2_128); + tmp_im = _mm_shufflelo_epi16(*x1_128,_MM_SHUFFLE(2,3,0,1)); + tmp_im = _mm_shufflehi_epi16(tmp_im,_MM_SHUFFLE(2,3,0,1)); + tmp_im = _mm_madd_epi16(tmp_im,*x2_128); + tmp_re = _mm_srai_epi32(tmp_re,output_shift); + tmp_im = _mm_srai_epi32(tmp_im,output_shift); + tmpy0 = _mm_unpacklo_epi32(tmp_re,tmp_im); + //print_ints("unpack lo:",&tmpy0[i]); + tmpy1 = _mm_unpackhi_epi32(tmp_re,tmp_im); + //print_ints("unpack hi:",&tmpy1[i]); + + if (zero_flag == 1) + *y_128 = _mm_packs_epi32(tmpy0,tmpy1); + else + *y_128 = _mm_adds_epi16(*y_128,_mm_packs_epi32(tmpy0,tmpy1)); + //print_shorts("*y_128:",&y_128[i]); + +#elif defined(__arm__) + + msg("mult_cpx_vector not implemented for __arm__"); +#endif + x1_128++; + x2_128++; + y_128++; + } + + + _mm_empty(); + _m_empty(); + + return(0); +} diff --git a/openair1/PHY/TOOLS/defs.h b/openair1/PHY/TOOLS/defs.h index 453efc028a4bf94eb2c5cd0bd0752fd53c7574e7..8f0ae402bf62dfbebd7cfa06e2162486366b0e74 100644 --- a/openair1/PHY/TOOLS/defs.h +++ b/openair1/PHY/TOOLS/defs.h @@ -116,13 +116,34 @@ int rotate_cpx_vector(int16_t *x, @param y - output in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)| @param N - the size f the vectors (this function does N cpx mpy. WARNING: N>=4; @param output_shift - shift to be applied to generate output + @param madd - if not zero result is added to output */ int mult_cpx_conj_vector(int16_t *x1, int16_t *x2, int16_t *y, uint32_t N, - int output_shift); + int output_shift, + int madd); + +/*! + Element-wise multiplication and accumulation of two complex vectors x1 and x2. + @param x1 - input 1 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)| + We assume x1 with a dinamic of 15 bit maximum + @param x2 - input 2 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)| + We assume x2 with a dinamic of 14 bit maximum + @param y - output in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)| + @param zero_flag Set output (y) to zero prior to accumulation + @param N - the size f the vectors (this function does N cpx mpy. WARNING: N>=4; + @param output_shift - shift to be applied to generate output +*/ + +int multadd_cpx_vector(int16_t *x1, + int16_t *x2, + int16_t *y, + uint8_t zero_flag, + uint32_t N, + int output_shift); // lte_dfts.c void init_fft(uint16_t size, diff --git a/openair1/PHY/TOOLS/lte_phy_scope.c b/openair1/PHY/TOOLS/lte_phy_scope.c index 768dedddf548c9275605742c12b80acc61dcd324..bc67b2095c8de5248c4619a4ae13c4239790b9cd 100644 --- a/openair1/PHY/TOOLS/lte_phy_scope.c +++ b/openair1/PHY/TOOLS/lte_phy_scope.c @@ -559,15 +559,15 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, bit_pdcch = (float*) calloc(12*frame_parms->N_RB_DL*num_pdcch_symbols*2,sizeof(float)); rxsig_t = (int16_t**) phy_vars_ue->common_vars.rxdata; - chest_t = (int16_t**) phy_vars_ue->common_vars.dl_ch_estimates_time[eNB_id]; - chest_f = (int16_t**) phy_vars_ue->common_vars.dl_ch_estimates[eNB_id]; + chest_t = (int16_t**) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates_time[eNB_id]; + chest_f = (int16_t**) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id]; pbch_llr = (int8_t*) phy_vars_ue->pbch_vars[eNB_id]->llr; pbch_comp = (int16_t*) phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0]; pdcch_llr = (int8_t*) phy_vars_ue->pdcch_vars[eNB_id]->llr; pdcch_comp = (int16_t*) phy_vars_ue->pdcch_vars[eNB_id]->rxdataF_comp[0]; - pdsch_llr = (int16_t*) phy_vars_ue->pdsch_vars[eNB_id]->llr[0]; // stream 0 + pdsch_llr = (int16_t*) phy_vars_ue->pdsch_vars[subframe&0x1][eNB_id]->llr[0]; // stream 0 // pdsch_llr = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars_SI[eNB_id]->llr[0]; // stream 0 - pdsch_comp = (int16_t*) phy_vars_ue->pdsch_vars[eNB_id]->rxdataF_comp0[0]; + pdsch_comp = (int16_t*) phy_vars_ue->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_comp0[0]; // Received signal in time domain of receive antenna 0 if (rxsig_t != NULL) { diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index d1ac2d5f6174d1e605037b2665159bc601fb6db3..d21312fe340f847e8c996d6a69498242c28a7f9f 100644 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -124,7 +124,6 @@ static inline void* malloc16_clear( size_t size ) #include "PHY/TOOLS/defs.h" #include "platform_types.h" -#define OPENAIR_LTE #ifdef OPENAIR_LTE #include "PHY/LTE_TRANSPORT/defs.h" @@ -242,10 +241,16 @@ typedef struct eNB_proc_t_s { openair0_timestamp timestamp_tx; /// subframe to act upon for reception int subframe_rx; + /// symbol mask for IF4p5 reception per subframe + uint32_t symbol_mask[10]; /// subframe to act upon for PRACH int subframe_prach; /// frame to act upon for reception int frame_rx; + /// frame to act upon for transmission + int frame_tx; + /// frame offset for secondary eNBs (to correct for frame asynchronism at startup) + int frame_offset; /// frame to act upon for PRACH int frame_prach; /// \internal This variable is protected by \ref mutex_fep. @@ -260,6 +265,8 @@ typedef struct eNB_proc_t_s { /// \brief Instance count for rx processing thread. /// \internal This variable is protected by \ref mutex_prach. int instance_cnt_prach; + // instance count for over-the-air eNB synchronization + int instance_cnt_synch; /// \internal This variable is protected by \ref mutex_asynch_rxtx. int instance_cnt_asynch_rxtx; /// pthread structure for FH processing thread @@ -284,6 +291,8 @@ typedef struct eNB_proc_t_s { pthread_attr_t attr_single; /// pthread attributes for prach processing thread pthread_attr_t attr_prach; + /// pthread attributes for over-the-air synch thread + pthread_attr_t attr_synch; /// pthread attributes for asynchronous RX thread pthread_attr_t attr_asynch_rxtx; /// scheduling parameters for parallel fep thread @@ -298,6 +307,8 @@ typedef struct eNB_proc_t_s { struct sched_param sched_param_single; /// scheduling parameters for prach thread struct sched_param sched_param_prach; + /// scheduling parameters for over-the-air synchronization thread + struct sched_param sched_param_synch; /// scheduling parameters for asynch_rxtx thread struct sched_param sched_param_asynch_rxtx; /// pthread structure for parallel fep thread @@ -308,6 +319,8 @@ typedef struct eNB_proc_t_s { pthread_t pthread_te; /// pthread structure for PRACH thread pthread_t pthread_prach; + /// pthread structure for eNB synch thread + pthread_t pthread_synch; /// condition variable for parallel fep thread pthread_cond_t cond_fep; /// condition variable for parallel turbo-decoder thread @@ -318,6 +331,8 @@ typedef struct eNB_proc_t_s { pthread_cond_t cond_FH; /// condition variable for PRACH processing thread; pthread_cond_t cond_prach; + // condition variable for over-the-air eNB synchronization + pthread_cond_t cond_synch; /// condition variable for asynch RX/TX thread pthread_cond_t cond_asynch_rxtx; /// mutex for parallel fep thread @@ -330,6 +345,8 @@ typedef struct eNB_proc_t_s { pthread_mutex_t mutex_FH; /// mutex for PRACH thread pthread_mutex_t mutex_prach; + // mutex for over-the-air eNB synchronization + pthread_mutex_t mutex_synch; /// mutex for asynch RX/TX thread pthread_mutex_t mutex_asynch_rxtx; /// parameters for turbo-decoding worker thread @@ -416,8 +433,15 @@ typedef struct PHY_VARS_eNB_s { int single_thread_flag; openair0_rf_map rf_map; int abstraction_flag; - void (*do_prach)(struct PHY_VARS_eNB_s *eNB); - void (*fep)(struct PHY_VARS_eNB_s *eNB); + openair0_timestamp ts_offset; + // indicator for synchronization state of eNB + int in_synch; + // indicator for master/slave (RRU) + int is_slave; + // indicator for precoding function (eNB,3GPP_eNB_BBU) + int do_precoding; + void (*do_prach)(struct PHY_VARS_eNB_s *eNB,int frame,int subframe); + void (*fep)(struct PHY_VARS_eNB_s *eNB,eNB_rxtx_proc_t *proc); int (*td)(struct PHY_VARS_eNB_s *eNB,int UE_id,int harq_pid,int llr8_flag); int (*te)(struct PHY_VARS_eNB_s *,uint8_t *,uint8_t,LTE_eNB_DLSCH_t *,int,uint8_t,time_stats_t *,time_stats_t *,time_stats_t *); void (*proc_uespec_rx)(struct PHY_VARS_eNB_s *eNB,eNB_rxtx_proc_t *proc,const relaying_type_t r_type); @@ -677,7 +701,7 @@ typedef struct { LTE_DL_FRAME_PARMS frame_parms_before_ho; LTE_UE_COMMON common_vars; - LTE_UE_PDSCH *pdsch_vars[NUMBER_OF_CONNECTED_eNB_MAX+1]; + LTE_UE_PDSCH *pdsch_vars[2][NUMBER_OF_CONNECTED_eNB_MAX+1]; LTE_UE_PDSCH_FLP *pdsch_vars_flp[NUMBER_OF_CONNECTED_eNB_MAX+1]; LTE_UE_PDSCH *pdsch_vars_SI[NUMBER_OF_CONNECTED_eNB_MAX+1]; LTE_UE_PDSCH *pdsch_vars_ra[NUMBER_OF_CONNECTED_eNB_MAX+1]; @@ -774,6 +798,7 @@ typedef struct { uint8_t prach_PreambleIndex; // uint8_t prach_timer; int rx_offset; /// Timing offset + int rx_offset_diff; /// Timing adjustment for ofdm symbol0 on HW USRP int timing_advance; ///timing advance signalled from eNB int hw_timing_advance; int N_TA_offset; ///timing offset used in TDD diff --git a/openair1/PHY/impl_defs_lte.h b/openair1/PHY/impl_defs_lte.h index 6635573779fc9cc8e1addf122e0232c27eebc24a..f6daccfbe0a98bcd43b1dee567d1f3306c669be2 100644 --- a/openair1/PHY/impl_defs_lte.h +++ b/openair1/PHY/impl_defs_lte.h @@ -504,6 +504,8 @@ typedef struct { uint8_t tdd_config; /// TDD S-subframe configuration (0-9) uint8_t tdd_config_S; + /// srs extra symbol flag for TDD + uint8_t srsX; /// indicates if node is a UE (NODE=2) or eNB (PRIMARY_CH=0). uint8_t node_id; /// Frequency index of CBMIMO1 card @@ -542,11 +544,15 @@ typedef struct { uint32_t samples_per_tti; /// Number of OFDM/SC-FDMA symbols in one subframe (to be modified to account for potential different in UL/DL) uint16_t symbols_per_tti; + /// Number of OFDM symbols in DL portion of S-subframe + uint16_t dl_symbols_in_S_subframe; + /// Number of SC-FDMA symbols in UL portion of S-subframe + uint16_t ul_symbols_in_S_subframe; /// Number of Physical transmit antennas in node uint8_t nb_antennas_tx; /// Number of Receive antennas in node uint8_t nb_antennas_rx; - /// Number of Logical transmit antenna ports in eNodeB + /// Number of common transmit antenna ports in eNodeB (1 or 2) uint8_t nb_antenna_ports_eNB; /// PRACH_CONFIG PRACH_CONFIG_COMMON prach_config_common; @@ -778,6 +784,26 @@ typedef struct { #endif } LTE_eNB_PUSCH; +typedef struct { + + /// \brief Holds the received data in the frequency domain. + /// - first index: rx antenna [0..nb_antennas_rx[ + /// - second index: symbol [0..28*ofdm_symbol_size[ + int32_t **rxdataF; + + /// \brief Hold the channel estimates in frequency domain. + /// - first index: eNB id [0..6] (hard coded) + /// - second index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx + /// - third index: samples? [0..symbols_per_tti*(ofdm_symbol_size+LTE_CE_FILTER_LENGTH)[ + int32_t **dl_ch_estimates[7]; + + /// \brief Hold the channel estimates in time domain (used for tracking). + /// - first index: eNB id [0..6] (hard coded) + /// - second index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx + /// - third index: samples? [0..2*ofdm_symbol_size[ + int32_t **dl_ch_estimates_time[7]; +}LTE_UE_COMMON_PER_THREAD; + typedef struct { /// \brief Holds the transmit data in time domain. /// For IFFT_FPGA this points to the same memory as PHY_vars->tx_vars[a].TX_DMA_BUFFER. @@ -789,29 +815,15 @@ typedef struct { /// - first index: tx antenna [0..nb_antennas_tx[ /// - second index: sample [0..FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX[ int32_t **txdataF; + /// \brief Holds the received data in time domain. /// Should point to the same memory as PHY_vars->rx_vars[a].RX_DMA_BUFFER. /// - first index: rx antenna [0..nb_antennas_rx[ /// - second index: sample [0..FRAME_LENGTH_COMPLEX_SAMPLES+2048[ int32_t **rxdata; - /// \brief Holds the received data in the frequency domain. - /// - first index: rx antenna [0..nb_antennas_rx[ - /// - second index: symbol [0..28*ofdm_symbol_size[ - int32_t **rxdataF; - /// \brief ?. - /// - first index: rx antenna [0..nb_antennas_rx[ - /// - second index: ? [0..20*ofdm_symbol_size*symbols_per_tti[ - int32_t **rxdataF2; - /// \brief Hold the channel estimates in frequency domain. - /// - first index: eNB id [0..6] (hard coded) - /// - second index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx - /// - third index: samples? [0..symbols_per_tti*(ofdm_symbol_size+LTE_CE_FILTER_LENGTH)[ - int32_t **dl_ch_estimates[7]; - /// \brief Hold the channel estimates in time domain (used for tracking). - /// - first index: eNB id [0..6] (hard coded) - /// - second index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx - /// - third index: samples? [0..2*ofdm_symbol_size[ - int32_t **dl_ch_estimates_time[7]; + + LTE_UE_COMMON_PER_THREAD common_vars_rx_data_per_thread[2]; + /// holds output of the sync correlator int32_t *sync_corr; /// estimated frequency offset (in radians) for all subcarriers diff --git a/openair1/PHY/impl_defs_top.h b/openair1/PHY/impl_defs_top.h index 79e684215c7f815d1542670a44680b7cbec1f68f..dd09749fbf16bddde06e7b3b7418e87b2ca37ff1 100644 --- a/openair1/PHY/impl_defs_top.h +++ b/openair1/PHY/impl_defs_top.h @@ -177,7 +177,7 @@ #define DMA_BLKS_PER_SLOT (SLOT_LENGTH_BYTES/2048) // Number of DMA blocks per slot #define SLOT_TIME_NS (SLOT_LENGTH_SAMPLES*(1e3)/7.68) // slot time in ns -#define NB_ANTENNA_PORTS_ENB 14 // total number of eNB antenna ports +#define NB_ANTENNA_PORTS_ENB 6 // total number of eNB antenna ports #ifdef EXMIMO #define TARGET_RX_POWER 55 // Target digital power for the AGC diff --git a/openair1/SCHED/defs.h b/openair1/SCHED/defs.h index 5f3e1a59e561ab64f9f9ffd94c3a39b7961d82f5..5fd5009f1f9c51409b0d04efc89e031caabd7ec4 100644 --- a/openair1/SCHED/defs.h +++ b/openair1/SCHED/defs.h @@ -182,7 +182,7 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *pr @param phy_vars_eNB Pointer to eNB variables on which to act @param abstraction_flag Indicator of PHY abstraction */ -void phy_procedures_eNB_common_RX(PHY_VARS_eNB *phy_vars_eNB); +void phy_procedures_eNB_common_RX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc); /*! \brief Scheduling for eNB TX procedures in TDD S-subframes. @param phy_vars_eNB Pointer to eNB variables on which to act @@ -509,7 +509,7 @@ int get_ue_active_harq_pid(uint8_t Mod_id,uint8_t CC_id,uint16_t rnti,int frame, void dump_dlsch(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid); void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe); void dump_dlsch_ra(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe); -void dump_dlsch2(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint16_t coded_bits_per_codeword,int round); +void dump_dlsch2(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe, uint16_t coded_bits_per_codeword,int round); /*@}*/ diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 12827d973425dbe5f1c963ca163d98da3b70fd1e..cad508c7c225d7bc90d5b6a1316b5a89096d1cc4 100644 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -788,7 +788,7 @@ void generate_eNB_dlsch_params(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC eNB->dlsch[(uint8_t)UE_id][0]->nCCE[subframe] = dci_alloc->firstCCE; - LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for ue DCI (PDSCH %"PRIx16") => %"PRIu8"/%u\n",eNB->Mod_id,frame,subframe, + LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for ue DCI (PDSCH %"PRIx16") => %"PRIu8"\n",eNB->Mod_id,frame,subframe, dci_alloc->rnti,eNB->dlsch[(uint8_t)UE_id][0]->nCCE[subframe]); #if defined(SMBV) @@ -900,7 +900,7 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,LTE_eNB_DLSCH_t *d int i; LOG_D(PHY, - "[eNB %"PRIu8"][PDSCH %"PRIx16"/%"PRIu8"] Frame %d, subframe %d: Generating PDSCH/DLSCH with input size = %"PRIu16", G %d, nb_rb %"PRIu16", mcs %"PRIu8", pmi_alloc %"PRIx16", rv %"PRIu8" (round %"PRIu8")\n", + "[eNB %"PRIu8"][PDSCH %"PRIx16"/%"PRIu8"] Frame %d, subframe %d: Generating PDSCH/DLSCH with input size = %"PRIu16", G %d, nb_rb %"PRIu16", mcs %"PRIu8", pmi_alloc %"PRIx64", rv %"PRIu8" (round %"PRIu8")\n", eNB->Mod_id, dlsch->rnti,harq_pid, frame, subframe, input_buffer_length, get_G(fp, @@ -1146,7 +1146,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; DCI_ALLOC_t *dci_alloc=(DCI_ALLOC_t *)NULL; - int offset = proc == &eNB->proc.proc_rxtx[0] ? 0 : 1; + int offset = eNB->CC_id;//proc == &eNB->proc.proc_rxtx[0] ? 0 : 1; #if defined(SMBV) // counts number of allocations in subframe @@ -2032,8 +2032,8 @@ void prach_procedures(PHY_VARS_eNB *eNB) { T_INT(preamble_max), T_INT(preamble_energy_max), T_INT(preamble_delay_list[preamble_max])); if (eNB->mac_enabled==1) { - uint8_t update_TA=4; - + uint8_t update_TA = 4; + uint8_t update_TA2 = 1; switch (fp->N_RB_DL) { case 6: update_TA = 16; @@ -2047,8 +2047,11 @@ void prach_procedures(PHY_VARS_eNB *eNB) { update_TA = 2; break; + case 75: + update_TA = 3; + update_TA2 = 2; case 100: - update_TA = 1; + update_TA = 1; break; } @@ -2056,7 +2059,7 @@ void prach_procedures(PHY_VARS_eNB *eNB) { eNB->CC_id, frame, preamble_max, - preamble_delay_list[preamble_max]*update_TA, + preamble_delay_list[preamble_max]*update_TA/update_TA2, 0,subframe,0); } @@ -2670,7 +2673,7 @@ void init_te_thread(PHY_VARS_eNB *eNB,pthread_attr_t *attr_te) { } -void eNB_fep_full_2thread(PHY_VARS_eNB *eNB) { +void eNB_fep_full_2thread(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc_rxtx) { eNB_proc_t *proc = &eNB->proc; @@ -2716,28 +2719,27 @@ void eNB_fep_full_2thread(PHY_VARS_eNB *eNB) { -void eNB_fep_full(PHY_VARS_eNB *eNB) { +void eNB_fep_full(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc_rxtx) { - eNB_proc_t *proc = &eNB->proc; int l; LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,1); start_meas(&eNB->ofdm_demod_stats); - remove_7_5_kHz(eNB,proc->subframe_rx<<1); - remove_7_5_kHz(eNB,1+(proc->subframe_rx<<1)); + remove_7_5_kHz(eNB,proc_rxtx->subframe_rx<<1); + remove_7_5_kHz(eNB,1+(proc_rxtx->subframe_rx<<1)); for (l=0; l<fp->symbols_per_tti/2; l++) { slot_fep_ul(fp, &eNB->common_vars, l, - proc->subframe_rx<<1, + (proc_rxtx->subframe_rx)<<1, 0, 0 ); slot_fep_ul(fp, &eNB->common_vars, l, - 1+(proc->subframe_rx<<1), + 1+((proc_rxtx->subframe_rx)<<1), 0, 0 ); @@ -2748,11 +2750,11 @@ void eNB_fep_full(PHY_VARS_eNB *eNB) { if (eNB->node_function == NGFI_RRU_IF4p5) { /// **** send_IF4 of rxdataF to RCC (no prach now) **** /// - send_IF4p5(eNB, proc->frame_rx, proc->subframe_rx, IF4p5_PULFFT, 0); + send_IF4p5(eNB, proc_rxtx->frame_rx, proc_rxtx->subframe_rx, IF4p5_PULFFT, 0); } } -void eNB_fep_rru_if5(PHY_VARS_eNB *eNB) { +void eNB_fep_rru_if5(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc_rxtx) { eNB_proc_t *proc=&eNB->proc; uint8_t seqno=0; @@ -2764,17 +2766,17 @@ void eNB_fep_rru_if5(PHY_VARS_eNB *eNB) { } -void do_prach(PHY_VARS_eNB *eNB) { +void do_prach(PHY_VARS_eNB *eNB,int frame,int subframe) { eNB_proc_t *proc = &eNB->proc; LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; // check if we have to detect PRACH first - if (is_prach_subframe(fp,proc->frame_rx,proc->subframe_rx)>0) { + if (is_prach_subframe(fp,frame,subframe)>0) { /* accept some delay in processing - up to 5ms */ int i; for (i = 0; i < 10 && proc->instance_cnt_prach == 0; i++) { - LOG_W(PHY,"[eNB] Frame %d Subframe %d, eNB PRACH thread busy (IC %d)!!\n", proc->frame_rx,proc->subframe_rx,proc->instance_cnt_prach); + LOG_W(PHY,"[eNB] Frame %d Subframe %d, eNB PRACH thread busy (IC %d)!!\n", frame,subframe,proc->instance_cnt_prach); usleep(500); } if (proc->instance_cnt_prach == 0) { @@ -2784,15 +2786,15 @@ void do_prach(PHY_VARS_eNB *eNB) { // wake up thread for PRACH RX if (pthread_mutex_lock(&proc->mutex_prach) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB PRACH thread %d (IC %d)\n", proc->instance_cnt_prach ); + LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB PRACH thread %d (IC %d)\n", proc->thread_index, proc->instance_cnt_prach); exit_fun( "error locking mutex_prach" ); return; } ++proc->instance_cnt_prach; // set timing for prach thread - proc->frame_prach = proc->frame_rx; - proc->subframe_prach = proc->subframe_rx; + proc->frame_prach = frame; + proc->subframe_prach = subframe; // the thread can now be woken up if (pthread_cond_signal(&proc->cond_prach) != 0) { @@ -2806,28 +2808,34 @@ void do_prach(PHY_VARS_eNB *eNB) { } -void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB){ +void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc){ - eNB_proc_t *proc = &eNB->proc; + // eNB_proc_t *proc = &eNB->proc; LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; const int subframe = proc->subframe_rx; const int frame = proc->frame_rx; int offset = (eNB->single_thread_flag==1) ? 0 : (subframe&1); - if ((fp->frame_type == TDD) && (subframe_select(fp,subframe)!=SF_UL)) return; - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX0_ENB+offset, proc->frame_rx ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX0_ENB+offset, proc->subframe_rx ); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON+offset, 1 ); - + + if ((fp->frame_type == TDD) && (subframe_select(fp,subframe)!=SF_UL)) { + + if (eNB->node_function == NGFI_RRU_IF4p5) { + /// **** in TDD during DL send_IF4 of ULTICK to RCC **** /// + send_IF4p5(eNB, proc->frame_rx, proc->subframe_rx, IF4p5_PULTICK, 0); + } + return; + } + + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON+offset, 1 ); start_meas(&eNB->phy_proc_rx); LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_common_RX(%d)\n",eNB->Mod_id,frame,subframe); - if (eNB->fep) eNB->fep(eNB); - - if (eNB->do_prach) eNB->do_prach(eNB); + if (eNB->fep) eNB->fep(eNB,proc); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON+offset, 0 ); } @@ -2847,7 +2855,7 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const const int subframe = proc->subframe_rx; const int frame = proc->frame_rx; - int offset = (proc == &eNB->proc.proc_rxtx[0]) ? 0 : 1; + int offset = eNB->CC_id;//(proc == &eNB->proc.proc_rxtx[0]) ? 0 : 1; if ((fp->frame_type == TDD) && (subframe_select(fp,subframe)!=SF_UL)) return; diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index cbea2e4c3e39b943768ef1af8a6ffdc6e8165cf9..7d061f60bfcbfc75041ad838f41b1e04c6b960f4 100644 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -99,20 +99,20 @@ void dump_dlsch(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subf subframe, ue->transmission_mode[eNB_id]<7?0:ue->transmission_mode[eNB_id]); - write_output("rxsigF0.m","rxsF0", ue->common_vars.rxdataF[0],2*nsymb*ue->frame_parms.ofdm_symbol_size,2,1); - write_output("rxsigF0_ext.m","rxsF0_ext", ue->pdsch_vars[0]->rxdataF_ext[0],2*nsymb*ue->frame_parms.ofdm_symbol_size,1,1); - write_output("dlsch00_ch0_ext.m","dl00_ch0_ext", ue->pdsch_vars[0]->dl_ch_estimates_ext[0],300*nsymb,1,1); + write_output("rxsigF0.m","rxsF0", ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[0],2*nsymb*ue->frame_parms.ofdm_symbol_size,2,1); + write_output("rxsigF0_ext.m","rxsF0_ext", ue->pdsch_vars[subframe&0x1][0]->rxdataF_ext[0],2*nsymb*ue->frame_parms.ofdm_symbol_size,1,1); + write_output("dlsch00_ch0_ext.m","dl00_ch0_ext", ue->pdsch_vars[subframe&0x1][0]->dl_ch_estimates_ext[0],300*nsymb,1,1); /* write_output("dlsch01_ch0_ext.m","dl01_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[1],300*12,1,1); write_output("dlsch10_ch0_ext.m","dl10_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[2],300*12,1,1); write_output("dlsch11_ch0_ext.m","dl11_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[3],300*12,1,1); write_output("dlsch_rho.m","dl_rho",pdsch_vars[0]->rho[0],300*12,1,1); */ - write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", ue->pdsch_vars[0]->rxdataF_comp0[0],300*12,1,1); - write_output("dlsch_rxF_llr.m","dlsch_llr", ue->pdsch_vars[0]->llr[0],coded_bits_per_codeword,1,0); + write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", ue->pdsch_vars[subframe&0x1][0]->rxdataF_comp0[0],300*12,1,1); + write_output("dlsch_rxF_llr.m","dlsch_llr", ue->pdsch_vars[subframe&0x1][0]->llr[0],coded_bits_per_codeword,1,0); - write_output("dlsch_mag1.m","dlschmag1",ue->pdsch_vars[0]->dl_ch_mag0,300*12,1,1); - write_output("dlsch_mag2.m","dlschmag2",ue->pdsch_vars[0]->dl_ch_magb0,300*12,1,1); + write_output("dlsch_mag1.m","dlschmag1",ue->pdsch_vars[subframe&0x1][0]->dl_ch_mag0,300*12,1,1); + write_output("dlsch_mag2.m","dlschmag2",ue->pdsch_vars[subframe&0x1][0]->dl_ch_magb0,300*12,1,1); } void dump_dlsch_SI(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe) @@ -141,7 +141,7 @@ void dump_dlsch_SI(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t s write_output("rxsig0.m","rxs0", &ue->common_vars.rxdata[0][subframe*ue->frame_parms.samples_per_tti],ue->frame_parms.samples_per_tti,1,1); - write_output("rxsigF0.m","rxsF0", ue->common_vars.rxdataF[0],nsymb*ue->frame_parms.ofdm_symbol_size,1,1); + write_output("rxsigF0.m","rxsF0", ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[0],nsymb*ue->frame_parms.ofdm_symbol_size,1,1); write_output("rxsigF0_ext.m","rxsF0_ext", ue->pdsch_vars_SI[0]->rxdataF_ext[0],2*nsymb*ue->frame_parms.ofdm_symbol_size,1,1); write_output("dlsch00_ch0_ext.m","dl00_ch0_ext", ue->pdsch_vars_SI[0]->dl_ch_estimates_ext[0],ue->frame_parms.N_RB_DL*12*nsymb,1,1); /* @@ -242,7 +242,7 @@ void dump_dlsch_ra(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t s ue->pdcch_vars[eNB_id]->num_pdcch_symbols, coded_bits_per_codeword); - write_output("rxsigF0.m","rxsF0", ue->common_vars.rxdataF[0],2*12*ue->frame_parms.ofdm_symbol_size,2,1); + write_output("rxsigF0.m","rxsF0", ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[0],2*12*ue->frame_parms.ofdm_symbol_size,2,1); write_output("rxsigF0_ext.m","rxsF0_ext", ue->pdsch_vars_ra[0]->rxdataF_ext[0],2*12*ue->frame_parms.ofdm_symbol_size,1,1); write_output("dlsch00_ch0_ext.m","dl00_ch0_ext", ue->pdsch_vars_ra[0]->dl_ch_estimates_ext[0],300*nsymb,1,1); /* @@ -346,7 +346,9 @@ void process_timing_advance_rar(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint16_t ti #ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[UE %d] AbsoluteSubFrame %d.%d, received (rar) timing_advance %d, HW timing advance %d\n",ue->Mod_id,proc->frame_rx, proc->subframe_rx, ue->timing_advance); + /* TODO: fix this log, what is 'HW timing advance'? */ + /*LOG_I(PHY,"[UE %d] AbsoluteSubFrame %d.%d, received (rar) timing_advance %d, HW timing advance %d\n",ue->Mod_id,proc->frame_rx, proc->subframe_rx, ue->timing_advance);*/ + LOG_I(PHY,"[UE %d] AbsoluteSubFrame %d.%d, received (rar) timing_advance %d\n",ue->Mod_id,proc->frame_rx, proc->subframe_rx, ue->timing_advance); #endif } @@ -938,7 +940,7 @@ uint16_t get_n1_pucch(PHY_VARS_UE *ue, } // switch tdd_config } - LOG_E(PHY,"[UE%d] : Frame %d phy_procedures_lte.c: get_n1pucch, exit without proper return\n",proc->frame_tx); + LOG_E(PHY,"[UE%d] : Frame %d phy_procedures_lte.c: get_n1pucch, exit without proper return\n", ue->Mod_id, proc->frame_tx); return(-1); } @@ -1154,7 +1156,7 @@ void ue_prach_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin frame_tx, eNB_id, subframe_tx); - LOG_D(PHY,"Got prach_resources for eNB %d address %d, RRCCommon %d\n",eNB_id,ue->prach_resources[eNB_id],UE_mac_inst[ue->Mod_id].radioResourceConfigCommon); + LOG_D(PHY,"Got prach_resources for eNB %d address %p, RRCCommon %p\n",eNB_id,ue->prach_resources[eNB_id],UE_mac_inst[ue->Mod_id].radioResourceConfigCommon); LOG_D(PHY,"Prach resources %p\n",ue->prach_resources[eNB_id]); } } @@ -1370,7 +1372,7 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB LOG_D(PHY,"Generating PUSCH (Abssubframe: %d.%d): harq-Id: %d, round: %d, MaxReTrans: %d \n",frame_tx,subframe_tx,harq_pid,ue->ulsch[eNB_id]->harq_processes[harq_pid]->round,ue->ulsch[eNB_id]->Mlimit); if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->round >= (ue->ulsch[eNB_id]->Mlimit - 1)) { - LOG_D(PHY,"PUSCH MAX Retransmission acheived ==> send last pusch (%d) \n"); + LOG_D(PHY,"PUSCH MAX Retransmission achieved ==> send last pusch\n"); ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0; ue->ulsch[eNB_id]->harq_processes[harq_pid]->round = 0; } @@ -1813,7 +1815,7 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin T_INT(tx_amp),T_INT(ue->dlsch[eNB_id][0]->g_pucch),T_INT(get_PL(ue->Mod_id,ue->CC_id,eNB_id))); #endif if (SR_payload>0) { - LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d Generating PUCCH %s payload %d,%d (with SR for PUSCH), an_srs_simultanous %d, shorten_pucch %d, n1_pucch %d, Po_PUCCH, amp %d\n", + LOG_D(PHY,"[UE %d][SR %x] AbsSubFrame %d.%d Generating PUCCH %s payload %d,%d (with SR for PUSCH), an_srs_simultanous %d, shorten_pucch %d, n1_pucch %d, Po_PUCCH %d, amp %d\n", Mod_id, ue->dlsch[eNB_id][0]->rnti, frame_tx % 1024, subframe_tx, @@ -1826,10 +1828,10 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin Po_PUCCH, tx_amp); } else { - LOG_D(PHY,"[UE %d][PDSCH %x] Frame %d subframe %d Generating PUCCH %s, an_srs_simultanous %d, shorten_pucch %d, n1_pucch %d, b[0]=%d,b[1]=%d (SR_Payload %d), Po_PUCCH %d, amp %d\n", + LOG_D(PHY,"[UE %d][PDSCH %x] AbsSubFrame %d.%d rx_offset_diff: %d, Generating PUCCH %s, an_srs_simultanous %d, shorten_pucch %d, n1_pucch %d, b[0]=%d,b[1]=%d (SR_Payload %d), Po_PUCCH %d, amp %d\n", Mod_id, ue->dlsch[eNB_id][0]->rnti, - frame_tx, subframe_tx, + frame_tx, subframe_tx,ue->rx_offset_diff, (format == pucch_format1a? "1a": ( format == pucch_format1b? "1b" : "??")), frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission, @@ -2056,7 +2058,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,ui LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; - int32_t ulsch_start=0; + //int32_t ulsch_start=0; int subframe_tx = proc->subframe_tx; int frame_tx = proc->frame_tx; unsigned int aa; @@ -2241,12 +2243,13 @@ void ue_measurement_procedures( lte_ue_measurements(ue, (subframe_rx*frame_parms->samples_per_tti+ue->rx_offset)%(frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME), (subframe_rx == 1) ? 1 : 0, - 0); + 0,subframe_rx); } else { lte_ue_measurements(ue, 0, 0, - 1); + 1, + subframe_rx); } #if T_TRACER if(slot == 0) @@ -2272,11 +2275,11 @@ void ue_measurement_procedures( VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_RRC_MEASUREMENTS, VCD_FUNCTION_OUT); if (abstraction_flag==1) - ue->sinr_eff = sinr_eff_cqi_calc(ue, 0); + ue->sinr_eff = sinr_eff_cqi_calc(ue, 0, subframe_rx); } - if ((subframe_rx==0) && (l==(4-frame_parms->Ncp))) { + if ((subframe_rx==0) && (slot == 0) && (l==(4-frame_parms->Ncp))) { // AGC @@ -2299,6 +2302,7 @@ void ue_measurement_procedures( lte_adjust_synch(&ue->frame_parms, ue, eNB_id, + subframe_rx, 0, 16384); } @@ -2571,7 +2575,7 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, uin } else if (((frame_tx & 0x03FF) != (proc->frame_rx & 0x03FF))) { //(pbch_tx_ant != ue->frame_parms.nb_antennas_tx)) { - LOG_D(PHY,"[UE %d] frame %d, subframe %d: Re-adjusting frame counter (PBCH ant_tx=%d, frame_rx=%d, frame%1024=%d, phase %d).\n", + LOG_D(PHY,"[UE %d] frame %d, subframe %d: Re-adjusting frame counter (PBCH ant_tx=%d, frame_rx=%d, frame%%1024=%d, phase %d).\n", ue->Mod_id, proc->frame_rx, subframe_rx, @@ -2750,9 +2754,7 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint #endif - LOG_D(PHY,"[UE %d] Frame %d, subframe %d, Mode %s: DCI found %i\n",ue->Mod_id,frame_rx,subframe_rx,mode_string[ue->UE_mode[eNB_id]],dci_cnt); - - + LOG_D(PHY,"[UE %d] AbsSubFrame %d.%d, Mode %s: DCI found %i\n",ue->Mod_id,frame_rx%1024,subframe_rx,mode_string[ue->UE_mode[eNB_id]],dci_cnt); ue->pdcch_vars[eNB_id]->dci_received += dci_cnt; @@ -2805,12 +2807,6 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint { ue->dlsch[eNB_id][0]->g_pucch += ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->delta_PUCCH; } - - /*T(T_UE_PHY_DLSCH_UE_DCI, T_INT(eNB_id), T_INT(frame_rx%1024), T_INT(subframe_rx), T_INT(ue->Mod_id), - T_INT(dci_alloc_rx[i].rnti), T_INT(dci_alloc_rx[i].format), - T_INT(ue->dlsch[eNB_id][0]->current_harq_pid), - T_INT(ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->mcs), - T_INT(ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->TBS));*/ ue->dlsch_received[eNB_id]++; @@ -3123,7 +3119,8 @@ void ue_pmch_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,int eNB_id,int abs ue->dlsch_mtch_errors[sync_area][0]++; LOG_D(PHY,"[UE %d] Frame %d, subframe %d: PMCH in error (%d,%d), not passing to L2 (TBS %d, iter %d,G %d)\n", - frame_rx,subframe_rx, + ue->Mod_id, + frame_rx,subframe_rx, ue->dlsch_mcch_errors[sync_area][0], ue->dlsch_mtch_errors[sync_area][0], ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3, @@ -3185,7 +3182,7 @@ void ue_pdsch_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc, int eNB_id, PDSC if (dlsch0 && (!dlsch1)) { harq_pid = dlsch0->current_harq_pid; - LOG_D(PHY,"[UE %d] PDSCH active in subframe %d (%d), harq_pid %d\n",ue->Mod_id,subframe_rx,harq_pid); + LOG_D(PHY,"[UE %d] PDSCH active in subframe %d, harq_pid %d\n",ue->Mod_id,subframe_rx,harq_pid); if ((pdsch==PDSCH) && (ue->transmission_mode[eNB_id] == 5) && @@ -3349,7 +3346,7 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue, pdsch_vars = ue->pdsch_vars_p[eNB_id]; break; case PDSCH: - pdsch_vars = ue->pdsch_vars[eNB_id]; + pdsch_vars = ue->pdsch_vars[subframe_rx&0x1][eNB_id]; break; case PMCH: case PDSCH1: @@ -3574,7 +3571,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[%s %d] Frame %d subframe %d: Doing phy_procedures_UE_RX (%d)\n", + LOG_D(PHY,"[%s %d] Frame %d subframe %d: Doing phy_procedures_UE_RX\n", (r_type == multicast_relay) ? "RN/UE" : "UE", ue->Mod_id,frame_rx, subframe_rx); #endif @@ -3613,7 +3610,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin slot_fep(ue, l, (subframe_rx<<1), - ue->rx_offset, + 0, 0, 0); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_OUT); @@ -3644,7 +3641,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin slot_fep(ue, 0, 1+(subframe_rx<<1), - ue->rx_offset, + 0, 0, 0); @@ -3717,7 +3714,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin slot_fep(ue, l, 1+(subframe_rx<<1), - ue->rx_offset, + 0, 0, 0); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_OUT); @@ -3735,7 +3732,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin slot_fep(ue, 0, (next_subframe_rx<<1), - ue->rx_offset, + 0, 0, 0); } diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index f9a8acfa85cbcd5ffac2014489e83e62472c2e48..62b4063d298eacfe89f66e70831181dbab1d2d53 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -1812,6 +1812,11 @@ int main(int argc, char **argv) eNB->common_vars.beam_weights[0][0][aa][re] = 0x00007fff/eNB->frame_parms.nb_antennas_tx; } + if (transmission_mode<7) + eNB->do_precoding=0; + else + eNB->do_precoding=1; + eNB->mac_enabled=1; if (two_thread_flag == 0) { eNB->te = dlsch_encoding; @@ -2409,12 +2414,14 @@ int main(int argc, char **argv) do_OFDM_mod_symbol(&eNB->common_vars, eNB_id, (subframe*2), - &eNB->frame_parms); + &eNB->frame_parms, + eNB->do_precoding); do_OFDM_mod_symbol(&eNB->common_vars, eNB_id, (subframe*2)+1, - &eNB->frame_parms); + &eNB->frame_parms, + eNB->do_precoding); stop_meas(&eNB->ofdm_mod_stats); @@ -2502,34 +2509,34 @@ int main(int argc, char **argv) //common vars write_output("rxsig0.m","rxs0", &UE->common_vars.rxdata[0][0],10*UE->frame_parms.samples_per_tti,1,1); - write_output("rxsigF0.m","rxsF0", &UE->common_vars.rxdataF[0][0],UE->frame_parms.ofdm_symbol_size*nsymb,1,1); + write_output("rxsigF0.m","rxsF0", &UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[0][0],UE->frame_parms.ofdm_symbol_size*nsymb,1,1); if (UE->frame_parms.nb_antennas_rx>1) { write_output("rxsig1.m","rxs1", UE->common_vars.rxdata[1],UE->frame_parms.samples_per_tti,1,1); - write_output("rxsigF1.m","rxsF1", UE->common_vars.rxdataF[1],UE->frame_parms.ofdm_symbol_size*nsymb,1,1); + write_output("rxsigF1.m","rxsF1", UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[1],UE->frame_parms.ofdm_symbol_size*nsymb,1,1); } write_output("dlsch00_r0.m","dl00_r0", - &(UE->common_vars.dl_ch_estimates[eNB_id][0][0]), + &(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][0][0]), UE->frame_parms.ofdm_symbol_size*nsymb,1,1); if (UE->frame_parms.nb_antennas_rx>1) write_output("dlsch01_r0.m","dl01_r0", - &(UE->common_vars.dl_ch_estimates[eNB_id][1][0]), + &(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][1][0]), UE->frame_parms.ofdm_symbol_size*nsymb,1,1); if (eNB->frame_parms.nb_antennas_tx>1) write_output("dlsch10_r0.m","dl10_r0", - &(UE->common_vars.dl_ch_estimates[eNB_id][2][0]), + &(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][2][0]), UE->frame_parms.ofdm_symbol_size*nsymb,1,1); if ((UE->frame_parms.nb_antennas_rx>1) && (eNB->frame_parms.nb_antennas_tx>1)) write_output("dlsch11_r0.m","dl11_r0", - &(UE->common_vars.dl_ch_estimates[eNB_id][3][0]), + &(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][3][0]), UE->frame_parms.ofdm_symbol_size*nsymb/2,1,1); //pdsch_vars - dump_dlsch2(UE,eNB_id,coded_bits_per_codeword,round); + dump_dlsch2(UE,eNB_id,subframe,coded_bits_per_codeword,round); //dump_dlsch2(UE,eNB_id_i,coded_bits_per_codeword); write_output("dlsch_e.m","e",eNB->dlsch[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4); @@ -2587,7 +2594,7 @@ int main(int argc, char **argv) write_output(fname,vname, &UE->common_vars.rxdata[0][0],10*UE->frame_parms.samples_per_tti,1,1); sprintf(fname,"rxsigF0_r%d.m",round); sprintf(vname,"rxs0F_r%d",round); - write_output(fname,vname, &UE->common_vars.rxdataF[0][0],UE->frame_parms.ofdm_symbol_size*nsymb,1,1); + write_output(fname,vname, &UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[0][0],UE->frame_parms.ofdm_symbol_size*nsymb,1,1); if (UE->frame_parms.nb_antennas_rx>1) { sprintf(fname,"rxsig1_r%d.m",round); @@ -2595,20 +2602,20 @@ int main(int argc, char **argv) write_output(fname,vname, UE->common_vars.rxdata[1],UE->frame_parms.samples_per_tti,1,1); sprintf(fname,"rxsigF1_r%d.m",round); sprintf(vname,"rxs1F_r%d.m",round); - write_output(fname,vname, UE->common_vars.rxdataF[1],UE->frame_parms.ofdm_symbol_size*nsymb,1,1); + write_output(fname,vname, UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[1],UE->frame_parms.ofdm_symbol_size*nsymb,1,1); } sprintf(fname,"dlsch00_r%d.m",round); sprintf(vname,"dl00_r%d",round); write_output(fname,vname, - &(UE->common_vars.dl_ch_estimates[eNB_id][0][0]), + &(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][0][0]), UE->frame_parms.ofdm_symbol_size*nsymb,1,1); if (UE->frame_parms.nb_antennas_rx>1) { sprintf(fname,"dlsch01_r%d.m",round); sprintf(vname,"dl01_r%d",round); write_output(fname,vname, - &(UE->common_vars.dl_ch_estimates[eNB_id][1][0]), + &(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][1][0]), UE->frame_parms.ofdm_symbol_size*nsymb/2,1,1); } @@ -2616,7 +2623,7 @@ int main(int argc, char **argv) sprintf(fname,"dlsch10_r%d.m",round); sprintf(vname,"dl10_r%d",round); write_output(fname,vname, - &(UE->common_vars.dl_ch_estimates[eNB_id][2][0]), + &(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][2][0]), UE->frame_parms.ofdm_symbol_size*nsymb/2,1,1); } @@ -2624,12 +2631,12 @@ int main(int argc, char **argv) sprintf(fname,"dlsch11_r%d.m",round); sprintf(vname,"dl11_r%d",round); write_output(fname,vname, - &(UE->common_vars.dl_ch_estimates[eNB_id][3][0]), + &(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][3][0]), UE->frame_parms.ofdm_symbol_size*nsymb/2,1,1); } //pdsch_vars - dump_dlsch2(UE,eNB_id,coded_bits_per_codeword,round); + dump_dlsch2(UE,eNB_id,subframe,coded_bits_per_codeword,round); //write_output("dlsch_e.m","e",eNB->dlsch[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4); //write_output("dlsch_ber_bit.m","ber_bit",uncoded_ber_bit,coded_bits_per_codeword,1,0); diff --git a/openair1/SIMULATION/LTE_PHY/dlsim_tm7.c b/openair1/SIMULATION/LTE_PHY/dlsim_tm7.c index 641efd2ed98c6ac4ed1efa4ff4277008ff8f435f..874af41f45c3c4cb9cb951c6eb543f0503a47f6f 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim_tm7.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim_tm7.c @@ -3104,24 +3104,24 @@ PMI_FEEDBACK: for(aa=0; aa<frame_parms->nb_antenna_ports_eNB; aa++) { for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { for (i=0; i<frame_parms->N_RB_DL*12; i++) { - ((int16_t *) UE->common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)( + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[k][(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)( eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x*AMP); //printf("x=%d,AMP=%d\n",eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x,AMP); - ((int16_t *) UE->common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)( + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)( eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].y*AMP); if (transmission_mode == 7){ //this should include the BF weights! Will not work for a random channel if (UE->high_speed_flag==0) { - ((int16_t *)UE->pdsch_vars[0]->dl_bf_ch_estimates[(aa<<1)+aarx])[2*i]=(int16_t)( + ((int16_t *)UE->pdsch_vars[subframe&0x1][0]->dl_bf_ch_estimates[(aa<<1)+aarx])[2*i]=(int16_t)( eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x*AMP); - ((int16_t *)UE->pdsch_vars[0]->dl_bf_ch_estimates[(aa<<1)+aarx])[2*i+1]=(int16_t)( + ((int16_t *)UE->pdsch_vars[subframe&0x1][0]->dl_bf_ch_estimates[(aa<<1)+aarx])[2*i+1]=(int16_t)( eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].y*AMP); //printf("**,x=%d,AMP=%d\n",eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x,AMP); } else { - ((int16_t *)UE->pdsch_vars[0]->dl_bf_ch_estimates[(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size)*2]=(int16_t)( + ((int16_t *)UE->pdsch_vars[subframe&0x1][0]->dl_bf_ch_estimates[(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size)*2]=(int16_t)( eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x*AMP); - ((int16_t *)UE->pdsch_vars[0]->dl_bf_ch_estimates[(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size)*2]=(int16_t)( + ((int16_t *)UE->pdsch_vars[subframe&0x1][0]->dl_bf_ch_estimates[(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size)*2]=(int16_t)( eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].y*AMP); } @@ -3134,15 +3134,15 @@ PMI_FEEDBACK: for(aa=0; aa<frame_parms->nb_antenna_ports_eNB; aa++) { for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { for (i=0; i<frame_parms->N_RB_DL*12; i++) { - ((int16_t *) UE->common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(short)(AMP); - ((int16_t *) UE->common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0/2; + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(short)(AMP); + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0/2; if (transmission_mode == 7) { if (UE->high_speed_flag==0){ - ((int16_t *) UE->pdsch_vars[0]->dl_bf_ch_estimates[(aa<<1)+aarx])[2*i]=(short)(AMP); - ((int16_t *) UE->pdsch_vars[0]->dl_bf_ch_estimates[(aa<<1)+aarx])[2*i+1]=0/2; + ((int16_t *) UE->pdsch_vars[subframe&0x1][0]->dl_bf_ch_estimates[(aa<<1)+aarx])[2*i]=(short)(AMP); + ((int16_t *) UE->pdsch_vars[subframe&0x1][0]->dl_bf_ch_estimates[(aa<<1)+aarx])[2*i+1]=0/2; } else { - ((int16_t *) UE->pdsch_vars[0]->dl_bf_ch_estimates[(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size)*2]=(short)(AMP); - ((int16_t *) UE->pdsch_vars[0]->dl_bf_ch_estimates[(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size)*2]=0/2; + ((int16_t *) UE->pdsch_vars[subframe&0x1][0]->dl_bf_ch_estimates[(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size)*2]=(short)(AMP); + ((int16_t *) UE->pdsch_vars[subframe&0x1][0]->dl_bf_ch_estimates[(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size)*2]=0/2; } } } @@ -3485,34 +3485,34 @@ PMI_FEEDBACK: //write_output("rxsig0.m","rxs0", &UE->common_vars.rxdata[0][0],10*UE->frame_parms.samples_per_tti,1,1); write_output("rxsig0.m","rxs0", &UE->common_vars.rxdata[0][subframe*UE->frame_parms.samples_per_tti],UE->frame_parms.samples_per_tti,1,1); //write_output("rxsigF0.m","rxsF0", &UE->common_vars.rxdataF[0][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size],UE->frame_parms.ofdm_symbol_size*nsymb,1,1); - write_output("rxsigF0.m","rxsF0", &UE->common_vars.rxdataF[0][0],UE->frame_parms.ofdm_symbol_size*nsymb,1,1); + write_output("rxsigF0.m","rxsF0", &UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[0][0],UE->frame_parms.ofdm_symbol_size*nsymb,1,1); if (UE->frame_parms.nb_antennas_rx>1) { write_output("rxsig1.m","rxs1", UE->common_vars.rxdata[1],UE->frame_parms.samples_per_tti,1,1); - write_output("rxsigF1.m","rxsF1", UE->common_vars.rxdataF[1],UE->frame_parms.ofdm_symbol_size*nsymb,1,1); + write_output("rxsigF1.m","rxsF1", UE->common_vars..common_vars_rx_data_per_thread[subframe&0x1]rxdataF[1],UE->frame_parms.ofdm_symbol_size*nsymb,1,1); } write_output("dlsch00_r0.m","dl00_r0", - &(UE->common_vars.dl_ch_estimates[eNB_id][0][0]), + &(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][0][0]), UE->frame_parms.ofdm_symbol_size*nsymb,1,1); if (UE->frame_parms.nb_antennas_rx>1) write_output("dlsch01_r0.m","dl01_r0", - &(UE->common_vars.dl_ch_estimates[eNB_id][1][0]), + &(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][1][0]), UE->frame_parms.ofdm_symbol_size*nsymb,1,1); if (eNB->frame_parms.nb_antennas_tx>1) write_output("dlsch10_r0.m","dl10_r0", - &(UE->common_vars.dl_ch_estimates[eNB_id][2][0]), + &(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][2][0]), UE->frame_parms.ofdm_symbol_size*nsymb,1,1); if ((UE->frame_parms.nb_antennas_rx>1) && (eNB->frame_parms.nb_antennas_tx>1)) write_output("dlsch11_r0.m","dl11_r0", - &(UE->common_vars.dl_ch_estimates[eNB_id][3][0]), + &(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][3][0]), UE->frame_parms.ofdm_symbol_size*nsymb/2,1,1); //pdsch_vars - dump_dlsch2(UE,eNB_id,coded_bits_per_codeword,round); + dump_dlsch2(UE,eNB_id,subframe,coded_bits_per_codeword,round); //dump_dlsch2(UE,eNB_id_i,coded_bits_per_codeword); write_output("dlsch_e.m","e",eNB->dlsch[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4); @@ -3535,8 +3535,8 @@ PMI_FEEDBACK: if (trials==0 && round==0 && transmission_mode>=5 && transmission_mode<7) { for (iii=0; iii<NB_RB; iii++) { //fprintf(csv_fd, "%d, %d", (UE->pdsch_vars[eNB_id]->pmi_ext[iii]),(UE->pdsch_vars[eNB_id_i]->pmi_ext[iii])); - fprintf(csv_fd,"%x,%x,",(UE->pdsch_vars[eNB_id]->pmi_ext[iii]),(UE->pdsch_vars[eNB_id]->pmi_ext[iii])); - printf("%x ",(UE->pdsch_vars[eNB_id]->pmi_ext[iii])); + fprintf(csv_fd,"%x,%x,",(UE->pdsch_vars[subframe&0x1][eNB_id]->pmi_ext[iii]),(UE->pdsch_vars[eNB_id]->pmi_ext[iii])); + printf("%x ",(UE->pdsch_vars[subframe&0x1][eNB_id]->pmi_ext[iii])); } } } @@ -3560,7 +3560,7 @@ PMI_FEEDBACK: // calculate uncoded BLER uncoded_ber=0; for (i=0;i<coded_bits_per_codeword;i++) - if (eNB->dlsch[0][0]->harq_processes[0]->e[i] != (UE->pdsch_vars[0]->llr[0][i]<0)) { + if (eNB->dlsch[0][0]->harq_processes[0]->e[i] != (UE->pdsch_vars[subframe&0x1][0]->llr[0][i]<0)) { uncoded_ber_bit[i] = 1; uncoded_ber++; } @@ -3579,14 +3579,14 @@ PMI_FEEDBACK: 0, UE->dlsch[0][cw], coded_bits_per_codeword, - UE->pdsch_vars[eNB_id]->llr[cw], + UE->pdsch_vars[subframe&0x1][eNB_id]->llr[cw], 0, subframe<<1); stop_meas(&UE->dlsch_unscrambling_stats); start_meas(&UE->dlsch_decoding_stats); ret = dlsch_decoding(UE, - UE->pdsch_vars[eNB_id]->llr[cw], + UE->pdsch_vars[subframe&0x1][eNB_id]->llr[cw], &UE->frame_parms, UE->dlsch[0][cw], UE->dlsch[0][cw]->harq_processes[UE->dlsch[0][cw]->current_harq_pid], @@ -3687,7 +3687,7 @@ PMI_FEEDBACK: write_output(fname,vname, &UE->common_vars.rxdata[0][0],10*UE->frame_parms.samples_per_tti,1,1); sprintf(fname,"rxsigF0_r%d.m",round); sprintf(vname,"rxs0F_r%d",round); - write_output(fname,vname, &UE->common_vars.rxdataF[0][0],2*UE->frame_parms.ofdm_symbol_size*nsymb,2,1); + write_output(fname,vname, &UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[0][0],2*UE->frame_parms.ofdm_symbol_size*nsymb,2,1); if (UE->frame_parms.nb_antennas_rx>1) { sprintf(fname,"rxsig1_r%d.m",round); @@ -3695,20 +3695,20 @@ PMI_FEEDBACK: write_output(fname,vname, UE->common_vars.rxdata[1],UE->frame_parms.samples_per_tti,1,1); sprintf(fname,"rxsig1F_r%d.m",round); sprintf(vname,"rxs1F_r%d.m",round); - write_output(fname,vname, UE->common_vars.rxdataF[1],2*UE->frame_parms.ofdm_symbol_size*nsymb,2,1); + write_output(fname,vname, UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[1],2*UE->frame_parms.ofdm_symbol_size*nsymb,2,1); } sprintf(fname,"dlsch00_r%d.m",round); sprintf(vname,"dl00_r%d",round); write_output(fname,vname, - &(UE->common_vars.dl_ch_estimates[eNB_id][0][0]), + &(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][0][0]), UE->frame_parms.ofdm_symbol_size*nsymb,1,1); if (UE->frame_parms.nb_antennas_rx>1) { sprintf(fname,"dlsch01_r%d.m",round); sprintf(vname,"dl01_r%d",round); write_output(fname,vname, - &(UE->common_vars.dl_ch_estimates[eNB_id][1][0]), + &(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][1][0]), UE->frame_parms.ofdm_symbol_size*nsymb/2,1,1); } @@ -3716,7 +3716,7 @@ PMI_FEEDBACK: sprintf(fname,"dlsch10_r%d.m",round); sprintf(vname,"dl10_r%d",round); write_output(fname,vname, - &(UE->common_vars.dl_ch_estimates[eNB_id][2][0]), + &(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][2][0]), UE->frame_parms.ofdm_symbol_size*nsymb/2,1,1); } @@ -3724,12 +3724,12 @@ PMI_FEEDBACK: sprintf(fname,"dlsch11_r%d.m",round); sprintf(vname,"dl11_r%d",round); write_output(fname,vname, - &(UE->common_vars.dl_ch_estimates[eNB_id][3][0]), + &(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][3][0]), UE->frame_parms.ofdm_symbol_size*nsymb/2,1,1); } //pdsch_vars - dump_dlsch2(UE,eNB_id,coded_bits_per_codeword,round); + dump_dlsch2(UE,eNB_id,subframe,coded_bits_per_codeword,round); /* write_output("dlsch_e.m","e",eNB->dlsch[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4); write_output("dlsch_ber_bit.m","ber_bit",uncoded_ber_bit,coded_bits_per_codeword,1,0); diff --git a/openair1/SIMULATION/LTE_PHY/mbmssim.c b/openair1/SIMULATION/LTE_PHY/mbmssim.c index 2f8fda7707e76ca0e6f1044e4debc6408ec09b36..fb2fa506ac20f01aedc334f9283ca4836f75b895 100644 --- a/openair1/SIMULATION/LTE_PHY/mbmssim.c +++ b/openair1/SIMULATION/LTE_PHY/mbmssim.c @@ -447,8 +447,8 @@ int main(int argc, char **argv) for(aa=0; aa<frame_parms->nb_antennas_tx; aa++) { for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { for (i=0; i<frame_parms->N_RB_DL*12; i++) { - ((int16_t *) UE->common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)(eNB2UE->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x*AMP); - ((int16_t *) UE->common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)(eNB2UE->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].y*AMP); + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[k][(aa<<1)+aarx])[2*i+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)(eNB2UE->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x*AMP); + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)(eNB2UE->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].y*AMP); } } } @@ -492,7 +492,7 @@ int main(int argc, char **argv) &UE->frame_parms, UE->dlsch_MCH[0], UE->dlsch_MCH[0]->harq_processes[0], - frame, + trials, subframe, 0,0,0); diff --git a/openair1/SIMULATION/LTE_PHY/pbchsim.c b/openair1/SIMULATION/LTE_PHY/pbchsim.c index 83906d73226dd476f2a2a6b472cf0403fb8984de..806a206a2bd851800126a929b7a9f51bfa14dec9 100644 --- a/openair1/SIMULATION/LTE_PHY/pbchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pbchsim.c @@ -932,6 +932,7 @@ int main(int argc, char **argv) lte_ue_measurements(UE, 0, 1, + 0, 0); /* if (trial%100 == 0) { @@ -963,7 +964,7 @@ int main(int argc, char **argv) //sprintf(vname,"dl_ch00_%d",l); //write_output(fname,vname,&(common_vars->dl_ch_estimates[0][frame_parms->ofdm_symbol_size*(l%6)]),frame_parms->ofdm_symbol_size,1,1); - lte_est_freq_offset(UE->common_vars.dl_ch_estimates[0], + lte_est_freq_offset(UE->common_vars.common_vars_rx_data_per_thread[/*subframe*/0&0x1].dl_ch_estimates[0], &UE->frame_parms, l, &freq_offset, @@ -1051,13 +1052,13 @@ int main(int argc, char **argv) if (n_frames==1) { - write_output("H00.m","h00",&(UE->common_vars.dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(eNB->frame_parms.ofdm_symbol_size),1,1); + write_output("H00.m","h00",&(UE->common_vars.common_vars_rx_data_per_thread[/*subframe*/0&0x1].dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(eNB->frame_parms.ofdm_symbol_size),1,1); if (n_tx==2) - write_output("H10.m","h10",&(UE->common_vars.dl_ch_estimates[0][2][0]),((frame_parms->Ncp==0)?7:6)*(eNB->frame_parms.ofdm_symbol_size),1,1); + write_output("H10.m","h10",&(UE->common_vars.common_vars_rx_data_per_thread[/*subframe*/0&0x1].dl_ch_estimates[0][2][0]),((frame_parms->Ncp==0)?7:6)*(eNB->frame_parms.ofdm_symbol_size),1,1); write_output("rxsig0.m","rxs0", UE->common_vars.rxdata[0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); - write_output("rxsigF0.m","rxsF0", UE->common_vars.rxdataF[0],NUMBER_OF_OFDM_CARRIERS*2*((frame_parms->Ncp==0)?14:12),2,1); + write_output("rxsigF0.m","rxsF0", UE->common_vars.common_vars_rx_data_per_thread[/*subframe*/0&0x1].rxdataF[0],NUMBER_OF_OFDM_CARRIERS*2*((frame_parms->Ncp==0)?14:12),2,1); write_output("PBCH_rxF0_ext.m","pbch0_ext",UE->pbch_vars[0]->rxdataF_ext[0],12*4*6,1,1); write_output("PBCH_rxF0_comp.m","pbch0_comp",UE->pbch_vars[0]->rxdataF_comp[0],12*4*6,1,1); write_output("PBCH_rxF_llr.m","pbch_llr",UE->pbch_vars[0]->llr,(frame_parms->Ncp==0) ? 1920 : 1728,1,4); diff --git a/openair1/SIMULATION/LTE_PHY/pdcchsim.c b/openair1/SIMULATION/LTE_PHY/pdcchsim.c index 909468366b706191e6c6c0fe0701b137623c8f40..1ba79bdb0a4182ff10a2c5ae3609025310704381 100644 --- a/openair1/SIMULATION/LTE_PHY/pdcchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pdcchsim.c @@ -1060,9 +1060,9 @@ int main(int argc, char **argv) for(aa=0; aa<frame_parms->nb_antennas_tx; aa++) { for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { for (i=0; i<frame_parms->N_RB_DL*12; i++) { - ((int16_t *) UE->common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)( + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[k][(aa<<1)+aarx])[2*i+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)( eNB2UE->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x*AMP); - ((int16_t *) UE->common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)( + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)( eNB2UE->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].y*AMP); } } @@ -1072,8 +1072,8 @@ int main(int argc, char **argv) for(aa=0; aa<frame_parms->nb_antenna_ports_eNB; aa++) { for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { for (i=0; i<frame_parms->N_RB_DL*12; i++) { - ((int16_t *) UE->common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(short)(AMP); - ((int16_t *) UE->common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+1+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0/2; + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][(aa<<1)+aarx])[2*i+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(short)(AMP); + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][(aa<<1)+aarx])[2*i+1+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0/2; } } } @@ -1091,7 +1091,7 @@ int main(int argc, char **argv) rx_pdcch(&UE->common_vars, UE->pdcch_vars, &UE->frame_parms, - frame, + trial, subframe, 0, (UE->frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI, @@ -1212,17 +1212,17 @@ int main(int argc, char **argv) write_output("txsig1.m","txs1", txdata[1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); write_output("rxsig0.m","rxs0", UE->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); - write_output("rxsigF0.m","rxsF0", UE->common_vars.rxdataF[0],NUMBER_OF_OFDM_CARRIERS*2*((frame_parms->Ncp==0)?14:12),2,1); + write_output("rxsigF0.m","rxsF0", UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[0],NUMBER_OF_OFDM_CARRIERS*2*((frame_parms->Ncp==0)?14:12),2,1); if (n_rx>1) { write_output("rxsig1.m","rxs1", UE->common_vars.rxdata[1],10*frame_parms->samples_per_tti,1,1); - write_output("rxsigF1.m","rxsF1", UE->common_vars.rxdataF[1],NUMBER_OF_OFDM_CARRIERS*2*((frame_parms->Ncp==0)?14:12),2,1); + write_output("rxsigF1.m","rxsF1", UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[1],NUMBER_OF_OFDM_CARRIERS*2*((frame_parms->Ncp==0)?14:12),2,1); } - write_output("H00.m","h00",&(UE->common_vars.dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(eNB->frame_parms.ofdm_symbol_size),1,1); + write_output("H00.m","h00",&(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(eNB->frame_parms.ofdm_symbol_size),1,1); if (n_tx==2) - write_output("H10.m","h10",&(UE->common_vars.dl_ch_estimates[0][2][0]),((frame_parms->Ncp==0)?7:6)*(eNB->frame_parms.ofdm_symbol_size),1,1); + write_output("H10.m","h10",&(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][2][0]),((frame_parms->Ncp==0)?7:6)*(eNB->frame_parms.ofdm_symbol_size),1,1); write_output("pdcch_rxF_ext0.m","pdcch_rxF_ext0",UE->pdcch_vars[eNb_id]->rxdataF_ext[0],3*12*UE->frame_parms.N_RB_DL,1,1); write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",UE->pdcch_vars[eNb_id]->rxdataF_comp[0],4*12*UE->frame_parms.N_RB_DL,1,1); diff --git a/openair1/SIMULATION/LTE_PHY/syncsim.c b/openair1/SIMULATION/LTE_PHY/syncsim.c index d8d8dac2148e3c3a4b29e21601bbee53f5fa4ac7..6e74f7bc01f2181a09c44dbddf5c522b43a0c710 100644 --- a/openair1/SIMULATION/LTE_PHY/syncsim.c +++ b/openair1/SIMULATION/LTE_PHY/syncsim.c @@ -1683,9 +1683,9 @@ int main(int argc, char **argv) frame_parms, PHY_vars_UE[0]->lte_ue_pdcch_vars[0]->num_pdcch_symbols, (int16_t**)PHY_vars_UE[0]->lte_ue_common_vars.dl_ch_estimates_time, - (int16_t**)PHY_vars_UE[0]->lte_ue_common_vars.dl_ch_estimates[0], + (int16_t**)PHY_vars_UE[0]->lte_ue_common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0], (int16_t**)PHY_vars_UE[0]->lte_ue_common_vars.rxdata, - (int16_t**)PHY_vars_UE[0]->lte_ue_common_vars.rxdataF, + (int16_t**)PHY_vars_UE[0]->lte_ue_common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF, (int16_t*)PHY_vars_UE[0]->lte_ue_pdcch_vars[0]->rxdataF_comp[0], (int16_t*)PHY_vars_UE[0]->lte_ue_pdsch_vars[0]->rxdataF_comp[0], (int16_t*)PHY_vars_UE[0]->lte_ue_pdsch_vars[1]->rxdataF_comp[0], @@ -1699,9 +1699,9 @@ int main(int argc, char **argv) frame_parms, PHY_vars_UE[1]->lte_ue_pdcch_vars[0]->num_pdcch_symbols, (int16_t**)PHY_vars_UE[1]->lte_ue_common_vars.dl_ch_estimates_time, - (int16_t**)PHY_vars_UE[1]->lte_ue_common_vars.dl_ch_estimates[0], + (int16_t**)PHY_vars_UE[1]->lte_ue_common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0], (int16_t**)PHY_vars_UE[1]->lte_ue_common_vars.rxdata, - (int16_t**)PHY_vars_UE[1]->lte_ue_common_vars.rxdataF, + (int16_t**)PHY_vars_UE[1]->lte_ue_common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF, (int16_t*)PHY_vars_UE[1]->lte_ue_pdcch_vars[0]->rxdataF_comp[0], (int16_t*)PHY_vars_UE[1]->lte_ue_pdsch_vars[0]->rxdataF_comp[0], (int16_t*)PHY_vars_UE[1]->lte_ue_pdsch_vars[3]->rxdataF_comp[0], @@ -1718,10 +1718,10 @@ int main(int argc, char **argv) if (n_frames==1) { - write_output("H00.m","h00",&(PHY_vars_UE[0]->lte_ue_common_vars.dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size),1,1); + write_output("H00.m","h00",&(PHY_vars_UE[0]->lte_ue_common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size),1,1); if (n_tx==2) - write_output("H10.m","h10",&(PHY_vars_UE[0]->lte_ue_common_vars.dl_ch_estimates[0][2][0]),((frame_parms->Ncp==0)?7:6)*(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size),1,1); + write_output("H10.m","h10",&(PHY_vars_UE[0]->lte_ue_common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][2][0]),((frame_parms->Ncp==0)?7:6)*(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size),1,1); write_output("rxsig0.m","rxs0", PHY_vars_UE[0]->lte_ue_common_vars.rxdata[0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); write_output("rxsigF0.m","rxsF0", PHY_vars_UE[0]->lte_ue_common_vars.rxdataF[0],NUMBER_OF_OFDM_CARRIERS*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb,2,1); @@ -1739,7 +1739,7 @@ int main(int argc, char **argv) PHY_vars_UE[0]->lte_ue_pdcch_vars[0]->num_pdcch_symbols, 0); - dump_dlsch2(PHY_vars_UE[0],0,coded_bits_per_codeword); + dump_dlsch2(PHY_vars_UE[0],0,0,coded_bits_per_codeword); } } else { diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c index cf9e5aaa30ae9e42a850d2111626471ec2111f96..55c6b8387eef3df727539536679b6d4a6a8fa00a 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsim.c +++ b/openair1/SIMULATION/LTE_PHY/ulsim.c @@ -1175,7 +1175,7 @@ int main(int argc, char **argv) eNB->td = (parallel_flag == 1) ? ulsch_decoding_data_2thread : ulsch_decoding_data; eNB->do_prach = NULL; - phy_procedures_eNB_common_RX(eNB); + phy_procedures_eNB_common_RX(eNB,proc_rxtx); phy_procedures_eNB_uespec_RX(eNB,proc_rxtx,no_relay); diff --git a/openair2/COMMON/commonDef.h b/openair2/COMMON/commonDef.h index cfd5d68e40a9a92d8b09b533f316430c00373c99..b1ec47449af1a7f0da1fa7257c16db49ad7eda6d 100644 --- a/openair2/COMMON/commonDef.h +++ b/openair2/COMMON/commonDef.h @@ -43,6 +43,13 @@ Description Contains global common definitions #include <stddef.h> #include <stdbool.h> +/* boolean_t is also defined in openair2/COMMON/platform_types.h + * let's protect potential redefinition + */ + +#ifndef _BOOLEAN_T_DEFINED_ +#define _BOOLEAN_T_DEFINED_ + typedef signed char boolean_t; #if !defined(TRUE) @@ -55,6 +62,8 @@ typedef signed char boolean_t; #define BOOL_NOT(b) (b^TRUE) +#endif /* _BOOLEAN_T_DEFINED_ */ + #define NAS_UE_ID_FMT "0x%06x" /****************************************************************************/ diff --git a/openair2/COMMON/platform_types.h b/openair2/COMMON/platform_types.h index 327523f1d0354fa92b84b1d7bb9a293fc4015b0a..b17e7d772424eb18612e9f5796ab27f817bd12f2 100644 --- a/openair2/COMMON/platform_types.h +++ b/openair2/COMMON/platform_types.h @@ -40,6 +40,13 @@ //----------------------------------------------------------------------------- // GENERIC TYPES //----------------------------------------------------------------------------- + +/* boolean_t is also defined in openair2/COMMON/commonDef.h, + * let's protect potential redefinition + */ +#ifndef _BOOLEAN_T_DEFINED_ +#define _BOOLEAN_T_DEFINED_ + typedef signed char boolean_t; #if !defined(TRUE) @@ -52,6 +59,8 @@ typedef signed char boolean_t; #define BOOL_NOT(b) (b^TRUE) +#endif /* _BOOLEAN_T_DEFINED_ */ + //----------------------------------------------------------------------------- // GENERIC ACCESS STRATUM TYPES //----------------------------------------------------------------------------- diff --git a/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac.c b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac.c index b9cad28278ba60fab4a54d0ce5535d6f5ea5c6d1..e353f5fde72d65725154084e1520cec23bb1e6b7 100644 --- a/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac.c +++ b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac.c @@ -30,6 +30,7 @@ #include "flexran_agent_extern.h" #include "flexran_agent_common.h" #include "flexran_agent_mac_internal.h" +#include "flexran_agent_net_comm.h" #include "LAYER2/MAC/proto.h" #include "LAYER2/MAC/flexran_agent_mac_proto.h" @@ -60,14 +61,11 @@ int flexran_agent_mac_handle_stats(mid_t mod_id, const void *params, Protocol__F // TODO: Must resolve conflicts among stats requests int i; - void *buffer; - int size; err_code_t err_code; xid_t xid; uint32_t usec_interval, sec_interval; //TODO: We do not deal with multiple CCs at the moment and eNB id is 0 - int cc_id = 0; int enb_id = mod_id; //eNB_MAC_INST *eNB = &eNB_mac_inst[enb_id]; @@ -250,15 +248,15 @@ int flexran_agent_mac_stats_request(mid_t mod_id, Protocol__FlexHeader *header; int i; - if (flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_STATS_REQUEST, &header) != 0) - goto error; - Protocol__FlexStatsRequest *stats_request_msg; stats_request_msg = malloc(sizeof(Protocol__FlexStatsRequest)); if(stats_request_msg == NULL) goto error; - protocol__flex_stats_request__init(stats_request_msg); + + if (flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_STATS_REQUEST, &header) != 0) + goto error; + stats_request_msg->header = header; stats_request_msg->type = report_config->report_type; @@ -375,20 +373,19 @@ int flexran_agent_mac_stats_reply(mid_t mod_id, Protocol__FlexranMessage **msg) { Protocol__FlexHeader *header; int i, j, k; - int cc_id = 0; int enb_id = mod_id; //eNB_MAC_INST *eNB = &eNB_mac_inst[enb_id]; //UE_list_t *eNB_UE_list= &eNB->UE_list; - - if (flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_STATS_REPLY, &header) != 0) - goto error; - Protocol__FlexStatsReply *stats_reply_msg; stats_reply_msg = malloc(sizeof(Protocol__FlexStatsReply)); if (stats_reply_msg == NULL) goto error; protocol__flex_stats_reply__init(stats_reply_msg); + + if (flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_STATS_REPLY, &header) != 0) + goto error; + stats_reply_msg->header = header; stats_reply_msg->n_ue_report = report_config->nr_ue; @@ -419,7 +416,7 @@ int flexran_agent_mac_stats_reply(mid_t mod_id, elem = (uint32_t *) malloc(sizeof(uint32_t)*ue_report[i]->n_bsr); if (elem == NULL) goto error; - for (j = 0; j++; j < ue_report[i]->n_bsr) { + for (j = 0; j < ue_report[i]->n_bsr; j++) { // NN: we need to know the cc_id here, consider the first one elem[j] = flexran_get_ue_bsr (enb_id, i, j); } @@ -472,7 +469,7 @@ int flexran_agent_mac_stats_reply(mid_t mod_id, /* Check flag for creation of MAC CE buffer status report */ if (report_config->ue_report_type[i].ue_report_flags & PROTOCOL__FLEX_UE_STATS_TYPE__FLUST_MAC_CE_BS) { // TODO: Fill in the actual MAC CE buffer status report - ue_report[i]->pending_mac_ces = (flexran_get_MAC_CE_bitmap_TA(enb_id,i,0) | (0 << 1) | (0 << 2) | (0 << 3)) & 15; /* Use as bitmap. Set one or more of the; /* Use as bitmap. Set one or more of the + ue_report[i]->pending_mac_ces = (flexran_get_MAC_CE_bitmap_TA(enb_id,i,0) | (0 << 1) | (0 << 2) | (0 << 3)) & 15; /* Use as bitmap. Set one or more of the PROTOCOL__FLEX_CE_TYPE__FLPCET_ values found in stats_common.pb-c.h. See flex_ce_type in FlexRAN specification */ @@ -802,6 +799,8 @@ int flexran_agent_mac_destroy_stats_reply(Protocol__FlexranMessage *msg) { } free(dl_report->csi_report[j]->a31csi->sb_cqi); break; + default: + break; } free(dl_report->csi_report[j]); @@ -856,8 +855,6 @@ int flexran_agent_mac_sr_info(mid_t mod_id, const void *params, Protocol__Flexra Protocol__FlexHeader *header; int i; const int xid = *((int *)params); - if (flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_UL_SR_INFO, &header) != 0) - goto error; Protocol__FlexUlSrInfo *ul_sr_info_msg; ul_sr_info_msg = malloc(sizeof(Protocol__FlexUlSrInfo)); @@ -866,6 +863,9 @@ int flexran_agent_mac_sr_info(mid_t mod_id, const void *params, Protocol__Flexra } protocol__flex_ul_sr_info__init(ul_sr_info_msg); + if (flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_UL_SR_INFO, &header) != 0) + goto error; + ul_sr_info_msg->header = header; ul_sr_info_msg->has_sfn_sf = 1; ul_sr_info_msg->sfn_sf = flexran_get_sfn_sf(mod_id); @@ -923,8 +923,6 @@ int flexran_agent_mac_sf_trigger(mid_t mod_id, const void *params, Protocol__Fle Protocol__FlexHeader *header; int i,j; const int xid = *((int *)params); - if (flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_SF_TRIGGER, &header) != 0) - goto error; Protocol__FlexSfTrigger *sf_trigger_msg; sf_trigger_msg = malloc(sizeof(Protocol__FlexSfTrigger)); @@ -933,6 +931,9 @@ int flexran_agent_mac_sf_trigger(mid_t mod_id, const void *params, Protocol__Fle } protocol__flex_sf_trigger__init(sf_trigger_msg); + if (flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_SF_TRIGGER, &header) != 0) + goto error; + frame_t frame; sub_frame_t subframe; @@ -975,8 +976,8 @@ int flexran_agent_mac_sf_trigger(mid_t mod_id, const void *params, Protocol__Fle dl_info[i]->rnti = flexran_get_ue_crnti(mod_id, i); dl_info[i]->has_rnti = 1; /*Fill in the right id of this round's HARQ process for this UE*/ - int harq_id; - int harq_status; + unsigned char harq_id; + unsigned char harq_status; flexran_get_harq(mod_id, UE_PCCID(mod_id,i), i, frame, subframe, &harq_id, &harq_status); dl_info[i]->harq_process_id = harq_id; dl_info[i]->has_harq_process_id = 1; @@ -1060,10 +1061,7 @@ int flexran_agent_mac_sf_trigger(mid_t mod_id, const void *params, Protocol__Fle for (i = 0; i < sf_trigger_msg->n_dl_info; i++) { free(sf_trigger_msg->dl_info[i]->harq_status); } - free(sf_trigger_msg->dl_info); - for (i = 0; i < sf_trigger_msg->n_ul_info; i++) { - free(sf_trigger_msg->ul_info[i]->reception_status); - } + free(sf_trigger_msg->dl_info); free(sf_trigger_msg->ul_info); free(sf_trigger_msg); } @@ -1230,9 +1228,9 @@ int flexran_agent_mac_handle_dl_mac_config(mid_t mod_id, const void *params, Pro *msg = NULL; return 2; - error: - *msg = NULL; - return -1; + // error: + //*msg = NULL; + //return -1; } void flexran_agent_init_mac_agent(mid_t mod_id) { @@ -1252,7 +1250,7 @@ void flexran_agent_send_sr_info(mid_t mod_id) { int size; Protocol__FlexranMessage *msg; void *data; - int priority; + int priority = 0; err_code_t err_code; int xid = 0; @@ -1282,7 +1280,7 @@ void flexran_agent_send_sf_trigger(mid_t mod_id) { int size; Protocol__FlexranMessage *msg; void *data; - int priority; + int priority = 0; err_code_t err_code; int xid = 0; @@ -1310,13 +1308,11 @@ void flexran_agent_send_sf_trigger(mid_t mod_id) { void flexran_agent_send_update_mac_stats(mid_t mod_id) { - Protocol__FlexranMessage *current_report = NULL, *msg; + Protocol__FlexranMessage *current_report = NULL; void *data; int size; err_code_t err_code; - int priority; - - mac_stats_updates_context_t stats_context = mac_stats_context[mod_id]; + int priority = 0; if (pthread_mutex_lock(mac_stats_context[mod_id].mutex)) { goto error; @@ -1437,7 +1433,7 @@ err_code_t flexran_agent_destroy_cont_mac_stats_update(mid_t mod_id) { flexran_agent_destroy_flexran_message(mac_stats_context[mod_id].prev_stats_reply); free(mac_stats_context[mod_id].mutex); - mac_agent_registered[mod_id] = NULL; + mac_agent_registered[mod_id] = 0; return 1; } diff --git a/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_defs.h b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_defs.h index bb6aed1d8e9fadda1a37339fa993635b39de7956..9ec8594f88e567643f566145bb4dc2a0268a616c 100644 --- a/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_defs.h +++ b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_defs.h @@ -63,8 +63,8 @@ typedef struct { /// Notify the controller for a state change of a particular UE, by sending the proper /// UE state change message (ACTIVATION, DEACTIVATION, HANDOVER) - void (*flexran_agent_notify_ue_state_change)(mid_t mod_id, uint32_t rnti, - uint32_t state_change); + int (*flexran_agent_notify_ue_state_change)(mid_t mod_id, uint32_t rnti, + uint8_t state_change); void *dl_scheduler_loaded_lib; diff --git a/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.c b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.c index a63225e657cc725f42124ccf60fcfafb228c7f45..1fa9852487d6922ba211be4e7affddcedbf3339a 100644 --- a/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.c +++ b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.c @@ -29,6 +29,7 @@ #include <string.h> #include <dlfcn.h> +#include "flexran_agent_common_internal.h" #include "flexran_agent_mac_internal.h" Protocol__FlexranMessage * flexran_agent_generate_diff_mac_stats_report(Protocol__FlexranMessage *new_message, @@ -49,11 +50,6 @@ Protocol__FlexranMessage * flexran_agent_generate_diff_mac_stats_report(Protocol old_report = old_message->stats_reply_msg; new_report = new_message->stats_reply_msg; - /*Flags to designate changes in various levels of the message*/ - int stats_had_changes = 0; - int ue_had_change = 0; - int cell_had_change = 0; - /*See how many and which UE reports should be included in the final stats message*/ int n_ue_report = 0; int ue_found = 0; @@ -101,23 +97,6 @@ Protocol__FlexranMessage * flexran_agent_generate_diff_mac_stats_report(Protocol } cell_found = 0; } - - /*TODO: create the reply message based on the findings*/ - /*Create ue report list*/ - if (n_ue_report > 0) { - ue_report = malloc(sizeof(Protocol__FlexUeStatsReport *)); - for (i = 0; i<n_ue_report; i++) { - ue_report[i] = tmp_ue_report[i]; - } - } - - /*Create cell report list*/ - if (n_cell_report > 0) { - cell_report = malloc(sizeof(Protocol__FlexCellStatsReport *)); - for (i = 0; i<n_cell_report; i++) { - cell_report[i] = tmp_cell_report[i]; - } - } if (n_cell_report > 0 || n_ue_report > 0) { /*Create header*/ @@ -128,11 +107,30 @@ Protocol__FlexranMessage * flexran_agent_generate_diff_mac_stats_report(Protocol } stats_reply_msg = malloc(sizeof(Protocol__FlexStatsReply)); protocol__flex_stats_reply__init(stats_reply_msg); + stats_reply_msg->header = header; + + /*TODO: create the reply message based on the findings*/ + /*Create ue report list*/ stats_reply_msg->n_ue_report = n_ue_report; - stats_reply_msg->ue_report = ue_report; + if (n_ue_report > 0) { + ue_report = malloc(sizeof(Protocol__FlexUeStatsReport *)); + for (i = 0; i<n_ue_report; i++) { + ue_report[i] = tmp_ue_report[i]; + } + stats_reply_msg->ue_report = ue_report; + } + + /*Create cell report list*/ stats_reply_msg->n_cell_report = n_cell_report; - stats_reply_msg->cell_report = cell_report; + if (n_cell_report > 0) { + cell_report = malloc(sizeof(Protocol__FlexCellStatsReport *)); + for (i = 0; i<n_cell_report; i++) { + cell_report[i] = tmp_cell_report[i]; + } + stats_reply_msg->cell_report = cell_report; + } + msg = malloc(sizeof(Protocol__FlexranMessage)); if(msg == NULL) goto error; @@ -270,7 +268,7 @@ Protocol__FlexUlCqiReport * copy_ul_cqi_report(Protocol__FlexUlCqiReport * origi ul_report = malloc(sizeof(Protocol__FlexUlCqi *) * full_ul_report->n_cqi_meas); if(ul_report == NULL) goto error; - for(i = 0; i++; i < full_ul_report->n_cqi_meas) { + for(i = 0; i < full_ul_report->n_cqi_meas; i++) { ul_report[i] = malloc(sizeof(Protocol__FlexUlCqi)); if(ul_report[i] == NULL) goto error; @@ -597,22 +595,22 @@ int parse_mac_config(mid_t mod_id, yaml_parser_t *parser) { goto error; } // Check the types of subsystems offered and handle their values accordingly - if (strcmp(event.data.scalar.value, "dl_scheduler") == 0) { + if (strcmp((char *) event.data.scalar.value, "dl_scheduler") == 0) { LOG_D(ENB_APP, "This is for the dl_scheduler subsystem\n"); // Call the proper handler if (parse_dl_scheduler_config(mod_id, parser) == -1) { LOG_D(ENB_APP, "An error occured\n"); goto error; } - } else if (strcmp(event.data.scalar.value, "ul_scheduler") == 0) { + } else if (strcmp((char *) event.data.scalar.value, "ul_scheduler") == 0) { // Call the proper handler LOG_D(ENB_APP, "This is for the ul_scheduler subsystem\n"); goto error; // TODO - } else if (strcmp(event.data.scalar.value, "ra_scheduler") == 0) { + } else if (strcmp((char *) event.data.scalar.value, "ra_scheduler") == 0) { // Call the proper handler // TODO - } else if (strcmp(event.data.scalar.value, "page_scheduler") == 0) { + } else if (strcmp((char *) event.data.scalar.value, "page_scheduler") == 0) { // Call the proper handler // TODO } else { @@ -665,20 +663,20 @@ int parse_dl_scheduler_config(mid_t mod_id, yaml_parser_t *parser) { goto error; } // Check what key needs to be set - if (strcmp(event.data.scalar.value, "behavior") == 0) { + if (strcmp((char *) event.data.scalar.value, "behavior") == 0) { LOG_I(ENB_APP, "Time to set the behavior attribute\n"); yaml_event_delete(&event); if (!yaml_parser_parse(parser, &event)) { goto error; } if (event.type == YAML_SCALAR_EVENT) { - if (load_dl_scheduler_function(mod_id, event.data.scalar.value) == -1) { + if (load_dl_scheduler_function(mod_id, (char *) event.data.scalar.value) == -1) { goto error; } } else { goto error; } - } else if (strcmp(event.data.scalar.value, "parameters") == 0) { + } else if (strcmp((char *) event.data.scalar.value, "parameters") == 0) { LOG_D(ENB_APP, "Now it is time to set the parameters for this subsystem\n"); if (parse_dl_scheduler_parameters(mod_id, parser) == -1) { goto error; @@ -731,7 +729,7 @@ int parse_dl_scheduler_parameters(mid_t mod_id, yaml_parser_t *parser) { if (mac_agent_registered[mod_id]) { LOG_D(ENB_APP, "Setting parameter %s\n", event.data.scalar.value); param = dlsym(agent_mac_xface[mod_id]->dl_scheduler_loaded_lib, - event.data.scalar.value); + (char *) event.data.scalar.value); if (param == NULL) { goto error; } diff --git a/openair2/ENB_APP/enb_app.c b/openair2/ENB_APP/enb_app.c index 3734bc4a2b11d9c66ab09b074dbffa78216f591b..60415aad868e3a8807172e9077a17b2eafb4ee6a 100644 --- a/openair2/ENB_APP/enb_app.c +++ b/openair2/ENB_APP/enb_app.c @@ -410,7 +410,7 @@ void *eNB_app_task(void *args_p) break; case TIMER_HAS_EXPIRED: - LOG_I(ENB_APP, " Received %s: timer_id %d\n", msg_name, TIMER_HAS_EXPIRED(msg_p).timer_id); + LOG_I(ENB_APP, " Received %s: timer_id %ld\n", msg_name, TIMER_HAS_EXPIRED(msg_p).timer_id); if (TIMER_HAS_EXPIRED (msg_p).timer_id == enb_register_retry_timer_id) { /* Restart the registration process */ diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index fb4c6266cae811568d6b1e132ebcf8c04fb7b2ef..1841d8e9a90631517f995bf73f78ea57134666a6 100644 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -344,7 +344,7 @@ void enb_config_display(void) #if defined(FLEXRAN_AGENT_SB_IF) printf( "\nFLEXRAN AGENT CONFIG : \n\n"); printf( "\tInterface name: \t%s:\n",enb_properties.properties[i]->flexran_agent_interface_name); - printf( "\tInterface IP Address: \t%s:\n",enb_properties.properties[i]->flexran_agent_ipv4_address); + // printf( "\tInterface IP Address: \t%s:\n",enb_properties.properties[i]->flexran_agent_ipv4_address); printf( "\tInterface PORT: \t%d:\n\n",enb_properties.properties[i]->flexran_agent_port); printf( "\tCache directory: \t%s:\n",enb_properties.properties[i]->flexran_agent_cache); @@ -2494,10 +2494,10 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) enb_properties.properties[enb_properties_index]->flexran_agent_interface_name = strdup(flexran_agent_interface_name); cidr = flexran_agent_ipv4_address; address = strtok(cidr, "/"); - enb_properties.properties[enb_properties_index]->flexran_agent_ipv4_address = strdup(address); - /* if (address) { + //enb_properties.properties[enb_properties_index]->flexran_agent_ipv4_address = strdup(address); + if (address) { IPV4_STR_ADDR_TO_INT_NWBO (address, enb_properties.properties[enb_properties_index]->flexran_agent_ipv4_address, "BAD IP ADDRESS FORMAT FOR eNB Agent !\n" ); - }*/ + } enb_properties.properties[enb_properties_index]->flexran_agent_port = flexran_agent_port; enb_properties.properties[enb_properties_index]->flexran_agent_cache = strdup(flexran_agent_cache); diff --git a/openair2/ENB_APP/flexran_agent.c b/openair2/ENB_APP/flexran_agent.c index beca1062bd6aa0fbd82a20ad5a0c39c0d0dfa899..0dcacd4b81a6d64da85524cb42619c4937330583 100644 --- a/openair2/ENB_APP/flexran_agent.c +++ b/openair2/ENB_APP/flexran_agent.c @@ -30,6 +30,8 @@ #include "log.h" #include "flexran_agent.h" #include "flexran_agent_mac_defs.h" +#include "flexran_agent_mac.h" +#include "flexran_agent_mac_internal.h" #include "flexran_agent_extern.h" @@ -38,6 +40,8 @@ #include "flexran_agent_net_comm.h" #include "flexran_agent_async.h" +#include <arpa/inet.h> + //#define TEST_TIMER flexran_agent_instance_t flexran_agent[NUM_MAX_ENB]; @@ -64,11 +68,10 @@ void *flexran_agent_task(void *args){ void *data; int size; err_code_t err_code; - int priority; + int priority = 0; MessageDef *msg_p = NULL; const char *msg_name = NULL; - instance_t instance; int result; struct flexran_agent_timer_element_s * elem = NULL; @@ -79,7 +82,6 @@ void *flexran_agent_task(void *args){ itti_receive_msg (TASK_FLEXRAN_AGENT, &msg_p); DevAssert(msg_p != NULL); msg_name = ITTI_MSG_NAME (msg_p); - instance = ITTI_MSG_INSTANCE (msg_p); switch (ITTI_MSG_ID(msg_p)) { case TERMINATE_MESSAGE: @@ -212,9 +214,8 @@ int flexran_agent_start(mid_t mod_id, const Enb_properties_array_t* enb_properti strcpy(local_cache, DEFAULT_FLEXRAN_AGENT_CACHE); } - if (enb_properties->properties[mod_id]->flexran_agent_ipv4_address != NULL) { - strncpy(in_ip, enb_properties->properties[mod_id]->flexran_agent_ipv4_address, sizeof(in_ip) ); - in_ip[sizeof(in_ip) - 1] = 0; // terminate string + if (enb_properties->properties[mod_id]->flexran_agent_ipv4_address != 0) { + inet_ntop(AF_INET, &(enb_properties->properties[mod_id]->flexran_agent_ipv4_address), in_ip, INET_ADDRSTRLEN); } else { strcpy(in_ip, DEFAULT_FLEXRAN_AGENT_IPv4_ADDRESS ); } @@ -237,7 +238,7 @@ int flexran_agent_start(mid_t mod_id, const Enb_properties_array_t* enb_properti channel_container_init = 1; } /*Create the async channel info*/ - flexran_agent_instance_t *channel_info = flexran_agent_async_channel_info(mod_id, in_ip, in_port); + flexran_agent_async_channel_t *channel_info = flexran_agent_async_channel_info(mod_id, in_ip, in_port); /*Create a channel using the async channel info*/ channel_id = flexran_agent_create_channel((void *) channel_info, diff --git a/openair2/ENB_APP/flexran_agent_common.c b/openair2/ENB_APP/flexran_agent_common.c index 2ccca6602b5d8f2fd60a4f3f37b3f71dd01b6476..22793f16b490d46ec9eec1da737c6e78ad3121b2 100644 --- a/openair2/ENB_APP/flexran_agent_common.c +++ b/openair2/ENB_APP/flexran_agent_common.c @@ -32,6 +32,7 @@ #include "flexran_agent_common.h" #include "flexran_agent_common_internal.h" #include "flexran_agent_extern.h" +#include "flexran_agent_net_comm.h" #include "PHY/extern.h" #include "log.h" @@ -110,14 +111,16 @@ int flexran_agent_hello(mid_t mod_id, const void *params, Protocol__FlexranMessa Protocol__FlexHeader *header; /*TODO: Need to set random xid or xid from received hello message*/ xid_t xid = 1; - if (flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_HELLO, &header) != 0) - goto error; Protocol__FlexHello *hello_msg; hello_msg = malloc(sizeof(Protocol__FlexHello)); if(hello_msg == NULL) goto error; protocol__flex_hello__init(hello_msg); + + if (flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_HELLO, &header) != 0) + goto error; + hello_msg->header = header; *msg = malloc(sizeof(Protocol__FlexranMessage)); @@ -163,14 +166,16 @@ int flexran_agent_echo_request(mid_t mod_id, const void* params, Protocol__Flexr Protocol__FlexHeader *header; /*TODO: Need to set a random xid*/ xid_t xid = 1; - if (flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_ECHO_REQUEST, &header) != 0) - goto error; - Protocol__FlexEchoRequest *echo_request_msg; + Protocol__FlexEchoRequest *echo_request_msg = NULL; echo_request_msg = malloc(sizeof(Protocol__FlexEchoRequest)); if(echo_request_msg == NULL) goto error; protocol__flex_echo_request__init(echo_request_msg); + + if (flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_ECHO_REQUEST, &header) != 0) + goto error; + echo_request_msg->header = header; *msg = malloc(sizeof(Protocol__FlexranMessage)); @@ -217,15 +222,16 @@ int flexran_agent_echo_reply(mid_t mod_id, const void *params, Protocol__Flexran Protocol__FlexEchoRequest *echo_req = input->echo_request_msg; xid = (echo_req->header)->xid; - Protocol__FlexHeader *header; - if (flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_ECHO_REPLY, &header) != 0) - goto error; - - Protocol__FlexEchoReply *echo_reply_msg; + Protocol__FlexEchoReply *echo_reply_msg = NULL; echo_reply_msg = malloc(sizeof(Protocol__FlexEchoReply)); if(echo_reply_msg == NULL) goto error; protocol__flex_echo_reply__init(echo_reply_msg); + + Protocol__FlexHeader *header; + if (flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_ECHO_REPLY, &header) != 0) + goto error; + echo_reply_msg->header = header; *msg = malloc(sizeof(Protocol__FlexranMessage)); @@ -299,7 +305,7 @@ int flexran_agent_destroy_ue_config_reply(Protocol__FlexranMessage *msg) { if(msg->msg_case != PROTOCOL__FLEXRAN_MESSAGE__MSG_UE_CONFIG_REPLY_MSG) goto error; free(msg->ue_config_reply_msg->header); - int i, j; + int i; Protocol__FlexUeConfigReply *reply = msg->ue_config_reply_msg; for(i = 0; i < reply->n_ue_config;i++){ @@ -376,7 +382,7 @@ int flexran_agent_destroy_lc_config_request(Protocol__FlexranMessage *msg) { } // call this function to start a nanosecond-resolution timer -struct timespec timer_start(){ +struct timespec timer_start(void) { struct timespec start_time; clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start_time); return start_time; @@ -395,11 +401,7 @@ int flexran_agent_control_delegation(mid_t mod_id, const void *params, Protocol_ Protocol__FlexranMessage *input = (Protocol__FlexranMessage *)params; Protocol__FlexControlDelegation *control_delegation_msg = input->control_delegation_msg; - uint32_t delegation_type = control_delegation_msg->delegation_type; - - int i; - - struct timespec vartime = timer_start(); + // struct timespec vartime = timer_start(); //Write the payload lib into a file in the cache and load the lib char lib_name[120]; @@ -413,16 +415,15 @@ int flexran_agent_control_delegation(mid_t mod_id, const void *params, Protocol_ fwrite(control_delegation_msg->payload.data, control_delegation_msg->payload.len, 1, f); fclose(f); - long time_elapsed_nanos = timer_end(vartime); + // long time_elapsed_nanos = timer_end(vartime); *msg = NULL; return 0; - error: - return -1; } int flexran_agent_destroy_control_delegation(Protocol__FlexranMessage *msg) { /*TODO: Dealocate memory for a dynamically allocated control delegation message*/ + return 0; } int flexran_agent_reconfiguration(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg) { @@ -437,6 +438,7 @@ int flexran_agent_reconfiguration(mid_t mod_id, const void *params, Protocol__Fl int flexran_agent_destroy_agent_reconfiguration(Protocol__FlexranMessage *msg) { /*TODO: Dealocate memory for a dynamically allocated agent reconfiguration message*/ + return 0; } @@ -474,7 +476,7 @@ int flexran_get_current_time_ms (mid_t mod_id, int subframe_flag){ unsigned int flexran_get_current_frame (mid_t mod_id) { - #warning "SFN will not be in [0-1023] when oaisim is used" + // #warning "SFN will not be in [0-1023] when oaisim is used" return ((eNB_MAC_INST *)enb[mod_id])->frame; } @@ -637,7 +639,6 @@ int flexran_get_active_CC(mid_t mod_id, mid_t ue_id) { int flexran_get_current_RI(mid_t mod_id, mid_t ue_id, int CC_id) { LTE_eNB_UE_stats *eNB_UE_stats = NULL; - int pCCid = UE_PCCID(mod_id,ue_id); rnti_t rnti = flexran_get_ue_crnti(mod_id,ue_id); eNB_UE_stats = mac_xface->get_eNB_UE_stats(mod_id,CC_id,rnti); @@ -679,7 +680,8 @@ int flexran_get_tpc(mid_t mod_id, mid_t ue_id) { return tpc; } -int flexran_get_harq(const mid_t mod_id, const uint8_t CC_id, const mid_t ue_id, const int frame, const uint8_t subframe, int *id, int *round) { //flag_id_status = 0 then id, else status +int flexran_get_harq(const mid_t mod_id, const uint8_t CC_id, const mid_t ue_id, const int frame, const uint8_t subframe, + unsigned char *id, unsigned char *round) { //flag_id_status = 0 then id, else status /*TODO: Add int TB in function parameters to get the status of the second TB. This can be done to by editing in * get_ue_active_harq_pid function in line 272 file: phy_procedures_lte_eNB.c to add * DLSCH_ptr = PHY_vars_eNB_g[Mod_id][CC_id]->dlsch_eNB[(uint32_t)UE_id][1];*/ @@ -701,7 +703,7 @@ int flexran_get_harq(const mid_t mod_id, const uint8_t CC_id, const mid_t ue_id, /* } */ /* return 0; */ - return round; + return *round; } int flexran_get_p0_pucch_dbm(mid_t mod_id, mid_t ue_id, int CC_id) { @@ -922,15 +924,11 @@ int flexran_get_special_subframe_assignment(mid_t mod_id, int CC_id) { } int flexran_get_ra_ResponseWindowSize(mid_t mod_id, int CC_id) { - Enb_properties_array_t *enb_properties; - enb_properties = enb_config_get(); - return enb_properties->properties[mod_id]->rach_raResponseWindowSize[CC_id]; + return enb_config_get()->properties[mod_id]->rach_raResponseWindowSize[CC_id]; } int flexran_get_mac_ContentionResolutionTimer(mid_t mod_id, int CC_id) { - Enb_properties_array_t *enb_properties; - enb_properties = enb_config_get(); - return enb_properties->properties[mod_id]->rach_macContentionResolutionTimer[CC_id]; + return enb_config_get()->properties[mod_id]->rach_macContentionResolutionTimer[CC_id]; } int flexran_get_duplex_mode(mid_t mod_id, int CC_id) { @@ -969,16 +967,19 @@ int flexran_get_num_pdcch_symb(mid_t mod_id, int CC_id) { int flexran_get_time_alignment_timer(mid_t mod_id, mid_t ue_id) { - struct rrc_eNB_ue_context_s* ue_context_p = NULL; - uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); - - ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); - if(ue_context_p != NULL) { - if(ue_context_p->ue_context.mac_MainConfig != NULL) - return ue_context_p->ue_context.mac_MainConfig->timeAlignmentTimerDedicated; - } - else - return -1; + struct rrc_eNB_ue_context_s* ue_context_p = NULL; + uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); + + ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); + if(ue_context_p != NULL) { + if(ue_context_p->ue_context.mac_MainConfig != NULL) { + return ue_context_p->ue_context.mac_MainConfig->timeAlignmentTimerDedicated; + } else { + return -1; + } + } else { + return -1; + } } int flexran_get_meas_gap_config(mid_t mod_id, mid_t ue_id) { @@ -1040,12 +1041,14 @@ int flexran_get_half_duplex(mid_t ue_id) { // halfduplex = 1; //} //return halfduplex; + return 0; } int flexran_get_intra_sf_hopping(mid_t ue_id) { //TODO:Get proper value //temp = (((UE_RRC_INST *)enb_ue_rrc[ue_id])->UECap->UE_EUTRA_Capability->featureGroupIndicators->buf); //return (0 & ( 1 << (31))); + return 0; } int flexran_get_type2_sb_1(mid_t ue_id) { @@ -1053,11 +1056,13 @@ int flexran_get_type2_sb_1(mid_t ue_id) { //uint8_t temp = 0; //temp = (((UE_RRC_INST *)enb_ue_rrc[ue_id])->UECap->UE_EUTRA_Capability->featureGroupIndicators->buf); //return (temp & ( 1 << (11))); + return 0; } int flexran_get_ue_category(mid_t ue_id) { //TODO:Get proper value //return (((UE_RRC_INST *)enb_ue_rrc[ue_id])->UECap->UE_EUTRA_Capability->ue_Category); + return 0; } int flexran_get_res_alloc_type1(mid_t ue_id) { @@ -1065,35 +1070,41 @@ int flexran_get_res_alloc_type1(mid_t ue_id) { //uint8_t temp = 0; //temp = (((UE_RRC_INST *)enb_ue_rrc[ue_id])->UECap->UE_EUTRA_Capability->featureGroupIndicators->buf); //return (temp & ( 1 << (30))); + return 0; } int flexran_get_ue_transmission_mode(mid_t mod_id, mid_t ue_id) { - struct rrc_eNB_ue_context_s* ue_context_p = NULL; - uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); - - ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); - - if(ue_context_p != NULL) { - if(ue_context_p->ue_context.physicalConfigDedicated != NULL){ - return ue_context_p->ue_context.physicalConfigDedicated->antennaInfo->choice.explicitValue.transmissionMode; - } - } - else - return -1; + struct rrc_eNB_ue_context_s* ue_context_p = NULL; + uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); + + ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); + + if(ue_context_p != NULL) { + if(ue_context_p->ue_context.physicalConfigDedicated != NULL){ + return ue_context_p->ue_context.physicalConfigDedicated->antennaInfo->choice.explicitValue.transmissionMode; + } else { + return -1; + } + } else { + return -1; + } } int flexran_get_tti_bundling(mid_t mod_id, mid_t ue_id) { - struct rrc_eNB_ue_context_s* ue_context_p = NULL; - uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); - - ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); - if(ue_context_p != NULL) { - if(ue_context_p->ue_context.mac_MainConfig != NULL){ - return ue_context_p->ue_context.mac_MainConfig->ul_SCH_Config->ttiBundling; - } - } - else - return -1; + struct rrc_eNB_ue_context_s* ue_context_p = NULL; + uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); + + ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); + if(ue_context_p != NULL) { + if(ue_context_p->ue_context.mac_MainConfig != NULL){ + return ue_context_p->ue_context.mac_MainConfig->ul_SCH_Config->ttiBundling; + } else { + return -1; + } + } + else { + return -1; + } } int flexran_get_maxHARQ_TX(mid_t mod_id, mid_t ue_id) { @@ -1110,45 +1121,52 @@ int flexran_get_maxHARQ_TX(mid_t mod_id, mid_t ue_id) { } int flexran_get_beta_offset_ack_index(mid_t mod_id, mid_t ue_id) { - struct rrc_eNB_ue_context_s* ue_context_p = NULL; - uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); - - ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); - if(ue_context_p != NULL) { - if(ue_context_p->ue_context.physicalConfigDedicated != NULL){ - return ue_context_p->ue_context.physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_ACK_Index; - } - } - else - return -1; + struct rrc_eNB_ue_context_s* ue_context_p = NULL; + uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); + + ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); + if(ue_context_p != NULL) { + if(ue_context_p->ue_context.physicalConfigDedicated != NULL){ + return ue_context_p->ue_context.physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_ACK_Index; + } else { + return -1; + } + } else { + return -1; + } } int flexran_get_beta_offset_ri_index(mid_t mod_id, mid_t ue_id) { - struct rrc_eNB_ue_context_s* ue_context_p = NULL; - uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); - - ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); - if(ue_context_p != NULL) { - if(ue_context_p->ue_context.physicalConfigDedicated != NULL){ - return ue_context_p->ue_context.physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_RI_Index; - } - } - else - return -1; + struct rrc_eNB_ue_context_s* ue_context_p = NULL; + uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); + + ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); + if(ue_context_p != NULL) { + if(ue_context_p->ue_context.physicalConfigDedicated != NULL){ + return ue_context_p->ue_context.physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_RI_Index; + } else { + return -1; + } + } else { + return -1; + } } int flexran_get_beta_offset_cqi_index(mid_t mod_id, mid_t ue_id) { - struct rrc_eNB_ue_context_s* ue_context_p = NULL; - uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); - - ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); - if(ue_context_p != NULL) { - if(ue_context_p->ue_context.physicalConfigDedicated != NULL){ - return ue_context_p->ue_context.physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_CQI_Index; - } - } - else - return -1; + struct rrc_eNB_ue_context_s* ue_context_p = NULL; + uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); + + ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); + if(ue_context_p != NULL) { + if(ue_context_p->ue_context.physicalConfigDedicated != NULL){ + return ue_context_p->ue_context.physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_CQI_Index; + } else { + return -1; + } + } + else { + return -1; + } } int flexran_get_simultaneous_ack_nack_cqi(mid_t mod_id, mid_t ue_id) { @@ -1185,32 +1203,39 @@ int flexran_get_aperiodic_cqi_rep_mode(mid_t mod_id,mid_t ue_id) { } int flexran_get_tdd_ack_nack_feedback(mid_t mod_id, mid_t ue_id) { - struct rrc_eNB_ue_context_s* ue_context_p = NULL; - uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); - - ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); + // TODO: This needs fixing + return -1; - if(ue_context_p != NULL) { - if(ue_context_p->ue_context.physicalConfigDedicated != NULL){ - return ue_context_p->ue_context.physicalConfigDedicated->pucch_ConfigDedicated->tdd_AckNackFeedbackMode; - } - } - else - return -1; + /* struct rrc_eNB_ue_context_s* ue_context_p = NULL; */ + /* uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); */ + + /* ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); */ + + /* if(ue_context_p != NULL) { */ + /* if(ue_context_p->ue_context.physicalConfigDedicated != NULL){ */ + /* return ue_context_p->ue_context.physicalConfigDedicated->pucch_ConfigDedicated->tdd_AckNackFeedbackMode; */ + /* } else { */ + /* return -1; */ + /* } */ + /* } else { */ + /* return -1; */ + /* } */ } int flexran_get_ack_nack_repetition_factor(mid_t mod_id, mid_t ue_id) { - struct rrc_eNB_ue_context_s* ue_context_p = NULL; - uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); - - ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); - if(ue_context_p != NULL) { - if(ue_context_p->ue_context.physicalConfigDedicated != NULL){ - return ue_context_p->ue_context.physicalConfigDedicated->pucch_ConfigDedicated->ackNackRepetition.choice.setup.repetitionFactor; - } - } - else - return -1; + struct rrc_eNB_ue_context_s* ue_context_p = NULL; + uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); + + ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); + if(ue_context_p != NULL) { + if(ue_context_p->ue_context.physicalConfigDedicated != NULL){ + return ue_context_p->ue_context.physicalConfigDedicated->pucch_ConfigDedicated->ackNackRepetition.choice.setup.repetitionFactor; + } else { + return -1; + } + } else { + return -1; + } } int flexran_get_extended_bsr_size(mid_t mod_id, mid_t ue_id) { @@ -1233,23 +1258,26 @@ int flexran_get_extended_bsr_size(mid_t mod_id, mid_t ue_id) { } int flexran_get_ue_transmission_antenna(mid_t mod_id, mid_t ue_id) { - struct rrc_eNB_ue_context_s* ue_context_p = NULL; - uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); - - ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); - - if(ue_context_p != NULL) { - if(ue_context_p->ue_context.physicalConfigDedicated != NULL){ - if(ue_context_p->ue_context.physicalConfigDedicated->antennaInfo->choice.explicitValue.ue_TransmitAntennaSelection.choice.setup == AntennaInfoDedicated__ue_TransmitAntennaSelection__setup_closedLoop) - return 2; - else if(ue_context_p->ue_context.physicalConfigDedicated->antennaInfo->choice.explicitValue.ue_TransmitAntennaSelection.choice.setup == AntennaInfoDedicated__ue_TransmitAntennaSelection__setup_openLoop) - return 1; - else - return 0; - } - } - else - return -1; + struct rrc_eNB_ue_context_s* ue_context_p = NULL; + uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); + + ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); + + if(ue_context_p != NULL) { + if(ue_context_p->ue_context.physicalConfigDedicated != NULL){ + if(ue_context_p->ue_context.physicalConfigDedicated->antennaInfo->choice.explicitValue.ue_TransmitAntennaSelection.choice.setup == AntennaInfoDedicated__ue_TransmitAntennaSelection__setup_closedLoop) { + return 2; + } else if(ue_context_p->ue_context.physicalConfigDedicated->antennaInfo->choice.explicitValue.ue_TransmitAntennaSelection.choice.setup == AntennaInfoDedicated__ue_TransmitAntennaSelection__setup_openLoop) { + return 1; + } else { + return 0; + } + } else { + return -1; + } + } else { + return -1; + } } int flexran_get_lcg(mid_t ue_id, mid_t lc_id) { @@ -1265,10 +1293,13 @@ int flexran_get_lcg(mid_t ue_id, mid_t lc_id) { int flexran_get_direction(mid_t ue_id, mid_t lc_id) { /*TODO: fill with the value for the rest of LCID*/ - if(lc_id == DCCH | lc_id == DCCH1) + if(lc_id == DCCH || lc_id == DCCH1) { return 2; - else if(lc_id == DTCH) + } else if(lc_id == DTCH) { return 1; + } else { + return -1; + } } int flexran_agent_ue_state_change(mid_t mod_id, uint32_t rnti, uint8_t state_change) { @@ -1276,8 +1307,7 @@ int flexran_agent_ue_state_change(mid_t mod_id, uint32_t rnti, uint8_t state_cha Protocol__FlexranMessage *msg; Protocol__FlexHeader *header; void *data; - int priority; - err_code_t err_code; + int priority = 0; int xid = 0; @@ -1461,14 +1491,14 @@ int flexran_agent_ue_state_change(mid_t mod_id, uint32_t rnti, uint8_t state_cha data = flexran_agent_pack_message(msg, &size); /*Send sr info using the MAC channel of the eNB*/ if (flexran_agent_msg_send(mod_id, FLEXRAN_AGENT_DEFAULT, data, size, priority)) { - err_code = PROTOCOL__FLEXRAN_ERR__MSG_ENQUEUING; goto error; } LOG_D(FLEXRAN_AGENT,"sent message with size %d\n", size); - return; + return 0; error: LOG_D(FLEXRAN_AGENT, "Could not send UE state message\n"); + return -1; } @@ -1481,15 +1511,17 @@ int flexran_agent_lc_config_reply(mid_t mod_id, const void *params, Protocol__Fl xid = (lc_config_request_msg->header)->xid; int i, j; - Protocol__FlexHeader *header; - if(flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_GET_LC_CONFIG_REPLY, &header) != 0) - goto error; Protocol__FlexLcConfigReply *lc_config_reply_msg; lc_config_reply_msg = malloc(sizeof(Protocol__FlexLcConfigReply)); if(lc_config_reply_msg == NULL) goto error; protocol__flex_lc_config_reply__init(lc_config_reply_msg); + + Protocol__FlexHeader *header; + if(flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_GET_LC_CONFIG_REPLY, &header) != 0) + goto error; + lc_config_reply_msg->header = header; lc_config_reply_msg->n_lc_ue_config = flexran_get_num_ues(mod_id); @@ -1606,15 +1638,16 @@ int flexran_agent_ue_config_reply(mid_t mod_id, const void *params, Protocol__Fl int i; - Protocol__FlexHeader *header; - if(flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_GET_UE_CONFIG_REPLY, &header) != 0) - goto error; - Protocol__FlexUeConfigReply *ue_config_reply_msg; ue_config_reply_msg = malloc(sizeof(Protocol__FlexUeConfigReply)); if(ue_config_reply_msg == NULL) goto error; protocol__flex_ue_config_reply__init(ue_config_reply_msg); + + Protocol__FlexHeader *header; + if(flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_GET_UE_CONFIG_REPLY, &header) != 0) + goto error; + ue_config_reply_msg->header = header; ue_config_reply_msg->n_ue_config = flexran_get_num_ues(mod_id); @@ -1805,16 +1838,16 @@ int flexran_agent_enb_config_request(mid_t mod_id, const void* params, Protocol_ Protocol__FlexHeader *header; xid_t xid = 1; - if(flexran_create_header(xid,PROTOCOL__FLEX_TYPE__FLPT_GET_ENB_CONFIG_REQUEST, &header) != 0) - goto error; Protocol__FlexEnbConfigRequest *enb_config_request_msg; enb_config_request_msg = malloc(sizeof(Protocol__FlexEnbConfigRequest)); - if(enb_config_request_msg == NULL) goto error; - protocol__flex_enb_config_request__init(enb_config_request_msg); + + if(flexran_create_header(xid,PROTOCOL__FLEX_TYPE__FLPT_GET_ENB_CONFIG_REQUEST, &header) != 0) + goto error; + enb_config_request_msg->header = header; *msg = malloc(sizeof(Protocol__FlexranMessage)); @@ -1846,19 +1879,19 @@ int flexran_agent_enb_config_reply(mid_t mod_id, const void *params, Protocol__F Protocol__FlexEnbConfigRequest *enb_config_req_msg = input->enb_config_request_msg; xid = (enb_config_req_msg->header)->xid; - int i, j, k; - int cc_id = 0; + int i, j; int enb_id = mod_id; - Protocol__FlexHeader *header; - if(flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_GET_ENB_CONFIG_REPLY, &header) != 0) - goto error; - - Protocol__FlexEnbConfigReply *enb_config_reply_msg; + Protocol__FlexEnbConfigReply *enb_config_reply_msg; enb_config_reply_msg = malloc(sizeof(Protocol__FlexEnbConfigReply)); if(enb_config_reply_msg == NULL) goto error; protocol__flex_enb_config_reply__init(enb_config_reply_msg); + + Protocol__FlexHeader *header; + if(flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_GET_ENB_CONFIG_REPLY, &header) != 0) + goto error; + enb_config_reply_msg->header = header; enb_config_reply_msg->enb_id = mod_id; diff --git a/openair2/ENB_APP/flexran_agent_common.h b/openair2/ENB_APP/flexran_agent_common.h index 56a52cd0b674480425fbace461cd23a838780615..a4ee53067cd2731d30337c42a58e50a7c39dbee3 100644 --- a/openair2/ENB_APP/flexran_agent_common.h +++ b/openair2/ENB_APP/flexran_agent_common.h @@ -72,7 +72,7 @@ int flexran_agent_deserialize_message(void *data, int size, Protocol__FlexranMes /* Serialize message and then destroy the input flexran msg. Should be called when protocol message is created dynamically */ void * flexran_agent_pack_message(Protocol__FlexranMessage *msg, - uint32_t * size); + int * size); /* Calls destructor of the given message */ err_code_t flexran_agent_destroy_flexran_message(Protocol__FlexranMessage *msg); @@ -271,7 +271,7 @@ int flexran_get_tpc(mid_t mod_id, mid_t ue_id); a designated frame and subframe. Returns 0 for success. The id and the status of the HARQ process are stored in id and status respectively */ int flexran_get_harq(const mid_t mod_id, const uint8_t CC_id, const mid_t ue_id, - const int frame, const uint8_t subframe, int *id, int *round); + const int frame, const uint8_t subframe, unsigned char *id, unsigned char *round); /* Uplink power control management*/ int flexran_get_p0_pucch_dbm(mid_t mod_id, mid_t ue_id, int CC_id); diff --git a/openair2/ENB_APP/flexran_agent_common_internal.c b/openair2/ENB_APP/flexran_agent_common_internal.c index 3026190863e4cd32469b84d03f8c3874b52d2b6a..e735b2748b955c98c4666fe68828360229d1fc89 100644 --- a/openair2/ENB_APP/flexran_agent_common_internal.c +++ b/openair2/ENB_APP/flexran_agent_common_internal.c @@ -38,13 +38,12 @@ int apply_reconfiguration_policy(mid_t mod_id, const char *policy, size_t policy yaml_event_t event; int done = 0; - int mapping_started = 0; LOG_I(ENB_APP, "Time to apply a new policy \n"); yaml_parser_initialize(&parser); - yaml_parser_set_input_string(&parser, policy, strlen(policy)); + yaml_parser_set_input_string(&parser, (unsigned char *) policy, strlen(policy)); while (!done) { if (!yaml_parser_parse(&parser, &event)) @@ -52,39 +51,40 @@ int apply_reconfiguration_policy(mid_t mod_id, const char *policy, size_t policy switch (event.type) { case YAML_STREAM_START_EVENT: + break; case YAML_STREAM_END_EVENT: + break; case YAML_DOCUMENT_START_EVENT: + break; case YAML_DOCUMENT_END_EVENT: break; case YAML_MAPPING_START_EVENT: - mapping_started = 1; break; case YAML_MAPPING_END_EVENT: - mapping_started = 0; break; case YAML_SCALAR_EVENT: // Check the system name and call the proper handler - if (strcmp(event.data.scalar.value, "mac") == 0) { + if (strcmp((char *) event.data.scalar.value, "mac") == 0) { LOG_D(ENB_APP, "This is intended for the mac system\n"); // Call the mac handler if (parse_mac_config(mod_id, &parser) == -1) { goto error; } - } else if (strcmp(event.data.scalar.value, "rlc") == 0) { + } else if (strcmp((char *) event.data.scalar.value, "rlc") == 0) { // Call the RLC handler LOG_D(ENB_APP, "This is intended for the rlc system\n"); // TODO : Just skip it for now if (skip_system_section(&parser) == -1) { goto error; } - } else if (strcmp(event.data.scalar.value, "pdcp") == 0) { + } else if (strcmp((char *) event.data.scalar.value, "pdcp") == 0) { // Call the PDCP handler LOG_D(ENB_APP, "This is intended for the pdcp system\n"); // TODO : Just skip it for now if (skip_system_section(&parser) == -1) { goto error; } - } else if (strcmp(event.data.scalar.value, "rrc") == 0) { + } else if (strcmp((char *) event.data.scalar.value, "rrc") == 0) { // Call the RRC handler LOG_D(ENB_APP, "This is intended for the rrc system\n"); // TODO : Just skip it for now @@ -159,8 +159,9 @@ int skip_system_section(yaml_parser_t *parser) { if (skip_subsystem_section(parser) == -1) { goto error; } + default: + break; } - done = (event.type == YAML_SEQUENCE_END_EVENT); yaml_event_delete(&event); @@ -199,7 +200,7 @@ int skip_subsystem_section(yaml_parser_t *parser) { goto error; } // Check what key needs to be set - if (strcmp(event.data.scalar.value, "behavior") == 0) { + if (strcmp((char *) event.data.scalar.value, "behavior") == 0) { LOG_D(ENB_APP, "Skipping the behavior attribute\n"); yaml_event_delete(&event); if (!yaml_parser_parse(parser, &event)) { @@ -210,7 +211,7 @@ int skip_subsystem_section(yaml_parser_t *parser) { } else { goto error; } - } else if (strcmp(event.data.scalar.value, "parameters") == 0) { + } else if (strcmp((char *) event.data.scalar.value, "parameters") == 0) { LOG_D(ENB_APP, "Skipping the parameters for this subsystem\n"); if (skip_subsystem_parameters_config(parser) == -1) { goto error; @@ -235,8 +236,6 @@ int skip_subsystem_section(yaml_parser_t *parser) { int skip_subsystem_parameters_config(yaml_parser_t *parser) { yaml_event_t event; - void *param; - int done = 0; int mapping_started = 0; @@ -299,10 +298,10 @@ int skip_parameter_modification(yaml_parser_t *parser) { is_array = 1; break; case YAML_SCALAR_EVENT: - if ((strcmp(event.data.scalar.tag, YAML_INT_TAG) == 0) || - (strcmp(event.data.scalar.tag, YAML_FLOAT_TAG) == 0) || - (strcmp(event.data.scalar.tag, YAML_STR_TAG) == 0) || - (strcmp(event.data.scalar.tag, YAML_BOOL_TAG) == 0)) { + if ((strcmp((char *) event.data.scalar.tag, YAML_INT_TAG) == 0) || + (strcmp((char *) event.data.scalar.tag, YAML_FLOAT_TAG) == 0) || + (strcmp((char *) event.data.scalar.tag, YAML_STR_TAG) == 0) || + (strcmp((char *) event.data.scalar.tag, YAML_BOOL_TAG) == 0)) { // Do nothing } else { // No other type is supported at the moment, so it should be considered an error @@ -351,14 +350,14 @@ int apply_parameter_modification(void *parameter, yaml_parser_t *parser) { is_array = 1; break; case YAML_SCALAR_EVENT: - if (strcmp(event.data.scalar.tag, YAML_INT_TAG) == 0) { - ((int *) parameter)[i] = strtol(event.data.scalar.value, &endptr, 10); - } else if (strcmp(event.data.scalar.tag, YAML_FLOAT_TAG) == 0) { - ((float *) parameter)[i] = strtof(event.data.scalar.value, &endptr); - } else if (strcmp(event.data.scalar.tag, YAML_STR_TAG) == 0) { - strncpy(&((char *) parameter)[i], event.data.scalar.value, event.data.scalar.length); - } else if (strcmp(event.data.scalar.tag, YAML_BOOL_TAG) == 0) { - if (strcmp(event.data.scalar.value, "true") == 0) { + if (strcmp((char *) event.data.scalar.tag, YAML_INT_TAG) == 0) { + ((int *) parameter)[i] = strtol((char *) event.data.scalar.value, &endptr, 10); + } else if (strcmp((char *) event.data.scalar.tag, YAML_FLOAT_TAG) == 0) { + ((float *) parameter)[i] = strtof((char *) event.data.scalar.value, &endptr); + } else if (strcmp((char *) event.data.scalar.tag, YAML_STR_TAG) == 0) { + strncpy(&((char *) parameter)[i], (char *) event.data.scalar.value, event.data.scalar.length); + } else if (strcmp((char *) event.data.scalar.tag, YAML_BOOL_TAG) == 0) { + if (strcmp((char *) event.data.scalar.value, "true") == 0) { ((int *) parameter)[i] = 1; } else { ((int *) parameter)[i] = 0; diff --git a/openair2/ENB_APP/flexran_agent_handler.c b/openair2/ENB_APP/flexran_agent_handler.c index 4967e4692334d0b8fe86a379be929c99e854f5ac..4326ab6be03241df516c82d6f2f27129f2a2599a 100644 --- a/openair2/ENB_APP/flexran_agent_handler.c +++ b/openair2/ENB_APP/flexran_agent_handler.c @@ -73,12 +73,12 @@ flexran_agent_message_destruction_callback message_destruction_callback[] = { flexran_agent_destroy_agent_reconfiguration, }; -static const char *flexran_agent_direction2String[] = { - "", /* not_set */ - "originating message", /* originating message */ - "successfull outcome", /* successfull outcome */ - "unsuccessfull outcome", /* unsuccessfull outcome */ -}; +/* static const char *flexran_agent_direction2String[] = { */ +/* "", /\* not_set *\/ */ +/* "originating message", /\* originating message *\/ */ +/* "successfull outcome", /\* successfull outcome *\/ */ +/* "unsuccessfull outcome", /\* unsuccessfull outcome *\/ */ +/* }; */ Protocol__FlexranMessage* flexran_agent_handle_message (mid_t mod_id, @@ -123,7 +123,7 @@ error: void * flexran_agent_pack_message(Protocol__FlexranMessage *msg, - uint32_t * size){ + int * size){ void * buffer; err_code_t err_code = PROTOCOL__FLEXRAN_ERR__NO_ERR; @@ -181,7 +181,7 @@ Protocol__FlexranMessage* flexran_agent_process_timeout(long timer_id, void* tim error: LOG_E(FLEXRAN_AGENT, "can't get the timer element\n"); - return TIMER_ELEMENT_NOT_FOUND; + return NULL; } err_code_t flexran_agent_destroy_flexran_message(Protocol__FlexranMessage *msg) { diff --git a/openair2/LAYER2/MAC/config.c b/openair2/LAYER2/MAC/config.c index e4252ed50049afbc0f19362697f10e11956fe301..b5d613e4ae4d8e392602a64d4a03cd8752d2e990 100644 --- a/openair2/LAYER2/MAC/config.c +++ b/openair2/LAYER2/MAC/config.c @@ -183,22 +183,26 @@ rrc_mac_config_req( logicalChannelConfig->ul_SpecificParameters->bucketSizeDuration; // set the max bucket size if (logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup != NULL) { UE_mac_inst[Mod_idP].scheduling_info.LCGID[logicalChannelIdentity]=*logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup; - LOG_D(MAC,"[CONFIG][UE %d] LCID %d is attached to the LCGID %d\n",Mod_idP,logicalChannelIdentity,*logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup); + LOG_D(MAC,"[CONFIG][UE %d] LCID %ld is attached to the LCGID %ld\n",Mod_idP,logicalChannelIdentity,*logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup); } else { UE_mac_inst[Mod_idP].scheduling_info.LCGID[logicalChannelIdentity] = MAX_NUM_LCGID; } UE_mac_inst[Mod_idP].scheduling_info.LCID_buffer_remain[logicalChannelIdentity] = 0; } else { - LOG_E(MAC,"[CONFIG][UE %d] LCID %d NULL ul_SpecificParameters\n",Mod_idP,logicalChannelIdentity); + LOG_E(MAC,"[CONFIG][UE %d] LCID %ld NULL ul_SpecificParameters\n",Mod_idP,logicalChannelIdentity); mac_xface->macphy_exit("NULL ul_SpecificParameters"); } } else { - if (logicalChannelConfig) - UE_list->UE_template[CC_idP][UE_id].lcgidmap[logicalChannelIdentity] = *logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup; - else - UE_list->UE_template[CC_idP][UE_id].lcgidmap[logicalChannelIdentity] = 0; + if (UE_id == -1) { + LOG_E(MAC,"%s:%d:%s: ERROR, UE_id == -1\n", __FILE__, __LINE__, __FUNCTION__); + } else { + if (logicalChannelConfig) + UE_list->UE_template[CC_idP][UE_id].lcgidmap[logicalChannelIdentity] = *logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup; + else + UE_list->UE_template[CC_idP][UE_id].lcgidmap[logicalChannelIdentity] = 0; + } } } @@ -296,7 +300,10 @@ rrc_mac_config_req( if (physicalConfigDedicated != NULL) { if (eNB_flagP==1) { - mac_xface->phy_config_dedicated_eNB(Mod_idP, CC_idP, UE_RNTI(Mod_idP, UE_id), physicalConfigDedicated); + if (UE_id == -1) + LOG_E(MAC,"%s:%d:%s: ERROR, UE_id == -1\n", __FILE__, __LINE__, __FUNCTION__); + else + mac_xface->phy_config_dedicated_eNB(Mod_idP, CC_idP, UE_RNTI(Mod_idP, UE_id), physicalConfigDedicated); } else { mac_xface->phy_config_dedicated_ue(Mod_idP,0,eNB_index,physicalConfigDedicated); UE_mac_inst[Mod_idP].physicalConfigDedicated=physicalConfigDedicated; // for SR proc @@ -308,7 +315,10 @@ rrc_mac_config_req( if (sCellToAddMod_r10 != NULL) { if (eNB_flagP==1) { - mac_xface->phy_config_dedicated_scell_eNB(Mod_idP,UE_RNTI(Mod_idP,UE_id),sCellToAddMod_r10,1); + if (UE_id == -1) + LOG_E(MAC,"%s:%d:%s: ERROR, UE_id == -1\n", __FILE__, __LINE__, __FUNCTION__); + else + mac_xface->phy_config_dedicated_scell_eNB(Mod_idP,UE_RNTI(Mod_idP,UE_id),sCellToAddMod_r10,1); } else { //#warning "phy_config_dedicated_scell_ue is empty" diff --git a/openair2/LAYER2/MAC/defs.h b/openair2/LAYER2/MAC/defs.h index 67742de4acde0c38c15b12034ae3bc6df83c203c..3c0223e59e831476c2fe66db0d22371ecae95b85 100644 --- a/openair2/LAYER2/MAC/defs.h +++ b/openair2/LAYER2/MAC/defs.h @@ -149,6 +149,9 @@ /*!\brief minimum MAC data needed for transmitting 1 min RLC PDU size + 1 byte MAC subHeader */ #define MIN_MAC_HDR_RLC_SIZE (1 + MIN_RLC_PDU_SIZE) +/*!\brief maximum number of slices / groups */ +#define MAX_NUM_SLICES 4 + /* * eNB part */ diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c index 47971debda2767910e2091ccad049dde35a0ff49..dee7c51a6e514178f1521d8c7484fa7ddad7e395 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler.c +++ b/openair2/LAYER2/MAC/eNB_scheduler.c @@ -99,7 +99,7 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, int result; #endif DCI_PDU *DCI_pdu[MAX_NUM_CCs]; - int CC_id,i,next_i; + int CC_id,i; //,next_i; UE_list_t *UE_list=&eNB_mac_inst[module_idP].UE_list; rnti_t rnti; void *DLSCH_dci=NULL; @@ -123,17 +123,27 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, memset(eNB_mac_inst[module_idP].common_channels[CC_id].vrb_map,0,100); } + // clear DCI and BCCH contents before scheduling + for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { + DCI_pdu[CC_id]->Num_common_dci = 0; + DCI_pdu[CC_id]->Num_ue_spec_dci = 0; +#ifdef Rel10 + eNB_mac_inst[module_idP].common_channels[CC_id].mcch_active =0; +#endif + eNB_mac_inst[module_idP].frame = frameP; + eNB_mac_inst[module_idP].subframe = subframeP; + } + // refresh UE list based on UEs dropped by PHY in previous subframe - i = UE_list->head; + for (i = 0; i < NUMBER_OF_UE_MAX; i++) { + if (UE_list->active[i] != TRUE) continue; - while (i>=0) { rnti = UE_RNTI(module_idP, i); CC_id = UE_PCCID(module_idP, i); if ((frameP==0)&&(subframeP==0)) - LOG_I(MAC,"UE rnti %x : %s\n", rnti, - UE_list->UE_sched_ctrl[i].ul_out_of_sync==0 ? "in synch" : "out of sync"); - - next_i= UE_list->next[i]; + LOG_I(MAC,"UE rnti %x : %s, PHR %d dB\n", rnti, + UE_list->UE_sched_ctrl[i].ul_out_of_sync==0 ? "in synch" : "out of sync", + UE_list->UE_template[CC_id][i].phr_info); PHY_vars_eNB_g[module_idP][CC_id]->pusch_stats_bsr[i][(frameP*10)+subframeP]=-63; if (i==UE_list->head) @@ -255,15 +265,13 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, // check threshold if (UE_list->UE_sched_ctrl[i].ul_failure_timer > 200) { // inform RRC of failure and clear timer - LOG_I(MAC,"UE %d rnti %x: UL Failure after repeated PDCCH orders: Triggering RRC \n",i,rnti,UE_list->UE_sched_ctrl[i].ul_failure_timer); + LOG_I(MAC,"UE %d rnti %x: UL Failure after repeated PDCCH orders: Triggering RRC \n",i,rnti); mac_eNB_rrc_ul_failure(module_idP,CC_id,frameP,subframeP,rnti); UE_list->UE_sched_ctrl[i].ul_failure_timer=0; UE_list->UE_sched_ctrl[i].ul_out_of_sync=1; } } } // ul_failure_timer>0 - - i = next_i; } #if defined(ENABLE_ITTI) @@ -320,22 +328,6 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, #endif - // clear DCI and BCCH contents before scheduling - for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { - DCI_pdu[CC_id]->Num_common_dci = 0; - DCI_pdu[CC_id]->Num_ue_spec_dci = 0; - - -#ifdef Rel10 - eNB_mac_inst[module_idP].common_channels[CC_id].mcch_active =0; -#endif - - eNB_mac_inst[module_idP].frame = frameP; - eNB_mac_inst[module_idP].subframe = subframeP; - - - } - /* #ifndef DISABLE_SF_TRIGGER */ /* //Send subframe trigger to the controller */ /* if (mac_agent_registered[module_idP]) { */ diff --git a/openair2/LAYER2/MAC/eNB_scheduler_RA.c b/openair2/LAYER2/MAC/eNB_scheduler_RA.c index e24281b89aeb985a17310d33cb805df5fd20cb18..991f8bfbfa55061de2eab1fdf2216bbc20fe4cbd 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_RA.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_RA.c @@ -73,7 +73,7 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un unsigned char i,harq_pid,round; int16_t rrc_sdu_length; unsigned char lcid,offset; - module_id_t UE_id= UE_INDEX_INVALID; + int UE_id = -1; unsigned short TBsize = -1; unsigned short msg4_padding,msg4_post_padding,msg4_header; uint8_t *vrb_map; @@ -266,6 +266,7 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un // check for Msg4 Message UE_id = find_UE_id(module_idP,RA_template->rnti); + if (UE_id == -1) { printf("%s:%d:%s: FATAL ERROR\n", __FILE__, __LINE__, __FUNCTION__); abort(); } if (Is_rrc_registered == 1) { @@ -709,7 +710,10 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un RA_template->RA_dci_size_bits2, RA_template->RA_dci_fmt2, 0); +printf("MAC: msg4 retransmission for rnti %x (round %d) fsf %d/%d\n", RA_template->rnti, round, frameP, subframeP); } +else +printf("MAC: msg4 retransmission for rnti %x (round %d) fsf %d/%d CCE allocation failed!\n", RA_template->rnti, round, frameP, subframeP); LOG_W(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d: Msg4 not acknowledged, adding ue specific dci (rnti %x) for RA (Msg4 Retransmission)\n", module_idP,CC_id,frameP,subframeP,RA_template->rnti); } else { @@ -718,6 +722,7 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un remove UE instance across all the layers: mac_xface->cancel_RA(); } */ +printf("MAC: msg4 acknowledged for rnti %x fsf %d/%d, let's configure it\n", RA_template->rnti, frameP, subframeP); LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d : Msg4 acknowledged\n",module_idP,CC_id,frameP,subframeP); RA_template->wait_ack_Msg4=0; RA_template->RA_active=FALSE; @@ -746,14 +751,26 @@ void initiate_ra_proc(module_id_t module_idP, int CC_id,frame_t frameP, uint16_t VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_INITIATE_RA_PROC,0); for (i=0; i<NB_RA_PROC_MAX; i++) { - if (RA_template[i].RA_active==FALSE) { + if (RA_template[i].RA_active==FALSE && + RA_template[i].wait_ack_Msg4 == 0) { + int loop = 0; RA_template[i].RA_active=TRUE; RA_template[i].generate_rar=1; RA_template[i].generate_Msg4=0; RA_template[i].wait_ack_Msg4=0; RA_template[i].timing_offset=timing_offset; - // Put in random rnti (to be replaced with proper procedure!!) - RA_template[i].rnti = taus(); + /* TODO: find better procedure to allocate RNTI */ + do { + RA_template[i].rnti = taus(); + loop++; + } while (loop != 100 && + /* TODO: this is not correct, the rnti may be in use without + * being in the MAC yet. To be refined. + */ + !(find_UE_id(module_idP, RA_template[i].rnti) == -1 && + /* 1024 and 60000 arbirarily chosen, not coming from standard */ + RA_template[i].rnti >= 1024 && RA_template[i].rnti < 60000)); + if (loop == 100) { printf("%s:%d:%s: FATAL ERROR! contact the authors\n", __FILE__, __LINE__, __FUNCTION__); abort(); } RA_template[i].RA_rnti = 1+subframeP+(10*f_id); RA_template[i].preamble_index = preamble_index; LOG_D(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d Activating RAR generation for process %d, rnti %x, RA_active %d\n", @@ -763,6 +780,8 @@ void initiate_ra_proc(module_id_t module_idP, int CC_id,frame_t frameP, uint16_t return; } } + + LOG_E(MAC,"[eNB %d][RAPROC] FAILURE: CC_id %d Frame %d Initiating RA procedure for preamble index %d\n",module_idP,CC_id,frameP,preamble_index); } void cancel_ra_proc(module_id_t module_idP, int CC_id, frame_t frameP, rnti_t rnti) diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c index 33b9aea97982f5886725d6da964fc440679ef191..41a136d6b1eb2f86e95194a2832b88adaf69c086 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c @@ -442,7 +442,7 @@ schedule_ue_spec( // unsigned char rballoc_sub_UE[MAX_NUM_CCs][NUMBER_OF_UE_MAX][N_RBG_MAX]; // uint16_t pre_nb_available_rbs[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; int mcs; - uint16_t min_rb_unit[MAX_NUM_CCs]; + int min_rb_unit[MAX_NUM_CCs]; eNB_MAC_INST *eNB = &eNB_mac_inst[module_idP]; UE_list_t *UE_list = &eNB->UE_list; LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]; @@ -453,9 +453,11 @@ schedule_ue_spec( UE_sched_ctrl *ue_sched_ctl; int i; +#if 0 if (UE_list->head==-1) { return; } +#endif start_meas(&eNB->schedule_dlsch); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SCHEDULE_DLSCH,VCD_FUNCTION_IN); @@ -519,9 +521,23 @@ schedule_ue_spec( continue_flag=1; } - aggregation = get_aggregation(get_bw_index(module_idP,CC_id), - eNB_UE_stats->DL_cqi[0], - format1); + switch(mac_xface->get_transmission_mode(module_idP,CC_id,rnti)){ + case 1: + case 2: + case 7: + aggregation = get_aggregation(get_bw_index(module_idP,CC_id), + eNB_UE_stats->DL_cqi[0], + format1); + break; + case 3: + aggregation = get_aggregation(get_bw_index(module_idP,CC_id), + eNB_UE_stats->DL_cqi[0], + format2A); + break; + default: + LOG_W(MAC,"Unsupported transmission mode %d\n", mac_xface->get_transmission_mode(module_idP,CC_id,rnti)); + aggregation = 2; + } if ((ue_sched_ctl->pre_nb_available_rbs[CC_id] == 0) || // no RBs allocated CCE_allocation_infeasible(module_idP,CC_id,0,subframeP,aggregation,rnti) @@ -1653,7 +1669,10 @@ fill_DLSCH_dci( break; case 3: - LOG_D(MAC,"[eNB %d] CC_id %d Adding Format 2A UE %d spec DCI for %d PRBS (rb alloc: %x) \n", + /* TODO: fix log, what is 'rb alloc'? */ + /*LOG_D(MAC,"[eNB %d] CC_id %d Adding Format 2A UE %d spec DCI for %d PRBS (rb alloc: %x) \n", + module_idP, CC_id, UE_id, nb_rb);*/ + LOG_D(MAC,"[eNB %d] CC_id %d Adding Format 2A UE %d spec DCI for %d PRBS\n", module_idP, CC_id, UE_id, nb_rb); if (PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.frame_type == TDD) { diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c index 92868c1b98db08cc67a79fd28edf1bd03db4285e..da9e8572baf6c01b5e666754f81c448ce41db7cd 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c @@ -107,18 +107,17 @@ DCI_PDU *get_dci_sdu(module_id_t module_idP, int CC_id,frame_t frameP, sub_frame int find_UE_id(module_id_t mod_idP, rnti_t rntiP) //------------------------------------------------------------------------------ { - int UE_id; UE_list_t *UE_list = &eNB_mac_inst[mod_idP].UE_list; - for (UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) { + for (UE_id = 0; UE_id < NUMBER_OF_UE_MAX; UE_id++) { + if (UE_list->active[UE_id] != TRUE) continue; if (UE_list->UE_template[UE_PCCID(mod_idP,UE_id)][UE_id].rnti==rntiP) { return(UE_id); } } return(-1); - } //------------------------------------------------------------------------------ @@ -265,21 +264,17 @@ void dump_ue_list(UE_list_t *listP, int ul_flag) int add_new_ue(module_id_t mod_idP, int cc_idP, rnti_t rntiP,int harq_pidP) { int UE_id; - int j; + int i, j; UE_list_t *UE_list = &eNB_mac_inst[mod_idP].UE_list; LOG_D(MAC,"[eNB %d, CC_id %d] Adding UE with rnti %x (next avail %d, num_UEs %d)\n",mod_idP,cc_idP,rntiP,UE_list->avail,UE_list->num_UEs); dump_ue_list(UE_list,0); - if (UE_list->avail>=0) { - UE_id = UE_list->avail; - AssertFatal( UE_id < NUMBER_OF_UE_MAX, "BAD UE_id %u > NUMBER_OF_UE_MAX",UE_id ); - UE_list->avail = UE_list->next[UE_list->avail]; - UE_list->next[UE_id] = UE_list->head; - UE_list->next_ul[UE_id] = UE_list->head_ul; - UE_list->head = UE_id; - UE_list->head_ul = UE_id; + for (i = 0; i < NUMBER_OF_UE_MAX; i++) { + if (UE_list->active[i] == TRUE) continue; +printf("MAC: new UE id %d rnti %x\n", i, rntiP); + UE_id = i; UE_list->UE_template[cc_idP][UE_id].rnti = rntiP; UE_list->UE_template[cc_idP][UE_id].configured = FALSE; UE_list->numactiveCCs[UE_id] = 1; @@ -303,6 +298,7 @@ int add_new_ue(module_id_t mod_idP, int cc_idP, rnti_t rntiP,int harq_pidP) return(UE_id); } +printf("MAC: cannot add new UE for rnti %x\n", rntiP); LOG_E(MAC,"error in add_new_ue(), could not find space in UE_list, Dumping UE list\n"); dump_ue_list(UE_list,0); return(-1); @@ -312,23 +308,27 @@ int add_new_ue(module_id_t mod_idP, int cc_idP, rnti_t rntiP,int harq_pidP) int rrc_mac_remove_ue(module_id_t mod_idP,rnti_t rntiP) //------------------------------------------------------------------------------ { - - int prev,i, ret=-1; - - + int i; UE_list_t *UE_list = &eNB_mac_inst[mod_idP].UE_list; int UE_id = find_UE_id(mod_idP,rntiP); - int pCC_id = UE_PCCID(mod_idP,UE_id); + int pCC_id; if (UE_id == -1) { +printf("MAC: cannot remove UE rnti %x\n", rntiP); LOG_W(MAC,"rrc_mac_remove_ue: UE %x not found\n", rntiP); - mac_phy_remove_ue(mod_idP,rntiP); + mac_phy_remove_ue(mod_idP, rntiP); return 0; } + pCC_id = UE_PCCID(mod_idP,UE_id); + +printf("MAC: remove UE %d rnti %x\n", UE_id, rntiP); LOG_I(MAC,"Removing UE %d from Primary CC_id %d (rnti %x)\n",UE_id,pCC_id, rntiP); dump_ue_list(UE_list,0); + UE_list->active[UE_id] = FALSE; + UE_list->num_UEs--; + // clear all remaining pending transmissions UE_list->UE_template[pCC_id][UE_id].bsr_info[LCGID0] = 0; UE_list->UE_template[pCC_id][UE_id].bsr_info[LCGID1] = 0; @@ -343,58 +343,13 @@ int rrc_mac_remove_ue(module_id_t mod_idP,rnti_t rntiP) eNB_dlsch_info[mod_idP][pCC_id][UE_id].rnti = NOT_A_RNTI; eNB_dlsch_info[mod_idP][pCC_id][UE_id].status = S_DL_NONE; - prev = UE_list->head; - - for (i=UE_list->head; i>=0; i=UE_list->next[i]) { - if (i == UE_id) { - // link prev to next in Active list - if (i==UE_list->head) { - UE_list->head = UE_list->next[i]; - } else { - UE_list->next[prev] = UE_list->next[i]; - } - - // add UE id (i)to available - UE_list->next[i] = UE_list->avail; - UE_list->avail = i; - UE_list->active[i] = FALSE; - UE_list->num_UEs--; - ret=0; - break; - } - - prev=i; - } - - // do the same for UL - prev = UE_list->head_ul; - - for (i=UE_list->head_ul; i>=0; i=UE_list->next_ul[i]) { - if (i == UE_id) { - // link prev to next in Active list - if (i==UE_list->head_ul) { - UE_list->head_ul = UE_list->next_ul[i]; - } else { - UE_list->next_ul[prev] = UE_list->next_ul[i]; - } - - // add UE id (i)to available - UE_list->next_ul[i] = UE_list->avail; - ret = 0; - break; - } - - prev=i; - } - mac_phy_remove_ue(mod_idP,rntiP); // check if this has an RA process active RA_TEMPLATE *RA_template; for (i=0;i<NB_RA_PROC_MAX;i++) { RA_template = (RA_TEMPLATE *)&eNB_mac_inst[mod_idP].common_channels[pCC_id].RA_template[i]; - if ((RA_template->RA_active == TRUE) && - (RA_template->rnti == rntiP)){ + if (RA_template->rnti == rntiP){ RA_template->RA_active=FALSE; RA_template->generate_rar=0; RA_template->generate_Msg4=0; @@ -402,18 +357,11 @@ int rrc_mac_remove_ue(module_id_t mod_idP,rnti_t rntiP) RA_template->timing_offset=0; RA_template->RRC_timer=20; RA_template->rnti = 0; - break; + //break; } } - if (ret == 0) { - return (0); - } - - LOG_E(MAC,"error in mac_remove_ue(), could not find previous to %d in UE_list, should never happen, Dumping UE list\n",UE_id); - dump_ue_list(UE_list,0); - mac_xface->macphy_exit("mac_remove_ue: Problem in UE_list"); - return(-1); + return 0; } @@ -853,7 +801,8 @@ int get_min_rb_unit(module_id_t module_id, uint8_t CC_id) default: min_rb_unit=2; - LOG_W(MAC,"[eNB %d] N_DL_RB %d unknown for CC_id %d, setting min_rb_unit to 2\n", module_id, CC_id); + LOG_W(MAC,"[eNB %d] N_DL_RB %d unknown for CC_id %d, setting min_rb_unit to 2\n", + module_id, frame_parms->N_RB_DL, CC_id); break; } @@ -1157,8 +1106,7 @@ try_again: 1<<DCI_pdu->dci_alloc[j].L, nCCE,nCCE_max,DCI_pdu->num_pdcch_symbols); } - dump_CCE_table(CCE_table,nCCE_max,subframeP,dci_alloc->rnti,1<<dci_alloc->L); - + //dump_CCE_table(CCE_table,nCCE_max,subframeP,dci_alloc->rnti,1<<dci_alloc->L); goto failed; } DCI_pdu->num_pdcch_symbols++; diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c index da202dd39745a6312e0b19f369c2f032ba99e342..6d0044b346a2484aeccedb1a4932572eb8e1b7cd 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c @@ -333,7 +333,7 @@ void rx_sdu(const module_id_t enb_mod_idP, if (UE_id < 0) { memcpy(&eNB->common_channels[CC_idP].RA_template[ii].cont_res_id[0],payload_ptr,6); - LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d CCCH: Received Msg3: length %d, offset %d\n", + LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d CCCH: Received Msg3: length %d, offset %ld\n", enb_mod_idP,CC_idP,frameP,rx_lengths[i],payload_ptr-sduP); if ((UE_id=add_new_ue(enb_mod_idP,CC_idP,eNB->common_channels[CC_idP].RA_template[ii].rnti,harq_pidP)) == -1 ) { @@ -343,7 +343,7 @@ void rx_sdu(const module_id_t enb_mod_idP, LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d Added user with rnti %x => UE %d\n", enb_mod_idP,CC_idP,frameP,eNB->common_channels[CC_idP].RA_template[ii].rnti,UE_id); } else { - LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d CCCH: Received Msg3 from already registered UE %d: length %d, offset %d\n", + LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d CCCH: Received Msg3 from already registered UE %d: length %d, offset %ld\n", enb_mod_idP,CC_idP,frameP,UE_id,rx_lengths[i],payload_ptr-sduP); // kill RA procedure } @@ -433,7 +433,7 @@ void rx_sdu(const module_id_t enb_mod_idP, if (UE_id != -1) { // adjust buffer occupancy of the correponding logical channel group - LOG_D(MAC,"[eNB %d] CC_id %d Frame %d : ULSCH -> UL-DTCH, received %d bytes from UE %d for lcid %d, removing from LCGID %d, %d\n", + LOG_D(MAC,"[eNB %d] CC_id %d Frame %d : ULSCH -> UL-DTCH, received %d bytes from UE %d for lcid %d, removing from LCGID %ld, %d\n", enb_mod_idP,CC_idP,frameP, rx_lengths[i], UE_id,rx_lcids[i], UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]], UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]]); @@ -568,7 +568,7 @@ unsigned char *parse_ulsch_header(unsigned char *mac_header, } } - LOG_D(MAC,"[eNB] sdu %d lcid %d tb_length %d length %d (offset now %d)\n", + LOG_D(MAC,"[eNB] sdu %d lcid %d tb_length %d length %d (offset now %ld)\n", num_sdus,lcid,tb_length, length,mac_header_ptr-mac_header); rx_lcids[num_sdus] = lcid; rx_lengths[num_sdus] = length; @@ -750,6 +750,39 @@ void schedule_ulsch_rnti(module_id_t module_idP, continue; } + /* let's drop the UE if get_eNB_UE_stats returns NULL when calling it with any of the UE's active UL CCs */ + /* TODO: refine? */ + drop_ue = 0; + for (n=0; n<UE_list->numactiveULCCs[UE_id]; n++) { + CC_id = UE_list->ordered_ULCCids[n][UE_id]; + if (mac_xface->get_eNB_UE_stats(module_idP,CC_id,rnti) == NULL) { + LOG_W(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: no PHY context\n", module_idP,frameP,subframeP,UE_id,rnti,CC_id); + drop_ue = 1; + break; + } + } + if (drop_ue == 1) { +/* we can't come here, ulsch_scheduler_pre_processor won't put in the list a UE with no PHY context */ +abort(); + /* TODO: this is a hack. Sometimes the UE has no PHY context but + * is still present in the MAC with 'ul_failure_timer' = 0 and + * 'ul_out_of_sync' = 0. It seems wrong and the UE stays there forever. Let's + * start an UL out of sync procedure in this case. + * The root cause of this problem has to be found and corrected. + * In the meantime, this hack... + */ + if (UE_list->UE_sched_ctrl[UE_id].ul_failure_timer == 0 && + UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync == 0) { + LOG_W(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: UE in weird state, let's put it 'out of sync'\n", + module_idP,frameP,subframeP,UE_id,rnti,CC_id); + // inform RRC of failure and clear timer + mac_eNB_rrc_ul_failure(module_idP,CC_id,frameP,subframeP,rnti); + UE_list->UE_sched_ctrl[UE_id].ul_failure_timer=0; + UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync=1; + } + continue; + } + // loop over all active UL CC_ids for this UE for (n=0; n<UE_list->numactiveULCCs[UE_id]; n++) { // This is the actual CC_id in the list @@ -757,28 +790,19 @@ void schedule_ulsch_rnti(module_id_t module_idP, frame_parms = mac_xface->get_lte_frame_parms(module_idP,CC_id); eNB_UE_stats = mac_xface->get_eNB_UE_stats(module_idP,CC_id,rnti); - if (eNB_UE_stats==NULL) { - LOG_W(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: no PHY context\n", module_idP,frameP,subframeP,UE_id,rnti,CC_id); - drop_ue=1; - continue; // mac_xface->macphy_exit("[MAC][eNB] Cannot find eNB_UE_stats\n"); - } - - if (drop_ue==1) - continue; - aggregation=get_aggregation(get_bw_index(module_idP,CC_id), eNB_UE_stats->DL_cqi[0], format0); + if (CCE_allocation_infeasible(module_idP,CC_id,0,subframeP,aggregation,rnti)) { LOG_W(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: not enough nCCE\n", module_idP,frameP,subframeP,UE_id,rnti,CC_id); continue; // break; } else{ - LOG_D(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: aggregation level %d\n", module_idP,frameP,subframeP,UE_id,rnti,CC_id, 1<<aggregation); + LOG_D(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d mode %s: aggregation level %d\n", + module_idP,frameP,subframeP,UE_id,rnti,CC_id, mode_string[eNB_UE_stats->mode], 1<<aggregation); } - // printf("UE %d/%x is feasible, mode %s\n",UE_id,rnti,mode_string[eNB_UE_stats->mode]); - if (eNB_UE_stats->mode == PUSCH) { // ue has a ulsch channel DCI_pdu = &eNB->common_channels[CC_id].DCI_pdu; @@ -885,6 +909,12 @@ void schedule_ulsch_rnti(module_id_t module_idP, T_INT(subframeP), T_INT(harq_pid), T_INT(mcs), T_INT(first_rb[CC_id]), T_INT(rb_table[rb_table_index]), T_INT(TBS), T_INT(ndi)); + if (mac_eNB_get_rrc_status(module_idP,rnti) < RRC_CONNECTED) + LOG_I(MAC,"[eNB %d][PUSCH %d/%x] CC_id %d Frame %d subframeP %d Scheduled UE %d (mcs %d, first rb %d, nb_rb %d, rb_table_index %d, TBS %d, harq_pid %d)\n", + module_idP,harq_pid,rnti,CC_id,frameP,subframeP,UE_id,mcs, + first_rb[CC_id],rb_table[rb_table_index], + rb_table_index,TBS,harq_pid); + // bad indices : 20 (40 PRB), 21 (45 PRB), 22 (48 PRB) // increment for next UE allocation first_rb[CC_id]+=rb_table[rb_table_index]; @@ -894,12 +924,6 @@ void schedule_ulsch_rnti(module_id_t module_idP, if (UE_id == UE_list->head) VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_SCHEDULED,UE_sched_ctrl->ul_scheduled); - if (mac_eNB_get_rrc_status(module_idP,rnti) < RRC_CONNECTED) - LOG_I(MAC,"[eNB %d][PUSCH %d/%x] CC_id %d Frame %d subframeP %d Scheduled UE %d (mcs %d, first rb %d, nb_rb %d, rb_table_index %d, TBS %d, harq_pid %d)\n", - module_idP,harq_pid,rnti,CC_id,frameP,subframeP,UE_id,mcs, - first_rb[CC_id],rb_table[rb_table_index], - rb_table_index,TBS,harq_pid); - // adjust total UL buffer status by TBS, wait for UL sdus to do final update LOG_D(MAC,"[eNB %d] CC_id %d UE %d/%x : adjusting ul_total_buffer, old %d, TBS %d\n", module_idP,CC_id,UE_id,rnti,UE_template->ul_total_buffer,TBS); if (UE_template->ul_total_buffer > TBS) diff --git a/openair2/LAYER2/MAC/flexran_agent_mac_proto.h b/openair2/LAYER2/MAC/flexran_agent_mac_proto.h index 060e8ab6ca3f2114b4d98ace3b2cafcee58789e2..6757500dc2cc7175e48ea11c0ccb93d310904bf7 100644 --- a/openair2/LAYER2/MAC/flexran_agent_mac_proto.h +++ b/openair2/LAYER2/MAC/flexran_agent_mac_proto.h @@ -21,7 +21,7 @@ /*! \file flexran_agent_mac_proto.h * \brief MAC functions for FlexRAN agent - * \author Xenofon Foukas + * \author Xenofon Foukas and Navid Nikaein * \date 2016 * \email: x.foukas@sms.ed.ac.uk * \version 0.1 @@ -36,6 +36,145 @@ #include "header.pb-c.h" #include "flexran.pb-c.h" +/* + * slice specific scheduler + */ +typedef void (*slice_scheduler)(module_id_t mod_id, + int slice_id, + uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + Protocol__FlexranMessage **dl_info); + + + +/* + * top level flexran scheduler used by the eNB scheduler + */ +void flexran_schedule_ue_spec_default(mid_t mod_id, + uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + Protocol__FlexranMessage **dl_info); +/* + * slice specific scheduler for embb + */ +void +flexran_schedule_ue_spec_embb(mid_t mod_id, + int slice_id, + uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + Protocol__FlexranMessage **dl_info); +/* + * slice specific scheduler for urllc + */ +void +flexran_schedule_ue_spec_urllc(mid_t mod_id, + int slice_id, + uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + Protocol__FlexranMessage **dl_info); + +/* + * slice specific scheduler for mmtc + */ +void +flexran_schedule_ue_spec_mmtc(mid_t mod_id, + int slice_id, + uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + Protocol__FlexranMessage **dl_info); +/* + * slice specific scheduler for best effort traffic + */ +void +flexran_schedule_ue_spec_be(mid_t mod_id, + int slice_id, + uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + Protocol__FlexranMessage **dl_info); + +/* + * common flexran scheduler function + */ +void +flexran_schedule_ue_spec_common(mid_t mod_id, + int slice_id, + uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + Protocol__FlexranMessage **dl_info); + +uint16_t flexran_nb_rbs_allowed_slice(float rb_percentage, + int total_rbs); + +int flexran_slice_member(int UE_id, + int slice_id); + +int flexran_slice_maxmcs(int slice_id) ; + +void _store_dlsch_buffer (module_id_t Mod_id, + int slice_id, + frame_t frameP, + sub_frame_t subframeP); + + +void _assign_rbs_required (module_id_t Mod_id, + int slice_id, + frame_t frameP, + sub_frame_t subframe, + uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX], + uint16_t nb_rbs_allowed_slice[MAX_NUM_CCs][MAX_NUM_SLICES], + int min_rb_unit[MAX_NUM_CCs]); + +int _maxround(module_id_t Mod_id, + uint16_t rnti, + int frame, + sub_frame_t subframe, + uint8_t ul_flag ); + +int _maxcqi(module_id_t Mod_id, + int32_t UE_id); + +void _sort_UEs (module_id_t Mod_idP, + int frameP, + sub_frame_t subframeP); + +void _dlsch_scheduler_pre_processor (module_id_t Mod_id, + int slice_id, + frame_t frameP, + sub_frame_t subframeP, + int N_RBG[MAX_NUM_CCs], + int *mbsfn_flag); + +void _dlsch_scheduler_pre_processor_reset (int module_idP, + int UE_id, + uint8_t CC_id, + int frameP, + int subframeP, + int N_RBG, + uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX], + uint16_t nb_rbs_required_remaining[MAX_NUM_CCs][NUMBER_OF_UE_MAX], + uint16_t nb_rbs_allowed_slice[MAX_NUM_CCs][MAX_NUM_SLICES], + unsigned char rballoc_sub[MAX_NUM_CCs][N_RBG_MAX], + unsigned char MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX]); + +void _dlsch_scheduler_pre_processor_allocate (module_id_t Mod_id, + int UE_id, + uint8_t CC_id, + int N_RBG, + int transmission_mode, + int min_rb_unit, + uint8_t N_RB_DL, + uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX], + uint16_t nb_rbs_required_remaining[MAX_NUM_CCs][NUMBER_OF_UE_MAX], + unsigned char rballoc_sub[MAX_NUM_CCs][N_RBG_MAX], + unsigned char MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX]); + /* * Default scheduler used by the eNB agent */ @@ -46,17 +185,17 @@ void flexran_schedule_ue_spec_default(mid_t mod_id, uint32_t frame, uint32_t sub * Data plane function for applying the DL decisions of the scheduler */ void flexran_apply_dl_scheduling_decisions(mid_t mod_id, uint32_t frame, uint32_t subframe, int *mbsfn_flag, - const Protocol__FlexranMessage *dl_scheduling_info); + Protocol__FlexranMessage *dl_scheduling_info); /* * Data plane function for applying the UE specific DL decisions of the scheduler */ void flexran_apply_ue_spec_scheduling_decisions(mid_t mod_id, uint32_t frame, uint32_t subframe, int *mbsfn_flag, - uint32_t n_dl_ue_data, const Protocol__FlexDlData **dl_ue_data); + uint32_t n_dl_ue_data, Protocol__FlexDlData **dl_ue_data); /* * Data plane function for filling the DCI structure */ -void flexran_fill_oai_dci(mid_t mod_id, uint32_t CC_id, uint32_t rnti, const Protocol__FlexDlDci *dl_dci); +void flexran_fill_oai_dci(mid_t mod_id, uint32_t CC_id, uint32_t rnti, Protocol__FlexDlDci *dl_dci); #endif diff --git a/openair2/LAYER2/MAC/flexran_agent_scheduler_dataplane.c b/openair2/LAYER2/MAC/flexran_agent_scheduler_dataplane.c index ff3ef32bd6db47dca8b8e8d90ad0d3a8b1a199f3..c9956bd9ce937c055c4b75913e3e72226a87ace6 100644 --- a/openair2/LAYER2/MAC/flexran_agent_scheduler_dataplane.c +++ b/openair2/LAYER2/MAC/flexran_agent_scheduler_dataplane.c @@ -56,12 +56,11 @@ #include "SIMULATION/TOOLS/defs.h" // for taus - void flexran_apply_dl_scheduling_decisions(mid_t mod_id, uint32_t frame, uint32_t subframe, int *mbsfn_flag, - const Protocol__FlexranMessage *dl_scheduling_info) { + Protocol__FlexranMessage *dl_scheduling_info) { Protocol__FlexDlMacConfig *mac_config = dl_scheduling_info->dl_mac_config_msg; @@ -89,33 +88,26 @@ void flexran_apply_ue_spec_scheduling_decisions(mid_t mod_id, uint32_t subframe, int *mbsfn_flag, uint32_t n_dl_ue_data, - const Protocol__FlexDlData **dl_ue_data) { + Protocol__FlexDlData **dl_ue_data) { uint8_t CC_id; int UE_id; - int N_RBG[MAX_NUM_CCs]; - unsigned char aggregation; mac_rlc_status_resp_t rlc_status; unsigned char ta_len=0; unsigned char header_len = 0, header_len_tmp = 0; unsigned char sdu_lcids[11],offset,num_sdus=0; - uint16_t nb_rb,nb_rb_temp,total_nb_available_rb[MAX_NUM_CCs],nb_available_rb; + uint16_t nb_rb; uint16_t TBS,j,sdu_lengths[11],rnti,padding=0,post_padding=0; unsigned char dlsch_buffer[MAX_DLSCH_PAYLOAD_BYTES]; unsigned char round = 0; unsigned char harq_pid = 0; - + // LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]; LTE_eNB_UE_stats *eNB_UE_stats = NULL; uint16_t sdu_length_total = 0; - int mcs; - uint16_t min_rb_unit[MAX_NUM_CCs]; short ta_update = 0; eNB_MAC_INST *eNB = &eNB_mac_inst[mod_id]; UE_list_t *UE_list = &eNB->UE_list; - LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]; - int32_t normalized_rx_power, target_rx_power; - int32_t tpc=1; - static int32_t tpc_accumulated=0; + // static int32_t tpc_accumulated=0; UE_sched_ctrl *ue_sched_ctl; int last_sdu_header_len = 0; @@ -135,7 +127,7 @@ void flexran_apply_ue_spec_scheduling_decisions(mid_t mod_id, dl_dci = dl_data->dl_dci; CC_id = dl_data->serv_cell_index; - frame_parms[CC_id] = mac_xface->get_lte_frame_parms(mod_id, CC_id); + // frame_parms[CC_id] = mac_xface->get_lte_frame_parms(mod_id, CC_id); rnti = dl_data->rnti; UE_id = find_ue(rnti, PHY_vars_eNB_g[mod_id][CC_id]); @@ -357,20 +349,19 @@ void flexran_apply_ue_spec_scheduling_decisions(mid_t mod_id, eNB_UE_stats->dlsch_mcs1 = dl_dci->mcs[0]; //Fill the proper DCI of OAI - fill_oai_dci(mod_id, CC_id, rnti, dl_dci); + flexran_fill_oai_dci(mod_id, CC_id, rnti, dl_dci); } } - -void fill_oai_dci(mid_t mod_id, uint32_t CC_id, uint32_t rnti, - const Protocol__FlexDlDci *dl_dci) { +void flexran_fill_oai_dci(mid_t mod_id, uint32_t CC_id, uint32_t rnti, + Protocol__FlexDlDci *dl_dci) { void *DLSCH_dci = NULL; DCI_PDU *DCI_pdu; - unsigned char round = 0; unsigned char harq_pid = 0; + // unsigned char round = 0; LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]; - int size_bits, size_bytes; + int size_bits = 0, size_bytes = 0; eNB_MAC_INST *eNB = &eNB_mac_inst[mod_id]; UE_list_t *UE_list = &eNB->UE_list; LTE_eNB_UE_stats *eNB_UE_stats = NULL; @@ -380,7 +371,7 @@ void fill_oai_dci(mid_t mod_id, uint32_t CC_id, uint32_t rnti, uint32_t format; harq_pid = dl_dci->harq_process; - round = dl_dci->rv[0]; + // round = dl_dci->rv[0]; // Note this code is for a specific DCI format DLSCH_dci = (void *)UE_list->UE_template[CC_id][UE_id].DLSCH_DCI[harq_pid]; diff --git a/openair2/LAYER2/MAC/flexran_agent_scheduler_dlsch_ue.c b/openair2/LAYER2/MAC/flexran_agent_scheduler_dlsch_ue.c index 5bdc675198c8e1fbc3674899f50e58fa57d3f5ac..bc069179b98fc2331921794fd0be795e3fe18ba9 100644 --- a/openair2/LAYER2/MAC/flexran_agent_scheduler_dlsch_ue.c +++ b/openair2/LAYER2/MAC/flexran_agent_scheduler_dlsch_ue.c @@ -56,6 +56,7 @@ #include "header.pb-c.h" #include "flexran.pb-c.h" #include "flexran_agent_mac.h" +#include <dlfcn.h> #include "SIMULATION/TOOLS/defs.h" // for taus @@ -65,920 +66,292 @@ #define ENABLE_MAC_PAYLOAD_DEBUG +/** + * Local variables to support slicing + * + */ -//------------------------------------------------------------------------------ -void -flexran_schedule_ue_spec_default(mid_t mod_id, - uint32_t frame, - uint32_t subframe, - int *mbsfn_flag, - Protocol__FlexranMessage **dl_info) -//------------------------------------------------------------------------------ -{ - uint8_t CC_id; - int UE_id; - int N_RBG[MAX_NUM_CCs]; - unsigned char aggregation; - mac_rlc_status_resp_t rlc_status; - unsigned char header_len = 0, header_len_tmp = 0, ta_len = 0; - uint16_t nb_rb, nb_rb_temp, total_nb_available_rb[MAX_NUM_CCs], nb_available_rb; - uint16_t TBS, j, rnti, padding=0, post_padding=0; - unsigned char round = 0; - unsigned char harq_pid = 0; - void *DLSCH_dci = NULL; - uint16_t sdu_length_total = 0; - int mcs, mcs_tmp; - uint16_t min_rb_unit[MAX_NUM_CCs]; - eNB_MAC_INST *eNB = &eNB_mac_inst[mod_id]; - /* TODO: Must move the helper structs to scheduler implementation */ - UE_list_t *UE_list = &eNB->UE_list; - int32_t normalized_rx_power, target_rx_power; - int32_t tpc = 1; - static int32_t tpc_accumulated=0; - UE_sched_ctrl *ue_sched_ctl; - Protocol__FlexDlData *dl_data[NUM_MAX_UE]; - int num_ues_added = 0; - int channels_added = 0; +/*!\brief UE ULSCH scheduling states*/ +typedef enum { + MIN_SLICE_STRATEGY = 0, + SLICE_MASK, + UEID_TO_SLICEID, + MAX_SLICE_STRATEGY +} SLICING_STRATEGY; - Protocol__FlexDlDci *dl_dci; - Protocol__FlexRlcPdu *rlc_pdus[11]; - uint32_t *ce_bitmap; - Protocol__FlexRlcPdu **rlc_pdu; - int num_tb; - uint32_t ce_flags = 0; +// this assumes a max of of 16 UE per eNB/CC +#define SLICE0_MASK 0x000f +#define SLICE1_MASK 0x00f0 +#define SLICE2_MASK 0x0f00 +#define SLICE3_MASK 0xf000 - uint8_t rballoc_sub[25]; - int i; - uint32_t data_to_request; - uint32_t dci_tbs; - uint8_t ue_has_transmission = 0; - uint32_t ndi; - - flexran_agent_mac_create_empty_dl_config(mod_id, dl_info); - - if (UE_list->head==-1) { - return; - } - - start_meas(&eNB->schedule_dlsch); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SCHEDULE_DLSCH,VCD_FUNCTION_IN); - //weight = get_ue_weight(module_idP,UE_id); - aggregation = 2; +// number of active slices for past and current time +int n_active_slices = 1; +int n_active_slices_current = 1; - for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { - min_rb_unit[CC_id] = get_min_rb_unit(mod_id, CC_id); - // get number of PRBs less those used by common channels - total_nb_available_rb[CC_id] = flexran_get_N_RB_DL(mod_id, CC_id); - for (i=0;i < flexran_get_N_RB_DL(mod_id, CC_id); i++) - if (eNB->common_channels[CC_id].vrb_map[i] != 0) - total_nb_available_rb[CC_id]--; - - N_RBG[CC_id] = flexran_get_N_RBG(mod_id, CC_id); +// ue to slice mapping +int slicing_strategy = UEID_TO_SLICEID; +int slicing_strategy_current = UEID_TO_SLICEID; - // store the global enb stats: - eNB->eNB_stats[CC_id].num_dlactive_UEs = UE_list->num_UEs; - eNB->eNB_stats[CC_id].available_prbs = total_nb_available_rb[CC_id]; - eNB->eNB_stats[CC_id].total_available_prbs += total_nb_available_rb[CC_id]; - eNB->eNB_stats[CC_id].dlsch_bytes_tx=0; - eNB->eNB_stats[CC_id].dlsch_pdus_tx=0; - } +// RB share for each slice for past and current time +float slice_percentage[MAX_NUM_SLICES] = {1.0, 0.0, 0.0, 0.0}; +float slice_percentage_current[MAX_NUM_SLICES] = {1.0, 0.0, 0.0, 0.0}; +float total_slice_percentage = 0; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_PREPROCESSOR,VCD_FUNCTION_IN); +// MAX MCS for each slice for past and current time +int slice_maxmcs[MAX_NUM_SLICES] = {28, 28, 28, 28}; +int slice_maxmcs_current[MAX_NUM_SLICES] = {28, 28, 28, 28}; - start_meas(&eNB->schedule_dlsch_preprocessor); - _dlsch_scheduler_pre_processor(mod_id, - frame, - subframe, - N_RBG, - mbsfn_flag); - stop_meas(&eNB->schedule_dlsch_preprocessor); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_PREPROCESSOR,VCD_FUNCTION_OUT); +int update_dl_scheduler[MAX_NUM_SLICES] = {1, 0, 0, 0}; +int update_dl_scheduler_current[MAX_NUM_SLICES] = {1, 0, 0, 0}; - for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { - LOG_D(MAC, "doing schedule_ue_spec for CC_id %d\n",CC_id); +// name of available scheduler +char *dl_scheduler_type[MAX_NUM_SLICES] = {"flexran_schedule_ue_spec_embb", + "flexran_schedule_ue_spec_urllc", + "flexran_schedule_ue_spec_mmtc", + "flexran_schedule_ue_spec_be" // best effort +}; - if (mbsfn_flag[CC_id]>0) - continue; +// pointer to the slice specific scheduler +slice_scheduler slice_sched[MAX_NUM_SLICES] = {0}; - for (UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) { - rnti = flexran_get_ue_crnti(mod_id, UE_id); - ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; - if (rnti==NOT_A_RNTI) { - LOG_D(MAC,"Cannot find rnti for UE_id %d (num_UEs %d)\n", UE_id,UE_list->num_UEs); - // mac_xface->macphy_exit("Cannot find rnti for UE_id"); - continue; - } +/** + * preprocessor functions for scheduling + * + */ - if (flexran_get_ue_crnti(mod_id, UE_id) == NOT_A_RNTI) { - LOG_D(MAC,"[eNB] Cannot find UE\n"); - // mac_xface->macphy_exit("[MAC][eNB] Cannot find eNB_UE_stats\n"); - continue; - } - - aggregation = get_aggregation(get_bw_index(mod_id,CC_id), - flexran_get_ue_wcqi(mod_id, UE_id), - format1); - - if ((ue_sched_ctl->pre_nb_available_rbs[CC_id] == 0) || // no RBs allocated - CCE_allocation_infeasible(mod_id, CC_id, 0, subframe, aggregation, rnti)) { - LOG_D(MAC,"[eNB %d] Frame %d : no RB allocated for UE %d on CC_id %d: continue \n", - mod_id, frame, UE_id, CC_id); - //if(mac_xface->get_transmission_mode(module_idP,rnti)==5) - continue; //to next user (there might be rbs availiable for other UEs in TM5 - // else - // break; - } - if (flexran_get_duplex_mode(mod_id, CC_id) == PROTOCOL__FLEX_DUPLEX_MODE__FLDM_TDD) { - set_ue_dai (subframe, - flexran_get_subframe_assignment(mod_id, CC_id), - UE_id, - CC_id, - UE_list); - //TODO: update UL DAI after DLSCH scheduling - //set_ul_DAI(mod_id, UE_id, CC_id, frame, subframe,frame_parms); - } +// This function stores the downlink buffer for all the logical channels +void _store_dlsch_buffer (module_id_t Mod_id, + int slice_id, + frame_t frameP, + sub_frame_t subframeP) +{ - channels_added = 0; + int UE_id,i; + rnti_t rnti; + mac_rlc_status_resp_t rlc_status; + UE_list_t *UE_list = &eNB_mac_inst[Mod_id].UE_list; + UE_TEMPLATE *UE_template; - // After this point all the UEs will be scheduled - dl_data[num_ues_added] = (Protocol__FlexDlData *) malloc(sizeof(Protocol__FlexDlData)); - protocol__flex_dl_data__init(dl_data[num_ues_added]); - dl_data[num_ues_added]->has_rnti = 1; - dl_data[num_ues_added]->rnti = rnti; - dl_data[num_ues_added]->n_rlc_pdu = 0; - dl_data[num_ues_added]->has_serv_cell_index = 1; - dl_data[num_ues_added]->serv_cell_index = CC_id; - - nb_available_rb = ue_sched_ctl->pre_nb_available_rbs[CC_id]; - flexran_get_harq(mod_id, CC_id, UE_id, frame, subframe, &harq_pid, &round); - sdu_length_total=0; - mcs = cqi_to_mcs[flexran_get_ue_wcqi(mod_id, UE_id)]; + for (UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) { + + if (flexran_slice_member(UE_id, slice_id) == 0) + continue; + + UE_template = &UE_list->UE_template[UE_PCCID(Mod_id,UE_id)][UE_id]; -#ifdef EXMIMO + // clear logical channel interface variables + UE_template->dl_buffer_total = 0; + UE_template->dl_pdus_total = 0; - if (mac_xface->get_transmission_mode(mod_id, CC_id, rnti) == 5) { - mcs = cqi_to_mcs[flexran_get_ue_wcqi(mod_id, UE_id)]; - mcs = cmin(mcs,16); - } + for(i=0; i< MAX_NUM_LCID; i++) { + UE_template->dl_buffer_info[i]=0; + UE_template->dl_pdus_in_buffer[i]=0; + UE_template->dl_buffer_head_sdu_creation_time[i]=0; + UE_template->dl_buffer_head_sdu_remaining_size_to_send[i]=0; + } -#endif + rnti = UE_RNTI(Mod_id,UE_id); - // initializing the rb allocation indicator for each UE - for(j = 0; j < flexran_get_N_RBG(mod_id, CC_id); j++) { - UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = 0; - rballoc_sub[j] = 0; - } + for(i=0; i< MAX_NUM_LCID; i++) { // loop over all the logical channels - /* LOG_D(MAC,"[eNB %d] Frame %d: Scheduling UE %d on CC_id %d (rnti %x, harq_pid %d, round %d, rb %d, cqi %d, mcs %d, rrc %d)\n", */ - /* mod_id, frame, UE_id, CC_id, rnti, harq_pid, round, nb_available_rb, */ - /* eNB_UE_stats->DL_cqi[0], mcs, */ - /* UE_list->eNB_UE_stats[CC_id][UE_id].rrc_status); */ + rlc_status = mac_rlc_status_ind(Mod_id,rnti, Mod_id,frameP,ENB_FLAG_YES,MBMS_FLAG_NO,i,0 ); + UE_template->dl_buffer_info[i] = rlc_status.bytes_in_buffer; //storing the dlsch buffer for each logical channel + UE_template->dl_pdus_in_buffer[i] = rlc_status.pdus_in_buffer; + UE_template->dl_buffer_head_sdu_creation_time[i] = rlc_status.head_sdu_creation_time ; + UE_template->dl_buffer_head_sdu_creation_time_max = cmax(UE_template->dl_buffer_head_sdu_creation_time_max, + rlc_status.head_sdu_creation_time ); + UE_template->dl_buffer_head_sdu_remaining_size_to_send[i] = rlc_status.head_sdu_remaining_size_to_send; + UE_template->dl_buffer_head_sdu_is_segmented[i] = rlc_status.head_sdu_is_segmented; + UE_template->dl_buffer_total += UE_template->dl_buffer_info[i];//storing the total dlsch buffer + UE_template->dl_pdus_total += UE_template->dl_pdus_in_buffer[i]; - dl_dci = (Protocol__FlexDlDci*) malloc(sizeof(Protocol__FlexDlDci)); - protocol__flex_dl_dci__init(dl_dci); - dl_data[num_ues_added]->dl_dci = dl_dci; +#ifdef DEBUG_eNB_SCHEDULER - - dl_dci->has_rnti = 1; - dl_dci->rnti = rnti; - dl_dci->has_harq_process = 1; - dl_dci->harq_process = harq_pid; - - /* process retransmission */ + /* note for dl_buffer_head_sdu_remaining_size_to_send[i] : + * 0 if head SDU has not been segmented (yet), else remaining size not already segmented and sent + */ + if (UE_template->dl_buffer_info[i]>0) + LOG_D(MAC, + "[eNB %d][SLICE %d] Frame %d Subframe %d : RLC status for UE %d in LCID%d: total of %d pdus and size %d, head sdu queuing time %d, remaining size %d, is segmeneted %d \n", + Mod_id, slice_id,frameP, subframeP, UE_id, + i, UE_template->dl_pdus_in_buffer[i],UE_template->dl_buffer_info[i], + UE_template->dl_buffer_head_sdu_creation_time[i], + UE_template->dl_buffer_head_sdu_remaining_size_to_send[i], + UE_template->dl_buffer_head_sdu_is_segmented[i] + ); - if (round > 0) { +#endif - if (flexran_get_duplex_mode(mod_id, CC_id) == PROTOCOL__FLEX_DUPLEX_MODE__FLDM_TDD) { - UE_list->UE_template[CC_id][UE_id].DAI++; - update_ul_dci(mod_id, CC_id, rnti, UE_list->UE_template[CC_id][UE_id].DAI); - LOG_D(MAC,"DAI update: CC_id %d subframeP %d: UE %d, DAI %d\n", - CC_id, subframe,UE_id,UE_list->UE_template[CC_id][UE_id].DAI); - } + } - mcs = UE_list->UE_template[CC_id][UE_id].mcs[harq_pid]; + //#ifdef DEBUG_eNB_SCHEDULER + if ( UE_template->dl_buffer_total>0) + LOG_D(MAC,"[eNB %d] Frame %d Subframe %d : RLC status for UE %d : total DL buffer size %d and total number of pdu %d \n", + Mod_id, frameP, subframeP, UE_id, + UE_template->dl_buffer_total, + UE_template->dl_pdus_total + ); - // get freq_allocation - nb_rb = UE_list->UE_template[CC_id][UE_id].nb_rb[harq_pid]; - - /*TODO: Must add this to FlexRAN agent API */ - dci_tbs = mac_xface->get_TBS_DL(mcs, nb_rb); + //#endif + } +} - if (nb_rb <= nb_available_rb) { - - if(nb_rb == ue_sched_ctl->pre_nb_available_rbs[CC_id]) { - for(j = 0; j < flexran_get_N_RBG(mod_id, CC_id); j++) { // for indicating the rballoc for each sub-band - UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = ue_sched_ctl->rballoc_sub_UE[CC_id][j]; - } - } else { - nb_rb_temp = nb_rb; - j = 0; - while((nb_rb_temp > 0) && (j < flexran_get_N_RBG(mod_id, CC_id))) { - if(ue_sched_ctl->rballoc_sub_UE[CC_id][j] == 1) { - UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = ue_sched_ctl->rballoc_sub_UE[CC_id][j]; - - if((j == flexran_get_N_RBG(mod_id, CC_id) - 1) && - ((flexran_get_N_RB_DL(mod_id, CC_id) == 25)|| - (flexran_get_N_RB_DL(mod_id, CC_id) == 50))) { - nb_rb_temp = nb_rb_temp - min_rb_unit[CC_id]+1; - } else { - nb_rb_temp = nb_rb_temp - min_rb_unit[CC_id]; - } - } - j = j + 1; - } - } +// This function returns the estimated number of RBs required by each UE for downlink scheduling +void _assign_rbs_required (module_id_t Mod_id, + int slice_id, + frame_t frameP, + sub_frame_t subframe, + uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX], + uint16_t nb_rbs_allowed_slice[MAX_NUM_CCs][MAX_NUM_SLICES], + int min_rb_unit[MAX_NUM_CCs]) +{ - nb_available_rb -= nb_rb; - - PHY_vars_eNB_g[mod_id][CC_id]->mu_mimo_mode[UE_id].pre_nb_available_rbs = nb_rb; - PHY_vars_eNB_g[mod_id][CC_id]->mu_mimo_mode[UE_id].dl_pow_off = ue_sched_ctl->dl_pow_off[CC_id]; - - for(j=0; j < flexran_get_N_RBG(mod_id, CC_id); j++) { - PHY_vars_eNB_g[mod_id][CC_id]->mu_mimo_mode[UE_id].rballoc_sub[j] = UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j]; - rballoc_sub[j] = UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j]; - } - // Keep the old NDI, do not toggle - ndi = UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; - tpc = UE_list->UE_template[CC_id][UE_id].oldTPC[harq_pid]; - UE_list->UE_template[CC_id][UE_id].mcs[harq_pid] = mcs; + rnti_t rnti; + uint16_t TBS = 0; + LTE_eNB_UE_stats *eNB_UE_stats[MAX_NUM_CCs]; + int UE_id,n,i,j,CC_id,pCCid,tmp; + UE_list_t *UE_list = &eNB_mac_inst[Mod_id].UE_list; + // UE_TEMPLATE *UE_template; - ue_has_transmission = 1; - num_ues_added++; - } else { - LOG_D(MAC,"[eNB %d] Frame %d CC_id %d : don't schedule UE %d, its retransmission takes more resources than we have\n", - mod_id, frame, CC_id, UE_id); - ue_has_transmission = 0; - } - //End of retransmission - } else { /* This is a potentially new SDU opportunity */ - rlc_status.bytes_in_buffer = 0; - // Now check RLC information to compute number of required RBs - // get maximum TBS size for RLC request - //TBS = mac_xface->get_TBS(eNB_UE_stats->DL_cqi[0]<<1,nb_available_rb); - TBS = mac_xface->get_TBS_DL(mcs, nb_available_rb); - dci_tbs = TBS; + // clear rb allocations across all CC_ids + for (UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) { + + if (flexran_slice_member(UE_id, slice_id) == 0) + continue; + + pCCid = UE_PCCID(Mod_id,UE_id); + rnti = UE_list->UE_template[pCCid][UE_id].rnti; - // check first for RLC data on DCCH - // add the length for all the control elements (timing adv, drx, etc) : header + payload + //update CQI information across component carriers + for (n=0; n<UE_list->numactiveCCs[UE_id]; n++) { + CC_id = UE_list->ordered_CCids[n][UE_id]; + eNB_UE_stats[CC_id] = mac_xface->get_eNB_UE_stats(Mod_id,CC_id,rnti); + eNB_UE_stats[CC_id]->dlsch_mcs1=cqi_to_mcs[flexran_get_ue_wcqi(Mod_id, UE_id)]; + } - ta_len = (ue_sched_ctl->ta_update!=0) ? 2 : 0; - - dl_data[num_ues_added]->n_ce_bitmap = 2; - dl_data[num_ues_added]->ce_bitmap = (uint32_t *) malloc(sizeof(uint32_t) * 2); - - if (ta_len > 0) { - ce_flags |= PROTOCOL__FLEX_CE_TYPE__FLPCET_TA; - } + // provide the list of CCs sorted according to MCS + for (i=0; i<UE_list->numactiveCCs[UE_id]; i++) { + for (j=i+1; j<UE_list->numactiveCCs[UE_id]; j++) { + DevAssert( j < MAX_NUM_CCs ); - /*TODO: Add other flags if DRX and other CE are required*/ - - // Add the control element flags to the flexran message - dl_data[num_ues_added]->ce_bitmap[0] = ce_flags; - dl_data[num_ues_added]->ce_bitmap[1] = ce_flags; + if (eNB_UE_stats[UE_list->ordered_CCids[i][UE_id]]->dlsch_mcs1 > + eNB_UE_stats[UE_list->ordered_CCids[j][UE_id]]->dlsch_mcs1) { + tmp = UE_list->ordered_CCids[i][UE_id]; + UE_list->ordered_CCids[i][UE_id] = UE_list->ordered_CCids[j][UE_id]; + UE_list->ordered_CCids[j][UE_id] = tmp; + } + } + } - // TODO : Need to prioritize DRBs - // Loop through the UE logical channels (DCCH, DCCH1, DTCH for now) - for (j = 1; j < NB_RB_MAX; j++) { - header_len+=3; + /* NN --> RK + * check the index of UE_template" + */ + if (UE_list->UE_template[pCCid][UE_id].dl_buffer_total> 0) { + LOG_D(MAC,"[preprocessor] assign RB for UE %d\n",UE_id); - // Need to see if we have space for data from this channel - if (dci_tbs - ta_len - header_len - sdu_length_total > 0) { - LOG_D(MAC, "[TEST]Requested %d bytes from RLC buffer on channel %d during first call\n", dci_tbs-ta_len-header_len); - //If we have space, we need to see how much data we can request at most (if any available) - rlc_status = mac_rlc_status_ind(mod_id, - rnti, - mod_id, - frame, - ENB_FLAG_YES, - MBMS_FLAG_NO, - j, - (dci_tbs-ta_len-header_len)); // transport block set size + for (i=0; i<UE_list->numactiveCCs[UE_id]; i++) { + CC_id = UE_list->ordered_CCids[i][UE_id]; + eNB_UE_stats[CC_id] = mac_xface->get_eNB_UE_stats(Mod_id,CC_id,rnti); - //If data are available in channel j - if (rlc_status.bytes_in_buffer > 0) { - LOG_D(MAC, "[TEST]Have %d bytes in DCCH buffer during first call\n", rlc_status.bytes_in_buffer); - //Fill in as much as possible - data_to_request = cmin(dci_tbs-ta_len-header_len, rlc_status.bytes_in_buffer); - if (data_to_request < 128) { //The header will be one byte less - header_len--; - } - /* if (j == 1 || j == 2) { */ - /* data_to_request+=0; - /* } */ - LOG_D(MAC, "[TEST]Will request %d from channel %d\n", data_to_request, j); - rlc_pdus[channels_added] = (Protocol__FlexRlcPdu *) malloc(sizeof(Protocol__FlexRlcPdu)); - protocol__flex_rlc_pdu__init(rlc_pdus[channels_added]); - rlc_pdus[channels_added]->n_rlc_pdu_tb = 2; - rlc_pdus[channels_added]->rlc_pdu_tb = (Protocol__FlexRlcPduTb **) malloc(sizeof(Protocol__FlexRlcPduTb *) * 2); - rlc_pdus[channels_added]->rlc_pdu_tb[0] = (Protocol__FlexRlcPduTb *) malloc(sizeof(Protocol__FlexRlcPduTb)); - protocol__flex_rlc_pdu_tb__init(rlc_pdus[channels_added]->rlc_pdu_tb[0]); - rlc_pdus[channels_added]->rlc_pdu_tb[0]->has_logical_channel_id = 1; - rlc_pdus[channels_added]->rlc_pdu_tb[0]->logical_channel_id = j; - rlc_pdus[channels_added]->rlc_pdu_tb[0]->has_size = 1; - rlc_pdus[channels_added]->rlc_pdu_tb[0]->size = data_to_request; - rlc_pdus[channels_added]->rlc_pdu_tb[1] = (Protocol__FlexRlcPduTb *) malloc(sizeof(Protocol__FlexRlcPduTb)); - protocol__flex_rlc_pdu_tb__init(rlc_pdus[channels_added]->rlc_pdu_tb[1]); - rlc_pdus[channels_added]->rlc_pdu_tb[1]->has_logical_channel_id = 1; - rlc_pdus[channels_added]->rlc_pdu_tb[1]->logical_channel_id = j; - rlc_pdus[channels_added]->rlc_pdu_tb[1]->has_size = 1; - rlc_pdus[channels_added]->rlc_pdu_tb[1]->size = data_to_request; - dl_data[num_ues_added]->n_rlc_pdu++; - channels_added++; - //Set this to the max value that we might request - sdu_length_total += data_to_request; - } else { - //Take back the assumption of a header for this channel - header_len -= 3; - } //End rlc_status.bytes_in_buffer <= 0 - } //end of if dci_tbs - ta_len - header_len > 0 - } // End of iterating the logical channels - - // Add rlc_pdus to the dl_data message - dl_data[num_ues_added]->rlc_pdu = (Protocol__FlexRlcPdu **) malloc(sizeof(Protocol__FlexRlcPdu *) * - dl_data[num_ues_added]->n_rlc_pdu); - for (i = 0; i < dl_data[num_ues_added]->n_rlc_pdu; i++) { - dl_data[num_ues_added]->rlc_pdu[i] = rlc_pdus[i]; - } - - // there is a payload - if (( dl_data[num_ues_added]->n_rlc_pdu > 0)) { - // Now compute number of required RBs for total sdu length - // Assume RAH format 2 - // adjust header lengths - header_len_tmp = header_len; + if (eNB_UE_stats[CC_id]->dlsch_mcs1==0) { + nb_rbs_required[CC_id][UE_id] = 4; // don't let the TBS get too small + } else { + nb_rbs_required[CC_id][UE_id] = min_rb_unit[CC_id]; + } - if (header_len == 2 || header_len == 3) { //Only one SDU, remove length field - header_len = 1; - } else { //Remove length field from the last SDU - header_len--; - } + TBS = mac_xface->get_TBS_DL(eNB_UE_stats[CC_id]->dlsch_mcs1,nb_rbs_required[CC_id][UE_id]); + nb_rbs_allowed_slice[CC_id][slice_id] = flexran_nb_rbs_allowed_slice(slice_percentage[slice_id], + flexran_get_N_RB_DL(Mod_id, CC_id)); + LOG_D(MAC,"[preprocessor] start RB assignement for UE %d CC_id %d dl buffer %d (RB unit %d, MCS %d, TBS %d) \n", + UE_id, CC_id, UE_list->UE_template[pCCid][UE_id].dl_buffer_total, + nb_rbs_required[CC_id][UE_id],eNB_UE_stats[CC_id]->dlsch_mcs1,TBS); - mcs_tmp = mcs; - if (mcs_tmp == 0) { - nb_rb = 4; // don't let the TBS get too small - } else { - nb_rb=min_rb_unit[CC_id]; + /* calculating required number of RBs for each UE */ + while (TBS < UE_list->UE_template[pCCid][UE_id].dl_buffer_total) { + nb_rbs_required[CC_id][UE_id] += min_rb_unit[CC_id]; + + if (nb_rbs_required[CC_id][UE_id] > nb_rbs_allowed_slice[CC_id][slice_id]) { + TBS = mac_xface->get_TBS_DL(eNB_UE_stats[CC_id]->dlsch_mcs1, nb_rbs_allowed_slice[CC_id][slice_id]); + nb_rbs_required[CC_id][UE_id] = nb_rbs_allowed_slice[CC_id][slice_id]; + break; } - LOG_D(MAC,"[TEST]The initial number of resource blocks was %d\n", nb_rb); - LOG_D(MAC,"[TEST] The initial mcs was %d\n", mcs_tmp); + TBS = mac_xface->get_TBS_DL(eNB_UE_stats[CC_id]->dlsch_mcs1,nb_rbs_required[CC_id][UE_id]); + } // end of while - TBS = mac_xface->get_TBS_DL(mcs_tmp, nb_rb); - LOG_D(MAC,"[TEST]The TBS during rate matching was %d\n", TBS); + LOG_D(MAC,"[eNB %d][SLICE %d] Frame %d: UE %d on CC %d: RB unit %d, nb_required RB %d (TBS %d, mcs %d)\n", + Mod_id, slice_id,frameP,UE_id, CC_id, min_rb_unit[CC_id], nb_rbs_required[CC_id][UE_id], TBS, eNB_UE_stats[CC_id]->dlsch_mcs1); + } + } + } +} - while (TBS < (sdu_length_total + header_len + ta_len)) { - nb_rb += min_rb_unit[CC_id]; // - LOG_D(MAC, "[TEST]Had to increase the number of RBs\n"); - if (nb_rb > nb_available_rb) { // if we've gone beyond the maximum number of RBs - // (can happen if N_RB_DL is odd) - TBS = mac_xface->get_TBS_DL(mcs_tmp, nb_available_rb); - nb_rb = nb_available_rb; - break; - } +// This function scans all CC_ids for a particular UE to find the maximum round index of its HARQ processes +int _maxround(module_id_t Mod_id,uint16_t rnti,int frame,sub_frame_t subframe,uint8_t ul_flag ) +{ - TBS = mac_xface->get_TBS_DL(mcs_tmp, nb_rb); - } + uint8_t round,round_max=0,UE_id; + int CC_id; + UE_list_t *UE_list = &eNB_mac_inst[Mod_id].UE_list; - if(nb_rb == ue_sched_ctl->pre_nb_available_rbs[CC_id]) { - LOG_D(MAC, "[TEST]We had the exact number of rbs. Time to fill the rballoc subband\n"); - for(j = 0; j < flexran_get_N_RBG(mod_id, CC_id); j++) { // for indicating the rballoc for each sub-band - UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = ue_sched_ctl->rballoc_sub_UE[CC_id][j]; - } - } else { - nb_rb_temp = nb_rb; - j = 0; - LOG_D(MAC, "[TEST]Will only partially fill the bitmap\n"); - while((nb_rb_temp > 0) && (j < flexran_get_N_RBG(mod_id, CC_id))) { - if(ue_sched_ctl->rballoc_sub_UE[CC_id][j] == 1) { - UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = ue_sched_ctl->rballoc_sub_UE[CC_id][j]; - if ((j == flexran_get_N_RBG(mod_id, CC_id) - 1) && - ((flexran_get_N_RB_DL(mod_id, CC_id) == 25)|| - (flexran_get_N_RB_DL(mod_id, CC_id) == 50))) { - nb_rb_temp = nb_rb_temp - min_rb_unit[CC_id] + 1; - } else { - nb_rb_temp = nb_rb_temp - min_rb_unit[CC_id]; - } - } - j = j+1; - } - } - - PHY_vars_eNB_g[mod_id][CC_id]->mu_mimo_mode[UE_id].pre_nb_available_rbs = nb_rb; - PHY_vars_eNB_g[mod_id][CC_id]->mu_mimo_mode[UE_id].dl_pow_off = ue_sched_ctl->dl_pow_off[CC_id]; + for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { - for(j = 0; j < flexran_get_N_RBG(mod_id, CC_id); j++) { - PHY_vars_eNB_g[mod_id][CC_id]->mu_mimo_mode[UE_id].rballoc_sub[j] = UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j]; - } + UE_id = find_UE_id(Mod_id,rnti); + round = UE_list->UE_sched_ctrl[UE_id].round[CC_id]; + if (round > round_max) { + round_max = round; + } + } - // decrease mcs until TBS falls below required length - while ((TBS > (sdu_length_total + header_len + ta_len)) && (mcs_tmp > 0)) { - mcs_tmp--; - TBS = mac_xface->get_TBS_DL(mcs_tmp, nb_rb); - } + return round_max; +} - // if we have decreased too much or we don't have enough RBs, increase MCS - while ((TBS < (sdu_length_total + header_len + ta_len)) && - ((( ue_sched_ctl->dl_pow_off[CC_id] > 0) && (mcs_tmp < 28)) || ( (ue_sched_ctl->dl_pow_off[CC_id]==0) && (mcs_tmp <= 15)))) { - mcs_tmp++; - TBS = mac_xface->get_TBS_DL(mcs_tmp, nb_rb); - } +// This function scans all CC_ids for a particular UE to find the maximum DL CQI +int _maxcqi(module_id_t Mod_id,int32_t UE_id) +{ - dci_tbs = TBS; - mcs = mcs_tmp; + LTE_eNB_UE_stats *eNB_UE_stats = NULL; + UE_list_t *UE_list = &eNB_mac_inst[Mod_id].UE_list; + int CC_id,n; + int CQI = 0; - aggregation = get_aggregation(get_bw_index(mod_id,CC_id), - flexran_get_ue_wcqi(mod_id, UE_id), - format1); - dl_dci->has_aggr_level = 1; - dl_dci->aggr_level = aggregation; - - UE_list->UE_template[CC_id][UE_id].nb_rb[harq_pid] = nb_rb; + for (n=0; n<UE_list->numactiveCCs[UE_id]; n++) { + CC_id = UE_list->ordered_CCids[n][UE_id]; + eNB_UE_stats = mac_xface->get_eNB_UE_stats(Mod_id,CC_id,UE_RNTI(Mod_id,UE_id)); - if (flexran_get_duplex_mode(mod_id, CC_id) == PROTOCOL__FLEX_DUPLEX_MODE__FLDM_TDD) { - UE_list->UE_template[CC_id][UE_id].DAI++; - // printf("DAI update: subframeP %d: UE %d, DAI %d\n",subframeP,UE_id,UE_list->UE_template[CC_id][UE_id].DAI); - //#warning only for 5MHz channel - update_ul_dci(mod_id, CC_id, rnti, UE_list->UE_template[CC_id][UE_id].DAI); - } + if (eNB_UE_stats==NULL) { + mac_xface->macphy_exit("maxcqi: could not get eNB_UE_stats\n"); + return 0; // not reached + } - // do PUCCH power control - // this is the normalized RX power - normalized_rx_power = flexran_get_p0_pucch_dbm(mod_id,UE_id, CC_id); //eNB_UE_stats->Po_PUCCH_dBm; - target_rx_power = flexran_get_p0_nominal_pucch(mod_id, CC_id) + 10; //mac_xface->get_target_pucch_rx_power(mod_id, CC_id) + 10; + if (eNB_UE_stats->DL_cqi[0] > CQI) { + CQI = eNB_UE_stats->DL_cqi[0]; + } + } - // this assumes accumulated tpc - // make sure that we are only sending a tpc update once a frame, otherwise the control loop will freak out - int32_t framex10psubframe = UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_frame*10+UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_subframe; + return(CQI); +} - if (((framex10psubframe+10)<=(frame*10+subframe)) || //normal case - ((framex10psubframe>(frame*10+subframe)) && (((10240-framex10psubframe+frame*10+subframe)>=10)))) //frame wrap-around - if (flexran_get_p0_pucch_status(mod_id, UE_id, CC_id) == 1) { - flexran_update_p0_pucch(mod_id, UE_id, CC_id); - - UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_frame = frame; - UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_subframe = subframe; - if (normalized_rx_power>(target_rx_power+1)) { - tpc = 0; //-1 - tpc_accumulated--; - } else if (normalized_rx_power<(target_rx_power-1)) { - tpc = 2; //+1 - tpc_accumulated++; - } else { - tpc = 1; //0 - } - LOG_D(MAC,"[eNB %d] DLSCH scheduler: frame %d, subframe %d, harq_pid %d, tpc %d, accumulated %d, normalized/target rx power %d/%d\n", - mod_id, frame, subframe, harq_pid, tpc, - tpc_accumulated, normalized_rx_power, target_rx_power); - } // Po_PUCCH has been updated - else { - tpc = 1; //0 - } // time to do TPC update - else { - tpc = 1; //0 - } - for(i=0; i<PHY_vars_eNB_g[mod_id][CC_id]->frame_parms.N_RBG; i++) { - rballoc_sub[i] = UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][i]; - } +// This fuction sorts the UE in order their dlsch buffer and CQI +void _sort_UEs (module_id_t Mod_idP, + int frameP, + sub_frame_t subframeP) +{ - // Toggle NDI - LOG_D(MAC,"CC_id %d Frame %d, subframeP %d: Toggling Format1 NDI for UE %d (rnti %x/%d) oldNDI %d\n", - CC_id, frame, subframe, UE_id, - UE_list->UE_template[CC_id][UE_id].rnti,harq_pid, UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]); - UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]= 1 - UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; - ndi = UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; - - UE_list->UE_template[CC_id][UE_id].mcs[harq_pid] = mcs; - UE_list->UE_template[CC_id][UE_id].oldTPC[harq_pid] = tpc; - // Increase the pointer for the number of scheduled UEs - num_ues_added++; - ue_has_transmission = 1; - } else { // There is no data from RLC or MAC header, so don't schedule - ue_has_transmission = 0; - } - } // End of new scheduling - - // If we has transmission or retransmission - if (ue_has_transmission) { - switch (mac_xface->get_transmission_mode(mod_id, CC_id, rnti)) { - case 1: - case 2: - default: - dl_dci->has_res_alloc = 1; - dl_dci->res_alloc = 0; - dl_dci->has_vrb_format = 1; - dl_dci->vrb_format = PROTOCOL__FLEX_VRB_FORMAT__FLVRBF_LOCALIZED; - dl_dci->has_format = 1; - dl_dci->format = PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1; - dl_dci->has_rb_bitmap = 1; - dl_dci->rb_bitmap = allocate_prbs_sub(nb_rb, rballoc_sub); - dl_dci->has_rb_shift = 1; - dl_dci->rb_shift = 0; - dl_dci->n_ndi = 1; - dl_dci->ndi = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_ndi); - dl_dci->ndi[0] = ndi; - dl_dci->n_rv = 1; - dl_dci->rv = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_rv); - dl_dci->rv[0] = round & 3; - dl_dci->has_tpc = 1; - dl_dci->tpc = tpc; - dl_dci->n_mcs = 1; - dl_dci->mcs = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_mcs); - dl_dci->mcs[0] = mcs; - dl_dci->n_tbs_size = 1; - dl_dci->tbs_size = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_tbs_size); - dl_dci->tbs_size[0] = dci_tbs; - if (flexran_get_duplex_mode(mod_id, CC_id) == PROTOCOL__FLEX_DUPLEX_MODE__FLDM_TDD) { - dl_dci->has_dai = 1; - dl_dci->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; - } - break; - case 3: - dl_dci->has_res_alloc = 1; - dl_dci->res_alloc = 0; - dl_dci->has_vrb_format = 1; - dl_dci->vrb_format = PROTOCOL__FLEX_VRB_FORMAT__FLVRBF_LOCALIZED; - dl_dci->has_format = 1; - dl_dci->format = PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_2A; - dl_dci->has_rb_bitmap = 1; - dl_dci->rb_bitmap = allocate_prbs_sub(nb_rb, rballoc_sub); - dl_dci->has_rb_shift = 1; - dl_dci->rb_shift = 0; - dl_dci->n_ndi = 2; - dl_dci->ndi = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_ndi); - dl_dci->ndi[0] = ndi; - dl_dci->ndi[1] = ndi; - dl_dci->n_rv = 2; - dl_dci->rv = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_rv); - dl_dci->rv[0] = round & 3; - dl_dci->rv[1] = round & 3; - dl_dci->has_tpc = 1; - dl_dci->tpc = tpc; - dl_dci->n_mcs = 2; - dl_dci->mcs = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_mcs); - dl_dci->mcs[0] = mcs; - dl_dci->mcs[1] = mcs; - dl_dci->n_tbs_size = 2; - dl_dci->tbs_size = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_tbs_size); - dl_dci->tbs_size[0] = dci_tbs; - dl_dci->tbs_size[1] = dci_tbs; - if (flexran_get_duplex_mode(mod_id, CC_id) == PROTOCOL__FLEX_DUPLEX_MODE__FLDM_TDD) { - dl_dci->has_dai = 1; - dl_dci->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; - } - break; - case 4: - dl_dci->has_res_alloc = 1; - dl_dci->res_alloc = 0; - dl_dci->has_vrb_format = 1; - dl_dci->vrb_format = PROTOCOL__FLEX_VRB_FORMAT__FLVRBF_LOCALIZED; - dl_dci->has_format = 1; - dl_dci->format = PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_2A; - dl_dci->has_rb_bitmap = 1; - dl_dci->rb_bitmap = allocate_prbs_sub(nb_rb, rballoc_sub); - dl_dci->has_rb_shift = 1; - dl_dci->rb_shift = 0; - dl_dci->n_ndi = 2; - dl_dci->ndi = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_ndi); - dl_dci->ndi[0] = ndi; - dl_dci->ndi[1] = ndi; - dl_dci->n_rv = 2; - dl_dci->rv = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_rv); - dl_dci->rv[0] = round & 3; - dl_dci->rv[1] = round & 3; - dl_dci->has_tpc = 1; - dl_dci->tpc = tpc; - dl_dci->n_mcs = 2; - dl_dci->mcs = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_mcs); - dl_dci->mcs[0] = mcs; - dl_dci->mcs[1] = mcs; - dl_dci->n_tbs_size = 2; - dl_dci->tbs_size = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_tbs_size); - dl_dci->tbs_size[0] = dci_tbs; - dl_dci->tbs_size[1] = dci_tbs; - if (flexran_get_duplex_mode(mod_id, CC_id) == PROTOCOL__FLEX_DUPLEX_MODE__FLDM_TDD) { - dl_dci->has_dai = 1; - dl_dci->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; - } - break; - case 5: - dl_dci->has_res_alloc = 1; - dl_dci->res_alloc = 0; - dl_dci->has_vrb_format = 1; - dl_dci->vrb_format = PROTOCOL__FLEX_VRB_FORMAT__FLVRBF_LOCALIZED; - dl_dci->has_format = 1; - dl_dci->format = PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1D; - dl_dci->has_rb_bitmap = 1; - dl_dci->rb_bitmap = allocate_prbs_sub(nb_rb, rballoc_sub); - dl_dci->has_rb_shift = 1; - dl_dci->rb_shift = 0; - dl_dci->n_ndi = 1; - dl_dci->ndi = 1; - dl_dci->ndi[0] = ndi; - dl_dci->n_rv = 1; - dl_dci->rv = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_rv); - dl_dci->rv[0] = round & 3; - dl_dci->has_tpc = 1; - dl_dci->tpc = tpc; - dl_dci->n_mcs = 1; - dl_dci->mcs = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_mcs); - dl_dci->mcs[0] = mcs; - dl_dci->n_tbs_size = 1; - dl_dci->tbs_size = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_tbs_size); - dl_dci->tbs_size[0] = dci_tbs; - if (flexran_get_duplex_mode(mod_id, CC_id) == PROTOCOL__FLEX_DUPLEX_MODE__FLDM_TDD) { - dl_dci->has_dai = 1; - dl_dci->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; - } - - if(ue_sched_ctl->dl_pow_off[CC_id] == 2) { - ue_sched_ctl->dl_pow_off[CC_id] = 1; - } - - dl_dci->has_dl_power_offset = 1; - dl_dci->dl_power_offset = ue_sched_ctl->dl_pow_off[CC_id]; - dl_dci->has_precoding_info = 1; - dl_dci->precoding_info = 5; // Is this right?? - - break; - case 6: - dl_dci->has_res_alloc = 1; - dl_dci->res_alloc = 0; - dl_dci->has_vrb_format = 1; - dl_dci->vrb_format = PROTOCOL__FLEX_VRB_FORMAT__FLVRBF_LOCALIZED; - dl_dci->has_format = 1; - dl_dci->format = PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1D; - dl_dci->has_rb_bitmap = 1; - dl_dci->rb_bitmap = allocate_prbs_sub(nb_rb, rballoc_sub); - dl_dci->has_rb_shift = 1; - dl_dci->rb_shift = 0; - dl_dci->n_ndi = 1; - dl_dci->ndi = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_ndi); - dl_dci->ndi[0] = ndi; - dl_dci->n_rv = 1; - dl_dci->rv = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_rv); - dl_dci->rv[0] = round & 3; - dl_dci->has_tpc = 1; - dl_dci->tpc = tpc; - dl_dci->n_mcs = 1; - dl_dci->mcs = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_mcs); - dl_dci->mcs[0] = mcs; - if (flexran_get_duplex_mode(mod_id, CC_id) == PROTOCOL__FLEX_DUPLEX_MODE__FLDM_TDD) { - dl_dci->has_dai = 1; - dl_dci->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; - } - - dl_dci->has_dl_power_offset = 1; - dl_dci->dl_power_offset = ue_sched_ctl->dl_pow_off[CC_id]; - dl_dci->has_precoding_info = 1; - dl_dci->precoding_info = 5; // Is this right?? - break; - } - } - - if (flexran_get_duplex_mode(mod_id, CC_id) == PROTOCOL__FLEX_DUPLEX_MODE__FLDM_TDD) { - - /* TODO */ - //set_ul_DAI(mod_id, UE_id, CC_id, frame, subframe, frame_parms); - } - } // UE_id loop - } // CC_id loop - - // Add all the dl_data elements to the flexran message - (*dl_info)->dl_mac_config_msg->n_dl_ue_data = num_ues_added; - (*dl_info)->dl_mac_config_msg->dl_ue_data = (Protocol__FlexDlData **) malloc(sizeof(Protocol__FlexDlData *) * num_ues_added); - for (i = 0; i < num_ues_added; i++) { - (*dl_info)->dl_mac_config_msg->dl_ue_data[i] = dl_data[i]; - } - - stop_meas(&eNB->schedule_dlsch); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SCHEDULE_DLSCH,VCD_FUNCTION_OUT); -} - -// This function stores the downlink buffer for all the logical channels -void _store_dlsch_buffer (module_id_t Mod_id, - frame_t frameP, - sub_frame_t subframeP) -{ - - int UE_id,i; - rnti_t rnti; - mac_rlc_status_resp_t rlc_status; - UE_list_t *UE_list = &eNB_mac_inst[Mod_id].UE_list; - UE_TEMPLATE *UE_template; - - for (UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) { - - UE_template = &UE_list->UE_template[UE_PCCID(Mod_id,UE_id)][UE_id]; - - // clear logical channel interface variables - UE_template->dl_buffer_total = 0; - UE_template->dl_pdus_total = 0; - - for(i=0; i< MAX_NUM_LCID; i++) { - UE_template->dl_buffer_info[i]=0; - UE_template->dl_pdus_in_buffer[i]=0; - UE_template->dl_buffer_head_sdu_creation_time[i]=0; - UE_template->dl_buffer_head_sdu_remaining_size_to_send[i]=0; - } - - rnti = UE_RNTI(Mod_id,UE_id); - - for(i=0; i< MAX_NUM_LCID; i++) { // loop over all the logical channels - - rlc_status = mac_rlc_status_ind(Mod_id,rnti, Mod_id,frameP,ENB_FLAG_YES,MBMS_FLAG_NO,i,0 ); - UE_template->dl_buffer_info[i] = rlc_status.bytes_in_buffer; //storing the dlsch buffer for each logical channel - UE_template->dl_pdus_in_buffer[i] = rlc_status.pdus_in_buffer; - UE_template->dl_buffer_head_sdu_creation_time[i] = rlc_status.head_sdu_creation_time ; - UE_template->dl_buffer_head_sdu_creation_time_max = cmax(UE_template->dl_buffer_head_sdu_creation_time_max, - rlc_status.head_sdu_creation_time ); - UE_template->dl_buffer_head_sdu_remaining_size_to_send[i] = rlc_status.head_sdu_remaining_size_to_send; - UE_template->dl_buffer_head_sdu_is_segmented[i] = rlc_status.head_sdu_is_segmented; - UE_template->dl_buffer_total += UE_template->dl_buffer_info[i];//storing the total dlsch buffer - UE_template->dl_pdus_total += UE_template->dl_pdus_in_buffer[i]; - -#ifdef DEBUG_eNB_SCHEDULER - - /* note for dl_buffer_head_sdu_remaining_size_to_send[i] : - * 0 if head SDU has not been segmented (yet), else remaining size not already segmented and sent - */ - if (UE_template->dl_buffer_info[i]>0) - LOG_D(MAC, - "[eNB %d] Frame %d Subframe %d : RLC status for UE %d in LCID%d: total of %d pdus and size %d, head sdu queuing time %d, remaining size %d, is segmeneted %d \n", - Mod_id, frameP, subframeP, UE_id, - i, UE_template->dl_pdus_in_buffer[i],UE_template->dl_buffer_info[i], - UE_template->dl_buffer_head_sdu_creation_time[i], - UE_template->dl_buffer_head_sdu_remaining_size_to_send[i], - UE_template->dl_buffer_head_sdu_is_segmented[i] - ); - -#endif - - } - - //#ifdef DEBUG_eNB_SCHEDULER - if ( UE_template->dl_buffer_total>0) - LOG_D(MAC,"[eNB %d] Frame %d Subframe %d : RLC status for UE %d : total DL buffer size %d and total number of pdu %d \n", - Mod_id, frameP, subframeP, UE_id, - UE_template->dl_buffer_total, - UE_template->dl_pdus_total - ); - - //#endif - } -} - - -// This function returns the estimated number of RBs required by each UE for downlink scheduling -void _assign_rbs_required (module_id_t Mod_id, - frame_t frameP, - sub_frame_t subframe, - uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX], - int min_rb_unit[MAX_NUM_CCs]) -{ - - - rnti_t rnti; - uint16_t TBS = 0; - LTE_eNB_UE_stats *eNB_UE_stats[MAX_NUM_CCs]; - int UE_id,n,i,j,CC_id,pCCid,tmp; - UE_list_t *UE_list = &eNB_mac_inst[Mod_id].UE_list; - // UE_TEMPLATE *UE_template; - - // clear rb allocations across all CC_ids - for (UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) { - pCCid = UE_PCCID(Mod_id,UE_id); - rnti = UE_list->UE_template[pCCid][UE_id].rnti; - - //update CQI information across component carriers - for (n=0; n<UE_list->numactiveCCs[UE_id]; n++) { - CC_id = UE_list->ordered_CCids[n][UE_id]; - eNB_UE_stats[CC_id] = mac_xface->get_eNB_UE_stats(Mod_id,CC_id,rnti); - eNB_UE_stats[CC_id]->dlsch_mcs1=cqi_to_mcs[flexran_get_ue_wcqi(Mod_id, UE_id)]; - } - - // provide the list of CCs sorted according to MCS - for (i=0; i<UE_list->numactiveCCs[UE_id]; i++) { - for (j=i+1; j<UE_list->numactiveCCs[UE_id]; j++) { - DevAssert( j < MAX_NUM_CCs ); - - if (eNB_UE_stats[UE_list->ordered_CCids[i][UE_id]]->dlsch_mcs1 > - eNB_UE_stats[UE_list->ordered_CCids[j][UE_id]]->dlsch_mcs1) { - tmp = UE_list->ordered_CCids[i][UE_id]; - UE_list->ordered_CCids[i][UE_id] = UE_list->ordered_CCids[j][UE_id]; - UE_list->ordered_CCids[j][UE_id] = tmp; - } - } - } - - /* NN --> RK - * check the index of UE_template" - */ - if (UE_list->UE_template[pCCid][UE_id].dl_buffer_total> 0) { - LOG_D(MAC,"[preprocessor] assign RB for UE %d\n",UE_id); - - for (i=0; i<UE_list->numactiveCCs[UE_id]; i++) { - CC_id = UE_list->ordered_CCids[i][UE_id]; - eNB_UE_stats[CC_id] = mac_xface->get_eNB_UE_stats(Mod_id,CC_id,rnti); - - if (eNB_UE_stats[CC_id]->dlsch_mcs1==0) { - nb_rbs_required[CC_id][UE_id] = 4; // don't let the TBS get too small - } else { - nb_rbs_required[CC_id][UE_id] = min_rb_unit[CC_id]; - } - - TBS = mac_xface->get_TBS_DL(eNB_UE_stats[CC_id]->dlsch_mcs1,nb_rbs_required[CC_id][UE_id]); - - LOG_D(MAC,"[preprocessor] start RB assignement for UE %d CC_id %d dl buffer %d (RB unit %d, MCS %d, TBS %d) \n", - UE_id, CC_id, UE_list->UE_template[pCCid][UE_id].dl_buffer_total, - nb_rbs_required[CC_id][UE_id],eNB_UE_stats[CC_id]->dlsch_mcs1,TBS); - - /* calculating required number of RBs for each UE */ - while (TBS < UE_list->UE_template[pCCid][UE_id].dl_buffer_total) { - nb_rbs_required[CC_id][UE_id] += min_rb_unit[CC_id]; - - if (nb_rbs_required[CC_id][UE_id] > flexran_get_N_RB_DL(Mod_id, CC_id)) { - TBS = mac_xface->get_TBS_DL(eNB_UE_stats[CC_id]->dlsch_mcs1, flexran_get_N_RB_DL(Mod_id, CC_id)); - nb_rbs_required[CC_id][UE_id] = flexran_get_N_RB_DL(Mod_id, CC_id); - break; - } - - TBS = mac_xface->get_TBS_DL(eNB_UE_stats[CC_id]->dlsch_mcs1,nb_rbs_required[CC_id][UE_id]); - } // end of while - - LOG_D(MAC,"[eNB %d] Frame %d: UE %d on CC %d: RB unit %d, nb_required RB %d (TBS %d, mcs %d)\n", - Mod_id, frameP,UE_id, CC_id, min_rb_unit[CC_id], nb_rbs_required[CC_id][UE_id], TBS, eNB_UE_stats[CC_id]->dlsch_mcs1); - } - } - } -} - -// This function scans all CC_ids for a particular UE to find the maximum round index of its HARQ processes -int _maxround(module_id_t Mod_id,uint16_t rnti,int frame,sub_frame_t subframe,uint8_t ul_flag ) -{ - - uint8_t round,round_max=0,UE_id; - int CC_id; - UE_list_t *UE_list = &eNB_mac_inst[Mod_id].UE_list; - - for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { - - UE_id = find_UE_id(Mod_id,rnti); - round = UE_list->UE_sched_ctrl[UE_id].round[CC_id]; - if (round > round_max) { - round_max = round; - } - } - - return round_max; -} - -// This function scans all CC_ids for a particular UE to find the maximum DL CQI -int _maxcqi(module_id_t Mod_id,int32_t UE_id) -{ - - LTE_eNB_UE_stats *eNB_UE_stats = NULL; - UE_list_t *UE_list = &eNB_mac_inst[Mod_id].UE_list; - int CC_id,n; - int CQI = 0; - - for (n=0; n<UE_list->numactiveCCs[UE_id]; n++) { - CC_id = UE_list->ordered_CCids[n][UE_id]; - eNB_UE_stats = mac_xface->get_eNB_UE_stats(Mod_id,CC_id,UE_RNTI(Mod_id,UE_id)); - - if (eNB_UE_stats==NULL) { - mac_xface->macphy_exit("maxcqi: could not get eNB_UE_stats\n"); - return 0; // not reached - } - - if (eNB_UE_stats->DL_cqi[0] > CQI) { - CQI = eNB_UE_stats->DL_cqi[0]; - } - } - - return(CQI); -} - - -// This fuction sorts the UE in order their dlsch buffer and CQI -void _sort_UEs (module_id_t Mod_idP, - int frameP, - sub_frame_t subframeP) -{ - - - int UE_id1,UE_id2; - int pCC_id1,pCC_id2; - int cqi1,cqi2,round1,round2; - int i=0,ii=0;//,j=0; - rnti_t rnti1,rnti2; + int UE_id1,UE_id2; + int pCC_id1,pCC_id2; + int cqi1,cqi2,round1,round2; + int i=0,ii=0;//,j=0; + rnti_t rnti1,rnti2; UE_list_t *UE_list = &eNB_mac_inst[Mod_idP].UE_list; @@ -1029,35 +402,170 @@ void _sort_UEs (module_id_t Mod_idP, } } -// This function assigns pre-available RBS to each UE in specified sub-bands before scheduling is done -void _dlsch_scheduler_pre_processor (module_id_t Mod_id, - frame_t frameP, - sub_frame_t subframeP, - int N_RBG[MAX_NUM_CCs], - int *mbsfn_flag) -{ - - unsigned char rballoc_sub[MAX_NUM_CCs][N_RBG_MAX], harq_pid=0, total_ue_count; - unsigned char MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX]; - int UE_id, i; - unsigned char round = 0; - uint16_t ii,j; - uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; - uint16_t nb_rbs_required_remaining[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; - uint16_t nb_rbs_required_remaining_1[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; - uint16_t average_rbs_per_user[MAX_NUM_CCs] = {0}; - rnti_t rnti; - int min_rb_unit[MAX_NUM_CCs]; - uint16_t r1=0; - uint8_t CC_id; - UE_list_t *UE_list = &eNB_mac_inst[Mod_id].UE_list; - LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs] = {0}; +void _dlsch_scheduler_pre_processor_allocate (module_id_t Mod_id, + int UE_id, + uint8_t CC_id, + int N_RBG, + int transmission_mode, + int min_rb_unit, + uint8_t N_RB_DL, + uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX], + uint16_t nb_rbs_required_remaining[MAX_NUM_CCs][NUMBER_OF_UE_MAX], + unsigned char rballoc_sub[MAX_NUM_CCs][N_RBG_MAX], + unsigned char MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX]) { + int i; + UE_list_t *UE_list=&eNB_mac_inst[Mod_id].UE_list; + UE_sched_ctrl *ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; - int transmission_mode = 0; - UE_sched_ctrl *ue_sched_ctl; + for(i=0; i<N_RBG; i++) { - for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { - + if((rballoc_sub[CC_id][i] == 0) && + (ue_sched_ctl->rballoc_sub_UE[CC_id][i] == 0) && + (nb_rbs_required_remaining[CC_id][UE_id]>0) && + (ue_sched_ctl->pre_nb_available_rbs[CC_id] < nb_rbs_required[CC_id][UE_id])) { + + // if this UE is not scheduled for TM5 + if (ue_sched_ctl->dl_pow_off[CC_id] != 0 ) { + + if ((i == N_RBG-1) && ((N_RB_DL == 25) || (N_RB_DL == 50))) { + rballoc_sub[CC_id][i] = 1; + ue_sched_ctl->rballoc_sub_UE[CC_id][i] = 1; + MIMO_mode_indicator[CC_id][i] = 1; + if (transmission_mode == 5 ) { + ue_sched_ctl->dl_pow_off[CC_id] = 1; + } + nb_rbs_required_remaining[CC_id][UE_id] = nb_rbs_required_remaining[CC_id][UE_id] - min_rb_unit+1; + ue_sched_ctl->pre_nb_available_rbs[CC_id] = ue_sched_ctl->pre_nb_available_rbs[CC_id] + min_rb_unit - 1; + } else { + if (nb_rbs_required_remaining[CC_id][UE_id] >= min_rb_unit){ + rballoc_sub[CC_id][i] = 1; + ue_sched_ctl->rballoc_sub_UE[CC_id][i] = 1; + MIMO_mode_indicator[CC_id][i] = 1; + if (transmission_mode == 5 ) { + ue_sched_ctl->dl_pow_off[CC_id] = 1; + } + nb_rbs_required_remaining[CC_id][UE_id] = nb_rbs_required_remaining[CC_id][UE_id] - min_rb_unit; + ue_sched_ctl->pre_nb_available_rbs[CC_id] = ue_sched_ctl->pre_nb_available_rbs[CC_id] + min_rb_unit; + } + } + } // dl_pow_off[CC_id][UE_id] ! = 0 + } + } +} + +void _dlsch_scheduler_pre_processor_reset (int module_idP, + int UE_id, + uint8_t CC_id, + int frameP, + int subframeP, + int N_RBG, + uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX], + uint16_t nb_rbs_required_remaining[MAX_NUM_CCs][NUMBER_OF_UE_MAX], + uint16_t nb_rbs_allowed_slice[MAX_NUM_CCs][MAX_NUM_SLICES], + unsigned char rballoc_sub[MAX_NUM_CCs][N_RBG_MAX], + unsigned char MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX]) { + int i,j; + UE_list_t *UE_list=&eNB_mac_inst[module_idP].UE_list; + UE_sched_ctrl *ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; + uint8_t *vrb_map = eNB_mac_inst[module_idP].common_channels[CC_id].vrb_map; + int RBGsize = PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL/N_RBG; +#ifdef SF05_LIMIT + //int subframe05_limit=0; + int sf05_upper=-1,sf05_lower=-1; +#endif + // LTE_eNB_UE_stats *eNB_UE_stats = mac_xface->get_eNB_UE_stats(module_idP,CC_id,rnti); + + flexran_update_TA(module_idP, UE_id, CC_id); + + if (UE_id==0) { + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_TIMING_ADVANCE,ue_sched_ctl->ta_update); + } + nb_rbs_required[CC_id][UE_id]=0; + ue_sched_ctl->pre_nb_available_rbs[CC_id] = 0; + ue_sched_ctl->dl_pow_off[CC_id] = 2; + nb_rbs_required_remaining[CC_id][UE_id] = 0; + for (i=0; i<n_active_slices;i++) + nb_rbs_allowed_slice[CC_id][i] = 0; +#ifdef SF05_LIMIT + switch (N_RBG) { + case 6: + sf05_lower=0; + sf05_upper=5; + break; + case 8: + sf05_lower=2; + sf05_upper=5; + break; + case 13: + sf05_lower=4; + sf05_upper=7; + break; + case 17: + sf05_lower=7; + sf05_upper=9; + break; + case 25: + sf05_lower=11; + sf05_upper=13; + break; + } +#endif + // Initialize Subbands according to VRB map + for (i=0; i<N_RBG; i++) { + ue_sched_ctl->rballoc_sub_UE[CC_id][i] = 0; + rballoc_sub[CC_id][i] = 0; +#ifdef SF05_LIMIT + // for avoiding 6+ PRBs around DC in subframe 0-5 (avoid excessive errors) + + if ((subframeP==0 || subframeP==5) && + (i>=sf05_lower && i<=sf05_upper)) + rballoc_sub[CC_id][i]=1; +#endif + // for SI-RNTI,RA-RNTI and P-RNTI allocations + for (j=0;j<RBGsize;j++) { + if (vrb_map[j+(i*RBGsize)]!=0) { + rballoc_sub[CC_id][i] = 1; + LOG_D(MAC,"Frame %d, subframe %d : vrb %d allocated\n",frameP,subframeP,j+(i*RBGsize)); + break; + } + } + LOG_D(MAC,"Frame %d Subframe %d CC_id %d RBG %i : rb_alloc %d\n",frameP,subframeP,CC_id,i,rballoc_sub[CC_id][i]); + MIMO_mode_indicator[CC_id][i] = 2; + } +} + +// This function assigns pre-available RBS to each UE in specified sub-bands before scheduling is done +void _dlsch_scheduler_pre_processor (module_id_t Mod_id, + int slice_id, + frame_t frameP, + sub_frame_t subframeP, + int N_RBG[MAX_NUM_CCs], + int *mbsfn_flag) +{ + + unsigned char rballoc_sub[MAX_NUM_CCs][N_RBG_MAX], harq_pid=0, total_ue_count; + unsigned char MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX]; + int UE_id, i; + unsigned char round = 0; + uint16_t ii,j; + uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; + uint16_t nb_rbs_allowed_slice[MAX_NUM_CCs][MAX_NUM_SLICES]; + uint16_t nb_rbs_required_remaining[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; + uint16_t nb_rbs_required_remaining_1[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; + uint16_t average_rbs_per_user[MAX_NUM_CCs] = {0}; + rnti_t rnti; + int min_rb_unit[MAX_NUM_CCs]; + uint16_t r1=0; + uint8_t CC_id; + UE_list_t *UE_list = &eNB_mac_inst[Mod_id].UE_list; + LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs] = {0}; + + int transmission_mode = 0; + UE_sched_ctrl *ue_sched_ctl; + + + for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { + if (mbsfn_flag[CC_id]>0) // If this CC is allocated for MBSFN skip it here continue; @@ -1070,7 +578,8 @@ void _dlsch_scheduler_pre_processor (module_id_t Mod_id, UE_id = i; // Initialize scheduling information for all active UEs - + //if (flexran_slice_member(UE_id, slice_id) == 0) + //continue; _dlsch_scheduler_pre_processor_reset(Mod_id, UE_id, CC_id, @@ -1079,6 +588,7 @@ void _dlsch_scheduler_pre_processor (module_id_t Mod_id, N_RBG[CC_id], nb_rbs_required, nb_rbs_required_remaining, + nb_rbs_allowed_slice, rballoc_sub, MIMO_mode_indicator); @@ -1086,10 +596,10 @@ void _dlsch_scheduler_pre_processor (module_id_t Mod_id, } // Store the DLSCH buffer for each logical channel - _store_dlsch_buffer (Mod_id,frameP,subframeP); + _store_dlsch_buffer (Mod_id,slice_id,frameP,subframeP); // Calculate the number of RBs required by each UE on the basis of logical channel's buffer - _assign_rbs_required (Mod_id,frameP,subframeP,nb_rbs_required,min_rb_unit); + _assign_rbs_required (Mod_id,slice_id, frameP,subframeP,nb_rbs_required,nb_rbs_allowed_slice,min_rb_unit); // Sorts the user on the basis of dlsch logical channel buffer and CQI _sort_UEs (Mod_id,frameP,subframeP); @@ -1104,7 +614,10 @@ void _dlsch_scheduler_pre_processor (module_id_t Mod_id, if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) continue; UE_id = i; - + + if (flexran_slice_member(UE_id, slice_id) == 0) + continue; + // if there is no available harq_process, skip the UE if (UE_list->UE_sched_ctrl[UE_id].harq_pid[CC_id]<0) continue; @@ -1112,6 +625,7 @@ void _dlsch_scheduler_pre_processor (module_id_t Mod_id, for (ii=0; ii < UE_num_active_CC(UE_list,UE_id); ii++) { CC_id = UE_list->ordered_CCids[ii][UE_id]; ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; + ue_sched_ctl->max_allowed_rbs[CC_id]=nb_rbs_allowed_slice[CC_id][slice_id]; flexran_get_harq(Mod_id, CC_id, UE_id, frameP, subframeP, &harq_pid, &round); average_rbs_per_user[CC_id]=0; @@ -1142,8 +656,8 @@ void _dlsch_scheduler_pre_processor (module_id_t Mod_id, if (total_ue_count == 0) { average_rbs_per_user[CC_id] = 0; - } else if( (min_rb_unit[CC_id] * total_ue_count) <= (frame_parms[CC_id]->N_RB_DL) ) { - average_rbs_per_user[CC_id] = (uint16_t) floor(frame_parms[CC_id]->N_RB_DL/total_ue_count); + } else if( (min_rb_unit[CC_id] * total_ue_count) <= nb_rbs_allowed_slice[CC_id][slice_id] ) { + average_rbs_per_user[CC_id] = (uint16_t) floor(nb_rbs_allowed_slice[CC_id][slice_id]/total_ue_count); } else { average_rbs_per_user[CC_id] = min_rb_unit[CC_id]; // consider the total number of use that can be scheduled UE } @@ -1154,7 +668,10 @@ void _dlsch_scheduler_pre_processor (module_id_t Mod_id, // extend nb_rbs_required to capture per LCID RB required for(i=UE_list->head; i>=0; i=UE_list->next[i]) { rnti = UE_RNTI(Mod_id,i); - + + if (flexran_slice_member(i, slice_id) == 0) + continue; + for (ii=0; ii<UE_num_active_CC(UE_list,i); ii++) { CC_id = UE_list->ordered_CCids[ii][i]; @@ -1174,6 +691,10 @@ void _dlsch_scheduler_pre_processor (module_id_t Mod_id, for(r1=0; r1<2; r1++) { for(i=UE_list->head; i>=0; i=UE_list->next[i]) { + + if (flexran_slice_member(i, slice_id) == 0) + continue; + for (ii=0; ii<UE_num_active_CC(UE_list,i); ii++) { CC_id = UE_list->ordered_CCids[ii][i]; @@ -1199,8 +720,11 @@ void _dlsch_scheduler_pre_processor (module_id_t Mod_id, if (total_ue_count > 0 ) { for(i=UE_list->head; i>=0; i=UE_list->next[i]) { UE_id = i; - - for (ii=0; ii<UE_num_active_CC(UE_list,UE_id); ii++) { + + if (flexran_slice_member(UE_id, slice_id) == 0) + continue; + + for (ii=0; ii<UE_num_active_CC(UE_list,UE_id); ii++) { CC_id = UE_list->ordered_CCids[ii][UE_id]; ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; flexran_get_harq(Mod_id, CC_id, UE_id, frameP, subframeP, &harq_pid, &round); @@ -1239,6 +763,9 @@ void _dlsch_scheduler_pre_processor (module_id_t Mod_id, for(i=UE_list->head; i>=0; i=UE_list->next[i]) { UE_id = i; ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; + + if (flexran_slice_member(UE_id, slice_id) == 0) + continue; for (ii=0; ii<UE_num_active_CC(UE_list,UE_id); ii++) { CC_id = UE_list->ordered_CCids[ii][UE_id]; @@ -1255,7 +782,8 @@ void _dlsch_scheduler_pre_processor (module_id_t Mod_id, } //PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[UE_id].pre_nb_available_rbs = pre_nb_available_rbs[CC_id][UE_id]; - LOG_D(MAC,"Total RBs allocated for UE%d = %d\n",UE_id,ue_sched_ctl->pre_nb_available_rbs[CC_id]); + LOG_D(MAC,"[eNB %d][SLICE %d] Total RBs allocated for UE%d = %d\n", + Mod_id, slice_id, UE_id,ue_sched_ctl->pre_nb_available_rbs[CC_id]); } } } @@ -1263,134 +791,944 @@ void _dlsch_scheduler_pre_processor (module_id_t Mod_id, #define SF05_LIMIT 1 -void _dlsch_scheduler_pre_processor_reset (int module_idP, - int UE_id, - uint8_t CC_id, - int frameP, - int subframeP, - int N_RBG, - uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX], - uint16_t nb_rbs_required_remaining[MAX_NUM_CCs][NUMBER_OF_UE_MAX], - unsigned char rballoc_sub[MAX_NUM_CCs][N_RBG_MAX], - unsigned char MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX]) { - int i,j; - UE_list_t *UE_list=&eNB_mac_inst[module_idP].UE_list; - UE_sched_ctrl *ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; - rnti_t rnti = UE_RNTI(module_idP,UE_id); - uint8_t *vrb_map = eNB_mac_inst[module_idP].common_channels[CC_id].vrb_map; - int RBGsize = PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL/N_RBG; -#ifdef SF05_LIMIT - //int subframe05_limit=0; - int sf05_upper=-1,sf05_lower=-1; -#endif - LTE_eNB_UE_stats *eNB_UE_stats = mac_xface->get_eNB_UE_stats(module_idP,CC_id,rnti); - - flexran_update_TA(module_idP, UE_id, CC_id); +/* + * Main scheduling functions to support slicing + * + */ - if (UE_id==0) { - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_TIMING_ADVANCE,ue_sched_ctl->ta_update); - } - nb_rbs_required[CC_id][UE_id]=0; - ue_sched_ctl->pre_nb_available_rbs[CC_id] = 0; - ue_sched_ctl->dl_pow_off[CC_id] = 2; - nb_rbs_required_remaining[CC_id][UE_id] = 0; +void +flexran_schedule_ue_spec_default(mid_t mod_id, + uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + Protocol__FlexranMessage **dl_info) +//------------------------------------------------------------------------------ +{ + int i=0; + + flexran_agent_mac_create_empty_dl_config(mod_id, dl_info); + + for (i = 0; i < n_active_slices; i++) { + + // Load any updated functions + if (update_dl_scheduler[i] > 0 ) { + slice_sched[i] = dlsym(NULL, dl_scheduler_type[i]); + update_dl_scheduler[i] = 0; + update_dl_scheduler_current[i] = 0; + slice_percentage_current[i]= slice_percentage[i]; + total_slice_percentage+=slice_percentage[i]; + LOG_N(MAC,"update dl scheduler slice %d\n", i); + } + + // check if the number of slices has changed, and log + if (n_active_slices_current != n_active_slices ){ + if ((n_active_slices > 0) && (n_active_slices <= MAX_NUM_SLICES)) { + LOG_N(MAC,"[eNB %d]frame %d subframe %d: number of active slices has changed: %d-->%d\n", + mod_id, frame, subframe, n_active_slices_current, n_active_slices); + n_active_slices_current = n_active_slices; + } else { + LOG_W(MAC,"invalid number of slices %d, revert to the previous value %d\n",n_active_slices, n_active_slices_current); + n_active_slices = n_active_slices_current; + } + } + + // check if the slice rb share has changed, and log the console + if (slice_percentage_current[i] != slice_percentage[i]){ + if ((slice_percentage[i] >= 0.0) && (slice_percentage[i] <= 1.0)){ + if ((total_slice_percentage - slice_percentage_current[i] + slice_percentage[i]) <= 1.0) { + total_slice_percentage=total_slice_percentage - slice_percentage_current[i] + slice_percentage[i]; + LOG_N(MAC,"[eNB %d][SLICE %d] frame %d subframe %d: total percentage %f, slice RB percentage has changed: %f-->%f\n", + mod_id, i, frame, subframe, total_slice_percentage, slice_percentage_current[i], slice_percentage[i]); + slice_percentage_current[i] = slice_percentage[i]; + } else { + LOG_W(MAC,"[eNB %d][SLICE %d] invalid total RB share (%f->%f), revert the previous value (%f->%f)\n", + mod_id,i, + total_slice_percentage, + total_slice_percentage - slice_percentage_current[i] + slice_percentage[i], + slice_percentage[i],slice_percentage_current[i]); + slice_percentage[i]= slice_percentage_current[i]; -#ifdef SF05_LIMIT - switch (N_RBG) { - case 6: - sf05_lower=0; - sf05_upper=5; - break; - case 8: - sf05_lower=2; - sf05_upper=5; - break; - case 13: - sf05_lower=4; - sf05_upper=7; - break; - case 17: - sf05_lower=7; - sf05_upper=9; - break; - case 25: - sf05_lower=11; - sf05_upper=13; - break; - } -#endif - // Initialize Subbands according to VRB map - for (i=0; i<N_RBG; i++) { - ue_sched_ctl->rballoc_sub_UE[CC_id][i] = 0; - rballoc_sub[CC_id][i] = 0; -#ifdef SF05_LIMIT - // for avoiding 6+ PRBs around DC in subframe 0-5 (avoid excessive errors) + } + } else { + LOG_W(MAC,"[eNB %d][SLICE %d] invalid slice RB share, revert the previous value (%f->%f)\n",mod_id, i, slice_percentage[i],slice_percentage_current[i]); + slice_percentage[i]= slice_percentage_current[i]; - if ((subframeP==0 || subframeP==5) && - (i>=sf05_lower && i<=sf05_upper)) - rballoc_sub[CC_id][i]=1; -#endif - // for SI-RNTI,RA-RNTI and P-RNTI allocations - for (j=0;j<RBGsize;j++) { - if (vrb_map[j+(i*RBGsize)]!=0) { - rballoc_sub[CC_id][i] = 1; - LOG_D(MAC,"Frame %d, subframe %d : vrb %d allocated\n",frameP,subframeP,j+(i*RBGsize)); - break; } } - LOG_D(MAC,"Frame %d Subframe %d CC_id %d RBG %i : rb_alloc %d\n",frameP,subframeP,CC_id,i,rballoc_sub[CC_id][i]); - MIMO_mode_indicator[CC_id][i] = 2; + + // check if the slice max MCS, and log the console + if (slice_maxmcs_current[i] != slice_maxmcs[i]){ + if ((slice_maxmcs[i] >= 0) && (slice_maxmcs[i] < 29)){ + LOG_N(MAC,"[eNB %d][SLICE %d] frame %d subframe %d: slice MAX MCS has changed: %d-->%d\n", + mod_id, i, frame, subframe, slice_maxmcs_current[i], slice_maxmcs[i]); + slice_maxmcs_current[i] = slice_maxmcs[i]; + } else { + LOG_W(MAC,"[eNB %d][SLICE %d] invalid slice max mcs %d, revert the previous value %d\n",mod_id, i, slice_percentage[i],slice_percentage[i]); + slice_maxmcs[i]= slice_maxmcs_current[i]; + } + } + + // check if a new scheduler, and log the console + if (update_dl_scheduler_current[i] != update_dl_scheduler[i]){ + LOG_N(MAC,"[eNB %d][SLICE %d] frame %d subframe %d: DL scheduler for this slice is updated: %s \n", + mod_id, i, frame, subframe, dl_scheduler_type[i]); + update_dl_scheduler_current[i] = update_dl_scheduler[i]; + } + + // Run each enabled slice-specific schedulers one by one + //LOG_N(MAC,"[eNB %d]frame %d subframe %d slice %d: calling the scheduler\n", mod_id, frame, subframe,i); + slice_sched[i](mod_id, i, frame, subframe, mbsfn_flag,dl_info); + } + } +uint16_t flexran_nb_rbs_allowed_slice(float rb_percentage, int total_rbs){ + return (uint16_t) floor(rb_percentage * total_rbs); +} -void _dlsch_scheduler_pre_processor_allocate (module_id_t Mod_id, - int UE_id, - uint8_t CC_id, - int N_RBG, - int transmission_mode, - int min_rb_unit, - uint8_t N_RB_DL, - uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX], - uint16_t nb_rbs_required_remaining[MAX_NUM_CCs][NUMBER_OF_UE_MAX], - unsigned char rballoc_sub[MAX_NUM_CCs][N_RBG_MAX], - unsigned char MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX]) { +int flexran_slice_maxmcs(int slice_id) { + return slice_maxmcs[slice_id]; +} + +int flexran_slice_member(int UE_id, int slice_id){ + // group membership definition + int slice_member = 0 ; + + if ((slice_id < 0) || (slice_id > n_active_slices)) + LOG_W(MAC,"out of range slice id %d\n",slice_id); + + switch (slicing_strategy) { + case SLICE_MASK: + switch (slice_id){ + case 0: + if (SLICE0_MASK&UE_id){ + slice_member=1; + } + break; + case 1: + if (SLICE1_MASK&UE_id){ + slice_member=1; + } + break; + case 2: + if (SLICE2_MASK&UE_id){ + slice_member=1; + } + break; + case 3: + if (SLICE3_MASK&UE_id){ + slice_member=1; + } + break; + default : + LOG_W(MAC,"unknown slice_id %d\n", slice_id); + break; + + } + break; + case UEID_TO_SLICEID: + default: + if ((UE_id % n_active_slices) == slice_id){ + slice_member= 1; // this ue is a member of this slice + } + break; + } + + return slice_member; +} +/* more aggressive rb and mcs allocation with medium priority and the traffic qci */ +void +flexran_schedule_ue_spec_embb(mid_t mod_id, + int slice_id, + uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + Protocol__FlexranMessage **dl_info) + +{ + flexran_schedule_ue_spec_common(mod_id, + slice_id, + frame, + subframe, + mbsfn_flag, + dl_info); + +} +/* more conservative mcs allocation with high priority and the traffic qci */ +void +flexran_schedule_ue_spec_urllc(mid_t mod_id, + int slice_id, + uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + Protocol__FlexranMessage **dl_info) + +{ + flexran_schedule_ue_spec_common(mod_id, + slice_id, + frame, + subframe, + mbsfn_flag, + dl_info); + +} +/* constant rb allocation with low mcs with low priority and given the UE capabilities */ +void +flexran_schedule_ue_spec_mmtc(mid_t mod_id, + int slice_id, + uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + Protocol__FlexranMessage **dl_info) + +{ + + flexran_schedule_ue_spec_common(mod_id, + slice_id, + frame, + subframe, + mbsfn_flag, + dl_info); + +} +/* regular rb and mcs allocation with low priority */ +void +flexran_schedule_ue_spec_be(mid_t mod_id, + int slice_id, + uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + Protocol__FlexranMessage **dl_info) + +{ + + flexran_schedule_ue_spec_common(mod_id, + slice_id, + frame, + subframe, + mbsfn_flag, + dl_info); + +} + +//------------------------------------------------------------------------------ +void +flexran_schedule_ue_spec_common(mid_t mod_id, + int slice_id, + uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + Protocol__FlexranMessage **dl_info) +//------------------------------------------------------------------------------ +{ + uint8_t CC_id; + int UE_id; + int N_RBG[MAX_NUM_CCs]; + unsigned char aggregation; + mac_rlc_status_resp_t rlc_status; + unsigned char header_len = 0, ta_len = 0; + uint16_t nb_rb, nb_rb_temp, total_nb_available_rb[MAX_NUM_CCs], nb_available_rb; + uint16_t TBS, j, rnti; + unsigned char round = 0; + unsigned char harq_pid = 0; + uint16_t sdu_length_total = 0; + int mcs, mcs_tmp; + uint16_t min_rb_unit[MAX_NUM_CCs]; + eNB_MAC_INST *eNB = &eNB_mac_inst[mod_id]; + /* TODO: Must move the helper structs to scheduler implementation */ + UE_list_t *UE_list = &eNB->UE_list; + int32_t normalized_rx_power, target_rx_power; + int32_t tpc = 1; + static int32_t tpc_accumulated=0; + UE_sched_ctrl *ue_sched_ctl; + LTE_eNB_UE_stats *eNB_UE_stats = NULL; + + Protocol__FlexDlData *dl_data[NUM_MAX_UE]; + int num_ues_added = 0; + int channels_added = 0; + + Protocol__FlexDlDci *dl_dci; + Protocol__FlexRlcPdu *rlc_pdus[11]; + uint32_t ce_flags = 0; + + uint8_t rballoc_sub[25]; int i; - UE_list_t *UE_list=&eNB_mac_inst[Mod_id].UE_list; - UE_sched_ctrl *ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; + uint32_t data_to_request; + uint32_t dci_tbs; + uint8_t ue_has_transmission = 0; + uint32_t ndi; + + flexran_agent_mac_create_empty_dl_config(mod_id, dl_info); + + if (UE_list->head==-1) { + return; + } + + start_meas(&eNB->schedule_dlsch); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SCHEDULE_DLSCH,VCD_FUNCTION_IN); - for(i=0; i<N_RBG; i++) { + //weight = get_ue_weight(module_idP,UE_id); + aggregation = 2; // set to the maximum aggregation level + + for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { + min_rb_unit[CC_id] = get_min_rb_unit(mod_id, CC_id); + // get number of PRBs less those used by common channels + total_nb_available_rb[CC_id] = flexran_get_N_RB_DL(mod_id, CC_id); + for (i=0;i < flexran_get_N_RB_DL(mod_id, CC_id); i++) + if (eNB->common_channels[CC_id].vrb_map[i] != 0) + total_nb_available_rb[CC_id]--; + + N_RBG[CC_id] = flexran_get_N_RBG(mod_id, CC_id); + + // store the global enb stats: + eNB->eNB_stats[CC_id].num_dlactive_UEs = UE_list->num_UEs; + eNB->eNB_stats[CC_id].available_prbs = total_nb_available_rb[CC_id]; + eNB->eNB_stats[CC_id].total_available_prbs += total_nb_available_rb[CC_id]; + eNB->eNB_stats[CC_id].dlsch_bytes_tx=0; + eNB->eNB_stats[CC_id].dlsch_pdus_tx=0; + } + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_PREPROCESSOR,VCD_FUNCTION_IN); + + start_meas(&eNB->schedule_dlsch_preprocessor); + _dlsch_scheduler_pre_processor(mod_id, + slice_id, + frame, + subframe, + N_RBG, + mbsfn_flag); + stop_meas(&eNB->schedule_dlsch_preprocessor); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_PREPROCESSOR,VCD_FUNCTION_OUT); + + for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { + LOG_D(MAC, "doing schedule_ue_spec for CC_id %d\n",CC_id); + + if (mbsfn_flag[CC_id]>0) + continue; + + for (UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) { + rnti = flexran_get_ue_crnti(mod_id, UE_id); + eNB_UE_stats = mac_xface->get_eNB_UE_stats(module_idP,CC_id,rnti); + ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; + + if (eNB_UE_stats==NULL) { + LOG_D(MAC,"[eNB] Cannot find eNB_UE_stats\n"); + // mac_xface->macphy_exit("[MAC][eNB] Cannot find eNB_UE_stats\n"); + continue; + } + + if (flexran_slice_member(UE_id, slice_id) == 0) + continue; + + if (rnti==NOT_A_RNTI) { + LOG_D(MAC,"Cannot find rnti for UE_id %d (num_UEs %d)\n", UE_id,UE_list->num_UEs); + // mac_xface->macphy_exit("Cannot find rnti for UE_id"); + continue; + } + + if (flexran_get_ue_crnti(mod_id, UE_id) == NOT_A_RNTI) { + LOG_D(MAC,"[eNB] Cannot find UE\n"); + // mac_xface->macphy_exit("[MAC][eNB] Cannot find eNB_UE_stats\n"); + continue; + } + + switch(mac_xface->get_transmission_mode(module_idP,CC_id,rnti)){ + case 1: + case 2: + case 7: + aggregation = get_aggregation(get_bw_index(module_idP,CC_id), + eNB_UE_stats->DL_cqi[0], + format1); + break; + case 3: + aggregation = get_aggregation(get_bw_index(module_idP,CC_id), + eNB_UE_stats->DL_cqi[0], + format2A); + break; + default: + LOG_W(MAC,"Unsupported transmission mode %d\n", mac_xface->get_transmission_mode(module_idP,CC_id,rnti)); + aggregation = 2; + } + + if ((ue_sched_ctl->pre_nb_available_rbs[CC_id] == 0) || // no RBs allocated + CCE_allocation_infeasible(mod_id, CC_id, 0, subframe, aggregation, rnti)) { + LOG_D(MAC,"[eNB %d] Frame %d : no RB allocated for UE %d on CC_id %d: continue \n", + mod_id, frame, UE_id, CC_id); + //if(mac_xface->get_transmission_mode(module_idP,rnti)==5) + continue; //to next user (there might be rbs availiable for other UEs in TM5 + // else + // break; + } + + if (flexran_get_duplex_mode(mod_id, CC_id) == PROTOCOL__FLEX_DUPLEX_MODE__FLDM_TDD) { + set_ue_dai (subframe, + flexran_get_subframe_assignment(mod_id, CC_id), + UE_id, + CC_id, + UE_list); + //TODO: update UL DAI after DLSCH scheduling + //set_ul_DAI(mod_id, UE_id, CC_id, frame, subframe,frame_parms); + } + + channels_added = 0; + + // After this point all the UEs will be scheduled + dl_data[num_ues_added] = (Protocol__FlexDlData *) malloc(sizeof(Protocol__FlexDlData)); + protocol__flex_dl_data__init(dl_data[num_ues_added]); + dl_data[num_ues_added]->has_rnti = 1; + dl_data[num_ues_added]->rnti = rnti; + dl_data[num_ues_added]->n_rlc_pdu = 0; + dl_data[num_ues_added]->has_serv_cell_index = 1; + dl_data[num_ues_added]->serv_cell_index = CC_id; + + nb_available_rb = ue_sched_ctl->pre_nb_available_rbs[CC_id]; + flexran_get_harq(mod_id, CC_id, UE_id, frame, subframe, &harq_pid, &round); + sdu_length_total=0; + mcs = cqi_to_mcs[flexran_get_ue_wcqi(mod_id, UE_id)]; + mcs = cmin(mcs,flexran_slice_maxmcs(slice_id)); +#ifdef EXMIMO + + if (mac_xface->get_transmission_mode(mod_id, CC_id, rnti) == 5) { + mcs = cqi_to_mcs[flexran_get_ue_wcqi(mod_id, UE_id)]; + mcs = cmin(mcs,16); + } + +#endif + + // initializing the rb allocation indicator for each UE + for(j = 0; j < flexran_get_N_RBG(mod_id, CC_id); j++) { + UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = 0; + rballoc_sub[j] = 0; + } + + /* LOG_D(MAC,"[eNB %d] Frame %d: Scheduling UE %d on CC_id %d (rnti %x, harq_pid %d, round %d, rb %d, cqi %d, mcs %d, rrc %d)\n", */ + /* mod_id, frame, UE_id, CC_id, rnti, harq_pid, round, nb_available_rb, */ + /* eNB_UE_stats->DL_cqi[0], mcs, */ + /* UE_list->eNB_UE_stats[CC_id][UE_id].rrc_status); */ + + dl_dci = (Protocol__FlexDlDci*) malloc(sizeof(Protocol__FlexDlDci)); + protocol__flex_dl_dci__init(dl_dci); + dl_data[num_ues_added]->dl_dci = dl_dci; + + + dl_dci->has_rnti = 1; + dl_dci->rnti = rnti; + dl_dci->has_harq_process = 1; + dl_dci->harq_process = harq_pid; + + /* process retransmission */ + + if (round > 0) { + + if (flexran_get_duplex_mode(mod_id, CC_id) == PROTOCOL__FLEX_DUPLEX_MODE__FLDM_TDD) { + UE_list->UE_template[CC_id][UE_id].DAI++; + update_ul_dci(mod_id, CC_id, rnti, UE_list->UE_template[CC_id][UE_id].DAI); + LOG_D(MAC,"DAI update: CC_id %d subframeP %d: UE %d, DAI %d\n", + CC_id, subframe,UE_id,UE_list->UE_template[CC_id][UE_id].DAI); + } + + mcs = UE_list->UE_template[CC_id][UE_id].mcs[harq_pid]; + + // get freq_allocation + nb_rb = UE_list->UE_template[CC_id][UE_id].nb_rb[harq_pid]; + + /*TODO: Must add this to FlexRAN agent API */ + dci_tbs = mac_xface->get_TBS_DL(mcs, nb_rb); + + if (nb_rb <= nb_available_rb) { + + if(nb_rb == ue_sched_ctl->pre_nb_available_rbs[CC_id]) { + for(j = 0; j < flexran_get_N_RBG(mod_id, CC_id); j++) { // for indicating the rballoc for each sub-band + UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = ue_sched_ctl->rballoc_sub_UE[CC_id][j]; + } + } else { + nb_rb_temp = nb_rb; + j = 0; + + while((nb_rb_temp > 0) && (j < flexran_get_N_RBG(mod_id, CC_id))) { + if(ue_sched_ctl->rballoc_sub_UE[CC_id][j] == 1) { + UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = ue_sched_ctl->rballoc_sub_UE[CC_id][j]; + + if((j == flexran_get_N_RBG(mod_id, CC_id) - 1) && + ((flexran_get_N_RB_DL(mod_id, CC_id) == 25)|| + (flexran_get_N_RB_DL(mod_id, CC_id) == 50))) { + nb_rb_temp = nb_rb_temp - min_rb_unit[CC_id]+1; + } else { + nb_rb_temp = nb_rb_temp - min_rb_unit[CC_id]; + } + } + j = j + 1; + } + } + + nb_available_rb -= nb_rb; + PHY_vars_eNB_g[mod_id][CC_id]->mu_mimo_mode[UE_id].pre_nb_available_rbs = nb_rb; + PHY_vars_eNB_g[mod_id][CC_id]->mu_mimo_mode[UE_id].dl_pow_off = ue_sched_ctl->dl_pow_off[CC_id]; + + for(j=0; j < flexran_get_N_RBG(mod_id, CC_id); j++) { + PHY_vars_eNB_g[mod_id][CC_id]->mu_mimo_mode[UE_id].rballoc_sub[j] = UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j]; + rballoc_sub[j] = UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j]; + } + + // Keep the old NDI, do not toggle + ndi = UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; + tpc = UE_list->UE_template[CC_id][UE_id].oldTPC[harq_pid]; + UE_list->UE_template[CC_id][UE_id].mcs[harq_pid] = mcs; + + ue_has_transmission = 1; + num_ues_added++; + } else { + LOG_D(MAC,"[eNB %d] Frame %d CC_id %d : don't schedule UE %d, its retransmission takes more resources than we have\n", + mod_id, frame, CC_id, UE_id); + ue_has_transmission = 0; + } + //End of retransmission + } else { /* This is a potentially new SDU opportunity */ + rlc_status.bytes_in_buffer = 0; + // Now check RLC information to compute number of required RBs + // get maximum TBS size for RLC request + //TBS = mac_xface->get_TBS(eNB_UE_stats->DL_cqi[0]<<1,nb_available_rb); + TBS = mac_xface->get_TBS_DL(mcs, nb_available_rb); + dci_tbs = TBS; + + // check first for RLC data on DCCH + // add the length for all the control elements (timing adv, drx, etc) : header + payload + + ta_len = (ue_sched_ctl->ta_update!=0) ? 2 : 0; + + dl_data[num_ues_added]->n_ce_bitmap = 2; + dl_data[num_ues_added]->ce_bitmap = (uint32_t *) malloc(sizeof(uint32_t) * 2); + + if (ta_len > 0) { + ce_flags |= PROTOCOL__FLEX_CE_TYPE__FLPCET_TA; + } + + /*TODO: Add other flags if DRX and other CE are required*/ + + // Add the control element flags to the flexran message + dl_data[num_ues_added]->ce_bitmap[0] = ce_flags; + dl_data[num_ues_added]->ce_bitmap[1] = ce_flags; + + // TODO : Need to prioritize DRBs + // Loop through the UE logical channels (DCCH, DCCH1, DTCH for now) + for (j = 1; j < NB_RB_MAX; j++) { + header_len+=3; + + // Need to see if we have space for data from this channel + if (dci_tbs - ta_len - header_len - sdu_length_total > 0) { + LOG_D(MAC, "[TEST]Requested %d bytes from RLC buffer on channel %d during first call\n", dci_tbs-ta_len-header_len); + //If we have space, we need to see how much data we can request at most (if any available) + rlc_status = mac_rlc_status_ind(mod_id, + rnti, + mod_id, + frame, + ENB_FLAG_YES, + MBMS_FLAG_NO, + j, + (dci_tbs-ta_len-header_len)); // transport block set size + + //If data are available in channel j + if (rlc_status.bytes_in_buffer > 0) { + LOG_D(MAC, "[TEST]Have %d bytes in DCCH buffer during first call\n", rlc_status.bytes_in_buffer); + //Fill in as much as possible + data_to_request = cmin(dci_tbs-ta_len-header_len, rlc_status.bytes_in_buffer); + if (data_to_request < 128) { //The header will be one byte less + header_len--; + } + /* if (j == 1 || j == 2) { + data_to_request+=0; + } */ + LOG_D(MAC, "[TEST]Will request %d from channel %d\n", data_to_request, j); + rlc_pdus[channels_added] = (Protocol__FlexRlcPdu *) malloc(sizeof(Protocol__FlexRlcPdu)); + protocol__flex_rlc_pdu__init(rlc_pdus[channels_added]); + rlc_pdus[channels_added]->n_rlc_pdu_tb = 2; + rlc_pdus[channels_added]->rlc_pdu_tb = (Protocol__FlexRlcPduTb **) malloc(sizeof(Protocol__FlexRlcPduTb *) * 2); + rlc_pdus[channels_added]->rlc_pdu_tb[0] = (Protocol__FlexRlcPduTb *) malloc(sizeof(Protocol__FlexRlcPduTb)); + protocol__flex_rlc_pdu_tb__init(rlc_pdus[channels_added]->rlc_pdu_tb[0]); + rlc_pdus[channels_added]->rlc_pdu_tb[0]->has_logical_channel_id = 1; + rlc_pdus[channels_added]->rlc_pdu_tb[0]->logical_channel_id = j; + rlc_pdus[channels_added]->rlc_pdu_tb[0]->has_size = 1; + rlc_pdus[channels_added]->rlc_pdu_tb[0]->size = data_to_request; + rlc_pdus[channels_added]->rlc_pdu_tb[1] = (Protocol__FlexRlcPduTb *) malloc(sizeof(Protocol__FlexRlcPduTb)); + protocol__flex_rlc_pdu_tb__init(rlc_pdus[channels_added]->rlc_pdu_tb[1]); + rlc_pdus[channels_added]->rlc_pdu_tb[1]->has_logical_channel_id = 1; + rlc_pdus[channels_added]->rlc_pdu_tb[1]->logical_channel_id = j; + rlc_pdus[channels_added]->rlc_pdu_tb[1]->has_size = 1; + rlc_pdus[channels_added]->rlc_pdu_tb[1]->size = data_to_request; + dl_data[num_ues_added]->n_rlc_pdu++; + channels_added++; + //Set this to the max value that we might request + sdu_length_total += data_to_request; + } else { + //Take back the assumption of a header for this channel + header_len -= 3; + } //End rlc_status.bytes_in_buffer <= 0 + } //end of if dci_tbs - ta_len - header_len > 0 + } // End of iterating the logical channels + + // Add rlc_pdus to the dl_data message + dl_data[num_ues_added]->rlc_pdu = (Protocol__FlexRlcPdu **) malloc(sizeof(Protocol__FlexRlcPdu *) * + dl_data[num_ues_added]->n_rlc_pdu); + for (i = 0; i < dl_data[num_ues_added]->n_rlc_pdu; i++) { + dl_data[num_ues_added]->rlc_pdu[i] = rlc_pdus[i]; + } + + // there is a payload + if (( dl_data[num_ues_added]->n_rlc_pdu > 0)) { + // Now compute number of required RBs for total sdu length + // Assume RAH format 2 + // adjust header lengths + + if (header_len == 2 || header_len == 3) { //Only one SDU, remove length field + header_len = 1; + } else { //Remove length field from the last SDU + header_len--; + } + + mcs_tmp = mcs; + if (mcs_tmp == 0) { + nb_rb = 4; // don't let the TBS get too small + } else { + nb_rb=min_rb_unit[CC_id]; + } + + LOG_D(MAC,"[TEST]The initial number of resource blocks was %d\n", nb_rb); + LOG_D(MAC,"[TEST] The initial mcs was %d\n", mcs_tmp); + + TBS = mac_xface->get_TBS_DL(mcs_tmp, nb_rb); + LOG_D(MAC,"[TEST]The TBS during rate matching was %d\n", TBS); + + while (TBS < (sdu_length_total + header_len + ta_len)) { + nb_rb += min_rb_unit[CC_id]; // + LOG_D(MAC, "[TEST]Had to increase the number of RBs\n"); + if (nb_rb > nb_available_rb) { // if we've gone beyond the maximum number of RBs + // (can happen if N_RB_DL is odd) + TBS = mac_xface->get_TBS_DL(mcs_tmp, nb_available_rb); + nb_rb = nb_available_rb; + break; + } + + TBS = mac_xface->get_TBS_DL(mcs_tmp, nb_rb); + } + + if(nb_rb == ue_sched_ctl->pre_nb_available_rbs[CC_id]) { + LOG_D(MAC, "[TEST]We had the exact number of rbs. Time to fill the rballoc subband\n"); + for(j = 0; j < flexran_get_N_RBG(mod_id, CC_id); j++) { // for indicating the rballoc for each sub-band + UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = ue_sched_ctl->rballoc_sub_UE[CC_id][j]; + } + } else { + nb_rb_temp = nb_rb; + j = 0; + LOG_D(MAC, "[TEST]Will only partially fill the bitmap\n"); + while((nb_rb_temp > 0) && (j < flexran_get_N_RBG(mod_id, CC_id))) { + if(ue_sched_ctl->rballoc_sub_UE[CC_id][j] == 1) { + UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = ue_sched_ctl->rballoc_sub_UE[CC_id][j]; + if ((j == flexran_get_N_RBG(mod_id, CC_id) - 1) && + ((flexran_get_N_RB_DL(mod_id, CC_id) == 25)|| + (flexran_get_N_RB_DL(mod_id, CC_id) == 50))) { + nb_rb_temp = nb_rb_temp - min_rb_unit[CC_id] + 1; + } else { + nb_rb_temp = nb_rb_temp - min_rb_unit[CC_id]; + } + } + j = j+1; + } + } + + PHY_vars_eNB_g[mod_id][CC_id]->mu_mimo_mode[UE_id].pre_nb_available_rbs = nb_rb; + PHY_vars_eNB_g[mod_id][CC_id]->mu_mimo_mode[UE_id].dl_pow_off = ue_sched_ctl->dl_pow_off[CC_id]; + + for(j = 0; j < flexran_get_N_RBG(mod_id, CC_id); j++) { + PHY_vars_eNB_g[mod_id][CC_id]->mu_mimo_mode[UE_id].rballoc_sub[j] = UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j]; + } + + // decrease mcs until TBS falls below required length + while ((TBS > (sdu_length_total + header_len + ta_len)) && (mcs_tmp > 0)) { + mcs_tmp--; + TBS = mac_xface->get_TBS_DL(mcs_tmp, nb_rb); + } + + // if we have decreased too much or we don't have enough RBs, increase MCS + while ((TBS < (sdu_length_total + header_len + ta_len)) && + ((( ue_sched_ctl->dl_pow_off[CC_id] > 0) && (mcs_tmp < 28)) || ( (ue_sched_ctl->dl_pow_off[CC_id]==0) && (mcs_tmp <= 15)))) { + mcs_tmp++; + TBS = mac_xface->get_TBS_DL(mcs_tmp, nb_rb); + } + + dci_tbs = TBS; + mcs = mcs_tmp; + + dl_dci->has_aggr_level = 1; + dl_dci->aggr_level = aggregation; + + UE_list->UE_template[CC_id][UE_id].nb_rb[harq_pid] = nb_rb; + + if (flexran_get_duplex_mode(mod_id, CC_id) == PROTOCOL__FLEX_DUPLEX_MODE__FLDM_TDD) { + UE_list->UE_template[CC_id][UE_id].DAI++; + // printf("DAI update: subframeP %d: UE %d, DAI %d\n",subframeP,UE_id,UE_list->UE_template[CC_id][UE_id].DAI); + //#warning only for 5MHz channel + update_ul_dci(mod_id, CC_id, rnti, UE_list->UE_template[CC_id][UE_id].DAI); + } + + // do PUCCH power control + // this is the normalized RX power + normalized_rx_power = flexran_get_p0_pucch_dbm(mod_id,UE_id, CC_id); //eNB_UE_stats->Po_PUCCH_dBm; + target_rx_power = flexran_get_p0_nominal_pucch(mod_id, CC_id) + 10; //mac_xface->get_target_pucch_rx_power(mod_id, CC_id) + 10; + + // this assumes accumulated tpc + // make sure that we are only sending a tpc update once a frame, otherwise the control loop will freak out + int32_t framex10psubframe = UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_frame*10+UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_subframe; + + if (((framex10psubframe+10)<=(frame*10+subframe)) || //normal case + ((framex10psubframe>(frame*10+subframe)) && (((10240-framex10psubframe+frame*10+subframe)>=10)))) //frame wrap-around + if (flexran_get_p0_pucch_status(mod_id, UE_id, CC_id) == 1) { + flexran_update_p0_pucch(mod_id, UE_id, CC_id); + + UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_frame = frame; + UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_subframe = subframe; + if (normalized_rx_power>(target_rx_power+1)) { + tpc = 0; //-1 + tpc_accumulated--; + } else if (normalized_rx_power<(target_rx_power-1)) { + tpc = 2; //+1 + tpc_accumulated++; + } else { + tpc = 1; //0 + } + LOG_D(MAC,"[eNB %d] DLSCH scheduler: frame %d, subframe %d, harq_pid %d, tpc %d, accumulated %d, normalized/target rx power %d/%d\n", + mod_id, frame, subframe, harq_pid, tpc, + tpc_accumulated, normalized_rx_power, target_rx_power); + } // Po_PUCCH has been updated + else { + tpc = 1; //0 + } // time to do TPC update + else { + tpc = 1; //0 + } - if((rballoc_sub[CC_id][i] == 0) && - (ue_sched_ctl->rballoc_sub_UE[CC_id][i] == 0) && - (nb_rbs_required_remaining[CC_id][UE_id]>0) && - (ue_sched_ctl->pre_nb_available_rbs[CC_id] < nb_rbs_required[CC_id][UE_id])) { + for(i=0; i<PHY_vars_eNB_g[mod_id][CC_id]->frame_parms.N_RBG; i++) { + rballoc_sub[i] = UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][i]; + } - // if this UE is not scheduled for TM5 - if (ue_sched_ctl->dl_pow_off[CC_id] != 0 ) { + // Toggle NDI + LOG_D(MAC,"CC_id %d Frame %d, subframeP %d: Toggling Format1 NDI for UE %d (rnti %x/%d) oldNDI %d\n", + CC_id, frame, subframe, UE_id, + UE_list->UE_template[CC_id][UE_id].rnti,harq_pid, UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]); + UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]= 1 - UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; + ndi = UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; + + UE_list->UE_template[CC_id][UE_id].mcs[harq_pid] = mcs; + UE_list->UE_template[CC_id][UE_id].oldTPC[harq_pid] = tpc; - if ((i == N_RBG-1) && ((N_RB_DL == 25) || (N_RB_DL == 50))) { - rballoc_sub[CC_id][i] = 1; - ue_sched_ctl->rballoc_sub_UE[CC_id][i] = 1; - MIMO_mode_indicator[CC_id][i] = 1; - if (transmission_mode == 5 ) { + // Increase the pointer for the number of scheduled UEs + num_ues_added++; + ue_has_transmission = 1; + } else { // There is no data from RLC or MAC header, so don't schedule + ue_has_transmission = 0; + } + } // End of new scheduling + + // If we has transmission or retransmission + if (ue_has_transmission) { + switch (mac_xface->get_transmission_mode(mod_id, CC_id, rnti)) { + case 1: + case 2: + default: + dl_dci->has_res_alloc = 1; + dl_dci->res_alloc = 0; + dl_dci->has_vrb_format = 1; + dl_dci->vrb_format = PROTOCOL__FLEX_VRB_FORMAT__FLVRBF_LOCALIZED; + dl_dci->has_format = 1; + dl_dci->format = PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1; + dl_dci->has_rb_bitmap = 1; + dl_dci->rb_bitmap = allocate_prbs_sub(nb_rb, rballoc_sub); + dl_dci->has_rb_shift = 1; + dl_dci->rb_shift = 0; + dl_dci->n_ndi = 1; + dl_dci->ndi = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_ndi); + dl_dci->ndi[0] = ndi; + dl_dci->n_rv = 1; + dl_dci->rv = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_rv); + dl_dci->rv[0] = round & 3; + dl_dci->has_tpc = 1; + dl_dci->tpc = tpc; + dl_dci->n_mcs = 1; + dl_dci->mcs = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_mcs); + dl_dci->mcs[0] = mcs; + dl_dci->n_tbs_size = 1; + dl_dci->tbs_size = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_tbs_size); + dl_dci->tbs_size[0] = dci_tbs; + if (flexran_get_duplex_mode(mod_id, CC_id) == PROTOCOL__FLEX_DUPLEX_MODE__FLDM_TDD) { + dl_dci->has_dai = 1; + dl_dci->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; + } + break; + case 3: + dl_dci->has_res_alloc = 1; + dl_dci->res_alloc = 0; + dl_dci->has_vrb_format = 1; + dl_dci->vrb_format = PROTOCOL__FLEX_VRB_FORMAT__FLVRBF_LOCALIZED; + dl_dci->has_format = 1; + dl_dci->format = PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_2A; + dl_dci->has_rb_bitmap = 1; + dl_dci->rb_bitmap = allocate_prbs_sub(nb_rb, rballoc_sub); + dl_dci->has_rb_shift = 1; + dl_dci->rb_shift = 0; + dl_dci->n_ndi = 2; + dl_dci->ndi = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_ndi); + dl_dci->ndi[0] = ndi; + dl_dci->ndi[1] = ndi; + dl_dci->n_rv = 2; + dl_dci->rv = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_rv); + dl_dci->rv[0] = round & 3; + dl_dci->rv[1] = round & 3; + dl_dci->has_tpc = 1; + dl_dci->tpc = tpc; + dl_dci->n_mcs = 2; + dl_dci->mcs = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_mcs); + dl_dci->mcs[0] = mcs; + dl_dci->mcs[1] = mcs; + dl_dci->n_tbs_size = 2; + dl_dci->tbs_size = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_tbs_size); + dl_dci->tbs_size[0] = dci_tbs; + dl_dci->tbs_size[1] = dci_tbs; + if (flexran_get_duplex_mode(mod_id, CC_id) == PROTOCOL__FLEX_DUPLEX_MODE__FLDM_TDD) { + dl_dci->has_dai = 1; + dl_dci->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; + } + break; + case 4: + dl_dci->has_res_alloc = 1; + dl_dci->res_alloc = 0; + dl_dci->has_vrb_format = 1; + dl_dci->vrb_format = PROTOCOL__FLEX_VRB_FORMAT__FLVRBF_LOCALIZED; + dl_dci->has_format = 1; + dl_dci->format = PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_2A; + dl_dci->has_rb_bitmap = 1; + dl_dci->rb_bitmap = allocate_prbs_sub(nb_rb, rballoc_sub); + dl_dci->has_rb_shift = 1; + dl_dci->rb_shift = 0; + dl_dci->n_ndi = 2; + dl_dci->ndi = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_ndi); + dl_dci->ndi[0] = ndi; + dl_dci->ndi[1] = ndi; + dl_dci->n_rv = 2; + dl_dci->rv = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_rv); + dl_dci->rv[0] = round & 3; + dl_dci->rv[1] = round & 3; + dl_dci->has_tpc = 1; + dl_dci->tpc = tpc; + dl_dci->n_mcs = 2; + dl_dci->mcs = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_mcs); + dl_dci->mcs[0] = mcs; + dl_dci->mcs[1] = mcs; + dl_dci->n_tbs_size = 2; + dl_dci->tbs_size = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_tbs_size); + dl_dci->tbs_size[0] = dci_tbs; + dl_dci->tbs_size[1] = dci_tbs; + if (flexran_get_duplex_mode(mod_id, CC_id) == PROTOCOL__FLEX_DUPLEX_MODE__FLDM_TDD) { + dl_dci->has_dai = 1; + dl_dci->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; + } + break; + case 5: + dl_dci->has_res_alloc = 1; + dl_dci->res_alloc = 0; + dl_dci->has_vrb_format = 1; + dl_dci->vrb_format = PROTOCOL__FLEX_VRB_FORMAT__FLVRBF_LOCALIZED; + dl_dci->has_format = 1; + dl_dci->format = PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1D; + dl_dci->has_rb_bitmap = 1; + dl_dci->rb_bitmap = allocate_prbs_sub(nb_rb, rballoc_sub); + dl_dci->has_rb_shift = 1; + dl_dci->rb_shift = 0; + dl_dci->n_ndi = 1; + dl_dci->ndi[0] = ndi; + dl_dci->n_rv = 1; + dl_dci->rv = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_rv); + dl_dci->rv[0] = round & 3; + dl_dci->has_tpc = 1; + dl_dci->tpc = tpc; + dl_dci->n_mcs = 1; + dl_dci->mcs = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_mcs); + dl_dci->mcs[0] = mcs; + dl_dci->n_tbs_size = 1; + dl_dci->tbs_size = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_tbs_size); + dl_dci->tbs_size[0] = dci_tbs; + if (flexran_get_duplex_mode(mod_id, CC_id) == PROTOCOL__FLEX_DUPLEX_MODE__FLDM_TDD) { + dl_dci->has_dai = 1; + dl_dci->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; + } + + if(ue_sched_ctl->dl_pow_off[CC_id] == 2) { ue_sched_ctl->dl_pow_off[CC_id] = 1; - } - nb_rbs_required_remaining[CC_id][UE_id] = nb_rbs_required_remaining[CC_id][UE_id] - min_rb_unit+1; - ue_sched_ctl->pre_nb_available_rbs[CC_id] = ue_sched_ctl->pre_nb_available_rbs[CC_id] + min_rb_unit - 1; - } else { - if (nb_rbs_required_remaining[CC_id][UE_id] >= min_rb_unit){ - rballoc_sub[CC_id][i] = 1; - ue_sched_ctl->rballoc_sub_UE[CC_id][i] = 1; - MIMO_mode_indicator[CC_id][i] = 1; - if (transmission_mode == 5 ) { - ue_sched_ctl->dl_pow_off[CC_id] = 1; - } - nb_rbs_required_remaining[CC_id][UE_id] = nb_rbs_required_remaining[CC_id][UE_id] - min_rb_unit; - ue_sched_ctl->pre_nb_available_rbs[CC_id] = ue_sched_ctl->pre_nb_available_rbs[CC_id] + min_rb_unit; } + + dl_dci->has_dl_power_offset = 1; + dl_dci->dl_power_offset = ue_sched_ctl->dl_pow_off[CC_id]; + dl_dci->has_precoding_info = 1; + dl_dci->precoding_info = 5; // Is this right?? + + break; + case 6: + dl_dci->has_res_alloc = 1; + dl_dci->res_alloc = 0; + dl_dci->has_vrb_format = 1; + dl_dci->vrb_format = PROTOCOL__FLEX_VRB_FORMAT__FLVRBF_LOCALIZED; + dl_dci->has_format = 1; + dl_dci->format = PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1D; + dl_dci->has_rb_bitmap = 1; + dl_dci->rb_bitmap = allocate_prbs_sub(nb_rb, rballoc_sub); + dl_dci->has_rb_shift = 1; + dl_dci->rb_shift = 0; + dl_dci->n_ndi = 1; + dl_dci->ndi = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_ndi); + dl_dci->ndi[0] = ndi; + dl_dci->n_rv = 1; + dl_dci->rv = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_rv); + dl_dci->rv[0] = round & 3; + dl_dci->has_tpc = 1; + dl_dci->tpc = tpc; + dl_dci->n_mcs = 1; + dl_dci->mcs = (uint32_t *) malloc(sizeof(uint32_t) * dl_dci->n_mcs); + dl_dci->mcs[0] = mcs; + if (flexran_get_duplex_mode(mod_id, CC_id) == PROTOCOL__FLEX_DUPLEX_MODE__FLDM_TDD) { + dl_dci->has_dai = 1; + dl_dci->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; + } + + dl_dci->has_dl_power_offset = 1; + dl_dci->dl_power_offset = ue_sched_ctl->dl_pow_off[CC_id]; + dl_dci->has_precoding_info = 1; + dl_dci->precoding_info = 5; // Is this right?? + break; } - } // dl_pow_off[CC_id][UE_id] ! = 0 - } - } + } + + if (flexran_get_duplex_mode(mod_id, CC_id) == PROTOCOL__FLEX_DUPLEX_MODE__FLDM_TDD) { + + /* TODO */ + //set_ul_DAI(mod_id, UE_id, CC_id, frame, subframe, frame_parms); + } + } // UE_id loop + } // CC_id loop + + // Add all the dl_data elements to the flexran message + int offset = (*dl_info)->dl_mac_config_msg->n_dl_ue_data; + (*dl_info)->dl_mac_config_msg->n_dl_ue_data += num_ues_added; + if ( num_ues_added > 0 ){ + (*dl_info)->dl_mac_config_msg->dl_ue_data = (Protocol__FlexDlData **) realloc( (*dl_info)->dl_mac_config_msg->dl_ue_data, + sizeof(Protocol__FlexDlData *) * ((*dl_info)->dl_mac_config_msg->n_dl_ue_data)); + if ((*dl_info)->dl_mac_config_msg->dl_ue_data == NULL ){ + LOG_E(MAC, "Request for memory reallocation failed\n"); + return; + } + for (i = 0; i < num_ues_added; i++) { + (*dl_info)->dl_mac_config_msg->dl_ue_data[offset+i] = dl_data[i]; + } + } + + stop_meas(&eNB->schedule_dlsch); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SCHEDULE_DLSCH,VCD_FUNCTION_OUT); } diff --git a/openair2/LAYER2/MAC/main.c b/openair2/LAYER2/MAC/main.c index 203bd3f36f8a9e24b75bce6627a33bc9ac63f436..d812ec0087a892f0144e11c2172f79f83eecce2d 100644 --- a/openair2/LAYER2/MAC/main.c +++ b/openair2/LAYER2/MAC/main.c @@ -127,11 +127,11 @@ int mac_top_init(int eMBMS_active, char *uecap_xer, uint8_t cba_group_active, ui UE_mac_inst = (UE_MAC_INST*)malloc16(NB_UE_INST*sizeof(UE_MAC_INST)); if (UE_mac_inst == NULL) { - LOG_C(MAC,"[MAIN] Can't ALLOCATE %d Bytes for %d UE_MAC_INST with size %d \n",NB_UE_INST*sizeof(UE_MAC_INST),NB_UE_INST,sizeof(UE_MAC_INST)); + LOG_C(MAC,"[MAIN] Can't ALLOCATE %zu Bytes for %d UE_MAC_INST with size %zu \n",NB_UE_INST*sizeof(UE_MAC_INST),NB_UE_INST,sizeof(UE_MAC_INST)); mac_xface->macphy_exit("[MAC][MAIN] not enough memory for UEs \n"); } - LOG_D(MAC,"[MAIN] ALLOCATE %d Bytes for %d UE_MAC_INST @ %p\n",NB_UE_INST*sizeof(UE_MAC_INST),NB_UE_INST,UE_mac_inst); + LOG_D(MAC,"[MAIN] ALLOCATE %zu Bytes for %d UE_MAC_INST @ %p\n",NB_UE_INST*sizeof(UE_MAC_INST),NB_UE_INST,UE_mac_inst); bzero(UE_mac_inst,NB_UE_INST*sizeof(UE_MAC_INST)); @@ -148,10 +148,10 @@ int mac_top_init(int eMBMS_active, char *uecap_xer, uint8_t cba_group_active, ui eNB_mac_inst = (eNB_MAC_INST*)malloc16(NB_eNB_INST*sizeof(eNB_MAC_INST)); if (eNB_mac_inst == NULL) { - LOG_D(MAC,"[MAIN] can't ALLOCATE %d Bytes for %d eNB_MAC_INST with size %d \n",NB_eNB_INST*sizeof(eNB_MAC_INST*),NB_eNB_INST,sizeof(eNB_MAC_INST)); + LOG_D(MAC,"[MAIN] can't ALLOCATE %zu Bytes for %d eNB_MAC_INST with size %zu \n",NB_eNB_INST*sizeof(eNB_MAC_INST*),NB_eNB_INST,sizeof(eNB_MAC_INST)); mac_xface->macphy_exit("[MAC][MAIN] not enough memory for eNB \n"); } else { - LOG_D(MAC,"[MAIN] ALLOCATE %d Bytes for %d eNB_MAC_INST @ %p\n",sizeof(eNB_MAC_INST),NB_eNB_INST,eNB_mac_inst); + LOG_D(MAC,"[MAIN] ALLOCATE %zu Bytes for %d eNB_MAC_INST @ %p\n",sizeof(eNB_MAC_INST),NB_eNB_INST,eNB_mac_inst); bzero(eNB_mac_inst,NB_eNB_INST*sizeof(eNB_MAC_INST)); } } else { diff --git a/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c index e75e9d617a545e0a18293421a8cc488489b4d9dd..728abeeff4fb068b2207e810c6030bb22dfc0d9f 100644 --- a/openair2/LAYER2/MAC/pre_processor.c +++ b/openair2/LAYER2/MAC/pre_processor.c @@ -29,6 +29,9 @@ */ +#define _GNU_SOURCE +#include <stdlib.h> + #include "assertions.h" #include "PHY/defs.h" #include "PHY/extern.h" @@ -62,6 +65,17 @@ #endif */ +/* this function checks that get_eNB_UE_stats returns + * a non-NULL pointer for all CCs for a given UE + */ +static int phy_stats_exist(module_id_t Mod_id, int rnti) +{ + int CC_id; + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) + if (mac_xface->get_eNB_UE_stats(Mod_id, CC_id, rnti) == NULL) + return 0; + return 1; +} // This function stores the downlink buffer for all the logical channels void store_dlsch_buffer (module_id_t Mod_id, @@ -75,7 +89,8 @@ void store_dlsch_buffer (module_id_t Mod_id, UE_list_t *UE_list = &eNB_mac_inst[Mod_id].UE_list; UE_TEMPLATE *UE_template; - for (UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) { + for (UE_id = 0; UE_id < NUMBER_OF_UE_MAX; UE_id++) { + if (UE_list->active[UE_id] != TRUE) continue; UE_template = &UE_list->UE_template[UE_PCCID(Mod_id,UE_id)][UE_id]; @@ -155,10 +170,16 @@ void assign_rbs_required (module_id_t Mod_id, LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]; // clear rb allocations across all CC_ids - for (UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) { + for (UE_id = 0; UE_id < NUMBER_OF_UE_MAX; UE_id++) { + if (UE_list->active[UE_id] != TRUE) continue; + pCCid = UE_PCCID(Mod_id,UE_id); rnti = UE_list->UE_template[pCCid][UE_id].rnti; + /* skip UE not present in PHY (for any of its active CCs) */ + if (!phy_stats_exist(Mod_id, rnti)) + continue; + //update CQI information across component carriers for (n=0; n<UE_list->numactiveCCs[UE_id]; n++) { @@ -262,7 +283,7 @@ int maxround(module_id_t Mod_id,uint16_t rnti,int frame,sub_frame_t subframe,uin } // This function scans all CC_ids for a particular UE to find the maximum DL CQI - +// it returns -1 if the UE is not found in PHY layer (get_eNB_UE_stats gives NULL) int maxcqi(module_id_t Mod_id,int32_t UE_id) { @@ -276,8 +297,9 @@ int maxcqi(module_id_t Mod_id,int32_t UE_id) eNB_UE_stats = mac_xface->get_eNB_UE_stats(Mod_id,CC_id,UE_RNTI(Mod_id,UE_id)); if (eNB_UE_stats==NULL) { - mac_xface->macphy_exit("maxcqi: could not get eNB_UE_stats\n"); - return 0; // not reached + /* the UE may have been removed in the PHY layer, don't exit */ + //mac_xface->macphy_exit("maxcqi: could not get eNB_UE_stats\n"); + return -1; } if (eNB_UE_stats->DL_cqi[0] > CQI) { @@ -288,13 +310,124 @@ int maxcqi(module_id_t Mod_id,int32_t UE_id) return(CQI); } +struct sort_ue_dl_params { + int Mod_idP; + int frameP; + int subframeP; +}; +static int ue_dl_compare(const void *_a, const void *_b, void *_params) +{ + struct sort_ue_dl_params *params = _params; + UE_list_t *UE_list = &eNB_mac_inst[params->Mod_idP].UE_list; + + int UE_id1 = *(const int *)_a; + int UE_id2 = *(const int *)_b; + + int rnti1 = UE_RNTI(params->Mod_idP, UE_id1); + int pCC_id1 = UE_PCCID(params->Mod_idP, UE_id1); + int round1 = maxround(params->Mod_idP, rnti1, params->frameP, params->subframeP, 1); + + int rnti2 = UE_RNTI(params->Mod_idP, UE_id2); + int pCC_id2 = UE_PCCID(params->Mod_idP, UE_id2); + int round2 = maxround(params->Mod_idP, rnti2, params->frameP, params->subframeP, 1); + + int cqi1 = maxcqi(params->Mod_idP, UE_id1); + int cqi2 = maxcqi(params->Mod_idP, UE_id2); + + if (round1 > round2) return -1; + if (round1 < round2) return 1; + + if (UE_list->UE_template[pCC_id1][UE_id1].dl_buffer_info[1] + UE_list->UE_template[pCC_id1][UE_id1].dl_buffer_info[2] > + UE_list->UE_template[pCC_id2][UE_id2].dl_buffer_info[1] + UE_list->UE_template[pCC_id2][UE_id2].dl_buffer_info[2]) + return -1; + if (UE_list->UE_template[pCC_id1][UE_id1].dl_buffer_info[1] + UE_list->UE_template[pCC_id1][UE_id1].dl_buffer_info[2] < + UE_list->UE_template[pCC_id2][UE_id2].dl_buffer_info[1] + UE_list->UE_template[pCC_id2][UE_id2].dl_buffer_info[2]) + return 1; + + if (UE_list->UE_template[pCC_id1][UE_id1].dl_buffer_head_sdu_creation_time_max > + UE_list->UE_template[pCC_id2][UE_id2].dl_buffer_head_sdu_creation_time_max) + return -1; + if (UE_list->UE_template[pCC_id1][UE_id1].dl_buffer_head_sdu_creation_time_max < + UE_list->UE_template[pCC_id2][UE_id2].dl_buffer_head_sdu_creation_time_max) + return 1; + + if (UE_list->UE_template[pCC_id1][UE_id1].dl_buffer_total > + UE_list->UE_template[pCC_id2][UE_id2].dl_buffer_total) + return -1; + if (UE_list->UE_template[pCC_id1][UE_id1].dl_buffer_total < + UE_list->UE_template[pCC_id2][UE_id2].dl_buffer_total) + return 1; + + if (cqi1 > cqi2) return -1; + if (cqi1 < cqi2) return 1; + + return 0; +#if 0 + /* The above order derives from the following. */ + if(round2 > round1) { // Check first if one of the UEs has an active HARQ process which needs service and swap order + swap_UEs(UE_list,UE_id1,UE_id2,0); + } else if (round2 == round1) { + // RK->NN : I guess this is for fairness in the scheduling. This doesn't make sense unless all UEs have the same configuration of logical channels. This should be done on the sum of all information that has to be sent. And still it wouldn't ensure fairness. It should be based on throughput seen by each UE or maybe using the head_sdu_creation_time, i.e. swap UEs if one is waiting longer for service. + // for(j=0;j<MAX_NUM_LCID;j++){ + // if (eNB_mac_inst[Mod_id][pCC_id1].UE_template[UE_id1].dl_buffer_info[j] < + // eNB_mac_inst[Mod_id][pCC_id2].UE_template[UE_id2].dl_buffer_info[j]){ + + // first check the buffer status for SRB1 and SRB2 + + if ( (UE_list->UE_template[pCC_id1][UE_id1].dl_buffer_info[1] + UE_list->UE_template[pCC_id1][UE_id1].dl_buffer_info[2]) < + (UE_list->UE_template[pCC_id2][UE_id2].dl_buffer_info[1] + UE_list->UE_template[pCC_id2][UE_id2].dl_buffer_info[2]) ) { + swap_UEs(UE_list,UE_id1,UE_id2,0); + } else if (UE_list->UE_template[pCC_id1][UE_id1].dl_buffer_head_sdu_creation_time_max < + UE_list->UE_template[pCC_id2][UE_id2].dl_buffer_head_sdu_creation_time_max ) { + swap_UEs(UE_list,UE_id1,UE_id2,0); + } else if (UE_list->UE_template[pCC_id1][UE_id1].dl_buffer_total < + UE_list->UE_template[pCC_id2][UE_id2].dl_buffer_total ) { + swap_UEs(UE_list,UE_id1,UE_id2,0); + } else if (cqi1 < cqi2) { + swap_UEs(UE_list,UE_id1,UE_id2,0); + } + } +#endif +} // This fuction sorts the UE in order their dlsch buffer and CQI void sort_UEs (module_id_t Mod_idP, int frameP, sub_frame_t subframeP) { + int i; + int list[NUMBER_OF_UE_MAX]; + int list_size = 0; + int rnti; + struct sort_ue_dl_params params = { Mod_idP, frameP, subframeP }; + + UE_list_t *UE_list = &eNB_mac_inst[Mod_idP].UE_list; + + for (i = 0; i < NUMBER_OF_UE_MAX; i++) { + rnti = UE_RNTI(Mod_idP, i); + if (rnti == NOT_A_RNTI) + continue; + if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) + continue; + if (!phy_stats_exist(Mod_idP, rnti)) + continue; + list[list_size] = i; + list_size++; + } + + qsort_r(list, list_size, sizeof(int), ue_dl_compare, ¶ms); + + if (list_size) { + for (i = 0; i < list_size-1; i++) + UE_list->next[list[i]] = list[i+1]; + UE_list->next[list[list_size-1]] = -1; + UE_list->head = list[0]; + } else { + UE_list->head = -1; + } + +#if 0 int UE_id1,UE_id2; @@ -315,6 +448,8 @@ void sort_UEs (module_id_t Mod_idP, continue; if (UE_list->UE_sched_ctrl[UE_id1].ul_out_of_sync == 1) continue; + if (!phy_stats_exist(Mod_idP, rnti1)) + continue; pCC_id1 = UE_PCCID(Mod_idP,UE_id1); cqi1 = maxcqi(Mod_idP,UE_id1); // round1 = maxround(Mod_idP,rnti1,frameP,subframeP,0); @@ -325,6 +460,8 @@ void sort_UEs (module_id_t Mod_idP, continue; if (UE_list->UE_sched_ctrl[UE_id2].ul_out_of_sync == 1) continue; + if (!phy_stats_exist(Mod_idP, rnti2)) + continue; cqi2 = maxcqi(Mod_idP,UE_id2); round2 = maxround(Mod_idP,rnti2,frameP,subframeP,0); //mac_xface->get_ue_active_harq_pid(Mod_id,rnti2,subframe,&harq_pid2,&round2,0); pCC_id2 = UE_PCCID(Mod_idP,UE_id2); @@ -354,6 +491,7 @@ void sort_UEs (module_id_t Mod_idP, } } } +#endif } @@ -407,7 +545,9 @@ void dlsch_scheduler_pre_processor (module_id_t Mod_id, min_rb_unit[CC_id]=get_min_rb_unit(Mod_id,CC_id); - for (i=UE_list->head; i>=0; i=UE_list->next[i]) { + for (i = 0; i < NUMBER_OF_UE_MAX; i++) { + if (UE_list->active[i] != TRUE) continue; + UE_id = i; // Initialize scheduling information for all active UEs @@ -453,11 +593,9 @@ void dlsch_scheduler_pre_processor (module_id_t Mod_id, continue; if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) continue; - UE_id = i; - - // if there is no available harq_process, skip the UE - if (UE_list->UE_sched_ctrl[UE_id].harq_pid[CC_id]<0) + if (!phy_stats_exist(Mod_id, rnti)) continue; + UE_id = i; for (ii=0; ii<UE_num_active_CC(UE_list,UE_id); ii++) { CC_id = UE_list->ordered_CCids[ii][UE_id]; @@ -465,6 +603,10 @@ void dlsch_scheduler_pre_processor (module_id_t Mod_id, harq_pid = ue_sched_ctl->harq_pid[CC_id]; round = ue_sched_ctl->round[CC_id]; + // if there is no available harq_process, skip the UE + if (UE_list->UE_sched_ctrl[UE_id].harq_pid[CC_id]<0) + continue; + average_rbs_per_user[CC_id]=0; frame_parms[CC_id] = mac_xface->get_lte_frame_parms(Mod_id,CC_id); @@ -506,6 +648,13 @@ void dlsch_scheduler_pre_processor (module_id_t Mod_id, for(i=UE_list->head; i>=0; i=UE_list->next[i]) { rnti = UE_RNTI(Mod_id,i); + if(rnti == NOT_A_RNTI) + continue; + if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) + continue; + if (!phy_stats_exist(Mod_id, rnti)) + continue; + for (ii=0; ii<UE_num_active_CC(UE_list,i); ii++) { CC_id = UE_list->ordered_CCids[ii][i]; @@ -564,6 +713,8 @@ void dlsch_scheduler_pre_processor (module_id_t Mod_id, continue; if (UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync == 1) continue; + if (!phy_stats_exist(Mod_id, rnti)) + continue; transmission_mode = mac_xface->get_transmission_mode(Mod_id,CC_id,rnti); // mac_xface->get_ue_active_harq_pid(Mod_id,CC_id,rnti,frameP,subframeP,&harq_pid,&round,0); @@ -610,6 +761,8 @@ void dlsch_scheduler_pre_processor (module_id_t Mod_id, continue; if (UE_list->UE_sched_ctrl[UE_id2].ul_out_of_sync == 1) continue; + if (!phy_stats_exist(Mod_idP, rnti2)) + continue; eNB_UE_stats2 = mac_xface->get_eNB_UE_stats(Mod_id,CC_id,rnti2); //mac_xface->get_ue_active_harq_pid(Mod_id,CC_id,rnti2,frameP,subframeP,&harq_pid2,&round2,0); @@ -758,7 +911,13 @@ void dlsch_scheduler_pre_processor_reset (int module_idP, int sf05_upper=-1,sf05_lower=-1; #endif LTE_eNB_UE_stats *eNB_UE_stats = mac_xface->get_eNB_UE_stats(module_idP,CC_id,rnti); + if (eNB_UE_stats == NULL) return; + // initialize harq_pid and round + + if (eNB_UE_stats == NULL) + return; + mac_xface->get_ue_active_harq_pid(module_idP,CC_id,rnti, frameP,subframeP, &ue_sched_ctl->harq_pid[CC_id], @@ -791,7 +950,10 @@ void dlsch_scheduler_pre_processor_reset (int module_idP, break; case 100: - ue_sched_ctl->ta_update = eNB_UE_stats->timing_advance_update/16; + if (PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.threequarter_fs == 0) + ue_sched_ctl->ta_update = eNB_UE_stats->timing_advance_update/16; + else + ue_sched_ctl->ta_update = eNB_UE_stats->timing_advance_update/12; break; } // clear the update in case PHY does not have a new measurement after timer expiry @@ -970,6 +1132,9 @@ void ulsch_scheduler_pre_processor(module_id_t module_idP, if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) continue; + if (!phy_stats_exist(module_idP, rnti)) + continue; + UE_id = i; for (n=0; n<UE_list->numactiveULCCs[UE_id]; n++) { @@ -1020,6 +1185,8 @@ void ulsch_scheduler_pre_processor(module_id_t module_idP, continue; if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) continue; + if (!phy_stats_exist(module_idP, rnti)) + continue; UE_id = i; @@ -1050,6 +1217,8 @@ void ulsch_scheduler_pre_processor(module_id_t module_idP, continue; if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) continue; + if (!phy_stats_exist(module_idP, rnti)) + continue; UE_id = i; @@ -1107,7 +1276,8 @@ void assign_max_mcs_min_rb(module_id_t module_idP,int frameP, sub_frame_t subfra LTE_DL_FRAME_PARMS *frame_parms; - for (i=UE_list->head_ul; i>=0; i=UE_list->next_ul[i]) { + for (i = 0; i < NUMBER_OF_UE_MAX; i++) { + if (UE_list->active[i] != TRUE) continue; rnti = UE_RNTI(module_idP,i); @@ -1115,6 +1285,8 @@ void assign_max_mcs_min_rb(module_id_t module_idP,int frameP, sub_frame_t subfra continue; if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) continue; + if (!phy_stats_exist(module_idP, rnti)) + continue; if (UE_list->UE_sched_ctrl[i].phr_received == 1) mcs = 20; // if we've received the power headroom information the UE, we can go to maximum mcs @@ -1198,10 +1370,103 @@ void assign_max_mcs_min_rb(module_id_t module_idP,int frameP, sub_frame_t subfra } } +struct sort_ue_ul_params { + int module_idP; + int frameP; + int subframeP; +}; + +static int ue_ul_compare(const void *_a, const void *_b, void *_params) +{ + struct sort_ue_ul_params *params = _params; + UE_list_t *UE_list = &eNB_mac_inst[params->module_idP].UE_list; + + int UE_id1 = *(const int *)_a; + int UE_id2 = *(const int *)_b; + + int rnti1 = UE_RNTI(params->module_idP, UE_id1); + int pCCid1 = UE_PCCID(params->module_idP, UE_id1); + int round1 = maxround(params->module_idP, rnti1, params->frameP, params->subframeP, 1); + + int rnti2 = UE_RNTI(params->module_idP, UE_id2); + int pCCid2 = UE_PCCID(params->module_idP, UE_id2); + int round2 = maxround(params->module_idP, rnti2, params->frameP, params->subframeP, 1); + + if (round1 > round2) return -1; + if (round1 < round2) return 1; + + if (UE_list->UE_template[pCCid1][UE_id1].ul_buffer_info[LCGID0] > UE_list->UE_template[pCCid2][UE_id2].ul_buffer_info[LCGID0]) + return -1; + if (UE_list->UE_template[pCCid1][UE_id1].ul_buffer_info[LCGID0] < UE_list->UE_template[pCCid2][UE_id2].ul_buffer_info[LCGID0]) + return 1; + + if (UE_list->UE_template[pCCid1][UE_id1].ul_total_buffer > UE_list->UE_template[pCCid2][UE_id2].ul_total_buffer) + return -1; + if (UE_list->UE_template[pCCid1][UE_id1].ul_total_buffer < UE_list->UE_template[pCCid2][UE_id2].ul_total_buffer) + return 1; + + if (UE_list->UE_template[pCCid1][UE_id1].pre_assigned_mcs_ul > UE_list->UE_template[pCCid2][UE_id2].pre_assigned_mcs_ul) + return -1; + if (UE_list->UE_template[pCCid1][UE_id1].pre_assigned_mcs_ul < UE_list->UE_template[pCCid2][UE_id2].pre_assigned_mcs_ul) + return 1; + + return 0; + +#if 0 + /* The above order derives from the following. + * The last case is not handled: "if (UE_list->UE_template[pCCid2][UE_id2].ul_total_buffer > 0 )" + * I don't think it makes a big difference. + */ + if(round2 > round1) { + swap_UEs(UE_list,UE_id1,UE_id2,1); + } else if (round2 == round1) { + if (UE_list->UE_template[pCCid1][UE_id1].ul_buffer_info[LCGID0] < UE_list->UE_template[pCCid2][UE_id2].ul_buffer_info[LCGID0]) { + swap_UEs(UE_list,UE_id1,UE_id2,1); + } else if (UE_list->UE_template[pCCid1][UE_id1].ul_total_buffer < UE_list->UE_template[pCCid2][UE_id2].ul_total_buffer) { + swap_UEs(UE_list,UE_id1,UE_id2,1); + } else if (UE_list->UE_template[pCCid1][UE_id1].pre_assigned_mcs_ul < UE_list->UE_template[pCCid2][UE_id2].pre_assigned_mcs_ul) { + if (UE_list->UE_template[pCCid2][UE_id2].ul_total_buffer > 0 ) { + swap_UEs(UE_list,UE_id1,UE_id2,1); + } + } + } +#endif +} void sort_ue_ul (module_id_t module_idP,int frameP, sub_frame_t subframeP) { + int i; + int list[NUMBER_OF_UE_MAX]; + int list_size = 0; + int rnti; + struct sort_ue_ul_params params = { module_idP, frameP, subframeP }; + UE_list_t *UE_list = &eNB_mac_inst[module_idP].UE_list; + + for (i = 0; i < NUMBER_OF_UE_MAX; i++) { + rnti = UE_RNTI(module_idP, i); + if (rnti == NOT_A_RNTI) + continue; + if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) + continue; + if (!phy_stats_exist(module_idP, rnti)) + continue; + list[list_size] = i; + list_size++; + } + + qsort_r(list, list_size, sizeof(int), ue_ul_compare, ¶ms); + + if (list_size) { + for (i = 0; i < list_size-1; i++) + UE_list->next_ul[list[i]] = list[i+1]; + UE_list->next_ul[list[list_size-1]] = -1; + UE_list->head_ul = list[0]; + } else { + UE_list->head_ul = -1; + } + +#if 0 int UE_id1,UE_id2; int pCCid1,pCCid2; int round1,round2; @@ -1223,6 +1488,8 @@ void sort_ue_ul (module_id_t module_idP,int frameP, sub_frame_t subframeP) continue; if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) continue; + if (!phy_stats_exist(module_idP, rnti1)) + continue; pCCid1 = UE_PCCID(module_idP,UE_id1); round1 = maxround(module_idP,rnti1,frameP,subframeP,1); @@ -1234,6 +1501,8 @@ void sort_ue_ul (module_id_t module_idP,int frameP, sub_frame_t subframeP) continue; if (UE_list->UE_sched_ctrl[UE_id2].ul_out_of_sync == 1) continue; + if (!phy_stats_exist(module_idP, rnti2)) + continue; pCCid2 = UE_PCCID(module_idP,UE_id2); round2 = maxround(module_idP,rnti2,frameP,subframeP,1); @@ -1253,4 +1522,5 @@ void sort_ue_ul (module_id_t module_idP,int frameP, sub_frame_t subframeP) } } } +#endif } diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c index 85100d14af9f9c75ececa2e56ffa846be4b28094..6d304051d4c06c59a0de7dbbdca623e3d1b841c8 100644 --- a/openair2/LAYER2/MAC/ue_procedures.c +++ b/openair2/LAYER2/MAC/ue_procedures.c @@ -189,7 +189,7 @@ unsigned char *parse_header(unsigned char *mac_header, } #ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[UE] sdu %d lcid %d length %d (offset now %d)\n", + LOG_D(MAC,"[UE] sdu %d lcid %d length %d (offset now %ld)\n", num_sdus,lcid,length,mac_header_ptr-mac_header); #endif rx_lcids[num_sdus] = lcid; @@ -229,7 +229,7 @@ unsigned char *parse_header(unsigned char *mac_header, } #ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[UE] ce %d lcid %d (offset now %d)\n",num_ces,lcid,mac_header_ptr-mac_header); + LOG_D(MAC,"[UE] ce %d lcid %d (offset now %ld)\n",num_ces,lcid,mac_header_ptr-mac_header); #endif } } @@ -366,7 +366,7 @@ ue_send_sdu( #endif #if defined(ENABLE_MAC_PAYLOAD_DEBUG) - LOG_T(MAC,"[eNB %d] First 32 bytes of DLSCH : \n"); + LOG_T(MAC,"[UE %d] First 32 bytes of DLSCH : \n", module_idP); for (i=0; i<32; i++) { LOG_T(MAC,"%x.",sdu[i]); @@ -386,7 +386,7 @@ ue_send_sdu( module_idP,frameP,payload_ptr[0],payload_ptr[1],payload_ptr[2],payload_ptr[3],payload_ptr[4],payload_ptr[5]); if (UE_mac_inst[module_idP].RA_active == 1) { - LOG_I(MAC,"[UE %d][RAPROC] Frame %d : Clearing RA_active flag\n"); + LOG_I(MAC,"[UE %d][RAPROC] Frame %d : Clearing RA_active flag\n", module_idP, frameP); UE_mac_inst[module_idP].RA_active=0; // check if RA procedure has finished completely (no contention) tx_sdu = &UE_mac_inst[module_idP].CCCH_pdu.payload[3]; @@ -402,7 +402,7 @@ ue_send_sdu( return; } - LOG_I(MAC,"[UE %d][RAPROC] Frame %d : Clearing contention resolution timer\n"); + LOG_I(MAC,"[UE %d][RAPROC] Frame %d : Clearing contention resolution timer\n", module_idP, frameP); UE_mac_inst[module_idP].RA_contention_resolution_timer_active = 0; mac_xface->ra_succeeded(module_idP,CC_id,eNB_index); } @@ -742,7 +742,7 @@ int ue_query_mch(module_id_t module_idP, uint8_t CC_id, uint32_t frameP, uint32_ mcch_period = 32<<(UE_mac_inst[module_idP].mbsfn_AreaInfo[0]->mcch_Config_r9.mcch_RepetitionPeriod_r9); LOG_D(MAC, - "[UE %d] Frame %d subframe %d: Checking MBSFN Sync Area %d/%d with SF allocation %d/%d for MCCH and MTCH (mbsfn period %d, mcch period %d,mac sched period (%d,%d))\n", + "[UE %d] Frame %d subframe %d: Checking MBSFN Sync Area %d/%d with SF allocation %d/%d for MCCH and MTCH (mbsfn period %d, mcch period %d,mac sched period (%d,%ld))\n", module_idP,frameP, subframe,i,UE_mac_inst[module_idP].num_active_mbsfn_area, j,UE_mac_inst[module_idP].num_sf_allocation_pattern,mbsfn_period,mcch_period, mch_scheduling_period,UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->radioframeAllocationOffset); @@ -1054,7 +1054,7 @@ unsigned char generate_ulsch_header(uint8_t *mac_header, last_size=1; *((POWER_HEADROOM_CMD *)ce_ptr)=(*power_headroom); ce_ptr+=sizeof(POWER_HEADROOM_CMD); - LOG_D(MAC, "phr header size %d\n",sizeof(POWER_HEADROOM_CMD)); + LOG_D(MAC, "phr header size %zu\n",sizeof(POWER_HEADROOM_CMD)); } if (crnti) { @@ -1250,7 +1250,7 @@ unsigned char generate_ulsch_header(uint8_t *mac_header, } #ifdef DEBUG_HEADER_PARSING - LOG_T(MAC," [UE %d] header : ", crnti); + LOG_T(MAC," [UE] header : "); for (i=0; i<((unsigned char*)mac_header_ptr - mac_header); i++) { LOG_T(MAC,"%2x.",mac_header[i]); @@ -1887,8 +1887,7 @@ if (UE_mac_inst[module_idP].scheduling_info.LCID_status[lcid] == LCID_NOT_EMPTY) ulsch_buffer[payload_offset+sdu_length_total+j] = (char)(taus()&0xff); } } - LOG_D(MAC,"[UE %d][SR] Gave SDU to PHY, clearing any scheduling request\n", - module_idP,payload_offset, sdu_length_total); + LOG_D(MAC,"[UE %d][SR] Gave SDU to PHY, clearing any scheduling request\n", module_idP); UE_mac_inst[module_idP].scheduling_info.SR_pending=0; UE_mac_inst[module_idP].scheduling_info.SR_COUNTER=0; @@ -1901,7 +1900,7 @@ if (UE_mac_inst[module_idP].scheduling_info.LCID_status[lcid] == LCID_NOT_EMPTY) // Reset ReTx BSR Timer UE_mac_inst[module_idP].scheduling_info.retxBSR_SF = get_sf_retxBSRTimer(UE_mac_inst[module_idP].scheduling_info.retxBSR_Timer); - LOG_D(MAC,"[UE %d] MAC ReTx BSR Timer Reset =%d\n", + LOG_D(MAC,"[UE %d] MAC ReTx BSR Timer Reset =%d\n", module_idP, UE_mac_inst[module_idP].scheduling_info.retxBSR_SF); // Reset Periodic Timer except when BSR is truncated @@ -1910,7 +1909,7 @@ if (UE_mac_inst[module_idP].scheduling_info.LCID_status[lcid] == LCID_NOT_EMPTY) UE_mac_inst[module_idP].scheduling_info.periodicBSR_SF = get_sf_periodicBSRTimer(UE_mac_inst[module_idP].scheduling_info.periodicBSR_Timer); LOG_D(MAC,"[UE %d] MAC Periodic BSR Timer Reset =%d\n", - UE_mac_inst[module_idP].scheduling_info.periodicBSR_SF); + module_idP, UE_mac_inst[module_idP].scheduling_info.periodicBSR_SF); } @@ -1923,7 +1922,7 @@ if (UE_mac_inst[module_idP].scheduling_info.LCID_status[lcid] == LCID_NOT_EMPTY) if (opt_enabled) { trace_pdu(0, ulsch_buffer, buflen, module_idP, 3, UE_mac_inst[module_idP].crnti, UE_mac_inst[module_idP].txFrame, UE_mac_inst[module_idP].txSubframe, 0, 0); - LOG_D(OPT,"[UE %d][ULSCH] Frame %d trace pdu for rnti %x with size %d\n", + LOG_D(OPT,"[UE %d][ULSCH] Frame %d subframe %d trace pdu for rnti %x with size %d\n", module_idP, UE_mac_inst[module_idP].txFrame, UE_mac_inst[module_idP].txSubframe, UE_mac_inst[module_idP].crnti, buflen); } } @@ -2065,7 +2064,7 @@ ue_scheduler( //return(RRC_OK); } - LOG_I(MAC,"Frame %d: Contention resolution timer %d/%d\n",txFrameP,UE_mac_inst[module_idP].RA_contention_resolution_cnt, + LOG_I(MAC,"Frame %d: Contention resolution timer %d/%ld\n",txFrameP,UE_mac_inst[module_idP].RA_contention_resolution_cnt, ((1+rach_ConfigCommon->ra_SupervisionInfo.mac_ContentionResolutionTimer)<<3)); UE_mac_inst[module_idP].RA_contention_resolution_cnt++; diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c index 792c9de70a4a1e94342c636ae3919070fdb253f2..4c67f80e207a84f42a56ed0d7cafbed9f7a1b26c 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c @@ -257,7 +257,7 @@ boolean_t pdcp_data_req( * Validate incoming sequence number, there might be a problem with PDCP initialization */ if (current_sn > pdcp_calculate_max_seq_num_for_given_size(pdcp_p->seq_num_size)) { - LOG_E(PDCP, PROTOCOL_PDCP_CTXT_FMT" Generated sequence number (%lu) is greater than a sequence number could ever be!\n"\ + LOG_E(PDCP, PROTOCOL_PDCP_CTXT_FMT" Generated sequence number (%"PRIu16") is greater than a sequence number could ever be!\n"\ "There must be a problem with PDCP initialization, ignoring this PDU...\n", PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP,pdcp_p), current_sn); @@ -836,7 +836,7 @@ pdcp_data_ind( /* Print octets of incoming data in hexadecimal form */ LOG_D(PDCP, "Following content has been received from RLC (%d,%d)(PDCP header has already been removed):\n", - sdu_buffer_sizeP - payload_offset + sizeof(pdcp_data_ind_header_t), + sdu_buffer_sizeP - payload_offset + (int)sizeof(pdcp_data_ind_header_t), sdu_buffer_sizeP - payload_offset); //util_print_hex_octets(PDCP, &new_sdu_p->data[sizeof (pdcp_data_ind_header_t)], sdu_buffer_sizeP - payload_offset); //util_flush_hex_octets(PDCP, &new_sdu_p->data[sizeof (pdcp_data_ind_header_t)], sdu_buffer_sizeP - payload_offset); @@ -1214,7 +1214,7 @@ rrc_pdcp_config_asn1_req ( } if (lc_id == 1 || lc_id == 2) { - LOG_E(RLC, PROTOCOL_CTXT_FMT" logicalChannelIdentity = %d is invalid in RRC message when adding DRB!\n", PROTOCOL_CTXT_ARGS(ctxt_pP), lc_id); + LOG_E(RLC, PROTOCOL_CTXT_FMT" logicalChannelIdentity = %ld is invalid in RRC message when adding DRB!\n", PROTOCOL_CTXT_ARGS(ctxt_pP), lc_id); continue; } @@ -1312,7 +1312,7 @@ rrc_pdcp_config_asn1_req ( break; default: - LOG_W(PDCP,"[MOD_id %u/%u][RB %u] unknown drb_toaddmod->PDCP_Config->headerCompression->present \n", + LOG_W(PDCP,PROTOCOL_PDCP_CTXT_FMT"[RB %ld] unknown drb_toaddmod->PDCP_Config->headerCompression->present \n", PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP,pdcp_p), drb_id); break; } @@ -1345,7 +1345,7 @@ rrc_pdcp_config_asn1_req ( h_rc = hashtable_get(pdcp_coll_p, key, (void**)&pdcp_p); if (h_rc != HASH_TABLE_OK) { - LOG_E(PDCP, PROTOCOL_CTXT_FMT" PDCP REMOVE FAILED drb_id %u\n", + LOG_E(PDCP, PROTOCOL_CTXT_FMT" PDCP REMOVE FAILED drb_id %ld\n", PROTOCOL_CTXT_ARGS(ctxt_pP), drb_id); continue; @@ -1749,7 +1749,7 @@ rrc_pdcp_config_req ( pdcp_p->cipheringAlgorithm, pdcp_p->integrityProtAlgorithm ); } else { - LOG_W(PDCP,"[%s %d] bad security mode %d", security_modeP); + LOG_W(PDCP,PROTOCOL_PDCP_CTXT_FMT" bad security mode %d", PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP,pdcp_p), security_modeP); } break; diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c index fd339b627764b3157589e7b78c48bed7a677893e..eac42cb1297c8958a580f70c57685903f223b5ad 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c @@ -62,7 +62,7 @@ void util_print_hex_octets(comp_name_t component, unsigned char* data, unsigned */ if (octet_index != 0 && (octet_index + 1) % 16 == 0) { LOG_T(component, " |\n"); - LOG_T(component, " %03d |", octet_index); + LOG_T(component, " %03lu |", octet_index); } } diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c index 1dea4ced9fc3db3d315a4c5e3ed29ecf3cac3335..4051a88ef2976da6f625e280329d0ba6cb2af71e 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c @@ -223,7 +223,7 @@ void config_req_rlc_am_asn1 ( PROTOCOL_RLC_AM_MSC_ARGS(ctxt_pP, l_rlc_p)); LOG_D(RLC, - PROTOCOL_RLC_AM_CTXT_FMT"ILLEGAL CONFIG_REQ (max_retx_threshold=%d poll_pdu=%d poll_byte=%d t_poll_retransmit=%d t_reord=%d t_status_prohibit=%d), RLC-AM NOT CONFIGURED\n", + PROTOCOL_RLC_AM_CTXT_FMT"ILLEGAL CONFIG_REQ (max_retx_threshold=%ld poll_pdu=%ld poll_byte=%ld t_poll_retransmit=%ld t_reord=%ld t_status_prohibit=%ld), RLC-AM NOT CONFIGURED\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,l_rlc_p), config_am_pP->ul_AM_RLC.maxRetxThreshold, config_am_pP->ul_AM_RLC.pollPDU, @@ -523,7 +523,7 @@ rlc_am_rx ( switch (rlc->protocol_state) { case RLC_NULL_STATE: - LOG_N(RLC, PROTOCOL_RLC_AM_CTXT_FMT" ERROR MAC_DATA_IND IN RLC_NULL_STATE\n", arg_pP); + LOG_N(RLC, PROTOCOL_RLC_AM_CTXT_FMT" ERROR MAC_DATA_IND IN RLC_NULL_STATE\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP, rlc)); list_free (&data_indP.data); break; @@ -532,7 +532,7 @@ rlc_am_rx ( break; default: - LOG_E(RLC, PROTOCOL_RLC_AM_CTXT_FMT" TX UNKNOWN PROTOCOL STATE 0x%02X\n", rlc, rlc->protocol_state); + LOG_E(RLC, PROTOCOL_RLC_AM_CTXT_FMT" TX UNKNOWN PROTOCOL STATE 0x%02X\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP, rlc), rlc->protocol_state); } } @@ -557,6 +557,15 @@ rlc_am_mac_status_indication ( status_resp.head_sdu_is_segmented = 0; status_resp.rlc_info.rlc_protocol_state = rlc->protocol_state; + /* TODO: remove this hack. Problem is: there is a race. + * UE comes. SRB2 is configured via message to RRC. + * At some point the RLC AM is created but not configured yet. + * At this moment (I think) MAC calls mac_rlc_status_ind + * which calls this function. But the init was not finished yet + * and we have a crash below when testing mem_block != NULL. + */ + if (rlc->input_sdus == NULL) return status_resp; + if (rlc->last_frame_status_indication != ctxt_pP->frame) { rlc_am_check_timer_poll_retransmit(ctxt_pP, rlc); rlc_am_check_timer_reordering(ctxt_pP, rlc); diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c index 74a1cd5390e4b2984addeed408879d91b760e921..cb03e28c4b457d8e9ce39344dbe32213f5d3bb26 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c @@ -54,11 +54,11 @@ rlc_am_init( // rlc_pP->pdu_retrans_buffer = calloc(1, (uint16_t)((unsigned int)RLC_AM_PDU_RETRANSMISSION_BUFFER_SIZE*(unsigned int)sizeof(rlc_am_tx_data_pdu_management_t))); rlc_pP->pdu_retrans_buffer = calloc(1, (uint32_t)((unsigned int)RLC_AM_PDU_RETRANSMISSION_BUFFER_SIZE*(unsigned int)sizeof( rlc_am_tx_data_pdu_management_t))); - LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[AM INIT] input_sdus[] = %p element size=%d\n", + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[AM INIT] input_sdus[] = %p element size=%zu\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), rlc_pP->input_sdus, sizeof(rlc_am_tx_sdu_management_t)); - LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[AM INIT] pdu_retrans_buffer[] = %p element size=%d\n", + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[AM INIT] pdu_retrans_buffer[] = %p element size=%zu\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), rlc_pP->pdu_retrans_buffer, sizeof(rlc_am_tx_data_pdu_management_t)); diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c index f7f900fa657edebf8d148f758b3286c37b2f8cd4..7fb801b33d717c6d686c2eb8985a07399c7d71a5 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c @@ -646,7 +646,7 @@ mem_block_t* rlc_am_retransmit_get_subsegment( // fill the segment pdu_p with Lis and data //--------------------------------------------------------------- LOG_T(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[RE-SEGMENT] fill the segment pdu_p with Lis and data, test_num_li %d\n", - test_num_li); + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), test_num_li); if (test_num_li > 0) { pdu_sub_segment_p->b1 = pdu_sub_segment_p->b1 | 0x04; // set E bit @@ -678,12 +678,12 @@ mem_block_t* rlc_am_retransmit_get_subsegment( *sizeP = *sizeP - 1; } - LOG_T(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[RB %u][RE-SEGMENT] ADD LI %d\n", + LOG_T(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[RE-SEGMENT] ADD LI %d\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), test_li_list[fill_num_li]); } } else { - LOG_T(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[RB %u][RE-SEGMENT] ADD NO LI\n", + LOG_T(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[RE-SEGMENT] ADD NO LI\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); fill_payload_p = (uint8_t*)e_li_sub_segment; } diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c index 3c983805c7425f75ec5a7e1787e263166eb9a753..a9f0bdbf7e64e82155decfd4d8cd205415a99e45 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c @@ -62,7 +62,6 @@ rlc_am_rx_list_insert_pdu( if (pdu_info_previous_cursor_p->sn == pdu_info_p->sn) { if (pdu_info_p->rf != pdu_info_previous_cursor_p->rf) { LOG_N(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[INSERT PDU] LINE %d RX PDU SN %04d WRONG RF -> DROPPED (vr(mr) < vr(r) and sn >= vr(r))\n", - ctxt_pP->frame, PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), __LINE__, pdu_info_p->sn); diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c index d0e9e28ef0267ab3bea0c3f36b6423910acaa9f8..bda2b884581d885c96fcdccfa7ea45b1df3756a8 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c @@ -150,7 +150,7 @@ void config_req_rlc_um_asn1 ( break; default: - LOG_E(RLC,PROTOCOL_RLC_UM_CTXT_FMT" [CONFIGURE] RB %u INVALID UL sn_FieldLength %d, RLC NOT CONFIGURED\n", + LOG_E(RLC,PROTOCOL_RLC_UM_CTXT_FMT" [CONFIGURE] RB %u INVALID UL sn_FieldLength %ld, RLC NOT CONFIGURED\n", PROTOCOL_RLC_UM_CTXT_ARGS(ctxt_pP,rlc_p), rlc_p->rb_id, ul_rlc_pP->sn_FieldLength); @@ -178,7 +178,7 @@ void config_req_rlc_um_asn1 ( break; default: - LOG_E(RLC,PROTOCOL_RLC_UM_CTXT_FMT" [CONFIGURE] RB %u INVALID DL sn_FieldLength %d, RLC NOT CONFIGURED\n", + LOG_E(RLC,PROTOCOL_RLC_UM_CTXT_FMT" [CONFIGURE] RB %u INVALID DL sn_FieldLength %ld, RLC NOT CONFIGURED\n", PROTOCOL_RLC_UM_CTXT_ARGS(ctxt_pP,rlc_p), rlc_p->rb_id, dl_rlc_pP->sn_FieldLength); @@ -197,7 +197,7 @@ void config_req_rlc_um_asn1 ( if (dl_rlc_pP->t_Reordering<T_Reordering_spare1) { t_Reordering = t_Reordering_tab[dl_rlc_pP->t_Reordering]; } else { - LOG_E(RLC,PROTOCOL_RLC_UM_CTXT_FMT" [CONFIGURE] RB %u INVALID T_Reordering %d, RLC NOT CONFIGURED\n", + LOG_E(RLC,PROTOCOL_RLC_UM_CTXT_FMT" [CONFIGURE] RB %u INVALID T_Reordering %ld, RLC NOT CONFIGURED\n", PROTOCOL_RLC_UM_CTXT_ARGS(ctxt_pP,rlc_p), rlc_p->rb_id, dl_rlc_pP->t_Reordering); diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c index a0e7b6b8c71d83f781c82d80de2c7e0bfe4b27ea..4255464e3a220b4c2f5227bf47b63f5fcfd47b0b 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c @@ -579,7 +579,7 @@ rlc_um_try_reassembly( rlc_pP->stat_rx_data_bytes_dropped += tb_ind_p->size; rlc_pP->reassembly_missing_sn_detected = 1; - LOG_W(RLC, "[SN %d] Bad RLC header! Discard this RLC PDU\n", sn, size); + LOG_W(RLC, "[SN %d] Bad RLC header! Discard this RLC PDU (size=%d)\n", sn, size); } } @@ -664,7 +664,7 @@ rlc_um_start_timer_reordering( rlc_pP->t_reordering.ms_time_out); #endif } else { - LOG_T(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[T-REORDERING] NOT STARTED, CAUSE CONFIGURED 0 ms\n", + LOG_T(RLC, PROTOCOL_RLC_UM_CTXT_FMT"[T-REORDERING] NOT STARTED, CAUSE CONFIGURED 0 ms\n", PROTOCOL_RLC_UM_CTXT_ARGS(ctxt_pP,rlc_pP)); } } diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.c index 585ceacb9bdfa13b838caa52dd5021aa8e04f7a8..3f083a77a881bc069c6597a9a7ec280dc50d69b2 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.c @@ -83,7 +83,7 @@ rlc_um_display_rx_window( LOG_T(RLC, "\n"); } - LOG_T(RLC, "%s%s| %04d |", RLC_FG_COLOR_DEFAULT, RLC_NORMAL_VIDEO, sn); + LOG_T(RLC, "%s%s| %04lu |", RLC_FG_COLOR_DEFAULT, RLC_NORMAL_VIDEO, sn); } strcpy(color, RLC_FG_COLOR_DEFAULT); diff --git a/openair2/LAYER2/RLC/rlc.c b/openair2/LAYER2/RLC/rlc.c index 1073d3ded3f16cef6e3642863f172d1bae81005c..96057231a6596f07fc23ed124a902f34f1e534a5 100644 --- a/openair2/LAYER2/RLC/rlc.c +++ b/openair2/LAYER2/RLC/rlc.c @@ -71,7 +71,7 @@ void rlc_util_print_hex_octets(comp_name_t componentP, unsigned char* dataP, con LOG_T(componentP, " |\n"); } - LOG_T(componentP, " %04d |", octet_index); + LOG_T(componentP, " %04lu |", octet_index); } /* diff --git a/openair2/LAYER2/RLC/rlc_rrc.c b/openair2/LAYER2/RLC/rlc_rrc.c index 0b0073d807ff50c8bd36a6ceca675beb4ba44dc9..8304752e8e2b91811afc03185099cdaff7e0724e 100644 --- a/openair2/LAYER2/RLC/rlc_rrc.c +++ b/openair2/LAYER2/RLC/rlc_rrc.c @@ -99,7 +99,7 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP rb_id = srb2add_listP->list.array[cnt]->srb_Identity; lc_id = rb_id; - LOG_D(RLC, "Adding SRB %d, rb_id %d\n",srb2add_listP->list.array[cnt]->srb_Identity,rb_id); + LOG_D(RLC, "Adding SRB %ld, rb_id %d\n",srb2add_listP->list.array[cnt]->srb_Identity,rb_id); srb_toaddmod_p = srb2add_listP->list.array[cnt]; if (srb_toaddmod_p->rlc_Config) { @@ -259,7 +259,7 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP continue; } - LOG_D(RLC, "Adding DRB %d, lc_id %d\n",drb_id,lc_id); + LOG_D(RLC, "Adding DRB %ld, lc_id %d\n",drb_id,lc_id); if (drb_toaddmod_p->rlc_Config) { @@ -325,7 +325,7 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP break; default: - LOG_W(RLC, PROTOCOL_CTXT_FMT"[RB %u] unknown drb_toaddmod_p->rlc_Config->present \n", + LOG_W(RLC, PROTOCOL_CTXT_FMT"[RB %ld] unknown drb_toaddmod_p->rlc_Config->present \n", PROTOCOL_CTXT_ARGS(ctxt_pP), drb_id); } diff --git a/openair2/RRC/LITE/MESSAGES/asn1_msg.c b/openair2/RRC/LITE/MESSAGES/asn1_msg.c index 5f9a8e0e2a735284cf8b0616ef4f512429a71405..b4290e8b9de4c61219a8580f9b67f7a9d881c5ae 100644 --- a/openair2/RRC/LITE/MESSAGES/asn1_msg.c +++ b/openair2/RRC/LITE/MESSAGES/asn1_msg.c @@ -99,7 +99,7 @@ int errno; # endif #endif -#define XER_PRINT +//#define XER_PRINT extern Enb_properties_array_t enb_properties; typedef struct xer_sprint_string_s { diff --git a/openair2/RRC/LITE/defs.h b/openair2/RRC/LITE/defs.h index 0b0fd6b73fa73097e1fd3e385d1d015254986aa3..47f8a0080adf5311a20c92d9c21312e64dbcd764 100644 --- a/openair2/RRC/LITE/defs.h +++ b/openair2/RRC/LITE/defs.h @@ -102,6 +102,14 @@ # include "intertask_interface.h" #endif +/* TODO: be sure this include is correct. + * It solves a problem of compilation of the RRH GW, + * issue #186. + */ +#if !defined(ENABLE_ITTI) +# include "as_message.h" +#endif + #if defined(ENABLE_USE_MME) # include "commonDef.h" #endif diff --git a/openair2/RRC/LITE/rrc_UE.c b/openair2/RRC/LITE/rrc_UE.c index 1b22ae5d0bd5e6db7fc4ee8245fead9ea9c69bde..a6290f1f3cbcd57b80ebb8b34bb84d5e29b53f37 100644 --- a/openair2/RRC/LITE/rrc_UE.c +++ b/openair2/RRC/LITE/rrc_UE.c @@ -545,7 +545,7 @@ int rrc_ue_decode_ccch( const protocol_ctxt_t* const ctxt_pP, const SRB_INFO* co #endif if ((dec_rval.code != RC_OK) && (dec_rval.consumed==0)) { - LOG_E(RRC,"[UE %d] Frame %d : Failed to decode DL-CCCH-Message (%d bytes)\n",ctxt_pP->module_id,dec_rval.consumed); + LOG_E(RRC,"[UE %d] Frame %d : Failed to decode DL-CCCH-Message (%zu bytes)\n",ctxt_pP->module_id,ctxt_pP->frame,dec_rval.consumed); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_CCCH, VCD_FUNCTION_OUT); return -1; } @@ -799,15 +799,15 @@ rrc_ue_process_measConfig( ind = measConfig->measObjectToAddModList->list.array[i]->measObjectId; if (UE_rrc_inst[ctxt_pP->module_id].MeasObj[eNB_index][ind-1]) { - LOG_D(RRC,"Modifying measurement object %d\n",ind); + LOG_D(RRC,"Modifying measurement object %ld\n",ind); memcpy((char*)UE_rrc_inst[ctxt_pP->module_id].MeasObj[eNB_index][ind-1], (char*)measObj, sizeof(MeasObjectToAddMod_t)); } else { - LOG_I(RRC,"Adding measurement object %d\n",ind); + LOG_I(RRC,"Adding measurement object %ld\n",ind); if (measObj->measObject.present == MeasObjectToAddMod__measObject_PR_measObjectEUTRA) { - LOG_I(RRC,"EUTRA Measurement : carrierFreq %d, allowedMeasBandwidth %d,presenceAntennaPort1 %d, neighCellConfig %d\n", + LOG_I(RRC,"EUTRA Measurement : carrierFreq %ld, allowedMeasBandwidth %ld,presenceAntennaPort1 %d, neighCellConfig %d\n", measObj->measObject.choice.measObjectEUTRA.carrierFreq, measObj->measObject.choice.measObjectEUTRA.allowedMeasBandwidth, measObj->measObject.choice.measObjectEUTRA.presenceAntennaPort1, @@ -866,12 +866,12 @@ rrc_ue_process_measConfig( ind = measConfig->reportConfigToAddModList->list.array[i]->reportConfigId; if (UE_rrc_inst[ctxt_pP->module_id].ReportConfig[eNB_index][ind-1]) { - LOG_I(RRC,"Modifying Report Configuration %d\n",ind-1); + LOG_I(RRC,"Modifying Report Configuration %ld\n",ind-1); memcpy((char*)UE_rrc_inst[ctxt_pP->module_id].ReportConfig[eNB_index][ind-1], (char*)measConfig->reportConfigToAddModList->list.array[i], sizeof(ReportConfigToAddMod_t)); } else { - LOG_D(RRC,"Adding Report Configuration %d %p \n",ind-1,measConfig->reportConfigToAddModList->list.array[i]); + LOG_D(RRC,"Adding Report Configuration %ld %p \n",ind-1,measConfig->reportConfigToAddModList->list.array[i]); UE_rrc_inst[ctxt_pP->module_id].ReportConfig[eNB_index][ind-1] = measConfig->reportConfigToAddModList->list.array[i]; } } @@ -901,12 +901,12 @@ rrc_ue_process_measConfig( ind = measConfig->measIdToAddModList->list.array[i]->measId; if (UE_rrc_inst[ctxt_pP->module_id].MeasId[eNB_index][ind-1]) { - LOG_D(RRC,"Modifying Measurement ID %d\n",ind-1); + LOG_D(RRC,"Modifying Measurement ID %ld\n",ind-1); memcpy((char*)UE_rrc_inst[ctxt_pP->module_id].MeasId[eNB_index][ind-1], (char*)measConfig->measIdToAddModList->list.array[i], sizeof(MeasIdToAddMod_t)); } else { - LOG_D(RRC,"Adding Measurement ID %d %p\n",ind-1,measConfig->measIdToAddModList->list.array[i]); + LOG_D(RRC,"Adding Measurement ID %ld %p\n",ind-1,measConfig->measIdToAddModList->list.array[i]); UE_rrc_inst[ctxt_pP->module_id].MeasId[eNB_index][ind-1] = measConfig->measIdToAddModList->list.array[i]; } } @@ -938,13 +938,11 @@ rrc_ue_process_measConfig( UE_rrc_inst[ctxt_pP->module_id].filter_coeff_rsrq = 1./pow(2, (*UE_rrc_inst[ctxt_pP->module_id].QuantityConfig[eNB_index]->quantityConfigEUTRA->filterCoefficientRSRQ)/4); - LOG_I(RRC,"[UE %d] set rsrp-coeff for eNB %d: %d rsrq-coeff: %d rsrp_factor: %f rsrq_factor: %f \n", + LOG_I(RRC,"[UE %d] set rsrp-coeff for eNB %d: %ld rsrq-coeff: %ld rsrp_factor: %f rsrq_factor: %f \n", ctxt_pP->module_id, eNB_index, // UE_rrc_inst[ue_mod_idP].Info[eNB_index].UE_index, *UE_rrc_inst[ctxt_pP->module_id].QuantityConfig[eNB_index]->quantityConfigEUTRA->filterCoefficientRSRP, *UE_rrc_inst[ctxt_pP->module_id].QuantityConfig[eNB_index]->quantityConfigEUTRA->filterCoefficientRSRQ, UE_rrc_inst[ctxt_pP->module_id].filter_coeff_rsrp, - UE_rrc_inst[ctxt_pP->module_id].filter_coeff_rsrp, - UE_rrc_inst[ctxt_pP->module_id].filter_coeff_rsrp, UE_rrc_inst[ctxt_pP->module_id].filter_coeff_rsrq); } @@ -1467,7 +1465,7 @@ rrc_ue_process_radioResourceConfigDedicated( UE_rrc_inst[ctxt_pP->module_id].DRB_config[eNB_index][DRB_id] = radioResourceConfigDedicated->drb_ToAddModList->list.array[i]; rrc_ue_establish_drb(ctxt_pP->module_id,ctxt_pP->frame,eNB_index,radioResourceConfigDedicated->drb_ToAddModList->list.array[i]); // MAC/PHY Configuration - LOG_I(RRC, "[FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (DRB %d eNB %d) --->][MAC_UE][MOD %02d][]\n", + LOG_I(RRC, "[FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (DRB %ld eNB %d) --->][MAC_UE][MOD %02d][]\n", ctxt_pP->frame, ctxt_pP->module_id, radioResourceConfigDedicated->drb_ToAddModList->list.array[i]->drb_Identity, eNB_index, @@ -1619,7 +1617,7 @@ rrc_ue_process_securityModeCommand( h_rc = hashtable_get(pdcp_coll_p, key, (void**) &pdcp_p); if (h_rc == HASH_TABLE_OK) { - LOG_D(RRC, "PDCP_COLL_KEY_VALUE() returns valid key = %d\n", key); + LOG_D(RRC, "PDCP_COLL_KEY_VALUE() returns valid key = %ld\n", key); LOG_D(RRC, "driving kRRCenc, kRRCint and kUPenc from KeNB=" "%02x%02x%02x%02x" @@ -1656,7 +1654,7 @@ rrc_ue_process_securityModeCommand( securityMode); } } else { - LOG_W(RRC, "Could not get PDCP instance where key=0x%\n", key); + LOG_W(RRC, "Could not get PDCP instance where key=0x%ld\n", key); } #endif //#if defined(ENABLE_SECURITY) @@ -1702,7 +1700,7 @@ rrc_ue_process_securityModeCommand( #endif #ifdef USER_MODE - LOG_D(RRC, "securityModeComplete Encoded %d bits (%d bytes)\n", enc_rval.encoded, (enc_rval.encoded+7)/8); + LOG_D(RRC, "securityModeComplete Encoded %zd bits (%zd bytes)\n", enc_rval.encoded, (enc_rval.encoded+7)/8); #endif for (i = 0; i < (enc_rval.encoded + 7) / 8; i++) { @@ -1807,7 +1805,7 @@ rrc_ue_process_ueCapabilityEnquiry( #endif #ifdef USER_MODE - LOG_D(RRC,"UECapabilityInformation Encoded %d bits (%d bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8); + LOG_D(RRC,"UECapabilityInformation Encoded %zd bits (%zd bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8); #endif for (i = 0; i < (enc_rval.encoded + 7) / 8; i++) { @@ -2218,7 +2216,7 @@ rrc_ue_decode_dcch( if (UE_rrc_inst[ctxt_pP->module_id].HandoverInfoUe.targetCellId != dl_dcch_msg->message.choice.c1.choice.rrcConnectionReconfiguration.criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.mobilityControlInfo->targetPhysCellId) { LOG_W(RRC, - "[UE %d] Frame %d: Handover target (%d) is different from RSRP measured target (%d)..\n", + "[UE %d] Frame %d: Handover target (%ld) is different from RSRP measured target (%ld)..\n", ctxt_pP->module_id, ctxt_pP->frame, dl_dcch_msg->message.choice.c1.choice.rrcConnectionReconfiguration.criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.mobilityControlInfo->targetPhysCellId, @@ -3134,7 +3132,8 @@ static void dump_sib2( SystemInformationBlockType2_t *sib2 ) LOG_I( RRC, "radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.ackNackSRS_SimultaneousTransmission : %d\n", sib2->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.ackNackSRS_SimultaneousTransmission ); LOG_I( RRC, "radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.srs_MaxUpPts : %ld\n", - sib2->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.srs_MaxUpPts ); + /* TODO: check that it's okay to access [0] */ + sib2->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.srs_MaxUpPts[0] ); } // uplinkPowerControlCommon @@ -3378,7 +3377,7 @@ uint64_t arfcn_to_freq(long arfcn) { else if (arfcn <45590) // Band 43 return((uint64_t)3600000000 + ((arfcn-43950)*100000)); else { - LOG_E(RRC,"Unknown EARFCN %d\n",arfcn); + LOG_E(RRC,"Unknown EARFCN %ld\n",arfcn); exit(1); } } @@ -3393,19 +3392,20 @@ static void dump_sib5( SystemInformationBlockType5_t *sib5 ) for (i=0;i<interFreqCarrierFreqList.list.count;i++) { LOG_I(RRC, "SIB5 InterFreqCarrierFreq element %d/%d\n",i,interFreqCarrierFreqList.list.count); ifcfInfo = interFreqCarrierFreqList.list.array[i]; - LOG_I(RRC, " DL Carrier Frequency/ARFCN : %ld/%d\n", + LOG_I(RRC, " DL Carrier Frequency/ARFCN : %ld/%ld\n", arfcn_to_freq(ifcfInfo->dl_CarrierFreq), ifcfInfo->dl_CarrierFreq); - LOG_I(RRC," Q_RXLevMin : %d\n", ifcfInfo->q_RxLevMin); - LOG_I(RRC," P_max : %d\n",ifcfInfo->p_Max); - LOG_I(RRC," T_ReselectionEUTRA : %d\n",ifcfInfo->t_ReselectionEUTRA); + LOG_I(RRC," Q_RXLevMin : %ld\n", ifcfInfo->q_RxLevMin); + if (ifcfInfo->p_Max != NULL) + LOG_I(RRC," P_max : %ld\n", *ifcfInfo->p_Max); + LOG_I(RRC," T_ReselectionEUTRA : %ld\n",ifcfInfo->t_ReselectionEUTRA); if (ifcfInfo->t_ReselectionEUTRA_SF) { - LOG_I(RRC," t_ReselectionEUTRA_SF.sf_Medium %d, t_ReselectionEUTRA_SF.sf_High %d", + LOG_I(RRC," t_ReselectionEUTRA_SF.sf_Medium %ld, t_ReselectionEUTRA_SF.sf_High %ld", ifcfInfo->t_ReselectionEUTRA_SF->sf_Medium, ifcfInfo->t_ReselectionEUTRA_SF->sf_High); } - LOG_I(RRC," threshX_High : %d\n",ifcfInfo->threshX_High); - LOG_I(RRC," threshX_Low : %d\n",ifcfInfo->threshX_Low); + LOG_I(RRC," threshX_High : %ld\n",ifcfInfo->threshX_High); + LOG_I(RRC," threshX_Low : %ld\n",ifcfInfo->threshX_Low); switch(ifcfInfo->allowedMeasBandwidth) { case AllowedMeasBandwidth_mbw6: LOG_I(RRC," AllowedMeasBandwidth : 6\n"); @@ -3431,7 +3431,7 @@ static void dump_sib5( SystemInformationBlockType5_t *sib5 ) else LOG_I(RRC," PresenceAntennaPort1 : False\n"); if (ifcfInfo->cellReselectionPriority) { - LOG_I(RRC," CellReselectionPriority : %d\n", + LOG_I(RRC," CellReselectionPriority : %ld\n", *ifcfInfo->cellReselectionPriority); } LOG_I(RRC," NeighCellConfig : "); @@ -3444,29 +3444,29 @@ static void dump_sib5( SystemInformationBlockType5_t *sib5 ) if (ifcfInfo->interFreqNeighCellList) { for (j=0;j<ifcfInfo->interFreqNeighCellList->list.count;j++) { - LOG_I(RRC," Cell %d\n"); - LOG_I(RRC," PhysCellId : %d\n",ifcfInfo->interFreqNeighCellList->list.array[j]->physCellId); - LOG_I(RRC," Q_OffsetRange : %d\n",ifcfInfo->interFreqNeighCellList->list.array[j]->q_OffsetCell); + LOG_I(RRC," Cell %d\n", j); + LOG_I(RRC," PhysCellId : %ld\n",ifcfInfo->interFreqNeighCellList->list.array[j]->physCellId); + LOG_I(RRC," Q_OffsetRange : %ld\n",ifcfInfo->interFreqNeighCellList->list.array[j]->q_OffsetCell); } } if (ifcfInfo->interFreqBlackCellList) { for (j=0;j<ifcfInfo->interFreqBlackCellList->list.count;j++) { - LOG_I(RRC," Cell %d\n"); - LOG_I(RRC," PhysCellId start: %d\n",ifcfInfo->interFreqBlackCellList->list.array[j]->start); + LOG_I(RRC," Cell %d\n", j); + LOG_I(RRC," PhysCellId start: %ld\n",ifcfInfo->interFreqBlackCellList->list.array[j]->start); if (ifcfInfo->interFreqBlackCellList->list.array[i]->range) { - LOG_I(RRC," PhysCellId Range : %d\n",ifcfInfo->interFreqBlackCellList->list.array[j]->range); + LOG_I(RRC," PhysCellId Range : %ld\n",*ifcfInfo->interFreqBlackCellList->list.array[j]->range); } } } #ifdef Rel10 if (ifcfInfo->ext1 && ifcfInfo->ext1->q_QualMin_r9) - LOG_I(RRC," Q_QualMin_r9 : %d\n",*ifcfInfo->ext1->q_QualMin_r9); + LOG_I(RRC," Q_QualMin_r9 : %ld\n",*ifcfInfo->ext1->q_QualMin_r9); if (ifcfInfo->ext1 && ifcfInfo->ext1->threshX_Q_r9) { - LOG_I(RRC," threshX_HighQ_r9 : %d\n",ifcfInfo->ext1->threshX_Q_r9->threshX_HighQ_r9); - LOG_I(RRC," threshX_LowQ_r9: %d\n",ifcfInfo->ext1->threshX_Q_r9->threshX_LowQ_r9); + LOG_I(RRC," threshX_HighQ_r9 : %ld\n",ifcfInfo->ext1->threshX_Q_r9->threshX_HighQ_r9); + LOG_I(RRC," threshX_LowQ_r9: %ld\n",ifcfInfo->ext1->threshX_Q_r9->threshX_LowQ_r9); } #endif } @@ -3786,7 +3786,7 @@ void ue_meas_filtering( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_ ctxt_pP->frame, 10*log10(mac_xface->get_RSSI(ctxt_pP->module_id,0))-mac_xface->get_rx_total_gain_dB(ctxt_pP->module_id,0), 10*log10(mac_xface->get_RSSI(ctxt_pP->module_id,0))); - LOG_D(RRC,"[UE %d] Frame %d: Meas RSRP: eNB_offset: %d rsrp_coef: %3.1f filter_coef: %d before L3 filtering: rsrp: %3.1f after L3 filtering: rsrp: %3.1f \n ", + LOG_D(RRC,"[UE %d] Frame %d: Meas RSRP: eNB_offset: %d rsrp_coef: %3.1f filter_coef: %ld before L3 filtering: rsrp: %3.1f after L3 filtering: rsrp: %3.1f \n ", ctxt_pP->module_id, ctxt_pP->frame, eNB_offset,a, *UE_rrc_inst->QuantityConfig[0]->quantityConfigEUTRA->filterCoefficientRSRP, @@ -3886,7 +3886,7 @@ static void rrc_ue_generate_MeasurementReport(protocol_ctxt_t* const ctxt_pP, ui if (pframe!=ctxt_pP->frame) { pframe=ctxt_pP->frame; - LOG_D(RRC, "[UE %d] Frame %d: doing MeasReport: servingCell(%d) targetCell(%d) rsrp_s(%ld) rsrq_s(%ld) rsrp_t(%ld) rsrq_t(%ld) \n", + LOG_D(RRC, "[UE %d] Frame %d: doing MeasReport: servingCell(%ld) targetCell(%ld) rsrp_s(%ld) rsrq_s(%ld) rsrp_t(%ld) rsrq_t(%ld) \n", ctxt_pP->module_id, ctxt_pP->frame, cellId, @@ -4041,7 +4041,7 @@ static uint8_t check_trigger_meas_event( uint8_t currentCellIndex = mac_xface->frame_parms->Nid_cell; uint8_t tmp_offset; - LOG_I(RRC,"[UE %d] ofn(%d) ocn(%d) hys(%d) ofs(%d) ocs(%d) a3_offset(%d) ttt(%d) rssi %3.1f\n", + LOG_I(RRC,"[UE %d] ofn(%ld) ocn(%ld) hys(%ld) ofs(%ld) ocs(%ld) a3_offset(%ld) ttt(%ld) rssi %3.1f\n", ue_mod_idP, ofn,ocn,hys,ofs,ocs,a3_offset,ttt, 10*log10(mac_xface->get_RSSI(ue_mod_idP,0))-mac_xface->get_rx_total_gain_dB(ue_mod_idP,0)); @@ -4068,7 +4068,7 @@ static uint8_t check_trigger_meas_event( if (UE_rrc_inst->measTimer[ue_cnx_index][meas_index][tmp_offset] >= ttt) { UE_rrc_inst->HandoverInfoUe.targetCellId = get_adjacent_cell_id(ue_mod_idP,tmp_offset); //WARNING!!!...check this! - LOG_D(RRC,"[UE %d] Frame %d eNB %d: Handover triggered: targetCellId: %d currentCellId: %d eNB_offset: %d rsrp source: %3.1f rsrp target: %3.1f\n", \ + LOG_D(RRC,"[UE %d] Frame %d eNB %d: Handover triggered: targetCellId: %ld currentCellId: %d eNB_offset: %d rsrp source: %3.1f rsrp target: %3.1f\n", \ ue_mod_idP, frameP, eNB_index, UE_rrc_inst->HandoverInfoUe.targetCellId,ue_cnx_index,eNB_offset, (dB_fixed_times10(UE_rrc_inst[ue_mod_idP].rsrp_db[0])/10.0)-mac_xface->get_rx_total_gain_dB(ue_mod_idP,0)-dB_fixed(mac_xface->frame_parms->N_RB_DL*12), @@ -4112,7 +4112,7 @@ int decode_MCCH_Message( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB Sdu_len); if ((dec_rval.code != RC_OK) && (dec_rval.consumed==0)) { - LOG_E(RRC,"[UE %d] Failed to decode MCCH__MESSAGE (%d bits)\n", + LOG_E(RRC,"[UE %d] Failed to decode MCCH__MESSAGE (%lu bits)\n", ctxt_pP->module_id, dec_rval.consumed); //free the memory @@ -4393,8 +4393,14 @@ void *rrc_ue_task( void *args_p ) case NAS_CELL_SELECTION_REQ: ue_mod_id = 0; /* TODO force ue_mod_id to first UE, NAS UE not virtualized yet */ - LOG_D(RRC, "[UE %d] Received %s: state %d, plmnID %d, rat %x\n", ue_mod_id, msg_name, rrc_get_state(ue_mod_id), - NAS_CELL_SELECTION_REQ (msg_p).plmnID, NAS_CELL_SELECTION_REQ (msg_p).rat); + LOG_D(RRC, "[UE %d] Received %s: state %d, plmnID (%d%d%d.%d%d%d), rat %x\n", ue_mod_id, msg_name, rrc_get_state(ue_mod_id), + NAS_CELL_SELECTION_REQ (msg_p).plmnID.MCCdigit1, + NAS_CELL_SELECTION_REQ (msg_p).plmnID.MCCdigit2, + NAS_CELL_SELECTION_REQ (msg_p).plmnID.MCCdigit3, + NAS_CELL_SELECTION_REQ (msg_p).plmnID.MNCdigit1, + NAS_CELL_SELECTION_REQ (msg_p).plmnID.MNCdigit2, + NAS_CELL_SELECTION_REQ (msg_p).plmnID.MNCdigit3, + NAS_CELL_SELECTION_REQ (msg_p).rat); if (rrc_get_state(ue_mod_id) == RRC_STATE_INACTIVE) { // have a look at MAC/main.c void dl_phy_sync_success(...) @@ -4457,8 +4463,16 @@ void *rrc_ue_task( void *args_p ) break; case NAS_CONN_ESTABLI_REQ: - LOG_D(RRC, "[UE %d] Received %s: cause %d, type %d, s_tmsi %d, plmnID %d\n", ue_mod_id, msg_name, NAS_CONN_ESTABLI_REQ (msg_p).cause, - NAS_CONN_ESTABLI_REQ (msg_p).type, NAS_CONN_ESTABLI_REQ (msg_p).s_tmsi, NAS_CONN_ESTABLI_REQ (msg_p).plmnID); + LOG_D(RRC, "[UE %d] Received %s: cause %d, type %d, s_tmsi (mme code %"PRIu8", m-tmsi %"PRIu32"), plmnID (%d%d%d.%d%d%d)\n", ue_mod_id, msg_name, NAS_CONN_ESTABLI_REQ (msg_p).cause, + NAS_CONN_ESTABLI_REQ (msg_p).type, + NAS_CONN_ESTABLI_REQ (msg_p).s_tmsi.MMEcode, + NAS_CONN_ESTABLI_REQ (msg_p).s_tmsi.m_tmsi, + NAS_CONN_ESTABLI_REQ (msg_p).plmnID.MCCdigit1, + NAS_CONN_ESTABLI_REQ (msg_p).plmnID.MCCdigit2, + NAS_CONN_ESTABLI_REQ (msg_p).plmnID.MCCdigit3, + NAS_CONN_ESTABLI_REQ (msg_p).plmnID.MNCdigit1, + NAS_CONN_ESTABLI_REQ (msg_p).plmnID.MNCdigit2, + NAS_CONN_ESTABLI_REQ (msg_p).plmnID.MNCdigit3); //PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, ENB_FLAG_NO, NOT_A_RNTI, 0, 0); PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, ue_mod_id, ENB_FLAG_NO, NOT_A_RNTI, 0, 0, 0); diff --git a/openair2/RRC/LITE/rrc_common.c b/openair2/RRC/LITE/rrc_common.c index 67ee4053d0d846427d63be8fb99359b342798a91..b039ecd8de2c20f91d47ea4490bb107362bfb24a 100644 --- a/openair2/RRC/LITE/rrc_common.c +++ b/openair2/RRC/LITE/rrc_common.c @@ -484,7 +484,8 @@ rrc_rx_tx( if (UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T304_cnt == 0) { UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T304_active = 0; UE_rrc_inst[ctxt_pP->module_id].HandoverInfoUe.measFlag = 1; - LOG_E(RRC,"[UE %d] Handover failure..initiating connection re-establishment procedure... \n"); + LOG_E(RRC,"[UE %d] Handover failure..initiating connection re-establishment procedure... \n", + ctxt_pP->module_id); //Implement 36.331, section 5.3.5.6 here VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_RX_TX,VCD_FUNCTION_OUT); return(RRC_Handover_failed); diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index d279764528de3cee992bad917a43bb3b1fdd9bb0..8b5b012ff1a7178a2a8dcf9a49ea1211abd09020 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -96,7 +96,7 @@ #if defined(FLEXRAN_AGENT_SB_IF) #include "flexran_agent_extern.h" #endif -#define XER_PRINT +//#define XER_PRINT #ifdef PHY_EMUL extern EMULATION_VARS *Emul_vars; @@ -304,14 +304,14 @@ init_SI( // SIB13 for (i = 0; i < eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib13->mbsfn_AreaInfoList_r9.list.count; i++) { - LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" SIB13 contents for MBSFN sync area %d/2 (partial)\n", + LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" SIB13 contents for MBSFN sync area %d/%d (partial)\n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), i, eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib13->mbsfn_AreaInfoList_r9.list.count); - LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" MCCH Repetition Period: %d (just index number, not real value)\n", + LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" MCCH Repetition Period: %ld (just index number, not real value)\n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib13->mbsfn_AreaInfoList_r9.list.array[i]->mcch_Config_r9.mcch_RepetitionPeriod_r9); - LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" MCCH Offset: %d\n", + LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" MCCH Offset: %ld\n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib13->mbsfn_AreaInfoList_r9.list.array[i]->mcch_Config_r9.mcch_Offset_r9); } @@ -394,7 +394,7 @@ init_MCCH( eNB_rrc_inst[enb_mod_idP].carrier[CC_id].MCCH_MESSAGE[sync_area], sync_area); LOG_D(RRC, "[eNB %d] MCCH_MESSAGE contents for Sync Area %d (partial)\n", enb_mod_idP, sync_area); - LOG_D(RRC, "[eNB %d] CommonSF_AllocPeriod_r9 %d\n", enb_mod_idP, + LOG_D(RRC, "[eNB %d] CommonSF_AllocPeriod_r9 %ld\n", enb_mod_idP, eNB_rrc_inst[enb_mod_idP].carrier[CC_id].mcch_message->commonSF_AllocPeriod_r9); LOG_D(RRC, "[eNB %d] CommonSF_Alloc_r9.list.count (number of MBSFN Subframe Pattern) %d\n", @@ -598,7 +598,7 @@ rrc_eNB_get_next_free_ue_context( RB_FOREACH(ue_context_p, rrc_ue_tree_s, &(eNB_rrc_inst[ctxt_pP->module_id].rrc_ue_head)) { if (ue_context_p->ue_context.random_ue_identity == ue_identityP) { LOG_D(RRC, - PROTOCOL_RRC_CTXT_UE_FMT" Cannot create new UE context, already exist rand UE id 0x%x, uid %u\n", + PROTOCOL_RRC_CTXT_UE_FMT" Cannot create new UE context, already exist rand UE id 0x%"PRIx64", uid %u\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), ue_identityP, ue_context_p->local_uid); @@ -690,7 +690,7 @@ rrc_eNB_free_mem_UE_context( { int i; LOG_T(RRC, - PROTOCOL_RRC_CTXT_UE_FMT" Clearing UE context 0x%x (free internal structs)\n", + PROTOCOL_RRC_CTXT_UE_FMT" Clearing UE context 0x%p (free internal structs)\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), ue_context_pP); #ifdef Rel10 @@ -1310,7 +1310,7 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co ASN_SEQUENCE_ADD(&(*DRB_configList2)->list, DRB_config); //ue_context_pP->ue_context.DRB_configList2[drb_identity_index] = &(*DRB_configList); - LOG_I(RRC,"EPS ID %d, DRB ID %d (index %d), QCI %d, priority %d, LCID %d LCGID %d \n", + LOG_I(RRC,"EPS ID %ld, DRB ID %ld (index %d), QCI %d, priority %ld, LCID %ld LCGID %ld \n", *DRB_config->eps_BearerIdentity, DRB_config->drb_Identity, i, ue_context_pP->ue_context.e_rab[i].param.qos.qci, @@ -1703,7 +1703,7 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t* cons if (*physicalConfigDedicated) { if ((*physicalConfigDedicated)->antennaInfo) { (*physicalConfigDedicated)->antennaInfo->choice.explicitValue.transmissionMode = rrc_inst->configuration.ue_TransmissionMode[0]; - LOG_D(RRC,"Setting transmission mode to %d+1\n",rrc_inst->configuration.ue_TransmissionMode[0]); + LOG_D(RRC,"Setting transmission mode to %ld+1\n",rrc_inst->configuration.ue_TransmissionMode[0]); if (rrc_inst->configuration.ue_TransmissionMode[0]==AntennaInfoDedicated__transmissionMode_tm3) { (*physicalConfigDedicated)->antennaInfo->choice.explicitValue.codebookSubsetRestriction= CALLOC(1,sizeof(AntennaInfoDedicated__codebookSubsetRestriction_PR)); @@ -2265,8 +2265,8 @@ rrc_eNB_process_MeasurementReport( } #ifdef Rel10 - LOG_I(RRC, "RSRP of Source %d\n", measResults2->measResultPCell.rsrpResult); - LOG_I(RRC, "RSRQ of Source %d\n", measResults2->measResultPCell.rsrqResult); + LOG_I(RRC, "RSRP of Source %ld\n", measResults2->measResultPCell.rsrpResult); + LOG_I(RRC, "RSRQ of Source %ld\n", measResults2->measResultPCell.rsrqResult); #else LOG_I(RRC, "RSRP of Source %d\n", measResults2->measResultServCell.rsrpResult); LOG_I(RRC, "RSRQ of Source %d\n", measResults2->measResultServCell.rsrqResult); @@ -2368,7 +2368,7 @@ rrc_eNB_generate_HandoverPreparationInformation( ue_context_target_p->ue_id_rnti = ue_context_pP->ue_context.rnti; // LG: should not be the same ue_context_target_p->ue_context.rnti = ue_context_target_p->ue_id_rnti; // idem LOG_N(RRC, - "[eNB %d] Frame %d : Emulate sending HandoverPreparationInformation msg from eNB source %d to eNB target %d: source UE_id %x target UE_id %x source_modId: %d target_modId: %d\n", + "[eNB %d] Frame %d : Emulate sending HandoverPreparationInformation msg from eNB source %d to eNB target %ld: source UE_id %x target UE_id %x source_modId: %d target_modId: %d\n", ctxt_pP->module_id, ctxt_pP->frame, eNB_rrc_inst[ctxt_pP->module_id].carrier[0] /* CROUX TBC */.physCellId, @@ -2395,7 +2395,7 @@ rrc_eNB_generate_HandoverPreparationInformation( ue_context_target_p->ue_context.handover_info->ueid_t = ue_context_target_p->ue_context.rnti; } else { - LOG_E(RRC, "\nError in obtaining free UE id in target eNB %l for handover \n", targetPhyId); + LOG_E(RRC, "\nError in obtaining free UE id in target eNB %ld for handover \n", targetPhyId); } } else { @@ -3160,7 +3160,7 @@ rrc_eNB_generate_RRCConnectionReconfiguration_handover( memset((void *)mobilityInfo, 0, sizeof(*mobilityInfo)); mobilityInfo->targetPhysCellId = (PhysCellId_t) two_tier_hexagonal_cellIds[ue_context_pP->ue_context.handover_info->modid_t]; - LOG_D(RRC, "[eNB %d] Frame %d: handover preparation: targetPhysCellId: %d mod_id: %d ue: %x \n", + LOG_D(RRC, "[eNB %d] Frame %d: handover preparation: targetPhysCellId: %ld mod_id: %d ue: %x \n", ctxt_pP->module_id, ctxt_pP->frame, mobilityInfo->targetPhysCellId, @@ -3254,7 +3254,8 @@ rrc_eNB_generate_RRCConnectionReconfiguration_handover( (void *)rrc_inst->sps_Config[ue_mod_idP], sizeof(SPS_Config_t)); */ - LOG_I(RRC, "[eNB %d] Frame %d: adding new UE\n"); + LOG_I(RRC, "[eNB %d] Frame %d: adding new UE\n", + ctxt_pP->module_id, ctxt_pP->frame); //Idx = (ue_mod_idP * NB_RB_MAX) + DCCH; Idx = DCCH; // SRB1 @@ -3549,9 +3550,10 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( ctxt_pP->frame, ue_context_pP->ue_context.primaryCC_id); } else { - LOG_W(RRC,"[eNB %d] Frame %d CC %d : invalide SRB identity %d\n", + LOG_W(RRC,"[eNB %d] Frame %d CC %d : invalide SRB identity %ld\n", ctxt_pP->module_id, ctxt_pP->frame, + ue_context_pP->ue_context.primaryCC_id, SRB_configList->list.array[i]->srb_Identity); } } @@ -4189,9 +4191,11 @@ rrc_eNB_decode_ccch( * the current one must be removed from MAC/PHY (zombie UE) */ if ((ue_context_p = rrc_eNB_ue_context_random_exist(ctxt_pP, random_value))) { -//#warning "TODO: random_exist: remove UE from MAC/PHY (how?)" - // AssertFatal(0 == 1, "TODO: remove UE from MAC/PHY (how?)"); + LOG_W(RRC, "new UE rnti %x (coming with random value) is already there as UE %x, removing %x from MAC/PHY\n", + ctxt_pP->rnti, ue_context_p->ue_context.rnti, ctxt_pP->rnti); + rrc_mac_remove_ue(ctxt_pP->module_id, ctxt_pP->rnti); ue_context_p = NULL; + return 0; } else { ue_context_p = rrc_eNB_get_next_free_ue_context(ctxt_pP, random_value); } @@ -4202,9 +4206,8 @@ rrc_eNB_decode_ccch( m_tmsi_t m_tmsi = BIT_STRING_to_uint32(&s_TMSI.m_TMSI); random_value = (((uint64_t)mme_code) << 32) | m_tmsi; if ((ue_context_p = rrc_eNB_ue_context_stmsi_exist(ctxt_pP, mme_code, m_tmsi))) { - - //#warning "TODO: stmsi_exist: remove UE from MAC/PHY (how?)" LOG_I(RRC," S-TMSI exists, ue_context_p %p, old rnti %x => %x\n",ue_context_p,ue_context_p->ue_context.rnti,ctxt_pP->rnti); + rrc_mac_remove_ue(ctxt_pP->module_id, ue_context_p->ue_context.rnti); stmsi_received=1; /* replace rnti in the context */ /* for that, remove the context from the RB tree */ @@ -4216,10 +4219,8 @@ rrc_eNB_decode_ccch( /* reset timers */ ue_context_p->ue_context.ul_failure_timer = 0; ue_context_p->ue_context.ue_release_timer = 0; - // AssertFatal(0 == 1, "TODO: remove UE from MAC/PHY (how?)"); - // ue_context_p = NULL; } else { - LOG_I(RRC," S-TMSI doesn't exist, setting Initialue_identity_s_TMSI.m_tmsi to %x => %x\n",ue_context_p,m_tmsi); + LOG_I(RRC," S-TMSI doesn't exist, setting Initialue_identity_s_TMSI.m_tmsi to %p => %x\n",ue_context_p,m_tmsi); ue_context_p = rrc_eNB_get_next_free_ue_context(ctxt_pP, NOT_A_RANDOM_UE_IDENTITY); if (ue_context_p == NULL) LOG_E(RRC, "%s:%d:%s: rrc_eNB_get_next_free_ue_context returned NULL\n", __FILE__, __LINE__, __FUNCTION__); @@ -4228,7 +4229,8 @@ rrc_eNB_decode_ccch( ue_context_p->ue_context.Initialue_identity_s_TMSI.mme_code = mme_code; ue_context_p->ue_context.Initialue_identity_s_TMSI.m_tmsi = m_tmsi; } else { - break; + /* TODO: do we have to break here? */ + //break; } } @@ -4256,7 +4258,7 @@ rrc_eNB_decode_ccch( } LOG_D(RRC, - PROTOCOL_RRC_CTXT_UE_FMT" UE context: %X\n", + PROTOCOL_RRC_CTXT_UE_FMT" UE context: %p\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), ue_context_p); @@ -4266,14 +4268,14 @@ rrc_eNB_decode_ccch( #if defined(ENABLE_ITTI) ue_context_p->ue_context.establishment_cause = rrcConnectionRequest->establishmentCause; if (stmsi_received==0) - LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Accept new connection from UE random UE identity (0x%" PRIx64 ") MME code %u TMSI %u cause %u\n", + LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Accept new connection from UE random UE identity (0x%" PRIx64 ") MME code %u TMSI %u cause %ld\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), ue_context_p->ue_context.random_ue_identity, ue_context_p->ue_context.Initialue_identity_s_TMSI.mme_code, ue_context_p->ue_context.Initialue_identity_s_TMSI.m_tmsi, ue_context_p->ue_context.establishment_cause); else - LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Accept new connection from UE MME code %u TMSI %u cause %u\n", + LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Accept new connection from UE MME code %u TMSI %u cause %ld\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), ue_context_p->ue_context.Initialue_identity_s_TMSI.mme_code, ue_context_p->ue_context.Initialue_identity_s_TMSI.m_tmsi, @@ -4463,7 +4465,7 @@ rrc_eNB_decode_dcch( } if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) { - LOG_E(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Failed to decode UL-DCCH (%d bytes)\n", + LOG_E(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Failed to decode UL-DCCH (%zu bytes)\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), dec_rval.consumed); return -1; @@ -4530,13 +4532,13 @@ rrc_eNB_decode_dcch( if (ue_context_p->ue_context.Status == RRC_RECONFIGURED){ dedicated_DRB = 1; LOG_I(RRC, - PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_RECONFIGURED (dedicated DRB, xid %d)\n", + PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_RECONFIGURED (dedicated DRB, xid %ld)\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.rrc_TransactionIdentifier); }else { dedicated_DRB = 0; ue_context_p->ue_context.Status = RRC_RECONFIGURED; LOG_I(RRC, - PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_RECONFIGURED (default DRB, xid %d)\n", + PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_RECONFIGURED (default DRB, xid %ld)\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.rrc_TransactionIdentifier); } rrc_eNB_process_RRCConnectionReconfigurationComplete( @@ -4784,6 +4786,7 @@ rrc_eNB_decode_dcch( #ifdef XER_PRINT xer_fprint(stdout, &asn_DEF_UL_DCCH_Message, (void *)ul_dcch_msg); #endif + LOG_I(RRC, "got UE capabilities for UE %x\n", ctxt_pP->rnti); dec_rval = uper_decode(NULL, &asn_DEF_UE_EUTRA_Capability, (void **)&UE_EUTRA_Capability, @@ -4794,7 +4797,7 @@ rrc_eNB_decode_dcch( choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list. array[0]->ueCapabilityRAT_Container.size, 0, 0); //#ifdef XER_PRINT - xer_fprint(stdout, &asn_DEF_UE_EUTRA_Capability, (void *)UE_EUTRA_Capability); + //xer_fprint(stdout, &asn_DEF_UE_EUTRA_Capability, (void *)UE_EUTRA_Capability); //#endif #if defined(ENABLE_USE_MME) diff --git a/openair2/RRC/LITE/rrc_eNB_S1AP.c b/openair2/RRC/LITE/rrc_eNB_S1AP.c index 8899c7d743bd9e024b18bea7985ce6206ff48d34..8984eb933c60c1e959e9cad9b5bd5c9c9b90c390 100644 --- a/openair2/RRC/LITE/rrc_eNB_S1AP.c +++ b/openair2/RRC/LITE/rrc_eNB_S1AP.c @@ -115,7 +115,7 @@ rrc_eNB_S1AP_get_ue_ids( (hash_key_t)eNB_ue_s1ap_id, result2); if (h_rc != HASH_TABLE_OK) { - LOG_E(S1AP, "[eNB %u] Error while hashtable_insert in s1ap_id2_s1ap_ids eNB_ue_s1ap_id %u\n", + LOG_E(S1AP, "[eNB %ld] Error while hashtable_insert in s1ap_id2_s1ap_ids eNB_ue_s1ap_id %"PRIu32"\n", rrc_instance_pP - eNB_rrc_inst, eNB_ue_s1ap_id); } } @@ -308,7 +308,7 @@ rrc_eNB_process_security( changed = TRUE; } - LOG_I (RRC, "[eNB %d][UE %x] Selected security algorithms (%x): %x, %x, %s\n", + LOG_I (RRC, "[eNB %d][UE %x] Selected security algorithms (%p): %x, %x, %s\n", ctxt_pP->module_id, ue_context_pP->ue_context.rnti, security_capabilities_pP, @@ -1008,7 +1008,7 @@ int rrc_eNB_process_S1AP_UE_CTXT_MODIFICATION_REQ(MessageDef *msg_p, const char /* Can not associate this message to an UE index, send a failure to S1AP and discard it! */ MessageDef *msg_fail_p; - LOG_W(RRC, "[eNB %d] In S1AP_UE_CTXT_MODIFICATION_REQ: unknown UE from eNB_ue_s1ap_id (%d) for eNB %d\n", instance, eNB_ue_s1ap_id); + LOG_W(RRC, "[eNB %d] In S1AP_UE_CTXT_MODIFICATION_REQ: unknown UE from eNB_ue_s1ap_id (%d)\n", instance, eNB_ue_s1ap_id); msg_fail_p = itti_alloc_new_message (TASK_RRC_ENB, S1AP_UE_CTXT_MODIFICATION_FAIL); S1AP_UE_CTXT_MODIFICATION_FAIL (msg_fail_p).eNB_ue_s1ap_id = eNB_ue_s1ap_id; diff --git a/openair2/UTIL/ASYNC_IF/link_manager.c b/openair2/UTIL/ASYNC_IF/link_manager.c index 1c9fb72bfe3f79d9636fd2808799b09af85e51ab..235acef2471eb52c7c2bd6c30f25f79f8b1d93ff 100644 --- a/openair2/UTIL/ASYNC_IF/link_manager.c +++ b/openair2/UTIL/ASYNC_IF/link_manager.c @@ -61,9 +61,9 @@ static void *link_manager_sender_thread(void *_manager) return NULL; -error: - LOG_E(MAC, "%s: error\n", __FUNCTION__); - return NULL; + //error: + //LOG_E(MAC, "%s: error\n", __FUNCTION__); + //return NULL; } /* that thread receives messages from the link and puts them in the queue */ @@ -118,7 +118,6 @@ link_manager_t *create_link_manager( // Make the async interface threads real-time //#ifndef LOWLATENCY struct sched_param sched_param_recv_thread; - struct sched_param sched_param_send_thread; sched_param_recv_thread.sched_priority = sched_get_priority_max(SCHED_RR) - 1; pthread_attr_setschedparam(&attr, &sched_param_recv_thread); diff --git a/openair2/UTIL/LFDS/liblfds7.0.0/liblfds700/inc/liblfds700.h b/openair2/UTIL/LFDS/liblfds7.0.0/liblfds700/inc/liblfds700.h index fdda50cefba67824e61c23fd2229129637d324ff..4f83d8d9a0b6ee440276a66f2adf712306221c42 100644 --- a/openair2/UTIL/LFDS/liblfds7.0.0/liblfds700/inc/liblfds700.h +++ b/openair2/UTIL/LFDS/liblfds7.0.0/liblfds700/inc/liblfds700.h @@ -4,9 +4,9 @@ #define LIBLFDS700_H /***** pragmas on *****/ - #pragma warning( disable : 4324 ) // TRD : 4324 disables MSVC warnings for structure alignment padding due to alignment specifiers +// #pragma warning( disable : 4324 ) // TRD : 4324 disables MSVC warnings for structure alignment padding due to alignment specifiers - #pragma prefast( disable : 28113 28182 28183, "blah" ) +// #pragma prefast( disable : 28113 28182 28183, "blah" ) /***** includes *****/ #include "liblfds700/lfds700_porting_abstraction_layer_compiler.h" @@ -25,7 +25,7 @@ #include "liblfds700/lfds700_stack.h" /***** pragmas off *****/ - #pragma warning( default : 4324 ) +// #pragma warning( default : 4324 ) #endif diff --git a/openair2/UTIL/LFDS/liblfds7.0.0/liblfds700/inc/liblfds700/lfds700_misc.h b/openair2/UTIL/LFDS/liblfds7.0.0/liblfds700/inc/liblfds700/lfds700_misc.h index 014f72dac533b8cdcf902ef69bae8adbca39a425..79eb3e7e5a7b0c2270acef279cd718fbfd567284 100644 --- a/openair2/UTIL/LFDS/liblfds7.0.0/liblfds700/inc/liblfds700/lfds700_misc.h +++ b/openair2/UTIL/LFDS/liblfds7.0.0/liblfds700/inc/liblfds700/lfds700_misc.h @@ -175,7 +175,7 @@ void lfds700_misc_prng_init( struct lfds700_misc_prng_state *ps ); void lfds700_misc_query( enum lfds700_misc_query query_type, void *query_input, void *query_output ); /***** public in-line functions *****/ -#pragma prefast( disable : 28112, "blah" ) +// #pragma prefast( disable : 28112, "blah" ) static LFDS700_PAL_INLINE void lfds700_misc_force_store() { diff --git a/openair2/UTIL/LFDS/liblfds7.0.0/liblfds700/src/lfds700_ringbuffer/lfds700_ringbuffer_cleanup.c b/openair2/UTIL/LFDS/liblfds7.0.0/liblfds700/src/lfds700_ringbuffer/lfds700_ringbuffer_cleanup.c index 447c93041e36e8b626d2da09610b94c919efd61d..8ab44e46b5d52040062926c2a5ea93a72b3e2387 100644 --- a/openair2/UTIL/LFDS/liblfds7.0.0/liblfds700/src/lfds700_ringbuffer/lfds700_ringbuffer_cleanup.c +++ b/openair2/UTIL/LFDS/liblfds7.0.0/liblfds700/src/lfds700_ringbuffer/lfds700_ringbuffer_cleanup.c @@ -31,7 +31,7 @@ void lfds700_ringbuffer_cleanup( struct lfds700_ringbuffer_state *rs, /****************************************************************************/ -#pragma warning( disable : 4100 ) +//#pragma warning( disable : 4100 ) static void lfds700_ringbuffer_internal_queue_element_cleanup_callback( struct lfds700_queue_state *qs, struct lfds700_queue_element *qe, enum lfds700_misc_flag dummy_element_flag ) { @@ -54,14 +54,14 @@ static void lfds700_ringbuffer_internal_queue_element_cleanup_callback( struct l return; } -#pragma warning( default : 4100 ) +//#pragma warning( default : 4100 ) /****************************************************************************/ -#pragma warning( disable : 4100 ) +//#pragma warning( disable : 4100 ) static void lfds700_ringbuffer_internal_freelist_element_cleanup_callback( struct lfds700_freelist_state *fs, struct lfds700_freelist_element *fe ) { @@ -82,5 +82,5 @@ static void lfds700_ringbuffer_internal_freelist_element_cleanup_callback( struc return; } -#pragma warning( default : 4100 ) +//#pragma warning( default : 4100 ) diff --git a/openair2/UTIL/LOG/log_if.h b/openair2/UTIL/LOG/log_if.h index 1b447a7f602b3b176a8cb21c18b702b7df5d1c62..3dd25ff365350008105946824804991f8982095f 100644 --- a/openair2/UTIL/LOG/log_if.h +++ b/openair2/UTIL/LOG/log_if.h @@ -60,8 +60,8 @@ extern "C" { //public_log_if( log_t *g_log;) public_log_if( int logInit (void);) -public_log_if( void logRecord_mt(const char *file, const char *func, int line,int comp, int level, const char *format, ...);) -public_log_if( void logRecord(const char *file, const char *func, int line,int comp, int level, const char *format, ...);) +public_log_if( void logRecord_mt(const char *file, const char *func, int line,int comp, int level, const char *format, ...) __attribute__ ((format (printf, 6, 7)));) +public_log_if( void logRecord(const char *file, const char *func, int line,int comp, int level, const char *format, ...) __attribute__ ((format (printf, 6, 7)));) public_log_if( int set_comp_log(int component, int level, int verbosity, int interval);) public_log_if( int set_log(int component, int level, int interval);) public_log_if( void set_glog(int level, int verbosity);) diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.c b/openair2/UTIL/LOG/vcd_signal_dumper.c index 0997eea162c0e08c5de378520f76bde61734eae5..96f173833ae9d911070280faed4b13ca6a986f85 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.c +++ b/openair2/UTIL/LOG/vcd_signal_dumper.c @@ -98,6 +98,7 @@ const char* eurecomVariablesNames[] = { "rxcnt", "trx_ts", "trx_tst", + "trx_write_flags", "tx_ts", "rx_ts", "hw_cnt_rx", diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.h b/openair2/UTIL/LOG/vcd_signal_dumper.h index 7b6fb0e0d1f6781abd6945bd0eda46522a42d869..e1bcff39fcb63c69aed24ff5a1da9e26830284a1 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.h +++ b/openair2/UTIL/LOG/vcd_signal_dumper.h @@ -70,6 +70,7 @@ typedef enum { VCD_SIGNAL_DUMPER_VARIABLES_RXCNT, VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, + VCD_SIGNAL_DUMPER_VARIABLES_TRX_WRITE_FLAGS, VCD_SIGNAL_DUMPER_VARIABLES_TX_TS, VCD_SIGNAL_DUMPER_VARIABLES_RX_TS, VCD_SIGNAL_DUMPER_VARIABLES_RX_HWCNT, diff --git a/openair2/UTIL/OMG/common.c b/openair2/UTIL/OMG/common.c index fc41e5dd3a311849fa7d9a4e60feb3500c672223..f1c850e689a82c1a276cbc190ddaa943227470a4 100644 --- a/openair2/UTIL/OMG/common.c +++ b/openair2/UTIL/OMG/common.c @@ -199,7 +199,11 @@ display_node_list (node_list * node_vector) //use a python script to postprocess the positions, check the // support: view node mobility of one node during the entire simulation OR only one snapshot - LOG_F(OMG,"%d; %.3f; %.3f; %.3f\n", + /* TODO: this LOG_F generates a warning, below is a fix that removes a %.3f, maybe it's not the correct fix */ + /*LOG_F(OMG,"%d; %.3f; %.3f; %.3f\n", + tmp->node->id, + tmp->node->x_pos, tmp->node->y_pos);*/ + LOG_F(OMG,"%d; %.3f; %.3f\n", tmp->node->id, tmp->node->x_pos, tmp->node->y_pos); diff --git a/openair2/UTIL/OPT/probe.c b/openair2/UTIL/OPT/probe.c index 1c6b8e814bca524fa040d610501b6e9b106d2ed5..711436d2cd1ca9d703ce01e6fb4008f61720a1ab 100644 --- a/openair2/UTIL/OPT/probe.c +++ b/openair2/UTIL/OPT/probe.c @@ -159,7 +159,7 @@ static void *opt_listener_thread(void *arg) pthread_exit(NULL); } else { /* Normal read -> discard PDU */ - LOG_D(OPT, "Incoming data received from: %s:%u with length %d\n", + LOG_D(OPT, "Incoming data received from: %s:%u with length %zd\n", inet_ntoa(opt_listener.address.sin_addr), ntohs(opt_listener.address.sin_port), ret); } @@ -198,7 +198,9 @@ int opt_create_listener_socket(char *ip_address, uint16_t port) ret = bind(opt_listener.sd, (struct sockaddr*) &opt_listener.address, sizeof(opt_listener.address)); if (ret != 0) { - LOG_E(OPT, "Failed to bind socket to (%s:%u): %s\n", strerror(errno)); + LOG_E(OPT, "Failed to bind socket to (%s:%u): %s\n", + inet_ntoa(opt_listener.address.sin_addr), + ntohs(opt_listener.address.sin_port), strerror(errno)); opt_type = OPT_NONE; close(opt_listener.sd); opt_listener.sd = -1; @@ -358,7 +360,7 @@ static void SendFrame(guint8 radioType, guint8 direction, guint8 rntiType, (const struct sockaddr *)&g_serv_addr, sizeof(g_serv_addr)); if (bytesSent != frameOffset) { - LOG_W(OPT, "sendto() failed (not a thread-safe func)- expected %d bytes, got %d (errno=%d)\n", + LOG_W(OPT, "sendto() failed (not a thread-safe func)- expected %d bytes, got %ld (errno=%d)\n", frameOffset, bytesSent, errno); //exit(1); } diff --git a/openair2/UTIL/OTG/otg_kpi.c b/openair2/UTIL/OTG/otg_kpi.c index a056fe245633f14a4b3bb9764646b793041553a1..3f24d01ce6642b2ac656992e2ff9522e6c961166 100644 --- a/openair2/UTIL/OTG/otg_kpi.c +++ b/openair2/UTIL/OTG/otg_kpi.c @@ -216,7 +216,7 @@ void average_total_jitter(void) } } - LOG_I(OTG,"average_jitter_dl %d average_jitter_ul %lf \n",otg_info->average_jitter_dl,otg_info->average_jitter_ul ); + LOG_I(OTG,"average_jitter_dl %lf average_jitter_ul %lf \n",otg_info->average_jitter_dl,otg_info->average_jitter_ul ); // otg_info->average_jitter_dl/= (float)NB_UE_INST; // otg_info->average_jitter_ul/= (float)NB_UE_INST; } diff --git a/openair2/UTIL/OTG/otg_rx.c b/openair2/UTIL/OTG/otg_rx.c index 95cf19c1bd719a731636bc5cb0a98273e2f77e88..824439e8737284345a53ba14ae92267f0bae3bde 100644 --- a/openair2/UTIL/OTG/otg_rx.c +++ b/openair2/UTIL/OTG/otg_rx.c @@ -106,8 +106,10 @@ int otg_rx_pkt(const int dst_instanceP, const int ctime, const char * const buff if (dst_instance != dst_instanceP) { //#warning "LG: TODO think about multicast traffic" - LOG_W(OTG,"[SRC %d][DST %d] [FLOW_idx %d][APP TYPE %d] RX INFO pkt at time %d: flag 0x %x, seq number %d, tx time %d, size (hdr %d, pdcp %d) not for dest instance %u\n", - dst_instanceP); + /* TODO: fix this LOG, a lot of missing parameters, replaced by a simple basic version */ + /*LOG_W(OTG,"[SRC %d][DST %d] [FLOW_idx %d][APP TYPE %d] RX INFO pkt at time %d: flag 0x %x, seq number %d, tx time %d, size (hdr %d, pdcp %d) not for dest instance %u\n", + dst_instanceP);*/ + LOG_W(OTG,"dst_instance != dst_instanceP\n"); } if(otg_hdr_rx->traffic_type > MAX_NUM_APPLICATION) { @@ -246,7 +248,7 @@ int otg_rx_pkt(const int dst_instanceP, const int ctime, const char * const buff ctime - otg_hdr_rx->time, nb_loss_pkts); - LOG_I(OTG,"INFO LATENCY :: [SRC %d][DST %d] radio access %.2f (tx time %d, ctime %d), OWD:%.2f (ms):\n", + LOG_I(OTG,"INFO LATENCY :: [SRC %d][DST %d] radio access %.2f (tx time %d, ctime %d), OWD:%d (ms):\n", src_instance, dst_instance, otg_multicast_info->radio_access_delay[src_instance][dst_instance], diff --git a/openair2/UTIL/OTG/otg_tx.c b/openair2/UTIL/OTG/otg_tx.c index bdf8137cfa42c07159e0a156c9983d9324504ff5..d1ad2b2ed30e088ae687c3cef03812a21d3b2c56 100644 --- a/openair2/UTIL/OTG/otg_tx.c +++ b/openair2/UTIL/OTG/otg_tx.c @@ -305,10 +305,10 @@ unsigned char *packet_gen( otg_info->tx_num_pkt[src_instance][dst_instance][otg_info->traffic_type[src_instance][dst_instance]]+=1; if (size!=strlen(payload)) - LOG_E(OTG,"[%d][%d] [0x %x] The expected packet size does not match the payload size : size %d, strlen %d, seq_num %d packet: |%s|%s| \n", + LOG_E(OTG,"[%d][%d] [0x %x] The expected packet size does not match the payload size : size %d, strlen %zu, seq_num %d packet: |%s|%s| \n", src_instance, dst_instance, flag, size, strlen(payload), seq_num, header, payload); else - LOG_D(OTG,"[%d][%d] 0x %x][m2m Aggre %d][Flow %d][Type %d/%s] TX INFO pkt at time %d Size= [payload %d] [Total %d] with seq num %d, state=%d : |%s|%s| \n", + LOG_D(OTG,"[%d][%d] 0x %x][m2m Aggre %d][Flow %d][Type %d/%s] TX INFO pkt at time %d Size= [payload %d] [Total %zu] with seq num %d, state=%d : |%s|%s| \n", src_instance, dst_instance, flag, otg_info->m2m_aggregation[src_instance][dst_instance], otg_info->flow_id[src_instance][dst_instance], @@ -335,7 +335,7 @@ unsigned char *packet_gen( otg_info->seq_num_background[src_instance][dst_instance]+=1; if (otg_info->size_background[src_instance][dst_instance]!=strlen(payload)) - LOG_E(OTG,"[%d][%d] [0x %x] The expected packet size does not match the payload size : size %d, strlen %d, seq num %d, packet |%s|%s| \n", + LOG_E(OTG,"[%d][%d] [0x %x] The expected packet size does not match the payload size : size %d, strlen %zu, seq num %d, packet |%s|%s| \n", src_instance, dst_instance, flag, @@ -345,7 +345,7 @@ unsigned char *packet_gen( header, payload); else - LOG_D(OTG,"[%d][%d][%s][0x %x] TX INFO pkt at time %d size is %d with seq num %d, state=%d : |%s|%s| \n", + LOG_D(OTG,"[%d][%d][0x %x][%d] TX INFO pkt at time %s size is %d with seq num %d, state=%d : |%s|%s| \n", src_instance, dst_instance, flag, @@ -459,10 +459,10 @@ unsigned char *packet_gen_multicast( otg_multicast_info->tx_num_bytes[src_instance][dst_instance][app]); if (size!=strlen(payload)) - LOG_E(OTG,"[src %d][dst %d] The expected packet size does not match the payload size : size %d, strlen %d \n", + LOG_E(OTG,"[src %d][dst %d] The expected packet size does not match the payload size : size %d, strlen %zu \n", src_instance, dst_instance, size, strlen(payload)); else { - LOG_I(OTG,"[src %d][dst %d]TX INFO pkt at time %d Size= [payload %d] [Total %d] with seq num %d: |%s|%s| \n", + LOG_I(OTG,"[src %d][dst %d]TX INFO pkt at time %d Size= [payload %d] [Total %zu] with seq num %d: |%s|%s| \n", src_instance, dst_instance, ctime, @@ -838,7 +838,7 @@ unsigned int header_size(const int hdr_size) if (hdr_size>(sizeof(otg_hdr_info_t) + sizeof(otg_hdr_t))) size-=(sizeof(otg_hdr_info_t) + sizeof(otg_hdr_t)); else - LOG_W(OTG,"OTG Header not included inside packet header (OTG header:%d, Header%d)\n", hdr_size, sizeof(otg_hdr_info_t) + sizeof(otg_hdr_t) ); + LOG_W(OTG,"OTG Header not included inside packet header (OTG header:%d, Header%zu)\n", hdr_size, sizeof(otg_hdr_info_t) + sizeof(otg_hdr_t) ); return(size); @@ -1211,7 +1211,7 @@ void init_predef_traffic( break; case M2M_TRAFFIC : /* example of M2M traffic */ - LOG_I(OTG," M2M_TRAFFIC, src = %d, dst = %d \n", i, j, g_otg->application_type[i][j][k]); + LOG_I(OTG," M2M_TRAFFIC, src = %d, dst = %d, application type = %d\n", i, j, g_otg->application_type[i][j][k]); g_otg->trans_proto[i][j][k] = TCP; g_otg->ip_v[i][j][k] = IPV4; g_otg->pu_size_pkts[i][j][k]=50; @@ -2015,7 +2015,7 @@ void state_management( && (otg_info->state_transition_prob[src_instance][dst_instance][application]<=1)) && (otg_info->c_holding_time_off[src_instance][dst_instance]>=g_otg->holding_time_off_pe[src_instance][dst_instance])) { otg_info->state[src_instance][dst_instance][application]=PE_STATE; - LOG_I(OTG,"[%d][%d][Appli id %d][Agg Level=%d] NEW STATE:: OFF-->PE \n", src_instance, dst_instance,application, g_otg->aggregation_level[src_instance][dst_instance]); + LOG_I(OTG,"[%d][%d][Appli id %d][Agg Level=%d] NEW STATE:: OFF-->PE \n", src_instance, dst_instance,application, g_otg->aggregation_level[src_instance][dst_instance][application]); otg_info->state_transition_prob[src_instance][dst_instance][application]=uniform_dist(0,1); } else { diff --git a/openair3/COMMON/as_message.h b/openair3/COMMON/as_message.h deleted file mode 120000 index 3bfc76865acee46a60802c21105d4fa1822373d0..0000000000000000000000000000000000000000 --- a/openair3/COMMON/as_message.h +++ /dev/null @@ -1 +0,0 @@ -../../openair2/COMMON/as_message.h \ No newline at end of file diff --git a/openair3/COMMON/as_message.h b/openair3/COMMON/as_message.h new file mode 100644 index 0000000000000000000000000000000000000000..30810a325eace63c944b947bfb8c0a6487094e80 --- /dev/null +++ b/openair3/COMMON/as_message.h @@ -0,0 +1,578 @@ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + + +/***************************************************************************** + +Source as_message.h + +Version 0.1 + +Date 2012/10/18 + +Product NAS stack + +Subsystem Application Programming Interface + +Author Frederic Maurel + +Description Defines the messages supported by the Access Stratum sublayer + protocol (usually RRC and S1AP for E-UTRAN) and functions used + to encode and decode + +*****************************************************************************/ +#ifndef __AS_MESSAGE_H__ +#define __AS_MESSAGE_H__ + +#include "commonDef.h" +#include "networkDef.h" + +/****************************************************************************/ +/********************* G L O B A L C O N S T A N T S *******************/ +/****************************************************************************/ + +/* + * -------------------------------------------------------------------------- + * Access Stratum message types + * -------------------------------------------------------------------------- + */ +#define AS_REQUEST 0x0100 +#define AS_RESPONSE 0x0200 +#define AS_INDICATION 0x0400 +#define AS_CONFIRM 0x0800 + +/* + * -------------------------------------------------------------------------- + * Access Stratum message identifiers + * -------------------------------------------------------------------------- + */ + +/* Broadcast information */ +#define AS_BROADCAST_INFO 0x01 +#define AS_BROADCAST_INFO_IND (AS_BROADCAST_INFO | AS_INDICATION) + +/* Cell information relevant for cell selection processing */ +#define AS_CELL_INFO 0x02 +#define AS_CELL_INFO_REQ (AS_CELL_INFO | AS_REQUEST) +#define AS_CELL_INFO_CNF (AS_CELL_INFO | AS_CONFIRM) +#define AS_CELL_INFO_IND (AS_CELL_INFO | AS_INDICATION) + +/* Paging information */ +#define AS_PAGING 0x03 +#define AS_PAGING_REQ (AS_PAGING | AS_REQUEST) +#define AS_PAGING_IND (AS_PAGING | AS_INDICATION) + +/* NAS signalling connection establishment */ +#define AS_NAS_ESTABLISH 0x04 +#define AS_NAS_ESTABLISH_REQ (AS_NAS_ESTABLISH | AS_REQUEST) +#define AS_NAS_ESTABLISH_IND (AS_NAS_ESTABLISH | AS_INDICATION) +#define AS_NAS_ESTABLISH_RSP (AS_NAS_ESTABLISH | AS_RESPONSE) +#define AS_NAS_ESTABLISH_CNF (AS_NAS_ESTABLISH | AS_CONFIRM) + +/* NAS signalling connection release */ +#define AS_NAS_RELEASE 0x05 +#define AS_NAS_RELEASE_REQ (AS_NAS_RELEASE | AS_REQUEST) +#define AS_NAS_RELEASE_IND (AS_NAS_RELEASE | AS_INDICATION) + +/* Uplink information transfer */ +#define AS_UL_INFO_TRANSFER 0x06 +#define AS_UL_INFO_TRANSFER_REQ (AS_UL_INFO_TRANSFER | AS_REQUEST) +#define AS_UL_INFO_TRANSFER_CNF (AS_UL_INFO_TRANSFER | AS_CONFIRM) +#define AS_UL_INFO_TRANSFER_IND (AS_UL_INFO_TRANSFER | AS_INDICATION) + +/* Downlink information transfer */ +#define AS_DL_INFO_TRANSFER 0x07 +#define AS_DL_INFO_TRANSFER_REQ (AS_DL_INFO_TRANSFER | AS_REQUEST) +#define AS_DL_INFO_TRANSFER_CNF (AS_DL_INFO_TRANSFER | AS_CONFIRM) +#define AS_DL_INFO_TRANSFER_IND (AS_DL_INFO_TRANSFER | AS_INDICATION) + +/* Radio Access Bearer establishment */ +#define AS_RAB_ESTABLISH 0x08 +#define AS_RAB_ESTABLISH_REQ (AS_RAB_ESTABLISH | AS_REQUEST) +#define AS_RAB_ESTABLISH_IND (AS_RAB_ESTABLISH | AS_INDICATION) +#define AS_RAB_ESTABLISH_RSP (AS_RAB_ESTABLISH | AS_RESPONSE) +#define AS_RAB_ESTABLISH_CNF (AS_RAB_ESTABLISH | AS_CONFIRM) + +/* Radio Access Bearer release */ +#define AS_RAB_RELEASE 0x09 +#define AS_RAB_RELEASE_REQ (AS_RAB_RELEASE | AS_REQUEST) +#define AS_RAB_RELEASE_IND (AS_RAB_RELEASE | AS_INDICATION) + +/* NAS Cause */ +#define EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED (8) +#define EPS_SERVICES_NOT_ALLOWED (7) +#define PLMN_NOT_ALLOWED (11) +#define TRACKING_AREA_NOT_ALLOWED (12) +#define ROAMING_NOT_ALLOWED_IN_THIS_TRACKING_AREA (13) +#define EPS_SERVICES_NOT_ALLOWED_IN_THIS_PLMN (14) +#define NO_SUITABLE_CELLS_IN_TRACKING_AREA (15) +#define NETWORK_FAILURE (17) +#define ESM_FAILURE (19) + +typedef enum nas_cause_s { + NAS_CAUSE_EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED = EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED, + NAS_CAUSE_EPS_SERVICES_NOT_ALLOWED = EPS_SERVICES_NOT_ALLOWED, + NAS_CAUSE_PLMN_NOT_ALLOWED = PLMN_NOT_ALLOWED, + NAS_CAUSE_TRACKING_AREA_NOT_ALLOWED = TRACKING_AREA_NOT_ALLOWED, + NAS_CAUSE_ROAMING_NOT_ALLOWED_IN_THIS_TRACKING_AREA = ROAMING_NOT_ALLOWED_IN_THIS_TRACKING_AREA, + NAS_CAUSE_EPS_SERVICES_NOT_ALLOWED_IN_THIS_PLMN = EPS_SERVICES_NOT_ALLOWED_IN_THIS_PLMN, + NAS_CAUSE_NO_SUITABLE_CELLS_IN_TRACKING_AREA = NO_SUITABLE_CELLS_IN_TRACKING_AREA, + NAS_CAUSE_NETWORK_FAILURE = NETWORK_FAILURE, + NAS_CAUSE_ESM_FAILURE = ESM_FAILURE +} nas_cause_t; + +/* + * -------------------------------------------------------------------------- + * Access Stratum message global parameters + * -------------------------------------------------------------------------- + */ + +/* Error code */ +typedef enum nas_error_code_s { + AS_SUCCESS = 1, /* Success code, transaction is going on */ + AS_TERMINATED_NAS, /* Transaction terminated by NAS */ + AS_TERMINATED_AS, /* Transaction terminated by AS */ + AS_FAILURE /* Failure code */ +} nas_error_code_t; + +/* Core network domain */ +typedef enum core_network_s { + AS_PS = 1, /* Packet-Switched */ + AS_CS /* Circuit-Switched */ +} core_network_t; + +/* SAE Temporary Mobile Subscriber Identity */ +typedef struct as_stmsi_s { + uint8_t MMEcode; /* MME code that allocated the GUTI */ + uint32_t m_tmsi; /* M-Temporary Mobile Subscriber Identity */ +} as_stmsi_t; + +/* Dedicated NAS information */ +typedef struct as_nas_info_s { + uint32_t length; /* Length of the NAS information data */ + Byte_t* data; /* Dedicated NAS information data container */ +} as_nas_info_t; + +/* Radio Access Bearer identity */ +typedef uint8_t as_rab_id_t; + +/****************************************************************************/ +/************************ G L O B A L T Y P E S ************************/ +/****************************************************************************/ + +/* + * -------------------------------------------------------------------------- + * Broadcast information + * -------------------------------------------------------------------------- + */ + +/* + * AS->NAS - Broadcast information indication + * AS may asynchronously report to NAS available PLMNs within specific + * location area + */ +typedef struct broadcast_info_ind_s { +#define PLMN_LIST_MAX_SIZE 6 + PLMN_LIST_T(PLMN_LIST_MAX_SIZE) plmnIDs; /* List of PLMN identifiers */ + ci_t cellID; /* Identity of the cell serving the listed PLMNs */ + tac_t tac; /* Code of the tracking area the cell belongs to */ +} broadcast_info_ind_t; + +/* + * -------------------------------------------------------------------------- + * Cell information relevant for cell selection processing + * -------------------------------------------------------------------------- + */ + +/* Radio access technologies supported by the network */ +#define AS_GSM (1 << NET_ACCESS_GSM) +#define AS_COMPACT (1 << NET_ACCESS_COMPACT) +#define AS_UTRAN (1 << NET_ACCESS_UTRAN) +#define AS_EGPRS (1 << NET_ACCESS_EGPRS) +#define AS_HSDPA (1 << NET_ACCESS_HSDPA) +#define AS_HSUPA (1 << NET_ACCESS_HSUPA) +#define AS_HSDUPA (1 << NET_ACCESS_HSDUPA) +#define AS_EUTRAN (1 << NET_ACCESS_EUTRAN) + +/* + * NAS->AS - Cell Information request + * NAS request AS to search for a suitable cell belonging to the selected + * PLMN to camp on. + */ +typedef struct cell_info_req_s { + plmn_t plmnID; /* Selected PLMN identity */ + Byte_t rat; /* Bitmap - set of radio access technologies */ +} cell_info_req_t; + +/* + * AS->NAS - Cell Information confirm + * AS search for a suitable cell and respond to NAS. If found, the cell + * is selected to camp on. + */ +typedef struct cell_info_cnf_s { + uint8_t errCode; /* Error code */ + ci_t cellID; /* Identity of the cell serving the selected PLMN */ + tac_t tac; /* Code of the tracking area the cell belongs to */ + AcT_t rat; /* Radio access technology supported by the cell */ + uint8_t rsrq; /* Reference signal received quality */ + uint8_t rsrp; /* Reference signal received power */ +} cell_info_cnf_t; + +/* + * AS->NAS - Cell Information indication + * AS may change cell selection if a more suitable cell is found. + */ +typedef struct cell_info_ind_s { + ci_t cellID; /* Identity of the new serving cell */ + tac_t tac; /* Code of the tracking area the cell belongs to */ +} cell_info_ind_t; + +/* + * -------------------------------------------------------------------------- + * Paging information + * -------------------------------------------------------------------------- + */ + +/* Paging cause */ +typedef enum paging_cause_s { + AS_CONNECTION_ESTABLISH, /* Establish NAS signalling connection */ + AS_EPS_ATTACH, /* Perform local detach and initiate EPS + * attach procedure */ + AS_CS_FALLBACK /* Inititate CS fallback procedure */ +} paging_cause_t; + +/* + * NAS->AS - Paging Information request + * NAS requests the AS that NAS signalling messages or user data is pending + * to be sent. + */ +typedef struct paging_req_s { + as_stmsi_t s_tmsi; /* UE identity */ + uint8_t CN_domain; /* Core network domain */ +} paging_req_t; + +/* + * AS->NAS - Paging Information indication + * AS reports to the NAS that appropriate procedure has to be initiated. + */ +typedef struct paging_ind_s { + paging_cause_t cause; /* Paging cause */ +} paging_ind_t; + +/* + * -------------------------------------------------------------------------- + * NAS signalling connection establishment + * -------------------------------------------------------------------------- + */ + +/* Cause of RRC connection establishment */ +typedef enum as_cause_s { + AS_CAUSE_UNKNOWN = 0, + AS_CAUSE_EMERGENCY = NET_ESTABLISH_CAUSE_EMERGENCY, + AS_CAUSE_HIGH_PRIO = NET_ESTABLISH_CAUSE_HIGH_PRIO, + AS_CAUSE_MT_ACCESS = NET_ESTABLISH_CAUSE_MT_ACCESS, + AS_CAUSE_MO_SIGNAL = NET_ESTABLISH_CAUSE_MO_SIGNAL, + AS_CAUSE_MO_DATA = NET_ESTABLISH_CAUSE_MO_DATA, + AS_CAUSE_V1020 = NET_ESTABLISH_CAUSE_V1020 +} as_cause_t; + +/* Type of the call associated to the RRC connection establishment */ +typedef enum as_call_type_s { + AS_TYPE_ORIGINATING_SIGNAL = NET_ESTABLISH_TYPE_ORIGINATING_SIGNAL, + AS_TYPE_EMERGENCY_CALLS = NET_ESTABLISH_TYPE_EMERGENCY_CALLS, + AS_TYPE_ORIGINATING_CALLS = NET_ESTABLISH_TYPE_ORIGINATING_CALLS, + AS_TYPE_TERMINATING_CALLS = NET_ESTABLISH_TYPE_TERMINATING_CALLS, + AS_TYPE_MO_CS_FALLBACK = NET_ESTABLISH_TYPE_MO_CS_FALLBACK +} as_call_type_t; + +/* + * NAS->AS - NAS signalling connection establishment request + * NAS requests the AS to perform the RRC connection establishment procedure + * to transfer initial NAS message to the network while UE is in IDLE mode. + */ +typedef struct nas_establish_req_s { + as_cause_t cause; /* RRC connection establishment cause */ + as_call_type_t type; /* RRC associated call type */ + as_stmsi_t s_tmsi; /* UE identity */ + plmn_t plmnID; /* Selected PLMN identity */ + as_nas_info_t initialNasMsg; /* Initial NAS message to transfer */ +} nas_establish_req_t; + +/* + * AS->NAS - NAS signalling connection establishment indication + * AS transfers the initial NAS message to the NAS. + */ +typedef struct nas_establish_ind_s { + uint32_t UEid; /* UE lower layer identifier */ + tac_t tac; /* Code of the tracking area the initiating + * UE belongs to */ + as_cause_t asCause; /* Establishment cause */ + as_nas_info_t initialNasMsg; /* Initial NAS message to transfer */ +} nas_establish_ind_t; + +/* + * NAS->AS - NAS signalling connection establishment response + * NAS responds to the AS that initial answer message has to be provided to + * the UE. + */ +typedef struct nas_establish_rsp_s { + uint32_t UEid; /* UE lower layer identifier */ + as_stmsi_t s_tmsi; /* UE identity */ + nas_error_code_t errCode; /* Transaction status */ + as_nas_info_t nasMsg; /* NAS message to transfer */ + uint32_t nas_ul_count; /* UL NAS COUNT */ + uint16_t selected_encryption_algorithm; + uint16_t selected_integrity_algorithm; +} nas_establish_rsp_t; + +/* + * AS->NAS - NAS signalling connection establishment confirm + * AS transfers the initial answer message to the NAS. + */ +typedef struct nas_establish_cnf_s { + uint32_t UEid; /* UE lower layer identifier */ + nas_error_code_t errCode; /* Transaction status */ + as_nas_info_t nasMsg; /* NAS message to transfer */ + uint32_t ul_nas_count; + uint16_t selected_encryption_algorithm; + uint16_t selected_integrity_algorithm; +} nas_establish_cnf_t; + +/* + * -------------------------------------------------------------------------- + * NAS signalling connection release + * -------------------------------------------------------------------------- + */ + +/* Release cause */ +typedef enum release_cause_s { + AS_AUTHENTICATION_FAILURE = 1, /* Authentication procedure failed */ + AS_DETACH /* Detach requested */ +} release_cause_t; + +/* + * NAS->AS - NAS signalling connection release request + * NAS requests the termination of the connection with the UE. + */ +typedef struct nas_release_req_s { + uint32_t UEid; /* UE lower layer identifier */ + as_stmsi_t s_tmsi; /* UE identity */ + release_cause_t cause; /* Release cause */ +} nas_release_req_t; + +/* + * AS->NAS - NAS signalling connection release indication + * AS reports that connection has been terminated by the network. + */ +typedef struct nas_release_ind_s { + release_cause_t cause; /* Release cause */ +} nas_release_ind_t; + +/* + * -------------------------------------------------------------------------- + * NAS information transfer + * -------------------------------------------------------------------------- + */ + +/* + * NAS->AS - Uplink data transfer request + * NAS requests the AS to transfer uplink information to the NAS that + * operates at the network side. + */ +typedef struct ul_info_transfer_req_s { + uint32_t UEid; /* UE lower layer identifier */ + as_stmsi_t s_tmsi; /* UE identity */ + as_nas_info_t nasMsg; /* Uplink NAS message */ +} ul_info_transfer_req_t; + +/* + * AS->NAS - Uplink data transfer confirm + * AS immediately notifies the NAS whether uplink information has been + * successfully sent to the network or not. + */ +typedef struct ul_info_transfer_cnf_s { + uint32_t UEid; /* UE lower layer identifier */ + nas_error_code_t errCode; /* Transaction status */ +} ul_info_transfer_cnf_t; + +/* + * AS->NAS - Uplink data transfer indication + * AS delivers the uplink information message to the NAS that operates + * at the network side. + */ +typedef struct ul_info_transfer_ind_s { + uint32_t UEid; /* UE lower layer identifier */ + as_nas_info_t nasMsg; /* Uplink NAS message */ +} ul_info_transfer_ind_t; + +/* + * NAS->AS - Downlink data transfer request + * NAS requests the AS to transfer downlink information to the NAS that + * operates at the UE side. + */ +typedef ul_info_transfer_req_t dl_info_transfer_req_t; + +/* + * AS->NAS - Downlink data transfer confirm + * AS immediately notifies the NAS whether downlink information has been + * successfully sent to the network or not. + */ +typedef ul_info_transfer_cnf_t dl_info_transfer_cnf_t; + +/* + * AS->NAS - Downlink data transfer indication + * AS delivers the downlink information message to the NAS that operates + * at the UE side. + */ +typedef ul_info_transfer_ind_t dl_info_transfer_ind_t; + +/* + * -------------------------------------------------------------------------- + * Radio Access Bearer establishment + * -------------------------------------------------------------------------- + */ + +/* TODO: Quality of Service parameters */ +typedef struct {} as_qos_t; + +/* + * NAS->AS - Radio access bearer establishment request + * NAS requests the AS to allocate transmission resources to radio access + * bearer initialized at the network side. + */ +typedef struct rab_establish_req_s { + as_stmsi_t s_tmsi; /* UE identity */ + as_rab_id_t rabID; /* Radio access bearer identity */ + as_qos_t QoS; /* Requested Quality of Service */ +} rab_establish_req_t; + +/* + * AS->NAS - Radio access bearer establishment indication + * AS notifies the NAS that specific radio access bearer has to be setup. + */ +typedef struct rab_establish_ind_s { + as_rab_id_t rabID; /* Radio access bearer identity */ +} rab_establish_ind_t; + +/* + * NAS->AS - Radio access bearer establishment response + * NAS responds to AS whether the specified radio access bearer has been + * successfully setup or not. + */ +typedef struct rab_establish_rsp_s { + as_stmsi_t s_tmsi; /* UE identity */ + as_rab_id_t rabID; /* Radio access bearer identity */ + nas_error_code_t errCode; /* Transaction status */ +} rab_establish_rsp_t; + +/* + * AS->NAS - Radio access bearer establishment confirm + * AS notifies NAS whether the specified radio access bearer has been + * successfully setup at the UE side or not. + */ +typedef struct rab_establish_cnf_s { + as_rab_id_t rabID; /* Radio access bearer identity */ + nas_error_code_t errCode; /* Transaction status */ +} rab_establish_cnf_t; + +/* + * -------------------------------------------------------------------------- + * Radio Access Bearer release + * -------------------------------------------------------------------------- + */ + +/* + * NAS->AS - Radio access bearer release request + * NAS requests the AS to release transmission resources previously allocated + * to specific radio access bearer at the network side. + */ +typedef struct rab_release_req_s { + as_stmsi_t s_tmsi; /* UE identity */ + as_rab_id_t rabID; /* Radio access bearer identity */ +} rab_release_req_t; + +/* + * AS->NAS - Radio access bearer release indication + * AS notifies NAS that specific radio access bearer has been released. + */ +typedef struct rab_release_ind_s { + as_rab_id_t rabID; /* Radio access bearer identity */ +} rab_release_ind_t; + +/* + * -------------------------------------------------------------------------- + * Structure of the AS messages handled by the network sublayer + * -------------------------------------------------------------------------- + */ +typedef struct as_message_s { + uint16_t msgID; + union { + broadcast_info_ind_t broadcast_info_ind; + cell_info_req_t cell_info_req; + cell_info_cnf_t cell_info_cnf; + cell_info_ind_t cell_info_ind; + paging_req_t paging_req; + paging_ind_t paging_ind; + nas_establish_req_t nas_establish_req; + nas_establish_ind_t nas_establish_ind; + nas_establish_rsp_t nas_establish_rsp; + nas_establish_cnf_t nas_establish_cnf; + nas_release_req_t nas_release_req; + nas_release_ind_t nas_release_ind; + ul_info_transfer_req_t ul_info_transfer_req; + ul_info_transfer_cnf_t ul_info_transfer_cnf; + ul_info_transfer_ind_t ul_info_transfer_ind; + dl_info_transfer_req_t dl_info_transfer_req; + dl_info_transfer_cnf_t dl_info_transfer_cnf; + dl_info_transfer_ind_t dl_info_transfer_ind; + rab_establish_req_t rab_establish_req; + rab_establish_ind_t rab_establish_ind; + rab_establish_rsp_t rab_establish_rsp; + rab_establish_cnf_t rab_establish_cnf; + rab_release_req_t rab_release_req; + rab_release_ind_t rab_release_ind; + } __attribute__((__packed__)) msg; +} as_message_t; + +/****************************************************************************/ +/******************** G L O B A L V A R I A B L E S ********************/ +/****************************************************************************/ + +/****************************************************************************/ +/****************** E X P O R T E D F U N C T I O N S ******************/ +/****************************************************************************/ + +int as_message_decode(const char* buffer, as_message_t* msg, int length); + +int as_message_encode(char* buffer, as_message_t* msg, int length); + +/* Implemented in the network_api.c body file */ +int as_message_send(as_message_t* as_msg); + +#endif /* __AS_MESSAGE_H__*/ diff --git a/openair3/GTPV1-U/nw-gtpv1u/src/NwGtpv1u.c b/openair3/GTPV1-U/nw-gtpv1u/src/NwGtpv1u.c index a64694c0de151cdcd9249cf16702c4ab1cbe6d55..cd59028ce37dc5d45441ac0a5f3154cb9e3d846c 100644 --- a/openair3/GTPV1-U/nw-gtpv1u/src/NwGtpv1u.c +++ b/openair3/GTPV1-U/nw-gtpv1u/src/NwGtpv1u.c @@ -410,7 +410,7 @@ nwGtpv1uDestroyTunnelEndPoint( NwGtpv1uStackT *thiz, NwGtpv1uTunnelEndPointT *pRemovedTeid; if(pUlpReq->apiInfo.destroyTunnelEndPointInfo.hStackSessionHandle) { - GTPU_DEBUG( "Destroying Tunnel end-point '%x'", + GTPU_DEBUG( "Destroying Tunnel end-point '%lx'", pUlpReq->apiInfo.destroyTunnelEndPointInfo.hStackSessionHandle); pRemovedTeid = RB_REMOVE(NwGtpv1uTunnelEndPointIdentifierMap, &(thiz->teidMap), (NwGtpv1uTunnelEndPointT *)( @@ -423,7 +423,7 @@ nwGtpv1uDestroyTunnelEndPoint( NwGtpv1uStackT *thiz, (NwGtpv1uTunnelEndPointT *) pUlpReq->apiInfo.destroyTunnelEndPointInfo.hStackSessionHandle); } else { - GTPU_WARNING("Non-existent Tunnel end-point handle '%x'", + GTPU_WARNING("Non-existent Tunnel end-point handle '%lx'", pUlpReq->apiInfo.destroyTunnelEndPointInfo.hStackSessionHandle); } diff --git a/openair3/INTERTASK_INTERFACE b/openair3/INTERTASK_INTERFACE deleted file mode 120000 index 4bc54522d8ea289234614619607e5c8e9d228c42..0000000000000000000000000000000000000000 --- a/openair3/INTERTASK_INTERFACE +++ /dev/null @@ -1 +0,0 @@ -../common/utils/itti \ No newline at end of file diff --git a/openair3/NAS/COMMON/API/NETWORK/as_message.h b/openair3/NAS/COMMON/API/NETWORK/as_message.h deleted file mode 120000 index ef8d3686fd6b2b4f53bde09c5085a41cb523c0f0..0000000000000000000000000000000000000000 --- a/openair3/NAS/COMMON/API/NETWORK/as_message.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../openair2/COMMON/as_message.h \ No newline at end of file diff --git a/openair3/NAS/COMMON/API/NETWORK/as_message.h b/openair3/NAS/COMMON/API/NETWORK/as_message.h new file mode 100644 index 0000000000000000000000000000000000000000..30810a325eace63c944b947bfb8c0a6487094e80 --- /dev/null +++ b/openair3/NAS/COMMON/API/NETWORK/as_message.h @@ -0,0 +1,578 @@ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + + +/***************************************************************************** + +Source as_message.h + +Version 0.1 + +Date 2012/10/18 + +Product NAS stack + +Subsystem Application Programming Interface + +Author Frederic Maurel + +Description Defines the messages supported by the Access Stratum sublayer + protocol (usually RRC and S1AP for E-UTRAN) and functions used + to encode and decode + +*****************************************************************************/ +#ifndef __AS_MESSAGE_H__ +#define __AS_MESSAGE_H__ + +#include "commonDef.h" +#include "networkDef.h" + +/****************************************************************************/ +/********************* G L O B A L C O N S T A N T S *******************/ +/****************************************************************************/ + +/* + * -------------------------------------------------------------------------- + * Access Stratum message types + * -------------------------------------------------------------------------- + */ +#define AS_REQUEST 0x0100 +#define AS_RESPONSE 0x0200 +#define AS_INDICATION 0x0400 +#define AS_CONFIRM 0x0800 + +/* + * -------------------------------------------------------------------------- + * Access Stratum message identifiers + * -------------------------------------------------------------------------- + */ + +/* Broadcast information */ +#define AS_BROADCAST_INFO 0x01 +#define AS_BROADCAST_INFO_IND (AS_BROADCAST_INFO | AS_INDICATION) + +/* Cell information relevant for cell selection processing */ +#define AS_CELL_INFO 0x02 +#define AS_CELL_INFO_REQ (AS_CELL_INFO | AS_REQUEST) +#define AS_CELL_INFO_CNF (AS_CELL_INFO | AS_CONFIRM) +#define AS_CELL_INFO_IND (AS_CELL_INFO | AS_INDICATION) + +/* Paging information */ +#define AS_PAGING 0x03 +#define AS_PAGING_REQ (AS_PAGING | AS_REQUEST) +#define AS_PAGING_IND (AS_PAGING | AS_INDICATION) + +/* NAS signalling connection establishment */ +#define AS_NAS_ESTABLISH 0x04 +#define AS_NAS_ESTABLISH_REQ (AS_NAS_ESTABLISH | AS_REQUEST) +#define AS_NAS_ESTABLISH_IND (AS_NAS_ESTABLISH | AS_INDICATION) +#define AS_NAS_ESTABLISH_RSP (AS_NAS_ESTABLISH | AS_RESPONSE) +#define AS_NAS_ESTABLISH_CNF (AS_NAS_ESTABLISH | AS_CONFIRM) + +/* NAS signalling connection release */ +#define AS_NAS_RELEASE 0x05 +#define AS_NAS_RELEASE_REQ (AS_NAS_RELEASE | AS_REQUEST) +#define AS_NAS_RELEASE_IND (AS_NAS_RELEASE | AS_INDICATION) + +/* Uplink information transfer */ +#define AS_UL_INFO_TRANSFER 0x06 +#define AS_UL_INFO_TRANSFER_REQ (AS_UL_INFO_TRANSFER | AS_REQUEST) +#define AS_UL_INFO_TRANSFER_CNF (AS_UL_INFO_TRANSFER | AS_CONFIRM) +#define AS_UL_INFO_TRANSFER_IND (AS_UL_INFO_TRANSFER | AS_INDICATION) + +/* Downlink information transfer */ +#define AS_DL_INFO_TRANSFER 0x07 +#define AS_DL_INFO_TRANSFER_REQ (AS_DL_INFO_TRANSFER | AS_REQUEST) +#define AS_DL_INFO_TRANSFER_CNF (AS_DL_INFO_TRANSFER | AS_CONFIRM) +#define AS_DL_INFO_TRANSFER_IND (AS_DL_INFO_TRANSFER | AS_INDICATION) + +/* Radio Access Bearer establishment */ +#define AS_RAB_ESTABLISH 0x08 +#define AS_RAB_ESTABLISH_REQ (AS_RAB_ESTABLISH | AS_REQUEST) +#define AS_RAB_ESTABLISH_IND (AS_RAB_ESTABLISH | AS_INDICATION) +#define AS_RAB_ESTABLISH_RSP (AS_RAB_ESTABLISH | AS_RESPONSE) +#define AS_RAB_ESTABLISH_CNF (AS_RAB_ESTABLISH | AS_CONFIRM) + +/* Radio Access Bearer release */ +#define AS_RAB_RELEASE 0x09 +#define AS_RAB_RELEASE_REQ (AS_RAB_RELEASE | AS_REQUEST) +#define AS_RAB_RELEASE_IND (AS_RAB_RELEASE | AS_INDICATION) + +/* NAS Cause */ +#define EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED (8) +#define EPS_SERVICES_NOT_ALLOWED (7) +#define PLMN_NOT_ALLOWED (11) +#define TRACKING_AREA_NOT_ALLOWED (12) +#define ROAMING_NOT_ALLOWED_IN_THIS_TRACKING_AREA (13) +#define EPS_SERVICES_NOT_ALLOWED_IN_THIS_PLMN (14) +#define NO_SUITABLE_CELLS_IN_TRACKING_AREA (15) +#define NETWORK_FAILURE (17) +#define ESM_FAILURE (19) + +typedef enum nas_cause_s { + NAS_CAUSE_EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED = EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED, + NAS_CAUSE_EPS_SERVICES_NOT_ALLOWED = EPS_SERVICES_NOT_ALLOWED, + NAS_CAUSE_PLMN_NOT_ALLOWED = PLMN_NOT_ALLOWED, + NAS_CAUSE_TRACKING_AREA_NOT_ALLOWED = TRACKING_AREA_NOT_ALLOWED, + NAS_CAUSE_ROAMING_NOT_ALLOWED_IN_THIS_TRACKING_AREA = ROAMING_NOT_ALLOWED_IN_THIS_TRACKING_AREA, + NAS_CAUSE_EPS_SERVICES_NOT_ALLOWED_IN_THIS_PLMN = EPS_SERVICES_NOT_ALLOWED_IN_THIS_PLMN, + NAS_CAUSE_NO_SUITABLE_CELLS_IN_TRACKING_AREA = NO_SUITABLE_CELLS_IN_TRACKING_AREA, + NAS_CAUSE_NETWORK_FAILURE = NETWORK_FAILURE, + NAS_CAUSE_ESM_FAILURE = ESM_FAILURE +} nas_cause_t; + +/* + * -------------------------------------------------------------------------- + * Access Stratum message global parameters + * -------------------------------------------------------------------------- + */ + +/* Error code */ +typedef enum nas_error_code_s { + AS_SUCCESS = 1, /* Success code, transaction is going on */ + AS_TERMINATED_NAS, /* Transaction terminated by NAS */ + AS_TERMINATED_AS, /* Transaction terminated by AS */ + AS_FAILURE /* Failure code */ +} nas_error_code_t; + +/* Core network domain */ +typedef enum core_network_s { + AS_PS = 1, /* Packet-Switched */ + AS_CS /* Circuit-Switched */ +} core_network_t; + +/* SAE Temporary Mobile Subscriber Identity */ +typedef struct as_stmsi_s { + uint8_t MMEcode; /* MME code that allocated the GUTI */ + uint32_t m_tmsi; /* M-Temporary Mobile Subscriber Identity */ +} as_stmsi_t; + +/* Dedicated NAS information */ +typedef struct as_nas_info_s { + uint32_t length; /* Length of the NAS information data */ + Byte_t* data; /* Dedicated NAS information data container */ +} as_nas_info_t; + +/* Radio Access Bearer identity */ +typedef uint8_t as_rab_id_t; + +/****************************************************************************/ +/************************ G L O B A L T Y P E S ************************/ +/****************************************************************************/ + +/* + * -------------------------------------------------------------------------- + * Broadcast information + * -------------------------------------------------------------------------- + */ + +/* + * AS->NAS - Broadcast information indication + * AS may asynchronously report to NAS available PLMNs within specific + * location area + */ +typedef struct broadcast_info_ind_s { +#define PLMN_LIST_MAX_SIZE 6 + PLMN_LIST_T(PLMN_LIST_MAX_SIZE) plmnIDs; /* List of PLMN identifiers */ + ci_t cellID; /* Identity of the cell serving the listed PLMNs */ + tac_t tac; /* Code of the tracking area the cell belongs to */ +} broadcast_info_ind_t; + +/* + * -------------------------------------------------------------------------- + * Cell information relevant for cell selection processing + * -------------------------------------------------------------------------- + */ + +/* Radio access technologies supported by the network */ +#define AS_GSM (1 << NET_ACCESS_GSM) +#define AS_COMPACT (1 << NET_ACCESS_COMPACT) +#define AS_UTRAN (1 << NET_ACCESS_UTRAN) +#define AS_EGPRS (1 << NET_ACCESS_EGPRS) +#define AS_HSDPA (1 << NET_ACCESS_HSDPA) +#define AS_HSUPA (1 << NET_ACCESS_HSUPA) +#define AS_HSDUPA (1 << NET_ACCESS_HSDUPA) +#define AS_EUTRAN (1 << NET_ACCESS_EUTRAN) + +/* + * NAS->AS - Cell Information request + * NAS request AS to search for a suitable cell belonging to the selected + * PLMN to camp on. + */ +typedef struct cell_info_req_s { + plmn_t plmnID; /* Selected PLMN identity */ + Byte_t rat; /* Bitmap - set of radio access technologies */ +} cell_info_req_t; + +/* + * AS->NAS - Cell Information confirm + * AS search for a suitable cell and respond to NAS. If found, the cell + * is selected to camp on. + */ +typedef struct cell_info_cnf_s { + uint8_t errCode; /* Error code */ + ci_t cellID; /* Identity of the cell serving the selected PLMN */ + tac_t tac; /* Code of the tracking area the cell belongs to */ + AcT_t rat; /* Radio access technology supported by the cell */ + uint8_t rsrq; /* Reference signal received quality */ + uint8_t rsrp; /* Reference signal received power */ +} cell_info_cnf_t; + +/* + * AS->NAS - Cell Information indication + * AS may change cell selection if a more suitable cell is found. + */ +typedef struct cell_info_ind_s { + ci_t cellID; /* Identity of the new serving cell */ + tac_t tac; /* Code of the tracking area the cell belongs to */ +} cell_info_ind_t; + +/* + * -------------------------------------------------------------------------- + * Paging information + * -------------------------------------------------------------------------- + */ + +/* Paging cause */ +typedef enum paging_cause_s { + AS_CONNECTION_ESTABLISH, /* Establish NAS signalling connection */ + AS_EPS_ATTACH, /* Perform local detach and initiate EPS + * attach procedure */ + AS_CS_FALLBACK /* Inititate CS fallback procedure */ +} paging_cause_t; + +/* + * NAS->AS - Paging Information request + * NAS requests the AS that NAS signalling messages or user data is pending + * to be sent. + */ +typedef struct paging_req_s { + as_stmsi_t s_tmsi; /* UE identity */ + uint8_t CN_domain; /* Core network domain */ +} paging_req_t; + +/* + * AS->NAS - Paging Information indication + * AS reports to the NAS that appropriate procedure has to be initiated. + */ +typedef struct paging_ind_s { + paging_cause_t cause; /* Paging cause */ +} paging_ind_t; + +/* + * -------------------------------------------------------------------------- + * NAS signalling connection establishment + * -------------------------------------------------------------------------- + */ + +/* Cause of RRC connection establishment */ +typedef enum as_cause_s { + AS_CAUSE_UNKNOWN = 0, + AS_CAUSE_EMERGENCY = NET_ESTABLISH_CAUSE_EMERGENCY, + AS_CAUSE_HIGH_PRIO = NET_ESTABLISH_CAUSE_HIGH_PRIO, + AS_CAUSE_MT_ACCESS = NET_ESTABLISH_CAUSE_MT_ACCESS, + AS_CAUSE_MO_SIGNAL = NET_ESTABLISH_CAUSE_MO_SIGNAL, + AS_CAUSE_MO_DATA = NET_ESTABLISH_CAUSE_MO_DATA, + AS_CAUSE_V1020 = NET_ESTABLISH_CAUSE_V1020 +} as_cause_t; + +/* Type of the call associated to the RRC connection establishment */ +typedef enum as_call_type_s { + AS_TYPE_ORIGINATING_SIGNAL = NET_ESTABLISH_TYPE_ORIGINATING_SIGNAL, + AS_TYPE_EMERGENCY_CALLS = NET_ESTABLISH_TYPE_EMERGENCY_CALLS, + AS_TYPE_ORIGINATING_CALLS = NET_ESTABLISH_TYPE_ORIGINATING_CALLS, + AS_TYPE_TERMINATING_CALLS = NET_ESTABLISH_TYPE_TERMINATING_CALLS, + AS_TYPE_MO_CS_FALLBACK = NET_ESTABLISH_TYPE_MO_CS_FALLBACK +} as_call_type_t; + +/* + * NAS->AS - NAS signalling connection establishment request + * NAS requests the AS to perform the RRC connection establishment procedure + * to transfer initial NAS message to the network while UE is in IDLE mode. + */ +typedef struct nas_establish_req_s { + as_cause_t cause; /* RRC connection establishment cause */ + as_call_type_t type; /* RRC associated call type */ + as_stmsi_t s_tmsi; /* UE identity */ + plmn_t plmnID; /* Selected PLMN identity */ + as_nas_info_t initialNasMsg; /* Initial NAS message to transfer */ +} nas_establish_req_t; + +/* + * AS->NAS - NAS signalling connection establishment indication + * AS transfers the initial NAS message to the NAS. + */ +typedef struct nas_establish_ind_s { + uint32_t UEid; /* UE lower layer identifier */ + tac_t tac; /* Code of the tracking area the initiating + * UE belongs to */ + as_cause_t asCause; /* Establishment cause */ + as_nas_info_t initialNasMsg; /* Initial NAS message to transfer */ +} nas_establish_ind_t; + +/* + * NAS->AS - NAS signalling connection establishment response + * NAS responds to the AS that initial answer message has to be provided to + * the UE. + */ +typedef struct nas_establish_rsp_s { + uint32_t UEid; /* UE lower layer identifier */ + as_stmsi_t s_tmsi; /* UE identity */ + nas_error_code_t errCode; /* Transaction status */ + as_nas_info_t nasMsg; /* NAS message to transfer */ + uint32_t nas_ul_count; /* UL NAS COUNT */ + uint16_t selected_encryption_algorithm; + uint16_t selected_integrity_algorithm; +} nas_establish_rsp_t; + +/* + * AS->NAS - NAS signalling connection establishment confirm + * AS transfers the initial answer message to the NAS. + */ +typedef struct nas_establish_cnf_s { + uint32_t UEid; /* UE lower layer identifier */ + nas_error_code_t errCode; /* Transaction status */ + as_nas_info_t nasMsg; /* NAS message to transfer */ + uint32_t ul_nas_count; + uint16_t selected_encryption_algorithm; + uint16_t selected_integrity_algorithm; +} nas_establish_cnf_t; + +/* + * -------------------------------------------------------------------------- + * NAS signalling connection release + * -------------------------------------------------------------------------- + */ + +/* Release cause */ +typedef enum release_cause_s { + AS_AUTHENTICATION_FAILURE = 1, /* Authentication procedure failed */ + AS_DETACH /* Detach requested */ +} release_cause_t; + +/* + * NAS->AS - NAS signalling connection release request + * NAS requests the termination of the connection with the UE. + */ +typedef struct nas_release_req_s { + uint32_t UEid; /* UE lower layer identifier */ + as_stmsi_t s_tmsi; /* UE identity */ + release_cause_t cause; /* Release cause */ +} nas_release_req_t; + +/* + * AS->NAS - NAS signalling connection release indication + * AS reports that connection has been terminated by the network. + */ +typedef struct nas_release_ind_s { + release_cause_t cause; /* Release cause */ +} nas_release_ind_t; + +/* + * -------------------------------------------------------------------------- + * NAS information transfer + * -------------------------------------------------------------------------- + */ + +/* + * NAS->AS - Uplink data transfer request + * NAS requests the AS to transfer uplink information to the NAS that + * operates at the network side. + */ +typedef struct ul_info_transfer_req_s { + uint32_t UEid; /* UE lower layer identifier */ + as_stmsi_t s_tmsi; /* UE identity */ + as_nas_info_t nasMsg; /* Uplink NAS message */ +} ul_info_transfer_req_t; + +/* + * AS->NAS - Uplink data transfer confirm + * AS immediately notifies the NAS whether uplink information has been + * successfully sent to the network or not. + */ +typedef struct ul_info_transfer_cnf_s { + uint32_t UEid; /* UE lower layer identifier */ + nas_error_code_t errCode; /* Transaction status */ +} ul_info_transfer_cnf_t; + +/* + * AS->NAS - Uplink data transfer indication + * AS delivers the uplink information message to the NAS that operates + * at the network side. + */ +typedef struct ul_info_transfer_ind_s { + uint32_t UEid; /* UE lower layer identifier */ + as_nas_info_t nasMsg; /* Uplink NAS message */ +} ul_info_transfer_ind_t; + +/* + * NAS->AS - Downlink data transfer request + * NAS requests the AS to transfer downlink information to the NAS that + * operates at the UE side. + */ +typedef ul_info_transfer_req_t dl_info_transfer_req_t; + +/* + * AS->NAS - Downlink data transfer confirm + * AS immediately notifies the NAS whether downlink information has been + * successfully sent to the network or not. + */ +typedef ul_info_transfer_cnf_t dl_info_transfer_cnf_t; + +/* + * AS->NAS - Downlink data transfer indication + * AS delivers the downlink information message to the NAS that operates + * at the UE side. + */ +typedef ul_info_transfer_ind_t dl_info_transfer_ind_t; + +/* + * -------------------------------------------------------------------------- + * Radio Access Bearer establishment + * -------------------------------------------------------------------------- + */ + +/* TODO: Quality of Service parameters */ +typedef struct {} as_qos_t; + +/* + * NAS->AS - Radio access bearer establishment request + * NAS requests the AS to allocate transmission resources to radio access + * bearer initialized at the network side. + */ +typedef struct rab_establish_req_s { + as_stmsi_t s_tmsi; /* UE identity */ + as_rab_id_t rabID; /* Radio access bearer identity */ + as_qos_t QoS; /* Requested Quality of Service */ +} rab_establish_req_t; + +/* + * AS->NAS - Radio access bearer establishment indication + * AS notifies the NAS that specific radio access bearer has to be setup. + */ +typedef struct rab_establish_ind_s { + as_rab_id_t rabID; /* Radio access bearer identity */ +} rab_establish_ind_t; + +/* + * NAS->AS - Radio access bearer establishment response + * NAS responds to AS whether the specified radio access bearer has been + * successfully setup or not. + */ +typedef struct rab_establish_rsp_s { + as_stmsi_t s_tmsi; /* UE identity */ + as_rab_id_t rabID; /* Radio access bearer identity */ + nas_error_code_t errCode; /* Transaction status */ +} rab_establish_rsp_t; + +/* + * AS->NAS - Radio access bearer establishment confirm + * AS notifies NAS whether the specified radio access bearer has been + * successfully setup at the UE side or not. + */ +typedef struct rab_establish_cnf_s { + as_rab_id_t rabID; /* Radio access bearer identity */ + nas_error_code_t errCode; /* Transaction status */ +} rab_establish_cnf_t; + +/* + * -------------------------------------------------------------------------- + * Radio Access Bearer release + * -------------------------------------------------------------------------- + */ + +/* + * NAS->AS - Radio access bearer release request + * NAS requests the AS to release transmission resources previously allocated + * to specific radio access bearer at the network side. + */ +typedef struct rab_release_req_s { + as_stmsi_t s_tmsi; /* UE identity */ + as_rab_id_t rabID; /* Radio access bearer identity */ +} rab_release_req_t; + +/* + * AS->NAS - Radio access bearer release indication + * AS notifies NAS that specific radio access bearer has been released. + */ +typedef struct rab_release_ind_s { + as_rab_id_t rabID; /* Radio access bearer identity */ +} rab_release_ind_t; + +/* + * -------------------------------------------------------------------------- + * Structure of the AS messages handled by the network sublayer + * -------------------------------------------------------------------------- + */ +typedef struct as_message_s { + uint16_t msgID; + union { + broadcast_info_ind_t broadcast_info_ind; + cell_info_req_t cell_info_req; + cell_info_cnf_t cell_info_cnf; + cell_info_ind_t cell_info_ind; + paging_req_t paging_req; + paging_ind_t paging_ind; + nas_establish_req_t nas_establish_req; + nas_establish_ind_t nas_establish_ind; + nas_establish_rsp_t nas_establish_rsp; + nas_establish_cnf_t nas_establish_cnf; + nas_release_req_t nas_release_req; + nas_release_ind_t nas_release_ind; + ul_info_transfer_req_t ul_info_transfer_req; + ul_info_transfer_cnf_t ul_info_transfer_cnf; + ul_info_transfer_ind_t ul_info_transfer_ind; + dl_info_transfer_req_t dl_info_transfer_req; + dl_info_transfer_cnf_t dl_info_transfer_cnf; + dl_info_transfer_ind_t dl_info_transfer_ind; + rab_establish_req_t rab_establish_req; + rab_establish_ind_t rab_establish_ind; + rab_establish_rsp_t rab_establish_rsp; + rab_establish_cnf_t rab_establish_cnf; + rab_release_req_t rab_release_req; + rab_release_ind_t rab_release_ind; + } __attribute__((__packed__)) msg; +} as_message_t; + +/****************************************************************************/ +/******************** G L O B A L V A R I A B L E S ********************/ +/****************************************************************************/ + +/****************************************************************************/ +/****************** E X P O R T E D F U N C T I O N S ******************/ +/****************************************************************************/ + +int as_message_decode(const char* buffer, as_message_t* msg, int length); + +int as_message_encode(char* buffer, as_message_t* msg, int length); + +/* Implemented in the network_api.c body file */ +int as_message_send(as_message_t* as_msg); + +#endif /* __AS_MESSAGE_H__*/ diff --git a/openair3/NAS/COMMON/API/NETWORK/nas_message.c b/openair3/NAS/COMMON/API/NETWORK/nas_message.c index 8f326904ef26b5aa31d8a6adb13571c3e74e0e56..c61ad6532f94f34fb55a5242249220df6b95a12e 100644 --- a/openair3/NAS/COMMON/API/NETWORK/nas_message.c +++ b/openair3/NAS/COMMON/API/NETWORK/nas_message.c @@ -523,7 +523,7 @@ int nas_message_encode( /* Compute the NAS message authentication code */ LOG_TRACE(DEBUG, "offset %d = %d - %d, hdr encode = %d, length = %d bytes = %d", - offset, size, sizeof(uint8_t), + offset, size, (int)sizeof(uint8_t), size, length, bytes); uint32_t mac = _nas_message_get_mac( buffer + offset, @@ -992,12 +992,12 @@ static int _nas_message_decrypt( case NAS_SECURITY_ALGORITHMS_EEA1: { if (direction == SECU_DIRECTION_UPLINK) { - count = 0x00000000 || - ((emm_security_context->ul_count.overflow && 0x0000FFFF) << 8) || + count = 0x00000000 | + ((emm_security_context->ul_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->ul_count.seq_num & 0x000000FF); } else { - count = 0x00000000 || - ((emm_security_context->dl_count.overflow && 0x0000FFFF) << 8) || + count = 0x00000000 | + ((emm_security_context->dl_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->dl_count.seq_num & 0x000000FF); } @@ -1026,12 +1026,12 @@ static int _nas_message_decrypt( case NAS_SECURITY_ALGORITHMS_EEA2: { if (direction == SECU_DIRECTION_UPLINK) { - count = 0x00000000 || - ((emm_security_context->ul_count.overflow && 0x0000FFFF) << 8) || + count = 0x00000000 | + ((emm_security_context->ul_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->ul_count.seq_num & 0x000000FF); } else { - count = 0x00000000 || - ((emm_security_context->dl_count.overflow && 0x0000FFFF) << 8) || + count = 0x00000000 | + ((emm_security_context->dl_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->dl_count.seq_num & 0x000000FF); } @@ -1154,12 +1154,12 @@ static int _nas_message_encrypt( case NAS_SECURITY_ALGORITHMS_EEA1: { if (direction == SECU_DIRECTION_UPLINK) { - count = 0x00000000 || - ((emm_security_context->ul_count.overflow && 0x0000FFFF) << 8) || + count = 0x00000000 | + ((emm_security_context->ul_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->ul_count.seq_num & 0x000000FF); } else { - count = 0x00000000 || - ((emm_security_context->dl_count.overflow && 0x0000FFFF) << 8) || + count = 0x00000000 | + ((emm_security_context->dl_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->dl_count.seq_num & 0x000000FF); } @@ -1185,12 +1185,12 @@ static int _nas_message_encrypt( case NAS_SECURITY_ALGORITHMS_EEA2: { if (direction == SECU_DIRECTION_UPLINK) { - count = 0x00000000 || - ((emm_security_context->ul_count.overflow && 0x0000FFFF) << 8) || + count = 0x00000000 | + ((emm_security_context->ul_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->ul_count.seq_num & 0x000000FF); } else { - count = 0x00000000 || - ((emm_security_context->dl_count.overflow && 0x0000FFFF) << 8) || + count = 0x00000000 | + ((emm_security_context->dl_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->dl_count.seq_num & 0x000000FF); } @@ -1296,15 +1296,17 @@ static uint32_t _nas_message_get_mac( uint32_t count; uint32_t *mac32; +#ifdef DEBUG_NAS_MESSAGE int i,bytes = 0; +#endif if (direction == SECU_DIRECTION_UPLINK) { - count = 0x00000000 || - ((emm_security_context->ul_count.overflow && 0x0000FFFF) << 8) || + count = 0x00000000 | + ((emm_security_context->ul_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->ul_count.seq_num & 0x000000FF); } else { - count = 0x00000000 || - ((emm_security_context->dl_count.overflow && 0x0000FFFF) << 8) || + count = 0x00000000 | + ((emm_security_context->dl_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->dl_count.seq_num & 0x000000FF); } @@ -1367,12 +1369,12 @@ static uint32_t _nas_message_get_mac( uint32_t *mac32; if (direction == SECU_DIRECTION_UPLINK) { - count = 0x00000000 || - ((emm_security_context->ul_count.overflow && 0x0000FFFF) << 8) || + count = 0x00000000 | + ((emm_security_context->ul_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->ul_count.seq_num & 0x000000FF); } else { - count = 0x00000000 || - ((emm_security_context->dl_count.overflow && 0x0000FFFF) << 8) || + count = 0x00000000 | + ((emm_security_context->dl_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->dl_count.seq_num & 0x000000FF); } diff --git a/openair3/NAS/COMMON/UTIL/nas_log.h b/openair3/NAS/COMMON/UTIL/nas_log.h index 1889bd801d801df27d5a7912180d3839211d485b..c6e0fbcd80b494d458a7ed420e9d0e2ccf862901 100644 --- a/openair3/NAS/COMMON/UTIL/nas_log.h +++ b/openair3/NAS/COMMON/UTIL/nas_log.h @@ -131,7 +131,7 @@ do { do { \ nas_log_func_indent -= 2; \ LOG_D(NAS, " %s:%d %*sLeaving %s(rc = %ld)\n", __FILE__, __LINE__, nas_log_func_indent, "", \ - __FUNCTION__, (long) rETURNcODE); \ + __FUNCTION__, (long) (rETURNcODE)); \ return (rETURNcODE); \ } while (0) @@ -146,7 +146,7 @@ extern int nas_log_func_indent; # define LOG_FUNC_RETURN(rETURNcODE) \ do { \ LOG_TRACE(FUNC_OUT, "Leaving %s(rc = %ld)", __FUNCTION__, \ - (long) rETURNcODE); \ + (long) (rETURNcODE)); \ return (rETURNcODE); \ } while(0) diff --git a/openair3/NAS/COMMON/commonDef.h b/openair3/NAS/COMMON/commonDef.h deleted file mode 120000 index 19553e9b6485b5e512d086e2f72abf1a1f387b97..0000000000000000000000000000000000000000 --- a/openair3/NAS/COMMON/commonDef.h +++ /dev/null @@ -1 +0,0 @@ -../../../openair2/COMMON/commonDef.h \ No newline at end of file diff --git a/openair3/NAS/COMMON/commonDef.h b/openair3/NAS/COMMON/commonDef.h new file mode 100644 index 0000000000000000000000000000000000000000..64216b009465119c56e0d357dab48875b7c4be08 --- /dev/null +++ b/openair3/NAS/COMMON/commonDef.h @@ -0,0 +1,342 @@ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ +/* + +Source commonDef.h + +Version 0.1 + +Date 2012/02/27 + +Product NAS stack + +Subsystem include + +Author Frederic Maurel + +Description Contains global common definitions + +*****************************************************************************/ +#ifndef __COMMONDEF_H__ +#define __COMMONDEF_H__ + +#include <stdint.h> +#include <stddef.h> +#include <stdbool.h> + +typedef signed char boolean_t; + +#if !defined(TRUE) +#define TRUE (boolean_t)0x01 +#endif + +#if !defined(FALSE) +#define FALSE (boolean_t)0x00 +#endif + +#define BOOL_NOT(b) (b^TRUE) + +#define NAS_UE_ID_FMT "0x%06x" + +/****************************************************************************/ +/********************* G L O B A L C O N S T A N T S *******************/ +/****************************************************************************/ + +#define RETURNok (0) +#define RETURNerror (-1) + +/* + * Name of the environment variable which defines the default directory + * where the NAS application is executed and where are located files + * where non-volatile data are stored + */ +#define DEFAULT_NAS_PATH "PWD" + +/****************************************************************************/ +/************************ G L O B A L T Y P E S ************************/ +/****************************************************************************/ + +/* +----------------------------------------------------------------------------- + Standard data type definitions +----------------------------------------------------------------------------- +*/ +typedef int8_t SByte_t; /* 8 bit signed integer */ +typedef uint8_t Byte_t; /* 8 bit unsigned integer */ + + +/* +----------------------------------------------------------------------------- + Common NAS data type definitions +----------------------------------------------------------------------------- +*/ + +typedef uint8_t Stat_t; /* Registration status */ +typedef uint16_t lac_t; /* Location Area Code */ +typedef uint8_t rac_t; /* Routing Area Code */ +typedef uint16_t tac_t; /* Tracking Area Code */ +typedef uint32_t ci_t; /* Cell Identifier */ +typedef uint8_t AcT_t; /* Access Technology */ + +/* + * International Mobile Subscriber Identity + */ +typedef struct { + Byte_t length; + union { + struct { + Byte_t digit2:4; + Byte_t digit1:4; + Byte_t digit4:4; + Byte_t digit3:4; + Byte_t digit6:4; + Byte_t digit5:4; + Byte_t digit8:4; + Byte_t digit7:4; + Byte_t digit10:4; + Byte_t digit9:4; + Byte_t digit12:4; + Byte_t digit11:4; + Byte_t digit14:4; + Byte_t digit13:4; +#define EVEN_PARITY 0 +#define ODD_PARITY 1 + Byte_t parity:4; + Byte_t digit15:4; + } num; +#define IMSI_SIZE 8 + Byte_t value[IMSI_SIZE]; + } u; +} imsi_t; + +#define NAS_IMSI2STR(iMsI_t_PtR,iMsI_sTr, MaXlEn) \ + {\ + int l_offset = 0;\ + int l_ret = 0;\ + l_ret = snprintf(iMsI_sTr + l_offset, MaXlEn - l_offset, "%u%u%u%u%u",\ + iMsI_t_PtR->u.num.digit1, iMsI_t_PtR->u.num.digit2,\ + iMsI_t_PtR->u.num.digit3, iMsI_t_PtR->u.num.digit4,\ + iMsI_t_PtR->u.num.digit5);\ + if ((iMsI_t_PtR->u.num.digit6 != 0xf) && (l_ret > 0)) {\ + l_offset += l_ret;\ + l_ret = snprintf(iMsI_sTr + l_offset, MaXlEn - l_offset, "%u", iMsI_t_PtR->u.num.digit6);\ + }\ + if (l_ret > 0) {\ + l_offset += l_ret;\ + l_ret = snprintf(iMsI_sTr + l_offset, MaXlEn - l_offset, "%u%u%u%u%u%u%u%u",\ + iMsI_t_PtR->u.num.digit7, iMsI_t_PtR->u.num.digit8,\ + iMsI_t_PtR->u.num.digit9, iMsI_t_PtR->u.num.digit10,\ + iMsI_t_PtR->u.num.digit11, iMsI_t_PtR->u.num.digit12,\ + iMsI_t_PtR->u.num.digit13, iMsI_t_PtR->u.num.digit14);\ + }\ + if ((iMsI_t_PtR->u.num.digit15 != 0xf) && (l_ret > 0)) {\ + l_offset += l_ret;\ + l_ret = snprintf(iMsI_sTr + l_offset, MaXlEn - l_offset, "%u", iMsI_t_PtR->u.num.digit15);\ + }\ + } + +/* + * Mobile subscriber dialing number + */ +typedef struct { + Byte_t ext:1; + /* Type Of Number */ +#define MSISDN_TON_UNKNOWKN 0b000 +#define MSISDN_TON_INTERNATIONAL 0b001 +#define MSISDN_TON_NATIONAL 0b010 +#define MSISDN_TON_NETWORK 0b011 +#define MSISDN_TON_SUBCRIBER 0b100 +#define MSISDN_TON_ABBREVIATED 0b110 +#define MSISDN_TON_RESERVED 0b111 + Byte_t ton:3; + /* Numbering Plan Identification */ +#define MSISDN_NPI_UNKNOWN 0b0000 +#define MSISDN_NPI_ISDN_TELEPHONY 0b0001 +#define MSISDN_NPI_GENERIC 0b0010 +#define MSISDN_NPI_DATA 0b0011 +#define MSISDN_NPI_TELEX 0b0100 +#define MSISDN_NPI_MARITIME_MOBILE 0b0101 +#define MSISDN_NPI_LAND_MOBILE 0b0110 +#define MSISDN_NPI_ISDN_MOBILE 0b0111 +#define MSISDN_NPI_PRIVATE 0b1110 +#define MSISDN_NPI_RESERVED 0b1111 + Byte_t npi:4; + /* Dialing Number */ + struct { + Byte_t lsb:4; + Byte_t msb:4; +#define MSISDN_DIGIT_SIZE 10 + } digit[MSISDN_DIGIT_SIZE]; +} msisdn_t; + +/* + * International Mobile Equipment Identity + */ +typedef imsi_t imei_t; + +/* + * Public Land Mobile Network identifier + * PLMN = BCD encoding (Mobile Country Code + Mobile Network Code) + */ +typedef struct { + Byte_t MCCdigit2:4; + Byte_t MCCdigit1:4; + Byte_t MNCdigit3:4; + Byte_t MCCdigit3:4; + Byte_t MNCdigit2:4; + Byte_t MNCdigit1:4; +} plmn_t; + +/* + * Location Area Identification + */ +typedef struct { + plmn_t plmn; /* <MCC> + <MNC> */ + lac_t lac; /* Location Area Code */ +} lai_t; + +/* + * GPRS Routing Area Identification + */ +typedef struct { + plmn_t plmn; /* <MCC> + <MNC> */ + lac_t lac; /* Location Area Code */ + rac_t rac; /* Routing Area Code */ +} RAI_t; + +/* + * EPS Tracking Area Identification + */ +typedef struct { + plmn_t plmn; /* <MCC> + <MNC> */ + tac_t tac; /* Tracking Area Code */ +} tai_t; + +/* + * EPS Globally Unique MME Identity + */ +typedef struct { + plmn_t plmn; /* <MCC> + <MNC> */ + uint16_t MMEgid; /* MME group identifier */ + uint8_t MMEcode; /* MME code */ +} gummei_t; + +/* + * EPS Globally Unique Temporary UE Identity + */ +typedef struct { + gummei_t gummei; /* Globally Unique MME Identity */ + uint32_t m_tmsi; /* M-Temporary Mobile Subscriber Identity */ +} GUTI_t; +#define GUTI2STR(GuTi_PtR, GuTi_StR, MaXlEn) \ + {\ + int l_offset = 0;\ + int l_ret = 0;\ + l_ret += snprintf(GuTi_StR + l_offset,MaXlEn-l_offset, "%03u.",\ + GuTi_PtR->gummei.plmn.MCCdigit3 * 100 +\ + GuTi_PtR->gummei.plmn.MCCdigit2 * 10 +\ + GuTi_PtR->gummei.plmn.MCCdigit1);\ + if (l_ret > 0) {\ + l_offset += l_ret;\ + } else {\ + l_offset = MaXlEn;\ + }\ + if (GuTi_PtR->gummei.plmn.MNCdigit1 != 0xf) {\ + l_ret += snprintf(GuTi_StR + l_offset,MaXlEn-l_offset, "%03u|%04x|%02x|%08x",\ + GuTi_PtR->gummei.plmn.MNCdigit3 * 100 +\ + GuTi_PtR->gummei.plmn.MNCdigit2 * 10 +\ + GuTi_PtR->gummei.plmn.MNCdigit1,\ + GuTi_PtR->gummei.MMEgid,\ + GuTi_PtR->gummei.MMEcode,\ + GuTi_PtR->m_tmsi);\ + } else {\ + l_ret += snprintf(GuTi_StR + l_offset,MaXlEn-l_offset, "%02u|%04x|%02x|%08x",\ + GuTi_PtR->gummei.plmn.MNCdigit2 * 10 +\ + GuTi_PtR->gummei.plmn.MNCdigit1,\ + GuTi_PtR->gummei.MMEgid,\ + GuTi_PtR->gummei.MMEcode,\ + GuTi_PtR->m_tmsi);\ + }\ + } + + + + +/* Checks PLMN validity */ +#define PLMN_IS_VALID(plmn) (((plmn).MCCdigit1 & \ + (plmn).MCCdigit2 & \ + (plmn).MCCdigit3) != 0x0F) + +/* Checks TAC validity */ +#define TAC_IS_VALID(tac) (((tac) != 0x0000) && ((tac) != 0xFFF0)) + +/* Checks TAI validity */ +#define TAI_IS_VALID(tai) (PLMN_IS_VALID((tai).plmn) && \ + TAC_IS_VALID((tai).tac)) +/* + * A list of PLMNs + */ +#define PLMN_LIST_T(SIZE) struct {Byte_t n_plmns; plmn_t plmn[SIZE];} + +/* + * A list of TACs + */ +#define TAC_LIST_T(SIZE) struct {Byte_t n_tacs; TAC_t tac[SIZE];} + +/* + * A list of TAIs + */ +#define TAI_LIST_T(SIZE) struct {Byte_t n_tais; tai_t tai[SIZE];} + +/* + * User notification callback, executed whenever a change of data with + * respect of network information (e.g. network registration and/or + * location change, new PLMN becomes available) is notified by the + * EPS Mobility Management sublayer + */ +typedef int (*emm_indication_callback_t) (Stat_t, tac_t, ci_t, AcT_t, + const char*, size_t); + +typedef enum eps_protocol_discriminator_e { + /* Protocol discriminator identifier for EPS Mobility Management */ + EPS_MOBILITY_MANAGEMENT_MESSAGE = 0x7, + + /* Protocol discriminator identifier for EPS Session Management */ + EPS_SESSION_MANAGEMENT_MESSAGE = 0x2, +} eps_protocol_discriminator_t; + +/****************************************************************************/ +/******************** G L O B A L V A R I A B L E S ********************/ +/****************************************************************************/ + +/****************************************************************************/ +/****************** E X P O R T E D F U N C T I O N S ******************/ +/****************************************************************************/ + +#endif /* __COMMONDEF_H__*/ diff --git a/openair3/NAS/COMMON/networkDef.h b/openair3/NAS/COMMON/networkDef.h deleted file mode 120000 index 2648b55e992973fc58c9c2c0e12b99733fba0010..0000000000000000000000000000000000000000 --- a/openair3/NAS/COMMON/networkDef.h +++ /dev/null @@ -1 +0,0 @@ -../../../openair2/COMMON/networkDef.h \ No newline at end of file diff --git a/openair3/NAS/COMMON/networkDef.h b/openair3/NAS/COMMON/networkDef.h new file mode 100644 index 0000000000000000000000000000000000000000..46716bee24714ab2273744c4634a0924d9320207 --- /dev/null +++ b/openair3/NAS/COMMON/networkDef.h @@ -0,0 +1,278 @@ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + +/***************************************************************************** + +Source networkDef.h + +Version 0.1 + +Date 2012/09/21 + +Product NAS stack + +Subsystem include + +Author Frederic Maurel + +Description Contains network's global definitions + +*****************************************************************************/ +#ifndef __NETWORKDEF_H__ +#define __NETWORKDEF_H__ + +/****************************************************************************/ +/********************* G L O B A L C O N S T A N T S *******************/ +/****************************************************************************/ + +/* + * ---------------------- + * Network selection mode + * ---------------------- + */ +#define NET_PLMN_AUTO 0 +#define NET_PLMN_MANUAL 1 + +/* + * --------------------------- + * Network registration status + * --------------------------- + */ +/* not registered, not currently searching an operator to register to */ +#define NET_REG_STATE_OFF 0 +/* registered, home network */ +#define NET_REG_STATE_HN 1 +/* not registered, currently trying to attach or searching an operator + * to register to */ +#define NET_REG_STATE_ON 2 +/* registration denied */ +#define NET_REG_STATE_DENIED 3 +/* unknown (e.g. out of GERAN/UTRAN/E-UTRAN coverage) */ +#define NET_REG_STATE_UNKNOWN 4 +/* registered, roaming */ +#define NET_REG_STATE_ROAMING 5 +/* registered for "SMS only", home network */ +#define NET_REG_STATE_SMS_HN 6 +/* registered, for "SMS only", roaming */ +#define NET_REG_STATE_SMS_ROAMING 7 +/* attached for emergency bearer services only (applicable to UTRAN) */ +#define NET_REG_STATE_EMERGENCY 8 + +/* + * ------------------------------------ + * Network access technology indicators + * ------------------------------------ + */ +#define NET_ACCESS_UNAVAILABLE (-1) /* Not available */ +#define NET_ACCESS_GSM 0 /* GSM */ +#define NET_ACCESS_COMPACT 1 /* GSM Compact */ +#define NET_ACCESS_UTRAN 2 /* UTRAN */ +#define NET_ACCESS_EGPRS 3 /* GSM w/EGPRS */ +#define NET_ACCESS_HSDPA 4 /* UTRAN w/HSDPA */ +#define NET_ACCESS_HSUPA 5 /* UTRAN w/HSUPA */ +#define NET_ACCESS_HSDUPA 6 /* UTRAN w/HSDPA and HSUPA */ +#define NET_ACCESS_EUTRAN 7 /* E-UTRAN */ + +/* + * --------------------------------------- + * Network operator representation formats + * --------------------------------------- + */ +#define NET_FORMAT_LONG 0 /* long format alphanumeric */ +#define NET_FORMAT_SHORT 1 /* short format alphanumeric */ +#define NET_FORMAT_NUM 2 /* numeric format */ + +#define NET_FORMAT_MAX_SIZE NET_FORMAT_LONG_SIZE + +/* + * ----------------------------- + * Network operator availability + * ----------------------------- + */ +#define NET_OPER_UNKNOWN 0 /* unknown operator */ +#define NET_OPER_AVAILABLE 1 /* available operator */ +#define NET_OPER_CURRENT 2 /* currently selected operator */ +#define NET_OPER_FORBIDDEN 3 /* forbidden operator */ + +/* + * -------------------------------------- + * Network connection establishment cause + * -------------------------------------- + */ +#define NET_ESTABLISH_CAUSE_EMERGENCY 0x01 +#define NET_ESTABLISH_CAUSE_HIGH_PRIO 0x02 +#define NET_ESTABLISH_CAUSE_MT_ACCESS 0x03 +#define NET_ESTABLISH_CAUSE_MO_SIGNAL 0x04 +#define NET_ESTABLISH_CAUSE_MO_DATA 0x05 +#define NET_ESTABLISH_CAUSE_V1020 0x06 + +/* + * -------------------------------------- + * Network connection establishment type + * -------------------------------------- + */ +#define NET_ESTABLISH_TYPE_ORIGINATING_SIGNAL 0x10 +#define NET_ESTABLISH_TYPE_EMERGENCY_CALLS 0x20 +#define NET_ESTABLISH_TYPE_ORIGINATING_CALLS 0x30 +#define NET_ESTABLISH_TYPE_TERMINATING_CALLS 0x40 +#define NET_ESTABLISH_TYPE_MO_CS_FALLBACK 0x50 + +/* + * ------------------- + * PDN connection type + * ------------------- + */ +#define NET_PDN_TYPE_IPV4 (0 + 1) +#define NET_PDN_TYPE_IPV6 (1 + 1) +#define NET_PDN_TYPE_IPV4V6 (2 + 1) + +/****************************************************************************/ +/************************ G L O B A L T Y P E S ************************/ +/****************************************************************************/ + +/* + * --------------------- + * PDN connection status + * --------------------- + */ +typedef enum { + /* MT = The Mobile Terminal, NW = The Network */ + NET_PDN_MT_DEFAULT_ACT = 1, /* MT has activated a PDN connection */ + NET_PDN_NW_DEFAULT_DEACT, /* NW has deactivated a PDN connection */ + NET_PDN_MT_DEFAULT_DEACT, /* MT has deactivated a PDN connection */ + NET_PDN_NW_DEDICATED_ACT, /* NW has activated an EPS bearer context */ + NET_PDN_MT_DEDICATED_ACT, /* MT has activated an EPS bearer context */ + NET_PDN_NW_DEDICATED_DEACT, /* NW has deactivated an EPS bearer context */ + NET_PDN_MT_DEDICATED_DEACT, /* MT has deactivated an EPS bearer context */ +} network_pdn_state_t; + +/* + * --------------------------- + * Network operator identifier + * --------------------------- + */ +typedef struct { +#define NET_FORMAT_LONG_SIZE 16 /* Long alphanumeric format */ +#define NET_FORMAT_SHORT_SIZE 8 /* Short alphanumeric format */ +#define NET_FORMAT_NUM_SIZE 6 /* Numeric format (PLMN identifier */ + union { + unsigned char alpha_long[NET_FORMAT_LONG_SIZE+1]; + unsigned char alpha_short[NET_FORMAT_SHORT_SIZE+1]; + unsigned char num[NET_FORMAT_NUM_SIZE+1]; + } id; +} network_plmn_t; + +/* + * ------------------------------- + * EPS bearer level QoS parameters + * ------------------------------- + */ +typedef struct { + int gbrUL; /* Guaranteed Bit Rate for uplink */ + int gbrDL; /* Guaranteed Bit Rate for downlink */ + int mbrUL; /* Maximum Bit Rate for uplink */ + int mbrDL; /* Maximum Bit Rate for downlink */ + int qci; /* QoS Class Identifier */ +} network_qos_t; + +/* + * ----------------------------- + * IPv4 packet filter parameters + * ----------------------------- + */ +typedef struct { + unsigned char protocol; /* Protocol identifier */ + unsigned char tos; /* Type of service */ +#define NET_PACKET_FILTER_IPV4_ADDR_SIZE 4 + unsigned char addr[NET_PACKET_FILTER_IPV4_ADDR_SIZE]; + unsigned char mask[NET_PACKET_FILTER_IPV4_ADDR_SIZE]; +} network_ipv4_data_t; + +/* + * ----------------------------- + * IPv6 packet filter parameters + * ----------------------------- + */ +typedef struct { + unsigned char nh; /* Next header type */ + unsigned char tf; /* Traffic class */ +#define NET_PACKET_FILTER_IPV6_ADDR_SIZE 16 + unsigned char addr[NET_PACKET_FILTER_IPV6_ADDR_SIZE]; + unsigned char mask[NET_PACKET_FILTER_IPV6_ADDR_SIZE]; + unsigned int ipsec; /* IPSec security parameter index */ + unsigned int fl; /* Flow label */ +} network_ipv6_data_t; + +/* + * ------------- + * Packet Filter + * ------------- + */ +typedef struct { + unsigned char id; /* Packet filter identifier */ +#define NET_PACKET_FILTER_DOWNLINK 0x01 +#define NET_PACKET_FILTER_UPLINK 0x02 +#define NET_PACKET_FILTER_BIDIR 0x03 + unsigned char dir; /* Packet filter direction */ + unsigned char precedence; /* Evaluation precedence */ + union { + network_ipv4_data_t ipv4; + network_ipv6_data_t ipv6; + } data; + unsigned short lport; /* Local (UE) port number */ + unsigned short rport; /* Remote (network) port number */ +} network_pkf_t; + +/* + * --------------------- + * Traffic Flow Template + * --------------------- + */ +typedef struct { + int n_pkfs; +#define NET_PACKET_FILTER_MAX 16 + network_pkf_t* pkf[NET_PACKET_FILTER_MAX]; +} network_tft_t; + +/* + * User notification callback, executed whenever a change of status with + * respect of PDN connection or EPS bearer context is notified by the EPS + * Session Management sublayer + */ +typedef int (*esm_indication_callback_t) (int, network_pdn_state_t); + +/****************************************************************************/ +/******************** G L O B A L V A R I A B L E S ********************/ +/****************************************************************************/ + +/****************************************************************************/ +/****************** E X P O R T E D F U N C T I O N S ******************/ +/****************************************************************************/ + +#endif /* __NETWORKDEF_H__*/ diff --git a/openair3/NAS/UE/EMM/IdleMode.c b/openair3/NAS/UE/EMM/IdleMode.c index 74c09a8a3dfbfac371aaa67a3c701c90f20ccbb8..a5a2c3070894305392cc2ef0b760f49837d1f9b6 100644 --- a/openair3/NAS/UE/EMM/IdleMode.c +++ b/openair3/NAS/UE/EMM/IdleMode.c @@ -807,8 +807,7 @@ int emm_proc_plmn_selection_end(int found, tac_t tac, ci_t ci, AcT_t rat) if (is_forbidden) { /* The selected cell is known not to be able to provide normal * service */ - LOG_TRACE(INFO, "EMM-IDLE - UE may camp on this acceptable cell ", - "for limited services"); + LOG_TRACE(INFO, "EMM-IDLE - UE may camp on this acceptable cell for limited services"); /* Save the index of the first forbidden PLMN */ if (_emm_plmn_list.fplmn < 0) { @@ -819,8 +818,7 @@ int emm_proc_plmn_selection_end(int found, tac_t tac, ci_t ci, AcT_t rat) } else { /* A suitable cell has been found and the PLMN or tracking area * is not in the forbidden list */ - LOG_TRACE(INFO, "EMM-IDLE - UE may camp on this suitable cell ", - "for normal services"); + LOG_TRACE(INFO, "EMM-IDLE - UE may camp on this suitable cell for normal services"); _emm_plmn_list.fplmn = -1; _emm_plmn_list.param[index].stat = NET_OPER_CURRENT; emm_sap.primitive = EMMREG_REGISTER_CNF; @@ -905,7 +903,10 @@ int emm_proc_plmn_selection_end(int found, tac_t tac, ci_t ci, AcT_t rat) * Or terminate the PLMN selection procedure */ if (!select_next_plmn) { - if (!(_emm_plmn_list.fplmn) < 0) { // FIXME this comparison makes no sense (bool < 0) + /* TODO: be sure of this fix */ + LOG_TRACE(WARNING, "%s:%d:%s: be sure!!\n", __FILE__, __LINE__, __FUNCTION__); + //if (!(_emm_plmn_list.fplmn) < 0) { // FIXME this comparison makes no sense (bool < 0) + if (!(_emm_plmn_list.fplmn < 0)) { // FIXME this comparison makes no sense (bool < 0) /* There were one or more PLMNs which were available and allowable, * but an LR failure made registration on those PLMNs unsuccessful * or an entry in any of the forbidden area lists prevented a diff --git a/openair3/S1AP/s1ap_eNB_handlers.c b/openair3/S1AP/s1ap_eNB_handlers.c index c6deccebcdafc81d5f0a47efa4fc62551d13c310..3896cf37aecd19e01efde832bc4f981c6461ea72 100644 --- a/openair3/S1AP/s1ap_eNB_handlers.c +++ b/openair3/S1AP/s1ap_eNB_handlers.c @@ -205,7 +205,7 @@ int s1ap_eNB_handle_message(uint32_t assoc_id, int32_t stream, if (message.procedureCode > sizeof(messages_callback) / (3 * sizeof( s1ap_message_decoded_callback)) || (message.direction > S1AP_PDU_PR_unsuccessfulOutcome)) { - S1AP_ERROR("[SCTP %d] Either procedureCode %d or direction %d exceed expected\n", + S1AP_ERROR("[SCTP %d] Either procedureCode %ld or direction %d exceed expected\n", assoc_id, message.procedureCode, message.direction); return -1; } @@ -214,7 +214,7 @@ int s1ap_eNB_handle_message(uint32_t assoc_id, int32_t stream, * This can mean not implemented or no procedure for eNB (wrong direction). */ if (messages_callback[message.procedureCode][message.direction-1] == NULL) { - S1AP_ERROR("[SCTP %d] No handler for procedureCode %d in %s\n", + S1AP_ERROR("[SCTP %d] No handler for procedureCode %ld in %s\n", assoc_id, message.procedureCode, s1ap_direction2String[message.direction]); return -1; @@ -452,10 +452,10 @@ int s1ap_eNB_handle_error_indication(uint32_t assoc_id, return -1; } if ( s1_error_indication_p->presenceMask & S1AP_ERRORINDICATIONIES_MME_UE_S1AP_ID_PRESENT) { - S1AP_WARN("Received S1 Error indication MME UE S1AP ID 0x%x\n", s1_error_indication_p->mme_ue_s1ap_id); + S1AP_WARN("Received S1 Error indication MME UE S1AP ID 0x%lx\n", s1_error_indication_p->mme_ue_s1ap_id); } if ( s1_error_indication_p->presenceMask & S1AP_ERRORINDICATIONIES_ENB_UE_S1AP_ID_PRESENT) { - S1AP_WARN("Received S1 Error indication eNB UE S1AP ID 0x%x\n", s1_error_indication_p->eNB_UE_S1AP_ID); + S1AP_WARN("Received S1 Error indication eNB UE S1AP ID 0x%lx\n", s1_error_indication_p->eNB_UE_S1AP_ID); } if ( s1_error_indication_p->presenceMask & S1AP_ERRORINDICATIONIES_CAUSE_PRESENT) { @@ -710,7 +710,7 @@ int s1ap_eNB_handle_initial_context_request(uint32_t assoc_id, if ((ue_desc_p = s1ap_eNB_get_ue_context(mme_desc_p->s1ap_eNB_instance, initialContextSetupRequest_p->eNB_UE_S1AP_ID)) == NULL) { S1AP_ERROR("[SCTP %d] Received initial context setup request for non " - "existing UE context 0x%06x\n", assoc_id, + "existing UE context 0x%06lx\n", assoc_id, initialContextSetupRequest_p->eNB_UE_S1AP_ID); return -1; } @@ -835,7 +835,7 @@ int s1ap_eNB_handle_ue_context_release_command(uint32_t assoc_id, if ((ue_desc_p = s1ap_eNB_get_ue_context(mme_desc_p->s1ap_eNB_instance, enb_ue_s1ap_id)) == NULL) { S1AP_ERROR("[SCTP %d] Received UE context release command for non " - "existing UE context 0x%06x\n", + "existing UE context 0x%06lx\n", assoc_id, enb_ue_s1ap_id); /*MessageDef *msg_complete_p; @@ -900,7 +900,7 @@ int s1ap_eNB_handle_e_rab_setup_request(uint32_t assoc_id, if ((ue_desc_p = s1ap_eNB_get_ue_context(mme_desc_p->s1ap_eNB_instance, s1ap_E_RABSetupRequest->eNB_UE_S1AP_ID)) == NULL) { S1AP_ERROR("[SCTP %d] Received initial context setup request for non " - "existing UE context 0x%06x\n", assoc_id, + "existing UE context 0x%06lx\n", assoc_id, s1ap_E_RABSetupRequest->eNB_UE_S1AP_ID); return -1; } @@ -915,7 +915,7 @@ int s1ap_eNB_handle_e_rab_setup_request(uint32_t assoc_id, ue_desc_p->rx_stream = stream; if ( ue_desc_p->mme_ue_s1ap_id != s1ap_E_RABSetupRequest->mme_ue_s1ap_id){ - S1AP_WARN("UE context mme_ue_s1ap_id is different form that of the message (%d != %d)", + S1AP_WARN("UE context mme_ue_s1ap_id is different form that of the message (%d != %ld)", ue_desc_p->mme_ue_s1ap_id, s1ap_E_RABSetupRequest->mme_ue_s1ap_id); } diff --git a/openair3/S1AP/s1ap_eNB_nas_procedures.c b/openair3/S1AP/s1ap_eNB_nas_procedures.c index def09a6cb3deb7b67e9bd783506d19cf3e9961c4..426f38004a845942a24378bbd9106cbc2264f0ba 100644 --- a/openair3/S1AP/s1ap_eNB_nas_procedures.c +++ b/openair3/S1AP/s1ap_eNB_nas_procedures.c @@ -288,9 +288,13 @@ int s1ap_eNB_handle_nas_downlink(const uint32_t assoc_id, downlink_NAS_transport_p->eNB_UE_S1AP_ID, downlink_NAS_transport_p->mme_ue_s1ap_id); - S1AP_ERROR("[SCTP %d] Received NAS downlink message for non existing UE context eNB_UE_S1AP_ID: 0x%"PRIx32" %u\n", + /* TODO: fix this log - the original version is suspicious (twice downlink_NAS_transport_p->eNB_UE_S1AP_ID?) */ + /*S1AP_ERROR("[SCTP %d] Received NAS downlink message for non existing UE context eNB_UE_S1AP_ID: 0x%"PRIx32" %u\n", assoc_id, downlink_NAS_transport_p->eNB_UE_S1AP_ID, + downlink_NAS_transport_p->eNB_UE_S1AP_ID);*/ + S1AP_ERROR("[SCTP %d] Received NAS downlink message for non existing UE context eNB_UE_S1AP_ID: 0x%lx\n", + assoc_id, downlink_NAS_transport_p->eNB_UE_S1AP_ID); return -1; } @@ -311,7 +315,7 @@ int s1ap_eNB_handle_nas_downlink(const uint32_t assoc_id, } else { /* We already have a mme ue s1ap id check the received is the same */ if (ue_desc_p->mme_ue_s1ap_id != downlink_NAS_transport_p->mme_ue_s1ap_id) { - S1AP_ERROR("[SCTP %d] Mismatch in MME UE S1AP ID (0x%"PRIx32" != 0x%"PRIx32")\n", + S1AP_ERROR("[SCTP %d] Mismatch in MME UE S1AP ID (0x%lx != 0x%"PRIx32"\n", assoc_id, downlink_NAS_transport_p->mme_ue_s1ap_id, ue_desc_p->mme_ue_s1ap_id @@ -579,7 +583,7 @@ int s1ap_eNB_initial_ctxt_resp( new_item->transportLayerAddress.size = initial_ctxt_resp_p->e_rabs[i].eNB_addr.length; new_item->transportLayerAddress.bits_unused = 0; - S1AP_DEBUG("initial_ctxt_resp_p: e_rab ID %d, enb_addr %d.%d.%d.%d, SIZE %d \n", + S1AP_DEBUG("initial_ctxt_resp_p: e_rab ID %ld, enb_addr %d.%d.%d.%d, SIZE %d \n", new_item->e_RAB_ID, new_item->transportLayerAddress.buf[0], new_item->transportLayerAddress.buf[1], @@ -778,7 +782,7 @@ int s1ap_eNB_e_rab_setup_resp(instance_t instance, new_item->transportLayerAddress.size = e_rab_setup_resp_p->e_rabs[i].eNB_addr.length; new_item->transportLayerAddress.bits_unused = 0; - S1AP_DEBUG("e_rab_setup_resp: e_rab ID %d, teid %u, enb_addr %d.%d.%d.%d, SIZE %d\n", + S1AP_DEBUG("e_rab_setup_resp: e_rab ID %ld, teid %u, enb_addr %d.%d.%d.%d, SIZE %d\n", new_item->e_RAB_ID, e_rab_setup_resp_p->e_rabs[i].gtp_teid, new_item->transportLayerAddress.buf[0], diff --git a/openair3/UDP/udp_eNB_task.c b/openair3/UDP/udp_eNB_task.c index b11f51e5fd538983808170e0dc412dcd5e7b4448..b8b6b897a79c4d4924810869fd6819059c75ad3b 100644 --- a/openair3/UDP/udp_eNB_task.c +++ b/openair3/UDP/udp_eNB_task.c @@ -379,7 +379,7 @@ void *udp_eNB_task(void *args_p) sizeof(struct sockaddr_in)); if (bytes_written != udp_data_req_p->buffer_length) { - LOG_E(UDP_, "There was an error while writing to socket %u rc %d" + LOG_E(UDP_, "There was an error while writing to socket %d rc %zd" "(%d:%s) May be normal if GTPU kernel module loaded on same host (may NF_DROP IP packet)\n", udp_sd, bytes_written, errno, strerror(errno)); } diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h index a366b54023bd86ab8bbe882e21ab9eb274e457ad..2eb0a506be8f840c34ac5de1cb7f7a5ca9763fc3 100644 --- a/targets/ARCH/COMMON/common_lib.h +++ b/targets/ARCH/COMMON/common_lib.h @@ -135,6 +135,14 @@ typedef struct { double offset; } rx_gain_calib_table_t; +/*! \brief Clock source types */ +typedef enum { + //! This tells the underlying hardware to use the internal reference + internal=0, + //! This tells the underlying hardware to use the external reference + external=1 +} clock_source_t; + /*! \brief RF frontend parameters set by application */ typedef struct { //! Module ID for this configuration @@ -187,6 +195,8 @@ typedef struct { double rx_bw; //! TX bandwidth in Hz double tx_bw; + //! clock source + clock_source_t clock_source; //! Auto calibration flag int autocal[4]; //! rf devices work with x bits iqs when oai have its own iq format @@ -238,8 +248,10 @@ typedef struct { typedef struct { - //! Tx buffer for if device - void *tx; + //! Tx buffer for if device, keep one per subframe now to allow multithreading + void *tx[10]; + //! Tx buffer (PRACH) for if device + void *tx_prach; //! Rx buffer for if device void *rx; } if_buffer_t; diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c index 1f8bab415c9998abc1d7809e7764ab01b6b5158a..5815f2b1a66797cadd6544bbfab7f6a0dce398c7 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c @@ -21,7 +21,7 @@ /*! \file ethernet_lib.c * \brief API to stream I/Q samples over standard ethernet - * \author add alcatel Katerina Trilyraki, Navid Nikaein, Pedro Dinis, Lucio Ferreira, Raymond Knopp + * \author add alcatel Katerina Trilyraki, Navid Nikaein, Pedro Dinis, Lucio Ferreira, Raymond Knopp, Tien-Thinh Nguyen * \date 2015 * \version 0.2 * \company Eurecom @@ -45,18 +45,16 @@ #include "common_lib.h" #include "ethernet_lib.h" -#define DEBUG 0 +//#define DEBUG 0 -struct sockaddr_ll dest_addr[MAX_INST]; -struct sockaddr_ll local_addr[MAX_INST]; -int addr_len[MAX_INST]; -struct ifreq if_index[MAX_INST]; +//struct sockaddr_ll dest_addr[MAX_INST]; +//struct sockaddr_ll local_addr[MAX_INST]; +//int addr_len[MAX_INST]; +//struct ifreq if_index[MAX_INST]; int eth_socket_init_raw(openair0_device *device) { - int i = 0; eth_state_t *eth = (eth_state_t*)device->priv; - int Mod_id = device->Mod_id; const char *local_mac, *remote_mac; int sock_dom=0; int sock_type=0; @@ -78,30 +76,33 @@ int eth_socket_init_raw(openair0_device *device) { sock_dom=AF_PACKET; sock_type=SOCK_RAW; sock_proto=IPPROTO_RAW; - if ((eth->sockfd[Mod_id] = socket(sock_dom, sock_type, sock_proto)) == -1) { + if ((eth->sockfd = socket(sock_dom, sock_type, sock_proto)) == -1) { perror("ETHERNET: Error opening RAW socket"); exit(0); } /* initialize destination address */ - for (i=0; i< MAX_INST; i++) { - bzero((void *)&(local_addr[i]), sizeof(struct sockaddr_ll)); - bzero((void *)&(if_index[i]), sizeof(struct ifreq)); - } + bzero((void *)&(eth->local_addr_ll), sizeof(struct sockaddr_ll)); + bzero((void *)&(eth->if_index), sizeof(struct ifreq)); + /* Get the index of the interface to send on */ - strcpy(if_index[Mod_id].ifr_name,eth->if_name[Mod_id]); - if (ioctl(eth->sockfd[Mod_id], SIOCGIFINDEX, &(if_index[Mod_id])) < 0) + strcpy(eth->if_index.ifr_name,eth->if_name); + if (ioctl(eth->sockfd, SIOCGIFINDEX, &(eth->if_index)) < 0) perror("SIOCGIFINDEX"); - local_addr[Mod_id].sll_family = AF_PACKET; - local_addr[Mod_id].sll_ifindex = if_index[Mod_id].ifr_ifindex; + eth->local_addr_ll.sll_family = AF_PACKET; + eth->local_addr_ll.sll_ifindex = eth->if_index.ifr_ifindex; /* hear traffic from specific protocol*/ - local_addr[Mod_id].sll_protocol = htons((short)device->openair0_cfg->my_port); - local_addr[Mod_id].sll_halen = ETH_ALEN; - local_addr[Mod_id].sll_pkttype = PACKET_OTHERHOST; - addr_len[Mod_id] = sizeof(struct sockaddr_ll); + if (eth->flags == ETH_RAW_IF5_MOBIPASS) { + eth->local_addr_ll.sll_protocol = htons(0xbffe); + } else{ + eth->local_addr_ll.sll_protocol = htons((short)device->openair0_cfg->my_port); + } + eth->local_addr_ll.sll_halen = ETH_ALEN; + eth->local_addr_ll.sll_pkttype = PACKET_OTHERHOST; + eth->addr_len = sizeof(struct sockaddr_ll); - if (bind(eth->sockfd[Mod_id],(struct sockaddr *)&local_addr[Mod_id],addr_len[Mod_id])<0) { + if (bind(eth->sockfd,(struct sockaddr *)ð->local_addr_ll,eth->addr_len)<0) { perror("ETHERNET: Cannot bind to socket"); exit(0); } @@ -114,7 +115,7 @@ int eth_socket_init_raw(openair0_device *device) { } else { eth->eh.ether_type = htons((short)device->openair0_cfg->my_port); } - printf("[%s] binding mod_%d to hardware address %x:%x:%x:%x:%x:%x\n",((device->host_type == BBU_HOST) ? "BBU": "RRH"),Mod_id,eth->eh.ether_shost[0],eth->eh.ether_shost[1],eth->eh.ether_shost[2],eth->eh.ether_shost[3],eth->eh.ether_shost[4],eth->eh.ether_shost[5]); + printf("[%s] binding to hardware address %x:%x:%x:%x:%x:%x\n",((device->host_type == BBU_HOST) ? "BBU": "RRH"),eth->eh.ether_shost[0],eth->eh.ether_shost[1],eth->eh.ether_shost[2],eth->eh.ether_shost[3],eth->eh.ether_shost[4],eth->eh.ether_shost[5]); return 0; } @@ -124,7 +125,6 @@ int trx_eth_write_raw(openair0_device *device, openair0_timestamp timestamp, voi int bytes_sent=0; eth_state_t *eth = (eth_state_t*)device->priv; - int Mod_id = device->Mod_id; int sendto_flag =0; int i=0; //sendto_flag|=flags; @@ -157,7 +157,7 @@ int trx_eth_write_raw(openair0_device *device, openair0_timestamp timestamp, voi bytes_sent); #endif /* Send packet */ - bytes_sent += send(eth->sockfd[Mod_id], + bytes_sent += send(eth->sockfd, buff2, RAW_PACKET_SIZE_BYTES(nsamps), sendto_flag); @@ -195,7 +195,6 @@ int trx_eth_write_raw_IF4p5(openair0_device *device, openair0_timestamp timestam int bytes_sent = 0; eth_state_t *eth = (eth_state_t*)device->priv; - int Mod_id = device->Mod_id; ssize_t packet_size; @@ -203,6 +202,8 @@ int trx_eth_write_raw_IF4p5(openair0_device *device, openair0_timestamp timestam packet_size = RAW_IF4p5_PDLFFT_SIZE_BYTES(nblocks); } else if (flags == IF4p5_PULFFT) { packet_size = RAW_IF4p5_PULFFT_SIZE_BYTES(nblocks); + } else if (flags == IF4p5_PULTICK) { + packet_size = RAW_IF4p5_PULTICK_SIZE_BYTES; } else if (flags == IF5_MOBIPASS) { packet_size = RAW_IF5_MOBIPASS_SIZE_BYTES; } else { @@ -214,7 +215,7 @@ int trx_eth_write_raw_IF4p5(openair0_device *device, openair0_timestamp timestam memcpy(buff[0], (void*)ð->eh, MAC_HEADER_SIZE_BYTES); - bytes_sent = send(eth->sockfd[Mod_id], + bytes_sent = send(eth->sockfd, buff[0], packet_size, 0); @@ -238,7 +239,6 @@ int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, voi int bytes_received=0; int i=0; eth_state_t *eth = (eth_state_t*)device->priv; - int Mod_id = device->Mod_id; int rcvfrom_flag =0; eth->rx_nsamps=nsamps; @@ -256,7 +256,7 @@ int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, voi bytes_received=0; while(bytes_received < RAW_PACKET_SIZE_BYTES(nsamps)) { - bytes_received +=recv(eth->sockfd[Mod_id], + bytes_received +=recv(eth->sockfd, buff2, RAW_PACKET_SIZE_BYTES(nsamps), rcvfrom_flag); @@ -300,13 +300,15 @@ int trx_eth_read_raw_IF4p5(openair0_device *device, openair0_timestamp *timestam int nblocks = nsamps; int bytes_received=0; eth_state_t *eth = (eth_state_t*)device->priv; - int Mod_id = device->Mod_id; ssize_t packet_size = MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t; IF4p5_header_t *test_header = (IF4p5_header_t*)(buff[0] + MAC_HEADER_SIZE_BYTES); +#ifdef DEBUG + printf("Reading from device %p, eth %p, sockfd %d\n",device,eth,eth->sockfd); +#endif - bytes_received = recv(eth->sockfd[Mod_id], + bytes_received = recv(eth->sockfd, buff[0], packet_size, MSG_PEEK); @@ -315,7 +317,12 @@ int trx_eth_read_raw_IF4p5(openair0_device *device, openair0_timestamp *timestam perror("ETHERNET IF4p5 READ (header): "); exit(-1); } - +#ifdef DEBUG + for (int i=0;i<packet_size;i++) + printf("%2x.",((uint8_t*)buff[0])[i]); + printf("\n"); +#endif + *timestamp = test_header->sub_type; if (test_header->sub_type == IF4p5_PDLFFT) { @@ -328,7 +335,7 @@ int trx_eth_read_raw_IF4p5(openair0_device *device, openair0_timestamp *timestam while(bytes_received < packet_size) { - bytes_received = recv(eth->sockfd[Mod_id], + bytes_received = recv(eth->sockfd, buff[0], packet_size, 0); @@ -347,10 +354,81 @@ int trx_eth_read_raw_IF4p5(openair0_device *device, openair0_timestamp *timestam } +int trx_eth_read_raw_IF5_mobipass(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc) { + // Read nblocks info from packet itself + + int nblocks = nsamps; + int bytes_received=0; + eth_state_t *eth = (eth_state_t*)device->priv; + + ssize_t packet_size = 28; //MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t ; +// ssize_t packet_size = MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + 640*sizeof(int16_t); + + bytes_received = recv(eth->sockfd, + buff[0], + packet_size, + MSG_PEEK); + + if (bytes_received ==-1) { + eth->num_rx_errors++; + perror("[MOBIPASS]ETHERNET IF5 READ (header): "); + exit(-1); + } + + IF5_mobipass_header_t *test_header = (IF5_mobipass_header_t*)((uint8_t *)buff[0] + MAC_HEADER_SIZE_BYTES); + *timestamp = test_header->time_stamp; + packet_size = MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + 640*sizeof(int16_t); + + while(bytes_received < packet_size) { + bytes_received = recv(eth->sockfd, + buff[0], + packet_size, + 0); + if (bytes_received ==-1) { + eth->num_rx_errors++; + perror("[MOBIPASS] ETHERNET IF5 READ (payload): "); + exit(-1); + } else { + eth->rx_actual_nsamps = bytes_received>>1; + eth->rx_count++; + } + } + + eth->rx_nsamps = nsamps; + return(bytes_received); + + +/* + if (bytes_received > 0) { + while(bytes_received < packet_size) { + bytes_received = recv(eth->sockfd, + buff[0], + packet_size, + 0); + if (bytes_received ==-1) { + eth->num_rx_errors++; + perror("ETHERNET IF5_MOBIPASS READ (payload): "); + exit(-1); + } else { + eth->rx_actual_nsamps = bytes_received>>1; + eth->rx_count++; + } + } + if (bytes_received == packet_size){ + IF5_mobipass_header_t *test_header = (IF5_mobipass_header_t*)((uint8_t *)buff[0] + MAC_HEADER_SIZE_BYTES); + *timestamp = test_header->time_stamp; + } + + eth->rx_nsamps = nsamps; + } + + return(bytes_received); +*/ +} + int eth_set_dev_conf_raw(openair0_device *device) { - int Mod_id = device->Mod_id; eth_state_t *eth = (eth_state_t*)device->priv; void *msg; ssize_t msg_len; @@ -366,7 +444,7 @@ int eth_set_dev_conf_raw(openair0_device *device) { memcpy(msg,(void*)ð->eh,MAC_HEADER_SIZE_BYTES); memcpy((msg+MAC_HEADER_SIZE_BYTES),(void*)device->openair0_cfg,sizeof(openair0_config_t)); - if (send(eth->sockfd[Mod_id], + if (send(eth->sockfd, msg, msg_len, 0)==-1) { @@ -382,7 +460,6 @@ int eth_set_dev_conf_raw(openair0_device *device) { int eth_set_dev_conf_raw_IF4p5(openair0_device *device) { // use for cc_id info - int Mod_id = device->Mod_id; eth_state_t *eth = (eth_state_t*)device->priv; void *msg; ssize_t msg_len; @@ -398,7 +475,7 @@ int eth_set_dev_conf_raw_IF4p5(openair0_device *device) { memcpy(msg,(void*)ð->eh,MAC_HEADER_SIZE_BYTES); memcpy((msg+MAC_HEADER_SIZE_BYTES),(void*)device->openair0_cfg,sizeof(openair0_config_t)); - if (send(eth->sockfd[Mod_id], + if (send(eth->sockfd, msg, msg_len, 0)==-1) { @@ -413,7 +490,6 @@ int eth_set_dev_conf_raw_IF4p5(openair0_device *device) { int eth_get_dev_conf_raw(openair0_device *device) { eth_state_t *eth = (eth_state_t*)device->priv; - int Mod_id = device->Mod_id; void *msg; ssize_t msg_len; @@ -421,7 +497,7 @@ int eth_get_dev_conf_raw(openair0_device *device) { msg_len = MAC_HEADER_SIZE_BYTES + sizeof(openair0_config_t); /* RRH receives from BBU openair0_config_t */ - if (recv(eth->sockfd[Mod_id], + if (recv(eth->sockfd, msg, msg_len, 0)==-1) { @@ -433,7 +509,7 @@ int eth_get_dev_conf_raw(openair0_device *device) { memcpy(eth->eh.ether_dhost,(msg+ETH_ALEN),ETH_ALEN); //memcpy((void*)&device->openair0_cfg,(msg + MAC_HEADER_SIZE_BYTES), sizeof(openair0_config_t)); device->openair0_cfg=(openair0_config_t *)(msg + MAC_HEADER_SIZE_BYTES); - printf("[%s] binding mod_%d to hardware address %x:%x:%x:%x:%x:%x hardware address %x:%x:%x:%x:%x:%x\n",((device->host_type == BBU_HOST) ? "BBU": "RRH"),Mod_id,eth->eh.ether_shost[0],eth->eh.ether_shost[1],eth->eh.ether_shost[2],eth->eh.ether_shost[3],eth->eh.ether_shost[4],eth->eh.ether_shost[5],eth->eh.ether_dhost[0],eth->eh.ether_dhost[1],eth->eh.ether_dhost[2],eth->eh.ether_dhost[3],eth->eh.ether_dhost[4],eth->eh.ether_dhost[5]); + printf("[%s] binding mod to hardware address %x:%x:%x:%x:%x:%x hardware address %x:%x:%x:%x:%x:%x\n",((device->host_type == BBU_HOST) ? "BBU": "RRH"),eth->eh.ether_shost[0],eth->eh.ether_shost[1],eth->eh.ether_shost[2],eth->eh.ether_shost[3],eth->eh.ether_shost[4],eth->eh.ether_shost[5],eth->eh.ether_dhost[0],eth->eh.ether_dhost[1],eth->eh.ether_dhost[2],eth->eh.ether_dhost[3],eth->eh.ether_dhost[4],eth->eh.ether_dhost[5]); return 0; } @@ -443,7 +519,6 @@ int eth_get_dev_conf_raw_IF4p5(openair0_device *device) { // use for cc_id info eth_state_t *eth = (eth_state_t*)device->priv; - int Mod_id = device->Mod_id; void *msg; ssize_t msg_len; @@ -451,7 +526,7 @@ int eth_get_dev_conf_raw_IF4p5(openair0_device *device) { msg_len = MAC_HEADER_SIZE_BYTES + sizeof(openair0_config_t); /* RRH receives from BBU openair0_config_t */ - if (recv(eth->sockfd[Mod_id], + if (recv(eth->sockfd, msg, msg_len, 0)==-1) { @@ -463,7 +538,7 @@ int eth_get_dev_conf_raw_IF4p5(openair0_device *device) { memcpy(eth->eh.ether_dhost,(msg+ETH_ALEN),ETH_ALEN); //memcpy((void*)&device->openair0_cfg,(msg + MAC_HEADER_SIZE_BYTES), sizeof(openair0_config_t)); //device->openair0_cfg=(openair0_config_t *)(msg + MAC_HEADER_SIZE_BYTES); - printf("[%s] binding mod_%d to hardware address %x:%x:%x:%x:%x:%x hardware address %x:%x:%x:%x:%x:%x\n",((device->host_type == BBU_HOST) ? "BBU": "RRH"),Mod_id,eth->eh.ether_shost[0],eth->eh.ether_shost[1],eth->eh.ether_shost[2],eth->eh.ether_shost[3],eth->eh.ether_shost[4],eth->eh.ether_shost[5],eth->eh.ether_dhost[0],eth->eh.ether_dhost[1],eth->eh.ether_dhost[2],eth->eh.ether_dhost[3],eth->eh.ether_dhost[4],eth->eh.ether_dhost[5]); + printf("[%s] binding mod to hardware address %x:%x:%x:%x:%x:%x hardware address %x:%x:%x:%x:%x:%x\n",((device->host_type == BBU_HOST) ? "BBU": "RRH"),eth->eh.ether_shost[0],eth->eh.ether_shost[1],eth->eh.ether_shost[2],eth->eh.ether_shost[3],eth->eh.ether_shost[4],eth->eh.ether_shost[5],eth->eh.ether_dhost[0],eth->eh.ether_dhost[1],eth->eh.ether_dhost[2],eth->eh.ether_dhost[3],eth->eh.ether_dhost[4],eth->eh.ether_dhost[5]); return 0; } diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c index 6ee1b879d1e90783aeea54b21584dd2a849ead2a..898382cf6a480ebea27429f4c6a1f5592c632140 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c @@ -47,9 +47,9 @@ #include "ethernet_lib.h" #define DEBUG 0 -struct sockaddr_in dest_addr[MAX_INST]; -struct sockaddr_in local_addr[MAX_INST]; -int addr_len[MAX_INST]; +//struct sockaddr_in dest_addr[MAX_INST]; +//struct sockaddr_in local_addr[MAX_INST]; +//int addr_len[MAX_INST]; uint16_t pck_seq_num = 1; @@ -58,9 +58,7 @@ uint16_t pck_seq_num_prev=0; int eth_socket_init_udp(openair0_device *device) { - int i = 0; eth_state_t *eth = (eth_state_t*)device->priv; - int Mod_id = device->Mod_id; char str_local[INET_ADDRSTRLEN]; char str_remote[INET_ADDRSTRLEN]; const char *local_ip, *remote_ip; @@ -89,43 +87,42 @@ int eth_socket_init_udp(openair0_device *device) { sock_type=SOCK_DGRAM; sock_proto=IPPROTO_UDP; - if ((eth->sockfd[Mod_id] = socket(sock_dom, sock_type, sock_proto)) == -1) { + if ((eth->sockfd = socket(sock_dom, sock_type, sock_proto)) == -1) { perror("ETHERNET: Error opening socket"); exit(0); } /* initialize addresses */ - for (i=0; i< MAX_INST; i++) { - bzero((void *)&(dest_addr[i]), sizeof(dest_addr[i])); - bzero((void *)&(local_addr[i]), sizeof(local_addr[i])); - } + bzero((void *)&(eth->dest_addr), sizeof(eth->dest_addr)); + bzero((void *)&(eth->local_addr), sizeof(eth->local_addr)); + - addr_len[Mod_id] = sizeof(struct sockaddr_in); + eth->addr_len = sizeof(struct sockaddr_in); - dest_addr[Mod_id].sin_family = AF_INET; - inet_pton(AF_INET,remote_ip,&(dest_addr[Mod_id].sin_addr.s_addr)); - dest_addr[Mod_id].sin_port=htons(remote_port); - inet_ntop(AF_INET, &(dest_addr[Mod_id].sin_addr), str_remote, INET_ADDRSTRLEN); + eth->dest_addr.sin_family = AF_INET; + inet_pton(AF_INET,remote_ip,&(eth->dest_addr.sin_addr.s_addr)); + eth->dest_addr.sin_port=htons(remote_port); + inet_ntop(AF_INET, &(eth->dest_addr.sin_addr), str_remote, INET_ADDRSTRLEN); - local_addr[Mod_id].sin_family = AF_INET; - inet_pton(AF_INET,local_ip,&(local_addr[Mod_id].sin_addr.s_addr)); - local_addr[Mod_id].sin_port=htons(local_port); - inet_ntop(AF_INET, &(local_addr[Mod_id].sin_addr), str_local, INET_ADDRSTRLEN); + eth->local_addr.sin_family = AF_INET; + inet_pton(AF_INET,local_ip,&(eth->local_addr.sin_addr.s_addr)); + eth->local_addr.sin_port=htons(local_port); + inet_ntop(AF_INET, &(eth->local_addr.sin_addr), str_local, INET_ADDRSTRLEN); /* set reuse address flag */ - if (setsockopt(eth->sockfd[Mod_id], SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int))) { + if (setsockopt(eth->sockfd, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int))) { perror("ETHERNET: Cannot set SO_REUSEADDR option on socket"); exit(0); } /* want to receive -> so bind */ - if (bind(eth->sockfd[Mod_id],(struct sockaddr *)&local_addr[Mod_id],addr_len[Mod_id])<0) { + if (bind(eth->sockfd,(struct sockaddr *)ð->local_addr,eth->addr_len)<0) { perror("ETHERNET: Cannot bind to socket"); exit(0); } else { - printf("[%s] binding mod_%d to %s:%d\n","RRH",Mod_id,str_local,ntohs(local_addr[Mod_id].sin_port)); + printf("[%s] binding to %s:%d\n","RRH",str_local,ntohs(eth->local_addr.sin_port)); } return 0; @@ -135,54 +132,62 @@ int trx_eth_read_udp_IF4p5(openair0_device *device, openair0_timestamp *timestam // Read nblocks info from packet itself int nblocks = nsamps; - int bytes_received=0; + int bytes_received=-1; eth_state_t *eth = (eth_state_t*)device->priv; - int Mod_id = device->Mod_id; - + ssize_t packet_size = sizeof_IF4p5_header_t; IF4p5_header_t *test_header = (IF4p5_header_t*)(buff[0]); - - - bytes_received = recvfrom(eth->sockfd[Mod_id], - buff[0], - packet_size, - 0, - (struct sockaddr *)&dest_addr[Mod_id], - (socklen_t *)&addr_len[Mod_id]); - - if (bytes_received ==-1) { - eth->num_rx_errors++; - perror("ETHERNET IF4p5 READ (header): "); - exit(-1); - } - - *timestamp = test_header->sub_type; - if (test_header->sub_type == IF4p5_PDLFFT) { - packet_size = UDP_IF4p5_PDLFFT_SIZE_BYTES(nblocks); - } else if (test_header->sub_type == IF4p5_PULFFT) { - packet_size = UDP_IF4p5_PULFFT_SIZE_BYTES(nblocks); - } else { - packet_size = UDP_IF4p5_PRACH_SIZE_BYTES; - } - - - while(bytes_received < packet_size) { - bytes_received = recvfrom(eth->sockfd[Mod_id], - buff[0], - packet_size, - 0, - (struct sockaddr *)&dest_addr[Mod_id], - (socklen_t *)&addr_len[Mod_id]); + int block_cnt=0; + int again_cnt=0; + packet_size = max(UDP_IF4p5_PRACH_SIZE_BYTES, max(UDP_IF4p5_PULFFT_SIZE_BYTES(nblocks), UDP_IF4p5_PDLFFT_SIZE_BYTES(nblocks))); + + while(bytes_received == -1) { + again: + bytes_received = recvfrom(eth->sockfd, + buff[0], + packet_size, + 0, + (struct sockaddr *)ð->dest_addr, + (socklen_t *)ð->addr_len); if (bytes_received ==-1) { eth->num_rx_errors++; - perror("ETHERNET IF4p5 READ (payload): "); - exit(-1); + if (errno == EAGAIN) { + /* + again_cnt++; + usleep(10); + if (again_cnt == 1000) { + perror("ETHERNET IF4p5 READ (EAGAIN): "); + exit(-1); + } else { + printf("AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN \n"); + goto again; + } + */ + printf("Lost IF4p5 connection with %s\n", inet_ntoa(eth->dest_addr.sin_addr)); + exit(-1); + } else if (errno == EWOULDBLOCK) { + block_cnt++; + usleep(10); + if (block_cnt == 1000) { + perror("ETHERNET IF4p5 READ (EWOULDBLOCK): "); + exit(-1); + } else { + printf("BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK \n"); + goto again; + } + } else { + perror("ETHERNET IF4p5 READ"); + printf("(%s):\n", strerror(errno)); + exit(-1); + } } else { - eth->rx_actual_nsamps = bytes_received>>1; + *timestamp = test_header->sub_type; + eth->rx_actual_nsamps = bytes_received>>1; eth->rx_count++; } } + //printf("size of third %d subtype %d frame %d subframe %d symbol %d \n", bytes_received, test_header->sub_type, ((test_header->frame_status)>>6)&0xffff, ((test_header->frame_status)>>22)&0x000f, ((test_header->frame_status)>>26)&0x000f) ; eth->rx_nsamps = nsamps; return(bytes_received); @@ -194,7 +199,6 @@ int trx_eth_write_udp_IF4p5(openair0_device *device, openair0_timestamp timestam int bytes_sent = 0; eth_state_t *eth = (eth_state_t*)device->priv; - int Mod_id = device->Mod_id; ssize_t packet_size; @@ -202,6 +206,8 @@ int trx_eth_write_udp_IF4p5(openair0_device *device, openair0_timestamp timestam packet_size = UDP_IF4p5_PDLFFT_SIZE_BYTES(nblocks); } else if (flags == IF4p5_PULFFT) { packet_size = UDP_IF4p5_PULFFT_SIZE_BYTES(nblocks); + } else if (flags == IF4p5_PULTICK) { + packet_size = UDP_IF4p5_PULTICK_SIZE_BYTES; } else if (flags == IF4p5_PRACH) { packet_size = UDP_IF4p5_PRACH_SIZE_BYTES; } else { @@ -211,12 +217,12 @@ int trx_eth_write_udp_IF4p5(openair0_device *device, openair0_timestamp timestam eth->tx_nsamps = nblocks; - bytes_sent = sendto(eth->sockfd[Mod_id], + bytes_sent = sendto(eth->sockfd, buff[0], packet_size, 0, - (struct sockaddr*)&dest_addr[Mod_id], - addr_len[Mod_id]); + (struct sockaddr*)ð->dest_addr, + eth->addr_len); if (bytes_sent == -1) { eth->num_tx_errors++; @@ -234,7 +240,6 @@ int trx_eth_write_udp(openair0_device *device, openair0_timestamp timestamp, voi int bytes_sent=0; eth_state_t *eth = (eth_state_t*)device->priv; - int Mod_id = device->Mod_id; int sendto_flag =0; int i=0; //sendto_flag|=flags; @@ -268,12 +273,12 @@ int trx_eth_write_udp(openair0_device *device, openair0_timestamp timestamp, voi bytes_sent); #endif /* Send packet */ - bytes_sent += sendto(eth->sockfd[Mod_id], + bytes_sent += sendto(eth->sockfd, buff2, UDP_PACKET_SIZE_BYTES(nsamps), sendto_flag, - (struct sockaddr*)&dest_addr[Mod_id], - addr_len[Mod_id]); + (struct sockaddr*)ð->dest_addr, + eth->addr_len); if ( bytes_sent == -1) { eth->num_tx_errors++; @@ -291,7 +296,7 @@ int trx_eth_write_udp(openair0_device *device, openair0_timestamp timestamp, voi eth->tx_actual_nsamps=bytes_sent>>2; eth->tx_count++; pck_seq_num++; - if ( pck_seq_num > MAX_PACKET_SEQ_NUM(nsamps,76800) ) pck_seq_num = 1; + if ( pck_seq_num > MAX_PACKET_SEQ_NUM(nsamps,device->openair0_cfg->samples_per_frame) ) pck_seq_num = 1; } } /* tx buffer values restored */ @@ -309,7 +314,6 @@ int trx_eth_read_udp(openair0_device *device, openair0_timestamp *timestamp, voi int bytes_received=0; eth_state_t *eth = (eth_state_t*)device->priv; // openair0_timestamp prev_timestamp = -1; - int Mod_id = device->Mod_id; int rcvfrom_flag =0; int block_cnt=0; int again_cnt=0; @@ -338,12 +342,12 @@ int trx_eth_read_udp(openair0_device *device, openair0_timestamp *timestamp, voi UDP_PACKET_SIZE_BYTES(nsamps) - bytes_received, bytes_received); #endif - bytes_received +=recvfrom(eth->sockfd[Mod_id], + bytes_received +=recvfrom(eth->sockfd, buff2, UDP_PACKET_SIZE_BYTES(nsamps), rcvfrom_flag, - (struct sockaddr *)&dest_addr[Mod_id], - (socklen_t *)&addr_len[Mod_id]); + (struct sockaddr *)ð->dest_addr, + (socklen_t *)ð->addr_len); if (bytes_received ==-1) { eth->num_rx_errors++; @@ -389,7 +393,7 @@ int trx_eth_read_udp(openair0_device *device, openair0_timestamp *timestamp, voi /* get the packet sequence number from packet's header */ pck_seq_num_cur = *(uint16_t *)buff2; //printf("cur=%d prev=%d buff=%d\n",pck_seq_num_cur,pck_seq_num_prev,*(uint16_t *)(buff2)); - if ( ( pck_seq_num_cur != (pck_seq_num_prev + 1) ) && !((pck_seq_num_prev==75) && (pck_seq_num_cur==1 ))){ + if ( ( pck_seq_num_cur != (pck_seq_num_prev + 1) ) && !((pck_seq_num_prev==MAX_PACKET_SEQ_NUM(nsamps,device->openair0_cfg->samples_per_frame)) && (pck_seq_num_cur==1 )) && !((pck_seq_num_prev==1) && (pck_seq_num_cur==1))) { printf("out of order packet received1! %d|%d|%d\n",pck_seq_num_cur,pck_seq_num_prev,(int)*timestamp); } VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RX_SEQ_NUM,pck_seq_num_cur); @@ -412,7 +416,6 @@ int trx_eth_read_udp(openair0_device *device, openair0_timestamp *timestamp, voi int eth_set_dev_conf_udp(openair0_device *device) { - int Mod_id = device->Mod_id; eth_state_t *eth = (eth_state_t*)device->priv; void *msg; ssize_t msg_len; @@ -425,9 +428,10 @@ int eth_set_dev_conf_udp(openair0_device *device) { msg=malloc(sizeof(openair0_config_t)); msg_len=sizeof(openair0_config_t); memcpy(msg,(void*)device->openair0_cfg,msg_len); - - if (sendto(eth->sockfd[Mod_id],msg,msg_len,0,(struct sockaddr *)&dest_addr[Mod_id],addr_len[Mod_id])==-1) { - perror("ETHERNET: "); + + if (sendto(eth->sockfd,msg,msg_len,0,(struct sockaddr *)ð->dest_addr,eth->addr_len)==-1) { + perror("ETHERNET: sendto conf_udp"); + printf("addr_len : %d, msg_len %d\n",eth->addr_len,msg_len); exit(0); } @@ -437,7 +441,6 @@ int eth_set_dev_conf_udp(openair0_device *device) { int eth_get_dev_conf_udp(openair0_device *device) { eth_state_t *eth = (eth_state_t*)device->priv; - int Mod_id = device->Mod_id; char str1[INET_ADDRSTRLEN],str[INET_ADDRSTRLEN]; void *msg; ssize_t msg_len; @@ -445,31 +448,31 @@ int eth_get_dev_conf_udp(openair0_device *device) { msg=malloc(sizeof(openair0_config_t)); msg_len=sizeof(openair0_config_t); - inet_ntop(AF_INET, &(local_addr[Mod_id].sin_addr), str, INET_ADDRSTRLEN); - inet_ntop(AF_INET, &(dest_addr[Mod_id].sin_addr), str1, INET_ADDRSTRLEN); + inet_ntop(AF_INET, &(eth->local_addr.sin_addr), str, INET_ADDRSTRLEN); + inet_ntop(AF_INET, &(eth->dest_addr.sin_addr), str1, INET_ADDRSTRLEN); /* RRH receives from BBU openair0_config_t */ - if (recvfrom(eth->sockfd[Mod_id], + if (recvfrom(eth->sockfd, msg, msg_len, 0, - (struct sockaddr *)&dest_addr[Mod_id], - (socklen_t *)&addr_len[Mod_id])==-1) { - perror("ETHERNET: "); + (struct sockaddr *)ð->dest_addr, + (socklen_t *)ð->addr_len)==-1) { + perror("ETHERNET: recv_from conf_udp"); exit(0); } device->openair0_cfg=(openair0_config_t *)msg; /* get remote ip address and port */ - /* inet_ntop(AF_INET, &(dest_addr[Mod_id].sin_addr), str1, INET_ADDRSTRLEN); */ - /* device->openair0_cfg->remote_port =ntohs(dest_addr[Mod_id].sin_port); */ + /* inet_ntop(AF_INET, &(eth->dest_addr.sin_addr), str1, INET_ADDRSTRLEN); */ + /* device->openair0_cfg->remote_port =ntohs(eth->dest_addr.sin_port); */ /* device->openair0_cfg->remote_addr =str1; */ /* /\* restore local ip address and port *\/ */ - /* inet_ntop(AF_INET, &(local_addr[Mod_id].sin_addr), str, INET_ADDRSTRLEN); */ - /* device->openair0_cfg->my_port =ntohs(local_addr[Mod_id].sin_port); */ + /* inet_ntop(AF_INET, &(eth->local_addr.sin_addr), str, INET_ADDRSTRLEN); */ + /* device->openair0_cfg->my_port =ntohs(eth->local_addr.sin_port); */ /* device->openair0_cfg->my_addr =str; */ - /* printf("[RRH] mod_%d socket %d connected to BBU %s:%d %s:%d\n", Mod_id, eth->sockfd[Mod_id],str1, device->openair0_cfg->remote_port, str, device->openair0_cfg->my_port); */ + /* printf("[RRH] mod_%d socket %d connected to BBU %s:%d %s:%d\n", Mod_id, eth->sockfd,str1, device->openair0_cfg->remote_port, str, device->openair0_cfg->my_port); */ return 0; } diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c index 1880719c508ac95e63576f1ad34868d93a69116f..6f93ba4853d3fa209246871d57abf65f62f3493a 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -45,117 +45,114 @@ #include "common_lib.h" #include "ethernet_lib.h" -int num_devices_eth = 0; -struct sockaddr_in dest_addr[MAX_INST]; -int dest_addr_len[MAX_INST]; - - int trx_eth_start(openair0_device *device) { - eth_state_t *eth = (eth_state_t*)device->priv; - - /* initialize socket */ - if (eth->flags == ETH_RAW_MODE) { - printf("Setting ETHERNET to ETH_RAW_IF5_MODE\n"); - if (eth_socket_init_raw(device)!=0) return -1; - /* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/ - if (device->host_type == BBU_HOST) { - if(eth_set_dev_conf_raw(device)!=0) return -1; - } else { - if(eth_get_dev_conf_raw(device)!=0) return -1; - } - /* adjust MTU wrt number of samples per packet */ - if(ethernet_tune (device,MTU_SIZE,RAW_PACKET_SIZE_BYTES(device->openair0_cfg->samples_per_packet))!=0) return -1; - if(ethernet_tune (device,RCV_TIMEOUT,999999)!=0) return -1; - } else if (eth->flags == ETH_RAW_IF4p5_MODE) { - - printf("Setting ETHERNET to ETH_RAW_IF4p5_MODE\n"); - if (eth_socket_init_raw(device)!=0) return -1; - /* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/ - if (device->host_type == BBU_HOST) { - if(eth_set_dev_conf_raw_IF4p5(device)!=0) return -1; - } else { - if(eth_get_dev_conf_raw_IF4p5(device)!=0) return -1; - } - /* adjust MTU wrt number of samples per packet */ - if(ethernet_tune (device,MTU_SIZE,RAW_IF4p5_PRACH_SIZE_BYTES)!=0) return -1; - - if(ethernet_tune (device,RCV_TIMEOUT,999999)!=0) return -1; - } else if (eth->flags == ETH_UDP_IF4p5_MODE) { - printf("Setting ETHERNET to UDP_IF4p5_MODE\n"); - if (eth_socket_init_udp(device)!=0) return -1; - if (device->host_type == BBU_HOST) { - if(eth_set_dev_conf_udp(device)!=0) return -1; - } else { - if(eth_get_dev_conf_udp(device)!=0) return -1; - } - } else if (eth->flags == ETH_RAW_IF5_MOBIPASS) { - printf("Setting ETHERNET to RAW_IF5_MODE\n"); - if (eth_socket_init_raw(device)!=0) return -1; + eth_state_t *eth = (eth_state_t*)device->priv; + + /* initialize socket */ + if (eth->flags == ETH_RAW_MODE) { + printf("Setting ETHERNET to ETH_RAW_IF5_MODE\n"); + if (eth_socket_init_raw(device)!=0) return -1; + /* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/ + if (device->host_type == BBU_HOST) { + if(eth_set_dev_conf_raw(device)!=0) return -1; } else { - if (eth_socket_init_udp(device)!=0) return -1; - /* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/ - if (device->host_type == BBU_HOST) { - if(eth_set_dev_conf_udp(device)!=0) return -1; - } else { - if(eth_get_dev_conf_udp(device)!=0) return -1; - } + if(eth_get_dev_conf_raw(device)!=0) return -1; } - /* apply additional configuration */ - if(ethernet_tune (device, SND_BUF_SIZE,2000000000)!=0) return -1; - if(ethernet_tune (device, RCV_BUF_SIZE,2000000000)!=0) return -1; - - return 0; + /* adjust MTU wrt number of samples per packet */ + if(ethernet_tune (device,MTU_SIZE,RAW_PACKET_SIZE_BYTES(device->openair0_cfg->samples_per_packet))!=0) return -1; + if(ethernet_tune (device,RCV_TIMEOUT,999999)!=0) return -1; + } else if (eth->flags == ETH_RAW_IF4p5_MODE) { + + printf("Setting ETHERNET to ETH_RAW_IF4p5_MODE\n"); + if (eth_socket_init_raw(device)!=0) return -1; + /* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/ + if (device->host_type == BBU_HOST) { + if(eth_set_dev_conf_raw_IF4p5(device)!=0) return -1; + } else { + if(eth_get_dev_conf_raw_IF4p5(device)!=0) return -1; + } + /* adjust MTU wrt number of samples per packet */ + if(ethernet_tune (device,MTU_SIZE,RAW_IF4p5_PRACH_SIZE_BYTES)!=0) return -1; + + if(ethernet_tune (device,RCV_TIMEOUT,999999)!=0) return -1; + } else if (eth->flags == ETH_UDP_IF4p5_MODE) { + printf("Setting ETHERNET to UDP_IF4p5_MODE\n"); + if (eth_socket_init_udp(device)!=0) return -1; + if (device->host_type == BBU_HOST) { + if(eth_set_dev_conf_udp(device)!=0) return -1; + } else { + if(eth_get_dev_conf_udp(device)!=0) return -1; + } + } else if (eth->flags == ETH_RAW_IF5_MOBIPASS) { + printf("Setting ETHERNET to RAW_IF5_MODE\n"); + if (eth_socket_init_raw(device)!=0) return -1; + if(ethernet_tune (device,RCV_TIMEOUT,999999)!=0) return -1; + + } else { + printf("Setting ETHERNET to UDP_IF5_MODE\n"); + if (eth_socket_init_udp(device)!=0) return -1; + /* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/ + if (device->host_type == BBU_HOST) { + if(eth_set_dev_conf_udp(device)!=0) return -1; + } else { + if(eth_get_dev_conf_udp(device)!=0) return -1; + } + } + /* apply additional configuration */ + if(ethernet_tune (device, SND_BUF_SIZE,2000000000)!=0) return -1; + if(ethernet_tune (device, RCV_BUF_SIZE,2000000000)!=0) return -1; + + return 0; } void trx_eth_end(openair0_device *device) { - eth_state_t *eth = (eth_state_t*)device->priv; - int Mod_id = device->Mod_id; - /* destroys socket only for the processes that call the eth_end fuction-- shutdown() for beaking the pipe */ - if ( close(eth->sockfd[Mod_id]) <0 ) { - perror("ETHERNET: Failed to close socket"); - exit(0); - } else { - printf("[%s] socket for mod_id %d has been successfully closed.\n",(device->host_type == BBU_HOST)? "BBU":"RRH",Mod_id); - } - + eth_state_t *eth = (eth_state_t*)device->priv; + /* destroys socket only for the processes that call the eth_end fuction-- shutdown() for beaking the pipe */ + if ( close(eth->sockfd) <0 ) { + perror("ETHERNET: Failed to close socket"); + exit(0); + } else { + printf("[%s] socket has been successfully closed.\n",(device->host_type == BBU_HOST)? "BBU":"RRH"); + } } int trx_eth_request(openair0_device *device, void *msg, ssize_t msg_len) { - int Mod_id = device->Mod_id; - eth_state_t *eth = (eth_state_t*)device->priv; - - /* BBU sends a message to RRH */ - if (sendto(eth->sockfd[Mod_id],msg,msg_len,0,(struct sockaddr *)&dest_addr[Mod_id],dest_addr_len[Mod_id])==-1) { - perror("ETHERNET: "); - exit(0); - } - - return 0; + eth_state_t *eth = (eth_state_t*)device->priv; + + /* BBU sends a message to RRH */ + + if (sendto(eth->sockfd,msg,msg_len,0,(struct sockaddr *)ð->dest_addr,eth->addr_len)==-1) { + perror("ETHERNET: "); + exit(0); + } + return 0; } int trx_eth_reply(openair0_device *device, void *msg, ssize_t msg_len) { - eth_state_t *eth = (eth_state_t*)device->priv; - int Mod_id = device->Mod_id; - - /* RRH receives from BBU a message */ - if (recvfrom(eth->sockfd[Mod_id], - msg, - msg_len, - 0, - (struct sockaddr *)&dest_addr[Mod_id], - (socklen_t *)&dest_addr_len[Mod_id])==-1) { - perror("ETHERNET: "); - exit(0); - } + eth_state_t *eth = (eth_state_t*)device->priv; + + /* RRH receives from BBU a message */ + + if (recvfrom(eth->sockfd, + msg, + msg_len, + 0, + (struct sockaddr *)ð->dest_addr, + (socklen_t *)ð->addr_len)==-1) { + perror("ETHERNET: recv_from in trx_eth_reply "); + exit(0); + } + + - return 0; + return 0; } @@ -182,236 +179,233 @@ int trx_eth_reset_stats(openair0_device* device) { int ethernet_tune(openair0_device *device, unsigned int option, int value) { - - eth_state_t *eth = (eth_state_t*)device->priv; - int Mod_id=device->Mod_id; - struct timeval timeout; - struct ifreq ifr; - char system_cmd[256]; - // char* if_name=DEFAULT_IF; - // struct in_addr ia; - // struct if_nameindex *ids; - int ret=0; - // int i=0; - - /****************** socket level options ************************/ - switch(option) { - case SND_BUF_SIZE: /* transmit socket buffer size */ - if (setsockopt(eth->sockfd[Mod_id], - SOL_SOCKET, - SO_SNDBUF, - &value,sizeof(value))) { - perror("[ETHERNET] setsockopt()"); - } else { - printf("send buffer size= %d bytes\n",value); - } - break; - - case RCV_BUF_SIZE: /* receive socket buffer size */ - if (setsockopt(eth->sockfd[Mod_id], - SOL_SOCKET, - SO_RCVBUF, - &value,sizeof(value))) { - perror("[ETHERNET] setsockopt()"); - } else { - printf("receive bufffer size= %d bytes\n",value); - } - break; - - case RCV_TIMEOUT: - timeout.tv_sec = value/1000000; - timeout.tv_usec = value%1000000;//less than rt_period? - if (setsockopt(eth->sockfd[Mod_id], - SOL_SOCKET, - SO_RCVTIMEO, - (char *)&timeout,sizeof(timeout))) { - perror("[ETHERNET] setsockopt()"); - } else { - printf( "receive timeout= %u usec\n",(unsigned int)timeout.tv_usec); - } - break; - - case SND_TIMEOUT: - timeout.tv_sec = value/1000000000; - timeout.tv_usec = value%1000000000;//less than rt_period? - if (setsockopt(eth->sockfd[Mod_id], - SOL_SOCKET, - SO_SNDTIMEO, - (char *)&timeout,sizeof(timeout))) { - perror("[ETHERNET] setsockopt()"); - } else { - printf( "send timeout= %d,%d sec\n",(int)timeout.tv_sec,(int)timeout.tv_usec); - } - break; - - + + eth_state_t *eth = (eth_state_t*)device->priv; + struct timeval timeout; + struct ifreq ifr; + char system_cmd[256]; + // char* if_name=DEFAULT_IF; + // struct in_addr ia; + // struct if_nameindex *ids; + int ret=0; + // int i=0; + + /****************** socket level options ************************/ + switch(option) { + case SND_BUF_SIZE: /* transmit socket buffer size */ + if (setsockopt(eth->sockfd, + SOL_SOCKET, + SO_SNDBUF, + &value,sizeof(value))) { + perror("[ETHERNET] setsockopt()"); + } else { + printf("send buffer size= %d bytes\n",value); + } + break; + + case RCV_BUF_SIZE: /* receive socket buffer size */ + if (setsockopt(eth->sockfd, + SOL_SOCKET, + SO_RCVBUF, + &value,sizeof(value))) { + perror("[ETHERNET] setsockopt()"); + } else { + printf("receive bufffer size= %d bytes\n",value); + } + break; + + case RCV_TIMEOUT: + timeout.tv_sec = value/1000000; + timeout.tv_usec = value%1000000;//less than rt_period? + if (setsockopt(eth->sockfd, + SOL_SOCKET, + SO_RCVTIMEO, + (char *)&timeout,sizeof(timeout))) { + perror("[ETHERNET] setsockopt()"); + } else { + printf( "receive timeout= %u usec\n",(unsigned int)timeout.tv_usec); + } + break; + + case SND_TIMEOUT: + timeout.tv_sec = value/1000000000; + timeout.tv_usec = value%1000000000;//less than rt_period? + if (setsockopt(eth->sockfd, + SOL_SOCKET, + SO_SNDTIMEO, + (char *)&timeout,sizeof(timeout))) { + perror("[ETHERNET] setsockopt()"); + } else { + printf( "send timeout= %d,%d sec\n",(int)timeout.tv_sec,(int)timeout.tv_usec); + } + break; + + /******************* interface level options *************************/ - case MTU_SIZE: /* change MTU of the eth interface */ - ifr.ifr_addr.sa_family = AF_INET; - strncpy(ifr.ifr_name,eth->if_name[Mod_id], sizeof(ifr.ifr_name)); - ifr.ifr_mtu =value; - if (ioctl(eth->sockfd[Mod_id],SIOCSIFMTU,(caddr_t)&ifr) < 0 ) - perror ("[ETHERNET] Can't set the MTU"); - else - printf("[ETHERNET] %s MTU size has changed to %d\n",eth->if_name[Mod_id],ifr.ifr_mtu); - break; - - case TX_Q_LEN: /* change TX queue length of eth interface */ - ifr.ifr_addr.sa_family = AF_INET; - strncpy(ifr.ifr_name,eth->if_name[Mod_id], sizeof(ifr.ifr_name)); - ifr.ifr_qlen =value; - if (ioctl(eth->sockfd[Mod_id],SIOCSIFTXQLEN,(caddr_t)&ifr) < 0 ) - perror ("[ETHERNET] Can't set the txqueuelen"); - else - printf("[ETHERNET] %s txqueuelen size has changed to %d\n",eth->if_name[Mod_id],ifr.ifr_qlen); - break; - + case MTU_SIZE: /* change MTU of the eth interface */ + ifr.ifr_addr.sa_family = AF_INET; + strncpy(ifr.ifr_name,eth->if_name, sizeof(ifr.ifr_name)); + ifr.ifr_mtu =value; + if (ioctl(eth->sockfd,SIOCSIFMTU,(caddr_t)&ifr) < 0 ) + perror ("[ETHERNET] Can't set the MTU"); + else + printf("[ETHERNET] %s MTU size has changed to %d\n",eth->if_name,ifr.ifr_mtu); + break; + + case TX_Q_LEN: /* change TX queue length of eth interface */ + ifr.ifr_addr.sa_family = AF_INET; + strncpy(ifr.ifr_name,eth->if_name, sizeof(ifr.ifr_name)); + ifr.ifr_qlen =value; + if (ioctl(eth->sockfd,SIOCSIFTXQLEN,(caddr_t)&ifr) < 0 ) + perror ("[ETHERNET] Can't set the txqueuelen"); + else + printf("[ETHERNET] %s txqueuelen size has changed to %d\n",eth->if_name,ifr.ifr_qlen); + break; + /******************* device level options *************************/ - case COALESCE_PAR: - ret=snprintf(system_cmd,sizeof(system_cmd),"ethtool -C %s rx-usecs %d",eth->if_name[Mod_id],value); - if (ret > 0) { - ret=system(system_cmd); - if (ret == -1) { - fprintf (stderr,"[ETHERNET] Can't start shell to execute %s %s",system_cmd, strerror(errno)); - } else { - printf ("[ETHERNET] status of %s is %i\n",WEXITSTATUS(ret)); - } - printf("[ETHERNET] Coalesce parameters %s\n",system_cmd); - } else { - perror("[ETHERNET] Can't set coalesce parameters\n"); - } - break; - - case PAUSE_PAR: - if (value==1) ret=snprintf(system_cmd,sizeof(system_cmd),"ethtool -A %s autoneg off rx off tx off",eth->if_name[Mod_id]); - else if (value==0) ret=snprintf(system_cmd,sizeof(system_cmd),"ethtool -A %s autoneg on rx on tx on",eth->if_name[Mod_id]); - else break; - if (ret > 0) { - ret=system(system_cmd); - if (ret == -1) { - fprintf (stderr,"[ETHERNET] Can't start shell to execute %s %s",system_cmd, strerror(errno)); - } else { - printf ("[ETHERNET] status of %s is %i\n",WEXITSTATUS(ret)); - } - printf("[ETHERNET] Pause parameters %s\n",system_cmd); - } else { - perror("[ETHERNET] Can't set pause parameters\n"); - } - break; - - case RING_PAR: - ret=snprintf(system_cmd,sizeof(system_cmd),"ethtool -G %s val %d",eth->if_name[Mod_id],value); - if (ret > 0) { - ret=system(system_cmd); - if (ret == -1) { - fprintf (stderr,"[ETHERNET] Can't start shell to execute %s %s",system_cmd, strerror(errno)); - } else { - printf ("[ETHERNET] status of %s is %i\n",WEXITSTATUS(ret)); - } - printf("[ETHERNET] Ring parameters %s\n",system_cmd); - } else { - perror("[ETHERNET] Can't set ring parameters\n"); - } - break; - - default: - break; + case COALESCE_PAR: + ret=snprintf(system_cmd,sizeof(system_cmd),"ethtool -C %s rx-usecs %d",eth->if_name,value); + if (ret > 0) { + ret=system(system_cmd); + if (ret == -1) { + fprintf (stderr,"[ETHERNET] Can't start shell to execute %s %s",system_cmd, strerror(errno)); + } else { + printf ("[ETHERNET] status of %s is %i\n",WEXITSTATUS(ret)); + } + printf("[ETHERNET] Coalesce parameters %s\n",system_cmd); + } else { + perror("[ETHERNET] Can't set coalesce parameters\n"); } - - return 0; -} - - - -int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth_params_t * eth_params ) { - - eth_state_t *eth = (eth_state_t*)malloc(sizeof(eth_state_t)); - memset(eth, 0, sizeof(eth_state_t)); - - if (eth_params->transp_preference == 1) { - eth->flags = ETH_RAW_MODE; - } else if (eth_params->transp_preference == 0) { - eth->flags = ETH_UDP_MODE; - } else if (eth_params->transp_preference == 3) { - eth->flags = ETH_RAW_IF4p5_MODE; - } else if (eth_params->transp_preference == 2) { - eth->flags = ETH_UDP_IF4p5_MODE; - } else if (eth_params->transp_preference == 4) { - eth->flags = ETH_RAW_IF5_MOBIPASS; + break; + + case PAUSE_PAR: + if (value==1) ret=snprintf(system_cmd,sizeof(system_cmd),"ethtool -A %s autoneg off rx off tx off",eth->if_name); + else if (value==0) ret=snprintf(system_cmd,sizeof(system_cmd),"ethtool -A %s autoneg on rx on tx on",eth->if_name); + else break; + if (ret > 0) { + ret=system(system_cmd); + if (ret == -1) { + fprintf (stderr,"[ETHERNET] Can't start shell to execute %s %s",system_cmd, strerror(errno)); + } else { + printf ("[ETHERNET] status of %s is %i\n",WEXITSTATUS(ret)); + } + printf("[ETHERNET] Pause parameters %s\n",system_cmd); } else { - printf("transport_init: Unknown transport preference %d - default to RAW", eth_params->transp_preference); - eth->flags = ETH_RAW_MODE; + perror("[ETHERNET] Can't set pause parameters\n"); } - - printf("[ETHERNET]: Initializing openair0_device for %s ...\n", ((device->host_type == BBU_HOST) ? "BBU": "RRH")); - device->Mod_id = num_devices_eth++; - device->transp_type = ETHERNET_TP; - device->trx_start_func = trx_eth_start; - device->trx_request_func = trx_eth_request; - device->trx_reply_func = trx_eth_reply; - device->trx_get_stats_func = trx_eth_get_stats; - device->trx_reset_stats_func = trx_eth_reset_stats; - device->trx_end_func = trx_eth_end; - device->trx_stop_func = trx_eth_stop; - device->trx_set_freq_func = trx_eth_set_freq; - device->trx_set_gains_func = trx_eth_set_gains; - - if (eth->flags == ETH_RAW_MODE) { - device->trx_write_func = trx_eth_write_raw; - device->trx_read_func = trx_eth_read_raw; - } else if (eth->flags == ETH_UDP_MODE) { - device->trx_write_func = trx_eth_write_udp; - device->trx_read_func = trx_eth_read_udp; - } else if (eth->flags == ETH_RAW_IF4p5_MODE) { - device->trx_write_func = trx_eth_write_raw_IF4p5; - device->trx_read_func = trx_eth_read_raw_IF4p5; - } else if (eth->flags == ETH_UDP_IF4p5_MODE) { - device->trx_write_func = trx_eth_write_udp_IF4p5; - device->trx_read_func = trx_eth_read_udp_IF4p5; - } else if (eth->flags == ETH_RAW_IF5_MOBIPASS) { - device->trx_write_func = trx_eth_write_raw_IF4p5; - device->trx_read_func = trx_eth_read_raw_IF4p5; + break; + + case RING_PAR: + ret=snprintf(system_cmd,sizeof(system_cmd),"ethtool -G %s val %d",eth->if_name,value); + if (ret > 0) { + ret=system(system_cmd); + if (ret == -1) { + fprintf (stderr,"[ETHERNET] Can't start shell to execute %s %s",system_cmd, strerror(errno)); + } else { + printf ("[ETHERNET] status of %s is %i\n",WEXITSTATUS(ret)); + } + printf("[ETHERNET] Ring parameters %s\n",system_cmd); } else { - //device->trx_write_func = trx_eth_write_udp_IF4p5; - //device->trx_read_func = trx_eth_read_udp_IF4p5; + perror("[ETHERNET] Can't set ring parameters\n"); } + break; - eth->if_name[device->Mod_id] = eth_params->local_if_name; - device->priv = eth; + default: + break; + } + + return 0; +} - /* device specific */ - openair0_cfg[0].iq_rxrescale = 15;//rescale iqs - openair0_cfg[0].iq_txshift = eth_params->iq_txshift;// shift - openair0_cfg[0].tx_sample_advance = eth_params->tx_sample_advance; - /* RRH does not have any information to make this configuration atm */ - if (device->host_type == BBU_HOST) { - /*Note scheduling advance values valid only for case 7680000 */ - switch ((int)openair0_cfg[0].sample_rate) { - case 30720000: - openair0_cfg[0].samples_per_packet = 3840; - break; - case 23040000: - openair0_cfg[0].samples_per_packet = 2880; - break; - case 15360000: - openair0_cfg[0].samples_per_packet = 1920; - break; - case 7680000: - openair0_cfg[0].samples_per_packet = 960; - break; - case 1920000: - openair0_cfg[0].samples_per_packet = 240; - break; - default: - printf("Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); - exit(-1); - break; - } - } +int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth_params_t * eth_params ) { - device->openair0_cfg=&openair0_cfg[0]; - return 0; + eth_state_t *eth = (eth_state_t*)malloc(sizeof(eth_state_t)); + memset(eth, 0, sizeof(eth_state_t)); + + if (eth_params->transp_preference == 1) { + eth->flags = ETH_RAW_MODE; + } else if (eth_params->transp_preference == 0) { + eth->flags = ETH_UDP_MODE; + } else if (eth_params->transp_preference == 3) { + eth->flags = ETH_RAW_IF4p5_MODE; + } else if (eth_params->transp_preference == 2) { + eth->flags = ETH_UDP_IF4p5_MODE; + } else if (eth_params->transp_preference == 4) { + eth->flags = ETH_RAW_IF5_MOBIPASS; + } else { + printf("transport_init: Unknown transport preference %d - default to RAW", eth_params->transp_preference); + eth->flags = ETH_RAW_MODE; + } + + printf("[ETHERNET]: Initializing openair0_device for %s ...\n", ((device->host_type == BBU_HOST) ? "BBU": "RRH")); + device->Mod_id = 0;//num_devices_eth++; + device->transp_type = ETHERNET_TP; + device->trx_start_func = trx_eth_start; + device->trx_request_func = trx_eth_request; + device->trx_reply_func = trx_eth_reply; + device->trx_get_stats_func = trx_eth_get_stats; + device->trx_reset_stats_func = trx_eth_reset_stats; + device->trx_end_func = trx_eth_end; + device->trx_stop_func = trx_eth_stop; + device->trx_set_freq_func = trx_eth_set_freq; + device->trx_set_gains_func = trx_eth_set_gains; + + if (eth->flags == ETH_RAW_MODE) { + device->trx_write_func = trx_eth_write_raw; + device->trx_read_func = trx_eth_read_raw; + } else if (eth->flags == ETH_UDP_MODE) { + device->trx_write_func = trx_eth_write_udp; + device->trx_read_func = trx_eth_read_udp; + } else if (eth->flags == ETH_RAW_IF4p5_MODE) { + device->trx_write_func = trx_eth_write_raw_IF4p5; + device->trx_read_func = trx_eth_read_raw_IF4p5; + } else if (eth->flags == ETH_UDP_IF4p5_MODE) { + device->trx_write_func = trx_eth_write_udp_IF4p5; + device->trx_read_func = trx_eth_read_udp_IF4p5; + } else if (eth->flags == ETH_RAW_IF5_MOBIPASS) { + device->trx_write_func = trx_eth_write_raw_IF4p5; + device->trx_read_func = trx_eth_read_raw_IF5_mobipass; + } else { + //device->trx_write_func = trx_eth_write_udp_IF4p5; + //device->trx_read_func = trx_eth_read_udp_IF4p5; + } + + eth->if_name = eth_params->local_if_name; + device->priv = eth; + + /* device specific */ + openair0_cfg[0].iq_rxrescale = 15;//rescale iqs + openair0_cfg[0].iq_txshift = eth_params->iq_txshift;// shift + openair0_cfg[0].tx_sample_advance = eth_params->tx_sample_advance; + + /* RRH does not have any information to make this configuration atm */ + if (device->host_type == BBU_HOST) { + /*Note scheduling advance values valid only for case 7680000 */ + switch ((int)openair0_cfg[0].sample_rate) { + case 30720000: + openair0_cfg[0].samples_per_packet = 3840; + break; + case 23040000: + openair0_cfg[0].samples_per_packet = 2880; + break; + case 15360000: + openair0_cfg[0].samples_per_packet = 1920; + break; + case 7680000: + openair0_cfg[0].samples_per_packet = 960; + break; + case 1920000: + openair0_cfg[0].samples_per_packet = 240; + break; + default: + printf("Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); + exit(-1); + break; + } + } + device->openair0_cfg=&openair0_cfg[0]; + return 0; } diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h index c23528196858821027245a42672a0a6db3ca25df..9f555beaa9dea29bc862ed5a54953051eff09496 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h @@ -55,11 +55,23 @@ typedef struct { /*!\brief socket file desc */ - int sockfd[MAX_INST]; + int sockfd; /*!\brief interface name */ - char *if_name[MAX_INST]; + char *if_name; /*!\brief buffer size */ unsigned int buffer_size; + /*!\brief destination address for UDP socket*/ + struct sockaddr_in dest_addr; + /*!\brief local address for UDP socket*/ + struct sockaddr_in local_addr; + /*!\brief address length for both UDP and RAW socket*/ + int addr_len; + /*!\brief destination address for RAW socket*/ + struct sockaddr_ll dest_addr_ll; + /*!\brief local address for RAW socket*/ + struct sockaddr_ll local_addr_ll; + /*!\brief inteface index for RAW socket*/ + struct ifreq if_index; /*!\brief timeout ms */ unsigned int rx_timeout_ms; /*!\brief timeout ms */ @@ -218,6 +230,7 @@ int trx_eth_write_raw(openair0_device *device, openair0_timestamp timestamp, voi int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc); int trx_eth_write_raw_IF4p5(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags); int trx_eth_read_raw_IF4p5(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc); +int trx_eth_read_raw_IF5_mobipass(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc); int trx_eth_write_udp_IF4p5(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags); int trx_eth_read_udp_IF4p5(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc); int eth_get_dev_conf_raw(openair0_device *device); diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h index e96282a7113ef4c6d9ccee73cd0182b1386b3334..5fdb962b09019470b6f5840f5bbacd890df1b2ee 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h @@ -56,15 +56,19 @@ // Packet sizes for IF4p5 interface format #define DATA_BLOCK_SIZE_BYTES(scaled_nblocks) (sizeof(uint16_t)*scaled_nblocks) -#define PRACH_BLOCK_SIZE_BYTES (sizeof(int16_t)*839*2) // FIX hard coded prach size (uncompressed) +#define PRACH_HARD_CODED_NUM_SAMPLES (839*2) +#define PRACH_BLOCK_SIZE_BYTES (sizeof(int16_t)*PRACH_HARD_CODED_NUM_SAMPLES) // FIX hard coded prach size #define RAW_IF4p5_PDLFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) #define RAW_IF4p5_PULFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) +#define RAW_IF4p5_PULTICK_SIZE_BYTES (MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t) #define RAW_IF4p5_PRACH_SIZE_BYTES (MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t + PRACH_BLOCK_SIZE_BYTES) #define UDP_IF4p5_PDLFFT_SIZE_BYTES(nblocks) (sizeof_IF4p5_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) #define UDP_IF4p5_PULFFT_SIZE_BYTES(nblocks) (sizeof_IF4p5_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) +#define UDP_IF4p5_PULTICK_SIZE_BYTES (sizeof_IF4p5_header_t) #define UDP_IF4p5_PRACH_SIZE_BYTES (sizeof_IF4p5_header_t + PRACH_BLOCK_SIZE_BYTES) // Mobipass packet sizes #define RAW_IF5_MOBIPASS_BLOCK_SIZE_BYTES 1280 #define RAW_IF5_MOBIPASS_SIZE_BYTES (MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + RAW_IF5_MOBIPASS_BLOCK_SIZE_BYTES) +#define PAYLOAD_MOBIPASS_NUM_SAMPLES 640 diff --git a/targets/ARCH/LMSSDR/enb_sodera_lowband_Wrx_10MHz_rx19dB_txfull.ini b/targets/ARCH/LMSSDR/LimeSDR.ini similarity index 85% rename from targets/ARCH/LMSSDR/enb_sodera_lowband_Wrx_10MHz_rx19dB_txfull.ini rename to targets/ARCH/LMSSDR/LimeSDR.ini index a0793ad395949aa35627581aa24d9a004f56792d..778e7969cefe2ec27d17ca10bc7c41d3a3c6d2a9 100644 --- a/targets/ARCH/LMSSDR/enb_sodera_lowband_Wrx_10MHz_rx19dB_txfull.ini +++ b/targets/ARCH/LMSSDR/LimeSDR.ini @@ -1,1128 +1,1128 @@ -[reference_clocks] -sxr_ref_clk_mhz=30.72 -sxt_ref_clk_mhz=30.72 -[lms7002_registers_b] -0x03A0=0x0000 -0x054E=0x0000 -0x02D0=0x0000 -0x0386=0x0000 -0x054F=0x0000 -0x0389=0x0000 -0x040F=0x0000 -0x04E3=0x0000 -0x0385=0x0000 -0x0315=0x0000 -0x0384=0x0000 -0x0382=0x0000 -0x0288=0x0000 -0x0381=0x0000 -0x0366=0x0000 -0x0365=0x0000 -0x0364=0x0000 -0x0325=0x0000 -0x035E=0x0000 -0x035D=0x0000 -0x0442=0x0000 -0x0452=0x0000 -0x0299=0x0000 -0x0359=0x0000 -0x029D=0x0000 -0x04A3=0x0000 -0x040E=0x0000 -0x0316=0x0000 -0x030D=0x0000 -0x0356=0x0000 -0x0348=0x0000 -0x0498=0x0000 -0x0490=0x0000 -0x02CD=0x0000 -0x050D=0x0000 -0x0353=0x0000 -0x0351=0x0000 -0x048F=0x0000 -0x0445=0x0000 -0x0350=0x0000 -0x03A6=0x0000 -0x0293=0x0000 -0x034E=0x0000 -0x035C=0x0000 -0x034D=0x0000 -0x034B=0x0000 -0x011A=0x2E02 -0x0455=0x0000 -0x034A=0x0000 -0x035B=0x0000 -0x0505=0x0000 -0x0345=0x0000 -0x035F=0x0000 -0x0597=0x0000 -0x0586=0x0000 -0x0484=0x0000 -0x02C8=0x0000 -0x035A=0x0000 -0x0561=0x0000 -0x0344=0x0000 -0x0343=0x0000 -0x0342=0x0000 -0x0380=0x0000 -0x0327=0x0000 -0x025E=0x0000 -0x04DA=0x0000 -0x04C2=0x0000 -0x028C=0x0000 -0x0352=0x0000 -0x059C=0x0000 -0x04DD=0x0000 -0x028A=0x0000 -0x0289=0x0000 -0x031A=0x0000 -0x0363=0x0000 -0x0396=0x0000 -0x0284=0x0000 -0x010C=0x88FD -0x044C=0x0000 -0x0355=0x0000 -0x025C=0x0000 -0x0515=0x0000 -0x0361=0x0000 +[file_info] +type=lms7002m_minimal_config +version=1 +[lms7002_registers_a] +0x0020=0xFFFD +0x0021=0x0E9F +0x0022=0x07FF +0x0023=0x5550 +0x0024=0xB1E4 +0x0025=0x0101 +0x0026=0x0101 +0x0027=0xB1E4 +0x0028=0x0101 +0x0029=0x0101 +0x002A=0x0086 +0x002B=0x0038 +0x002C=0x0000 +0x002D=0x0000 +0x002E=0x0000 +0x002F=0x3840 +0x0081=0x0000 +0x0082=0x8001 +0x0084=0x0400 +0x0085=0x0001 +0x0086=0x4101 +0x0087=0x0000 +0x0088=0x04B0 +0x0089=0x1090 +0x008A=0x0514 +0x008B=0x2100 +0x008C=0x267B +0x0092=0x0001 +0x0093=0x0000 +0x0094=0x0000 +0x0095=0x0000 +0x0096=0x0000 +0x0097=0x0000 +0x0098=0x0000 +0x0099=0x6565 +0x009A=0x658C +0x009B=0x6565 +0x009C=0x658C +0x009D=0x6565 +0x009E=0x658C +0x009F=0x658C +0x00A0=0x6565 +0x00A1=0x6565 +0x00A2=0x6565 +0x00A3=0x6565 +0x00A4=0x6565 +0x00A5=0x6565 +0x00A6=0x0001 +0x00A7=0x6565 +0x00A8=0x0000 +0x00A9=0x0000 +0x00AA=0x0000 +0x00AB=0x0040 +0x00AC=0x0000 +0x00AD=0x03FF +0x00AE=0x0000 +0x0100=0x7409 +0x0101=0x7800 +0x0102=0x3180 +0x0103=0x0612 +0x0104=0x0088 +0x0105=0x0011 +0x0106=0x318C +0x0107=0x318C +0x0108=0x2826 +0x0109=0x6104 +0x010A=0x17BD +0x010C=0x8865 +0x010D=0x01DC +0x010E=0x120D +0x010F=0x3042 +0x0110=0x0BFF +0x0111=0x0083 +0x0112=0x9407 +0x0113=0x0302 +0x0114=0x00D0 +0x0115=0x0009 +0x0116=0x8180 +0x0117=0x1217 +0x0118=0x018C +0x0119=0x5286 +0x011A=0x3E03 +0x011C=0xAD41 +0x011D=0x2000 +0x011E=0x06E4 +0x011F=0x3640 +0x0120=0xB9FF +0x0121=0x33FC +0x0122=0x033F +0x0123=0x267B +0x0124=0x0000 +0x0200=0x0081 +0x0201=0x07FF +0x0202=0x0744 +0x0203=0x0FE9 +0x0204=0xFDDC 0x0205=0x0000 -0x025B=0x0000 -0x04C5=0x0000 -0x04E2=0x0000 -0x025A=0x0000 -0x0256=0x0000 +0x0206=0x0000 +0x0207=0x0000 +0x0208=0x0170 +0x0209=0x0000 +0x020A=0x0080 +0x020B=0x0000 +0x020C=0x8000 0x0240=0x0020 -0x0367=0x0000 -0x05A3=0x0000 -0x0502=0x0000 -0x0258=0x0000 -0x0255=0x0000 -0x040C=0x0000 -0x028B=0x0000 -0x0253=0x0000 -0x024E=0x0000 -0x0346=0x0000 -0x0280=0x0000 -0x0285=0x0000 -0x024A=0x0000 -0x0261=0x0000 -0x0249=0x0000 -0x04CD=0x0000 -0x040A=0x0000 -0x0556=0x0000 +0x0241=0x0000 +0x0242=0x0000 0x0243=0x0000 -0x051D=0x0000 -0x0494=0x0000 +0x0244=0x0000 +0x0245=0x0000 +0x0246=0x0000 +0x0247=0x0000 +0x0248=0x0000 +0x0249=0x0000 +0x024A=0x0000 +0x024B=0x0000 0x024C=0x0000 -0x02DC=0x0000 -0x038F=0x0000 -0x0241=0x0000 -0x0488=0x0000 +0x024D=0x0000 +0x024E=0x0000 +0x024F=0x0000 +0x0250=0x0000 0x0251=0x0000 -0x020B=0x4000 -0x0108=0x9442 -0x04A0=0x0000 -0x0116=0x8180 -0x02CC=0x0000 -0x039A=0x0000 -0x0112=0xC0E6 -0x0307=0x0000 -0x038C=0x0000 -0x0282=0x0000 -0x0321=0x0000 -0x0507=0x0000 -0x0483=0x0000 -0x0201=0x07FF -0x02E1=0x0000 -0x0517=0x0000 -0x0481=0x0000 -0x02D5=0x0000 +0x0252=0x0000 +0x0253=0x0000 +0x0254=0x0000 +0x0255=0x0000 +0x0256=0x0000 +0x0257=0x0000 +0x0258=0x0000 0x0259=0x0000 -0x0527=0x0000 -0x02DD=0x0000 -0x0209=0x0000 +0x025A=0x0000 +0x025B=0x0000 +0x025C=0x0000 +0x025D=0x0000 +0x025E=0x0000 +0x025F=0x0000 +0x0260=0x0000 +0x0261=0x0000 +0x0280=0x0000 +0x0281=0x0000 +0x0282=0x0000 +0x0283=0x0000 +0x0284=0x0000 +0x0285=0x0000 +0x0286=0x0000 +0x0287=0x0000 +0x0288=0x0000 +0x0289=0x0000 +0x028A=0x0000 +0x028B=0x0000 +0x028C=0x0000 +0x028D=0x0000 +0x028E=0x0000 +0x028F=0x0000 +0x0290=0x0000 +0x0291=0x0000 +0x0292=0x0000 +0x0293=0x0000 +0x0294=0x0000 +0x0295=0x0000 +0x0296=0x0000 0x0297=0x0000 -0x0400=0x0081 -0x0104=0x0088 -0x0103=0x0A12 -0x0347=0x0000 -0x02D8=0x0000 -0x0457=0x0000 -0x0306=0x0000 -0x02D1=0x0000 -0x04C8=0x0000 -0x0546=0x0000 -0x0440=0x0020 -0x045E=0x0000 -0x031D=0x0000 -0x039C=0x0000 -0x02D2=0x0000 -0x010E=0x2040 -0x02A0=0x0000 -0x0544=0x0000 +0x0298=0x0000 +0x0299=0x0000 +0x029A=0x0000 +0x029B=0x0000 0x029C=0x0000 -0x055A=0x0000 -0x0295=0x0000 -0x02CF=0x0000 -0x04D1=0x0000 -0x0291=0x0000 -0x02DF=0x0000 -0x0290=0x0000 -0x020A=0x0080 -0x0102=0x3180 -0x0120=0xB9FF -0x0388=0x0000 -0x0318=0x0000 +0x029D=0x0000 +0x029E=0x0000 +0x029F=0x0000 +0x02A0=0x0000 +0x02A1=0x0000 +0x02A2=0x0000 +0x02A3=0x0000 +0x02A4=0x0000 +0x02A5=0x0000 +0x02A6=0x0000 0x02A7=0x0000 -0x0200=0x0081 -0x0594=0x0000 +0x02C0=0x0000 +0x02C1=0x0000 +0x02C2=0x0000 +0x02C3=0x0000 +0x02C4=0x0000 0x02C5=0x0000 -0x028D=0x0000 -0x02A1=0x0000 -0x0362=0x0000 -0x038A=0x0000 -0x0395=0x0000 -0x058D=0x0000 +0x02C6=0x0000 +0x02C7=0x0000 +0x02C8=0x0000 +0x02C9=0x0000 +0x02CA=0x0000 +0x02CB=0x0000 +0x02CC=0x0000 +0x02CD=0x0000 +0x02CE=0x0000 +0x02CF=0x0000 +0x02D0=0x0000 +0x02D1=0x0000 +0x02D2=0x0000 +0x02D3=0x0000 +0x02D4=0x0000 +0x02D5=0x0000 +0x02D6=0x0000 0x02D7=0x0000 -0x0305=0x0000 -0x0393=0x0000 -0x0398=0x0000 -0x0408=0x0000 -0x039B=0x0000 -0x049E=0x0000 +0x02D8=0x0000 +0x02D9=0x0000 +0x02DA=0x0000 0x02DB=0x0000 -0x0357=0x0000 -0x02C2=0x0000 -0x0514=0x0000 -0x051C=0x0000 -0x03A2=0x0000 -0x03A4=0x0000 -0x03A3=0x0000 -0x0493=0x0000 -0x0454=0x0000 -0x0448=0x0000 -0x0397=0x0000 +0x02DC=0x0000 +0x02DD=0x0000 +0x02DE=0x0000 +0x02DF=0x0000 +0x02E0=0x0000 +0x02E1=0x0000 +0x02E2=0x0000 0x02E3=0x0000 -0x049C=0x0000 -0x040D=0x0000 -0x0281=0x0000 -0x048C=0x0000 -0x049A=0x0000 -0x0119=0x18CB -0x010F=0x3042 -0x02A6=0x0000 -0x0257=0x0000 -0x04D6=0x0000 -0x04A6=0x0000 -0x0324=0x0000 -0x038E=0x0000 +0x02E4=0x0000 +0x02E5=0x0000 +0x02E6=0x0000 0x02E7=0x0000 -0x034F=0x0000 -0x04E0=0x0000 -0x0123=0x267B -0x0497=0x0000 -0x0459=0x0000 -0x0394=0x0000 -0x04A5=0x0000 -0x04D9=0x0000 -0x0304=0x0000 -0x04D5=0x0000 -0x0508=0x0000 -0x0443=0x0000 +0x0300=0x0000 0x0301=0x0000 -0x0548=0x0000 -0x04D2=0x0000 -0x0592=0x0000 -0x0591=0x0000 -0x04C7=0x0000 -0x049D=0x0000 -0x029A=0x0000 -0x051F=0x0000 +0x0302=0x0000 +0x0303=0x0000 +0x0304=0x0000 +0x0305=0x0000 +0x0306=0x0000 +0x0307=0x0000 +0x0308=0x0000 0x0309=0x0000 -0x0585=0x0000 -0x03A5=0x0000 -0x02D3=0x0000 -0x0451=0x0000 -0x0390=0x0000 -0x0562=0x0000 -0x02C4=0x0000 -0x029E=0x0000 +0x030A=0x0000 +0x030B=0x0000 +0x030C=0x0000 +0x030D=0x0000 +0x030E=0x0000 +0x030F=0x0000 +0x0310=0x0000 +0x0311=0x0000 +0x0312=0x0000 +0x0313=0x0000 +0x0314=0x0000 +0x0315=0x0000 +0x0316=0x0000 +0x0317=0x0000 +0x0318=0x0000 +0x0319=0x0000 +0x031A=0x0000 +0x031B=0x0000 +0x031C=0x0000 +0x031D=0x0000 0x031E=0x0000 -0x04C0=0x0000 -0x04DC=0x0000 -0x04DE=0x0000 -0x058B=0x0000 -0x04DB=0x0000 -0x04D0=0x0000 -0x0492=0x0000 -0x04A1=0x0000 -0x054B=0x0000 -0x02C7=0x0000 -0x05A0=0x0000 -0x044B=0x0000 -0x0100=0x3409 -0x04CA=0x0000 -0x0446=0x0000 -0x02E4=0x0000 -0x04E4=0x0000 -0x04C3=0x0000 -0x0496=0x0000 -0x04CF=0x0000 -0x025F=0x0000 -0x04D4=0x0000 -0x0504=0x0000 -0x04CE=0x0000 -0x02DE=0x0000 -0x0399=0x0000 -0x050C=0x0000 -0x02A5=0x0000 -0x04CC=0x0000 -0x03A1=0x0000 -0x04E1=0x0000 -0x02A2=0x0000 -0x040B=0x7FFF -0x0283=0x0000 -0x048E=0x0000 -0x0580=0x0000 -0x0409=0x0000 -0x039F=0x0000 -0x0248=0x0000 -0x048B=0x0000 +0x031F=0x0000 +0x0320=0x0000 +0x0321=0x0000 +0x0322=0x0000 +0x0323=0x0000 +0x0324=0x0000 +0x0325=0x0000 +0x0326=0x0000 +0x0327=0x0000 +0x0340=0x0000 +0x0341=0x0000 +0x0342=0x0000 +0x0343=0x0000 +0x0344=0x0000 +0x0345=0x0000 +0x0346=0x0000 +0x0347=0x0000 +0x0348=0x0000 +0x0349=0x0000 +0x034A=0x0000 +0x034B=0x0000 +0x034C=0x0000 +0x034D=0x0000 +0x034E=0x0000 +0x034F=0x0000 +0x0350=0x0000 +0x0351=0x0000 +0x0352=0x0000 +0x0353=0x0000 +0x0354=0x0000 +0x0355=0x0000 +0x0356=0x0000 +0x0357=0x0000 0x0358=0x0000 -0x0589=0x0000 +0x0359=0x0000 +0x035A=0x0000 +0x035B=0x0000 +0x035C=0x0000 +0x035D=0x0000 +0x035E=0x0000 +0x035F=0x0000 +0x0360=0x0000 +0x0361=0x0000 +0x0362=0x0000 +0x0363=0x0000 +0x0364=0x0000 +0x0365=0x0000 +0x0366=0x0000 +0x0367=0x0000 +0x0380=0x0000 +0x0381=0x0000 +0x0382=0x0000 +0x0383=0x0000 +0x0384=0x0000 +0x0385=0x0000 +0x0386=0x0000 +0x0387=0x0000 +0x0388=0x0000 +0x0389=0x0000 +0x038A=0x0000 +0x038B=0x0000 +0x038C=0x0000 0x038D=0x0000 -0x0487=0x0000 -0x0510=0x0000 -0x0302=0x0000 -0x0486=0x0000 -0x045F=0x0000 -0x0480=0x0000 -0x0567=0x0000 -0x02DA=0x0000 -0x045A=0x0000 -0x0254=0x0000 +0x038E=0x0000 +0x038F=0x0000 +0x0390=0x0000 +0x0391=0x0000 +0x0392=0x0000 +0x0393=0x0000 +0x0394=0x0000 +0x0395=0x0000 +0x0396=0x0000 +0x0397=0x0000 +0x0398=0x0000 +0x0399=0x0000 +0x039A=0x0000 +0x039B=0x0000 +0x039C=0x0000 +0x039D=0x0000 +0x039E=0x0000 +0x039F=0x0000 +0x03A0=0x0000 +0x03A1=0x0000 +0x03A2=0x0000 +0x03A3=0x0000 +0x03A4=0x0000 +0x03A5=0x0000 +0x03A6=0x0000 +0x03A7=0x0000 +0x0400=0x8081 +0x0401=0x07FF +0x0402=0x07D9 +0x0403=0x0FF9 +0x0404=0x0000 0x0405=0x0000 -0x0387=0x0000 -0x0458=0x0000 -0x0314=0x0000 -0x0360=0x0000 -0x0559=0x0000 -0x0456=0x0000 -0x0453=0x0000 -0x02E2=0x0000 -0x044D=0x0000 +0x0406=0x0000 +0x0407=0x0000 +0x0408=0x0000 +0x0409=0x0000 +0x040A=0x0003 +0x040B=0x000F +0x040C=0x00F8 +0x040D=0x0000 +0x040E=0x0000 +0x040F=0x0000 +0x0440=0x0020 0x0441=0x0000 -0x02C3=0x0000 -0x04C1=0x0000 -0x04D3=0x0000 +0x0442=0x2B55 +0x0443=0x5540 0x0444=0x0000 -0x0207=0x0000 -0x04C6=0x0000 -0x0296=0x0000 -0x0555=0x0000 -0x0349=0x0000 -0x0109=0x61C1 -0x04A2=0x0000 +0x0445=0x0000 +0x0446=0x0000 0x0447=0x0000 +0x0448=0x0000 +0x0449=0x0000 +0x044A=0x0000 +0x044B=0x0000 +0x044C=0x0000 +0x044D=0x0000 +0x044E=0x0000 +0x044F=0x0000 +0x0450=0x0000 +0x0451=0x0000 +0x0452=0x0000 +0x0453=0x0000 +0x0454=0x0000 +0x0455=0x0000 +0x0456=0x0000 +0x0457=0x0000 +0x0458=0x0000 +0x0459=0x0000 +0x045A=0x0000 +0x045B=0x0000 +0x045C=0x0000 +0x045D=0x0000 +0x045E=0x0000 +0x045F=0x0000 0x0460=0x0000 +0x0461=0x0000 +0x0480=0x0000 +0x0481=0x0000 +0x0482=0x0000 +0x0483=0x0000 +0x0484=0x0000 +0x0485=0x0000 +0x0486=0x0000 +0x0487=0x0000 +0x0488=0x0000 +0x0489=0x0000 +0x048A=0x0000 +0x048B=0x0000 +0x048C=0x0000 0x048D=0x0000 -0x059A=0x0000 -0x0407=0x0000 -0x02C0=0x0000 +0x048E=0x0000 +0x048F=0x0000 +0x0490=0x0000 +0x0491=0x0000 +0x0492=0x0000 +0x0493=0x0000 +0x0494=0x0000 +0x0495=0x0000 +0x0496=0x0000 +0x0497=0x0000 +0x0498=0x0000 0x0499=0x0000 -0x0543=0x0000 +0x049A=0x0000 +0x049B=0x0000 +0x049C=0x0000 +0x049D=0x0000 +0x049E=0x0000 +0x049F=0x0000 +0x04A0=0x0000 +0x04A1=0x0000 +0x04A2=0x0000 +0x04A3=0x0000 +0x04A4=0x0000 +0x04A5=0x0000 +0x04A6=0x0000 +0x04A7=0x0000 +0x04C0=0x0000 +0x04C1=0x0000 +0x04C2=0x0000 +0x04C3=0x0000 +0x04C4=0x0000 +0x04C5=0x0000 +0x04C6=0x0000 +0x04C7=0x0000 +0x04C8=0x0000 0x04C9=0x0000 -0x02CA=0x0000 -0x0404=0x0000 -0x0560=0x0000 -0x02C1=0x0000 +0x04CA=0x0000 +0x04CB=0x0000 +0x04CC=0x0000 +0x04CD=0x0000 +0x04CE=0x0000 +0x04CF=0x0000 +0x04D0=0x0000 +0x04D1=0x0000 +0x04D2=0x0000 +0x04D3=0x0000 +0x04D4=0x0000 +0x04D5=0x0000 +0x04D6=0x0000 +0x04D7=0x0000 0x04D8=0x0000 -0x0403=0x0000 -0x0491=0x0000 -0x029B=0x0000 -0x04C4=0x0000 -0x010D=0x009E -0x0402=0x07FF -0x055E=0x0000 -0x03A7=0x0000 -0x0520=0x0000 -0x0392=0x0000 -0x030B=0x0000 -0x0588=0x0000 -0x0308=0x0000 -0x048A=0x0000 -0x044A=0x0000 -0x04A4=0x0000 -0x0300=0x0000 -0x0587=0x0000 -0x044E=0x0000 -0x055B=0x0000 -0x02E5=0x0000 -0x0114=0x008D -0x0323=0x0000 -0x0320=0x0000 +0x04D9=0x0000 +0x04DA=0x0000 +0x04DB=0x0000 +0x04DC=0x0000 +0x04DD=0x0000 +0x04DE=0x0000 +0x04DF=0x0000 +0x04E0=0x0000 +0x04E1=0x0000 +0x04E2=0x0000 +0x04E3=0x0000 +0x04E4=0x0000 +0x04E5=0x0000 +0x04E6=0x0000 +0x04E7=0x0000 +0x0500=0x0000 +0x0501=0x0000 +0x0502=0x0000 0x0503=0x0000 -0x0513=0x0000 -0x0319=0x0000 -0x0260=0x0000 -0x0549=0x0000 -0x0552=0x0000 +0x0504=0x0000 +0x0505=0x0000 +0x0506=0x0000 +0x0507=0x0000 +0x0508=0x0000 0x0509=0x0000 +0x050A=0x0000 +0x050B=0x0000 +0x050C=0x0000 +0x050D=0x0000 +0x050E=0x0000 +0x050F=0x0000 +0x0510=0x0000 +0x0511=0x0000 +0x0512=0x0000 +0x0513=0x0000 +0x0514=0x0000 +0x0515=0x0000 +0x0516=0x0000 +0x0517=0x0000 +0x0518=0x0000 +0x0519=0x0000 +0x051A=0x0000 +0x051B=0x0000 +0x051C=0x0000 +0x051D=0x0000 +0x051E=0x0000 +0x051F=0x0000 +0x0520=0x0000 0x0521=0x0000 -0x0286=0x0000 -0x04D7=0x0000 -0x059E=0x0000 -0x058F=0x0000 -0x0557=0x0000 -0x0322=0x0000 -0x059B=0x0000 -0x049F=0x0000 0x0522=0x0000 +0x0523=0x0000 +0x0524=0x0000 +0x0525=0x0000 +0x0526=0x0000 +0x0527=0x0000 +0x0540=0x0000 +0x0541=0x0000 +0x0542=0x0000 +0x0543=0x0000 +0x0544=0x0000 0x0545=0x0000 +0x0546=0x0000 +0x0547=0x0000 +0x0548=0x0000 +0x0549=0x0000 +0x054A=0x0000 +0x054B=0x0000 +0x054C=0x0000 +0x054D=0x0000 +0x054E=0x0000 +0x054F=0x0000 +0x0550=0x0000 0x0551=0x0000 -0x0312=0x0000 +0x0552=0x0000 +0x0553=0x0000 +0x0554=0x0000 +0x0555=0x0000 +0x0556=0x0000 +0x0557=0x0000 +0x0558=0x0000 +0x0559=0x0000 +0x055A=0x0000 +0x055B=0x0000 +0x055C=0x0000 0x055D=0x0000 -0x0298=0x0000 -0x055F=0x0000 -0x011D=0x9555 -0x039E=0x0000 -0x0547=0x0000 -0x0598=0x0000 -0x0449=0x0000 +0x055E=0x0000 +0x055F=0x0000 +0x0560=0x0000 +0x0561=0x0000 +0x0562=0x0000 +0x0563=0x0000 0x0564=0x0000 -0x0242=0x0000 -0x0525=0x0000 -0x0523=0x0000 0x0565=0x0000 -0x0124=0x0000 -0x0563=0x0000 -0x024D=0x0000 -0x05A5=0x0000 0x0566=0x0000 -0x030A=0x0000 -0x029F=0x0000 -0x054C=0x0000 +0x0567=0x0000 +0x0580=0x0000 +0x0581=0x0000 0x0582=0x0000 -0x0599=0x0000 -0x0511=0x0000 -0x0506=0x0000 -0x0595=0x0000 +0x0583=0x0000 0x0584=0x0000 +0x0585=0x0000 +0x0586=0x0000 +0x0587=0x0000 +0x0588=0x0000 +0x0589=0x0000 +0x058A=0x0000 +0x058B=0x0000 0x058C=0x0000 -0x05A6=0x0000 -0x051E=0x0000 -0x050F=0x0000 +0x058D=0x0000 +0x058E=0x0000 +0x058F=0x0000 0x0590=0x0000 +0x0591=0x0000 +0x0592=0x0000 +0x0593=0x0000 +0x0594=0x0000 +0x0595=0x0000 0x0596=0x0000 -0x05A7=0x0000 -0x058A=0x0000 +0x0597=0x0000 +0x0598=0x0000 +0x0599=0x0000 +0x059A=0x0000 +0x059B=0x0000 +0x059C=0x0000 0x059D=0x0000 -0x0485=0x0000 -0x0581=0x0000 -0x045D=0x0000 -0x0245=0x0000 -0x0310=0x0000 -0x058E=0x0000 -0x05A2=0x0000 -0x054D=0x0000 -0x020C=0x7FFF -0x031F=0x0000 -0x0292=0x0000 +0x059E=0x0000 0x059F=0x0000 -0x0583=0x0000 -0x0317=0x0000 -0x0244=0x0000 -0x0554=0x0000 -0x0593=0x0000 +0x05A0=0x0000 +0x05A1=0x0000 +0x05A2=0x0000 +0x05A3=0x0000 0x05A4=0x0000 -0x02A3=0x0000 -0x0553=0x0000 -0x0542=0x0000 -0x0519=0x0000 -0x024F=0x0000 -0x0524=0x0000 -0x0518=0x0000 -0x0354=0x0000 -0x0526=0x0000 -0x031B=0x0000 -0x050E=0x0000 -0x0516=0x0000 -0x02CB=0x0000 -0x0250=0x0000 -0x031C=0x0000 -0x028F=0x0000 -0x051A=0x0000 -0x055C=0x0000 -0x050A=0x0000 -0x050B=0x0000 -0x04E7=0x0000 -0x04E6=0x0000 -0x04E5=0x0000 -0x0512=0x0000 -0x0206=0x0000 -0x0550=0x0000 -0x030E=0x0000 -0x0203=0x0000 -0x0482=0x0000 -0x0541=0x0000 -0x0122=0x033F -0x0110=0x0BF4 -0x0204=0x0000 -0x0252=0x0000 -0x011E=0x05DC -0x049B=0x0000 -0x0294=0x0000 -0x011C=0xAD41 -0x02D6=0x0000 -0x0311=0x0000 -0x0117=0x280C -0x02A4=0x0000 -0x0540=0x0000 -0x02E0=0x0000 -0x0118=0x018C -0x0489=0x0000 -0x04A7=0x0000 +0x05A5=0x0000 +0x05A6=0x0000 +0x05A7=0x0000 +[lms7002_registers_b] +0x0100=0x3409 0x0101=0x7800 -0x0558=0x0000 -0x02C6=0x0000 -0x05A1=0x0000 -0x02C9=0x0000 -0x039D=0x0000 -0x0500=0x0000 -0x0450=0x0000 -0x011F=0x3680 -0x030C=0x0000 -0x04DF=0x0000 -0x0106=0x3182 -0x028E=0x0000 -0x0326=0x0000 -0x0113=0x03C3 -0x04CB=0x0000 -0x0391=0x0000 +0x0102=0x3180 +0x0103=0x0612 +0x0104=0x0088 0x0105=0x0007 -0x02D9=0x0000 -0x02CE=0x0000 -0x044F=0x0000 -0x038B=0x0000 -0x02D4=0x0000 +0x0106=0x3182 0x0107=0x318C -0x0495=0x0000 -0x0246=0x0000 -0x0303=0x0000 -0x02E6=0x0000 -0x045B=0x0000 -0x0340=0x0000 -0x0208=0x0070 -0x0111=0x0083 -0x0247=0x0000 -0x024B=0x0000 -0x045C=0x0000 -0x0383=0x0000 -0x0202=0x07FF -0x054A=0x0000 -0x0401=0x07FF -0x0341=0x0000 -0x0287=0x0000 -0x034C=0x0000 -0x0501=0x0000 -0x030F=0x0000 -0x025D=0x0000 -0x0406=0x0000 -0x0313=0x0000 +0x0108=0x9442 +0x0109=0x61C1 0x010A=0x104C -0x0461=0x0000 -0x051B=0x0000 -0x0121=0x356A +0x010C=0x88FD +0x010D=0x019C +0x010E=0x2040 +0x010F=0x3042 +0x0110=0x0BF4 +0x0111=0x0083 +0x0112=0x9407 +0x0113=0x03C3 +0x0114=0x00D0 0x0115=0x0009 -[lms7002_registers_a] -0x0107=0x318C -0x02D4=0x0000 -0x0082=0x8001 -0x0209=0x0000 -0x02CA=0x0000 -0x04C9=0x0000 +0x0116=0x8180 +0x0117=0x1217 +0x0118=0x018C +0x0119=0x5280 +0x011A=0x3E03 +0x011C=0xAD41 +0x011D=0x1555 +0x011E=0x0747 +0x011F=0x3640 0x0120=0xB9FF -0x0388=0x0000 -0x029D=0x0000 -0x04A3=0x0000 -0x0208=0x0170 -0x0340=0x0000 -0x0094=0x0000 -0x0244=0x0000 -0x0317=0x0000 -0x00A9=0x8000 -0x0115=0x0009 -0x039A=0x0000 -0x0112=0x3171 -0x048C=0x0000 -0x0023=0x5550 -0x0587=0x1D10 -0x04C0=0x0000 -0x031E=0x0000 +0x0121=0x360C +0x0122=0x033F +0x0123=0x267B +0x0124=0x0000 +0x0200=0x0101 +0x0201=0x05BD +0x0202=0x0779 +0x0203=0x0F9E +0x0204=0xBCC2 0x0205=0x0000 -0x0361=0x0000 -0x051F=0xAB08 -0x029A=0x0000 -0x0396=0x0000 -0x0284=0x0000 -0x02CE=0x0000 -0x02D9=0x0000 -0x038B=0x0000 -0x044F=0x0000 -0x0367=0x0000 -0x0240=0x0028 -0x05A3=0x0000 -0x0105=0x0007 -0x009B=0x6565 -0x0400=0x0101 -0x02DB=0x0000 -0x0357=0x0000 -0x0104=0x0088 -0x0103=0x0A12 -0x0457=0x0000 -0x0347=0x0000 -0x02D8=0x0000 -0x010C=0x8865 -0x0086=0x4101 -0x0202=0x0794 -0x0383=0x0000 -0x020B=0x4000 -0x0108=0xFC26 -0x0098=0x0000 -0x0117=0x100C -0x0027=0x05E4 -0x00A7=0x6565 +0x0206=0x0000 +0x0207=0x0000 +0x0208=0x0070 +0x0209=0x0000 +0x020A=0x0080 +0x020B=0x0000 +0x020C=0x7FFF +0x0240=0x0020 +0x0241=0x0000 +0x0242=0x0000 +0x0243=0x0000 +0x0244=0x0000 +0x0245=0x0000 +0x0246=0x0000 +0x0247=0x0000 +0x0248=0x0000 +0x0249=0x0000 0x024A=0x0000 -0x0029=0x0101 -0x00AD=0x03FF -0x0540=0x5009 -0x02A4=0x0000 -0x02DE=0x0000 -0x002E=0x0000 -0x0261=0x0000 -0x00AB=0x0040 -0x0564=0x0000 -0x00A8=0x0000 -0x0517=0xC89D -0x0481=0x0000 -0x02C1=0x0000 -0x0301=0x0000 -0x00A5=0x6565 -0x0515=0x2E45 +0x024B=0x0000 +0x024C=0x0000 +0x024D=0x0000 +0x024E=0x0000 +0x024F=0x0000 +0x0250=0x0000 +0x0251=0x0000 +0x0252=0x0000 +0x0253=0x0000 +0x0254=0x0000 +0x0255=0x0000 +0x0256=0x0000 +0x0257=0x0000 +0x0258=0x0000 +0x0259=0x0000 +0x025A=0x0000 +0x025B=0x0000 0x025C=0x0000 -0x009F=0x658C -0x0519=0x4049 -0x054B=0xF7A3 -0x02C7=0x0000 -0x038C=0x0000 -0x0307=0x0000 +0x025D=0x0000 +0x025E=0x0000 +0x025F=0x0000 +0x0260=0x0000 +0x0261=0x0000 +0x0280=0x0000 +0x0281=0x0000 0x0282=0x0000 +0x0283=0x0000 +0x0284=0x0000 +0x0285=0x0000 +0x0286=0x0000 +0x0287=0x0000 +0x0288=0x0000 0x0289=0x0000 -0x011C=0xAD41 -0x0562=0xF524 -0x0025=0x0101 -0x02CC=0x0000 -0x0116=0x8180 -0x0597=0xFDFB -0x035F=0x0000 -0x002F=0x3840 -0x0589=0xEA5F -0x00A2=0x6565 -0x0099=0x6565 -0x0310=0x0000 -0x040C=0x40F8 +0x028A=0x0000 0x028B=0x0000 -0x0253=0x0000 -0x00AC=0x2000 -0x002D=0xFFFF -0x00A6=0x0001 -0x054D=0xF7A3 -0x002C=0x0000 -0x0249=0x0000 -0x04CD=0x0000 -0x0401=0x07FF -0x00A4=0x6565 -0x054A=0x8184 -0x038F=0x0000 -0x008C=0x267B -0x0241=0x0000 -0x0356=0x0000 -0x00A1=0x6565 -0x0260=0x0000 -0x0453=0x0000 -0x008A=0x0491 -0x048F=0x0000 -0x0445=0x0000 -0x0350=0x0000 -0x00AA=0x0000 -0x034C=0x0000 -0x0501=0xFDFB -0x0490=0x0000 -0x02CD=0x0000 -0x050D=0x0F45 -0x0353=0x0000 -0x0024=0x50D8 -0x04E5=0x0000 -0x0512=0x196B -0x0247=0x0000 -0x045C=0x0000 -0x024B=0x0000 -0x0395=0x0000 -0x011F=0x3680 -0x039D=0x0000 -0x0500=0xF61D -0x02C9=0x0000 -0x05A1=0x0000 -0x02A6=0x0000 -0x0119=0x18DF -0x010F=0x3042 -0x04CB=0x0000 -0x0391=0x0000 -0x0113=0x03C3 -0x0326=0x0000 +0x028C=0x0000 +0x028D=0x0000 0x028E=0x0000 -0x0106=0x3182 -0x0524=0x3347 -0x009D=0x6565 +0x028F=0x0000 +0x0290=0x0000 +0x0291=0x0000 +0x0292=0x0000 +0x0293=0x0000 0x0294=0x0000 -0x0026=0x0101 -0x0110=0x0BFF -0x0122=0x033F -0x0381=0x0000 -0x009C=0x658C -0x05A0=0x0000 -0x0482=0x0000 -0x030E=0x0000 -0x0203=0x2F99 -0x0095=0x0000 -0x0111=0x0099 -0x0256=0x0000 -0x0089=0x0048 -0x0085=0x0001 -0x0088=0x04F0 -0x0459=0x0000 -0x0394=0x0000 -0x010E=0x0285 +0x0295=0x0000 +0x0296=0x0000 +0x0297=0x0000 +0x0298=0x0000 +0x0299=0x0000 +0x029A=0x0000 +0x029B=0x0000 +0x029C=0x0000 +0x029D=0x0000 +0x029E=0x0000 +0x029F=0x0000 0x02A0=0x0000 -0x002B=0x4032 -0x039C=0x0000 +0x02A1=0x0000 +0x02A2=0x0000 +0x02A3=0x0000 +0x02A4=0x0000 +0x02A5=0x0000 +0x02A6=0x0000 +0x02A7=0x0000 +0x02C0=0x0000 +0x02C1=0x0000 +0x02C2=0x0000 +0x02C3=0x0000 +0x02C4=0x0000 +0x02C5=0x0000 +0x02C6=0x0000 +0x02C7=0x0000 +0x02C8=0x0000 +0x02C9=0x0000 +0x02CA=0x0000 +0x02CB=0x0000 +0x02CC=0x0000 +0x02CD=0x0000 +0x02CE=0x0000 +0x02CF=0x0000 +0x02D0=0x0000 +0x02D1=0x0000 0x02D2=0x0000 -0x0581=0xC89D -0x045D=0x0000 -0x0245=0x0000 -0x002A=0x0086 -0x0118=0x018C +0x02D3=0x0000 +0x02D4=0x0000 +0x02D5=0x0000 +0x02D6=0x0000 +0x02D7=0x0000 +0x02D8=0x0000 +0x02D9=0x0000 +0x02DA=0x0000 +0x02DB=0x0000 +0x02DC=0x0000 +0x02DD=0x0000 +0x02DE=0x0000 +0x02DF=0x0000 0x02E0=0x0000 -0x0489=0x0000 -0x04A7=0x0000 -0x039E=0x0000 -0x011D=0x2AAA 0x02E1=0x0000 -0x0259=0x0000 -0x02D5=0x0000 -0x051D=0x4F91 -0x0243=0x0000 -0x0556=0xA2B5 -0x040A=0x1000 -0x05A2=0x0000 -0x020C=0x8000 -0x020A=0x0080 -0x0102=0x3180 -0x034F=0x0000 +0x02E2=0x0000 +0x02E3=0x0000 +0x02E4=0x0000 +0x02E5=0x0000 +0x02E6=0x0000 +0x02E7=0x0000 +0x0300=0x0000 +0x0301=0x0000 +0x0302=0x0000 0x0303=0x0000 +0x0304=0x0000 +0x0305=0x0000 0x0306=0x0000 -0x0255=0x0000 -0x0300=0x0000 -0x044E=0x0000 +0x0307=0x0000 +0x0308=0x0000 0x0309=0x0000 -0x0585=0xDAA2 -0x0527=0xACB9 -0x044A=0x0000 -0x04A4=0x0000 -0x048A=0x0000 -0x0392=0x0000 +0x030A=0x0000 0x030B=0x0000 -0x05A7=0x0000 -0x0252=0x0000 -0x0204=0xC016 -0x0308=0x0000 -0x0588=0xE6C7 -0x0321=0x0000 -0x0507=0xFCFE -0x0312=0x0000 -0x050B=0xF5EF -0x0360=0x0000 -0x0021=0x0E9F -0x04C2=0x0000 +0x030C=0x0000 0x030D=0x0000 -0x040E=0x0003 +0x030E=0x0000 +0x030F=0x0000 +0x0310=0x0000 +0x0311=0x0000 +0x0312=0x0000 +0x0313=0x0000 +0x0314=0x0000 +0x0315=0x0000 0x0316=0x0000 -0x031F=0x0000 -0x030C=0x0000 -0x04DF=0x0000 +0x0317=0x0000 0x0318=0x0000 -0x0250=0x0000 -0x02CB=0x0000 -0x045E=0x0000 -0x0440=0x0024 -0x031D=0x0000 -0x058D=0xF5EF -0x02D7=0x0000 -0x0380=0x0000 -0x0342=0x0000 -0x0343=0x0000 -0x0566=0x0906 -0x0345=0x0000 -0x049C=0x0000 -0x02E3=0x0000 -0x0397=0x0000 -0x035B=0x0000 -0x0505=0x00D8 -0x028D=0x0000 -0x02A1=0x0000 -0x028F=0x0000 -0x031C=0x0000 +0x0319=0x0000 0x031A=0x0000 -0x0363=0x0000 -0x0596=0x0A94 -0x0354=0x0000 -0x0518=0xEFF2 -0x035C=0x0000 -0x034D=0x0000 -0x0344=0x0000 -0x0561=0xAB08 -0x0096=0x0000 -0x010D=0x01DC -0x04C4=0x0000 -0x0351=0x0000 -0x0311=0x0000 -0x02D6=0x0000 -0x02D1=0x0000 -0x0546=0x8D44 -0x04C8=0x0000 -0x048B=0x0000 -0x0358=0x0000 -0x0522=0xDB10 -0x049F=0x0000 -0x034A=0x0000 -0x0455=0x0000 -0x0359=0x0000 -0x03A4=0x0000 -0x03A3=0x0000 +0x031B=0x0000 +0x031C=0x0000 +0x031D=0x0000 +0x031E=0x0000 +0x031F=0x0000 +0x0320=0x0000 +0x0321=0x0000 +0x0322=0x0000 +0x0323=0x0000 +0x0324=0x0000 +0x0325=0x0000 +0x0326=0x0000 +0x0327=0x0000 +0x0340=0x0000 0x0341=0x0000 -0x0287=0x0000 -0x04DA=0x0000 -0x025E=0x0000 -0x0580=0xEFF2 -0x0409=0x0000 -0x059A=0x0000 -0x048D=0x0000 -0x0514=0xE7E2 -0x039B=0x0000 -0x0101=0x7800 -0x0558=0x5009 -0x02C6=0x0000 -0x051B=0xB77F -0x0313=0x0000 -0x010A=0x104C -0x0461=0x0000 -0x0406=0x0000 -0x030F=0x0000 -0x025D=0x0000 +0x0342=0x0000 +0x0343=0x0000 +0x0344=0x0000 +0x0345=0x0000 +0x0346=0x0000 +0x0347=0x0000 +0x0348=0x0000 +0x0349=0x0000 +0x034A=0x0000 0x034B=0x0000 -0x011A=0x2E14 -0x029F=0x0000 -0x030A=0x0000 +0x034C=0x0000 +0x034D=0x0000 0x034E=0x0000 -0x0293=0x0000 -0x03A6=0x0000 -0x0560=0x174B -0x0404=0x0000 -0x00A0=0x6565 -0x0547=0xD7B7 -0x0454=0x0000 -0x0448=0x0000 -0x0327=0x0000 -0x0305=0x0000 -0x0393=0x0000 -0x0510=0xE6C7 -0x0302=0x0000 -0x0486=0x0000 -0x045F=0x0000 +0x034F=0x0000 +0x0350=0x0000 +0x0351=0x0000 +0x0352=0x0000 +0x0353=0x0000 +0x0354=0x0000 +0x0355=0x0000 +0x0356=0x0000 +0x0357=0x0000 +0x0358=0x0000 +0x0359=0x0000 +0x035A=0x0000 +0x035B=0x0000 +0x035C=0x0000 +0x035D=0x0000 +0x035E=0x0000 +0x035F=0x0000 +0x0360=0x0000 +0x0361=0x0000 +0x0362=0x0000 +0x0363=0x0000 +0x0364=0x0000 0x0365=0x0000 -0x048E=0x0000 -0x0022=0x07FF -0x0283=0x0000 -0x044B=0x0000 -0x045A=0x0000 -0x02DA=0x0000 -0x04E4=0x0000 -0x02E4=0x0000 -0x03A5=0x0000 -0x040B=0x000F 0x0366=0x0000 -0x0443=0x0000 -0x0508=0xEF99 -0x00A3=0x6565 -0x02E2=0x0000 -0x044D=0x0000 -0x0314=0x0000 -0x0458=0x0000 -0x0493=0x0000 -0x0346=0x0000 -0x024E=0x0000 -0x055E=0xDB10 -0x0402=0x07D9 +0x0367=0x0000 +0x0380=0x0000 +0x0381=0x0000 +0x0382=0x0000 +0x0383=0x0000 0x0384=0x0000 -0x02E6=0x0000 -0x045B=0x0000 -0x0480=0x0000 -0x0567=0x4049 -0x04CA=0x0000 -0x0446=0x0000 -0x0447=0x0000 -0x0460=0x0000 -0x0559=0xACB9 -0x0456=0x0000 -0x0441=0x0000 -0x0444=0x0000 -0x0390=0x0000 -0x0451=0x0000 -0x049E=0x0000 -0x0324=0x0000 -0x02E7=0x0000 +0x0385=0x0000 +0x0386=0x0000 +0x0387=0x0000 +0x0388=0x0000 +0x0389=0x0000 +0x038A=0x0000 +0x038B=0x0000 +0x038C=0x0000 +0x038D=0x0000 0x038E=0x0000 -0x0403=0x0013 -0x04D8=0x0000 -0x029B=0x0000 -0x0491=0x0000 +0x038F=0x0000 +0x0390=0x0000 +0x0391=0x0000 +0x0392=0x0000 +0x0393=0x0000 +0x0394=0x0000 +0x0395=0x0000 +0x0396=0x0000 +0x0397=0x0000 +0x0398=0x0000 +0x0399=0x0000 +0x039A=0x0000 +0x039B=0x0000 +0x039C=0x0000 +0x039D=0x0000 +0x039E=0x0000 +0x039F=0x0000 +0x03A0=0x0000 0x03A1=0x0000 -0x04E1=0x0000 -0x02A2=0x0000 -0x051C=0x0000 0x03A2=0x0000 -0x0407=0x0000 -0x0258=0x0000 -0x0502=0x0A94 -0x038A=0x0000 -0x0362=0x0000 -0x028C=0x0000 -0x0352=0x0000 -0x0385=0x0000 -0x0315=0x0000 -0x040D=0x0000 -0x039F=0x0000 -0x0248=0x0000 +0x03A3=0x0000 +0x03A4=0x0000 +0x03A5=0x0000 +0x03A6=0x0000 +0x03A7=0x0000 +0x0400=0x0105 +0x0401=0x07FF +0x0402=0x079B +0x0403=0x0FF5 +0x0404=0x0000 0x0405=0x0000 -0x0254=0x0000 -0x0398=0x0000 +0x0406=0x0000 +0x0407=0x0000 0x0408=0x0000 -0x0487=0x0000 -0x038D=0x0000 -0x035E=0x0000 -0x03A7=0x0000 -0x0520=0x174B +0x0409=0x0000 +0x040A=0x0000 +0x040B=0x7FFF +0x040C=0x00FC +0x040D=0x0000 +0x040E=0x0002 +0x040F=0x0000 +0x0440=0x0020 +0x0441=0x0000 +0x0442=0x0000 +0x0443=0x0000 +0x0444=0x0000 +0x0445=0x0000 +0x0446=0x0000 +0x0447=0x0000 +0x0448=0x0000 0x0449=0x0000 -0x02C8=0x0000 -0x035A=0x0000 -0x0387=0x0000 -0x0386=0x0000 +0x044A=0x0000 +0x044B=0x0000 +0x044C=0x0000 +0x044D=0x0000 +0x044E=0x0000 +0x044F=0x0000 +0x0450=0x0000 +0x0451=0x0000 0x0452=0x0000 -0x0299=0x0000 -0x0084=0x0400 -0x0498=0x0000 -0x0348=0x0000 -0x02D0=0x0000 -0x054E=0x8184 -0x03A0=0x0000 -0x009A=0x658C -0x055D=0xA6B5 -0x0298=0x0000 -0x0364=0x0000 -0x0081=0x0000 -0x0325=0x0000 -0x040F=0x43E4 -0x04E3=0x0000 -0x050E=0x17DC -0x0516=0x150F -0x0389=0x0000 -0x054F=0x18C9 -0x0304=0x0000 -0x04D5=0x0000 -0x059B=0x0000 -0x0322=0x0000 -0x0442=0x0000 -0x035D=0x0000 -0x0492=0x0000 -0x04A1=0x0000 -0x0382=0x0000 -0x0288=0x0000 -0x0296=0x0000 -0x0555=0xBD96 -0x0349=0x0000 -0x0484=0x0000 -0x0586=0x196B -0x0281=0x0000 -0x0200=0x0301 -0x0594=0xF40D -0x02C5=0x0000 -0x0319=0x0000 -0x0121=0x3652 -0x025B=0x0000 -0x0290=0x0000 -0x02DF=0x0000 -0x0291=0x0000 -0x029C=0x0000 -0x008B=0x2756 -0x02A3=0x0000 -0x05A4=0x0000 -0x02A7=0x0000 +0x0453=0x0000 +0x0454=0x0000 +0x0455=0x0000 +0x0456=0x0000 +0x0457=0x0000 +0x0458=0x0000 +0x0459=0x0000 +0x045A=0x0000 +0x045B=0x0000 +0x045C=0x0000 +0x045D=0x0000 +0x045E=0x0000 +0x045F=0x0000 +0x0460=0x0000 +0x0461=0x0000 +0x0480=0x0000 +0x0481=0x0000 +0x0482=0x0000 0x0483=0x0000 -0x0201=0x07FF -0x02C2=0x0000 -0x02C4=0x0000 -0x0207=0x0000 -0x04C6=0x0000 -0x0093=0x0000 -0x02D3=0x0000 -0x0494=0x0000 -0x04CF=0x0000 -0x025F=0x0000 -0x0251=0x0000 +0x0484=0x0000 +0x0485=0x0000 +0x0486=0x0000 +0x0487=0x0000 0x0488=0x0000 +0x0489=0x0000 +0x048A=0x0000 +0x048B=0x0000 +0x048C=0x0000 +0x048D=0x0000 +0x048E=0x0000 +0x048F=0x0000 +0x0490=0x0000 +0x0491=0x0000 +0x0492=0x0000 +0x0493=0x0000 +0x0494=0x0000 +0x0495=0x0000 0x0496=0x0000 -0x04C3=0x0000 -0x0100=0xB409 -0x04CC=0x0000 -0x02A5=0x0000 -0x0257=0x0000 -0x04D6=0x0000 -0x04A6=0x0000 +0x0497=0x0000 +0x0498=0x0000 +0x0499=0x0000 0x049A=0x0000 0x049B=0x0000 -0x0097=0x0000 -0x011E=0x061D -0x0285=0x0000 -0x0280=0x0000 -0x0020=0xFFFD -0x02DD=0x0000 -0x0297=0x0000 -0x044C=0x0000 -0x0355=0x0000 +0x049C=0x0000 +0x049D=0x0000 +0x049E=0x0000 +0x049F=0x0000 0x04A0=0x0000 -0x02CF=0x0000 -0x04D1=0x0000 -0x0526=0xBE2A -0x0092=0x0001 -0x031B=0x0000 -0x0541=0x4C24 -0x0543=0xBD96 -0x02C0=0x0000 -0x0499=0x0000 -0x0513=0xDAA2 -0x0549=0x18C9 -0x0552=0x8D44 -0x0521=0x5852 -0x0509=0x0605 -0x0286=0x0000 -0x024F=0x0000 -0x04E0=0x0000 -0x0545=0x364E -0x0551=0xD7B7 -0x055F=0x5852 -0x009E=0x658C -0x0598=0xF61D -0x0123=0x067B -0x0497=0x0000 +0x04A1=0x0000 +0x04A2=0x0000 +0x04A3=0x0000 +0x04A4=0x0000 0x04A5=0x0000 -0x0565=0xB77F -0x0124=0x0000 -0x0592=0x0DF1 -0x0591=0xFCFE -0x0548=0x79FA -0x04D2=0x0000 -0x0599=0x0000 -0x0511=0x1D10 -0x0506=0x0DF1 -0x0595=0x00BC -0x0584=0xE7E2 -0x0242=0x0000 -0x025A=0x0000 -0x04E2=0x0000 +0x04A6=0x0000 +0x04A7=0x0000 +0x04C0=0x0000 +0x04C1=0x0000 +0x04C2=0x0000 +0x04C3=0x0000 +0x04C4=0x0000 0x04C5=0x0000 -0x058C=0xEA50 -0x0450=0x0000 -0x058A=0x17DC -0x059D=0x0000 -0x0485=0x0000 -0x058E=0x1316 -0x0550=0x79FA -0x0554=0x6901 -0x0593=0x00D8 -0x0553=0x364E -0x0542=0xA2B5 -0x0563=0x4F91 -0x024D=0x0000 -0x055A=0xBE2A -0x0295=0x0000 -0x028A=0x0000 -0x059C=0x0000 -0x04DD=0x0000 -0x054C=0x7FFF -0x0582=0x150F -0x0109=0x8CC1 -0x04A2=0x0000 -0x0292=0x0000 -0x0583=0x2E45 -0x059F=0x0000 -0x0525=0x57AC -0x0523=0xA6B5 -0x0206=0x0000 -0x051A=0x0906 -0x055C=0x3347 -0x05A6=0x0000 -0x050F=0xEA5F -0x051E=0xF524 -0x050A=0x1316 +0x04C6=0x0000 0x04C7=0x0000 -0x049D=0x0000 -0x050C=0xEA50 -0x0087=0x0000 -0x0399=0x0000 -0x0495=0x0000 -0x0246=0x0000 -0x0503=0x00BC -0x0320=0x0000 -0x0323=0x0000 -0x055B=0x57AC -0x0114=0x0110 -0x02E5=0x0000 -0x04E7=0x0000 +0x04C8=0x0000 +0x04C9=0x0000 +0x04CA=0x0000 +0x04CB=0x0000 +0x04CC=0x0000 +0x04CD=0x0000 +0x04CE=0x0000 +0x04CF=0x0000 0x04D0=0x0000 -0x04E6=0x0000 -0x00AE=0x0000 -0x0544=0x6901 -0x04DE=0x0000 -0x058B=0x0F45 -0x0028=0x0101 -0x029E=0x0000 -0x04DC=0x0000 +0x04D1=0x0000 +0x04D2=0x0000 +0x04D3=0x0000 +0x04D4=0x0000 +0x04D5=0x0000 +0x04D6=0x0000 +0x04D7=0x0000 +0x04D8=0x0000 0x04D9=0x0000 -0x058F=0x0605 -0x0557=0x4C24 +0x04DA=0x0000 0x04DB=0x0000 -0x04D7=0x0000 +0x04DC=0x0000 +0x04DD=0x0000 +0x04DE=0x0000 +0x04DF=0x0000 +0x04E0=0x0000 +0x04E1=0x0000 +0x04E2=0x0000 +0x04E3=0x0000 +0x04E4=0x0000 +0x04E5=0x0000 +0x04E6=0x0000 +0x04E7=0x0000 +0x0500=0x0000 +0x0501=0x0000 +0x0502=0x0000 +0x0503=0x0000 +0x0504=0x0000 +0x0505=0x0000 +0x0506=0x0000 +0x0507=0x0000 +0x0508=0x0000 +0x0509=0x0000 +0x050A=0x0000 +0x050B=0x0000 +0x050C=0x0000 +0x050D=0x0000 +0x050E=0x0000 +0x050F=0x0000 +0x0510=0x0000 +0x0511=0x0000 +0x0512=0x0000 +0x0513=0x0000 +0x0514=0x0000 +0x0515=0x0000 +0x0516=0x0000 +0x0517=0x0000 +0x0518=0x0000 +0x0519=0x0000 +0x051A=0x0000 +0x051B=0x0000 +0x051C=0x0000 +0x051D=0x0000 +0x051E=0x0000 +0x051F=0x0000 +0x0520=0x0000 +0x0521=0x0000 +0x0522=0x0000 +0x0523=0x0000 +0x0524=0x0000 +0x0525=0x0000 +0x0526=0x0000 +0x0527=0x0000 +0x0540=0x0000 +0x0541=0x0000 +0x0542=0x0000 +0x0543=0x0000 +0x0544=0x0000 +0x0545=0x0000 +0x0546=0x0000 +0x0547=0x0000 +0x0548=0x0000 +0x0549=0x0000 +0x054A=0x0000 +0x054B=0x0000 +0x054C=0x0000 +0x054D=0x0000 +0x054E=0x0000 +0x054F=0x0000 +0x0550=0x0000 +0x0551=0x0000 +0x0552=0x0000 +0x0553=0x0000 +0x0554=0x0000 +0x0555=0x0000 +0x0556=0x0000 +0x0557=0x0000 +0x0558=0x0000 +0x0559=0x0000 +0x055A=0x0000 +0x055B=0x0000 +0x055C=0x0000 +0x055D=0x0000 +0x055E=0x0000 +0x055F=0x0000 +0x0560=0x0000 +0x0561=0x0000 +0x0562=0x0000 +0x0563=0x0000 +0x0564=0x0000 +0x0565=0x0000 +0x0566=0x0000 +0x0567=0x0000 +0x0580=0x0000 +0x0581=0x0000 +0x0582=0x0000 +0x0583=0x0000 +0x0584=0x0000 +0x0585=0x0000 +0x0586=0x0000 +0x0587=0x0000 +0x0588=0x0000 +0x0589=0x0000 +0x058A=0x0000 +0x058B=0x0000 +0x058C=0x0000 +0x058D=0x0000 +0x058E=0x0000 +0x058F=0x0000 +0x0590=0x0000 +0x0591=0x0000 +0x0592=0x0000 +0x0593=0x0000 +0x0594=0x0000 +0x0595=0x0000 +0x0596=0x0000 +0x0597=0x0000 +0x0598=0x0000 +0x0599=0x0000 +0x059A=0x0000 +0x059B=0x0000 +0x059C=0x0000 +0x059D=0x0000 0x059E=0x0000 -0x024C=0x0000 -0x02DC=0x0000 -0x04D4=0x0000 -0x0504=0xF40D -0x02C3=0x0000 -0x04C1=0x0000 -0x04D3=0x0000 -0x0590=0xEF99 -0x04CE=0x0000 +0x059F=0x0000 +0x05A0=0x0000 +0x05A1=0x0000 +0x05A2=0x0000 +0x05A3=0x0000 +0x05A4=0x0000 0x05A5=0x0000 -[file_info] -version=1 -type=lms7002m_minimal_config +0x05A6=0x0000 +0x05A7=0x0000 +[reference_clocks] +sxt_ref_clk_mhz=30.72 +sxr_ref_clk_mhz=30.72 diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/CMakeLists.txt b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/CMakeLists.txt deleted file mode 100644 index c331185e1738799cacd04857d5e7d34448f4022a..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -set(si5351_src_files - Si5351C.cpp -) -set(CMAKE_CXX_FLAGS - "${CMAKE_CXX_FLAGS} ${C_FLAGS_PROCESSOR} -std=c++11 -fPIC" -) - - -add_library(Si5351C STATIC ${si5351_src_files}) -target_include_directories(Si5351C PUBLIC ../lms7002m ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(Si5351C LMS7002M) diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.cpp deleted file mode 100644 index 88bcb74f3d5c29e99495a773b757fd8355160ad4..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.cpp +++ /dev/null @@ -1,872 +0,0 @@ -/** -@file Si5351C.cpp -@author Lime Microsystems -@brief Configuring of Si5351C -*/ - -#include "Si5351C.h" -#include "lmsComms.h" -#include <math.h> -#include <iomanip> -#include <fstream> -#include <sstream> -#include <set> -#include <string.h> -#include <assert.h> -#include <iostream> -using namespace std; - -#define Log(msg, type) cout << (msg) << endl; - -/// Splits float into fraction integers A + B/C -void realToFrac(const float real, int &A, int &B, int &C) -{ - A = (int)real; - B = (int)((real - A) * 1048576 + 0.5); - C = 1048576; - - int a = B; - int b = C; - int temp; - while( b!= 0) // greatest common divider - { - temp = a % b; - a = b; - b = temp; - } - B = B/a; - C = C/a; -} - -/// Default configuration -const unsigned char Si5351C::m_defaultConfiguration[] = -{ 0,0x00, - 1,0x00, - 2,0x08, - 3,0x00, - 4,0x00, - 5,0x00, - 6,0x00, - 7,0x00, - 8,0x00, - 9,0x00, - 10,0x00, - 11,0x00, - 12,0x00, - 13,0x00, - 14,0x00, - 15,0x04, - 16,0x4F, - 17,0x4F, - 18,0x4F, - 19,0x4F, - 20,0x4F, - 21,0x4F, - 22,0x0F, - 23,0x0F, - 24,0x00, - 25,0x00, - 26,0x00, - 27,0x80, - 28,0x00, - 29,0x0B, - 30,0x2F, - 31,0x00, - 32,0x00, - 33,0x00, - 34,0x00, - 35,0x00, - 36,0x00, - 37,0x00, - 38,0x00, - 39,0x00, - 40,0x00, - 41,0x00, - 42,0x00, - 43,0x01, - 44,0x00, - 45,0x0D, - 46,0x00, - 47,0x00, - 48,0x00, - 49,0x00, - 50,0x00, - 51,0x01, - 52,0x00, - 53,0x0D, - 54,0x00, - 55,0x00, - 56,0x00, - 57,0x00, - 58,0x00, - 59,0x01, - 60,0x00, - 61,0x0D, - 62,0x00, - 63,0x00, - 64,0x00, - 65,0x00, - 66,0x00, - 67,0x01, - 68,0x00, - 69,0x0D, - 70,0x00, - 71,0x00, - 72,0x00, - 73,0x00, - 74,0x00, - 75,0x01, - 76,0x00, - 77,0x0D, - 78,0x00, - 79,0x00, - 80,0x00, - 81,0x00, - 82,0x00, - 83,0x01, - 84,0x00, - 85,0x0D, - 86,0x00, - 87,0x00, - 88,0x00, - 89,0x00, - 90,0x1E, - 91,0x1E, - 92,0x00, - 93,0x00, - 94,0x00, - 95,0x00, - 96,0x00, - 97,0x00, - 98,0x00, - 99,0x00, -100,0x00, -101,0x00, -102,0x00, -103,0x00, -104,0x00, -105,0x00, -106,0x00, -107,0x00, -108,0x00, -109,0x00, -110,0x00, -111,0x00, -112,0x00, -113,0x00, -114,0x00, -115,0x00, -116,0x00, -117,0x00, -118,0x00, -119,0x00, -120,0x00, -121,0x00, -122,0x00, -123,0x00, -124,0x00, -125,0x00, -126,0x00, -127,0x00, -128,0x00, -129,0x00, -130,0x00, -131,0x00, -132,0x00, -133,0x00, -134,0x00, -135,0x00, -136,0x00, -137,0x00, -138,0x00, -139,0x00, -140,0x00, -141,0x00, -142,0x00, -143,0x00, -144,0x00, -145,0x00, -146,0x00, -147,0x00, -148,0x00, -149,0x00, -150,0x00, -151,0x00, -152,0x00, -153,0x00, -154,0x00, -155,0x00, -156,0x00, -157,0x00, -158,0x00, -159,0x00, -160,0x00, -161,0x00, -162,0x00, -163,0x00, -164,0x00, -165,0x00, -166,0x00, -167,0x00, -168,0x00, -169,0x00, -170,0x00, -171,0x00, -172,0x00, -173,0x00, -174,0x00, -175,0x00, -176,0x00, -177,0x00, -178,0x00, -179,0x00, -180,0x00, -181,0x30, -182,0x00, -183,0xD2, -184,0x60, -185,0x60, -186,0x00, -187,0xC0, -188,0x00, -189,0x00, -190,0x00, -191,0x00, -192,0x00, -193,0x00, -194,0x00, -195,0x00, -196,0x00, -197,0x00, -198,0x00, -199,0x00, -200,0x00, -201,0x00, -202,0x00, -203,0x00, -204,0x00, -205,0x00, -206,0x00, -207,0x00, -208,0x00, -209,0x00, -210,0x00, -211,0x00, -212,0x00, -213,0x00, -214,0x00, -215,0x00, -216,0x00, -217,0x00, -218,0x00, -219,0x00, -220,0x00, -221,0x0D, -222,0x00, -223,0x00, -224,0x00, -225,0x00, -226,0x00, -227,0x00, -228,0x00, -229,0x00, -230,0x00, -231,0x00, -232,0x00}; - -// --------------------------------------------------------------------------- -Si5351C::Si5351C() -{ - memset(m_newConfiguration, 0, 255); - for(unsigned int i=0; i<sizeof(m_defaultConfiguration); i+=2) - { - m_newConfiguration[m_defaultConfiguration[i]] = m_defaultConfiguration[i+1]; - } - device = NULL; -} -// --------------------------------------------------------------------------- - -Si5351C::~Si5351C() -{ - -} - -/** @brief Sends Configuration to Si5351C -*/ -Si5351C::Status Si5351C::UploadConfiguration() -{ - LMScomms::GenericPacket pkt; - pkt.cmd = CMD_SI5351_WR; - - if (!device) - return FAILED; - //Disable outputs - pkt.outBuffer.push_back(3); - pkt.outBuffer.push_back(0xFF); - //Power down all output drivers - for(int i=0; i<8; ++i) - { - pkt.outBuffer.push_back(16 + i); - pkt.outBuffer.push_back(0x84); - } - //write new configuration - for (int i = 15; i <= 92; ++i) - { - pkt.outBuffer.push_back(i); - pkt.outBuffer.push_back(m_newConfiguration[i]); - } - for (int i = 149; i <= 170; ++i) - { - pkt.outBuffer.push_back(i); - pkt.outBuffer.push_back(m_newConfiguration[i]); - } - //apply soft reset - pkt.outBuffer.push_back(177); - pkt.outBuffer.push_back(0xAC); - //Enabe desired outputs - pkt.outBuffer.push_back(3); - pkt.outBuffer.push_back(m_newConfiguration[3]); - - if( !device->IsOpen() ) - { - return FAILED; - } - LMScomms::TransferStatus status; - status = device->TransferPacket(pkt); - if (status != LMScomms::TRANSFER_SUCCESS || pkt.status != STATUS_COMPLETED_CMD) - { - return FAILED; - } - return SUCCESS; -} - -// --------------------------------------------------------------------------- -/** - @brief Sets connection manager to use for data transferring Si5351C - @param mng connection manager for data transferring -*/ -void Si5351C::Initialize(LMScomms *mng) -{ - assert(mng != nullptr); - device = mng; -} - -/** - @brief Loads register values for Si5356A from file - @param FName input filename -*/ -bool Si5351C::LoadRegValuesFromFile(string FName) -{ - fstream fin; - fin.open(FName.c_str(), ios::in); - - const int len = 1024; - char line[len]; - - int addr; - int value; - - while(!fin.eof()) - { - fin.getline(line, len); - if( line[0] == '#') - continue; - if( strcmp(line, "#END_PROFILE") == 0) - break; - sscanf(line, "%i,%x",&addr,&value); - m_newConfiguration[addr] = value; - } - - fin.close(); - return false; -}; - -/** @brief Calculates multisynth dividers and VCO frequencies - @param clocks output clocks configuration - @param plls plls configurations - @param Fmin lowest VCO frequency - @param Fmax highest VCO frequency -*/ -void Si5351C::FindVCO(Si5351_Channel *clocks, Si5351_PLL *plls, const unsigned long Fmin, const unsigned long Fmax) -{ - int clockCount = 8; - //reset output parameters - for(int i=0; i<clockCount; i++) - { - clocks[i].pllSource = 0; - clocks[i].int_mode = 0; - clocks[i].multisynthDivider = 8; - } - - bool clk6satisfied = !clocks[6].powered; - bool clk7satisfied = !clocks[7].powered; - - bool pllAused = false; - bool pllBused = false; - - map< unsigned long, int> availableFrequenciesPLLA; //all available frequencies for VCO - map< unsigned long, int> availableFrequenciesPLLB; //all available frequencies for VCO - - //if clk6 or clk7 is used make available frequencies according to them - if(clocks[6].powered || clocks[7].powered) - { - set<unsigned long> clk6freqs; - set<unsigned long> clk7freqs; - set<unsigned long> sharedFreqs; - unsigned int mult = 6; - if(!clk6satisfied) - { - unsigned long freq = clocks[6].outputFreqHz; - while(freq <= Fmax && mult <= 254) - { - freq = clocks[6].outputFreqHz*mult; - if(freq >= Fmin && freq <= Fmax) - { - clk6freqs.insert(freq); - } - mult += 2; - } - } - mult = 6; - if(!clk7satisfied) - { - unsigned long freq = clocks[7].outputFreqHz; - while(freq <= Fmax && mult <= 254) - { - freq = clocks[7].outputFreqHz*mult; - if(freq >= Fmin && freq <= Fmax) - { - clk7freqs.insert(freq); - } - mult += 2; - } - } - bool canShare = false; - //find if clk6 and clk7 can share the same pll - for (set<unsigned long>::iterator it6=clk6freqs.begin(); it6!=clk6freqs.end(); ++it6) - { - for (set<unsigned long>::iterator it7=clk7freqs.begin(); it7!=clk7freqs.end(); ++it7) - { - if(*it6 == *it7) - { - canShare = true; - sharedFreqs.insert(*it6); - } - } - } - if(canShare) //assign PLLA for both clocks - { - clocks[6].pllSource = 0; - clocks[7].pllSource = 0; - pllAused = true; - for (set<unsigned long>::iterator it=sharedFreqs.begin(); it!=sharedFreqs.end(); ++it) - { - availableFrequenciesPLLA.insert( pair<unsigned long, int> (*it, 0) ); - } - clk6satisfied = true; - clk7satisfied = true; - } - else //if clocks 6 and 7 can't share pll, assign pllA to clk6 and pllB to clk7 - { - if(!clk6satisfied) - { - clocks[6].pllSource = 0; - clk6satisfied = true; - pllAused = true; - for (set<unsigned long>::iterator it6=clk6freqs.begin(); it6!=clk6freqs.end(); ++it6) - { - availableFrequenciesPLLA.insert( pair<unsigned long, int>(*it6, 0) ); - } - } - if(!clk7satisfied) - { - clocks[7].pllSource = 1; - clk7satisfied = true; - pllBused = true; - for (set<unsigned long>::iterator it7=clk7freqs.begin(); it7!=clk7freqs.end(); ++it7) - { - availableFrequenciesPLLB.insert( pair<unsigned long, int> (*it7, 0) ); - } - } - } - } - - //PLLA stage, find all clocks that have integer coefficients with PLLA - //if pllA is not used by clk6 or clk7, fill available frequencies according to clk1-clk5 clocks - if( availableFrequenciesPLLA.size() == 0 && !pllAused) - { - for(int i=0; i<6; ++i) - { - unsigned long freq = clocks[i].outputFreqHz > Fmin ? clocks[i].outputFreqHz : (clocks[i].outputFreqHz*((Fmin/clocks[i].outputFreqHz) + ((Fmin%clocks[i].outputFreqHz)!=0))); - while(freq >= Fmin && freq <= Fmax) - { - //add all output frequency multiples that are in VCO interval - availableFrequenciesPLLA.insert( pair<unsigned long, int> (freq, 0)); - freq += clocks[i].outputFreqHz; - } - } - } - - unsigned int bestScore = 0; //score shows how many outputs have integer dividers - //calculate scores for all available frequencies - unsigned long bestVCOA = 0; - for (map<unsigned long, int>::iterator it=availableFrequenciesPLLA.begin(); it!=availableFrequenciesPLLA.end(); ++it) - { - for(int i=0; i<8; ++i) - { - if(clocks[i].outputFreqHz == 0 || !clocks[i].powered) - continue; - - if( (it->first % clocks[i].outputFreqHz) == 0) - { - it->second = it->second+1; - } - } - if(it->second >= bestScore) - { - bestScore = it->second; - bestVCOA = it->first; - } - } - //scores calculated - //cout << "PLLA stage: " << endl; - //cout << "best score: " << bestScore << " best VCO: " << bestVCOA << endl; - plls[0].VCO_Hz = bestVCOA; - plls[0].feedbackDivider = (double)bestVCOA/plls[0].inputFreqHz; - - for(int i=0; i<clockCount; ++i) - { - if(clocks[i].outputFreqHz == 0 || !clocks[i].powered) - continue; - - clocks[i].multisynthDivider = bestVCOA/clocks[i].outputFreqHz; - if(bestVCOA%clocks[i].outputFreqHz == 0) - { - clocks[i].int_mode = true; - clocks[i].multisynthDivider = bestVCOA/clocks[i].outputFreqHz; - } - else - { - clocks[i].int_mode = false; - clocks[i].multisynthDivider = (double)bestVCOA/clocks[i].outputFreqHz; - } - clocks[i].pllSource = 0; - } - - - //PLLB stage, find all clocks that have integer coefficients with PLLB - //if pllB is not used by clk6 or clk7, fill available frequencies according to clk1-clk5 clocks, that don't have integer dividers - if( availableFrequenciesPLLB.size() == 0 && !pllBused) - { - for(int i=0; i<6; ++i) - { - if(clocks[i].outputFreqHz == 0 || !clocks[i].powered) - continue; - - if(clocks[i].int_mode) //skip clocks with integer dividers - continue; - unsigned long freq = clocks[i].outputFreqHz > Fmin ? clocks[i].outputFreqHz : (clocks[i].outputFreqHz*((Fmin/clocks[i].outputFreqHz) + ((Fmin%clocks[i].outputFreqHz)!=0))); - while(freq >= Fmin && freq <= Fmax) - { - availableFrequenciesPLLB.insert( pair<unsigned long, int> (freq, 0)); - freq += clocks[i].outputFreqHz; - } - } - } - - bestScore = 0; - //calculate scores for all available frequencies - unsigned long bestVCOB = 0; - for (map<unsigned long, int>::iterator it=availableFrequenciesPLLB.begin(); it!=availableFrequenciesPLLB.end(); ++it) - { - for(int i=0; i<8; ++i) - { - if(clocks[i].outputFreqHz == 0 || !clocks[i].powered) - continue; - - if( (it->first % clocks[i].outputFreqHz) == 0) - { - it->second = it->second+1; - } - } - if(it->second >= bestScore) - { - bestScore = it->second; - bestVCOB = it->first; - } - } - //scores calculated -// cout << "PLLB stage: " << endl; -// cout << "best score: " << bestScore << " best VCO: " << bestVCOB << endl; - if(bestVCOB == 0) //just in case if pllb is not used make it the same frequency as plla - bestVCOB = bestVCOA; - plls[1].VCO_Hz = bestVCOB; - plls[1].feedbackDivider = (double)bestVCOB/plls[0].inputFreqHz; - for(int i=0; i<clockCount; ++i) - { - if(clocks[i].outputFreqHz == 0 || !clocks[i].powered) - continue; - - if(clocks[i].int_mode) - continue; - clocks[i].multisynthDivider = bestVCOB/clocks[i].outputFreqHz; - if(bestVCOB%clocks[i].outputFreqHz == 0) - { - clocks[i].int_mode = true; - clocks[i].multisynthDivider = bestVCOB/clocks[i].outputFreqHz; - } - else - { - clocks[i].int_mode = false; - clocks[i].multisynthDivider = (double)bestVCOB/clocks[i].outputFreqHz; - } - clocks[i].pllSource = 1; - } -} - - -/** @brief Modifies register map with clock settings - @return true if success -*/ -Si5351C::Status Si5351C::ConfigureClocks() -{ - FindVCO(CLK, PLL, 600000000, 900000000); - stringstream ss; - int addr; - m_newConfiguration[3] = 0; - for(int i=0; i<8; ++i) - { - m_newConfiguration[3] |= (!CLK[i].powered) << i; //enabled - m_newConfiguration[16+i] = 0; - m_newConfiguration[16+i] |= !CLK[i].powered << 7; // powered - - if(CLK[i].int_mode) - { - m_newConfiguration[16+i] |= 1 << 6; //integer mode - } - else - m_newConfiguration[16+i] |= 0 << 6; - - m_newConfiguration[16+i] |= CLK[i].pllSource << 5; //PLL source - m_newConfiguration[16+i] |= CLK[i].inverted << 4; // invert - m_newConfiguration[16+i] |= 3 << 2; - m_newConfiguration[16+i] |= 3; - - addr = 42+i*8; - ss.clear(); - ss.str( string() ); - ss << "CLK" << i << " fOut = " << CLK[i].outputFreqHz/1000000.0 << " MHz"; - int DivA; - int DivB; - int DivC; - - realToFrac(CLK[i].multisynthDivider, DivA, DivB, DivC); - ss << " Multisynth Divider " << DivA << " " << DivB << "/" << DivC; - ss << " R divider = " << CLK[i].outputDivider << " source = " << (CLK[i].pllSource == 0 ? "PLLA" : "PLLB") << endl; - - Log(ss.str(), LOG_INFO); - - if( CLK[i].multisynthDivider < 8 || 900 < CLK[i].multisynthDivider) - { - Log("Si5351C - Output multisynth divider is outside [8;900] interval.\n", LOG_ERROR); - return FAILED; - } - - if(i<6) - { - if(CLK[i].outputFreqHz <= 150000000) - { - unsigned MSX_P1 = 128 * DivA + floor(128 * ( (float)DivB/DivC)) - 512; - unsigned MSX_P2 = 128 * DivB - DivC * floor( 128 * DivB/DivC ); - unsigned MSX_P3 = DivC; - - m_newConfiguration[addr] = MSX_P3 >> 8; - m_newConfiguration[addr+1] = MSX_P3; - - m_newConfiguration[addr+2] = 0; - m_newConfiguration[addr+2] |= (MSX_P1 >> 16 ) & 0x03; - m_newConfiguration[addr+3] = MSX_P1 >> 8; - m_newConfiguration[addr+4] = MSX_P1; - - m_newConfiguration[addr+5] = 0; - m_newConfiguration[addr+5] = (MSX_P2 >> 16) & 0x0F; - m_newConfiguration[addr+5] |= (MSX_P3 >> 16) << 4; - - m_newConfiguration[addr+6] = MSX_P2; - m_newConfiguration[addr+7] = MSX_P2 >> 8; - } - else if( CLK[i].outputFreqHz <= 160000000) // AVAILABLE ONLY ON 0-5 MULTISYNTHS - { - Log("Si5351C - clock configuring for more than 150 MHz not implemented\n", LOG_ERROR); - return FAILED; - } - } - else // CLK6 and CLK7 only integer mode - { - if(CLK[i].outputFreqHz <= 150000000) - { - if(i==6) - { - m_newConfiguration[90] = DivA; - if(DivA%2 != 0) - { - Log("Si5351C - CLK6 multisynth divider is not even integer\n", LOG_ERROR); - return FAILED; - } - } - else - { - m_newConfiguration[91] = DivA; - if(DivA%2 != 0) - { - Log("Si5351C - CLK7 multisynth divider is not even integer\n", LOG_ERROR); - return FAILED; - } - } - } - else if( CLK[i].outputFreqHz <= 160000000) // AVAILABLE ONLY ON 0-5 MULTISYNTHS - { - Log("Si5351C - clock configuring for more than 150 MHz not implemented\n", LOG_ERROR); - return FAILED; - } - } - } - - //configure pll - //set input clk source - m_newConfiguration[15] = m_newConfiguration[15] & 0xF3; - m_newConfiguration[15] |= (PLL[0].CLK_SRC & 1) << 2; - m_newConfiguration[15] |= (PLL[1].CLK_SRC & 1) << 3; - for(int i=0; i<2; ++i) - { - addr = 26+i*8; - if(PLL[i].feedbackDivider < 15 || PLL[i].feedbackDivider > 90) - { - Log("Si5351C - VCO frequency divider out of range [15:90].\n", LOG_ERROR); - return FAILED; - } - if( PLL[i].VCO_Hz < 600000000 || PLL[i].VCO_Hz > 900000000) - { - Log("Si5351C - Can't calculate valid VCO frequency.\n", LOG_ERROR); - return FAILED; - } - ss.clear(); - ss.str(string()); - ss << "Si5351C : VCO" << (i==0 ? "A" : "B") << " = " << PLL[i].VCO_Hz/1000000.0 << " MHz"; - - //calculate MSNx_P1, MSNx_P2, MSNx_P3 - int MSNx_P1; - int MSNx_P2; - int MSNx_P3; - - int DivA; - int DivB; - int DivC; - realToFrac(PLL[i].feedbackDivider, DivA, DivB, DivC); - ss << " Feedback Divider " << DivA << " " << DivB << "/" << DivC << endl; - Log(ss.str(), LOG_INFO); - - MSNx_P1 = 128 * DivA + floor(128 * ( (float)DivB/DivC)) - 512; - MSNx_P2 = 128 * DivB - DivC * floor( 128 * DivB/DivC ); - MSNx_P3 = DivC; - - m_newConfiguration[addr+4] = MSNx_P1; - m_newConfiguration[addr+3] = MSNx_P1 >> 8; - m_newConfiguration[addr+2] = MSNx_P1 >> 16; - - m_newConfiguration[addr+7] = MSNx_P2; - m_newConfiguration[addr+6] = MSNx_P2 >> 8; - m_newConfiguration[addr+5] = 0; - m_newConfiguration[addr+5] = (MSNx_P2 >> 16) & 0x0F; - - m_newConfiguration[addr+5] |= (MSNx_P3 >> 16) << 4; - m_newConfiguration[addr+1] |= MSNx_P3; - m_newConfiguration[addr] |= MSNx_P3 >> 8; - } - return SUCCESS; -} - -/** @brief Sets output clock parameters - @param id clock id 0-CLK0 1-CLK1 ... - @param fOut_Hz output frequency in Hz - @param enabled is this output powered - @param inverted invert clock -*/ -void Si5351C::SetClock(unsigned char id, unsigned long fOut_Hz, bool enabled, bool inverted) -{ - if( id < 8) - { - if(fOut_Hz < 8000 || fOut_Hz > 160000000) - { - stringstream ss; - ss << "Si5351C - CLK" << (int)id << " output frequency must be between 8kHz and 160MHz. fOut_MHz = " << fOut_Hz/1000000.0 << endl; - Log(ss.str(), LOG_ERROR); - return; - } - CLK[id].powered = enabled; - CLK[id].inverted = inverted; - CLK[id].outputFreqHz = fOut_Hz; - } -} - -/** @brief Sets PLL input frequency - @param id PLL id 0-PLLA 1-PLLB - @param CLKIN_Hz clock input in Hz -*/ -void Si5351C::SetPLL(unsigned char id, unsigned long CLKIN_Hz, int CLK_SRC) -{ - if (id < 2) - { - PLL[id].inputFreqHz = CLKIN_Hz; - PLL[id].CLK_SRC = CLK_SRC; - } -} - -/** @brief Resets configuration registers to default values -*/ -void Si5351C::Reset() -{ - memset(m_newConfiguration, 0, 255); - for(unsigned int i=0; i<sizeof(m_defaultConfiguration); i+=2) - { - m_newConfiguration[m_defaultConfiguration[i]] = m_defaultConfiguration[i+1]; - } -} - -Si5351C::StatusBits Si5351C::GetStatusBits() -{ - StatusBits stat; - LMScomms::GenericPacket pkt; - pkt.cmd = CMD_SI5351_RD; - pkt.outBuffer.push_back(0); - pkt.outBuffer.push_back(1); - LMScomms::TransferStatus status; - status = device->TransferPacket(pkt); - if (status != LMScomms::TRANSFER_SUCCESS || pkt.status != STATUS_COMPLETED_CMD) - { - return stat; - } - - stat.sys_init = (pkt.inBuffer[0] >> 7); - stat.lol_b = (pkt.inBuffer[0] >> 6) & 0x1; - stat.lol_a = (pkt.inBuffer[0] >> 5) & 0x1; - stat.los = (pkt.inBuffer[0] >> 4) & 0x1; - stat.sys_init_stky = (pkt.inBuffer[1] >> 7); - stat.lol_b_stky = (pkt.inBuffer[1] >> 6) & 0x1; - stat.lol_a_stky = (pkt.inBuffer[1] >> 5) & 0x1; - stat.los_stky = (pkt.inBuffer[1] >> 4) & 0x1; - return stat; -} - -Si5351C::Status Si5351C::ClearStatus() -{ - LMScomms::GenericPacket pkt; - pkt.cmd = CMD_SI5351_WR; - pkt.outBuffer.push_back(1); - pkt.outBuffer.push_back(0x0); - LMScomms::TransferStatus status; - status = device->TransferPacket(pkt); - if (status != LMScomms::TRANSFER_SUCCESS || pkt.status != STATUS_COMPLETED_CMD) - return FAILED; - return SUCCESS; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.h deleted file mode 100644 index 971a2d1d69a81a86a2eb67c01fb81aa9d93af2e1..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.h +++ /dev/null @@ -1,100 +0,0 @@ -/** -@file Si5351C.h -@brief Header for Si5351C.cpp -@author Lime Microsystems -*/ - -#ifndef SI5351C_MODULE -#define SI5351C_MODULE - -#include <stdio.h> -#include <string> -using namespace std; -//--------------------------------------------------------------------------- - -enum eSi_CLOCK_INPUT -{ - Si_CLKIN, - Si_XTAL, - Si_CMOS -}; - -struct Si5351_Channel -{ - Si5351_Channel() : outputDivider(1), outputFreqHz(1), multisynthDivider(1), pllSource(0), - phaseOffset(0), powered(true), inverted(false), int_mode(false) {}; - int outputDivider; - unsigned long outputFreqHz; - float multisynthDivider; - int pllSource; - float phaseOffset; - bool powered; - bool inverted; - bool int_mode; -}; - -struct Si5351_PLL -{ - Si5351_PLL() : inputFreqHz(0), VCO_Hz(0), feedbackDivider(0), CLKIN_DIV(1), CLK_SRC(1) {} - unsigned long inputFreqHz; - float VCO_Hz; - float feedbackDivider; - int CLKIN_DIV; - int CLK_SRC; //0-XTAL, 1-CLKIN -}; - -class LMScomms; -class Si5351C -{ -public: - enum Status - { - SUCCESS, - FAILED, - }; - - struct StatusBits - { - StatusBits() : sys_init(0), sys_init_stky(0), lol_b(0), lol_b_stky(0), lol_a(0), lol_a_stky(0), los(0), los_stky(0) - { - - } - int sys_init; - int sys_init_stky; - int lol_b; - int lol_b_stky; - int lol_a; - int lol_a_stky; - int los; - int los_stky; - }; - - StatusBits GetStatusBits(); - Status ClearStatus(); - - Si5351C(); - ~Si5351C(); - void Initialize(LMScomms *mng); - bool LoadRegValuesFromFile(string FName); - - void SetPLL(unsigned char id, unsigned long CLKIN_Hz, int CLK_SRC); - void SetClock(unsigned char id, unsigned long fOut_Hz, bool enabled = true, bool inverted = false); - - Status UploadConfiguration(); - Status ConfigureClocks(); - void Reset(); - -private: - void FindVCO(Si5351_Channel *clocks, Si5351_PLL *plls, const unsigned long Fmin, const unsigned long Fmax); - LMScomms *device; - - Si5351_PLL PLL[2]; - Si5351_Channel CLK[8]; - - static const unsigned char m_defaultConfiguration[]; - unsigned char m_newConfiguration[255]; - - -}; - -#endif // SI5351C_MODULE diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/CMakeLists.txt b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/CMakeLists.txt deleted file mode 100644 index 4613e9ce72b93fdf302268fdfc273de46b7cb780..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/CMakeLists.txt +++ /dev/null @@ -1,63 +0,0 @@ -cmake_minimum_required(VERSION 2.8) -set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE TYPE INTERNAL FORCE) -project("lms7api") -#include modules for finding FFTW and CyAPI -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") -cmake_policy(SET CMP0015 OLD) -if(${CMAKE_MAJOR_VERSION} GREATER 2) - cmake_policy(SET CMP0043 NEW) -endif() -ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS) -if(CMAKE_COMPILER_IS_GNUCXX) - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -fPIC") -endif() - -# set up include-directories -include_directories( - "${PROJECT_SOURCE_DIR}" - "${PROJECT_BINARY_DIR}" - cpp-feather-ini-parser - ) - -set(LMS7002M_src_files - LMS7002M.cpp - LMS7002M_parameters.cpp - LMS7002M_statuses.cpp - LMS7002M_filtersCalibration.cpp - lmsComms.cpp - LMS7002M_RegistersMap.cpp -) - -set(ENABLE_USB_CONNECTION "YES" CACHE BOOL INTERNAL) -set(ENABLE_SPI_CONNECTION "NO" CACHE BOOL INTERNAL) -set(CONNECTION_MANAGER_DIR connectionManager) -set(connectionManager_src_files - ${CONNECTION_MANAGER_DIR}/ConnectionManager.cpp - ${CONNECTION_MANAGER_DIR}/ConnectionCOM.cpp - ${CONNECTION_MANAGER_DIR}/ConnectionManager.h - ${CONNECTION_MANAGER_DIR}/ConnectionCOM.h -) -if(ENABLE_USB_CONNECTION) - list(APPEND connectionManager_src_files ${CONNECTION_MANAGER_DIR}/ConnectionUSB.cpp ${CONNECTION_MANAGER_DIR}/ConnectionUSB.h) - add_definitions(-DENABLE_USB_CONNECTION) -endif() -if(ENABLE_SPI_CONNECTION) - list(APPEND connectionManager_src_files ${CONNECTION_MANAGER_DIR}/ConnectionSPI.cpp ${CONNECTION_MANAGER_DIR}/ConnectionSPI.h) - add_definitions(-DENABLE_SPI_CONNECTION) -endif() - -add_library(LMS7002M STATIC ${LMS7002M_src_files} ${connectionManager_src_files}) -target_include_directories(LMS7002M PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) - -if(WIN32 AND ENABLE_USB_CONNECTION) - find_package(CyAPI REQUIRED) - LINK_DIRECTORIES(${CYAPI_LIBRARIES}) - include_directories(${CYAPI_INCLUDE_DIRS}) - set(CONNECTION_MANAGER_LIBS ${CYAPI_LIBRARIES} SetupAPI) - target_link_libraries(LMS7002M ${CONNECTION_MANAGER_LIBS}) -endif() -if(UNIX AND ENABLE_USB_CONNECTION) - set(CONNECTION_MANAGER_LIBS usb-1.0 -lpthread) - target_link_libraries(LMS7002M ${CONNECTION_MANAGER_LIBS}) -endif() - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M.cpp deleted file mode 100644 index ded70e114f706d60e981f340bef0f26652a387ab..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M.cpp +++ /dev/null @@ -1,2612 +0,0 @@ -/** -@file LMS7002M.cpp -@author Lime Microsystems (www.limemicro.com) -@brief Implementation of LMS7002M transceiver configuring -*/ - -#include "LMS7002M.h" -#include <stdio.h> -#include <set> -#include "lmsComms.h" -#include "INI.h" -#include <cmath> -#include <iostream> -#include <algorithm> -#include "LMS7002M_RegistersMap.h" - -#include <chrono> -#include <thread> - -float_type LMS7002M::gVCO_frequency_table[3][2] = { { 3800, 5222 }, { 4961, 6754 }, {6306, 7714} }; -float_type LMS7002M::gCGEN_VCO_frequencies[2] = {2000, 2700}; - -///define for parameter enumeration if prefix might be needed -#define LMS7param(id) id - -//module addresses needs to be sorted in ascending order -const uint16_t LMS7002M::readOnlyRegisters[] = { 0x002F, 0x008C, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x0123, 0x0209, 0x020A, 0x020B, 0x040E, 0x040F }; -const uint16_t LMS7002M::readOnlyRegistersMasks[] = { 0x0000, 0x0FFF, 0x007F, 0x0000, 0x0000, 0x0000, 0x0000, 0x003F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; - -/** @brief Simple logging function to print status messages - @param text message to print - @param type message type for filtering specific information -*/ -void LMS7002M::Log(const char* text, LogType type) -{ - switch(type) - { - case LOG_INFO: - printf("%s\n", text); - break; - case LOG_WARNING: - printf("Warning: %s\n", text); - break; - case LOG_ERROR: - printf("ERROR: %s\n", text); - break; - case LOG_DATA: - printf("DATA: %s\n", text); - break; - } -} - -LMS7002M::LMS7002M() : controlPort(NULL), mRegistersMap(new LMS7002M_RegistersMap()) -{ - mRefClkSXR_MHz = 30.72; - mRefClkSXT_MHz = 30.72; -} - -/** @brief Creates LMS7002M main control object, it requires LMScomms to communicate with chip - @param controlPort data connection for controlling LMS7002 chip registers -*/ -LMS7002M::LMS7002M(LMScomms* controlPort) : - controlPort(controlPort), mRegistersMap(new LMS7002M_RegistersMap()) -{ - mRefClkSXR_MHz = 30.72; - mRefClkSXT_MHz = 30.72; - - //memory intervals for registers tests and calibration algorithms - MemorySectionAddresses[LimeLight][0] = 0x0020; - MemorySectionAddresses[LimeLight][1] = 0x002F; - MemorySectionAddresses[EN_DIR][0] = 0x0081; - MemorySectionAddresses[EN_DIR][1] = 0x0081; - MemorySectionAddresses[AFE][0] = 0x0082; - MemorySectionAddresses[AFE][1] = 0x0082; - MemorySectionAddresses[BIAS][0] = 0x0084; - MemorySectionAddresses[BIAS][1] = 0x0084; - MemorySectionAddresses[XBUF][0] = 0x0085; - MemorySectionAddresses[XBUF][1] = 0x0085; - MemorySectionAddresses[CGEN][0] = 0x0086; - MemorySectionAddresses[CGEN][1] = 0x008C; - MemorySectionAddresses[LDO][0] = 0x0092; - MemorySectionAddresses[LDO][1] = 0x00A7; - MemorySectionAddresses[BIST][0] = 0x00A8; - MemorySectionAddresses[BIST][1] = 0x00AC; - MemorySectionAddresses[CDS][0] = 0x00AD; - MemorySectionAddresses[CDS][1] = 0x00AE; - MemorySectionAddresses[TRF][0] = 0x0100; - MemorySectionAddresses[TRF][1] = 0x0104; - MemorySectionAddresses[TBB][0] = 0x0105; - MemorySectionAddresses[TBB][1] = 0x010A; - MemorySectionAddresses[RFE][0] = 0x010C; - MemorySectionAddresses[RFE][1] = 0x0114; - MemorySectionAddresses[RBB][0] = 0x0115; - MemorySectionAddresses[RBB][1] = 0x011A; - MemorySectionAddresses[SX][0] = 0x011C; - MemorySectionAddresses[SX][1] = 0x0124; - MemorySectionAddresses[TxTSP][0] = 0x0200; - MemorySectionAddresses[TxTSP][1] = 0x020C; - MemorySectionAddresses[TxNCO][0] = 0x0240; - MemorySectionAddresses[TxNCO][1] = 0x0261; - MemorySectionAddresses[TxGFIR1][0] = 0x0280; - MemorySectionAddresses[TxGFIR1][1] = 0x02A7; - MemorySectionAddresses[TxGFIR2][0] = 0x02C0; - MemorySectionAddresses[TxGFIR2][1] = 0x02E7; - MemorySectionAddresses[TxGFIR3a][0] = 0x0300; - MemorySectionAddresses[TxGFIR3a][1] = 0x0327; - MemorySectionAddresses[TxGFIR3b][0] = 0x0340; - MemorySectionAddresses[TxGFIR3b][1] = 0x0367; - MemorySectionAddresses[TxGFIR3c][0] = 0x0380; - MemorySectionAddresses[TxGFIR3c][1] = 0x03A7; - MemorySectionAddresses[RxTSP][0] = 0x0400; - MemorySectionAddresses[RxTSP][1] = 0x040F; - MemorySectionAddresses[RxNCO][0] = 0x0440; - MemorySectionAddresses[RxNCO][1] = 0x0461; - MemorySectionAddresses[RxGFIR1][0] = 0x0480; - MemorySectionAddresses[RxGFIR1][1] = 0x04A7; - MemorySectionAddresses[RxGFIR2][0] = 0x04C0; - MemorySectionAddresses[RxGFIR2][1] = 0x04E7; - MemorySectionAddresses[RxGFIR3a][0] = 0x0500; - MemorySectionAddresses[RxGFIR3a][1] = 0x0527; - MemorySectionAddresses[RxGFIR3b][0] = 0x0540; - MemorySectionAddresses[RxGFIR3b][1] = 0x0567; - MemorySectionAddresses[RxGFIR3c][0] = 0x0580; - MemorySectionAddresses[RxGFIR3c][1] = 0x05A7; - - mRegistersMap->InitializeDefaultValues(LMS7parameterList); -} - -LMS7002M::~LMS7002M() -{ - -} - -/** @brief Sends reset signal to chip, after reset enables B channel controls - @return 0-success, other-failure -*/ -liblms7_status LMS7002M::ResetChip() -{ - if (controlPort == NULL) - return LIBLMS7_NO_CONNECTION_MANAGER; - if (controlPort->IsOpen() == false) - return LIBLMS7_NOT_CONNECTED; - - LMScomms::GenericPacket pkt; - pkt.cmd = CMD_LMS7002_RST; - pkt.outBuffer.push_back(LMS_RST_PULSE); - controlPort->TransferPacket(pkt); - if (pkt.status == STATUS_COMPLETED_CMD) - { - Modify_SPI_Reg_bits(LMS7param(MIMO_SISO), 0); //enable B channel after reset - return LIBLMS7_SUCCESS; - } - else - return LIBLMS7_FAILURE; -} - -liblms7_status LMS7002M::LoadConfigLegacyFile(const char* filename) -{ - ifstream f(filename); - if (f.good() == false) //file not found - { - f.close(); - return LIBLMS7_FILE_NOT_FOUND; - } - f.close(); - uint16_t addr = 0; - uint16_t value = 0; - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); //remember used channel - liblms7_status status; - typedef INI<string, string, string> ini_t; - ini_t parser(filename, true); - if (parser.select("FILE INFO") == false) - return LIBLMS7_FILE_INVALID_FORMAT; - - string type = ""; - type = parser.get("type", "undefined"); - stringstream ss; - if (type.find("LMS7002 configuration") == string::npos) - { - ss << "File " << filename << " not recognized" << endl; - return LIBLMS7_FILE_INVALID_FORMAT; - } - - int fileVersion = 0; - fileVersion = parser.get("version", 0); - - vector<uint16_t> addrToWrite; - vector<uint16_t> dataToWrite; - if (fileVersion == 1) - { - if (parser.select("Reference clocks")) - { - mRefClkSXR_MHz = parser.get("SXR reference frequency MHz", 30.72); - mRefClkSXT_MHz = parser.get("SXT reference frequency MHz", 30.72); - } - - if (parser.select("LMS7002 registers ch.A") == true) - { - ini_t::sectionsit_t section = parser.sections.find("LMS7002 registers ch.A"); - - uint16_t x0020_value = 0; - Modify_SPI_Reg_bits(LMS7param(MAC), 1); //select A channel - for (ini_t::keysit_t pairs = section->second->begin(); pairs != section->second->end(); pairs++) - { - sscanf(pairs->first.c_str(), "%hx", &addr); - sscanf(pairs->second.c_str(), "%hx", &value); - if (addr == LMS7param(MAC).address) //skip register containing channel selection - { - x0020_value = value; - continue; - } - addrToWrite.push_back(addr); - dataToWrite.push_back(value); - } - status = SPI_write_batch(&addrToWrite[0], &dataToWrite[0], addrToWrite.size()); - if (status != LIBLMS7_SUCCESS && status != LIBLMS7_NOT_CONNECTED) - return status; - - //parse FCW or PHO - if (parser.select("NCO Rx ch.A") == true) - { - char varname[64]; - int mode = Get_SPI_Reg_bits(LMS7param(MODE_RX)); - if (mode == 0) //FCW - { - for (int i = 0; i < 16; ++i) - { - sprintf(varname, "FCW%02i", i); - SetNCOFrequency(LMS7002M::Rx, i, parser.get(varname, 0.0)); - } - } - else - { - for (int i = 0; i < 16; ++i) - { - sprintf(varname, "PHO%02i", i); - SetNCOPhaseOffset(LMS7002M::Rx, i, parser.get(varname, 0.0)); - } - } - } - if (parser.select("NCO Tx ch.A") == true) - { - char varname[64]; - int mode = Get_SPI_Reg_bits(LMS7param(MODE_TX)); - if (mode == 0) //FCW - { - for (int i = 0; i < 16; ++i) - { - sprintf(varname, "FCW%02i", i); - SetNCOFrequency(LMS7002M::Tx, i, parser.get(varname, 0.0)); - } - } - else - { - for (int i = 0; i < 16; ++i) - { - sprintf(varname, "PHO%02i", i); - SetNCOPhaseOffset(LMS7002M::Tx, i, parser.get(varname, 0.0)); - } - } - } - status = SPI_write(0x0020, x0020_value); - if (status != LIBLMS7_SUCCESS && status != LIBLMS7_NOT_CONNECTED) - return status; - } - - Modify_SPI_Reg_bits(LMS7param(MAC), 2); - - if (parser.select("LMS7002 registers ch.B") == true) - { - addrToWrite.clear(); - dataToWrite.clear(); - ini_t::sectionsit_t section = parser.sections.find("LMS7002 registers ch.B"); - for (ini_t::keysit_t pairs = section->second->begin(); pairs != section->second->end(); pairs++) - { - sscanf(pairs->first.c_str(), "%hx", &addr); - sscanf(pairs->second.c_str(), "%hx", &value); - addrToWrite.push_back(addr); - dataToWrite.push_back(value); - } - Modify_SPI_Reg_bits(LMS7param(MAC), 2); //select B channel - status = SPI_write_batch(&addrToWrite[0], &dataToWrite[0], addrToWrite.size()); - if (status != LIBLMS7_SUCCESS && status != LIBLMS7_NOT_CONNECTED) - return status; - - //parse FCW or PHO - if (parser.select("NCO Rx ch.B") == true) - { - char varname[64]; - int mode = Get_SPI_Reg_bits(LMS7param(MODE_RX)); - if (mode == 0) //FCW - { - for (int i = 0; i < 16; ++i) - { - sprintf(varname, "FCW%02i", i); - SetNCOFrequency(LMS7002M::Rx, i, parser.get(varname, 0.0)); - } - } - else - { - for (int i = 0; i < 16; ++i) - { - sprintf(varname, "PHO%02i", i); - SetNCOPhaseOffset(LMS7002M::Rx, i, parser.get(varname, 0.0)); - } - } - } - if (parser.select("NCO Tx ch.A") == true) - { - char varname[64]; - int mode = Get_SPI_Reg_bits(LMS7param(MODE_TX)); - if (mode == 0) //FCW - { - for (int i = 0; i < 16; ++i) - { - sprintf(varname, "FCW%02i", i); - SetNCOFrequency(LMS7002M::Tx, i, parser.get(varname, 0.0)); - } - } - else - { - for (int i = 0; i < 16; ++i) - { - sprintf(varname, "PHO%02i", i); - SetNCOPhaseOffset(LMS7002M::Tx, i, parser.get(varname, 0.0)); - } - } - } - } - Modify_SPI_Reg_bits(LMS7param(MAC), ch); - return LIBLMS7_SUCCESS; - } - else - return LIBLMS7_FILE_INVALID_FORMAT; - return LIBLMS7_FAILURE; -} - -/** @brief Reads configuration file and uploads registers to chip - @param filename Configuration source file - @return 0-success, other-failure -*/ -liblms7_status LMS7002M::LoadConfig(const char* filename) -{ - ifstream f(filename); - if (f.good() == false) //file not found - { - f.close(); - return LIBLMS7_FILE_NOT_FOUND; - } - f.close(); - uint16_t addr = 0; - uint16_t value = 0; - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); //remember used channel - - liblms7_status status; - typedef INI<string, string, string> ini_t; - ini_t parser(filename, true); - if (parser.select("file_info") == false) - { - //try loading as legacy format - status = LoadConfigLegacyFile(filename); - Modify_SPI_Reg_bits(MAC, 1); - return status; - } - string type = ""; - type = parser.get("type", "undefined"); - stringstream ss; - if (type.find("lms7002m_minimal_config") == string::npos) - { - ss << "File " << filename << " not recognized" << endl; - return LIBLMS7_FILE_INVALID_FORMAT; - } - - int fileVersion = 0; - fileVersion = parser.get("version", 0); - - vector<uint16_t> addrToWrite; - vector<uint16_t> dataToWrite; - - if (fileVersion == 1) - { - if(parser.select("lms7002_registers_a") == true) - { - ini_t::sectionsit_t section = parser.sections.find("lms7002_registers_a"); - - uint16_t x0020_value = 0; - Modify_SPI_Reg_bits(LMS7param(MAC), 1); //select A channel - for (ini_t::keysit_t pairs = section->second->begin(); pairs != section->second->end(); pairs++) - { - sscanf(pairs->first.c_str(), "%hx", &addr); - sscanf(pairs->second.c_str(), "%hx", &value); - if (addr == LMS7param(MAC).address) //skip register containing channel selection - { - x0020_value = value; - continue; - } - addrToWrite.push_back(addr); - dataToWrite.push_back(value); - } - status = SPI_write_batch(&addrToWrite[0], &dataToWrite[0], addrToWrite.size()); - if (status != LIBLMS7_SUCCESS && status != LIBLMS7_NOT_CONNECTED) - return status; - status = SPI_write(0x0020, x0020_value); - if (status != LIBLMS7_SUCCESS && status != LIBLMS7_NOT_CONNECTED) - return status; - Modify_SPI_Reg_bits(LMS7param(MAC), 2); - if (status != LIBLMS7_SUCCESS && status != LIBLMS7_NOT_CONNECTED) - return status; - } - - if (parser.select("lms7002_registers_b") == true) - { - addrToWrite.clear(); - dataToWrite.clear(); - ini_t::sectionsit_t section = parser.sections.find("lms7002_registers_b"); - for (ini_t::keysit_t pairs = section->second->begin(); pairs != section->second->end(); pairs++) - { - sscanf(pairs->first.c_str(), "%hx", &addr); - sscanf(pairs->second.c_str(), "%hx", &value); - addrToWrite.push_back(addr); - dataToWrite.push_back(value); - } - Modify_SPI_Reg_bits(LMS7param(MAC), 2); //select B channel - status = SPI_write_batch(&addrToWrite[0], &dataToWrite[0], addrToWrite.size()); - if (status != LIBLMS7_SUCCESS && status != LIBLMS7_NOT_CONNECTED) - return status; - } - Modify_SPI_Reg_bits(LMS7param(MAC), ch); - - parser.select("reference_clocks"); - mRefClkSXR_MHz = parser.get("sxr_ref_clk_mhz", 30.72); - mRefClkSXT_MHz = parser.get("sxt_ref_clk_mhz", 30.72); - } - - Modify_SPI_Reg_bits(MAC, 1); - if (controlPort == NULL) - return LIBLMS7_NO_CONNECTION_MANAGER; - if (controlPort->IsOpen() == false) - return LIBLMS7_NOT_CONNECTED; - return LIBLMS7_SUCCESS; -} - -/** @brief Reads all registers from chip and saves to file - @param filename destination filename - @return 0-success, other failure -*/ -liblms7_status LMS7002M::SaveConfig(const char* filename) -{ - liblms7_status status; - typedef INI<> ini_t; - ini_t parser(filename, true); - parser.create("file_info"); - parser.set("type", "lms7002m_minimal_config"); - parser.set("version", 1); - - char addr[80]; - char value[80]; - - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); - - vector<uint16_t> addrToRead; - for (uint8_t i = 0; i < MEMORY_SECTIONS_COUNT; ++i) - for (uint16_t addr = MemorySectionAddresses[i][0]; addr <= MemorySectionAddresses[i][1]; ++addr) - addrToRead.push_back(addr); - vector<uint16_t> dataReceived; - dataReceived.resize(addrToRead.size(), 0); - - parser.create("lms7002_registers_a"); - Modify_SPI_Reg_bits(LMS7param(MAC), 1); - for (uint16_t i = 0; i < addrToRead.size(); ++i) - { - dataReceived[i] = Get_SPI_Reg_bits(addrToRead[i], 15, 0, false); - sprintf(addr, "0x%04X", addrToRead[i]); - sprintf(value, "0x%04X", dataReceived[i]); - parser.set(addr, value); - } - - parser.create("lms7002_registers_b"); - addrToRead.clear(); //add only B channel addresses - for (uint8_t i = 0; i < MEMORY_SECTIONS_COUNT; ++i) - for (uint16_t addr = MemorySectionAddresses[i][0]; addr <= MemorySectionAddresses[i][1]; ++addr) - if (addr >= 0x0100) - addrToRead.push_back(addr); - - Modify_SPI_Reg_bits(LMS7param(MAC), 2); - for (uint16_t i = 0; i < addrToRead.size(); ++i) - { - dataReceived[i] = Get_SPI_Reg_bits(addrToRead[i], 15, 0, false); - sprintf(addr, "0x%04X", addrToRead[i]); - sprintf(value, "0x%04X", dataReceived[i]); - parser.set(addr, value); - } - - Modify_SPI_Reg_bits(LMS7param(MAC), ch); //retore previously used channel - - parser.create("reference_clocks"); - parser.set("sxt_ref_clk_mhz", mRefClkSXT_MHz); - parser.set("sxr_ref_clk_mhz", mRefClkSXR_MHz); - parser.save(filename); - return LIBLMS7_SUCCESS; -} - -/** @brief Returns reference clock in MHz used for SXT or SXR - @param Tx transmitter or receiver selection -*/ -float_type LMS7002M::GetReferenceClk_SX(bool tx) -{ - return tx ? mRefClkSXT_MHz : mRefClkSXR_MHz; -} - -/** @return Current CLKGEN frequency in MHz - Returned frequency depends on reference clock used for Receiver -*/ -float_type LMS7002M::GetFrequencyCGEN_MHz() -{ - float_type dMul = (mRefClkSXR_MHz/2.0)/(Get_SPI_Reg_bits(LMS7param(DIV_OUTCH_CGEN))+1); //DIV_OUTCH_CGEN - uint16_t gINT = Get_SPI_Reg_bits(0x0088, 13, 0); //read whole register to reduce SPI transfers - uint32_t gFRAC = ((gINT & 0xF) * 65536) | Get_SPI_Reg_bits(0x0087, 15, 0); - return dMul * (((gINT>>4) + 1 + gFRAC/1048576.0)); -} - -/** @brief Returns TSP reference frequency - @param tx TxTSP or RxTSP selection - @return TSP reference frequency in MHz -*/ -float_type LMS7002M::GetReferenceClk_TSP_MHz(bool tx) -{ - float_type cgenFreq = GetFrequencyCGEN_MHz(); - float_type clklfreq = cgenFreq/pow(2.0, Get_SPI_Reg_bits(LMS7param(CLKH_OV_CLKL_CGEN))); - if(Get_SPI_Reg_bits(LMS7param(EN_ADCCLKH_CLKGN)) == 0) - return tx ? clklfreq : cgenFreq/4.0; - else - return tx ? cgenFreq : clklfreq/4.0; -} - -/** @brief Sets CLKGEN frequency, calculations use receiver'r reference clock - @param freq_MHz desired frequency in MHz - @return 0-succes, other-cannot deliver desired frequency -*/ -liblms7_status LMS7002M::SetFrequencyCGEN(const float_type freq_MHz) -{ - float_type dFvco; - float_type dFrac; - int16_t iHdiv; - - //VCO frequency selection according to F_CLKH - iHdiv = (int16_t)((gCGEN_VCO_frequencies[1]/ 2) / freq_MHz) - 1; - dFvco = 2*(iHdiv+1) * freq_MHz; - - //Integer division - uint16_t gINT = (uint16_t)(dFvco/mRefClkSXR_MHz - 1); - - //Fractional division - dFrac = dFvco/mRefClkSXR_MHz - (uint32_t)(dFvco/mRefClkSXR_MHz); - uint32_t gFRAC = (uint32_t)(dFrac * 1048576); - - Modify_SPI_Reg_bits(LMS7param(INT_SDM_CGEN), gINT); //INT_SDM_CGEN - Modify_SPI_Reg_bits(0x0087, 15, 0, gFRAC&0xFFFF); //INT_SDM_CGEN[15:0] - Modify_SPI_Reg_bits(0x0088, 3, 0, gFRAC>>16); //INT_SDM_CGEN[19:16] - Modify_SPI_Reg_bits(LMS7param(DIV_OUTCH_CGEN), iHdiv); //DIV_OUTCH_CGEN - - return TuneVCO(VCO_CGEN); -} - -/** @brief Performs VCO tuning operations for CLKGEN, SXR, SXT modules - @param module module selection for tuning 0-cgen, 1-SXR, 2-SXT - @return 0-success, other-failure -*/ -liblms7_status LMS7002M::TuneVCO(VCO_Module module) // 0-cgen, 1-SXR, 2-SXT -{ - if (controlPort == NULL) - return LIBLMS7_NO_CONNECTION_MANAGER; - if (controlPort->IsOpen() == false) - return LIBLMS7_NOT_CONNECTED; - int8_t i; - uint8_t cmphl; //comparators - int16_t csw_lowest = -1; - uint16_t addrVCOpd; // VCO power down address - uint16_t addrCSW_VCO; - uint16_t addrCMP; //comparator address - uint8_t lsb; //SWC lsb index - uint8_t msb; //SWC msb index - - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); //remember used channel - - if(module != VCO_CGEN) //set addresses to SX module - { - Modify_SPI_Reg_bits(LMS7param(MAC), module); - addrVCOpd = LMS7param(PD_VCO).address; - addrCSW_VCO = LMS7param(CSW_VCO).address; - lsb = LMS7param(CSW_VCO).lsb; - msb = LMS7param(CSW_VCO).msb; - addrCMP = LMS7param(VCO_CMPHO).address; - } - else //set addresses to CGEN module - { - addrVCOpd = LMS7param(PD_VCO_CGEN).address; - addrCSW_VCO = LMS7param(CSW_VCO_CGEN).address; - lsb = LMS7param(CSW_VCO_CGEN).lsb; - msb = LMS7param(CSW_VCO_CGEN).msb; - addrCMP = LMS7param(VCO_CMPHO_CGEN).address; - } - // Initialization - Modify_SPI_Reg_bits (addrVCOpd, 2, 1, 0); //activate VCO and comparator - if (Get_SPI_Reg_bits(addrVCOpd, 2, 1) != 0) - return LIBLMS7_VCO_IS_POWERED_DOWN; - if(module == VCO_CGEN) - Modify_SPI_Reg_bits(LMS7param(SPDUP_VCO_CGEN), 1); //SHORT_NOISEFIL=1 SPDUP_VCO_ Short the noise filter resistor to speed up the settling time - else - Modify_SPI_Reg_bits(LMS7param(SPDUP_VCO), 1); //SHORT_NOISEFIL=1 SPDUP_VCO_ Short the noise filter resistor to speed up the settling time - Modify_SPI_Reg_bits (addrCSW_VCO , msb, lsb , 0); //Set SWC_VCO<7:0>=<00000000> - - i=7; - while(i>=0) - { - Modify_SPI_Reg_bits (addrCSW_VCO, lsb + i, lsb + i, 1); // CSW_VCO<i>=1 - std::this_thread::sleep_for(std::chrono::milliseconds(5)); - cmphl = (uint8_t)Get_SPI_Reg_bits(addrCMP, 13, 12); - if ( (cmphl&0x01) == 1) // reduce CSW - Modify_SPI_Reg_bits (addrCSW_VCO, lsb + i, lsb + i, 0); // CSW_VCO<i>=0 - if( cmphl == 2 && csw_lowest < 0) - csw_lowest = Get_SPI_Reg_bits(addrCSW_VCO, msb, lsb); - --i; - } - if(csw_lowest >= 0) - { - uint16_t csw_highest = Get_SPI_Reg_bits(addrCSW_VCO, msb, lsb); - if(csw_lowest == csw_highest) - { - while(csw_lowest>=0) - { - Modify_SPI_Reg_bits(addrCSW_VCO, msb, lsb, csw_lowest); - std::this_thread::sleep_for(std::chrono::milliseconds(5)); - if(Get_SPI_Reg_bits(addrCMP, 13, 12) == 0) - { - ++csw_lowest; - break; - } - else - --csw_lowest; - } - } - Modify_SPI_Reg_bits(addrCSW_VCO, msb, lsb, csw_lowest+(csw_highest-csw_lowest)/2); - } - if (module == VCO_CGEN) - Modify_SPI_Reg_bits(LMS7param(SPDUP_VCO_CGEN), 0); //SHORT_NOISEFIL=1 SPDUP_VCO_ Short the noise filter resistor to speed up the settling time - else - Modify_SPI_Reg_bits(LMS7param(SPDUP_VCO), 0); //SHORT_NOISEFIL=1 SPDUP_VCO_ Short the noise filter resistor to speed up the settling time - cmphl = (uint8_t)Get_SPI_Reg_bits(addrCMP, 13, 12); - Modify_SPI_Reg_bits(LMS7param(MAC), ch); //restore previously used channel - if(cmphl == 2) - return LIBLMS7_SUCCESS; - else - return LIBLMS7_FAILURE; -} - -/** @brief Returns given parameter value from chip register - @param param LMS7002M control parameter - @param fromChip read directly from chip - @return parameter value -*/ -uint16_t LMS7002M::Get_SPI_Reg_bits(const LMS7Parameter ¶m, bool fromChip) -{ - return Get_SPI_Reg_bits(param.address, param.msb, param.lsb, fromChip); -} - -/** @brief Returns given parameter value from chip register - @param address register address - @param msb most significant bit index - @param lsb least significant bit index - @param fromChip read directly from chip - @return register bits from selected interval, shifted to right by lsb bits -*/ -uint16_t LMS7002M::Get_SPI_Reg_bits(uint16_t address, uint8_t msb, uint8_t lsb, bool fromChip) -{ - return (SPI_read(address, fromChip) & (~(~0<<(msb+1)))) >> lsb; //shift bits to LSB -} - -/** @brief Change given parameter value - @param param LMS7002M control parameter - @param fromChip read initial value directly from chip - @param value new parameter value -*/ -liblms7_status LMS7002M::Modify_SPI_Reg_bits(const LMS7Parameter ¶m, const uint16_t value, bool fromChip) -{ - return Modify_SPI_Reg_bits(param.address, param.msb, param.lsb, value, fromChip); -} - -/** @brief Change given parameter value - @param address register address - @param value new bits value, the value is shifted left by lsb bits - @param fromChip read initial value directly from chip -*/ -liblms7_status LMS7002M::Modify_SPI_Reg_bits(const uint16_t address, const uint8_t msb, const uint8_t lsb, const uint16_t value, bool fromChip) -{ - uint16_t spiDataReg = SPI_read(address, fromChip); //read current SPI reg data - uint16_t spiMask = (~(~0 << (msb - lsb + 1))) << (lsb); // creates bit mask - spiDataReg = (spiDataReg & (~spiMask)) | ((value << lsb) & spiMask);//clear bits - return SPI_write(address, spiDataReg); //write modified data back to SPI reg -} - -/** @brief Modifies given registers with values applied using masks - @param addr array of register addresses - @param masks array of applied masks - @param values array of values to be written - @param start starting index of given arrays - @param stop end index of given arrays -*/ -liblms7_status LMS7002M::Modify_SPI_Reg_mask(const uint16_t *addr, const uint16_t *masks, const uint16_t *values, uint8_t start, uint8_t stop) -{ - liblms7_status status; - uint16_t reg_data; - vector<uint16_t> addresses; - vector<uint16_t> data; - while (start <= stop) - { - reg_data = SPI_read(addr[start], true, &status); //read current SPI reg data - reg_data &= ~masks[start];//clear bits - reg_data |= (values[start] & masks[start]); - addresses.push_back(addr[start]); - data.push_back(reg_data); - ++start; - } - if (status != LIBLMS7_SUCCESS) - return status; - SPI_write_batch(&addresses[0], &data[0], addresses.size()); - return status; -} - -/** @brief Sets SX frequency - @param Tx Rx/Tx module selection - @param freq_MHz desired frequency in MHz - @param refClk_MHz reference clock in MHz - @return 0-success, other-cannot deliver requested frequency -*/ -liblms7_status LMS7002M::SetFrequencySX(bool tx, float_type freq_MHz, float_type refClk_MHz) -{ - if (controlPort == NULL) - return LIBLMS7_NO_CONNECTION_MANAGER; - if (controlPort->IsOpen() == false) - return LIBLMS7_NOT_CONNECTED; - const uint8_t sxVCO_N = 2; //number of entries in VCO frequencies - const float_type m_dThrF = 5500; //threshold to enable additional divider - uint8_t ch; //remember used channel - float_type VCOfreq; - int8_t div_loch; - int8_t sel_vco; - bool canDeliverFrequency = false; - uint16_t integerPart; - uint32_t fractionalPart; - int8_t i; - - //find required VCO frequency - for (div_loch = 6; div_loch >= 0; --div_loch) - { - VCOfreq = (1 << (div_loch + 1)) * freq_MHz; - if ((VCOfreq >= gVCO_frequency_table[0][0]) && (VCOfreq <= gVCO_frequency_table[2][sxVCO_N - 1])) - { - canDeliverFrequency = true; - break; - } - } - if (canDeliverFrequency == false) - return LIBLMS7_CANNOT_DELIVER_FREQUENCY; - - integerPart = (uint16_t)(VCOfreq / (refClk_MHz * (1 + (VCOfreq > m_dThrF))) - 4); - fractionalPart = (uint32_t)((VCOfreq / (refClk_MHz * (1 + (VCOfreq > m_dThrF))) - (uint32_t)(VCOfreq / (refClk_MHz * (1 + (VCOfreq > m_dThrF))))) * 1048576); - - ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); - Modify_SPI_Reg_bits(LMS7param(MAC), tx + 1); - Modify_SPI_Reg_bits(LMS7param(INT_SDM), integerPart); //INT_SDM - Modify_SPI_Reg_bits(0x011D, 15, 0, fractionalPart & 0xFFFF); //FRAC_SDM[15:0] - Modify_SPI_Reg_bits(0x011E, 3, 0, (fractionalPart >> 16)); //FRAC_SDM[19:16] - Modify_SPI_Reg_bits(LMS7param(DIV_LOCH), div_loch); //DIV_LOCH - Modify_SPI_Reg_bits(LMS7param(EN_DIV2_DIVPROG), (VCOfreq > m_dThrF)); //EN_DIV2_DIVPROG - - //find which VCO supports required frequency - Modify_SPI_Reg_bits(LMS7param(PD_VCO), 0); // - Modify_SPI_Reg_bits(LMS7param(PD_VCO_COMP), 0); // - int cswBackup = Get_SPI_Reg_bits(LMS7param(CSW_VCO)); //remember to restore previous tune value - canDeliverFrequency = false; - int tuneScore[] = { -128, -128, -128 }; //best is closest to 0 - for (sel_vco = 0; sel_vco < 3; ++sel_vco) - { - Modify_SPI_Reg_bits(LMS7param(SEL_VCO), sel_vco); - liblms7_status status = TuneVCO(tx ? VCO_SXT : VCO_SXR); - int csw = Get_SPI_Reg_bits(LMS7param(CSW_VCO), true); - tuneScore[sel_vco] = -128 + csw; - if (status == LIBLMS7_SUCCESS) - canDeliverFrequency = true; - } - if (abs(tuneScore[0]) < abs(tuneScore[1])) - { - if (abs(tuneScore[0]) < abs(tuneScore[2])) - sel_vco = 0; - else - sel_vco = 2; - } - else - { - if (abs(tuneScore[1]) < abs(tuneScore[2])) - sel_vco = 1; - else - sel_vco = 2; - } - Modify_SPI_Reg_bits(LMS7param(SEL_VCO), sel_vco); - Modify_SPI_Reg_bits(LMS7param(CSW_VCO), cswBackup); - Modify_SPI_Reg_bits(LMS7param(MAC), ch); //restore used channel - if (tx) - mRefClkSXT_MHz = refClk_MHz; - else - mRefClkSXR_MHz = refClk_MHz; - if (canDeliverFrequency == false) - return LIBLMS7_CANNOT_DELIVER_FREQUENCY; - return TuneVCO( tx ? VCO_SXT : VCO_SXR); //Rx-1, Tx-2 -} - -/** @brief Returns currently set SXR/SXT frequency - @return SX frequency MHz -*/ -float_type LMS7002M::GetFrequencySX_MHz(bool Tx, float_type refClk_MHz) -{ - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); //remember previously used channel - float_type dMul; - if(Tx) - Modify_SPI_Reg_bits(LMS7param(MAC), 2); // Rx mac = 1, Tx max = 2 - else - Modify_SPI_Reg_bits(LMS7param(MAC), 1); // Rx mac = 1, Tx max = 2 - uint16_t gINT = Get_SPI_Reg_bits(0x011E, 13, 0); // read whole register to reduce SPI transfers - uint32_t gFRAC = ((gINT&0xF) * 65536) | Get_SPI_Reg_bits(0x011D, 15, 0); - - dMul = (float_type)refClk_MHz / (1 << (Get_SPI_Reg_bits(LMS7param(DIV_LOCH)) + 1)); - //Calculate real frequency according to the calculated parameters - dMul = dMul * ((gINT >> 4) + 4 + (float_type)gFRAC / 1048576.0) * (Get_SPI_Reg_bits(LMS7param(EN_DIV2_DIVPROG)) + 1); - Modify_SPI_Reg_bits(LMS7param(MAC), ch); //restore used channel - return dMul; -} - -/** @brief Loads given DC_REG values into registers - @param tx TxTSP or RxTSP selection - @param I DC_REG I value - @param Q DC_REG Q value -*/ -liblms7_status LMS7002M::LoadDC_REG_IQ(bool tx, int16_t I, int16_t Q) -{ - if(tx) - { - Modify_SPI_Reg_bits(LMS7param(DC_REG_TXTSP), I); - Modify_SPI_Reg_bits(LMS7param(TSGDCLDI_TXTSP), 0); - Modify_SPI_Reg_bits(LMS7param(TSGDCLDI_TXTSP), 1); - Modify_SPI_Reg_bits(LMS7param(TSGDCLDI_TXTSP), 0); - Modify_SPI_Reg_bits(LMS7param(DC_REG_TXTSP), Q); - Modify_SPI_Reg_bits(LMS7param(TSGDCLDQ_TXTSP), 0); - Modify_SPI_Reg_bits(LMS7param(TSGDCLDQ_TXTSP), 1); - Modify_SPI_Reg_bits(LMS7param(TSGDCLDQ_TXTSP), 0); - Modify_SPI_Reg_bits(LMS7param(DC_BYP_TXTSP), 0); //DC_BYP - } - else - { - Modify_SPI_Reg_bits(LMS7param(DC_REG_RXTSP), I); - Modify_SPI_Reg_bits(LMS7param(TSGDCLDI_RXTSP), 0); - Modify_SPI_Reg_bits(LMS7param(TSGDCLDI_RXTSP), 1); - Modify_SPI_Reg_bits(LMS7param(TSGDCLDI_RXTSP), 0); - Modify_SPI_Reg_bits(LMS7param(DC_REG_TXTSP), Q); - Modify_SPI_Reg_bits(LMS7param(TSGDCLDQ_RXTSP), 0); - Modify_SPI_Reg_bits(LMS7param(TSGDCLDQ_RXTSP), 1); - Modify_SPI_Reg_bits(LMS7param(TSGDCLDQ_RXTSP), 0); - Modify_SPI_Reg_bits(LMS7param(DC_BYP_RXTSP), 0); //DC_BYP - } - return LIBLMS7_SUCCESS; -} - -/** @brief Sets chosen NCO's frequency - @param tx transmitter or receiver selection - @param index NCO index from 0 to 15 - @param freq_MHz desired NCO frequency - @return 0-success, other-failure -*/ -liblms7_status LMS7002M::SetNCOFrequency(bool tx, uint8_t index, float_type freq_MHz) -{ - if(index > 15) - return LIBLMS7_INDEX_OUT_OF_RANGE; - float_type refClk_MHz = GetReferenceClk_TSP_MHz(tx); - uint16_t addr = tx ? 0x0240 : 0x0440; - uint32_t fcw = (uint32_t)((freq_MHz/refClk_MHz)*4294967296); - SPI_write(addr+2+index*2, (fcw >> 16)); //NCO frequency control word register MSB part. - SPI_write(addr+3+index*2, fcw); //NCO frequency control word register LSB part. - return LIBLMS7_SUCCESS; -} - -/** @brief Returns chosen NCO's frequency in MHz - @param tx transmitter or receiver selection - @param index NCO index from 0 to 15 - @param fromChip read frequency directly from chip or local registers - @return NCO frequency in MHz -*/ -float_type LMS7002M::GetNCOFrequency_MHz(bool tx, uint8_t index, const float_type refClk_MHz, bool fromChip) -{ - if(index > 15) - return LIBLMS7_INDEX_OUT_OF_RANGE; - uint16_t addr = tx ? 0x0240 : 0x0440; - uint32_t fcw = 0; - fcw |= SPI_read(addr + 2 + index * 2, fromChip) << 16; //NCO frequency control word register MSB part. - fcw |= SPI_read(addr + 3 + index * 2, fromChip); //NCO frequency control word register LSB part. - return refClk_MHz*(fcw/4294967296.0); -} - -/** @brief Sets chosen NCO phase offset angle when memory table MODE is 0 -@param tx transmitter or receiver selection -@param angle_deg phase offset angle in degrees -@return 0-success, other-failure -*/ -liblms7_status LMS7002M::SetNCOPhaseOffsetForMode0(bool tx, float_type angle_deg) -{ - uint16_t addr = tx ? 0x0241 : 0x0441; - uint16_t pho = (uint16_t)(65536 * (angle_deg / 360 )); - SPI_write(addr, pho); - return LIBLMS7_SUCCESS; -} - -/** @brief Sets chosen NCO's phase offset angle - @param tx transmitter or receiver selection - @param index PHO index from 0 to 15 - @param angle_deg phase offset angle in degrees - @return 0-success, other-failure -*/ -liblms7_status LMS7002M::SetNCOPhaseOffset(bool tx, uint8_t index, float_type angle_deg) -{ - if(index > 15) - return LIBLMS7_INDEX_OUT_OF_RANGE; - uint16_t addr = tx ? 0x0244 : 0x0444; - uint16_t pho = (uint16_t)(65536*(angle_deg / 360)); - SPI_write(addr+index, pho); - return LIBLMS7_SUCCESS; -} - -/** @brief Returns chosen NCO's phase offset angle in radians - @param tx transmitter or receiver selection - @param index PHO index from 0 to 15 - @return phase offset angle in degrees -*/ -float_type LMS7002M::GetNCOPhaseOffset_Deg(bool tx, uint8_t index) -{ - uint16_t addr = tx ? 0x0244 : 0x0444; - uint16_t pho = SPI_read(addr+index); - float_type angle = 360*pho/65536.0; - return angle; -} - -/** @brief Uploads given FIR coefficients to chip - @param tx Transmitter or receiver selection - @param GFIR_index GIR index from 0 to 2 - @param coef array of coefficients - @param coefCount number of coefficients - @return 0-success, other-failure - - This function does not change GFIR*_L or GFIR*_N parameters, they have to be set manually -*/ -liblms7_status LMS7002M::SetGFIRCoefficients(bool tx, uint8_t GFIR_index, const int16_t *coef, uint8_t coefCount) -{ - uint8_t index; - uint8_t coefLimit; - uint16_t startAddr; - if (GFIR_index == 0) - startAddr = 0x0280; - else if (GFIR_index == 1) - startAddr = 0x02C0; - else - startAddr = 0x0300; - - if (tx == false) - startAddr += 0x0200; - if (GFIR_index < 2) - coefLimit = 40; - else - coefLimit = 120; - if (coefCount > coefLimit) - return LIBLMS7_TOO_MANY_VALUES; - vector<uint16_t> addresses; - for (index = 0; index < coefCount; ++index) - addresses.push_back(startAddr + index + 24 * (index / 40)); - SPI_write_batch(&addresses[0], (uint16_t*)coef, coefCount); - return LIBLMS7_SUCCESS; -} - -/** @brief Returns currently loaded FIR coefficients - @param tx Transmitter or receiver selection - @param GFIR_index GIR index from 0 to 2 - @param coef array of returned coefficients - @param coefCount number of coefficients to read - @return 0-success, other-failure -*/ -liblms7_status LMS7002M::GetGFIRCoefficients(bool tx, uint8_t GFIR_index, int16_t *coef, uint8_t coefCount) -{ - liblms7_status status = LIBLMS7_FAILURE; - uint8_t index; - uint8_t coefLimit; - uint16_t startAddr; - if(GFIR_index == 0) - startAddr = 0x0280; - else if (GFIR_index == 1) - startAddr = 0x02C0; - else - startAddr = 0x0300; - - if (tx == false) - startAddr += 0x0200; - if (GFIR_index < 2) - coefLimit = 40; - else - coefLimit = 120; - if (coefCount > coefLimit) - return LIBLMS7_TOO_MANY_VALUES; - - std::vector<uint16_t> addresses; - for (index = 0; index < coefCount; ++index) - addresses.push_back(startAddr + index + 24 * (index / 40)); - uint16_t spiData[120]; - memset(spiData, 0, 120 * sizeof(uint16_t)); - if (controlPort->IsOpen()) - { - status = SPI_read_batch(&addresses[0], spiData, coefCount); - for (index = 0; index < coefCount; ++index) - coef[index] = spiData[index]; - } - else - { - const int channel = Get_SPI_Reg_bits(LMS7param(MAC), false) > 1 ? 1 : 0; - for (index = 0; index < coefCount; ++index) - coef[index] = mRegistersMap->GetValue(channel, addresses[index]); - status = LIBLMS7_SUCCESS; - } - - return status; -} - -/** @brief Write given data value to whole register - @param address SPI address - @param data new register value - @return 0-succes, other-failure -*/ -liblms7_status LMS7002M::SPI_write(uint16_t address, uint16_t data) -{ - if (controlPort == NULL) - return LIBLMS7_NO_CONNECTION_MANAGER; - - if ((mRegistersMap->GetValue(0, LMS7param(MAC).address) & 0x0003) > 1 && address >= 0x0100) - mRegistersMap->SetValue(1, address, data); - else - mRegistersMap->SetValue(0, address, data); - - if (controlPort->IsOpen() == false) - return LIBLMS7_NOT_CONNECTED; - - LMScomms::GenericPacket pkt; - pkt.cmd = CMD_LMS7002_WR; - pkt.outBuffer.push_back(address >> 8); - pkt.outBuffer.push_back(address & 0xFF); - pkt.outBuffer.push_back(data >> 8); - pkt.outBuffer.push_back(data & 0xFF); - controlPort->TransferPacket(pkt); - if (pkt.status == STATUS_COMPLETED_CMD) - return LIBLMS7_SUCCESS; - else - return LIBLMS7_FAILURE; -} - -/** @brief Reads whole register value from given address - @param address SPI address - @param status operation status(optional) - @param fromChip read value directly from chip - @return register value -*/ -uint16_t LMS7002M::SPI_read(uint16_t address, bool fromChip, liblms7_status *status) -{ - if (controlPort == NULL) - { - if (status) - *status = LIBLMS7_NO_CONNECTION_MANAGER; - } - if (controlPort->IsOpen() == false || fromChip == false) - { - if ((mRegistersMap->GetValue(0, LMS7param(MAC).address) & 0x0003) > 1 && address >= 0x0100) - return mRegistersMap->GetValue(1, address); - else - return mRegistersMap->GetValue(0, address); - } - - LMScomms::GenericPacket pkt; - pkt.cmd = CMD_LMS7002_RD; - pkt.outBuffer.push_back(address >> 8); - pkt.outBuffer.push_back(address & 0xFF); - if (controlPort->TransferPacket(pkt) == LMScomms::TRANSFER_SUCCESS) - { - if (status) - *status = (pkt.status == STATUS_COMPLETED_CMD ? LIBLMS7_SUCCESS : LIBLMS7_FAILURE); - return (pkt.inBuffer[2] << 8) | pkt.inBuffer[3]; - } - else - return 0; -} - -/** @brief Batches multiple register writes into least ammount of transactions - @param spiAddr spi register addresses to be written - @param spiData registers data to be written - @param cnt number of registers to write - @return 0-success, other-failure -*/ -liblms7_status LMS7002M::SPI_write_batch(const uint16_t* spiAddr, const uint16_t* spiData, uint16_t cnt) -{ - LMScomms::GenericPacket pkt; - pkt.cmd = CMD_LMS7002_WR; - uint32_t index = 0; - for (uint32_t i = 0; i < cnt; ++i) - { - pkt.outBuffer.push_back(spiAddr[i] >> 8); - pkt.outBuffer.push_back(spiAddr[i] & 0xFF); - pkt.outBuffer.push_back(spiData[i] >> 8); - pkt.outBuffer.push_back(spiData[i] & 0xFF); - - if ((mRegistersMap->GetValue(0, LMS7param(MAC).address) & 0x0003) > 1) - mRegistersMap->SetValue(1, spiAddr[i], spiData[i]); - else - mRegistersMap->SetValue(0, spiAddr[i], spiData[i]); - - } - if (controlPort == NULL) - return LIBLMS7_NO_CONNECTION_MANAGER; - if (controlPort->IsOpen() == false) - return LIBLMS7_NOT_CONNECTED; - - controlPort->TransferPacket(pkt); - if (pkt.status == STATUS_COMPLETED_CMD) - return LIBLMS7_SUCCESS; - else - return LIBLMS7_FAILURE; -} - -/** @brief Batches multiple register reads into least amount of transactions - @param spiAddr SPI addresses to read - @param spiData array for read data - @param cnt number of registers to read - @return 0-success, other-failure -*/ -liblms7_status LMS7002M::SPI_read_batch(const uint16_t* spiAddr, uint16_t* spiData, uint16_t cnt) -{ - LMScomms::GenericPacket pkt; - pkt.cmd = CMD_LMS7002_RD; - uint32_t index = 0; - for (uint32_t i = 0; i < cnt; ++i) - { - pkt.outBuffer.push_back(spiAddr[i] >> 8); - pkt.outBuffer.push_back(spiAddr[i] & 0xFF); - } - if (controlPort == NULL) - return LIBLMS7_NO_CONNECTION_MANAGER; - if (controlPort->IsOpen() == false) - return LIBLMS7_NOT_CONNECTED; - - LMScomms::TransferStatus status = controlPort->TransferPacket(pkt); - if (status != LMScomms::TRANSFER_SUCCESS) - return LIBLMS7_FAILURE; - - for (uint32_t i = 0; i < cnt; ++i) - { - spiData[i] = (pkt.inBuffer[2*sizeof(uint16_t)*i + 2] << 8) | pkt.inBuffer[2*sizeof(uint16_t)*i + 3]; - if ((mRegistersMap->GetValue(0, LMS7param(MAC).address) & 0x0003) > 1) - mRegistersMap->SetValue(1, spiAddr[i], spiData[i]); - else - mRegistersMap->SetValue(0, spiAddr[i], spiData[i]); - } - return pkt.status == STATUS_COMPLETED_CMD ? LIBLMS7_SUCCESS : LIBLMS7_FAILURE; - /* - for(int i=0; i<cnt; ++i) - { - spiData[i] = Get_SPI_Reg_bits(spiAddr[i], 15, 0); - if ((mRegistersMap->GetValue(0, LMS7param(MAC).address) & 0x0003) > 1) - mRegistersMap->SetValue(1, spiAddr[i], spiData[i]); - else - mRegistersMap->SetValue(0, spiAddr[i], spiData[i]); - } - return LIBLMS7_SUCCESS;*/ -} - -/** @brief Performs registers test by writing known data and confirming readback data - @return 0-registers test passed, other-failure -*/ -liblms7_status LMS7002M::RegistersTest() -{ - char chex[16]; - if (controlPort == NULL) - return LIBLMS7_NO_CONNECTION_MANAGER; - if (controlPort->IsOpen() == false) - return LIBLMS7_NOT_CONNECTED; - - liblms7_status status; - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); - - //backup both channel data for restoration after test - vector<uint16_t> ch1Addresses; - for (uint8_t i = 0; i < MEMORY_SECTIONS_COUNT; ++i) - for (uint16_t addr = MemorySectionAddresses[i][0]; addr <= MemorySectionAddresses[i][1]; ++addr) - ch1Addresses.push_back(addr); - vector<uint16_t> ch1Data; - ch1Data.resize(ch1Addresses.size(), 0); - - //backup A channel - Modify_SPI_Reg_bits(LMS7param(MAC), 1); - status = SPI_read_batch(&ch1Addresses[0], &ch1Data[0], ch1Addresses.size()); - if (status != LIBLMS7_SUCCESS) - return status; - - vector<uint16_t> ch2Addresses; - for (uint8_t i = 0; i < MEMORY_SECTIONS_COUNT; ++i) - for (uint16_t addr = MemorySectionAddresses[i][0]; addr <= MemorySectionAddresses[i][1]; ++addr) - if (addr >= 0x0100) - ch2Addresses.push_back(addr); - vector<uint16_t> ch2Data; - ch2Data.resize(ch2Addresses.size(), 0); - - Modify_SPI_Reg_bits(LMS7param(MAC), 2); - status = SPI_read_batch(&ch2Addresses[0], &ch2Data[0], ch2Addresses.size()); - if (status != LIBLMS7_SUCCESS) - return status; - - //test registers - ResetChip(); - Modify_SPI_Reg_bits(LMS7param(MIMO_SISO), 0); - Modify_SPI_Reg_bits(LMS7param(PD_RX_AFE2), 0); - Modify_SPI_Reg_bits(LMS7param(PD_TX_AFE2), 0); - Modify_SPI_Reg_bits(LMS7param(MAC), 1); - - stringstream ss; - - //check single channel memory sections - vector<MemorySection> modulesToCheck = { AFE, BIAS, XBUF, CGEN, LDO, BIST, CDS, TRF, TBB, RFE, RBB, SX, - TxTSP, TxNCO, TxGFIR1, TxGFIR2, TxGFIR3a, TxGFIR3b, TxGFIR3c, - RxTSP, RxNCO, RxGFIR1, RxGFIR2, RxGFIR3a, RxGFIR3b, RxGFIR3c, LimeLight }; - const char* moduleNames[] = { "AFE", "BIAS", "XBUF", "CGEN", "LDO", "BIST", "CDS", "TRF", "TBB", "RFE", "RBB", "SX", - "TxTSP", "TxNCO", "TxGFIR1", "TxGFIR2", "TxGFIR3a", "TxGFIR3b", "TxGFIR3c", - "RxTSP", "RxNCO", "RxGFIR1", "RxGFIR2", "RxGFIR3a", "RxGFIR3b", "RxGFIR3c", "LimeLight" }; - - const uint16_t patterns[] = { 0xAAAA, 0x5555 }; - const uint8_t patternsCount = 2; - - bool allTestSuccess = true; - - for (unsigned i = 0; i < modulesToCheck.size(); ++i) - { - bool moduleTestsSuccess = true; - uint16_t startAddr = MemorySectionAddresses[modulesToCheck[i]][0]; - uint16_t endAddr = MemorySectionAddresses[modulesToCheck[i]][1]; - uint8_t channelCount = startAddr >= 0x0100 ? 2 : 1; - for (int cc = 1; cc <= channelCount; ++cc) - { - Modify_SPI_Reg_bits(LMS7param(MAC), cc); - sprintf(chex, "0x%04X", startAddr); - ss << moduleNames[i] << " [" << chex << ":"; - sprintf(chex, "0x%04X", endAddr); - ss << chex << "]"; - if (startAddr >= 0x0100) - ss << " Ch." << (cc == 1 ? "A" : "B"); - ss << endl; - for (uint8_t p = 0; p < patternsCount; ++p) - moduleTestsSuccess &= RegistersTestInterval(startAddr, endAddr, patterns[p], ss) == LIBLMS7_SUCCESS; - } - allTestSuccess &= moduleTestsSuccess; - } - - //restore register values - Modify_SPI_Reg_bits(LMS7param(MAC), 1); - SPI_write_batch(&ch1Addresses[0], &ch1Data[0], ch1Addresses.size()); - Modify_SPI_Reg_bits(LMS7param(MAC), 2); - SPI_write_batch(&ch2Addresses[0], &ch2Data[0], ch2Addresses.size()); - Modify_SPI_Reg_bits(LMS7param(MAC), ch); - - fstream fout; - fout.open("registersTest.txt", ios::out); - fout << ss.str() << endl; - fout.close(); - - return allTestSuccess ? LIBLMS7_SUCCESS : LIBLMS7_FAILURE; -} - -/** @brief Performs registers test for given address interval by writing given pattern data - @param startAddr first register address - @param endAddr last reigster address - @param pattern data to be written into registers - @return 0-register test passed, other-failure -*/ -liblms7_status LMS7002M::RegistersTestInterval(uint16_t startAddr, uint16_t endAddr, uint16_t pattern, stringstream &ss) -{ - vector<uint16_t> addrToWrite; - vector<uint16_t> dataToWrite; - vector<uint16_t> dataReceived; - vector<uint16_t> dataMasks; - - for (uint16_t addr = startAddr; addr <= endAddr; ++addr) - { - addrToWrite.push_back(addr); - } - dataMasks.resize(addrToWrite.size(), 0xFFFF); - for (uint16_t j = 0; j < sizeof(readOnlyRegisters)/sizeof(uint16_t); ++j) - for (uint16_t k = 0; k < addrToWrite.size(); ++k) - if (readOnlyRegisters[j] == addrToWrite[k]) - { - dataMasks[k] = readOnlyRegistersMasks[j]; - break; - } - - dataToWrite.clear(); - dataReceived.clear(); - for (uint16_t j = 0; j < addrToWrite.size(); ++j) - { - if (addrToWrite[j] == 0x00A6) - dataToWrite.push_back(0x1 | pattern & ~0x2); - else if (addrToWrite[j] == 0x0084) - dataToWrite.push_back(pattern & ~0x19); - else - dataToWrite.push_back(pattern & dataMasks[j]); - } - dataReceived.resize(addrToWrite.size(), 0); - liblms7_status status; - status = SPI_write_batch(&addrToWrite[0], &dataToWrite[0], addrToWrite.size()); - if (status != LIBLMS7_SUCCESS) - return status; - status = SPI_read_batch(&addrToWrite[0], &dataReceived[0], addrToWrite.size()); - if (status != LIBLMS7_SUCCESS) - return status; - bool registersMatch = true; - char ctemp[16]; - for (uint16_t j = 0; j < dataToWrite.size(); ++j) - { - if (dataToWrite[j] != (dataReceived[j] & dataMasks[j])) - { - registersMatch = false; - sprintf(ctemp, "0x%04X", addrToWrite[j]); - ss << "\t" << ctemp << "(wr/rd): "; - sprintf(ctemp, "0x%04X", dataToWrite[j]); - ss << ctemp << "/"; - sprintf(ctemp, "0x%04X", dataReceived[j]); - ss << ctemp << endl; - } - } - if (registersMatch) - { - sprintf(ctemp, "0x%04X", pattern); - ss << "\tRegisters OK (" << ctemp << ")\n"; - } - return registersMatch ? LIBLMS7_SUCCESS : LIBLMS7_FAILURE; -} - -/** @brief Parameters setup instructions for Tx calibration - @return 0-success, other-failure -*/ -liblms7_status LMS7002M::CalibrateTxSetup(float_type bandwidth_MHz) -{ - //Stage 2 - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); - uint8_t sel_band1_trf = (uint8_t)Get_SPI_Reg_bits(LMS7param(SEL_BAND1_TRF)); - uint8_t sel_band2_trf = (uint8_t)Get_SPI_Reg_bits(LMS7param(SEL_BAND2_TRF)); - - //rfe - //reset RFE to defaults - SetDefaults(RFE); - if (sel_band1_trf == 1) - Modify_SPI_Reg_bits(LMS7param(SEL_PATH_RFE), 3); //SEL_PATH_RFE 3 - else if (sel_band2_trf == 1) - Modify_SPI_Reg_bits(LMS7param(SEL_PATH_RFE), 2); - else - return LIBLMS7_BAND_NOT_SELECTED; - - if (ch == 2) - Modify_SPI_Reg_bits(LMS7param(EN_NEXTRX_RFE), 1); // EN_NEXTTX_RFE 1 - - Modify_SPI_Reg_bits(LMS7param(G_RXLOOPB_RFE), 8); //G_RXLOOPB_RFE 8 - Modify_SPI_Reg_bits(0x010C, 4, 3, 0); //PD_MXLOBUF_RFE 0, PD_QGEN_RFE 0 - Modify_SPI_Reg_bits(LMS7param(CCOMP_TIA_RFE), 10); //CCOMP_TIA_RFE 10 - Modify_SPI_Reg_bits(LMS7param(CFB_TIA_RFE), 2600); //CFB_TIA_RFE 2600 - Modify_SPI_Reg_bits(LMS7param(ICT_LODC_RFE), 31); //ICT_LODC_RFE 31 - Modify_SPI_Reg_bits(LMS7param(PD_LNA_RFE), 1); - - //RBB - //reset RBB to defaults - SetDefaults(RBB); - Modify_SPI_Reg_bits(LMS7param(PD_LPFL_RBB), 0); //PD_LPFL_RBB 0 - Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFL_RBB), 0); //RCC_CTL_LPFL_RBB 0 - Modify_SPI_Reg_bits(LMS7param(C_CTL_LPFL_RBB), 1500); //C_CTL_LPFL_RBB 1500 - Modify_SPI_Reg_bits(LMS7param(G_PGA_RBB), 22); //G_PGA_RBB 22 - - //TRF - //reset TRF to defaults - //SetDefaults(TRF); - Modify_SPI_Reg_bits(LMS7param(L_LOOPB_TXPAD_TRF), 0); //L_LOOPB_TXPAD_TRF 0 - Modify_SPI_Reg_bits(LMS7param(EN_LOOPB_TXPAD_TRF), 1); //EN_LOOPB_TXPAD_TRF 1 - Modify_SPI_Reg_bits(LMS7param(EN_G_TRF), 0); //EN_G_TRF 0 - if (ch == 2) - Modify_SPI_Reg_bits(LMS7param(EN_NEXTTX_TRF), 1); //EN_NEXTTX_TRF 1 - Modify_SPI_Reg_bits(LMS7param(LOSS_LIN_TXPAD_TRF), 0); //LOSS_LIN_TXPAD_TRF 5 - Modify_SPI_Reg_bits(LMS7param(LOSS_MAIN_TXPAD_TRF), 0); //LOSS_MAIN_TXPAD_TRF 5 - - //TBB - //reset TBB to defaults - /*SetDefaults(TBB); - Modify_SPI_Reg_bits(LMS7param(CG_IAMP_TBB), 9); //CG_IAMP_TBB 9 - Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_FRP_TBB), 1); //ICT_IAMP_FRP_TBB 1 - Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_GG_FRP_TBB), 6); //ICT_IAMP_GG_FRP_TBB 6 - Modify_SPI_Reg_bits(LMS7param(RCAL_LPFH_TBB), 125); //RCAL_LPFH_TBB 0 - */ - //AFE - //reset AFE to defaults - uint8_t isel_dac_afe =(uint8_t) Get_SPI_Reg_bits(LMS7param(ISEL_DAC_AFE)); - SetDefaults(AFE); - Modify_SPI_Reg_bits(LMS7param(PD_RX_AFE2), 0); //PD_RX_AFE2 0 - Modify_SPI_Reg_bits(LMS7param(ISEL_DAC_AFE), isel_dac_afe); - - if (ch == 2) - Modify_SPI_Reg_bits(LMS7param(PD_TX_AFE2), 0); - //BIAS - uint16_t backup = Get_SPI_Reg_bits(LMS7param(RP_CALIB_BIAS)); - SetDefaults(BIAS); - Modify_SPI_Reg_bits(LMS7param(RP_CALIB_BIAS), backup); //RP_CALIB_BIAS - - //XBUF - Modify_SPI_Reg_bits(0x0085, 2, 0, 1); //PD_XBUF_RX 0, PD_XBUF_TX 0, EN_G_XBUF 1 - - //CGEN - //reset CGEN to defaults - SetDefaults(CGEN); - //power up VCO - Modify_SPI_Reg_bits(LMS7param(PD_VCO_CGEN), 0); - - if (SetFrequencyCGEN(122.88) != LIBLMS7_SUCCESS) - return LIBLMS7_FAILURE; - if (TuneVCO(VCO_CGEN) != LIBLMS7_SUCCESS) - return LIBLMS7_FAILURE; - - //SXR - Modify_SPI_Reg_bits(LMS7param(MAC), 1); - SetDefaults(SX); - float_type SXTfreqMHz = GetFrequencySX_MHz(Tx, mRefClkSXT_MHz); - - float_type SXRfreqMHz = SXTfreqMHz - bandwidth_MHz / 4 - 1; - if (SetFrequencySX(Rx, SXRfreqMHz, mRefClkSXR_MHz) != LIBLMS7_SUCCESS) - return LIBLMS7_FAILURE; - if (TuneVCO(VCO_SXR) != LIBLMS7_SUCCESS) - return LIBLMS7_FAILURE; - - //SXT - Modify_SPI_Reg_bits(LMS7param(MAC), 2); - Modify_SPI_Reg_bits(LMS7param(PD_LOCH_T2RBUF), 1); //PD_LOCH_T2RBUF 1 - if (SetFrequencySX(Tx, SXTfreqMHz, mRefClkSXT_MHz) != LIBLMS7_SUCCESS) - return LIBLMS7_FAILURE; - if (TuneVCO(VCO_SXT) != LIBLMS7_SUCCESS) - return LIBLMS7_FAILURE; - Modify_SPI_Reg_bits(LMS7param(MAC), ch); - - //TXTSP - SetDefaults(TxTSP); - Modify_SPI_Reg_bits(0x0200, 3, 2, 0x3); //TSGMODE 1, INSEL 1 - Modify_SPI_Reg_bits(0x0208, 6, 4, 0x7); //GFIR3_BYP 1, GFIR2_BYP 1, GFIR1_BYP 1 - LoadDC_REG_IQ(Tx, (int16_t)0x7FFF, (int16_t)0x8000); - Modify_SPI_Reg_bits(LMS7param(MAC), ch); - Modify_SPI_Reg_bits(0x0440, 4, 0, 0); //TX SEL[3:0] = 0 & MODE = 0 - - float_type offset = 0.2; - if (bandwidth_MHz == 8) - { - //SXR - Modify_SPI_Reg_bits(LMS7param(MAC), 1); - SetDefaults(SX); - float_type SXTfreqMHz = GetFrequencySX_MHz(Tx, mRefClkSXT_MHz); - - float_type sxrFreq = SXTfreqMHz - bandwidth_MHz / 4 - 1 - offset; - if (SetFrequencySX(Rx, sxrFreq, mRefClkSXR_MHz) != LIBLMS7_SUCCESS) - return LIBLMS7_FAILURE; - SetNCOFrequency(Tx, 0, bandwidth_MHz / 4 + offset); - } - else - SetNCOFrequency(Tx, 0, bandwidth_MHz / 4); - - //RXTSP - SetDefaults(RxTSP); - Modify_SPI_Reg_bits(LMS7param(AGC_MODE_RXTSP), 1); //AGC_MODE 1 - Modify_SPI_Reg_bits(0x040C, 7, 0, 0xBF); - Modify_SPI_Reg_bits(LMS7param(CAPSEL), 0); - Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), 0); //Decimation HBD ratio - Modify_SPI_Reg_bits(LMS7param(AGC_AVG_RXTSP), 0x7); //agc_avg iq corr - - return LIBLMS7_SUCCESS; -} - -/** @brief Flips the CAPTURE bit and returns digital RSSI value -*/ -uint32_t LMS7002M::GetRSSI() -{ - Modify_SPI_Reg_bits(LMS7param(CAPTURE), 0); - Modify_SPI_Reg_bits(LMS7param(CAPTURE), 1); - return (Get_SPI_Reg_bits(0x040F, 15, 0) << 2) | Get_SPI_Reg_bits(0x040E, 1, 0); -} - -/** @brief Sets Rx Dc offsets by converting two's complementary numbers to sign and magnitude -*/ -void LMS7002M::SetRxDCOFF(int8_t offsetI, int8_t offsetQ) -{ - uint16_t valToSend = 0; - if (offsetI < 0) - valToSend |= 0x40; - valToSend |= labs(offsetI); - valToSend = valToSend << 7; - if (offsetQ < 0) - valToSend |= 0x40; - valToSend |= labs(offsetQ); - SPI_write(0x010E, valToSend); -} - -/** @brief Calibrates Transmitter. DC correction, IQ gains, IQ phase correction - @return 0-success, other-failure -*/ -liblms7_status LMS7002M::CalibrateTx(float_type bandwidth_MHz) -{ - liblms7_status status; - Log("Tx calibration started", LOG_INFO); - BackupAllRegisters(); - - int16_t iqcorr = 0; - uint16_t gcorrq = 0; - uint16_t gcorri = 0; - uint16_t dccorri; - uint16_t dccorrq; - int16_t corrI = 0; - int16_t corrQ = 0; - uint32_t minRSSI_i; - uint32_t minRSSI_q; - uint32_t minRSSI_iq; - int16_t i; - int16_t offsetI = 0; - int16_t offsetQ = 0; - - const short firCoefs[] = - { - -2531, - -517, - 2708, - 188, - -3059, - 216, - 3569, - -770, - -4199, - 1541, - 4886, - -2577, - -5552, - 3909, - 6108, - -5537, - -6457, - 7440, - 6507, - -9566, - -6174, - 11845, - 5391, - -14179, - -4110, - 16457, - 2310, - -18561, - 0, - 20369, - -2780, - -21752, - 5963, - 22610, - -9456, - -22859, - 13127, - 22444, - -16854, - -21319, - 20489, - 19492, - -23883, - -17002, - 26881, - 13902, - -29372, - -10313, - 31226, - 6345, - -32380, - -2141, - 32767, - -2141, - -32380, - 6345, - 31226, - -10313, - -29372, - 13902, - 26881, - -17002, - -23883, - 19492, - 20489, - -21319, - -16854, - 22444, - 13127, - -22859, - -9456, - 22610, - 5963, - -21752, - -2780, - 20369, - 0, - -18561, - 2310, - 16457, - -4110, - -14179, - 5391, - 11845, - -6174, - -9566, - 6507, - 7440, - -6457, - -5537, - 6108, - 3909, - -5552, - -2577, - 4886, - 1541, - -4199, - -770, - 3569, - 216, - -3059, - 188, - 2708, - -517, - -2531 - }; - - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); - //Stage 1 - uint8_t sel_band1_trf = (uint8_t)Get_SPI_Reg_bits(LMS7param(SEL_BAND1_TRF)); - uint8_t sel_band2_trf = (uint8_t)Get_SPI_Reg_bits(LMS7param(SEL_BAND2_TRF)); - Log("Setup stage", LOG_INFO); - status = CalibrateTxSetup(bandwidth_MHz); - if (status != LIBLMS7_SUCCESS) - goto TxCalibrationEnd; //go to ending stage to restore registers - - //Stage 3 - //Calibrate Rx DC - Log("Rx DC calibration", LOG_INFO); - { - uint16_t requiredRegs[] = { 0x0400, 0x040A, 0x010D, 0x040C }; - uint16_t requiredMask[] = { 0x6000, 0x3007, 0x0040, 0x00FF }; //CAPSEL, AGC_MODE, AGC_AVG, EN_DCOFF, Bypasses - uint16_t requiredValue[] = { 0x0000, 0x1007, 0x0040, 0x00BD }; - - Modify_SPI_Reg_mask(requiredRegs, requiredMask, requiredValue, 0, 3); - } - - for (i = 0; i<6; ++i) - { - FindMinRSSI(LMS7param(DCOFFI_RFE), offsetI, &offsetI, 3, 2, 32 >> i); - FindMinRSSI(LMS7param(DCOFFQ_RFE), offsetQ, &offsetQ, 3, 2, 32 >> i); - } - SetRxDCOFF((int8_t)offsetI, (int8_t)offsetQ); - Modify_SPI_Reg_bits(LMS7param(DC_BYP_RXTSP), 0); // DC_BYP 0 - - sel_band1_trf = (uint8_t)Get_SPI_Reg_bits(LMS7param(SEL_BAND1_TRF)); - sel_band2_trf = (uint8_t)Get_SPI_Reg_bits(LMS7param(SEL_BAND2_TRF)); - //B - Modify_SPI_Reg_bits(0x0100, 0, 0, 1); //EN_G_TRF 1 - if (sel_band1_trf == 1) - { - Modify_SPI_Reg_bits(LMS7param(PD_RLOOPB_1_RFE), 0); //PD_RLOOPB_1_RFE 0 - Modify_SPI_Reg_bits(LMS7param(EN_INSHSW_LB1_RFE), 0); //EN_INSHSW_LB1 0 - } - if (sel_band2_trf == 1) - { - Modify_SPI_Reg_bits(LMS7param(PD_RLOOPB_2_RFE), 0); //PD_RLOOPB_2_RFE 0 - Modify_SPI_Reg_bits(LMS7param(EN_INSHSW_LB2_RFE), 0); // EN_INSHSW_LB2 0 - } - FixRXSaturation(); - - Modify_SPI_Reg_bits(LMS7param(GFIR3_BYP_RXTSP), 0); //GFIR3_BYP 0 - Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), 2); - Modify_SPI_Reg_bits(LMS7param(GFIR3_L_RXTSP), 7); - Modify_SPI_Reg_bits(LMS7param(GFIR3_N_RXTSP), 7); - - SetGFIRCoefficients(Rx, 2, firCoefs, sizeof(firCoefs) / sizeof(int16_t)); - - Log("IQ correction stage", LOG_INFO); - Modify_SPI_Reg_bits(LMS7param(GCORRI_TXTSP), 2047); - Modify_SPI_Reg_bits(LMS7param(GCORRQ_TXTSP), 2047); - - Modify_SPI_Reg_bits(LMS7param(IQCORR_TXTSP), 0); - - Log("I gain", LOG_INFO); - minRSSI_i = FindMinRSSI_Gain(LMS7param(GCORRI_TXTSP), &gcorri); - - Modify_SPI_Reg_bits(LMS7param(GCORRI_TXTSP), 2047); - Modify_SPI_Reg_bits(LMS7param(GCORRQ_TXTSP), 2047); - - Log("Q gain", LOG_INFO); - minRSSI_q = FindMinRSSI_Gain(LMS7param(GCORRQ_TXTSP), &gcorrq); - - if (minRSSI_i < minRSSI_q) - gcorrq = 2047; - else - gcorri = 2047; - - Modify_SPI_Reg_bits(LMS7param(GCORRI_TXTSP), gcorri); - Modify_SPI_Reg_bits(LMS7param(GCORRQ_TXTSP), gcorrq); - - Log("Phase", LOG_INFO); - iqcorr = 0; - for (uint8_t i = 0; i<9; ++i) - minRSSI_iq = FindMinRSSI(LMS7param(IQCORR_TXTSP), iqcorr, &iqcorr, 3, 1, 256 >> i); - - Modify_SPI_Reg_bits(LMS7param(GCORRI_TXTSP), gcorri); - Modify_SPI_Reg_bits(LMS7param(GCORRQ_TXTSP), gcorrq); - Modify_SPI_Reg_bits(LMS7param(IQCORR_TXTSP), iqcorr); - - Modify_SPI_Reg_bits(LMS7param(MAC), 1); - status = SetFrequencySX(Rx, GetFrequencySX_MHz(Tx, mRefClkSXT_MHz)-1, mRefClkSXR_MHz); - if (status != LIBLMS7_SUCCESS) - goto TxCalibrationEnd; //go to ending stage to restore registers - - //C - Modify_SPI_Reg_bits(LMS7param(MAC), ch); - Modify_SPI_Reg_bits(LMS7param(AGC_MODE_RXTSP), 1); - Modify_SPI_Reg_bits(LMS7param(CAPSEL), 0); - - Log("TX LO calibration", LOG_INFO); - - //Calibrate Tx DC - for (uint8_t i = 0; i<7; ++i) - { - FindMinRSSI(LMS7param(DCCORRI_TXTSP), corrI, &corrI, 3, 1, 64 >> i); - FindMinRSSI(LMS7param(DCCORRQ_TXTSP), corrQ, &corrQ, 3, 1, 64 >> i); - } - - dccorri = Get_SPI_Reg_bits(LMS7param(DCCORRI_TXTSP)); - dccorrq = Get_SPI_Reg_bits(LMS7param(DCCORRQ_TXTSP)); - - // Stage 4 -TxCalibrationEnd: - Log("Restoring registers state", LOG_INFO); - Modify_SPI_Reg_bits(LMS7param(MAC), ch); - RestoreAllRegisters(); - if (status != LIBLMS7_SUCCESS) - { - Log("Tx calibration failed", LOG_WARNING); - return status; - } - - Modify_SPI_Reg_bits(LMS7param(MAC), ch); - Modify_SPI_Reg_bits(LMS7param(DCCORRI_TXTSP), dccorri); - Modify_SPI_Reg_bits(LMS7param(DCCORRQ_TXTSP), dccorrq); - Modify_SPI_Reg_bits(LMS7param(GCORRI_TXTSP), gcorri); - Modify_SPI_Reg_bits(LMS7param(GCORRQ_TXTSP), gcorrq); - Modify_SPI_Reg_bits(LMS7param(IQCORR_TXTSP), iqcorr); - - Modify_SPI_Reg_bits(LMS7param(DC_BYP_TXTSP), 0); //DC_BYP - Modify_SPI_Reg_bits(0x0208, 1, 0, 0); //GC_BYP PH_BYP - Log("Tx calibration finished", LOG_INFO); - return LIBLMS7_SUCCESS; -} - -/** @brief Performs Rx DC offsets calibration -*/ -void LMS7002M::CalibrateRxDC_RSSI() -{ - int16_t i; - int16_t offsetI = 0; - int16_t offsetQ = 0; - uint16_t requiredRegs[] = { 0x0400, 0x040A, 0x010D, 0x040C }; - uint16_t requiredMask[] = { 0x6000, 0x3007, 0x0040, 0x00FF }; //CAPSEL, AGC_MODE, AGC_AVG, EN_DCOFF, Bypasses - uint16_t requiredValue[] = { 0x0000, 0x1007, 0x0040, 0x00BD }; - - Modify_SPI_Reg_mask(requiredRegs, requiredMask, requiredValue, 0, 3); - for (i = 0; i<6; ++i) - { - FindMinRSSI(LMS7param(DCOFFI_RFE), offsetI, &offsetI, 3, 2, 32 >> i); - FindMinRSSI(LMS7param(DCOFFQ_RFE), offsetQ, &offsetQ, 3, 2, 32 >> i); - } - Modify_SPI_Reg_bits(LMS7param(EN_DCOFF_RXFE_RFE), 1); - SetRxDCOFF((int8_t)offsetI, (int8_t)offsetQ); - Modify_SPI_Reg_bits(LMS7param(DC_BYP_RXTSP), 0); // DC_BYP 0 -} - -/** @brief Tries to detect and fix gains if Rx is saturated - @return 0-success, other-failure -*/ -liblms7_status LMS7002M::FixRXSaturation() -{ - uint8_t g_rxloopb = 0; - Modify_SPI_Reg_bits(LMS7param(G_RXLOOPB_RFE), g_rxloopb); - Modify_SPI_Reg_bits(LMS7param(L_LOOPB_TXPAD_TRF), 3); - - int8_t lLoopb = 3; - const uint32_t rssi_saturation_level = 0xD000; - while (g_rxloopb < 15) - { - g_rxloopb += 1; - Modify_SPI_Reg_bits(LMS7param(G_RXLOOPB_RFE), g_rxloopb); - Modify_SPI_Reg_bits(LMS7param(L_LOOPB_TXPAD_TRF), 3); - if (GetRSSI() < rssi_saturation_level) - { - for (lLoopb = 3; lLoopb >= 0; --lLoopb) - { - Modify_SPI_Reg_bits(LMS7param(L_LOOPB_TXPAD_TRF), lLoopb); - if (GetRSSI() > rssi_saturation_level) - { - ++lLoopb; - Modify_SPI_Reg_bits(LMS7param(L_LOOPB_TXPAD_TRF), lLoopb); - goto finished; - } - } - } - else - { - g_rxloopb -= 1; - Modify_SPI_Reg_bits(LMS7param(G_RXLOOPB_RFE), g_rxloopb); - break; - } - } -finished: - return GetRSSI() < rssi_saturation_level ? LIBLMS7_SUCCESS : LIBLMS7_FAILURE; -} - -uint32_t LMS7002M::FindMinRSSI(const LMS7Parameter ¶m, const int16_t startValue, int16_t *result, const uint8_t scanWidth, const uint8_t twoCompl, int8_t stepMult) -{ - return FindMinRSSI(param.address, param.msb, param.lsb, startValue, result, scanWidth, twoCompl, stepMult); -} - -/** @brief Searches for minimal RSSI value while changing given address bits -@param addr address of parameter being changed -@param msb most significant bit index -@param lsb least significant bit index -@param startValue initial value where to start search -@param result found minimal parameter value will be set here -@param twoCompl varying parameter value is treated as two's complement -@return found minimal RSSI value -*/ -uint32_t LMS7002M::FindMinRSSI(const uint16_t addr, const uint8_t msb, const uint8_t lsb, const int16_t startValue, int16_t *result, const uint8_t scanWidth, const uint8_t twoCompl, int8_t stepMult) -{ - if (scanWidth < 1) - return ~0; - int minI; - int min = startValue; - int globMin = 0; - uint32_t minRSSI = ~0; - unsigned int *rssiField = new unsigned int[scanWidth]; - int minRSSIindex; - int i; - int maxVal; - int minVal = 0; - if (twoCompl) - { - maxVal = (~(~0x0 << (msb - lsb + 1))) / 2; - minVal = -(~(~0x0 << (msb - lsb + 1))) / 2 - 1; - } - else - maxVal = (~(~0x0 << (msb - lsb + 1))); - - Modify_SPI_Reg_bits(addr, msb, lsb, startValue); - - Modify_SPI_Reg_bits(LMS7param(AGC_MODE_RXTSP), 1); - Modify_SPI_Reg_bits(LMS7param(CAPSEL), 0); - - minRSSIindex = 0; - for (i = 0; i<scanWidth; ++i) - { - short currentValue = min + (i - scanWidth / 2)*stepMult; - if (currentValue < minVal) - currentValue = minVal; - else if (currentValue > maxVal) - currentValue = maxVal; - if (twoCompl == 2) - { - uint16_t valToSend = 0; - if (currentValue < 0) - valToSend |= 0x40; - valToSend |= labs(currentValue); - Modify_SPI_Reg_bits(addr, msb, lsb, valToSend); - } - else - Modify_SPI_Reg_bits(addr, msb, lsb, currentValue); - - rssiField[i] = GetRSSI(); - } - minI = min; - minRSSIindex = 0; - for (i = 0; i<scanWidth; ++i) - if (rssiField[i] < minRSSI) - { - minRSSI = rssiField[i]; - minRSSIindex = i; - minI = min + (i - scanWidth / 2)*stepMult; - if (minI > maxVal) - minI = maxVal; - else if (minI < minVal) - minI = minVal; - globMin = minI; - } - min = minI; - - Modify_SPI_Reg_bits(addr, msb, lsb, min); - - *result = min; - return minRSSI; -} - -/** @brief Sets given module registers to default values - @return 0-success, other-failure -*/ -liblms7_status LMS7002M::SetDefaults(MemorySection module) -{ - liblms7_status status = LIBLMS7_SUCCESS; - vector<uint16_t> addrs; - vector<uint16_t> values; - for(uint32_t address = MemorySectionAddresses[module][0]; address <= MemorySectionAddresses[module][1]; ++address) - { - addrs.push_back(address); - values.push_back(mRegistersMap->GetDefaultValue(address)); - } - status = SPI_write_batch(&addrs[0], &values[0], addrs.size()); - return status; -} - -/** @brief Parameters setup instructions for Rx calibration - @param bandwidth_MHz filter bandwidth in MHz - @return 0-success, other-failure -*/ -liblms7_status LMS7002M::CalibrateRxSetup(float_type bandwidth_MHz) -{ - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); - - //rfe - if (ch == 2) - Modify_SPI_Reg_bits(LMS7param(EN_NEXTTX_TRF), 1); // EN_NEXTTX_TRF 0 - - Modify_SPI_Reg_bits(LMS7param(G_RXLOOPB_RFE), 15); //G_RXLOOPB_RFE 15 - Modify_SPI_Reg_bits(0x010C, 4, 3, 0); //PD_MXLOBUF_RFE 0, PD_QGEN_RFE 0 - Modify_SPI_Reg_bits(0x010C, 1, 1, 0); //PD_TIA 0 - Modify_SPI_Reg_bits(0x010C, 7, 7, 1); //PD_LNA 1 - - Modify_SPI_Reg_bits(0x0110, 4, 0, 31); //ICT_LO_RFE 31 - Modify_SPI_Reg_bits(0x010D, 4, 1, 0xFF); // all short switches are enabled - - //RBB - Modify_SPI_Reg_bits(0x0115, 15, 14, 0); //Loopback switches disable - Modify_SPI_Reg_bits(0x0119, 15, 15, 0); //OSW_PGA 0 - - //TRF - //reset TRF to defaults - SetDefaults(TRF); - Modify_SPI_Reg_bits(LMS7param(L_LOOPB_TXPAD_TRF), 0); //L_LOOPB_TXPAD_TRF 0 - Modify_SPI_Reg_bits(LMS7param(EN_LOOPB_TXPAD_TRF), 1); //EN_LOOPB_TXPAD_TRF 1 - Modify_SPI_Reg_bits(LMS7param(EN_G_TRF), 0); //EN_G_TRF 0 - if (ch == 2) - Modify_SPI_Reg_bits(LMS7param(EN_NEXTTX_TRF), 1); //EN_NEXTTX_TRF 1 - Modify_SPI_Reg_bits(LMS7param(LOSS_LIN_TXPAD_TRF), 0); //LOSS_LIN_TXPAD_TRF 5 - Modify_SPI_Reg_bits(LMS7param(LOSS_MAIN_TXPAD_TRF), 0); //LOSS_MAIN_TXPAD_TRF 5 - - //TBB - //reset TBB to defaults - SetDefaults(TBB); - Modify_SPI_Reg_bits(LMS7param(CG_IAMP_TBB), 9); //CG_IAMP_TBB 9 - Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_FRP_TBB), 1); //ICT_IAMP_FRP_TBB 1 - Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_GG_FRP_TBB), 6); //ICT_IAMP_GG_FRP_TBB 6 - - //AFE - //reset AFE to defaults - SetDefaults(AFE); - Modify_SPI_Reg_bits(LMS7param(PD_RX_AFE2), 0); //PD_RX_AFE2 - if (ch == 2) - { - Modify_SPI_Reg_bits(LMS7param(PD_TX_AFE2), 0); //PD_TX_AFE2 - } - //BIAS - uint16_t backup = Get_SPI_Reg_bits(0x0084, 10, 6); - SetDefaults(BIAS); - Modify_SPI_Reg_bits(0x0084, 10, 6, backup); //RP_CALIB_BIAS - - //XBUF - Modify_SPI_Reg_bits(0x0085, 2, 0, 1); //PD_XBUF_RX 0, PD_XBUF_TX 0, EN_G_XBUF 1 - - //CGEN - //reset CGEN to defaults - SetDefaults(CGEN); - //power up VCO - Modify_SPI_Reg_bits(0x0086, 2, 2, 0); - - liblms7_status status = SetFrequencyCGEN(122.88); - if (status != LIBLMS7_SUCCESS) - return status; - - // //SXR - Modify_SPI_Reg_bits(LMS7param(MAC), 1); - float_type SXRfreqMHz = GetFrequencySX_MHz(Rx, mRefClkSXR_MHz); - - //SXT - Modify_SPI_Reg_bits(LMS7param(MAC), 2); - Modify_SPI_Reg_bits(LMS7param(PD_LOCH_T2RBUF), 1); //PD_LOCH_t2RBUF 1 - status = SetFrequencySX(Tx, SXRfreqMHz + bandwidth_MHz / 4, mRefClkSXT_MHz); - if ( status != LIBLMS7_SUCCESS) - return status; - Modify_SPI_Reg_bits(LMS7param(MAC), ch); - - //TXTSP - SetDefaults(TxTSP); - Modify_SPI_Reg_bits(0x0200, 3, 2, 0x3); //TSGMODE 1, INSEL 1 - //Modify_SPI_Reg_bits(0x0208, 6, 4, 0xFFFF); //GFIR3_BYP 1, GFIR2_BYP 1, GFIR1_BYP 1 - Modify_SPI_Reg_bits(0x0208, 6, 6, 1); //GFIR3_BYP 1, GFIR2_BYP 1, GFIR1_BYP 1 - Modify_SPI_Reg_bits(0x0208, 5, 5, 1); //GFIR3_BYP 1, GFIR2_BYP 1, GFIR1_BYP 1 - Modify_SPI_Reg_bits(0x0208, 4, 4, 1); //GFIR3_BYP 1, GFIR2_BYP 1, GFIR1_BYP 1 - LoadDC_REG_IQ(Tx, (int16_t)0x7FFF, (int16_t)0x8000); - SetNCOFrequency(Tx, 0, 0); - - //RXTSP - SetDefaults(RxTSP); - Modify_SPI_Reg_bits(LMS7param(AGC_MODE_RXTSP), 1); //AGC_MODE 1 - Modify_SPI_Reg_bits(0x040C, 7, 7, 0x1); //CMIX_BYP 1 - Modify_SPI_Reg_bits(0x040C, 6, 6, 0x0); //AGC_BYP 0 - Modify_SPI_Reg_bits(0x040C, 5, 5, 1); // - Modify_SPI_Reg_bits(0x040C, 4, 4, 1); // - Modify_SPI_Reg_bits(0x040C, 3, 3, 1); // - Modify_SPI_Reg_bits(0x040C, 2, 2, 1); // DC_BYP - Modify_SPI_Reg_bits(0x040C, 1, 1, 1); // - Modify_SPI_Reg_bits(0x040C, 0, 0, 1); // - - Modify_SPI_Reg_bits(LMS7param(CAPSEL), 0); - Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), 2); - Modify_SPI_Reg_bits(LMS7param(AGC_AVG_RXTSP), 0x7); //agc_avg iq corr - return LIBLMS7_SUCCESS; -} - -/** @brief Calibrates Receiver. DC offset, IQ gains, IQ phase correction - @return 0-success, other-failure -*/ -liblms7_status LMS7002M::CalibrateRx(float_type bandwidth_MHz) -{ - liblms7_status status; - uint32_t minRSSI_i; - uint32_t minRSSI_q; - int16_t iqcorr_rx = 0; - uint32_t minRSSI_iq; - int16_t dcoffi; - int16_t dcoffq; - - const int16_t firCoefs[] = - { - -2531, - -517, - 2708, - 188, - -3059, - 216, - 3569, - -770, - -4199, - 1541, - 4886, - -2577, - -5552, - 3909, - 6108, - -5537, - -6457, - 7440, - 6507, - -9566, - -6174, - 11845, - 5391, - -14179, - -4110, - 16457, - 2310, - -18561, - 0, - 20369, - -2780, - -21752, - 5963, - 22610, - -9456, - -22859, - 13127, - 22444, - -16854, - -21319, - 20489, - 19492, - -23883, - -17002, - 26881, - 13902, - -29372, - -10313, - 31226, - 6345, - -32380, - -2141, - 32767, - -2141, - -32380, - 6345, - 31226, - -10313, - -29372, - 13902, - 26881, - -17002, - -23883, - 19492, - 20489, - -21319, - -16854, - 22444, - 13127, - -22859, - -9456, - 22610, - 5963, - -21752, - -2780, - 20369, - 0, - -18561, - 2310, - 16457, - -4110, - -14179, - 5391, - 11845, - -6174, - -9566, - 6507, - 7440, - -6457, - -5537, - 6108, - 3909, - -5552, - -2577, - 4886, - 1541, - -4199, - -770, - 3569, - 216, - -3059, - 188, - 2708, - -517, - -2531 - }; - - Log("Rx calibration started", LOG_INFO); - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); - Log("Saving registers state", LOG_INFO); - BackupAllRegisters(); - uint8_t sel_path_rfe = (uint8_t)Get_SPI_Reg_bits(LMS7param(SEL_PATH_RFE)); - if (sel_path_rfe == 1 || sel_path_rfe == 0) - return LIBLMS7_BAD_SEL_PATH; - - Log("Setup stage", LOG_INFO); - status = CalibrateRxSetup(bandwidth_MHz); - if (status != LIBLMS7_SUCCESS) - goto RxCalibrationEndStage; - - Log("Rx DC calibration", LOG_INFO); - CalibrateRxDC_RSSI(); - dcoffi = Get_SPI_Reg_bits(LMS7param(DCOFFI_RFE)); - dcoffq = Get_SPI_Reg_bits(LMS7param(DCOFFQ_RFE)); - Modify_SPI_Reg_bits(LMS7param(EN_G_TRF), 1); - - if (sel_path_rfe == 2) - { - Modify_SPI_Reg_bits(LMS7param(PD_RLOOPB_2_RFE), 0); - Modify_SPI_Reg_bits(0x0103, 10, 10, 1); - Modify_SPI_Reg_bits(0x0103, 11, 11, 0); - Modify_SPI_Reg_bits(LMS7param(EN_INSHSW_LB2_RFE), 0); - } - if (sel_path_rfe == 3) - { - Modify_SPI_Reg_bits(LMS7param(PD_RLOOPB_1_RFE), 0); - Modify_SPI_Reg_bits(0x0103, 11, 11, 1); - Modify_SPI_Reg_bits(0x0103, 10, 10, 0); - Modify_SPI_Reg_bits(LMS7param(EN_INSHSW_LB1_RFE), 0); - } - - Modify_SPI_Reg_bits(0x040C, 7, 7, 0); //CMIX_BYP 0 - Modify_SPI_Reg_bits(0x040C, 2, 0, 0); //DC_BYP 0, GC_BYP 0, PH_BYP 0 - Modify_SPI_Reg_bits(LMS7param(CMIX_GAIN_RXTSP), 1); //CMIX_GAIN 1 +6 db - Modify_SPI_Reg_bits(0x040C, 13, 13, 1); //CMIX_SC 1 - - FixRXSaturation(); - - Modify_SPI_Reg_bits(0x040C, 5, 5, 0); //GFIR3_BYP 0 - Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), 2); - Modify_SPI_Reg_bits(LMS7param(GFIR3_L_RXTSP), 7); - Modify_SPI_Reg_bits(LMS7param(GFIR3_N_RXTSP), 7); - - SetGFIRCoefficients(Rx, 2, firCoefs, sizeof(firCoefs) / sizeof(int16_t)); - - SetNCOFrequency(Rx, 0, bandwidth_MHz / 4 + 1); - Modify_SPI_Reg_bits(LMS7param(GCORRI_RXTSP), 2047); - Modify_SPI_Reg_bits(LMS7param(GCORRQ_RXTSP), 2047); - - Log("IQ correction stage", LOG_INFO); - iqcorr_rx = 0; - for (int i = 0; i<9; ++i) - minRSSI_iq = FindMinRSSI(LMS7param(IQCORR_RXTSP), iqcorr_rx, &iqcorr_rx, 3, 1, 256 >> i); - Modify_SPI_Reg_bits(LMS7param(IQCORR_RXTSP), iqcorr_rx); - - uint16_t mingcorri; - Log("I gain", LOG_INFO); - minRSSI_i = FindMinRSSI_Gain(LMS7param(GCORRI_RXTSP), &mingcorri); - - Modify_SPI_Reg_bits(LMS7param(GCORRI_RXTSP), 2047); - Modify_SPI_Reg_bits(LMS7param(GCORRQ_RXTSP), 2047); - - Log("Q gain", LOG_INFO); - uint16_t mingcorrq; - minRSSI_q = FindMinRSSI_Gain(LMS7param(GCORRQ_RXTSP), &mingcorrq); - - if (minRSSI_i < minRSSI_q) - mingcorrq = 2047; - else - mingcorri = 2047; - - Modify_SPI_Reg_bits(LMS7param(GCORRI_RXTSP), mingcorri); - Modify_SPI_Reg_bits(LMS7param(GCORRQ_RXTSP), mingcorrq); - - Log("Phase", LOG_INFO); - for (int i = 0; i<9; ++i) - minRSSI_iq = FindMinRSSI(LMS7param(IQCORR_RXTSP), iqcorr_rx, &iqcorr_rx, 3, 1, 256 >> i); - -RxCalibrationEndStage: - Log("Restoring registers state", LOG_INFO); - RestoreAllRegisters(); - if (status != LIBLMS7_SUCCESS) - { - Log("Rx calibration failed", LOG_WARNING); - return status; - } - - Modify_SPI_Reg_bits(LMS7param(MAC), ch); - SetRxDCOFF((int8_t)dcoffi, (int8_t)dcoffq); - Modify_SPI_Reg_bits(LMS7param(EN_DCOFF_RXFE_RFE), 1); - Modify_SPI_Reg_bits(LMS7param(GCORRI_RXTSP), mingcorri); - Modify_SPI_Reg_bits(LMS7param(GCORRQ_RXTSP), mingcorrq); - Modify_SPI_Reg_bits(LMS7param(IQCORR_RXTSP), iqcorr_rx); - Modify_SPI_Reg_bits(0x040C, 2, 0, 0); //DC_BYP 0, GC_BYP 0, PH_BYP 0 - Modify_SPI_Reg_bits(0x0110, 4, 0, 31); //ICT_LO_RFE 31 - Log("Rx calibration finished", LOG_INFO); - return LIBLMS7_SUCCESS; -} - -const uint16_t backupAddrs[] = { - 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, - 0x0029, 0x002A, 0x002B, 0x002C, 0x002E, 0x0081, 0x0082, 0x0084, 0x0085, - 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x0092, 0x0093, 0x0094, - 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, - 0x009F, 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, - 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0100, 0x0101, 0x0102, 0x0103, - 0x0104, 0x0105, 0x0106, 0x0107, 0x0108, 0x0109, 0x010A, 0x010C, 0x010D, 0x010E, - 0x010F, 0x0110, 0x0111, 0x0112, 0x0113, 0x0114, 0x0115, 0x0116, 0x0117, 0x0118, - 0x0119, 0x011A, 0x011C, 0x011D, 0x011E, 0x011F, 0x0120, 0x0121, 0x0122, 0x0123, - 0x0124, 0x0200, 0x0201, 0x0202, 0x0203, 0x0204, 0x0205, 0x0206, 0x0207, 0x0208, - 0x0240, 0x0242, 0x0243, 0x0400, 0x0401, 0x0402, - 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040A, 0x040B, 0x040C, - 0x0440, 0x0442, 0x0443 }; -uint16_t backupRegs[sizeof(backupAddrs) / 2]; -const uint16_t backupSXAddr[] = { 0x011C, 0x011D, 0x011E, 0x011F, 0x01200, 0x0121, 0x0122, 0x0123, 0x0124 }; -uint16_t backupRegsSXR[sizeof(backupSXAddr) / 2]; -uint16_t backupRegsSXT[sizeof(backupSXAddr) / 2]; - -/** @brief Stores chip current registers state into memory for later restoration -*/ -void LMS7002M::BackupAllRegisters() -{ - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); - SPI_read_batch(backupAddrs, backupRegs, sizeof(backupAddrs) / sizeof(uint16_t)); - Modify_SPI_Reg_bits(LMS7param(MAC), 1); // channel A - SPI_read_batch(backupSXAddr, backupRegsSXR, sizeof(backupRegsSXR) / sizeof(uint16_t)); - Modify_SPI_Reg_bits(LMS7param(MAC), 2); // channel B - SPI_read_batch(backupSXAddr, backupRegsSXT, sizeof(backupRegsSXR) / sizeof(uint16_t)); - Modify_SPI_Reg_bits(LMS7param(MAC), ch); -} - -/** @brief Sets chip registers to state that was stored in memory using BackupAllRegisters() -*/ -void LMS7002M::RestoreAllRegisters() -{ - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); - SPI_write_batch(backupAddrs, backupRegs, sizeof(backupAddrs) / sizeof(uint16_t)); - Modify_SPI_Reg_bits(LMS7param(MAC), 1); // channel A - SPI_write_batch(backupSXAddr, backupRegsSXR, sizeof(backupRegsSXR) / sizeof(uint16_t)); - Modify_SPI_Reg_bits(LMS7param(MAC), 2); // channel B - SPI_write_batch(backupSXAddr, backupRegsSXT, sizeof(backupRegsSXR) / sizeof(uint16_t)); - Modify_SPI_Reg_bits(LMS7param(MAC), ch); -} - -/** @brief Searches for minimal digital RSSI value by changing given gain parameter - @param param LMS7002M gain correction parameter - @param foundValue returns value which achieved minimal RSSI - @return minimal found RSSI value -*/ -uint32_t LMS7002M::FindMinRSSI_Gain(const LMS7Parameter ¶m, uint16_t *foundValue) -{ - uint32_t RSSI = ~0 - 2; - uint32_t prevRSSI = RSSI + 1; - uint8_t decrement = 2; - uint16_t gcorr = 2047; - while (gcorr > 1024) - { - Modify_SPI_Reg_bits(param, gcorr); - RSSI = GetRSSI(); - if (RSSI < prevRSSI) - { - prevRSSI = RSSI; - *foundValue = gcorr; - gcorr -= decrement; - decrement *= 2; - } - else - { - if (decrement == 2) - break; - gcorr -= decrement; - decrement = 2; - } - } - return prevRSSI; -} - -/** @brief Reads all chip configuration and checks if it matches with local registers copy -*/ -bool LMS7002M::IsSynced() -{ - if (controlPort->IsOpen() == false) - return false; - bool isSynced = true; - liblms7_status status; - - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); - - vector<uint16_t> addrToRead = mRegistersMap->GetUsedAddresses(0); - vector<uint16_t> dataReceived; - dataReceived.resize(addrToRead.size(), 0); - - Modify_SPI_Reg_bits(LMS7param(MAC), 1); - status = SPI_read_batch(&addrToRead[0], &dataReceived[0], addrToRead.size()); - if (status != LIBLMS7_SUCCESS) - { - isSynced = false; - goto isSyncedEnding; - } - - //mask out readonly bits - for (uint16_t j = 0; j < sizeof(readOnlyRegisters) / sizeof(uint16_t); ++j) - for (uint16_t k = 0; k < addrToRead.size(); ++k) - if (readOnlyRegisters[j] == addrToRead[k]) - { - dataReceived[k] &= readOnlyRegistersMasks[j]; - break; - } - - //check if local copy matches chip - for (uint16_t i = 0; i < addrToRead.size(); ++i) - { - if (dataReceived[i] != mRegistersMap->GetValue(0, addrToRead[i])) - { - isSynced = false; - goto isSyncedEnding; - } - } - - addrToRead.clear(); //add only B channel addresses - addrToRead = mRegistersMap->GetUsedAddresses(1); - - //mask out readonly bits - for (uint16_t j = 0; j < sizeof(readOnlyRegisters) / sizeof(uint16_t); ++j) - for (uint16_t k = 0; k < addrToRead.size(); ++k) - if (readOnlyRegisters[j] == addrToRead[k]) - { - dataReceived[k] &= readOnlyRegistersMasks[j]; - break; - } - - Modify_SPI_Reg_bits(LMS7param(MAC), 2); - status = SPI_read_batch(&addrToRead[0], &dataReceived[0], addrToRead.size()); - if (status != LIBLMS7_SUCCESS) - return false; - //check if local copy matches chip - for (uint16_t i = 0; i < addrToRead.size(); ++i) - if (dataReceived[i] != mRegistersMap->GetValue(1, addrToRead[i])) - { - isSynced = false; - break; - } - -isSyncedEnding: - Modify_SPI_Reg_bits(LMS7param(MAC), ch); //restore previously used channel - return isSynced; -} - -/** @brief Writes all registers from host to chip - -When used on Novena board, also changes gpios to match rx path and tx band selections -*/ -liblms7_status LMS7002M::UploadAll() -{ - if (controlPort == NULL) - return LIBLMS7_NO_CONNECTION_MANAGER; - if (controlPort->IsOpen() == false) - return LIBLMS7_NOT_CONNECTED; - - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); //remember used channel - - liblms7_status status; - - vector<uint16_t> addrToWrite; - vector<uint16_t> dataToWrite; - - uint16_t x0020_value = mRegistersMap->GetValue(0, 0x0020); - Modify_SPI_Reg_bits(LMS7param(MAC), 1); //select A channel - - addrToWrite = mRegistersMap->GetUsedAddresses(0); - //remove 0x0020 register from list, to not change MAC - addrToWrite.erase( find(addrToWrite.begin(), addrToWrite.end(), 0x0020) ); - for (auto address : addrToWrite) - dataToWrite.push_back(mRegistersMap->GetValue(0, address)); - - status = SPI_write_batch(&addrToWrite[0], &dataToWrite[0], addrToWrite.size()); - status = LIBLMS7_SUCCESS; - if (status != LIBLMS7_SUCCESS) - return status; - //after all channel A registers have been written, update 0x0020 register value - status = SPI_write(0x0020, x0020_value); - if (status != LIBLMS7_SUCCESS) - return status; - Modify_SPI_Reg_bits(LMS7param(MAC), 2); - if (status != LIBLMS7_SUCCESS) - return status; - - addrToWrite = mRegistersMap->GetUsedAddresses(1); - dataToWrite.clear(); - for (auto address : addrToWrite) - { - dataToWrite.push_back(mRegistersMap->GetValue(1, address)); - } - Modify_SPI_Reg_bits(LMS7param(MAC), 2); //select B channel - status = SPI_write_batch(&addrToWrite[0], &dataToWrite[0], addrToWrite.size()); - if (status != LIBLMS7_SUCCESS) - return status; - Modify_SPI_Reg_bits(LMS7param(MAC), ch); //restore last used channel - - //in case of Novena board, need to update GPIO - if(controlPort->GetInfo().device == LMS_DEV_NOVENA) - { - uint16_t regValue = SPI_read(0x0706) & 0xFFF8; - //lms_gpio2 - tx output selection: - // 0 - TX1_A and TX1_B (Band 1), - // 1 - TX2_A and TX2_B (Band 2) - regValue |= Get_SPI_Reg_bits(LMS7param(SEL_BAND2_TRF)) << 2; //gpio2 - //RX active paths - //lms_gpio0 | lms_gpio1 RX_A RX_B - // 0 0 => no active path - // 1 0 => LNAW_A LNAW_B - // 0 1 => LNAH_A LNAH_B - // 1 1 => LNAL_A LNAL_B - switch(Get_SPI_Reg_bits(LMS7param(SEL_PATH_RFE))) - { - //set gpio1:gpio0 - case 0: regValue |= 0x0; break; - case 1: regValue |= 0x2; break; - case 2: regValue |= 0x3; break; - case 3: regValue |= 0x1; break; - } - SPI_write(0x0706, regValue); - } - return LIBLMS7_SUCCESS; -} - -/** @brief Reads all registers from the chip to host - -When used on Novena board, also updates gpios to match rx path and tx band selections -*/ -liblms7_status LMS7002M::DownloadAll() -{ - if (controlPort == nullptr) - return LIBLMS7_NO_CONNECTION_MANAGER; - if (controlPort->IsOpen() == false) - return LIBLMS7_NOT_CONNECTED; - liblms7_status status; - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC), false); - - vector<uint16_t> addrToRead = mRegistersMap->GetUsedAddresses(0); - vector<uint16_t> dataReceived; - dataReceived.resize(addrToRead.size(), 0); - Modify_SPI_Reg_bits(LMS7param(MAC), 1); - status = SPI_read_batch(&addrToRead[0], &dataReceived[0], addrToRead.size()); - if (status != LIBLMS7_SUCCESS) - return status; - - for (uint16_t i = 0; i < addrToRead.size(); ++i) - { - uint16_t adr = addrToRead[i]; - uint16_t val = dataReceived[i]; - mRegistersMap->SetValue(0, addrToRead[i], dataReceived[i]); - } - - addrToRead.clear(); //add only B channel addresses - addrToRead = mRegistersMap->GetUsedAddresses(1); - dataReceived.resize(addrToRead.size(), 0); - - Modify_SPI_Reg_bits(LMS7param(MAC), 2); - status = SPI_read_batch(&addrToRead[0], &dataReceived[0], addrToRead.size()); - if (status != LIBLMS7_SUCCESS) - return status; - for (uint16_t i = 0; i < addrToRead.size(); ++i) - mRegistersMap->SetValue(1, addrToRead[i], dataReceived[i]); - - Modify_SPI_Reg_bits(LMS7param(MAC), ch); //retore previously used channel - - //in case of Novena board, update GPIO - if(controlPort->GetInfo().device == LMS_DEV_NOVENA) - { - uint16_t regValue = SPI_read(0x0706) & 0xFFF8; - //lms_gpio2 - tx output selection: - // 0 - TX1_A and TX1_B (Band 1), - // 1 - TX2_A and TX2_B (Band 2) - regValue |= Get_SPI_Reg_bits(LMS7param(SEL_BAND2_TRF)) << 2; //gpio2 - //RX active paths - //lms_gpio0 | lms_gpio1 RX_A RX_B - // 0 0 => no active path - // 1 0 => LNAW_A LNAW_B - // 0 1 => LNAH_A LNAH_B - // 1 1 => LNAL_A LNAL_B - switch(Get_SPI_Reg_bits(LMS7param(SEL_PATH_RFE))) - { - //set gpio1:gpio0 - case 0: regValue |= 0x0; break; - case 1: regValue |= 0x2; break; - case 2: regValue |= 0x3; break; - case 3: regValue |= 0x1; break; - } - SPI_write(0x0706, regValue); - } - - return LIBLMS7_SUCCESS; -} - -/** @brief Configures interfaces for desired frequency - Sets interpolation and decimation, changes MCLK sources and TSP clock dividers accordingly to selected interpolation and decimation -*/ -liblms7_status LMS7002M::SetInterfaceFrequency(float_type cgen_freq_MHz, const uint8_t interpolation, const uint8_t decimation) -{ - Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), decimation); - Modify_SPI_Reg_bits(LMS7param(HBI_OVR_TXTSP), interpolation); - liblms7_status status = SetFrequencyCGEN(cgen_freq_MHz); - if (status != LIBLMS7_SUCCESS) - return status; - - if (decimation == 7 || decimation == 0) //bypass - { - Modify_SPI_Reg_bits(LMS7param(RXTSPCLKA_DIV), 0); - Modify_SPI_Reg_bits(LMS7param(RXDIVEN), false); - Modify_SPI_Reg_bits(LMS7param(MCLK2SRC), 3); - } - else - { - uint8_t divider = (uint8_t)pow(2.0, decimation); - if (divider > 1) - Modify_SPI_Reg_bits(LMS7param(RXTSPCLKA_DIV), (divider / 2) - 1); - else - Modify_SPI_Reg_bits(LMS7param(RXTSPCLKA_DIV), 0); - Modify_SPI_Reg_bits(LMS7param(RXDIVEN), true); - Modify_SPI_Reg_bits(LMS7param(MCLK2SRC), 1); - } - if (interpolation == 7 || interpolation == 0) //bypass - { - Modify_SPI_Reg_bits(LMS7param(TXTSPCLKA_DIV), 0); - Modify_SPI_Reg_bits(LMS7param(TXDIVEN), false); - Modify_SPI_Reg_bits(LMS7param(MCLK1SRC), 2); - } - else - { - uint8_t divider = (uint8_t)pow(2.0, interpolation); - if (divider > 1) - Modify_SPI_Reg_bits(LMS7param(TXTSPCLKA_DIV), (divider / 2) - 1); - else - Modify_SPI_Reg_bits(LMS7param(TXTSPCLKA_DIV), 0); - Modify_SPI_Reg_bits(LMS7param(TXDIVEN), true); - Modify_SPI_Reg_bits(LMS7param(MCLK1SRC), 0); - } - return status; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M.h deleted file mode 100644 index 81234c28a3fa7686041eaed5efc5c518e8f745d5..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M.h +++ /dev/null @@ -1,177 +0,0 @@ -/** -@file LMS7002M.h -@author Lime Microsystems (www.limemicro.com) -@brief LMS7002M transceiver configuration interface -*/ - -#ifndef LMS7API_H -#define LMS7API_H - -#include "LMS7002M_statuses.h" -#include "LMS7002M_parameters.h" -#include "typedefs.h" - -#include <sstream> - -class LMScomms; -class LMS7002M_RegistersMap; - -class LMS7002M -{ -public: - enum - { - Rx, Tx - }; - - LMS7002M(); - LMS7002M(LMScomms* controlPort); - virtual ~LMS7002M(); - - ///@name Registers writing and reading - liblms7_status UploadAll(); - liblms7_status DownloadAll(); - bool IsSynced(); - - liblms7_status ResetChip(); - liblms7_status LoadConfig(const char* filename); - liblms7_status SaveConfig(const char* filename); - ///@} - - ///@name Registers writing and reading - uint16_t Get_SPI_Reg_bits(const LMS7Parameter ¶m, bool fromChip = true); - uint16_t Get_SPI_Reg_bits(uint16_t address, uint8_t msb, uint8_t lsb, bool fromChip = true); - liblms7_status Modify_SPI_Reg_bits(const LMS7Parameter ¶m, const uint16_t value, bool fromChip = true); - liblms7_status Modify_SPI_Reg_bits(uint16_t address, uint8_t msb, uint8_t lsb, uint16_t value, bool fromChip = true); - liblms7_status SPI_write(uint16_t address, uint16_t data); - uint16_t SPI_read(uint16_t address, bool fromChip = true, liblms7_status *status = 0); - liblms7_status RegistersTest(); - ///@} - - ///@name Transmitter, Receiver calibrations - liblms7_status CalibrateRx(float_type bandwidth_MHz); - liblms7_status CalibrateTx(float_type bandwidth_MHz); - ///@} - - ///@name Filters tuning - enum TxFilter - { - TX_LADDER, TX_REALPOLE, TX_HIGHBAND - }; - enum RxFilter - { - RX_TIA, RX_LPF_LOWBAND, RX_LPF_HIGHBAND - }; - liblms7_status TuneTxFilter(TxFilter filterType, float_type bandwidth_MHz); - liblms7_status TuneTxFilterLowBandChain(float_type ladder_bw_MHz, float_type realpole_bw_MHz); - liblms7_status TuneRxFilter(RxFilter filterType, float_type bandwidth_MHz); - ///@} - - ///@name CGEN and PLL - float_type GetReferenceClk_SX(bool tx); - float_type GetFrequencyCGEN_MHz(); - liblms7_status SetFrequencyCGEN(float_type freq_MHz); - float_type GetFrequencySX_MHz(bool tx, float_type refClk_MHz); - liblms7_status SetFrequencySX(bool tx, float_type freq_MHz, float_type refClk_MHz); - ///VCO modules available for tuning - enum VCO_Module - { - VCO_CGEN, VCO_SXR, VCO_SXT - }; - liblms7_status TuneVCO(VCO_Module module); - ///@} - - ///@name TSP - liblms7_status LoadDC_REG_IQ(bool tx, int16_t I, int16_t Q); - liblms7_status SetNCOFrequency(bool tx, uint8_t index, float_type freq_MHz); - float_type GetNCOFrequency_MHz(bool tx, uint8_t index, float_type refClk_MHz, bool fromChip = true); - liblms7_status SetNCOPhaseOffsetForMode0(bool tx, float_type angle_Deg); - liblms7_status SetNCOPhaseOffset(bool tx, uint8_t index, float_type angle_Deg); - float_type GetNCOPhaseOffset_Deg(bool tx, uint8_t index); - liblms7_status SetGFIRCoefficients(bool tx, uint8_t GFIR_index, const int16_t *coef, uint8_t coefCount); - liblms7_status GetGFIRCoefficients(bool tx, uint8_t GFIR_index, int16_t *coef, uint8_t coefCount); - float_type GetReferenceClk_TSP_MHz(bool tx); - ///@} - - liblms7_status SetInterfaceFrequency(float_type cgen_freq_MHz, const uint8_t interpolation, const uint8_t decimation); - - ///enumeration to indicate module registers intervals - enum MemorySection - { - LimeLight = 0, EN_DIR, AFE, BIAS, XBUF, CGEN, LDO, BIST, CDS, - TRF, TBB, RFE, RBB, SX, TxTSP, - TxNCO, TxGFIR1, TxGFIR2, TxGFIR3a, TxGFIR3b, TxGFIR3c, - RxTSP, RxNCO, RxGFIR1, RxGFIR2, RxGFIR3a, RxGFIR3b, RxGFIR3c, - MEMORY_SECTIONS_COUNT - }; - virtual liblms7_status SetDefaults(MemorySection module); - LMScomms* GetControlPort() const { return controlPort;}; - - static const float_type gLadder_lower_limit; - static const float_type gLadder_higher_limit; - static const float_type gRealpole_lower_limit; - static const float_type gRealpole_higher_limit; - static const float_type gHighband_lower_limit; - static const float_type gHighband_higher_limit; - - static const float_type gRxTIA_higher_limit; - static const float_type gRxTIA_lower_limit_g1; - static const float_type gRxTIA_lower_limit_g23; - static const float_type gRxLPF_low_lower_limit; - static const float_type gRxLPF_low_higher_limit; - static const float_type gRxLPF_high_lower_limit; - static const float_type gRxLPF_high_higher_limit; - - static float_type gVCO_frequency_table[3][2]; - static float_type gCGEN_VCO_frequencies[2]; - - //protected: - LMS7002M_RegistersMap *mRegistersMap; - static const uint16_t readOnlyRegisters[]; - static const uint16_t readOnlyRegistersMasks[]; - - uint16_t MemorySectionAddresses[MEMORY_SECTIONS_COUNT][2]; - ///@name Algorithms functions - void BackupAllRegisters(); - void RestoreAllRegisters(); - uint32_t GetRSSI(); - void SetRxDCOFF(int8_t offsetI, int8_t offsetQ); - uint32_t FindMinRSSI_Gain(const LMS7Parameter ¶m, uint16_t *foundValue); - uint32_t FindMinRSSI(const LMS7Parameter ¶m, const int16_t startValue, int16_t *result, const uint8_t scanWidth, const uint8_t twoCompl, int8_t stepMult = 1); - uint32_t FindMinRSSI(const uint16_t addr, const uint8_t msb, const uint8_t lsb, const int16_t startValue, int16_t *result, const uint8_t scanWidth, const uint8_t twoCompl, int8_t stepMult = 1); - void CalibrateRxDC_RSSI(); - liblms7_status CalibrateTxSetup(float_type bandwidth_MHz); - liblms7_status CalibrateRxSetup(float_type bandwidth_MHz); - liblms7_status FixRXSaturation(); - void FilterTuning_AdjustGains(); - liblms7_status TuneTxFilterSetup(TxFilter type, float_type cutoff_MHz); - liblms7_status TuneRxFilterSetup(RxFilter type, float_type cutoff_MHz); - liblms7_status RFE_TIA_Calibration(float_type TIA_freq_MHz); - liblms7_status RxLPFLow_Calibration(float_type RxLPFL_freq_MHz); - liblms7_status RxLPFHigh_Calibration(float_type RxLPFH_freq_MHz); - - liblms7_status RegistersTestInterval(uint16_t startAddr, uint16_t endAddr, uint16_t pattern, std::stringstream &ss); - liblms7_status SPI_write_batch(const uint16_t* spiAddr, const uint16_t* spiData, uint16_t cnt); - liblms7_status SPI_read_batch(const uint16_t* spiAddr, uint16_t* spiData, uint16_t cnt); - liblms7_status Modify_SPI_Reg_mask(const uint16_t *addr, const uint16_t *masks, const uint16_t *values, uint8_t start, uint8_t stop); - ///@} - ///Reference clock used for Receiver frequency calculations - float_type mRefClkSXR_MHz; - ///Reference clock used for Transmitter frequency calculations - float_type mRefClkSXT_MHz; - - enum LogType - { - LOG_INFO, - LOG_WARNING, - LOG_ERROR, - LOG_DATA - }; - virtual void Log(const char* text, LogType type); - - ///port used for communicating with LMS7002M - LMScomms* controlPort; - - liblms7_status LoadConfigLegacyFile(const char* filename); -}; -#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_RegistersMap.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_RegistersMap.cpp deleted file mode 100644 index 8c870ffcc0da6869ab73b8d6c734766554a5a65e..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_RegistersMap.cpp +++ /dev/null @@ -1,68 +0,0 @@ -#include "LMS7002M_RegistersMap.h" -#include "LMS7002M_parameters.h" - -LMS7002M_RegistersMap::LMS7002M_RegistersMap() -{ - -} - -LMS7002M_RegistersMap::~LMS7002M_RegistersMap() -{ - -} - -uint16_t LMS7002M_RegistersMap::GetDefaultValue(uint16_t address) const -{ - std::map<uint16_t, Register>::const_iterator iter = mChannelA.find(address); - if( iter != mChannelA.end()) - return iter->second.defaultValue; - else - return 0; -} - -void LMS7002M_RegistersMap::InitializeDefaultValues(const std::vector<const LMS7Parameter*> parameterList) -{ - for(auto parameter : parameterList) - { - uint16_t regValue = mChannelA[parameter->address].defaultValue; - mChannelA[parameter->address].defaultValue = regValue | (parameter->defaultValue << parameter->lsb); - mChannelA[parameter->address].value = mChannelA[parameter->address].defaultValue; - if(parameter->address >= 0x0100) - mChannelB[parameter->address].value = mChannelA[parameter->address].value; - } -} - -void LMS7002M_RegistersMap::SetValue(uint8_t channel, const uint16_t address, const uint16_t value) -{ - if(channel == 0) - mChannelA[address].value = value; - else if(channel == 1) - mChannelB[address].value = value; -} - -uint16_t LMS7002M_RegistersMap::GetValue(uint8_t channel, uint16_t address) const -{ - const std::map<const uint16_t, Register> *regMap; - if(channel == 0) - regMap = &mChannelA; - else if(channel == 1) - regMap = &mChannelB; - std::map<const uint16_t, Register>::const_iterator iter; - iter = regMap->find(address); - if (iter != regMap->end()) - return iter->second.value; - else - return 0; -} - -std::vector<uint16_t> LMS7002M_RegistersMap::GetUsedAddresses(const uint8_t channel) const -{ - std::vector<uint16_t> addresses; - if(channel == 0) - for(auto iter : mChannelA) - addresses.push_back(iter.first); - else if(channel == 1) - for(auto iter : mChannelB) - addresses.push_back(iter.first); - return addresses; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_RegistersMap.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_RegistersMap.h deleted file mode 100644 index 5ccda752db36187ef2626f751df312af5d4f4663..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_RegistersMap.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef LMS7002M_REGISTERS_MAP_H -#define LMS7002M_REGISTERS_MAP_H - -#include <vector> -#include <map> -#include <typedefs.h> - -struct LMS7Parameter; - -class LMS7002M_RegistersMap -{ -public: - struct Register - { - uint16_t value; - uint16_t defaultValue; - uint16_t mask; - }; - - LMS7002M_RegistersMap(); - ~LMS7002M_RegistersMap(); - - uint16_t GetValue(uint8_t channel, uint16_t address) const; - void SetValue(uint8_t channel, const uint16_t address, const uint16_t value); - - void InitializeDefaultValues(const std::vector<const LMS7Parameter*> parameterList); - uint16_t GetDefaultValue(uint16_t address) const; - std::vector<uint16_t> GetUsedAddresses(const uint8_t channel) const; - -protected: - std::map<const uint16_t, Register> mChannelA; - std::map<const uint16_t, Register> mChannelB; -}; - -#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_filtersCalibration.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_filtersCalibration.cpp deleted file mode 100644 index 2f3d38c1b587ae0cad7f5134857af0ffc444bb54..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_filtersCalibration.cpp +++ /dev/null @@ -1,861 +0,0 @@ -/** -@file LMS7002M_filtersCalibration.cpp -@author Lime Microsystems (www.limemicro.com) -@brief Implementation of LMS7002M transceiver filters calibration algorithms -*/ - -#include "LMS7002M.h" -#include <cmath> - -///define for parameter enumeration if prefix might be needed -#define LMS7param(id) id - -const float_type LMS7002M::gLadder_lower_limit = 2; -const float_type LMS7002M::gLadder_higher_limit = 16; -const float_type LMS7002M::gRealpole_lower_limit = 0.8; -const float_type LMS7002M::gRealpole_higher_limit = 3.2; -const float_type LMS7002M::gHighband_lower_limit = 28; -const float_type LMS7002M::gHighband_higher_limit = 70; - -const float_type LMS7002M::gRxTIA_higher_limit = 60; -const float_type LMS7002M::gRxTIA_lower_limit_g1 = 1.5; -const float_type LMS7002M::gRxTIA_lower_limit_g23 = 0.5; -const float_type LMS7002M::gRxLPF_low_lower_limit = 1; -const float_type LMS7002M::gRxLPF_low_higher_limit = 20; -const float_type LMS7002M::gRxLPF_high_lower_limit = 20; -const float_type LMS7002M::gRxLPF_high_higher_limit = 70; - -liblms7_status LMS7002M::TuneTxFilterSetup(LMS7002M::TxFilter type, float_type cutoff_MHz) -{ - Modify_SPI_Reg_bits(LMS7param(EN_G_RFE), 0); - Modify_SPI_Reg_bits(LMS7param(EN_G_TRF), 0); - - //RBB - SetDefaults(RBB); - Modify_SPI_Reg_bits(LMS7param(PD_LPFL_RBB), 1); - Modify_SPI_Reg_bits(LMS7param(INPUT_CTL_PGA_RBB), 3); - Modify_SPI_Reg_bits(LMS7param(ICT_PGA_OUT_RBB), 20); - Modify_SPI_Reg_bits(LMS7param(ICT_PGA_IN_RBB), 20); - Modify_SPI_Reg_bits(LMS7param(C_CTL_PGA_RBB), 3); - - //TBB - SetDefaults(TBB); - Modify_SPI_Reg_bits(LMS7param(CG_IAMP_TBB), 1); - Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_FRP_TBB), 1); - Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_GG_FRP_TBB), 6); - - //AFE - uint8_t isel_dac_afe = (uint8_t)Get_SPI_Reg_bits(0x0082, 15, 13); - SetDefaults(AFE); - if (Get_SPI_Reg_bits(LMS7param(MAC)) == 2) - { - Modify_SPI_Reg_bits(LMS7param(PD_TX_AFE2), 0); //PD_RX_AFE2 0 - Modify_SPI_Reg_bits(LMS7param(PD_RX_AFE2), 0); //PD_RX_AFE2 0 - } - Modify_SPI_Reg_bits(0x0082, 15, 13, isel_dac_afe); - - //BIAS - uint8_t rpcalib_bias = (uint8_t)Get_SPI_Reg_bits(LMS7param(RP_CALIB_BIAS)); - SetDefaults(BIAS); - Modify_SPI_Reg_bits(LMS7param(RP_CALIB_BIAS), rpcalib_bias); - - //XBUF - Modify_SPI_Reg_bits(LMS7param(PD_XBUF_RX), 0); - Modify_SPI_Reg_bits(LMS7param(PD_XBUF_TX), 0); - Modify_SPI_Reg_bits(LMS7param(EN_G_XBUF), 1); - - //CGEN - SetDefaults(CGEN); - - //txtsp - SetDefaults(TxTSP); - Modify_SPI_Reg_bits(LMS7param(TSGMODE_TXTSP), 1); - Modify_SPI_Reg_bits(LMS7param(INSEL_TXTSP), 1); - Modify_SPI_Reg_bits(0x0208, 6, 4, 7); - LoadDC_REG_IQ(Tx, (int16_t)0x7FFF, (int16_t)0x8000); - float_type txNCOfreq = 0.05; - SetNCOFrequency(Tx, 0, txNCOfreq); - - //rxtsp - SetDefaults(RxTSP); - SetNCOFrequency(Rx, 0, txNCOfreq - 1); - - Modify_SPI_Reg_bits(LMS7param(AGC_MODE_RXTSP), 1); - Modify_SPI_Reg_bits(0x040C, 6, 3, 0x07); - - Modify_SPI_Reg_bits(LMS7param(AGC_AVG_RXTSP), 7); - Modify_SPI_Reg_bits(LMS7param(CMIX_GAIN_RXTSP), 1); - - return LIBLMS7_SUCCESS; -} - - -liblms7_status LMS7002M::TuneTxFilter(LMS7002M::TxFilter type, float_type cutoff_MHz) -{ - liblms7_status status; - float_type lowLimit = 0; - float_type highLimit = 1000; - uint32_t rssi = 0; - int8_t dir; - uint8_t ccal_lpflad_tbb; - uint32_t rssi_value_100k; - int16_t rcal; - - float_type ncoFreq = 0.05; - float_type cgenFreq; - uint8_t loopb_tbb; - uint8_t cg_iamp_tbb = 1; - uint8_t bypladder_tbb; - uint8_t pd_lpfh_tbb; - uint8_t pd_lpflad_tbb; - uint8_t pd_lpfs5; - uint8_t en_g_tbb = 1; - uint8_t pd_iamp_tbb = 0; - uint8_t tstin_tbb = 0; - - BackupAllRegisters(); - //float_type userCLKGENfreq = GetFrequencyCGEN_MHz(); - - status = TuneTxFilterSetup(type, cutoff_MHz); - if (status != LIBLMS7_SUCCESS) - goto TxFilterTuneEnd; - cgenFreq = cutoff_MHz * 20; - if (cgenFreq < 60) - cgenFreq = 60; - if (cgenFreq > 640) - cgenFreq = 640; - if (type == TX_LADDER) - { - loopb_tbb = 2; - bypladder_tbb = 0; - pd_lpfh_tbb = 1; - pd_lpflad_tbb = 0; - pd_lpfs5 = 1; - lowLimit = gLadder_lower_limit; - highLimit = gLadder_higher_limit; - } - else if (type == TX_REALPOLE) - { - loopb_tbb = 3; - bypladder_tbb = 1; - pd_lpfh_tbb = 1; - pd_lpflad_tbb = 1; - pd_lpfs5 = 0; - lowLimit = gRealpole_lower_limit; - highLimit = gRealpole_higher_limit; - } - else if (type == TX_HIGHBAND) - { - loopb_tbb = 3; - bypladder_tbb = 0; - pd_lpfh_tbb = 0; - pd_lpflad_tbb = 1; - pd_lpfs5 = 1; - lowLimit = gHighband_lower_limit; - highLimit = gHighband_higher_limit; - } - if (cutoff_MHz == cgenFreq / 16) - cgenFreq -= 10; - - if (cutoff_MHz < lowLimit || cutoff_MHz > highLimit) - { - status = LIBLMS7_FREQUENCY_OUT_OF_RANGE; - goto TxFilterTuneEnd; - } - - status = SetFrequencyCGEN(cgenFreq); - if (status != LIBLMS7_SUCCESS) - goto TxFilterTuneEnd; - - Modify_SPI_Reg_bits(LMS7param(LOOPB_TBB), loopb_tbb); - Modify_SPI_Reg_bits(LMS7param(CG_IAMP_TBB), cg_iamp_tbb); - Modify_SPI_Reg_bits(LMS7param(BYPLADDER_TBB), bypladder_tbb); - Modify_SPI_Reg_bits(LMS7param(TSTIN_TBB), tstin_tbb); - Modify_SPI_Reg_bits(LMS7param(PD_LPFH_TBB), pd_lpfh_tbb); - Modify_SPI_Reg_bits(LMS7param(PD_LPFIAMP_TBB), pd_iamp_tbb); - Modify_SPI_Reg_bits(LMS7param(PD_LPFLAD_TBB), pd_lpflad_tbb); - Modify_SPI_Reg_bits(LMS7param(PD_LPFS5_TBB), pd_lpfs5); - Modify_SPI_Reg_bits(LMS7param(EN_G_TBB), en_g_tbb); - - //B - //LADDER coefficients - float_type p1, p2, p3, p4, p5; - switch (type) - { - case TX_LADDER: - p1 = 1.29858903647958E-16; - p2 = -0.000110746929967704; - p3 = 0.00277593485991029; - p4 = 21.0384293169607; - p5 = -48.4092606238297; - break; - case TX_REALPOLE: - p1 = 1.93821841029921E-15; - p2 = -0.0429694461214244; - p3 = 0.253501254059498; - p4 = 88.9545445989649; - p5 = -48.0847491316861; - break; - case TX_HIGHBAND: - p1 = 1.10383E-06; - p2 = -0.0002108; - p3 = 0.019049487; - p4 = 1.433174459; - p5 = -47.69507793; - break; - } - rcal = (int16_t)(pow(cutoff_MHz, 4)*p1 + pow(cutoff_MHz, 3)*p2 + pow(cutoff_MHz, 2)*p3 + cutoff_MHz * p4 + p5); - if (rcal < 0) - rcal = 0; - if (rcal > 255) - rcal = 255; - - if (type == TX_REALPOLE) - Modify_SPI_Reg_bits(LMS7param(RCAL_LPFS5_TBB), rcal); - else if (type == TX_LADDER) - Modify_SPI_Reg_bits(LMS7param(RCAL_LPFLAD_TBB), rcal); - else if (type == TX_HIGHBAND) - Modify_SPI_Reg_bits(LMS7param(RCAL_LPFH_TBB), rcal); - - FilterTuning_AdjustGains(); - - rssi_value_100k = (uint32_t)( GetRSSI()*0.707 ); - - SetNCOFrequency(Tx, 0, cutoff_MHz); - SetNCOFrequency(Rx, 0, cutoff_MHz - 1); - - for (ccal_lpflad_tbb = 31; ccal_lpflad_tbb > 0; --ccal_lpflad_tbb) - { - Modify_SPI_Reg_bits(LMS7param(CCAL_LPFLAD_TBB), ccal_lpflad_tbb); - rssi = GetRSSI(); - if (rssi > rssi_value_100k && ccal_lpflad_tbb == 31) - break; //skip this search, continue to advanced search - if (rssi > rssi_value_100k) - { - status = LIBLMS7_SUCCESS; - goto TxFilterTuneEnd; //found correct value - } - } - - - //advanced search for c and r values - status = LIBLMS7_FAILURE; - dir = ccal_lpflad_tbb == 31 ? -1 : 1; - while (rcal > 0 && rcal < 255) - { - rcal += 5 * dir; - if (rcal < 0 && rcal > 255) - break; - if (type == TX_REALPOLE) - Modify_SPI_Reg_bits(LMS7param(RCAL_LPFS5_TBB), rcal); - else if (type == TX_LADDER) - Modify_SPI_Reg_bits(LMS7param(RCAL_LPFLAD_TBB), rcal); - else if (type == TX_HIGHBAND) - Modify_SPI_Reg_bits(LMS7param(RCAL_LPFH_TBB), rcal); - SetNCOFrequency(Tx, 0, ncoFreq); - SetNCOFrequency(Rx, 0, ncoFreq - 1); - Modify_SPI_Reg_bits(LMS7param(CCAL_LPFLAD_TBB), 16); - rssi_value_100k = GetRSSI(); - SetNCOFrequency(Tx, 0, cutoff_MHz); - SetNCOFrequency(Rx, 0, cutoff_MHz - 1); - for (ccal_lpflad_tbb = 31; ccal_lpflad_tbb > 0; --ccal_lpflad_tbb) - { - Modify_SPI_Reg_bits(LMS7param(CCAL_LPFLAD_TBB), ccal_lpflad_tbb); - rssi = GetRSSI(); - if (rssi > rssi_value_100k*0.707 && ccal_lpflad_tbb == 31) - break; //skip c search, need to change r value - if (rssi > rssi_value_100k*0.707) - { - status = LIBLMS7_SUCCESS; - goto TxFilterTuneEnd; - } - } - } - - //end -TxFilterTuneEnd: - RestoreAllRegisters(); - if (status != LIBLMS7_SUCCESS) - return status; - Modify_SPI_Reg_bits(LMS7param(CCAL_LPFLAD_TBB), ccal_lpflad_tbb); - Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_FRP_TBB), 1); - Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_GG_FRP_TBB), 6); - - if (type == TX_REALPOLE) - Modify_SPI_Reg_bits(LMS7param(RCAL_LPFS5_TBB), rcal); - else if (type == TX_LADDER) - Modify_SPI_Reg_bits(LMS7param(RCAL_LPFLAD_TBB), rcal); - else if (type == TX_HIGHBAND) - { - Modify_SPI_Reg_bits(LMS7param(RCAL_LPFH_TBB), rcal); - Modify_SPI_Reg_bits(0x0105, 4, 0, 0x7); //set powerdowns - } - return LIBLMS7_SUCCESS; -} - -void LMS7002M::FilterTuning_AdjustGains() -{ - uint8_t cg_iamp_tbb; - uint32_t rssi = 0; - const uint32_t rssi_required = 0x8400; - uint8_t g_pga_rbb = (uint8_t)Get_SPI_Reg_bits(LMS7param(G_PGA_RBB)); - - while (g_pga_rbb < 31) - { - cg_iamp_tbb = 0; - while (cg_iamp_tbb < 63 && rssi < rssi_required) - { - Modify_SPI_Reg_bits(LMS7param(CG_IAMP_TBB), cg_iamp_tbb); - rssi = GetRSSI(); - if (rssi > rssi_required) - return; - ++cg_iamp_tbb; - } - g_pga_rbb += 6; - if (g_pga_rbb > 31) - g_pga_rbb = 31; - Modify_SPI_Reg_bits(LMS7param(G_PGA_RBB), g_pga_rbb); - } -} - -liblms7_status LMS7002M::TuneTxFilterLowBandChain(float_type bandwidth, float_type realpole_MHz) -{ - uint32_t rssi; - uint32_t rssi_value_10k; - bool prevRSSIbigger; - int16_t rcal; - float_type p1,p2,p3,p4,p5; - float_type ncoFreq = 0.05; - float_type cgenFreq; - BackupAllRegisters(); - - liblms7_status status = TuneTxFilter(TX_LADDER, bandwidth); - uint8_t ladder_c_value = (uint8_t)Get_SPI_Reg_bits(LMS7param(CCAL_LPFLAD_TBB)); - uint8_t ladder_r_value = (uint8_t)Get_SPI_Reg_bits(LMS7param(RCAL_LPFLAD_TBB)); - status = TuneTxFilterSetup(TX_LADDER, bandwidth); - - if (bandwidth < gLadder_lower_limit || bandwidth > gLadder_higher_limit) - { - status = LIBLMS7_FREQUENCY_OUT_OF_RANGE; - goto TxFilterLowBandChainEnd; - } - - //realpole calibration - //float userCLKGENfreq = GetFrequencyCGEN(); - - cgenFreq = realpole_MHz * 20; - if (cgenFreq < 60) - cgenFreq = 60; - if (cgenFreq > 640) - cgenFreq = 640; - - if (realpole_MHz < gRealpole_lower_limit || realpole_MHz > gRealpole_higher_limit) - { - status = LIBLMS7_FREQUENCY_OUT_OF_RANGE; - goto TxFilterLowBandChainEnd; - } - - status = SetFrequencyCGEN(cgenFreq); - if (status != LIBLMS7_SUCCESS) - goto TxFilterLowBandChainEnd; - - Modify_SPI_Reg_bits(LMS7param(LOOPB_TBB), 3); - Modify_SPI_Reg_bits(LMS7param(CG_IAMP_TBB), 1); - Modify_SPI_Reg_bits(LMS7param(BYPLADDER_TBB), 1); - Modify_SPI_Reg_bits(LMS7param(TSTIN_TBB), 0); - Modify_SPI_Reg_bits(LMS7param(PD_LPFH_TBB), 1); - Modify_SPI_Reg_bits(LMS7param(PD_LPFIAMP_TBB), 0); - Modify_SPI_Reg_bits(LMS7param(PD_LPFLAD_TBB), 1); - Modify_SPI_Reg_bits(LMS7param(PD_LPFS5_TBB), 0); - Modify_SPI_Reg_bits(LMS7param(EN_G_TBB), 1); - - //B - p1 = 1.93821841029921E-15; - p2 = -0.0429694461214244; - p3 = 0.253501254059498; - p4 = 88.9545445989649; - p5 = -48.0847491316861; - rcal = (int16_t)(pow(realpole_MHz, 4)*p1 + pow(realpole_MHz, 3)*p2 + pow(realpole_MHz, 2)*p3 + realpole_MHz * p4 + p5); - if (rcal < 0) - rcal = 0; - if (rcal > 255) - rcal = 255; - Modify_SPI_Reg_bits(LMS7param(RCAL_LPFS5_TBB), rcal); - - FilterTuning_AdjustGains(); - - rssi_value_10k = GetRSSI(); - SetNCOFrequency(Tx, 0, realpole_MHz); - SetNCOFrequency(Rx, 0, realpole_MHz - 1); - - prevRSSIbigger = GetRSSI() > rssi_value_10k*0.707; - status = LIBLMS7_FAILURE; //assuming r value is not found - while (rcal >= 0 && rcal < 256) - { - Modify_SPI_Reg_bits(LMS7param(RCAL_LPFS5_TBB), rcal); - SetNCOFrequency(Tx, 0, ncoFreq); - SetNCOFrequency(Rx, 0, ncoFreq - 1); - rssi_value_10k = (uint32_t)( GetRSSI()*0.707 ); - - SetNCOFrequency(Tx, 0, realpole_MHz); - SetNCOFrequency(Rx, 0, realpole_MHz - 1); - - rssi = GetRSSI(); - if (rssi > rssi_value_10k) - --rcal; - else - { - if (prevRSSIbigger) - { - --rcal; - status = LIBLMS7_SUCCESS; - goto TxFilterLowBandChainEnd; - } - ++rcal; - } - prevRSSIbigger = rssi > rssi_value_10k; - } - - //end -TxFilterLowBandChainEnd: - RestoreAllRegisters(); - if (status != LIBLMS7_SUCCESS) - return status; - - Modify_SPI_Reg_bits(LMS7param(CCAL_LPFLAD_TBB), ladder_c_value); - Modify_SPI_Reg_bits(LMS7param(RCAL_LPFLAD_TBB), ladder_r_value); - Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_FRP_TBB), 1); - Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_GG_FRP_TBB), 6); - Modify_SPI_Reg_bits(LMS7param(RCAL_LPFS5_TBB), rcal); - Modify_SPI_Reg_bits(0x0105, 4, 0, 0x11); //set powerdowns - - return LIBLMS7_SUCCESS; -} - -liblms7_status LMS7002M::TuneRxFilter(RxFilter filter, float_type bandwidth_MHz) -{ - liblms7_status status; - uint16_t cfb_tia_rfe; - uint16_t c_ctl_lpfl_rbb; - uint8_t ccomp_tia_rfe; - uint8_t rcomp_tia_rfe; - uint8_t c_ctl_lpfh_rbb; - uint8_t ict_pga_out; - uint8_t ict_pga_in; - uint8_t r_ctl_lpf_rbb; - uint8_t c_ctl_pga_rbb; - uint8_t rcc_ctl_lpfl_rbb; - uint8_t rcc_ctl_lpfh_rbb; - float_type lowerLimit; - float_type higherLimit; - if (filter == RX_TIA) - { - lowerLimit = Get_SPI_Reg_bits(LMS7param(G_TIA_RFE)) == 1 ? gRxTIA_lower_limit_g1 : gRxTIA_lower_limit_g23; - higherLimit = gRxTIA_higher_limit; - } - else if (filter == RX_LPF_LOWBAND) - { - lowerLimit = gRxLPF_low_lower_limit; - higherLimit = gRxLPF_low_higher_limit; - } - else if (filter == RX_LPF_HIGHBAND) - { - lowerLimit = gRxLPF_high_lower_limit; - higherLimit = gRxLPF_high_higher_limit; - } - if (bandwidth_MHz < lowerLimit || bandwidth_MHz > higherLimit) - return LIBLMS7_FREQUENCY_OUT_OF_RANGE; - - BackupAllRegisters(); - - status = TuneRxFilterSetup(filter, bandwidth_MHz); - if (status != LIBLMS7_SUCCESS) - goto RxFilterTuneEnd; - - if (filter == RX_TIA) - status = RFE_TIA_Calibration(bandwidth_MHz); - else if (filter == RX_LPF_LOWBAND) - status = RxLPFLow_Calibration(bandwidth_MHz); - else if (filter == RX_LPF_HIGHBAND) - status = RxLPFHigh_Calibration(bandwidth_MHz); - - cfb_tia_rfe = Get_SPI_Reg_bits(LMS7param(CFB_TIA_RFE)); - c_ctl_lpfl_rbb = Get_SPI_Reg_bits(LMS7param(C_CTL_LPFL_RBB)); - ccomp_tia_rfe = (int8_t)Get_SPI_Reg_bits(LMS7param(CCOMP_TIA_RFE)); - rcomp_tia_rfe = (int8_t)Get_SPI_Reg_bits(LMS7param(RCOMP_TIA_RFE)); - c_ctl_lpfh_rbb = (int8_t)Get_SPI_Reg_bits(LMS7param(C_CTL_LPFH_RBB)); - ict_pga_out = (int8_t)Get_SPI_Reg_bits(LMS7param(ICT_PGA_OUT_RBB)); - ict_pga_in = (int8_t)Get_SPI_Reg_bits(LMS7param(ICT_PGA_IN_RBB)); - r_ctl_lpf_rbb = (int8_t)Get_SPI_Reg_bits(LMS7param(R_CTL_LPF_RBB)); - c_ctl_pga_rbb = (int8_t)Get_SPI_Reg_bits(LMS7param(C_CTL_PGA_RBB)); - rcc_ctl_lpfl_rbb = (int8_t)Get_SPI_Reg_bits(LMS7param(RCC_CTL_LPFL_RBB)); - rcc_ctl_lpfh_rbb = (int8_t)Get_SPI_Reg_bits(LMS7param(RCC_CTL_LPFH_RBB)); - -RxFilterTuneEnd: - RestoreAllRegisters(); - if (status != LIBLMS7_SUCCESS) - return status; - - if (filter == RX_TIA) - { - Modify_SPI_Reg_bits(LMS7param(ICT_TIAMAIN_RFE), 2); - Modify_SPI_Reg_bits(LMS7param(ICT_TIAOUT_RFE), 2); - Modify_SPI_Reg_bits(LMS7param(RFB_TIA_RFE), 16); - Modify_SPI_Reg_bits(LMS7param(CFB_TIA_RFE), cfb_tia_rfe); - Modify_SPI_Reg_bits(LMS7param(CCOMP_TIA_RFE), ccomp_tia_rfe); - Modify_SPI_Reg_bits(LMS7param(RCOMP_TIA_RFE), rcomp_tia_rfe); - Modify_SPI_Reg_bits(0x010c, 1, 0, 0x1); - } - else if (filter == RX_LPF_LOWBAND) - { - Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFL_RBB), rcc_ctl_lpfl_rbb); - Modify_SPI_Reg_bits(LMS7param(C_CTL_LPFL_RBB), c_ctl_lpfl_rbb); - Modify_SPI_Reg_bits(LMS7param(ICT_PGA_OUT_RBB), ict_pga_out); - Modify_SPI_Reg_bits(LMS7param(ICT_PGA_IN_RBB), ict_pga_in); - Modify_SPI_Reg_bits(LMS7param(R_CTL_LPF_RBB), r_ctl_lpf_rbb); - Modify_SPI_Reg_bits(LMS7param(C_CTL_PGA_RBB), c_ctl_pga_rbb); - Modify_SPI_Reg_bits(0x0115, 3, 0, 0x9); - Modify_SPI_Reg_bits(0x0118, 15, 13, 0x1); - } - else if (filter == RX_LPF_HIGHBAND) - { - Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFH_RBB), rcc_ctl_lpfh_rbb); - Modify_SPI_Reg_bits(LMS7param(C_CTL_LPFH_RBB), c_ctl_lpfh_rbb); - Modify_SPI_Reg_bits(LMS7param(ICT_PGA_OUT_RBB), ict_pga_out); - Modify_SPI_Reg_bits(LMS7param(ICT_PGA_IN_RBB), ict_pga_in); - Modify_SPI_Reg_bits(LMS7param(R_CTL_LPF_RBB), r_ctl_lpf_rbb); - Modify_SPI_Reg_bits(LMS7param(C_CTL_PGA_RBB), c_ctl_pga_rbb); - Modify_SPI_Reg_bits(0x0115, 3, 0, 0x5); - Modify_SPI_Reg_bits(0x0118, 15, 13, 0x0); - } - return LIBLMS7_SUCCESS; -} - -liblms7_status LMS7002M::TuneRxFilterSetup(RxFilter type, float_type cutoff_MHz) -{ - liblms7_status status; - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); - - //RFE - uint8_t g_tia_rfe = (uint8_t)Get_SPI_Reg_bits(LMS7param(G_TIA_RFE)); - SetDefaults(RFE); - Modify_SPI_Reg_bits(LMS7param(SEL_PATH_RFE), 2); - - if (ch == 2) - Modify_SPI_Reg_bits(LMS7param(EN_NEXTRX_RFE), 1); - else - Modify_SPI_Reg_bits(LMS7param(EN_NEXTRX_RFE), 0); - - Modify_SPI_Reg_bits(LMS7param(G_RXLOOPB_RFE), 8); - Modify_SPI_Reg_bits(LMS7param(PD_RLOOPB_2_RFE), 0); - Modify_SPI_Reg_bits(LMS7param(EN_INSHSW_LB2_RFE), 0); - Modify_SPI_Reg_bits(LMS7param(PD_MXLOBUF_RFE), 0); - Modify_SPI_Reg_bits(LMS7param(PD_QGEN_RFE), 0); - Modify_SPI_Reg_bits(LMS7param(ICT_TIAMAIN_RFE), 2); - Modify_SPI_Reg_bits(LMS7param(ICT_TIAOUT_RFE), 2); - Modify_SPI_Reg_bits(LMS7param(RFB_TIA_RFE), 16); - Modify_SPI_Reg_bits(LMS7param(G_TIA_RFE), g_tia_rfe); - - //RBB - SetDefaults(RBB); - Modify_SPI_Reg_bits(LMS7param(ICT_PGA_OUT_RBB), 20); - Modify_SPI_Reg_bits(LMS7param(ICT_PGA_IN_RBB), 20); - Modify_SPI_Reg_bits(LMS7param(C_CTL_PGA_RBB), 3); - - //TRF - SetDefaults(TRF); - Modify_SPI_Reg_bits(LMS7param(L_LOOPB_TXPAD_TRF), 0); - Modify_SPI_Reg_bits(LMS7param(EN_LOOPB_TXPAD_TRF), 1); - if (ch == 2) - Modify_SPI_Reg_bits(LMS7param(EN_NEXTTX_TRF), 1); - else - Modify_SPI_Reg_bits(LMS7param(EN_NEXTTX_TRF), 0); - Modify_SPI_Reg_bits(LMS7param(SEL_BAND1_TRF), 0); - Modify_SPI_Reg_bits(LMS7param(SEL_BAND2_TRF), 1); - - //TBB - SetDefaults(TBB); - Modify_SPI_Reg_bits(LMS7param(CG_IAMP_TBB), 1); - Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_FRP_TBB), 1); - Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_GG_FRP_TBB), 6); - - //AFE - SetDefaults(AFE); - if (ch == 2) - { - Modify_SPI_Reg_bits(LMS7param(PD_TX_AFE2), 0); - Modify_SPI_Reg_bits(LMS7param(PD_RX_AFE2), 0); - } - //BIAS - uint8_t rp_calib_bias = (uint8_t)Get_SPI_Reg_bits(LMS7param(RP_CALIB_BIAS)); - SetDefaults(BIAS); - Modify_SPI_Reg_bits(LMS7param(RP_CALIB_BIAS), rp_calib_bias); - - //XBUF - Modify_SPI_Reg_bits(LMS7param(PD_XBUF_RX), 0); - Modify_SPI_Reg_bits(LMS7param(PD_XBUF_TX), 0); - Modify_SPI_Reg_bits(LMS7param(EN_G_TRF), 1); - - //CLKGEN - SetDefaults(CGEN); - - //SXR - Modify_SPI_Reg_bits(LMS7param(MAC), 1); - SetDefaults(SX); - status = SetFrequencySX(Rx, 499.95, mRefClkSXR_MHz); - if (status != LIBLMS7_SUCCESS) - return status; - Modify_SPI_Reg_bits(LMS7param(PD_VCO), 0); - - //SXT - Modify_SPI_Reg_bits(LMS7param(MAC), 2); - SetDefaults(SX); - status = SetFrequencySX(Tx, 500, mRefClkSXT_MHz); - if (status != LIBLMS7_SUCCESS) - return status; - Modify_SPI_Reg_bits(LMS7param(PD_VCO), 0); - - Modify_SPI_Reg_bits(LMS7param(MAC), ch); - //TxTSP - SetDefaults(TxTSP); - Modify_SPI_Reg_bits(LMS7param(TSGMODE_TXTSP), 1); - Modify_SPI_Reg_bits(LMS7param(INSEL_TXTSP), 1); - Modify_SPI_Reg_bits(0x0208, 8, 8, 1); - Modify_SPI_Reg_bits(0x0208, 6, 4, 0x7); - LoadDC_REG_IQ(Tx, (int16_t)0x7FFF, (int16_t)0x8000); - SetNCOFrequency(Tx, 0, 0); - - //RxTSP - SetDefaults(RxTSP); - Modify_SPI_Reg_bits(LMS7param(AGC_MODE_RXTSP), 1); - Modify_SPI_Reg_bits(0x040C, 5, 3, 0x7); - Modify_SPI_Reg_bits(LMS7param(AGC_AVG_RXTSP), 7); - Modify_SPI_Reg_bits(LMS7param(CMIX_GAIN_RXTSP), 1); - - float_type sxtfreq = GetFrequencySX_MHz(Tx, mRefClkSXT_MHz); - float_type sxrfreq = GetFrequencySX_MHz(Rx, mRefClkSXR_MHz); - SetNCOFrequency(Rx, 0, sxtfreq - sxrfreq - 1); - return LIBLMS7_SUCCESS; -} - -liblms7_status LMS7002M::RFE_TIA_Calibration(float_type TIA_freq_MHz) -{ - liblms7_status status; - bool prevRSSIbigger; - uint8_t ccomp_tia_rfe_value; - int16_t rcomp_tia_rfe; - float_type cgenFreq = TIA_freq_MHz * 20; - uint32_t rssi; - uint32_t rssi_value_50k; - //RFE - uint8_t g_tia_rfe = (uint8_t)Get_SPI_Reg_bits(LMS7param(G_TIA_RFE)); - int16_t cfb_tia_rfe_value; - if (g_tia_rfe == 1) - cfb_tia_rfe_value = (uint16_t)(5400 / TIA_freq_MHz - 15); - else if (g_tia_rfe > 1) - cfb_tia_rfe_value = (uint16_t)(1680 / TIA_freq_MHz - 10); - else - return LIBLMS7_FAILURE; - Modify_SPI_Reg_bits(LMS7param(CFB_TIA_RFE), cfb_tia_rfe_value); - - if (g_tia_rfe == 1) - ccomp_tia_rfe_value = (uint8_t)(cfb_tia_rfe_value / 100 + 1); - else if (g_tia_rfe > 1) - ccomp_tia_rfe_value = (uint8_t)(cfb_tia_rfe_value / 100); - else - return LIBLMS7_FAILURE; - if (ccomp_tia_rfe_value > 15) - ccomp_tia_rfe_value = 15; - - Modify_SPI_Reg_bits(LMS7param(CCOMP_TIA_RFE), ccomp_tia_rfe_value); - - rcomp_tia_rfe = (int16_t)(15 - cfb_tia_rfe_value * 2 / 100); - if (rcomp_tia_rfe < 0) - rcomp_tia_rfe = 0; - Modify_SPI_Reg_bits(LMS7param(RCOMP_TIA_RFE), rcomp_tia_rfe); - - //RBB - Modify_SPI_Reg_bits(LMS7param(INPUT_CTL_PGA_RBB), 2); - Modify_SPI_Reg_bits(LMS7param(PD_LPFL_RBB), 1); - - //CLKGEN - if (cgenFreq < 60) - cgenFreq = 60; - if (cgenFreq > 640) - cgenFreq = 640; - - if (cgenFreq / 16 == TIA_freq_MHz) - status = SetFrequencyCGEN(cgenFreq - 10); - else - status = SetFrequencyCGEN(cgenFreq); - if (status != LIBLMS7_SUCCESS) - return status; - - FilterTuning_AdjustGains(); - - rssi_value_50k = (uint32_t)( GetRSSI() * 0.707 ); - status = SetFrequencySX(Rx, GetFrequencySX_MHz(Tx, mRefClkSXT_MHz) - TIA_freq_MHz, mRefClkSXR_MHz); - if (status != LIBLMS7_SUCCESS) - return status; - SetNCOFrequency(Rx, 0, GetFrequencySX_MHz(Tx, mRefClkSXT_MHz) - GetFrequencySX_MHz(Rx, mRefClkSXR_MHz) - 1); - - prevRSSIbigger = GetRSSI() > rssi_value_50k; - while (cfb_tia_rfe_value >= 0 && cfb_tia_rfe_value < 4096) - { - Modify_SPI_Reg_bits(LMS7param(CFB_TIA_RFE), cfb_tia_rfe_value); - rssi = GetRSSI(); - if (rssi > rssi_value_50k) - ++cfb_tia_rfe_value; - else - { - --cfb_tia_rfe_value; - if (prevRSSIbigger) - return LIBLMS7_SUCCESS; //found correct value - } - prevRSSIbigger = rssi > rssi_value_50k; - } - return LIBLMS7_FAILURE; -} - -liblms7_status LMS7002M::RxLPFLow_Calibration(float_type RxLPFL_freq_MHz) -{ - liblms7_status status; - uint32_t rssi; - uint32_t rssi_value_50k; - int32_t c_ctl_lpfl_rbb; - bool prevRSSIbigger; - float_type cgenFreq_MHz = RxLPFL_freq_MHz * 20; - //RFE - Modify_SPI_Reg_bits(LMS7param(CFB_TIA_RFE), 15); - Modify_SPI_Reg_bits(LMS7param(CCOMP_TIA_RFE), 1); - Modify_SPI_Reg_bits(LMS7param(RCOMP_TIA_RFE), 15); - Modify_SPI_Reg_bits(LMS7param(G_TIA_RFE), 1); - - //RBB - c_ctl_lpfl_rbb = (int32_t)(2160 / RxLPFL_freq_MHz - 103); - if (c_ctl_lpfl_rbb < 0) - c_ctl_lpfl_rbb = 0; - if (c_ctl_lpfl_rbb > 2047) - c_ctl_lpfl_rbb = 2047; - Modify_SPI_Reg_bits(LMS7param(C_CTL_LPFL_RBB), c_ctl_lpfl_rbb); - - if (RxLPFL_freq_MHz >= 15) - Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFL_RBB), 5); - else if (RxLPFL_freq_MHz >= 10) - Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFL_RBB), 4); - else if (RxLPFL_freq_MHz >= 5) - Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFL_RBB), 3); - else if (RxLPFL_freq_MHz >= 3) - Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFL_RBB), 2); - else if (RxLPFL_freq_MHz >= 1.4) - Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFL_RBB), 1); - else - Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFL_RBB), 0); - - //CLKGEN - if (cgenFreq_MHz < 60) - cgenFreq_MHz = 60; - if (cgenFreq_MHz > 640) - cgenFreq_MHz = 640; - if (cgenFreq_MHz / 16 == RxLPFL_freq_MHz) - status = SetFrequencyCGEN(cgenFreq_MHz - 10); - else - status = SetFrequencyCGEN(cgenFreq_MHz); - if (status != LIBLMS7_SUCCESS) - return status; - - FilterTuning_AdjustGains(); - - rssi_value_50k = (uint32_t)( GetRSSI() * 0.707 ); - status = SetFrequencySX(Rx, GetFrequencySX_MHz(Tx, mRefClkSXT_MHz) - RxLPFL_freq_MHz, mRefClkSXR_MHz); - if (status != LIBLMS7_SUCCESS) - return status; - SetNCOFrequency(Rx, 0, GetFrequencySX_MHz(Tx, mRefClkSXT_MHz) - GetFrequencySX_MHz(Rx, mRefClkSXR_MHz) - 1); - - prevRSSIbigger = GetRSSI() > rssi_value_50k; - while (c_ctl_lpfl_rbb >= 0 && c_ctl_lpfl_rbb < 2048) - { - Modify_SPI_Reg_bits(LMS7param(C_CTL_LPFL_RBB), c_ctl_lpfl_rbb); - rssi = GetRSSI(); - if (rssi > rssi_value_50k) - ++c_ctl_lpfl_rbb; - else - { - --c_ctl_lpfl_rbb; - if (prevRSSIbigger) - return LIBLMS7_SUCCESS; //found correct value - } - prevRSSIbigger = rssi > rssi_value_50k; - } - return LIBLMS7_FAILURE; -} - -liblms7_status LMS7002M::RxLPFHigh_Calibration(float_type RxLPFH_freq_MHz) -{ - liblms7_status status; - int16_t c_ctl_lpfh_rbb; - int16_t rcc_ctl_lpfh_rbb; - float_type cgenFreq = RxLPFH_freq_MHz * 20; - uint32_t rssi; - uint32_t rssi_value_50k; - bool prevRSSIbigger; - //RFE - Modify_SPI_Reg_bits(LMS7param(CFB_TIA_RFE), 15); - Modify_SPI_Reg_bits(LMS7param(CCOMP_TIA_RFE), 1); - Modify_SPI_Reg_bits(LMS7param(RCOMP_TIA_RFE), 15); - Modify_SPI_Reg_bits(LMS7param(G_TIA_RFE), 1); - - //RBB - c_ctl_lpfh_rbb = (int16_t)(6000 / RxLPFH_freq_MHz - 50); - if (c_ctl_lpfh_rbb < 0) - c_ctl_lpfh_rbb = 0; - if (c_ctl_lpfh_rbb > 255) - c_ctl_lpfh_rbb = 255; - Modify_SPI_Reg_bits(LMS7param(C_CTL_LPFH_RBB), c_ctl_lpfh_rbb); - - rcc_ctl_lpfh_rbb = (int16_t)(RxLPFH_freq_MHz / 10 - 3); - if (rcc_ctl_lpfh_rbb < 0) - rcc_ctl_lpfh_rbb = 0; - Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFH_RBB), rcc_ctl_lpfh_rbb); - - Modify_SPI_Reg_bits(LMS7param(INPUT_CTL_PGA_RBB), 1); - Modify_SPI_Reg_bits(LMS7param(PD_LPFL_RBB), 1); - Modify_SPI_Reg_bits(LMS7param(PD_LPFH_RBB), 0); - - //CLKGEN - if (cgenFreq < 60) - cgenFreq = 60; - if (cgenFreq > 640) - cgenFreq = 640; - if (cgenFreq / 16 == RxLPFH_freq_MHz) - status = SetFrequencyCGEN(cgenFreq - 10); - else - status = SetFrequencyCGEN(cgenFreq); - if (status != LIBLMS7_SUCCESS) - return status; - - FilterTuning_AdjustGains(); - - rssi_value_50k = (uint32_t)( GetRSSI() * 0.707); - status = SetFrequencySX(Rx, GetFrequencySX_MHz(Tx, mRefClkSXT_MHz) - RxLPFH_freq_MHz, mRefClkSXR_MHz); - if (status != LIBLMS7_SUCCESS) - return status; - SetNCOFrequency(Rx, 0, GetFrequencySX_MHz(Tx, mRefClkSXT_MHz) - GetFrequencySX_MHz(Rx, mRefClkSXR_MHz) - 1); - - prevRSSIbigger = GetRSSI() > rssi_value_50k; - while (c_ctl_lpfh_rbb >= 0 && c_ctl_lpfh_rbb < 256) - { - Modify_SPI_Reg_bits(LMS7param(C_CTL_LPFH_RBB), c_ctl_lpfh_rbb); - rssi = GetRSSI(); - if (rssi > rssi_value_50k) - ++c_ctl_lpfh_rbb; - else - { - --c_ctl_lpfh_rbb; - if (prevRSSIbigger) - return LIBLMS7_SUCCESS; //found correct value - } - prevRSSIbigger = rssi > rssi_value_50k; - } - return LIBLMS7_FAILURE; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_parameters.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_parameters.cpp deleted file mode 100644 index b28887d776de04f458c823529a6697ebb425fc32..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_parameters.cpp +++ /dev/null @@ -1,601 +0,0 @@ -/** -@file LMS7002M_parameters.cpp -@author Lime Microsystems (www.limemicro.com) -@brief Definition of LMS7002M transceiver control parameters registers -*/ - -#include "LMS7002M_parameters.h" - -std::vector<const LMS7Parameter*> LMS7parameterList; - -const struct LMS7Parameter LRST_TX_B = { 0x0020, 15, 15, 1, "LRST_TX_B", "Resets all the logic registers to the default state for Tx MIMO channel B" }; -const struct LMS7Parameter MRST_TX_B = { 0x0020, 14, 14, 1, "MRST_TX_B", "Resets all the configuration memory to the default state for Tx MIMO channel B" }; -const struct LMS7Parameter LRST_TX_A = { 0x0020, 13, 13, 1, "LRST_TX_A", "Resets all the logic registers to the default state for Tx MIMO channel A" }; -const struct LMS7Parameter MRST_TX_A = { 0x0020, 12, 12, 1, "MRST_TX_A", "Resets all the configuration memory to the default state for Tx MIMO channel A" }; -const struct LMS7Parameter LRST_RX_B = { 0x0020, 11, 11, 1, "LRST_RX_B", "Resets all the logic registers to the default state for Rx MIMO channel B" }; -const struct LMS7Parameter MRST_RX_B = { 0x0020, 10, 10, 1, "MRST_RX_B", "Resets all the configuration memory to the default state for Rx MIMO channel B" }; -const struct LMS7Parameter LRST_RX_A = { 0x0020, 9, 9, 1, "LRST_RX_A", "Resets all the logic registers to the default state for Rx MIMO channel A" }; -const struct LMS7Parameter MRST_RX_A = { 0x0020, 8, 8, 1, "MRST_RX_A", "Resets all the configuration memory to the default state for Rx MIMO channel A" }; -const struct LMS7Parameter SRST_RXFIFO = { 0x0020, 7, 7, 1, "SRST_RXFIFO", "RX FIFO soft reset (LimeLight Interface)" }; -const struct LMS7Parameter SRST_TXFIFO = { 0x0020, 6, 6, 1, "SRST_TXFIFO", "TX FIFO soft reset (LimeLight Interface)" }; -const struct LMS7Parameter RXEN_B = { 0x0020, 5, 5, 1, "RXEN_B", "Power control for Rx MIMO channel B" }; -const struct LMS7Parameter RXEN_A = { 0x0020, 4, 4, 1, "RXEN_A", "Power control for Rx MIMO channel A" }; -const struct LMS7Parameter TXEN_B = { 0x0020, 3, 3, 1, "TXEN_B", "Power control for Tx MIMO channel B" }; -const struct LMS7Parameter TXEN_A = { 0x0020, 2, 2, 1, "TXEN_A", "Power control for Tx MIMO channel A" }; -const struct LMS7Parameter MAC = { 0x0020, 1, 0, 3, "MAC", "Selects MIMO channel for communication" }; -const struct LMS7Parameter TX_CLK_PE = { 0x0021, 11, 11, 1, "TX_CLK_PE", "Pull up control of TX_CLK pad" }; -const struct LMS7Parameter RX_CLK_PE = { 0x0021, 10, 10, 1, "RX_CLK_PE", "Pull up control of RX_CLK pad" }; -const struct LMS7Parameter SDA_PE = { 0x0021, 9, 9, 1, "SDA_PE", "Pull up control of SDA pad" }; -const struct LMS7Parameter SDA_DS = { 0x0021, 8, 8, 0, "SDA_DS", "Driver strength of SDA pad" }; -const struct LMS7Parameter SCL_PE = { 0x0021, 7, 7, 1, "SCL_PE", "Pull up control of SCL pad" }; -const struct LMS7Parameter SCL_DS = { 0x0021, 6, 6, 0, "SCL_DS", "Driver strength of SCL pad" }; -const struct LMS7Parameter SDIO_DS = { 0x0021, 5, 5, 0, "SDIO_DS", "Driver strength of SDIO pad" }; -const struct LMS7Parameter SDIO_PE = { 0x0021, 4, 4, 1, "SDIO_PE", "Pull up control of SDIO pad" }; -const struct LMS7Parameter SDO_PE = { 0x0021, 3, 3, 1, "SDO_PE", "Pull up control of SDO pad" }; -const struct LMS7Parameter SCLK_PE = { 0x0021, 2, 2, 1, "SCLK_PE", "Pull up control of SCLK pad" }; -const struct LMS7Parameter SEN_PE = { 0x0021, 1, 1, 1, "SEN_PE", "Pull up control of SEN pad" }; -const struct LMS7Parameter SPIMODE = { 0x0021, 0, 0, 1, "SPIMODE", "SPI communication mode" }; -const struct LMS7Parameter DIQ2_DS = { 0x0022, 11, 11, 0, "DIQ2_DS", "Driver strength of DIQ2 pad" }; -const struct LMS7Parameter DIQ2_PE = { 0x0022, 10, 10, 1, "DIQ2_PE", "Pull up control of DIQ2 pad" }; -const struct LMS7Parameter IQ_SEL_EN_2_PE = { 0x0022, 9, 9, 1, "IQ_SEL_EN_2_PE", "Pull up control of IQ_SEL_EN_2 pad" }; -const struct LMS7Parameter TXNRX2_PE = { 0x0022, 8, 8, 1, "TXNRX2_PE", "Pull up control of TXNRX2 pad" }; -const struct LMS7Parameter FCLK2_PE = { 0x0022, 7, 7, 1, "FCLK2_PE", "Pull up control of FCLK2 pad" }; -const struct LMS7Parameter MCLK2_PE = { 0x0022, 6, 6, 1, "MCLK2_PE", "Pull up control of MCLK2 pad" }; -const struct LMS7Parameter DIQ1_DS = { 0x0022, 5, 5, 0, "DIQ1_DS", "Pull up control of MCLK2 pad" }; -const struct LMS7Parameter DIQ1_PE = { 0x0022, 4, 4, 1, "DIQ1_PE", "Pull up control of DIQ1 pad" }; -const struct LMS7Parameter IQ_SEL_EN_1_PE = { 0x0022, 3, 3, 1, "IQ_SEL_EN_1_PE", "Pull up control of IQ_SEL_EN_1 pad" }; -const struct LMS7Parameter TXNRX1_PE = { 0x0022, 2, 2, 1, "TXNRX1_PE", "Pull up control of TXNRX1 pad" }; -const struct LMS7Parameter FCLK1_PE = { 0x0022, 1, 1, 1, "FCLK1_PE", "Pull up control of FCLK1 pad" }; -const struct LMS7Parameter MCLK1_PE = { 0x0022, 0, 0, 1, "MCLK1_PE", "Pull up control of MCLK1 pad" }; -const struct LMS7Parameter DIQDIRCTR2 = { 0x0023, 15, 15, 0, "DIQDIRCTR2", "DIQ2 direction control mode" }; -const struct LMS7Parameter DIQDIR2 = { 0x0023, 14, 14, 1, "DIQDIR2", "DIQ2 direction" }; -const struct LMS7Parameter DIQDIRCTR1 = { 0x0023, 13, 13, 0, "DIQDIRCTR1", "DIQ1 direction control mode" }; -const struct LMS7Parameter DIQDIR1 = { 0x0023, 12, 12, 1, "DIQDIR1", "DIQ1 direction" }; -const struct LMS7Parameter ENABLEDIRCTR2 = { 0x0023, 11, 11, 0, "ENABLEDIRCTR2", "ENABLE2 direction control mode" }; -const struct LMS7Parameter ENABLEDIR2 = { 0x0023, 10, 10, 1, "ENABLEDIR2", "ENABLE2 direction" }; -const struct LMS7Parameter ENABLEDIRCTR1 = { 0x0023, 9, 9, 0, "ENABLEDIRCTR1", "ENABLE1 direction control mode" }; -const struct LMS7Parameter ENABLEDIR1 = { 0x0023, 8, 8, 1, "ENABLEDIR1", "ENABLE1 direction." }; -const struct LMS7Parameter MOD_EN = { 0x0023, 6, 6, 1, "MOD_EN", "LimeLight interface enable" }; -const struct LMS7Parameter LML2_FIDM = { 0x0023, 5, 5, 0, "LML2_FIDM", "Frame start ID selection for Port 2 when LML_MODE2 = 0" }; -const struct LMS7Parameter LML2_TXNRXIQ = { 0x0023, 4, 4, 1, "LML2_TXNRXIQ", "TXIQ/RXIQ mode selection for Port 2 when LML_MODE2 = 0" }; -const struct LMS7Parameter LML2_MODE = { 0x0023, 3, 3, 1, "LML2_MODE", "Mode of LimeLight Port 2" }; -const struct LMS7Parameter LML1_FIDM = { 0x0023, 2, 2, 0, "LML1_FIDM", "Frame start ID selection for Port 1 when LML_MODE1 = 0" }; -const struct LMS7Parameter LML1_TXNRXIQ = { 0x0023, 1, 1, 0, "LML1_TXNRXIQ", "TXIQ/RXIQ mode selection for Port 1 when LML_MODE1 = 0" }; -const struct LMS7Parameter LML1_MODE = { 0x0023, 0, 0, 1, "LML1_MODE", "Mode of LimeLight Port 1" }; -const struct LMS7Parameter LML1_S3S = { 0x0024, 15, 14, 3, "LML1_S3S", "Sample source in position 3, when Port 1 is RF2BB" }; -const struct LMS7Parameter LML1_S2S = { 0x0024, 13, 12, 2, "LML1_S2S", "Sample source in position 2, when Port 1 is RF2BB" }; -const struct LMS7Parameter LML1_S1S = { 0x0024, 11, 10, 1, "LML1_S1S", "Sample source in position 1, when Port 1 is RF2BB" }; -const struct LMS7Parameter LML1_S0S = { 0x0024, 9, 8, 0, "LML1_S0S", "Sample source in position 0, when Port 1 is RF2BB" }; -const struct LMS7Parameter LML1_BQP = { 0x0024, 7, 6, 3, "LML1_BQP", "BQ sample position in frame, when Port 1 is BB2RF" }; -const struct LMS7Parameter LML1_BIP = { 0x0024, 5, 4, 2, "LML1_BIP", "BI sample position in frame, when Port 1 is BB2RF" }; -const struct LMS7Parameter LML1_AQP = { 0x0024, 3, 2, 1, "LML1_AQP", "AQ sample position in frame, when Port 1 is BB2RF" }; -const struct LMS7Parameter LML1_AIP = { 0x0024, 1, 0, 0, "LML1_AIP", "AI sample position in frame, when Port 1 is BB2RF" }; -const struct LMS7Parameter LML1_BB2RF_PST = { 0x0025, 15, 8, 1, "LML1_BB2RF_PST", "Number of clock cycles to wait before data drive stop after burst stop is detected in JESD207 mode on Port 1 and Port 1 BB2RF" }; -const struct LMS7Parameter LML1_BB2RF_PRE = { 0x0025, 7, 0, 1, "LML1_BB2RF_PRE", "Number of clock cycles to wait before data drive start after burst start is detected in JESD207 mode on Port 1 and Port 1 BB2RF" }; -const struct LMS7Parameter LML1_RF2BB_PST = { 0x0026, 15, 8, 1, "LML1_RF2BB_PST", "Number of clock cycles to wait before data capture stop after burst stop is detected in JESD207 mode on Port 1 and Port 1 is RF2BB" }; -const struct LMS7Parameter LML1_RF2BB_PRE = { 0x0026, 7, 0, 1, "LML1_RF2BB_PRE", "Number of clock cycles to wait before data capture start after burst start is detected in JESD207 mode on Port 1 and Port 1 RF2BB" }; -const struct LMS7Parameter LML2_S3S = { 0x0027, 15, 14, 3, "LML2_S3S", "Sample source in position 3, when Port 2 is RF2BB" }; -const struct LMS7Parameter LML2_S2S = { 0x0027, 13, 12, 2, "LML2_S2S", "Sample source in position 2, when Port 2 is RF2BB" }; -const struct LMS7Parameter LML2_S1S = { 0x0027, 11, 10, 1, "LML2_S1S", "Sample source in position 1, when Port 2 is RF2BB" }; -const struct LMS7Parameter LML2_S0S = { 0x0027, 9, 8, 0, "LML2_S0S", "Sample source in position 0, when Port 2 is RF2BB" }; -const struct LMS7Parameter LML2_BQP = { 0x0027, 7, 6, 3, "LML2_BQP", "BQ sample position in frame, when Port 2 is BB2RF" }; -const struct LMS7Parameter LML2_BIP = { 0x0027, 5, 4, 2, "LML2_BIP", "BI sample position in frame, when Port 2 is BB2RF" }; -const struct LMS7Parameter LML2_AQP = { 0x0027, 3, 2, 1, "LML2_AQP", "AQ sample position in frame, when Port 2 is BB2RF" }; -const struct LMS7Parameter LML2_AIP = { 0x0027, 1, 0, 0, "LML2_AIP", "AI sample position in frame, when Port 2 is BB2RF" }; -const struct LMS7Parameter LML2_BB2RF_PST = { 0x0028, 15, 8, 1, "LML2_BB2RF_PST", "Number of clock cycles to wait before data drive stop after burst stop is detected in JESD207 mode on Port 2 and Port 2 BB2RF" }; -const struct LMS7Parameter LML2_BB2RF_PRE = { 0x0028, 7, 0, 1, "LML2_BB2RF_PRE", "Number of clock cycles to wait before data drive start after burst start is detected in JESD207 mode on Port 2 and Port 2 BB2RF" }; -const struct LMS7Parameter LML2_RF2BB_PST = { 0x0029, 15, 8, 1, "LML2_RF2BB_PST", "Number of clock cycles to wait before data capture stop after burst stop is detected in JESD207 mode on Port 2 and Port 2 RF2BB" }; -const struct LMS7Parameter LML2_RF2BB_PRE = { 0x0029, 7, 0, 1, "LML2_RF2BB_PRE", "Number of clock cycles to wait before data capture start after burst start is detected in JESD207 mode on Port 2 and Port 2 RF2BB" }; -const struct LMS7Parameter FCLK2_DLY = { 0x002A, 15, 14, 0, "FCLK2_DLY", "" }; -const struct LMS7Parameter FCLK1_DLY = { 0x002A, 13, 12, 0, "FCLK1_DLY", "" }; -const struct LMS7Parameter RX_MUX = { 0x002A, 11, 10, 0, "RX_MUX", "RxFIFO data source selection" }; -const struct LMS7Parameter TX_MUX = { 0x002A, 9, 8, 0, "TX_MUX", "Port selection for data transmit to TSP" }; -const struct LMS7Parameter TXRDCLK_MUX = { 0x002A, 7, 6, 2, "TXRDCLK_MUX", "TX FIFO read clock selection" }; -const struct LMS7Parameter TXWRCLK_MUX = { 0x002A, 5, 4, 0, "TXWRCLK_MUX", "TX FIFO write clock selection" }; -const struct LMS7Parameter RXRDCLK_MUX = { 0x002A, 3, 2, 1, "RXRDCLK_MUX", "RX FIFO read clock selection" }; -const struct LMS7Parameter RXWRCLK_MUX = { 0x002A, 1, 0, 2, "RXWRCLK_MUX", "RX FIFO write clock selection" }; -const struct LMS7Parameter FCLK2_INV = { 0x002B, 15, 15, 0, "FCLK2_INV", "FCLK2 clock inversion" }; -const struct LMS7Parameter FCLK1_INV = { 0x002B, 14, 14, 0, "FCLK1_INV", "FCLK1 clock inversion" }; -const struct LMS7Parameter MCLK2DLY = { 0x002B, 13, 12, 0, "MCLK2DLY", "MCLK2 clock internal delay" }; -const struct LMS7Parameter MCLK1DLY = { 0x002B, 11, 10, 0, "MCLK1DLY", "MCLK1 clock internal delay" }; -const struct LMS7Parameter MCLK2SRC = { 0x002B, 5, 4, 1, "MCLK2SRC", "MCLK2 clock source" }; -const struct LMS7Parameter MCLK1SRC = { 0x002B, 3, 2, 0, "MCLK1SRC", "MCLK1 clock source" }; -const struct LMS7Parameter TXDIVEN = { 0x002B, 1, 1, 0, "TXDIVEN", "TX clock divider enable" }; -const struct LMS7Parameter RXDIVEN = { 0x002B, 0, 0, 0, "RXDIVEN", "RX clock divider enable" }; -const struct LMS7Parameter TXTSPCLKA_DIV = { 0x002C, 15, 8, 255, "TXTSPCLKA_DIV", "TxTSP clock divider, used to produce MCLK(1/2). Clock division ratio is 2(TXTSPCLKA_DIV + 1)"}; -const struct LMS7Parameter RXTSPCLKA_DIV = { 0x002C, 7, 0, 255, "RXTSPCLKA_DIV", "RxTSP clock divider, used to produce MCLK(1/2). Clock division ratio is 2(RXTSPCLKA_DIV + 1)"}; -const struct LMS7Parameter MIMO_SISO = { 0x002E, 15, 15, 0, "MIMO_SISO", "MIMO channel B enable control" }; -const struct LMS7Parameter VER = { 0x002F, 15, 11, 7, "VER", "" }; -const struct LMS7Parameter REV = { 0x002F, 10, 6, 1, "REV", "" }; -const struct LMS7Parameter MASK = { 0x002F, 5, 0, 0, "MASK", "" }; -const struct LMS7Parameter EN_DIR_LDO = { 0x0081, 3, 3, 0, "EN_DIR_LDO", "" }; -const struct LMS7Parameter EN_DIR_CGEN = { 0x0081, 2, 2, 0, "EN_DIR_CGEN", "" }; -const struct LMS7Parameter EN_DIR_XBUF = { 0x0081, 1, 1, 0, "EN_DIR_XBUF", "" }; -const struct LMS7Parameter EN_DIR_AFE = { 0x0081, 0, 0, 0, "EN_DIR_AFE", "" }; -const struct LMS7Parameter ISEL_DAC_AFE = { 0x0082, 15, 13, 4, "ISEL_DAC_AFE", "Controls the peak current of the DAC output current" }; -const struct LMS7Parameter MODE_INTERLEAVE_AFE = { 0x0082, 12, 12, 0, "MODE_INTERLEAVE_AFE", "time interleaves the two ADCs into one ADC" }; -const struct LMS7Parameter MUX_AFE_1 = { 0x0082, 11, 10, 0, "MUX_AFE_1", "Controls the MUX at the input of the ADC channel 1" }; -const struct LMS7Parameter MUX_AFE_2 = { 0x0082, 9, 8, 0, "MUX_AFE_2", "Controls the MUX at the input of the ADC channel 2" }; -const struct LMS7Parameter PD_AFE = { 0x0082, 5, 5, 0, "PD_AFE", "Power down control for the AFE current mirror in BIAS_TOP" }; -const struct LMS7Parameter PD_RX_AFE1 = { 0x0082, 4, 4, 0, "PD_RX_AFE1", "Power down control for the ADC of channel 1" }; -const struct LMS7Parameter PD_RX_AFE2 = { 0x0082, 3, 3, 1, "PD_RX_AFE2", "Power down control for the ADC of channel 2" }; -const struct LMS7Parameter PD_TX_AFE1 = { 0x0082, 2, 2, 0, "PD_TX_AFE1", "Power down control for the DAC of channel 1" }; -const struct LMS7Parameter PD_TX_AFE2 = { 0x0082, 1, 1, 1, "PD_TX_AFE2", "Power down control for the DAC of channel 2" }; -const struct LMS7Parameter EN_G_AFE = { 0x0082, 0, 0, 1, "EN_G_AFE", "Enable control for all the AFE power downs" }; -const struct LMS7Parameter MUX_BIAS_OUT = { 0x0084, 12, 11, 0, "MUX_BIAS_OUT", "Test mode of the BIAS_TOP" }; -const struct LMS7Parameter RP_CALIB_BIAS = { 0x0084, 10, 6, 16, "RP_CALIB_BIAS", "Calibration code for rppolywo. This code is set by the calibration algorithm: BIAS_RPPOLY_calibration" }; -const struct LMS7Parameter PD_FRP_BIAS = { 0x0084, 4, 4, 0, "PD_FRP_BIAS", "Power down signal for Fix/RP block" }; -const struct LMS7Parameter PD_F_BIAS = { 0x0084, 3, 3, 0, "PD_F_BIAS", "Power down signal for Fix" }; -const struct LMS7Parameter PD_PTRP_BIAS = { 0x0084, 2, 2, 0, "PD_PTRP_BIAS", "Power down signal for PTAT/RP block" }; -const struct LMS7Parameter PD_PT_BIAS = { 0x0084, 1, 1, 0, "PD_PT_BIAS", "Power down signal for PTAT block" }; -const struct LMS7Parameter PD_BIAS_MASTER = { 0x0084, 0, 0, 0, "PD_BIAS_MASTER", "Enable signal for central bias block" }; -const struct LMS7Parameter SLFB_XBUF_RX = { 0x0085, 8, 8, 0, "SLFB_XBUF_RX", "Self biasing digital contol SLFB_XBUF_RX" }; -const struct LMS7Parameter SLFB_XBUF_TX = { 0x0085, 7, 7, 0, "SLFB_XBUF_TX", "Self biasing digital contol SLFB_XBUF_TX" }; -const struct LMS7Parameter BYP_XBUF_RX = { 0x0085, 6, 6, 0, "BYP_XBUF_RX", "Shorts the Input 3.3V buffer in XBUF" }; -const struct LMS7Parameter BYP_XBUF_TX = { 0x0085, 5, 5, 0, "BYP_XBUF_TX", "Shorts the Input 3.3V buffer in XBUF" }; -const struct LMS7Parameter EN_OUT2_XBUF_TX = { 0x0085, 4, 4, 0, "EN_OUT2_XBUF_TX", "Enables the 2nd output of TX XBUF. This 2nd buffer goes to XBUF_RX. This should be active when only 1 XBUF is to be used" }; -const struct LMS7Parameter EN_TBUFIN_XBUF_RX = { 0x0085, 3, 3, 0, "EN_TBUFIN_XBUF_RX", "Disables the input from the external XOSC and buffers the 2nd input signal (from TX XBUF 2nd output) to the RX. This should be active when only 1 XBUF is to be used" }; -const struct LMS7Parameter PD_XBUF_RX = { 0x0085, 2, 2, 0, "PD_XBUF_RX", "Power down signal PD_XBUF_RX" }; -const struct LMS7Parameter PD_XBUF_TX = { 0x0085, 1, 1, 0, "PD_XBUF_TX", "Power down signal PD_XBUF_TX" }; -const struct LMS7Parameter EN_G_XBUF = { 0x0085, 0, 0, 1, "EN_G_XBUF", "Enable control for all the XBUF power downs" }; -const struct LMS7Parameter SPDUP_VCO_CGEN = { 0x0086, 15, 15, 0, "SPDUP_VCO_CGEN", "Bypasses the noise filter resistor for fast setlling time. It should be connected to a 1us pulse" }; -const struct LMS7Parameter RESET_N_CGEN = { 0x0086, 14, 14, 1, "RESET_N_CGEN", "A pulse should be used in the start-up to reset ( 1-normal operation)" }; -const struct LMS7Parameter EN_ADCCLKH_CLKGN = { 0x0086, 11, 11, 1, "EN_ADCCLKH_CLKGN", "Selects if F_CLKH or F_CLKL is connected to FCLK_ADC" }; -const struct LMS7Parameter EN_COARSE_CKLGEN = { 0x0086, 10, 10, 0, "EN_COARSE_CKLGEN", "Enable signal for coarse tuning block" }; -const struct LMS7Parameter EN_INTONLY_SDM_CGEN = { 0x0086, 9, 9, 0, "EN_INTONLY_SDM_CGEN", "Enables INTEGER-N mode of the SX " }; -const struct LMS7Parameter EN_SDM_CLK_CGEN = { 0x0086, 8, 8, 1, "EN_SDM_CLK_CGEN", "Enables/Disables SDM clock. In INT-N mode or for noise testing, SDM clock can be disabled" }; -const struct LMS7Parameter PD_CP_CGEN = { 0x0086, 6, 6, 0, "PD_CP_CGEN", "Power down for Charge Pump" }; -const struct LMS7Parameter PD_FDIV_FB_CGEN = { 0x0086, 5, 5, 0, "PD_FDIV_FB_CGEN", "Power down for feedback frequency divider" }; -const struct LMS7Parameter PD_FDIV_O_CGEN = { 0x0086, 4, 4, 0, "PD_FDIV_O_CGEN", "Power down for forward frequency divider of the CGEN block" }; -const struct LMS7Parameter PD_SDM_CGEN = { 0x0086, 3, 3, 0, "PD_SDM_CGEN", "Power down for SDM" }; -const struct LMS7Parameter PD_VCO_CGEN = { 0x0086, 2, 2, 0, "PD_VCO_CGEN", "Power down for VCO" }; -const struct LMS7Parameter PD_VCO_COMP_CGEN = { 0x0086, 1, 1, 0, "PD_VCO_COMP_CGEN", "Power down for VCO comparator" }; -const struct LMS7Parameter EN_G_CGEN = { 0x0086, 0, 0, 1, "EN_G_CGEN", "Enable control for all the CGEN power downs" }; -const struct LMS7Parameter FRAC_SDM_CGEN_LSB = { 0x0087, 15, 0, 0x0400, "FRAC_SDM_CGEN_LSB", "" }; -const struct LMS7Parameter INT_SDM_CGEN = { 0x0088, 13, 4, 120, "INT_SDM_CGEN", "" }; -const struct LMS7Parameter FRAC_SDM_CGEN_MSB = { 0x0088, 3, 0, 0, "FRAC_SDM_CGEN_MSB", "" }; -const struct LMS7Parameter REV_SDMCLK_CGEN = { 0x0089, 15, 15, 0, "REV_SDMCLK_CGEN", "Reverses the SDM clock" }; -const struct LMS7Parameter SEL_SDMCLK_CGEN = { 0x0089, 14, 14, 0, "SEL_SDMCLK_CGEN", "Selects between the feedback divider output and Fref for SDM" }; -const struct LMS7Parameter SX_DITHER_EN_CGEN = { 0x0089, 13, 13, 0, "SX_DITHER_EN_CGEN", "Enabled dithering in SDM" }; -const struct LMS7Parameter CLKH_OV_CLKL_CGEN = { 0x0089, 12, 11, 0, "CLKH_OV_CLKL_CGEN", "FCLKL here is ADC clock. FCLKH is the clock to the DAC and if no division is added to the ADC as well" }; -const struct LMS7Parameter DIV_OUTCH_CGEN = { 0x0089, 10, 3, 4, "DIV_OUTCH_CGEN", "" }; -const struct LMS7Parameter TST_CGEN = { 0x0089, 2, 0, 0, "TST_CGEN", -"Controls the test mode of the SX\n\ -0 - TST disabled; RSSI analog outputs enabled if RSSI blocks active and when all PLL test signals are off\n\ -1 - tstdo[0] = ADC clock; tstdo[1] = DAC clock; tstao = High impedance;\n\ -2 - tstdo[0] = SDM clock; tstdo[1] = feedback divider output; tstao = VCO tune through a 60kOhm resistor;\n\ -3 - tstdo[0] = Reference clock; tstdo[1] = feedback divider output; tstao = VCO tune through a 10kOhm resistor;\n\ -4 - tstdo[0] = High impedance; tstdo[1] = High impedance; tstao = High impedance;\n\ -5 - tstdo[0] = Charge pump Down signal; tstdo[1] = Charge pump Up signal; tstao = High impedance;\n\ -6 - tstdo[0] = High impedance; tstdo[1] = High impedance; tstao = VCO tune through a 60kOhm resistor;\n\ -7 - tstdo[0] = High impedance; tstdo[1] = High impedance; tstao = VCO tune through a 10kOhm resistor;\n\ -if TST_SX[2] = 1 --> VCO_TSTBUF active generating VCO_TST_DIV20 and VCO_TST_DIV40"}; -const struct LMS7Parameter REV_CLKDAC_CGEN = { 0x008A, 14, 14, 0, "REV_CLKDAC_CGEN", "Inverts the clock F_CLKL" }; -const struct LMS7Parameter CMPLO_CTRL_CGEN = { 0x008A, 27, 14, 0, "CMPLO_CTRL_CGEN", "" }; -const struct LMS7Parameter REV_CLKADC_CGEN = { 0x008A, 13, 13, 0, "REV_CLKADC_CGEN", "Inverts the clock F_CLKL" }; -const struct LMS7Parameter REVPH_PFD_CGEN = { 0x008A, 12, 12, 0, "REVPH_PFD_CGEN", "Reverse the pulses of PFD. It can be used to reverse the polarity of the PLL loop (positive feedback to negative feedback)" }; -const struct LMS7Parameter IOFFSET_CP_CGEN = { 0x008A, 11, 6, 20, "IOFFSET_CP_CGEN", "Scales the offset current of the charge pump, 0-->63. This current is used in Fran-N mode to create an offset in the CP response and avoide the non-linear section" }; -const struct LMS7Parameter IPULSE_CP_CGEN = { 0x008A, 5, 0, 20, "IPULSE_CP_CGEN", "Scales the pulse current of the charge pump" }; -const struct LMS7Parameter ICT_VCO_CGEN = { 0x008B, 13, 9, 16, "ICT_VCO_CGEN", "Scales the VCO bias current from 0 to 2.5xInom" }; -const struct LMS7Parameter CSW_VCO_CGEN = { 0x008B, 8, 1, 128, "CSW_VCO_CGEN", "" }; -const struct LMS7Parameter COARSE_START_CGEN = { 0x008B, 0, 0, 0, "COARSE_START_CGEN", "Control signal for coarse tuning algorithm (SX_SWC_calibration)" }; -const struct LMS7Parameter COARSE_STEPDONE_CGEN = { 0x008C, 15, 15, 0, "COARSE_STEPDONE_CGEN", "" }; -const struct LMS7Parameter COARSEPLL_COMPO_CGEN = { 0x008C, 14, 14, 0, "COARSEPLL_COMPO_CGEN", "" }; -const struct LMS7Parameter VCO_CMPHO_CGEN = { 0x008C, 13, 13, 0, "VCO_CMPHO_CGEN", "" }; -const struct LMS7Parameter VCO_CMPLO_CGEN = { 0x008C, 12, 12, 0, "VCO_CMPLO_CGEN", "" }; -const struct LMS7Parameter CP2_CGEN = { 0x008C, 11, 8, 6, "CP2_CGEN", "Controls the value of CP2 (cap from CP output to GND) in the PLL filter" }; -const struct LMS7Parameter CP3_CGEN = { 0x008C, 7, 4, 7, "CP3_CGEN", "Controls the value of CP3 (cap from VCO Vtune input to GND) in the PLL filter" }; -const struct LMS7Parameter CZ_CGEN = { 0x008C, 3, 0, 11, "CZ_CGEN", "Controls the value of CZ (Zero capacitor) in the PLL filter" }; -const struct LMS7Parameter EN_LDO_DIG = { 0x0092, 15, 15, 0, "EN_LDO_DIG", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_DIGGN = { 0x0092, 14, 14, 0, "EN_LDO_DIGGN", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_DIGSXR = { 0x0092, 13, 13, 0, "EN_LDO_DIGSXR", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_DIGSXT = { 0x0092, 12, 12, 0, "EN_LDO_DIGSXT", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_DIVGN = { 0x0092, 11, 11, 0, "EN_LDO_DIVGN", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_DIVSXR = { 0x0092, 10, 10, 0, "EN_LDO_DIVSXR", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_DIVSXT = { 0x0092, 9, 9, 0, "EN_LDO_DIVSXT", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_LNA12 = { 0x0092, 8, 8, 0, "EN_LDO_LNA12", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_LNA14 = { 0x0092, 7, 7, 0, "EN_LDO_LNA14", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_MXRFE = { 0x0092, 6, 6, 0, "EN_LDO_MXRFE", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_RBB = { 0x0092, 5, 5, 0, "EN_LDO_RBB", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_RXBUF = { 0x0092, 4, 4, 0, "EN_LDO_RXBUF", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_TBB = { 0x0092, 3, 3, 0, "EN_LDO_TBB", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_TIA12 = { 0x0092, 2, 2, 0, "EN_LDO_TIA12", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_TIA14 = { 0x0092, 1, 1, 0, "EN_LDO_TIA14", "Enables the LDO" }; -const struct LMS7Parameter EN_G_LDO = { 0x0092, 0, 0, 1, "EN_G_LDO", "Enable control for all the LDO power downs" }; -const struct LMS7Parameter EN_LOADIMP_LDO_TLOB = { 0x0093, 15, 15, 0, "EN_LOADIMP_LDO_TLOB", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_TPAD = { 0x0093, 14, 14, 0, "EN_LOADIMP_LDO_TPAD", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_TXBUF = { 0x0093, 13, 13, 0, "EN_LOADIMP_LDO_TXBUF", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_VCOGN = { 0x0093, 12, 12, 0, "EN_LOADIMP_LDO_VCOGN", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_VCOSXR = { 0x0093, 11, 11, 0, "EN_LOADIMP_LDO_VCOSXR", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_VCOSXT = { 0x0093, 10, 10, 0, "EN_LOADIMP_LDO_VCOSXT", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LDO_AFE = { 0x0093, 9, 9, 0, "EN_LDO_AFE", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_CPGN = { 0x0093, 8, 8, 0, "EN_LDO_CPGN", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_CPSXR = { 0x0093, 7, 7, 0, "EN_LDO_CPSXR", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_TLOB = { 0x0093, 6, 6, 0, "EN_LDO_TLOB", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_TPAD = { 0x0093, 5, 5, 0, "EN_LDO_TPAD", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_TXBUF = { 0x0093, 4, 4, 0, "EN_LDO_TXBUF", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_VCOGN = { 0x0093, 3, 3, 0, "EN_LDO_VCOGN", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_VCOSXR = { 0x0093, 2, 2, 0, "EN_LDO_VCOSXR", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_VCOSXT = { 0x0093, 1, 1, 0, "EN_LDO_VCOSXT", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_CPSXT = { 0x0093, 0, 0, 0, "EN_LDO_CPSXT", "Enables the LDO" }; -const struct LMS7Parameter EN_LOADIMP_LDO_CPSXT = { 0x0094, 15, 15, 0, "EN_LOADIMP_LDO_CPSXT", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_DIG = { 0x0094, 14, 14, 0, "EN_LOADIMP_LDO_DIG", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_DIGGN = { 0x0094, 13, 13, 0, "EN_LOADIMP_LDO_DIGGN", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_DIGSXR = { 0x0094, 12, 12, 0, "EN_LOADIMP_LDO_DIGSXR", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_DIGSXT = { 0x0094, 11, 11, 0, "EN_LOADIMP_LDO_DIGSXT", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_DIVGN = { 0x0094, 10, 10, 0, "EN_LOADIMP_LDO_DIVGN", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_DIVSXR = { 0x0094, 9, 9, 0, "EN_LOADIMP_LDO_DIVSXR", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_DIVSXT = { 0x0094, 8, 8, 0, "EN_LOADIMP_LDO_DIVSXT", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_LNA12 = { 0x0094, 7, 7, 0, "EN_LOADIMP_LDO_LNA12", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_LNA14 = { 0x0094, 6, 6, 0, "EN_LOADIMP_LDO_LNA14", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_MXRFE = { 0x0094, 5, 5, 0, "EN_LOADIMP_LDO_MXRFE", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_RBB = { 0x0094, 4, 4, 0, "EN_LOADIMP_LDO_RBB", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_RXBUF = { 0x0094, 3, 3, 0, "EN_LOADIMP_LDO_RXBUF", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_TBB = { 0x0094, 2, 2, 0, "EN_LOADIMP_LDO_TBB", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_TIA12 = { 0x0094, 1, 1, 0, "EN_LOADIMP_LDO_TIA12", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_TIA14 = { 0x0094, 0, 0, 0, "EN_LOADIMP_LDO_TIA14", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter BYP_LDO_TBB = { 0x0095, 15, 15, 0, "BYP_LDO_TBB", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_TIA12 = { 0x0095, 14, 14, 0, "BYP_LDO_TIA12", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_TIA14 = { 0x0095, 13, 13, 0, "BYP_LDO_TIA14", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_TLOB = { 0x0095, 12, 12, 0, "BYP_LDO_TLOB", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_TPAD = { 0x0095, 11, 11, 0, "BYP_LDO_TPAD", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_TXBUF = { 0x0095, 10, 10, 0, "BYP_LDO_TXBUF", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_VCOGN = { 0x0095, 9, 9, 0, "BYP_LDO_VCOGN", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_VCOSXR = { 0x0095, 8, 8, 0, "BYP_LDO_VCOSXR", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_VCOSXT = { 0x0095, 7, 7, 0, "BYP_LDO_VCOSXT", "Bypass signal for the LDO" }; -const struct LMS7Parameter EN_LOADIMP_LDO_AFE = { 0x0095, 2, 2, 0, "EN_LOADIMP_LDO_AFE", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_CPGN = { 0x0095, 1, 1, 0, "EN_LOADIMP_LDO_CPGN", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_CPSXR = { 0x0095, 0, 0, 0, "EN_LOADIMP_LDO_CPSXR", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter BYP_LDO_AFE = { 0x0096, 15, 15, 0, "BYP_LDO_AFE", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_CPGN = { 0x0096, 14, 14, 0, "BYP_LDO_CPGN", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_CPSXR = { 0x0096, 13, 13, 0, "BYP_LDO_CPSXR", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_CPSXT = { 0x0096, 12, 12, 0, "BYP_LDO_CPSXT", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_DIG = { 0x0096, 11, 11, 0, "BYP_LDO_DIG", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_DIGGN = { 0x0096, 10, 10, 0, "BYP_LDO_DIGGN", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_DIGSXR = { 0x0096, 9, 9, 0, "BYP_LDO_DIGSXR", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_DIGSXT = { 0x0096, 8, 8, 0, "BYP_LDO_DIGSXT", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_DIVGN = { 0x0096, 7, 7, 0, "BYP_LDO_DIVGN", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_DIVSXR = { 0x0096, 6, 6, 0, "BYP_LDO_DIVSXR", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_DIVSXT = { 0x0096, 5, 5, 0, "BYP_LDO_DIVSXT", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_LNA12 = { 0x0096, 4, 4, 0, "BYP_LDO_LNA12", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_LNA14 = { 0x0096, 3, 3, 0, "BYP_LDO_LNA14", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_MXRFE = { 0x0096, 2, 2, 0, "BYP_LDO_MXRFE", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_RBB = { 0x0096, 1, 1, 0, "BYP_LDO_RBB", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_RXBUF = { 0x0096, 0, 0, 0, "BYP_LDO_RXBUF", "Bypass signal for the LDO" }; -const struct LMS7Parameter SPDUP_LDO_DIVSXR = { 0x0097, 15, 15, 0, "SPDUP_LDO_DIVSXR", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_DIVSXT = { 0x0097, 14, 14, 0, "SPDUP_LDO_DIVSXT", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_LNA12 = { 0x0097, 13, 13, 0, "SPDUP_LDO_LNA12", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_LNA14 = { 0x0097, 12, 12, 0, "SPDUP_LDO_LNA14", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_MXRFE = { 0x0097, 11, 11, 0, "SPDUP_LDO_MXRFE", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_RBB = { 0x0097, 10, 10, 0, "SPDUP_LDO_RBB", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_RXBUF = { 0x0097, 9, 9, 0, "SPDUP_LDO_RXBUF", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_TBB = { 0x0097, 8, 8, 0, "SPDUP_LDO_TBB", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_TIA12 = { 0x0097, 7, 7, 0, "SPDUP_LDO_TIA12", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_TIA14 = { 0x0097, 6, 6, 0, "SPDUP_LDO_TIA14", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_TLOB = { 0x0097, 5, 5, 0, "SPDUP_LDO_TLOB", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_TPAD = { 0x0097, 4, 4, 0, "SPDUP_LDO_TPAD", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_TXBUF = { 0x0097, 3, 3, 0, "SPDUP_LDO_TXBUF", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_VCOGN = { 0x0097, 2, 2, 0, "SPDUP_LDO_VCOGN", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_VCOSXR = { 0x0097, 1, 1, 0, "SPDUP_LDO_VCOSXR", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_VCOSXT = { 0x0097, 0, 0, 0, "SPDUP_LDO_VCOSXT", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_AFE = { 0x0098, 8, 8, 0, "SPDUP_LDO_AFE", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_CPGN = { 0x0098, 7, 7, 0, "SPDUP_LDO_CPGN", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_CPSXR = { 0x0098, 6, 6, 0, "SPDUP_LDO_CPSXR", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_CPSXT = { 0x0098, 5, 5, 0, "SPDUP_LDO_CPSXT", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_DIG = { 0x0098, 4, 4, 0, "SPDUP_LDO_DIG", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_DIGGN = { 0x0098, 3, 3, 0, "SPDUP_LDO_DIGGN", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_DIGSXR = { 0x0098, 2, 2, 0, "SPDUP_LDO_DIGSXR", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_DIGSXT = { 0x0098, 1, 1, 0, "SPDUP_LDO_DIGSXT", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_DIVGN = { 0x0098, 0, 0, 0, "SPDUP_LDO_DIVGN", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter RDIV_VCOSXR = { 0x0099, 15, 8, 101, "RDIV_VCOSXR", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_VCOSXT = { 0x0099, 7, 0, 101, "RDIV_VCOSXT", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_TXBUF = { 0x009A, 15, 8, 101, "RDIV_TXBUF", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_VCOGN = { 0x009A, 7, 0, 140, "RDIV_VCOGN", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_TLOB = { 0x009B, 15, 8, 101, "RDIV_TLOB", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_TPAD = { 0x009B, 7, 0, 101, "RDIV_TPAD", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_TIA12 = { 0x009C, 15, 8, 101, "RDIV_TIA12", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_TIA14 = { 0x009C, 7, 0, 140, "RDIV_TIA14", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_RXBUF = { 0x009D, 15, 8, 101, "RDIV_RXBUF", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_TBB = { 0x009D, 7, 0, 101, "RDIV_TBB", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_MXRFE = { 0x009E, 15, 8, 101, "RDIV_MXRFE", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_RBB = { 0x009E, 7, 0, 140, "RDIV_RBB", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_LNA12 = { 0x009F, 15, 8, 101, "RDIV_LNA12", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_LNA14 = { 0x009F, 7, 0, 140, "RDIV_LNA14", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_DIVSXR = { 0x00A0, 15, 8, 101, "RDIV_DIVSXR", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_DIVSXT = { 0x00A0, 7, 0, 101, "RDIV_DIVSXT", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_DIGSXT = { 0x00A1, 15, 8, 101, "RDIV_DIGSXT", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_DIVGN = { 0x00A1, 7, 0, 101, "RDIV_DIVGN", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_DIGGN = { 0x00A2, 15, 8, 101, "RDIV_DIGGN", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_DIGSXR = { 0x00A2, 7, 0, 101, "RDIV_DIGSXR", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_CPSXT = { 0x00A3, 15, 8, 101, "RDIV_CPSXT", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_DIG = { 0x00A3, 7, 0, 101, "RDIV_DIG", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_CPGN = { 0x00A4, 15, 8, 101, "RDIV_CPGN", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_CPSXR = { 0x00A4, 7, 0, 101, "RDIV_CPSXR", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_SPIBUF = { 0x00A5, 15, 8, 101, "RDIV_SPIBUF", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_AFE = { 0x00A5, 7, 0, 101, "RDIV_AFE", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter SPDUP_LDO_SPIBUF = { 0x00A6, 12, 12, 0, "SPDUP_LDO_SPIBUF", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_DIGIp2 = { 0x00A6, 11, 11, 0, "SPDUP_LDO_DIGIp2", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_DIGIp1 = { 0x00A6, 10, 10, 0, "SPDUP_LDO_DIGIp1", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter BYP_LDO_SPIBUF = { 0x00A6, 9, 9, 0, "BYP_LDO_SPIBUF", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_DIGIp2 = { 0x00A6, 8, 8, 0, "BYP_LDO_DIGIp2", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_DIGIp1 = { 0x00A6, 7, 7, 0, "BYP_LDO_DIGIp1", "Bypass signal for the LDO" }; -const struct LMS7Parameter EN_LOADIMP_LDO_SPIBUF = { 0x00A6, 6, 6, 0, "EN_LOADIMP_LDO_SPIBUF", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_DIGIp2 = { 0x00A6, 5, 5, 0, "EN_LOADIMP_LDO_DIGIp2", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_DIGIp1 = { 0x00A6, 4, 4, 0, "EN_LOADIMP_LDO_DIGIp1", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter PD_LDO_SPIBUF = { 0x00A6, 3, 3, 1, "PD_LDO_SPIBUF", "Enables the LDO" }; -const struct LMS7Parameter PD_LDO_DIGIp2 = { 0x00A6, 2, 2, 1, "PD_LDO_DIGIp2", "Enables the LDO" }; -const struct LMS7Parameter PD_LDO_DIGIp1 = { 0x00A6, 1, 1, 1, "PD_LDO_DIGIp1", "Enables the LDO" }; -const struct LMS7Parameter EN_G_LDOP = { 0x00A6, 0, 0, 1, "EN_G_LDOP", "Enable control for all the LDO power downs" }; -const struct LMS7Parameter RDIV_DIGIp2 = { 0x00A7, 15, 8, 101, "RDIV_DIGIp2", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_DIGIp1 = { 0x00A7, 7, 0, 101, "RDIV_DIGIp1", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter BSIGT = { 0x00A8, 31, 9, 0, "BSIGT", "" }; -const struct LMS7Parameter BSTATE = { 0x00A8, 8, 8, 0, "BSTATE", "" }; -const struct LMS7Parameter EN_SDM_TSTO_SXT = { 0x00A8, 6, 6, 0, "EN_SDM_TSTO_SXT", "Enables the SDM_TSTO_SXT" }; -const struct LMS7Parameter EN_SDM_TSTO_SXR = { 0x00A8, 5, 5, 0, "EN_SDM_TSTO_SXR", "Enables the SDM_TSTO_SXR" }; -const struct LMS7Parameter EN_SDM_TSTO_CGEN = { 0x00A8, 4, 4, 0, "EN_SDM_TSTO_CGEN", "Enables the SDM_TSTO_CGEN" }; -const struct LMS7Parameter BENC = { 0x00A8, 3, 3, 0, "BENC", "enables CGEN BIST" }; -const struct LMS7Parameter BENR = { 0x00A8, 2, 2, 0, "BENR", "enables SXR BIST" }; -const struct LMS7Parameter BENT = { 0x00A8, 1, 1, 0, "BENT", "enables SXT BIST" }; -const struct LMS7Parameter BSTART = { 0x00A8, 0, 0, 0, "BSTART", "Starts delta sigma built in self test. Keep it at 1 one at least three clock cycles" }; -const struct LMS7Parameter BSIGR = { 0x00AA, 22, 0, 0, "BSIGR", "" }; -const struct LMS7Parameter BSIGC = { 0x00AB, 29, 7, 0, "BSIGC", "" }; -const struct LMS7Parameter CDS_MCLK2 = { 0x00AD, 15, 14, 0, "CDS_MCLK2", "MCLK2 clock delay" }; -const struct LMS7Parameter CDS_MCLK1 = { 0x00AD, 13, 12, 0, "CDS_MCLK1", "MCLK1 clock delay" }; -const struct LMS7Parameter CDSN_TXBTSP = { 0x00AD, 9, 9, 1, "CDSN_TXBTSP", "TX TSPB clock inversion control" }; -const struct LMS7Parameter CDSN_TXATSP = { 0x00AD, 8, 8, 1, "CDSN_TXATSP", "TX TSPA clock inversion control" }; -const struct LMS7Parameter CDSN_RXBTSP = { 0x00AD, 7, 7, 1, "CDSN_RXBTSP", "RX TSPB clock inversion control" }; -const struct LMS7Parameter CDSN_RXATSP = { 0x00AD, 6, 6, 1, "CDSN_RXATSP", "RX TSPA clock inversion control" }; -const struct LMS7Parameter CDSN_TXBLML = { 0x00AD, 5, 5, 1, "CDSN_TXBLML", "TX LMLB clock inversion control" }; -const struct LMS7Parameter CDSN_TXALML = { 0x00AD, 4, 4, 1, "CDSN_TXALML", "TX LMLA clock inversion control" }; -const struct LMS7Parameter CDSN_RXBLML = { 0x00AD, 3, 3, 1, "CDSN_RXBLML", "RX LMLB clock inversion control" }; -const struct LMS7Parameter CDSN_RXALML = { 0x00AD, 2, 2, 1, "CDSN_RXALML", "RX LMLA clock inversion control" }; -const struct LMS7Parameter CDSN_MCLK2 = { 0x00AD, 1, 1, 1, "CDSN_MCLK2", "MCLK2 clock inversion control" }; -const struct LMS7Parameter CDSN_MCLK1 = { 0x00AD, 0, 0, 1, "CDSN_MCLK1", "MCLK1 clock inversion control" }; -const struct LMS7Parameter CDS_TXBTSP = { 0x00AE, 15, 14, 0, "CDS_TXBTSP", "TX TSP B clock delay" }; -const struct LMS7Parameter CDS_TXATSP = { 0x00AE, 13, 12, 0, "CDS_TXATSP", "TX TSP A clock delay" }; -const struct LMS7Parameter CDS_RXBTSP = { 0x00AE, 11, 10, 0, "CDS_RXBTSP", "RX TSP B clock delay" }; -const struct LMS7Parameter CDS_RXATSP = { 0x00AE, 9, 8, 0, "CDS_RXATSP", "RX TSP A clock delay" }; -const struct LMS7Parameter CDS_TXBLML = { 0x00AE, 7, 6, 0, "CDS_TXBLML", "TX LML B clock delay" }; -const struct LMS7Parameter CDS_TXALML = { 0x00AE, 5, 4, 0, "CDS_TXALML", "TX LML A clock delay" }; -const struct LMS7Parameter CDS_RXBLML = { 0x00AE, 3, 2, 0, "CDS_RXBLML", "RX LML B clock delay" }; -const struct LMS7Parameter CDS_RXALML = { 0x00AE, 1, 0, 0, "CDS_RXALML", "RX LML A clock delay" }; -const struct LMS7Parameter EN_LOWBWLOMX_TMX_TRF = { 0x0100, 15, 15, 0, "EN_LOWBWLOMX_TMX_TRF", "Controls the high pass pole frequency of the RC biasing the gate of the mixer switches" }; -const struct LMS7Parameter EN_NEXTTX_TRF = { 0x0100, 14, 14, 0, "EN_NEXTTX_TRF", "Enables the daisy change LO buffer going from TRF_1 to TRF2" }; -const struct LMS7Parameter EN_AMPHF_PDET_TRF = { 0x0100, 13, 12, 3, "EN_AMPHF_PDET_TRF", "Enables the TXPAD power detector preamplifier" }; -const struct LMS7Parameter LOADR_PDET_TRF = { 0x0100, 11, 10, 1, "LOADR_PDET_TRF", "Controls the resistive load of the Power detector" }; -const struct LMS7Parameter PD_PDET_TRF = { 0x0100, 3, 3, 1, "PD_PDET_TRF", "Powerdown signal for Power Detector" }; -const struct LMS7Parameter PD_TLOBUF_TRF = { 0x0100, 2, 2, 0, "PD_TLOBUF_TRF", "Powerdown signal for TX LO buffer" }; -const struct LMS7Parameter PD_TXPAD_TRF = { 0x0100, 1, 1, 0, "PD_TXPAD_TRF", "Powerdown signal for TXPAD" }; -const struct LMS7Parameter EN_G_TRF = { 0x0100, 0, 0, 1, "EN_G_TRF", "Enable control for all the TRF_1 power downs" }; -const struct LMS7Parameter F_TXPAD_TRF = { 0x0101, 15, 13, 3, "F_TXPAD_TRF", "Controls the switched capacitor at the TXPAD output. Is used for fine tuning of the TXPAD output" }; -const struct LMS7Parameter L_LOOPB_TXPAD_TRF = { 0x0101, 12, 11, 3, "L_LOOPB_TXPAD_TRF", "Controls the loss of the of the loopback path at the TX side" }; -const struct LMS7Parameter LOSS_LIN_TXPAD_TRF = { 0x0101, 10, 6, 0, "LOSS_LIN_TXPAD_TRF", "Controls the gain of the linearizing part of of the TXPAD" }; -const struct LMS7Parameter LOSS_MAIN_TXPAD_TRF = { 0x0101, 5, 1, 0, "LOSS_MAIN_TXPAD_TRF", "Controls the gain output power of the TXPAD" }; -const struct LMS7Parameter EN_LOOPB_TXPAD_TRF = { 0x0101, 0, 0, 0, "EN_LOOPB_TXPAD_TRF", "Enables the TXPAD loopback path" }; -const struct LMS7Parameter GCAS_GNDREF_TXPAD_TRF = { 0x0102, 15, 15, 0, "GCAS_GNDREF_TXPAD_TRF", "Controls if the TXPAD cascode transistor gate bias is referred to VDD or GND" }; -const struct LMS7Parameter ICT_LIN_TXPAD_TRF = { 0x0102, 14, 10, 12, "ICT_LIN_TXPAD_TRF", "Control the bias current of the linearization section of the TXPAD" }; -const struct LMS7Parameter ICT_MAIN_TXPAD_TRF = { 0x0102, 9, 5, 12, "ICT_MAIN_TXPAD_TRF", "Control the bias current of the main gm section of the TXPAD" }; -const struct LMS7Parameter VGCAS_TXPAD_TRF = { 0x0102, 4, 0, 0, "VGCAS_TXPAD_TRF", "Controls the bias voltage at the gate of TXPAD cascade" }; -const struct LMS7Parameter SEL_BAND1_TRF = { 0x0103, 11, 11, 1, "SEL_BAND1_TRF", "" }; -const struct LMS7Parameter SEL_BAND2_TRF = { 0x0103, 10, 10, 0, "SEL_BAND2_TRF", "" }; -const struct LMS7Parameter LOBIASN_TXM_TRF = { 0x0103, 9, 5, 16, "LOBIASN_TXM_TRF", "Controls the bias at the gate of the mixer NMOS" }; -const struct LMS7Parameter LOBIASP_TXX_TRF = { 0x0103, 4, 0, 18, "LOBIASP_TXX_TRF", "Controls the bias at the gate of the mixer PMOS" }; -const struct LMS7Parameter CDC_I_TRF = { 0x0104, 7, 4, 8, "CDC_I_TRF", "" }; -const struct LMS7Parameter CDC_Q_TRF = { 0x0104, 3, 0, 8, "CDC_Q_TRF", "" }; -const struct LMS7Parameter STATPULSE_TBB = { 0x0105, 15, 15, 0, "STATPULSE_TBB", "" }; -const struct LMS7Parameter LOOPB_TBB = { 0x0105, 14, 12, 0, "LOOPB_TBB", "This controls which signal is connected to the loopback output pins. Note: when both the lowpass ladder and real pole are powered down, the output of the active highband biquad is routed to the loopb output" }; -const struct LMS7Parameter PD_LPFH_TBB = { 0x0105, 4, 4, 0, "PD_LPFH_TBB", "This selectively powers down the LPFH_TBB biquad" }; -const struct LMS7Parameter PD_LPFIAMP_TBB = { 0x0105, 3, 3, 0, "PD_LPFIAMP_TBB", "selectively powers down the LPFIAMP_TBB front-end current amp of the transmitter baseband" }; -const struct LMS7Parameter PD_LPFLAD_TBB = { 0x0105, 2, 2, 1, "PD_LPFLAD_TBB", "This selectively powers down the LPFLAD_TBB low pass ladder filter of the transmitter baseband" }; -const struct LMS7Parameter PD_LPFS5_TBB = { 0x0105, 1, 1, 1, "PD_LPFS5_TBB", "This selectively powers down the LPFS5_TBB low pass real-pole filter of the transmitter baseband" }; -const struct LMS7Parameter EN_G_TBB = { 0x0105, 0, 0, 1, "EN_G_TBB", "Enable control for all the TBB_TOP power downs" }; -const struct LMS7Parameter ICT_LPFS5_F_TBB = { 0x0106, 14, 10, 12, "ICT_LPFS5_F_TBB", "This controls the operational amplifier's output stage bias current of the low band real pole filter of the transmitter's baseband" }; -const struct LMS7Parameter ICT_LPFS5_PT_TBB = { 0x0106, 9, 5, 12, "ICT_LPFS5_PT_TBB", "This controls the operational amplifier's input stage bias current of the low band real pole filter of the transmitter's baseband" }; -const struct LMS7Parameter ICT_LPF_H_PT_TBB = { 0x0106, 4, 0, 12, "ICT_LPF_H_PT_TBB", "This controls the operational amplifiers input stage bias reference current of the high band low pass filter of the transmitter's baseband " }; -const struct LMS7Parameter ICT_LPFH_F_TBB = { 0x0107, 14, 10, 12, "ICT_LPFH_F_TBB", "controls the operational amplifiers output stage bias reference current of the high band low pass filter of the transmitter's baseband (LPFH_TBB)" }; -const struct LMS7Parameter ICT_LPFLAD_F_TBB = { 0x0107, 9, 5, 12, "ICT_LPFLAD_F_TBB", "This controls the operational amplfiers' output stages bias referene current of the low band ladder filter of the transmisster's baseband" }; -const struct LMS7Parameter ICT_LPFLAD_PT_TBB = { 0x0107, 4, 0, 12, "ICT_LPFLAD_PT_TBB", "This controls the operational amplifers' input stages bias reference current of the low band ladder filter of the transmitter's baseband" }; -const struct LMS7Parameter CG_IAMP_TBB = { 0x0108, 15, 10, 37, "CG_IAMP_TBB", "This controls the frontend gain of the TBB. For a given gain value, this control value varies with the set TX mode. After resistance calibration, the following table gives the nominal values for each frequency setting. However, this table is to be updated and corrected after calibration" }; -const struct LMS7Parameter ICT_IAMP_FRP_TBB = { 0x0108, 9, 5, 1, "ICT_IAMP_FRP_TBB", "This controls the reference bias current of the IAMP main bias current sources" }; -const struct LMS7Parameter ICT_IAMP_GG_FRP_TBB = { 0x0108, 4, 0, 6, "ICT_IAMP_GG_FRP_TBB", "This controls the reference bias current of the IAMP's cascode transistors gate voltages that set the IAMP's input voltage level. The IAMP's input is connected to the DAC output" }; -const struct LMS7Parameter RCAL_LPFH_TBB = { 0x0109, 15, 8, 97, "RCAL_LPFH_TBB", "This controls the value of the equivalent resistance of the resistor banks of the biquad filter stage (of the high band section) of the transmitter baseband(TBB)" }; -const struct LMS7Parameter RCAL_LPFLAD_TBB = { 0x0109, 7, 0, 193, "RCAL_LPFLAD_TBB", "This controls the value of the equivalent resistance of the resistor banks of the low pass filter ladder (of the low band section) of the transmitter baseband(TBB)" }; -const struct LMS7Parameter TSTIN_TBB = { 0x010A, 15, 14, 0, "TSTIN_TBB", "This control selects where the input test signal (vinp/n_aux_bbq/i) is routed to as well as disabling the route." }; -const struct LMS7Parameter BYPLADDER_TBB = { 0x010A, 13, 13, 0, "BYPLADDER_TBB", "This signal bypasses the LPF ladder of TBB and directly connects the output of current amplifier to the null port of the real pole stage of TBB low pass filter" }; -const struct LMS7Parameter CCAL_LPFLAD_TBB = { 0x010A, 12, 8, 16, "CCAL_LPFLAD_TBB", "A common control signal for all the capacitor banks of TBB filters (including the ladder, real pole, and the high band biquad). It is the calibrated value of the banks control that sets the value of the banks' equivalent capacitor to their respective nominal values" }; -const struct LMS7Parameter RCAL_LPFS5_TBB = { 0x010A, 7, 0, 76, "RCAL_LPFS5_TBB", "This controls the value of the equivalent resistance of the resistor banks of the real pole filter stage (of the low band section) of the transmitter baseband (TBB). Following is a nominal values table that are corrected for any process variation after calibration" }; -const struct LMS7Parameter CDC_I_RFE = { 0x010C, 15, 12, 8, "CDC_I_RFE", "" }; -const struct LMS7Parameter CDC_Q_RFE = { 0x010C, 11, 8, 8, "CDC_Q_RFE", "" }; -const struct LMS7Parameter PD_LNA_RFE = { 0x010C, 7, 7, 1, "PD_LNA_RFE", "Power control signal for LNA_RFE" }; -const struct LMS7Parameter PD_RLOOPB_1_RFE = { 0x010C, 6, 6, 1, "PD_RLOOPB_1_RFE", "Power control signal for RXFE loopback 1" }; -const struct LMS7Parameter PD_RLOOPB_2_RFE = { 0x010C, 5, 5, 1, "PD_RLOOPB_2_RFE", "Power control signal for RXFE loopback 2" }; -const struct LMS7Parameter PD_MXLOBUF_RFE = { 0x010C, 4, 4, 1, "PD_MXLOBUF_RFE", "Power control signal for RXFE mixer lo buffer" }; -const struct LMS7Parameter PD_QGEN_RFE = { 0x010C, 3, 3, 1, "PD_QGEN_RFE", "Power control signal for RXFE Quadrature LO generator" }; -const struct LMS7Parameter PD_RSSI_RFE = { 0x010C, 2, 2, 1, "PD_RSSI_RFE", "Power control signal for RXFE RSSI" }; -const struct LMS7Parameter PD_TIA_RFE = { 0x010C, 1, 1, 0, "PD_TIA_RFE", "Power control signal for RXFE TIA" }; -const struct LMS7Parameter EN_G_RFE = { 0x010C, 0, 0, 1, "EN_G_RFE", "Enable control for all the RFE_1 power downs" }; -const struct LMS7Parameter SEL_PATH_RFE = { 0x010D, 8, 7, 1, "SEL_PATH_RFE", "Selects the active path of the RXFE" }; -const struct LMS7Parameter EN_DCOFF_RXFE_RFE = { 0x010D, 6, 6, 0, "EN_DCOFF_RXFE_RFE", "Enables the DCOFFSET block for the RXFE" }; -const struct LMS7Parameter EN_INSHSW_LB1_RFE = { 0x010D, 4, 4, 1, "EN_INSHSW_LB1_RFE", "Enables the input shorting switch at the input of the loopback 1 (in parallel with LNAL mixer)" }; -const struct LMS7Parameter EN_INSHSW_LB2_RFE = { 0x010D, 3, 3, 1, "EN_INSHSW_LB2_RFE", "Enables the input shorting switch at the input of the loopback 2 (in parallel with LNAW mixer)" }; -const struct LMS7Parameter EN_INSHSW_L_RFE = { 0x010D, 2, 2, 1, "EN_INSHSW_L_RFE", "Enables the input shorting switch at the input of the LNAL" }; -const struct LMS7Parameter EN_INSHSW_W_RFE = { 0x010D, 1, 1, 1, "EN_INSHSW_W_RFE", "Enables the input shorting switch at the input of the LNAW" }; -const struct LMS7Parameter EN_NEXTRX_RFE = { 0x010D, 0, 0, 0, "EN_NEXTRX_RFE", "Enables the daisy chain LO buffer going from RXFE1 to RXFE2" }; -const struct LMS7Parameter DCOFFI_RFE = { 0x010E, 13, 7, 64, "DCOFFI_RFE", "Controls DC offset at the output of the TIA by injecting current to the input of the TIA (I side)" }; -const struct LMS7Parameter DCOFFQ_RFE = { 0x010E, 6, 0, 64, "DCOFFQ_RFE", "Controls DC offset at the output of the TIA by injecting current to the input of the TIA (Q side)" }; -const struct LMS7Parameter ICT_LOOPB_RFE = { 0x010F, 14, 10, 12, "ICT_LOOPB_RFE", "Controls the reference current of the RXFE loopback amplifier" }; -const struct LMS7Parameter ICT_TIAMAIN_RFE = { 0x010F, 9, 5, 2, "ICT_TIAMAIN_RFE", "Controls the reference current of the RXFE TIA first stage" }; -const struct LMS7Parameter ICT_TIAOUT_RFE = { 0x010F, 4, 0, 2, "ICT_TIAOUT_RFE", "Controls the reference current of the RXFE TIA 2nd stage" }; -const struct LMS7Parameter ICT_LNACMO_RFE = { 0x0110, 14, 10, 2, "ICT_LNACMO_RFE", "Controls the current generating LNA output common mode voltage" }; -const struct LMS7Parameter ICT_LNA_RFE = { 0x0110, 9, 5, 31, "ICT_LNA_RFE", "Controls the current of the LNA core" }; -const struct LMS7Parameter ICT_LODC_RFE = { 0x0110, 4, 0, 20, "ICT_LODC_RFE", "Controls the DC of the mixer LO signal at the gate of the mixer switches" }; -const struct LMS7Parameter CAP_RXMXO_RFE = { 0x0111, 9, 5, 4, "CAP_RXMXO_RFE", "Control the decoupling cap at the output of the RX Mixer" }; -const struct LMS7Parameter CGSIN_LNA_RFE = { 0x0111, 4, 0, 3, "CGSIN_LNA_RFE", "Controls the cap parallel with the LNA input input NMOS CGS to control the Q of the maching circuit and provides trade off between gain/NF and IIP. The higher the frequency, the lower CGSIN_LNA_RFE should be. Also, the higher CGSIN, the lower the Q, The lower the gain, the higher the NF, and the higher the IIP3" }; -const struct LMS7Parameter CCOMP_TIA_RFE = { 0x0112, 15, 12, 12, "CCOMP_TIA_RFE", "Compensation capacitor for TIA" }; -const struct LMS7Parameter CFB_TIA_RFE = { 0x0112, 11, 0, 230, "CFB_TIA_RFE", "Feeback capacitor for TIA. Controls the 3dB BW of the TIA. Should be set with calibration through digital baseband" }; -const struct LMS7Parameter G_LNA_RFE = { 0x0113, 9, 6, 15, "G_LNA_RFE", "Controls the gain of the LNA" }; -const struct LMS7Parameter G_RXLOOPB_RFE = { 0x0113, 5, 2, 0, "G_RXLOOPB_RFE", "Controls RXFE loopback gain" }; -const struct LMS7Parameter G_TIA_RFE = { 0x0113, 1, 0, 3, "G_TIA_RFE", "Controls the Gain of the TIA" }; -const struct LMS7Parameter RCOMP_TIA_RFE = { 0x0114, 8, 5, 4, "RCOMP_TIA_RFE", "Controls the compensation resistors of the TIA opamp" }; -const struct LMS7Parameter RFB_TIA_RFE = { 0x0114, 4, 0, 13, "RFB_TIA_RFE", "Sets the feedback resistor to the nominal value" }; -const struct LMS7Parameter EN_LB_LPFH_RBB = { 0x0115, 15, 15, 0, "EN_LB_LPFH_RBB", "" }; -const struct LMS7Parameter EN_LB_LPFL_RBB = { 0x0115, 14, 14, 0, "EN_LB_LPFL_RBB", "" }; -const struct LMS7Parameter PD_LPFH_RBB = { 0x0115, 3, 3, 1, "PD_LPFH_RBB", "Power down of the LPFH block" }; -const struct LMS7Parameter PD_LPFL_RBB = { 0x0115, 2, 2, 0, "PD_LPFL_RBB", "Power down of the LPFL block" }; -const struct LMS7Parameter PD_PGA_RBB = { 0x0115, 1, 1, 0, "PD_PGA_RBB", "Power down of the PGA block" }; -const struct LMS7Parameter EN_G_RBB = { 0x0115, 0, 0, 1, "EN_G_RBB", "Enable control for all the RBB_1 power downs" }; -const struct LMS7Parameter R_CTL_LPF_RBB = { 0x0116, 15, 11, 16, "R_CTL_LPF_RBB", "Controls the absolute value of the resistance of the RC time constant of the RBB_LPF blocks (both Low and High)" }; -const struct LMS7Parameter RCC_CTL_LPFH_RBB = { 0x0116, 10, 8, 1, "RCC_CTL_LPFH_RBB", "Controls the stability passive compensation of the LPFH_RBB operational amplifier" }; -const struct LMS7Parameter C_CTL_LPFH_RBB = { 0x0116, 7, 0, 128, "C_CTL_LPFH_RBB", "Controls the capacitance value of the RC time constant of RBB_LPFH and it varies with the respective rxMode from 37MHz to 108MHz" }; -const struct LMS7Parameter RCC_CTL_LPFL_RBB = { 0x0117, 13, 11, 5, "RCC_CTL_LPFL_RBB", "Controls the stability passive compensation of the LPFL_RBB operational amplifier" }; -const struct LMS7Parameter C_CTL_LPFL_RBB = { 0x0117, 10, 0, 12, "C_CTL_LPFL_RBB", "Controls the capacitance value of the RC time constant of RBB_LPFH and it varies with the respective rxMode from 1.4MHz to 20MHz." }; -const struct LMS7Parameter INPUT_CTL_PGA_RBB = { 0x0118, 15, 13, 0, "INPUT_CTL_PGA_RBB", "There are a total of four different differential inputs to the PGA. Only one of them is active at a time" }; -const struct LMS7Parameter ICT_LPF_IN_RBB = { 0x0118, 9, 5, 12, "ICT_LPF_IN_RBB", "Controls the reference bias current of the input stage of the operational amplifier used in RBB_LPF blocks (Low or High). " }; -const struct LMS7Parameter ICT_LPF_OUT_RBB = { 0x0118, 4, 0, 12, "ICT_LPF_OUT_RBB", "The reference bias current of the output stage of the operational amplifier used in RBB_LPF blocks (low or High)" }; -const struct LMS7Parameter OSW_PGA_RBB = { 0x0119, 15, 15, 0, "OSW_PGA_RBB", "There are two instances of the PGA circuit in the design. The output of the RBB_LPF blocks are connected the input of these PGA blocks (common). The output of one of them is connected to two pads pgaoutn and pgaoutp and the output of the other PGA is connected directly to the ADC input" }; -const struct LMS7Parameter ICT_PGA_OUT_RBB = { 0x0119, 14, 10, 6, "ICT_PGA_OUT_RBB", "Controls the output stage reference bias current of the operational amplifier used in the PGA circuit" }; -const struct LMS7Parameter ICT_PGA_IN_RBB = { 0x0119, 9, 5, 6, "ICT_PGA_IN_RBB", "Controls the input stage reference bias current of the operational amplifier used in the PGA circuit" }; -const struct LMS7Parameter G_PGA_RBB = { 0x0119, 4, 0, 11, "G_PGA_RBB", "This is the gain of the PGA" }; -const struct LMS7Parameter RCC_CTL_PGA_RBB = { 0x011A, 13, 9, 23, "RCC_CTL_PGA_RBB", "Controls the stability passive compensation of the PGA_RBB operational amplifier" }; -const struct LMS7Parameter C_CTL_PGA_RBB = { 0x011A, 6, 0, 2, "C_CTL_PGA_RBB", "Control the value of the feedback capacitor of the PGA that is used to help against the parasitic cap at the virtual node for stability" }; -const struct LMS7Parameter RESET_N = { 0x011C, 15, 15, 1, "RESET_N", "Resets SX. A pulse should be used in the start-up to reset" }; -const struct LMS7Parameter SPDUP_VCO = { 0x011C, 14, 14, 0, "SPDUP_VCO", "Bypasses the noise filter resistor for fast settling time. It should be connected to a 1uS pulse" }; -const struct LMS7Parameter BYPLDO_VCO = { 0x011C, 13, 13, 1, "BYPLDO_VCO", "Controls the bypass signal for the SX LDO" }; -const struct LMS7Parameter EN_COARSEPLL = { 0x011C, 12, 12, 0, "EN_COARSEPLL", "Enable signal for coarse tuning block" }; -const struct LMS7Parameter CURLIM_VCO = { 0x011C, 11, 11, 1, "CURLIM_VCO", "Enables the output current limitation in the VCO regulator" }; -const struct LMS7Parameter EN_DIV2_DIVPROG = { 0x011C, 10, 10, 1, "EN_DIV2_DIVPROG", "" }; -const struct LMS7Parameter EN_INTONLY_SDM = { 0x011C, 9, 9, 0, "EN_INTONLY_SDM", "Enables INTEGER-N mode of the SX " }; -const struct LMS7Parameter EN_SDM_CLK = { 0x011C, 8, 8, 1, "EN_SDM_CLK", "Enables/Disables SDM clock. In INT-N mode or for noise testing, SDM clock can be disabled" }; -const struct LMS7Parameter PD_FBDIV = { 0x011C, 7, 7, 0, "PD_FBDIV", "Power down the feedback divider block" }; -const struct LMS7Parameter PD_LOCH_T2RBUF = { 0x011C, 6, 6, 1, "PD_LOCH_T2RBUF", "Power down for LO buffer from SXT to SXR. To be active only in the TDD mode" }; -const struct LMS7Parameter PD_CP = { 0x011C, 5, 5, 0, "PD_CP", "Power down for Charge Pump" }; -const struct LMS7Parameter PD_FDIV = { 0x011C, 4, 4, 0, "PD_FDIV", "Power down for feedback frequency and forward dividers" }; -const struct LMS7Parameter PD_SDM = { 0x011C, 3, 3, 0, "PD_SDM", "Power down for SDM" }; -const struct LMS7Parameter PD_VCO_COMP = { 0x011C, 2, 2, 0, "PD_VCO_COMP", "Power down for VCO comparator" }; -const struct LMS7Parameter PD_VCO = { 0x011C, 1, 1, 1, "PD_VCO", "Power down for VCO" }; -const struct LMS7Parameter EN_G = { 0x011C, 0, 0, 1, "EN_G", "Enable control for all the SXT power downs" }; -const struct LMS7Parameter FRAC_SDM_LSB = { 0x011D, 15, 0, 0x0400, "FRAC_SDM_LSB", "" }; -const struct LMS7Parameter INT_SDM = { 0x011E, 13, 4, 120, "INT_SDM", "" }; -const struct LMS7Parameter FRAC_SDM_MSB = { 0x011E, 3, 0, 0, "FRAC_SDM_MSB", "" }; -const struct LMS7Parameter PW_DIV2_LOCH = { 0x011F, 14, 12, 3, "PW_DIV2_LOCH", "trims the duty cycle of DIV2 LOCH. Only works when forward divider is dividing by at least 2 (excluding quadrature block division). If in bypass mode, this does not work" }; -const struct LMS7Parameter PW_DIV4_LOCH = { 0x011F, 11, 9, 3, "PW_DIV4_LOCH", "trims the duty cycle of DIV4 LOCH. Only works when forward divider is dividing by at least 4 (excluding quadrature block division). If in bypass mode, this does not work" }; -const struct LMS7Parameter DIV_LOCH = { 0x011F, 8, 6, 1, "DIV_LOCH", "Controls the division ratio in the LOCH_DIV" }; -const struct LMS7Parameter TST_SX = { 0x011F, 5, 3, 0, "TST_SX", -"Controls the test mode of PLLs. TST signal lines are shared between all PLLs (CGEN, RX and TX). Only one TST signal of any PLL should be active at a given time.\n\ -0 - TST disabled; RSSI analog outputs enabled if RSSI blocks active and when all PLL test signals are off(default)\n\ -1 - tstdo[0] = VCO / 20 clock*; tstdo[1] = VCO / 40 clock*; tstao = High impedance;\n\ -2 - tstdo[0] = SDM clock; tstdo[1] = feedback divider output; tstao = VCO tune through a 60kOhm resistor;\n\ -3 - tstdo[0] = Reference clock; tstdo[1] = feedback divider output; tstao = VCO tune through a 10kOhm resistor;\n\ -4 - tstdo[0] = High impedance; tstdo[1] = High impedance; tstao = High impedance;\n\ -5 - tstdo[0] = Charge pump Down signal; tstdo[1] = Charge pump Up signal; tstao = High impedance;\n\ -6 - tstdo[0] = High impedance; tstdo[1] = High impedance; tstao = VCO tune through a 60kOhm resistor;\n\ -7 - tstdo[0] = High impedance; tstdo[1] = High impedance; tstao = VCO tune through a 10kOhm resistor;\n\ -if TST_SX[2] = 1 --> VCO_TSTBUF active generating VCO_TST_DIV20 and VCO_TST_DIV40\n\ -* When EN_DIV2_DIVPROG_(SXR, SXT) is active, the division ratio must be multiplied by 2 (40 / 80)"}; -const struct LMS7Parameter SEL_SDMCLK = { 0x011F, 2, 2, 0, "SEL_SDMCLK", "Selects between the feedback divider output and Fref for SDM" }; -const struct LMS7Parameter SX_DITHER_EN = { 0x011F, 1, 1, 0, "SX_DITHER_EN", "Enabled dithering in SDM" }; -const struct LMS7Parameter REV_SDMCLK = { 0x011F, 0, 0, 0, "REV_SDMCLK", "Reverses the SDM clock" }; -const struct LMS7Parameter VDIV_VCO = { 0x0120, 15, 8, 185, "VDIV_VCO", "Controls VCO LDO output voltage" }; -const struct LMS7Parameter ICT_VCO = { 0x0120, 7, 0, 255, "ICT_VCO", "Scales the VCO bias current from 0 to 2.5xInom" }; -const struct LMS7Parameter RSEL_LDO_VCO = { 0x0121, 15, 11, 6, "RSEL_LDO_VCO", "Set the reference voltage that supplies bias voltage of switch-cap array and varactor" }; -const struct LMS7Parameter CSW_VCO = { 0x0121, 10, 3, 128, "CSW_VCO", "Coarse control of VCO frequency, 0 for lowest frequency and 255 for highest. This control is set by SX_SWC_calibration" }; -const struct LMS7Parameter SEL_VCO = { 0x0121, 2, 1, 2, "SEL_VCO", "Selects the active VCO. It is set by SX_SWC_calibration" }; -const struct LMS7Parameter COARSE_START = { 0x0121, 0, 0, 0, "COARSE_START", "" }; -const struct LMS7Parameter REVPH_PFD = { 0x0122, 12, 12, 0, "REVPH_PFD", "Reverse the pulses of PFD. It can be used to reverse the polarity of the PLL loop (positive feedback to negative feedback)" }; -const struct LMS7Parameter IOFFSET_CP = { 0x0122, 11, 6, 12, "IOFFSET_CP", "Scales the offset current of the charge pump, 0-->63. This current is used in Fran-N mode to create an offset in the CP response and avoid the non-linear section" }; -const struct LMS7Parameter IPULSE_CP = { 0x0122, 5, 0, 63, "IPULSE_CP", "Scales the pulse current of the charge pump" }; -const struct LMS7Parameter COARSE_STEPDONE = { 0x0123, 15, 15, 0, "COARSE_STEPDONE", "" }; -const struct LMS7Parameter COARSEPLL_COMPO = { 0x0123, 14, 14, 0, "COARSEPLL_COMPO", "" }; -const struct LMS7Parameter VCO_CMPHO = { 0x0123, 13, 13, 0, "VCO_CMPHO", "" }; -const struct LMS7Parameter VCO_CMPLO = { 0x0123, 12, 12, 0, "VCO_CMPLO", "" }; -const struct LMS7Parameter CP2_PLL = { 0x0123, 11, 8, 6, "CP2_PLL", "Controls the value of CP2 (cap from CP output to GND) in the PLL filter" }; -const struct LMS7Parameter CP3_PLL = { 0x0123, 7, 4, 7, "CP3_PLL", "Controls the value of CP3 (cap from VCO Vtune input to GND) in the PLL filter" }; -const struct LMS7Parameter CZ = { 0x0123, 3, 0, 11, "CZ", "Controls the value of CZ (Zero capacitor) in the PLL filter" }; -const struct LMS7Parameter EN_DIR_SXRSXT = { 0x0124, 4, 4, 0, "EN_DIR_SXRSXT", "Enables direct control of PDs and ENs for SXR/SXT module" }; -const struct LMS7Parameter EN_DIR_RBB = { 0x0124, 3, 3, 0, "EN_DIR_RBB", "Enables direct control of PDs and ENs for RBB module" }; -const struct LMS7Parameter EN_DIR_RFE = { 0x0124, 2, 2, 0, "EN_DIR_RFE", "Enables direct control of PDs and ENs for RFE module" }; -const struct LMS7Parameter EN_DIR_TBB = { 0x0124, 1, 1, 0, "EN_DIR_TBB", "Enables direct control of PDs and ENs for TBB module" }; -const struct LMS7Parameter EN_DIR_TRF = { 0x0124, 0, 0, 0, "EN_DIR_TRF", "Enables direct control of PDs and ENs for TRF module" }; -const struct LMS7Parameter TSGFC_TXTSP = { 0x0200, 9, 9, 0, "TSGFC_TXTSP", "TSG full scale control" }; -const struct LMS7Parameter TSGFCW_TXTSP = { 0x0200, 8, 7, 1, "TSGFCW_TXTSP", "Set frequency of TSG's NCO" }; -const struct LMS7Parameter TSGDCLDQ_TXTSP = { 0x0200, 6, 6, 0, "TSGDCLDQ_TXTSP", "" }; -const struct LMS7Parameter TSGDCLDI_TXTSP = { 0x0200, 5, 5, 0, "TSGDCLDI_TXTSP", "" }; -const struct LMS7Parameter TSGSWAPIQ_TXTSP = { 0x0200, 4, 4, 0, "TSGSWAPIQ_TXTSP", "Swap signals at test signal generator's output" }; -const struct LMS7Parameter TSGMODE_TXTSP = { 0x0200, 3, 3, 0, "TSGMODE_TXTSP", "Test signal generator mode" }; -const struct LMS7Parameter INSEL_TXTSP = { 0x0200, 2, 2, 0, "INSEL_TXTSP", "Input source of TxTSP" }; -const struct LMS7Parameter BSTART_TXTSP = { 0x0200, 1, 1, 0, "BSTART_TXTSP", "Starts delta sigma built in self test. Keep it at 1 one at least three clock cycles" }; -const struct LMS7Parameter EN_TXTSP = { 0x0200, 0, 0, 1, "EN_TXTSP", "TxTSP modules enable" }; -const struct LMS7Parameter GCORRQ_TXTSP = { 0x0201, 10, 0, 2047, "GCORRQ_TXTSP", "corrector value, channel Q Unsigned integer" }; -const struct LMS7Parameter GCORRI_TXTSP = { 0x0202, 10, 0, 2047, "GCORRI_TXTSP", "corrector value, channel I Unsigned integer" }; -const struct LMS7Parameter HBI_OVR_TXTSP = { 0x0203, 14, 12, 0, "HBI_OVR_TXTSP", "HBI interpolation ratio" }; -const struct LMS7Parameter IQCORR_TXTSP = { 0x0203, 11, 0, 0, "IQCORR_TXTSP", "Phase corrector value (tan(Alpha/2)). Integer, 2's complement" }; -const struct LMS7Parameter DCCORRI_TXTSP = { 0x0204, 15, 8, 0, "DCCORRI_TXTSP", "DC corrector value, channel I. Integer, 2's complement" }; -const struct LMS7Parameter DCCORRQ_TXTSP = { 0x0204, 7, 0, 0, "DCCORRQ_TXTSP", "DC corrector value, channel Q. Integer, 2's complement" }; -const struct LMS7Parameter GFIR1_L_TXTSP = { 0x0205, 10, 8, 0, "GFIR1_L_TXTSP", "Parameter l of GFIR1 (l = roundUp(CoeffN/5)-1). Unsigned integer" }; -const struct LMS7Parameter GFIR1_N_TXTSP = { 0x0205, 7, 0, 0, "GFIR1_N_TXTSP", "Clock division ratio of GFIR1 is GFIR1_N + 1. Unsigned integer" }; -const struct LMS7Parameter GFIR2_L_TXTSP = { 0x0206, 10, 8, 0, "GFIR2_L_TXTSP", "Parameter l of GFIR2 (l = roundUp(CoeffN/5)-1). Unsigned integer" }; -const struct LMS7Parameter GFIR2_N_TXTSP = { 0x0206, 7, 0, 0, "GFIR2_N_TXTSP", "Clock division ratio of GFIR2 is GFIR2_N + 1. Unsigned integer" }; -const struct LMS7Parameter GFIR3_L_TXTSP = { 0x0207, 10, 8, 0, "GFIR3_L_TXTSP", "Parameter l of GFIR3 (l = roundUp(CoeffN/5)-1). Unsigned integer" }; -const struct LMS7Parameter GFIR3_N_TXTSP = { 0x0207, 7, 0, 0, "GFIR3_N_TXTSP", "Clock division ratio of GFIR3 is GFIR3_N + 1. Unsigned integer" }; -const struct LMS7Parameter CMIX_GAIN_TXTSP = { 0x0208, 15, 14, 0, "CMIX_GAIN_TXTSP", "Gain of CMIX output" }; -const struct LMS7Parameter CMIX_SC_TXTSP = { 0x0208, 13, 13, 0, "CMIX_SC_TXTSP", "Spectrum control of CMIX" }; -const struct LMS7Parameter CMIX_BYP_TXTSP = { 0x0208, 8, 8, 0, "CMIX_BYP_TXTSP", "CMIX bypass" }; -const struct LMS7Parameter ISINC_BYP_TXTSP = { 0x0208, 7, 7, 0, "ISINC_BYP_TXTSP", "ISINC bypass" }; -const struct LMS7Parameter GFIR3_BYP_TXTSP = { 0x0208, 6, 6, 0, "GFIR3_BYP_TXTSP", "GFIR3 bypass" }; -const struct LMS7Parameter GFIR2_BYP_TXTSP = { 0x0208, 5, 5, 0, "GFIR2_BYP_TXTSP", "GFIR2 bypass" }; -const struct LMS7Parameter GFIR1_BYP_TXTSP = { 0x0208, 4, 4, 0, "GFIR1_BYP_TXTSP", "GFIR1 bypass" }; -const struct LMS7Parameter DC_BYP_TXTSP = { 0x0208, 3, 3, 0, "DC_BYP_TXTSP", "DC corrector bypass" }; -const struct LMS7Parameter GC_BYP_TXTSP = { 0x0208, 1, 1, 0, "GC_BYP_TXTSP", "Gain corrector bypass" }; -const struct LMS7Parameter PH_BYP_TXTSP = { 0x0208, 0, 0, 0, "PH_BYP_TXTSP", "Phase corrector bypass" }; -const struct LMS7Parameter BSIGI_TXTSP = { 0x0209, 23, 1, 0, "BSIGI_TXTSP", "" }; -const struct LMS7Parameter BSTATE_TXTSP = { 0x0209, 0, 0, 0, "BSTATE_TXTSP", "" }; -const struct LMS7Parameter BSIGQ_TXTSP = { 0x020A, 30, 8, 0, "BSIGQ_TXTSP", "" }; -const struct LMS7Parameter DC_REG_TXTSP = { 0x020C, 15, 0, 0, "DC_REG_TXTSP", "" }; -const struct LMS7Parameter DTHBIT_TX = { 0x0240, 8, 5, 1, "DTHBIT_TX", "NCO bits to dither" }; -const struct LMS7Parameter SEL_TX = { 0x0240, 4, 1, 0, "SEL_TX", "" }; -const struct LMS7Parameter MODE_TX = { 0x0240, 0, 0, 0, "MODE_TX", "" }; -const struct LMS7Parameter CAPTURE = { 0x0400, 15, 15, 0, "CAPTURE", "" }; -const struct LMS7Parameter CAPSEL = { 0x0400, 14, 13, 0, "CAPSEL", "" }; -const struct LMS7Parameter CAPSEL_ADC = { 0x0400, 12, 12, 0, "CAPSEL_ADC", "" }; -const struct LMS7Parameter TSGFC_RXTSP = { 0x0400, 9, 9, 0, "TSGFC_RXTSP", "TSG full scale control" }; -const struct LMS7Parameter TSGFCW_RXTSP = { 0x0400, 8, 7, 1, "TSGFCW_RXTSP", "Set frequency of TSG's NCO" }; -const struct LMS7Parameter TSGDCLDQ_RXTSP = { 0x0400, 6, 6, 0, "TSGDCLDQ_RXTSP", "" }; -const struct LMS7Parameter TSGDCLDI_RXTSP = { 0x0400, 5, 5, 0, "TSGDCLDI_RXTSP", "" }; -const struct LMS7Parameter TSGSWAPIQ_RXTSP = { 0x0400, 4, 4, 0, "TSGSWAPIQ_RXTSP", "Swap signals at test signal generator's output" }; -const struct LMS7Parameter TSGMODE_RXTSP = { 0x0400, 3, 3, 0, "TSGMODE_RXTSP", "Test signal generator mode" }; -const struct LMS7Parameter INSEL_RXTSP = { 0x0400, 2, 2, 0, "INSEL_RXTSP", "Input source of RxTSP" }; -const struct LMS7Parameter BSTART_RXTSP = { 0x0400, 1, 1, 0, "BSTART_RXTSP", "Starts delta sigma built in self test. Keep it at 1 one at least three clock cycles" }; -const struct LMS7Parameter EN_RXTSP = { 0x0400, 0, 0, 1, "EN_RXTSP", "RxTSP modules enable" }; -const struct LMS7Parameter GCORRQ_RXTSP = { 0x0401, 10, 0, 2047, "GCORRQ_RXTSP", "corrector value, channel Q Unsigned integer" }; -const struct LMS7Parameter GCORRI_RXTSP = { 0x0402, 10, 0, 2047, "GCORRI_RXTSP", "corrector value, channel I Unsigned integer" }; -const struct LMS7Parameter HBD_OVR_RXTSP = { 0x0403, 14, 12, 0, "HBD_OVR_RXTSP", "HBD interpolation ratio. Interpolation ratio is 2HBD_OVR+1" }; -const struct LMS7Parameter IQCORR_RXTSP = { 0x0403, 11, 0, 0, "IQCORR_RXTSP", "Phase corrector value (tan(Alpha/2)). Integer, 2's complement" }; -const struct LMS7Parameter HBD_DLY = { 0x0404, 15, 13, 0, "HBD_DLY", "" }; -const struct LMS7Parameter DCLOOP_BYP = { 0x0404, 8, 8, 0, "DCLOOP_BYP", "" }; -const struct LMS7Parameter DCCORR_AVG_RXTSP = { 0x0404, 2, 0, 0, "DCCORR_AVG_RXTSP", "Number of samples to average for Automatic DC corrector. Number of samples to average is 2DCCORR_AVG + 12" }; -const struct LMS7Parameter GFIR1_L_RXTSP = { 0x0405, 10, 8, 0, "GFIR1_L_RXTSP", "Parameter l of GFIR1 (l = roundUp(CoeffN/5)-1). Unsigned integer" }; -const struct LMS7Parameter GFIR1_N_RXTSP = { 0x0405, 7, 0, 0, "GFIR1_N_RXTSP", "Clock division ratio of GFIR1 is GFIR1_N + 1. Unsigned integer" }; -const struct LMS7Parameter GFIR2_L_RXTSP = { 0x0406, 10, 8, 0, "GFIR2_L_RXTSP", "Parameter l of GFIR2 (l = roundUp(CoeffN/5)-1). Unsigned integer" }; -const struct LMS7Parameter GFIR2_N_RXTSP = { 0x0406, 7, 0, 0, "GFIR2_N_RXTSP", "Clock division ratio of GFIR2 is GFIR2_N + 1. Unsigned integer" }; -const struct LMS7Parameter GFIR3_L_RXTSP = { 0x0407, 10, 8, 0, "GFIR3_L_RXTSP", "Parameter l of GFIR3 (l = roundUp(CoeffN/5)-1). Unsigned integer" }; -const struct LMS7Parameter GFIR3_N_RXTSP = { 0x0407, 7, 0, 0, "GFIR3_N_RXTSP", "Clock division ratio of GFIR3 is GFIR3_N + 1. Unsigned integer" }; -const struct LMS7Parameter AGC_K_RXTSP = { 0x0408, 17, 0, 0, "AGC_K_RXTSP", "AGC loop gain" }; -const struct LMS7Parameter AGC_ADESIRED_RXTSP = { 0x0409, 15, 4, 0, "AGC_ADESIRED_RXTSP", "AGC_ADESIRED" }; -const struct LMS7Parameter RSSI_MODE = { 0x040A, 15, 14, 0, "RSSI_MODE", "" }; -const struct LMS7Parameter AGC_MODE_RXTSP = { 0x040A, 13, 12, 0, "AGC_MODE_RXTSP", "" }; -const struct LMS7Parameter AGC_AVG_RXTSP = { 0x040A, 2, 0, 0, "AGC_AVG_RXTSP", "AGC Averaging window size" }; -const struct LMS7Parameter DC_REG_RXTSP = { 0x040B, 15, 0, 0, "DC_REG_RXTSP", "" }; -const struct LMS7Parameter CMIX_GAIN_RXTSP = { 0x040C, 15, 14, 0, "CMIX_GAIN_RXTSP", "Gain of CMIX output" }; -const struct LMS7Parameter CMIX_SC_RXTSP = { 0x040C, 13, 13, 0, "CMIX_SC_RXTSP", "Spectrum control of CMIX" }; -const struct LMS7Parameter CMIX_BYP_RXTSP = { 0x040C, 7, 7, 0, "CMIX_BYP_RXTSP", "CMIX bypass" }; -const struct LMS7Parameter AGC_BYP_RXTSP = { 0x040C, 6, 6, 0, "AGC_BYP_RXTSP", "AGC bypass" }; -const struct LMS7Parameter GFIR3_BYP_RXTSP = { 0x040C, 5, 5, 0, "GFIR3_BYP_RXTSP", "GFIR3 bypass" }; -const struct LMS7Parameter GFIR2_BYP_RXTSP = { 0x040C, 4, 4, 0, "GFIR2_BYP_RXTSP", "GFIR2 bypass" }; -const struct LMS7Parameter GFIR1_BYP_RXTSP = { 0x040C, 3, 3, 0, "GFIR1_BYP_RXTSP", "GFIR1 bypass" }; -const struct LMS7Parameter DC_BYP_RXTSP = { 0x040C, 2, 2, 0, "DC_BYP_RXTSP", "DC corrector bypass" }; -const struct LMS7Parameter GC_BYP_RXTSP = { 0x040C, 1, 1, 0, "GC_BYP_RXTSP", "Gain corrector bypass" }; -const struct LMS7Parameter PH_BYP_RXTSP = { 0x040C, 0, 0, 0, "PH_BYP_RXTSP", "Phase corrector bypass" }; -const struct LMS7Parameter CAPD = { 0x040E, 31, 0, 0, "CAPD", "" }; -const struct LMS7Parameter DTHBIT_RX = { 0x0440, 8, 5, 1, "DTHBIT_RX", "NCO bits to dither" }; -const struct LMS7Parameter SEL_RX = { 0x0440, 4, 1, 0, "SEL_RX", "" }; -const struct LMS7Parameter MODE_RX = { 0x0440, 0, 0, 0, "MODE_RX", "" }; diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_parameters.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_parameters.h deleted file mode 100644 index 3fc4e0be6bbc956592d42cc99ae00b95851805af..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_parameters.h +++ /dev/null @@ -1,613 +0,0 @@ -/** -@file LMS7002M_parameters.h -@author Lime Microsystems (www.limemicro.com) -@brief List of LMS7002M transceiver control parameters -*/ - -#ifndef LMS7002M_PARAMETERS_H -#define LMS7002M_PARAMETERS_H - -#include "typedefs.h" -#include <vector> - -struct LMS7Parameter; -extern std::vector<const LMS7Parameter*> LMS7parameterList; - -struct LMS7Parameter -{ - LMS7Parameter() : address(0), msb(0), lsb(0), defaultValue(0), name(nullptr), tooltip(nullptr) - { - } - - LMS7Parameter(uint16_t address, uint8_t msb, uint8_t lsb, uint16_t defaultValue, const char *name, const char* tooltip) - : address(address), msb(msb), lsb(lsb), defaultValue(defaultValue), name(name), tooltip(tooltip) - { - LMS7parameterList.push_back(this); - } - - uint16_t address; - uint8_t msb; - uint8_t lsb; - uint16_t defaultValue; - const char* name; - const char* tooltip; - inline bool operator==(const LMS7Parameter& obj) - { - if (address == obj.address && msb == obj.msb && lsb == obj.lsb) - return true; - return false; - }; -}; - -extern const struct LMS7Parameter LRST_TX_B; -extern const struct LMS7Parameter MRST_TX_B; -extern const struct LMS7Parameter LRST_TX_A; -extern const struct LMS7Parameter MRST_TX_A; -extern const struct LMS7Parameter LRST_RX_B; -extern const struct LMS7Parameter MRST_RX_B; -extern const struct LMS7Parameter LRST_RX_A; -extern const struct LMS7Parameter MRST_RX_A; -extern const struct LMS7Parameter SRST_RXFIFO; -extern const struct LMS7Parameter SRST_TXFIFO; -extern const struct LMS7Parameter RXEN_B; -extern const struct LMS7Parameter RXEN_A; -extern const struct LMS7Parameter TXEN_B; -extern const struct LMS7Parameter TXEN_A; -extern const struct LMS7Parameter MAC; -extern const struct LMS7Parameter TX_CLK_PE; -extern const struct LMS7Parameter RX_CLK_PE; -extern const struct LMS7Parameter SDA_PE; -extern const struct LMS7Parameter SDA_DS; -extern const struct LMS7Parameter SCL_PE; -extern const struct LMS7Parameter SCL_DS; -extern const struct LMS7Parameter SDIO_DS; -extern const struct LMS7Parameter SDIO_PE; -extern const struct LMS7Parameter SDO_PE; -extern const struct LMS7Parameter SCLK_PE; -extern const struct LMS7Parameter SEN_PE; -extern const struct LMS7Parameter SPIMODE; -extern const struct LMS7Parameter DIQ2_DS; -extern const struct LMS7Parameter DIQ2_PE; -extern const struct LMS7Parameter IQ_SEL_EN_2_PE; -extern const struct LMS7Parameter TXNRX2_PE; -extern const struct LMS7Parameter FCLK2_PE; -extern const struct LMS7Parameter MCLK2_PE; -extern const struct LMS7Parameter DIQ1_DS; -extern const struct LMS7Parameter DIQ1_PE; -extern const struct LMS7Parameter IQ_SEL_EN_1_PE; -extern const struct LMS7Parameter TXNRX1_PE; -extern const struct LMS7Parameter FCLK1_PE; -extern const struct LMS7Parameter MCLK1_PE; -extern const struct LMS7Parameter DIQDIRCTR2; -extern const struct LMS7Parameter DIQDIR2; -extern const struct LMS7Parameter DIQDIRCTR1; -extern const struct LMS7Parameter DIQDIR1; -extern const struct LMS7Parameter ENABLEDIRCTR2; -extern const struct LMS7Parameter ENABLEDIR2; -extern const struct LMS7Parameter ENABLEDIRCTR1; -extern const struct LMS7Parameter ENABLEDIR1; -extern const struct LMS7Parameter MOD_EN; -extern const struct LMS7Parameter LML2_FIDM; -extern const struct LMS7Parameter LML2_TXNRXIQ; -extern const struct LMS7Parameter LML2_MODE; -extern const struct LMS7Parameter LML1_FIDM; -extern const struct LMS7Parameter LML1_TXNRXIQ; -extern const struct LMS7Parameter LML1_MODE; -extern const struct LMS7Parameter LML1_S3S; -extern const struct LMS7Parameter LML1_S2S; -extern const struct LMS7Parameter LML1_S1S; -extern const struct LMS7Parameter LML1_S0S; -extern const struct LMS7Parameter LML1_BQP; -extern const struct LMS7Parameter LML1_BIP; -extern const struct LMS7Parameter LML1_AQP; -extern const struct LMS7Parameter LML1_AIP; -extern const struct LMS7Parameter LML1_BB2RF_PST; -extern const struct LMS7Parameter LML1_BB2RF_PRE; -extern const struct LMS7Parameter LML1_RF2BB_PST; -extern const struct LMS7Parameter LML1_RF2BB_PRE; -extern const struct LMS7Parameter LML2_S3S; -extern const struct LMS7Parameter LML2_S2S; -extern const struct LMS7Parameter LML2_S1S; -extern const struct LMS7Parameter LML2_S0S; -extern const struct LMS7Parameter LML2_BQP; -extern const struct LMS7Parameter LML2_BIP; -extern const struct LMS7Parameter LML2_AQP; -extern const struct LMS7Parameter LML2_AIP; -extern const struct LMS7Parameter LML2_BB2RF_PST; -extern const struct LMS7Parameter LML2_BB2RF_PRE; -extern const struct LMS7Parameter LML2_RF2BB_PST; -extern const struct LMS7Parameter LML2_RF2BB_PRE; -extern const struct LMS7Parameter FCLK2_DLY; -extern const struct LMS7Parameter FCLK1_DLY; -extern const struct LMS7Parameter RX_MUX; -extern const struct LMS7Parameter TX_MUX; -extern const struct LMS7Parameter TXRDCLK_MUX; -extern const struct LMS7Parameter TXWRCLK_MUX; -extern const struct LMS7Parameter RXRDCLK_MUX; -extern const struct LMS7Parameter RXWRCLK_MUX; -extern const struct LMS7Parameter FCLK2_INV; -extern const struct LMS7Parameter FCLK1_INV; -extern const struct LMS7Parameter MCLK2DLY; -extern const struct LMS7Parameter MCLK1DLY; -extern const struct LMS7Parameter MCLK2SRC; -extern const struct LMS7Parameter MCLK1SRC; -extern const struct LMS7Parameter TXDIVEN; -extern const struct LMS7Parameter RXDIVEN; -extern const struct LMS7Parameter TXTSPCLKA_DIV; -extern const struct LMS7Parameter RXTSPCLKA_DIV; -extern const struct LMS7Parameter MIMO_SISO; -extern const struct LMS7Parameter VER; -extern const struct LMS7Parameter REV; -extern const struct LMS7Parameter MASK; -extern const struct LMS7Parameter EN_DIR_LDO; -extern const struct LMS7Parameter EN_DIR_CGEN; -extern const struct LMS7Parameter EN_DIR_XBUF; -extern const struct LMS7Parameter EN_DIR_AFE; -extern const struct LMS7Parameter ISEL_DAC_AFE; -extern const struct LMS7Parameter MODE_INTERLEAVE_AFE; -extern const struct LMS7Parameter MUX_AFE_1; -extern const struct LMS7Parameter MUX_AFE_2; -extern const struct LMS7Parameter PD_AFE; -extern const struct LMS7Parameter PD_RX_AFE1; -extern const struct LMS7Parameter PD_RX_AFE2; -extern const struct LMS7Parameter PD_TX_AFE1; -extern const struct LMS7Parameter PD_TX_AFE2; -extern const struct LMS7Parameter EN_G_AFE; -extern const struct LMS7Parameter MUX_BIAS_OUT; -extern const struct LMS7Parameter RP_CALIB_BIAS; -extern const struct LMS7Parameter PD_FRP_BIAS; -extern const struct LMS7Parameter PD_F_BIAS; -extern const struct LMS7Parameter PD_PTRP_BIAS; -extern const struct LMS7Parameter PD_PT_BIAS; -extern const struct LMS7Parameter PD_BIAS_MASTER; -extern const struct LMS7Parameter SLFB_XBUF_RX; -extern const struct LMS7Parameter SLFB_XBUF_TX; -extern const struct LMS7Parameter BYP_XBUF_RX; -extern const struct LMS7Parameter BYP_XBUF_TX; -extern const struct LMS7Parameter EN_OUT2_XBUF_TX; -extern const struct LMS7Parameter EN_TBUFIN_XBUF_RX; -extern const struct LMS7Parameter PD_XBUF_RX; -extern const struct LMS7Parameter PD_XBUF_TX; -extern const struct LMS7Parameter EN_G_XBUF; -extern const struct LMS7Parameter SPDUP_VCO_CGEN; -extern const struct LMS7Parameter RESET_N_CGEN; -extern const struct LMS7Parameter EN_ADCCLKH_CLKGN; -extern const struct LMS7Parameter EN_COARSE_CKLGEN; -extern const struct LMS7Parameter EN_INTONLY_SDM_CGEN; -extern const struct LMS7Parameter EN_SDM_CLK_CGEN; -extern const struct LMS7Parameter PD_CP_CGEN; -extern const struct LMS7Parameter PD_FDIV_FB_CGEN; -extern const struct LMS7Parameter PD_FDIV_O_CGEN; -extern const struct LMS7Parameter PD_SDM_CGEN; -extern const struct LMS7Parameter PD_VCO_CGEN; -extern const struct LMS7Parameter PD_VCO_COMP_CGEN; -extern const struct LMS7Parameter EN_G_CGEN; -extern const struct LMS7Parameter FRAC_SDM_CGEN_LSB; -extern const struct LMS7Parameter INT_SDM_CGEN; -extern const struct LMS7Parameter FRAC_SDM_CGEN_MSB; -extern const struct LMS7Parameter REV_SDMCLK_CGEN; -extern const struct LMS7Parameter SEL_SDMCLK_CGEN; -extern const struct LMS7Parameter SX_DITHER_EN_CGEN; -extern const struct LMS7Parameter CLKH_OV_CLKL_CGEN; -extern const struct LMS7Parameter DIV_OUTCH_CGEN; -extern const struct LMS7Parameter TST_CGEN; -extern const struct LMS7Parameter REV_CLKDAC_CGEN; -extern const struct LMS7Parameter CMPLO_CTRL_CGEN; -extern const struct LMS7Parameter REV_CLKADC_CGEN; -extern const struct LMS7Parameter REVPH_PFD_CGEN; -extern const struct LMS7Parameter IOFFSET_CP_CGEN; -extern const struct LMS7Parameter IPULSE_CP_CGEN; -extern const struct LMS7Parameter ICT_VCO_CGEN; -extern const struct LMS7Parameter CSW_VCO_CGEN; -extern const struct LMS7Parameter COARSE_START_CGEN; -extern const struct LMS7Parameter COARSE_STEPDONE_CGEN; -extern const struct LMS7Parameter COARSEPLL_COMPO_CGEN; -extern const struct LMS7Parameter VCO_CMPHO_CGEN; -extern const struct LMS7Parameter VCO_CMPLO_CGEN; -extern const struct LMS7Parameter CP2_CGEN; -extern const struct LMS7Parameter CP3_CGEN; -extern const struct LMS7Parameter CZ_CGEN; -extern const struct LMS7Parameter EN_LDO_DIG; -extern const struct LMS7Parameter EN_LDO_DIGGN; -extern const struct LMS7Parameter EN_LDO_DIGSXR; -extern const struct LMS7Parameter EN_LDO_DIGSXT; -extern const struct LMS7Parameter EN_LDO_DIVGN; -extern const struct LMS7Parameter EN_LDO_DIVSXR; -extern const struct LMS7Parameter EN_LDO_DIVSXT; -extern const struct LMS7Parameter EN_LDO_LNA12; -extern const struct LMS7Parameter EN_LDO_LNA14; -extern const struct LMS7Parameter EN_LDO_MXRFE; -extern const struct LMS7Parameter EN_LDO_RBB; -extern const struct LMS7Parameter EN_LDO_RXBUF; -extern const struct LMS7Parameter EN_LDO_TBB; -extern const struct LMS7Parameter EN_LDO_TIA12; -extern const struct LMS7Parameter EN_LDO_TIA14; -extern const struct LMS7Parameter EN_G_LDO; -extern const struct LMS7Parameter EN_LOADIMP_LDO_TLOB; -extern const struct LMS7Parameter EN_LOADIMP_LDO_TPAD; -extern const struct LMS7Parameter EN_LOADIMP_LDO_TXBUF; -extern const struct LMS7Parameter EN_LOADIMP_LDO_VCOGN; -extern const struct LMS7Parameter EN_LOADIMP_LDO_VCOSXR; -extern const struct LMS7Parameter EN_LOADIMP_LDO_VCOSXT; -extern const struct LMS7Parameter EN_LDO_AFE; -extern const struct LMS7Parameter EN_LDO_CPGN; -extern const struct LMS7Parameter EN_LDO_CPSXR; -extern const struct LMS7Parameter EN_LDO_TLOB; -extern const struct LMS7Parameter EN_LDO_TPAD; -extern const struct LMS7Parameter EN_LDO_TXBUF; -extern const struct LMS7Parameter EN_LDO_VCOGN; -extern const struct LMS7Parameter EN_LDO_VCOSXR; -extern const struct LMS7Parameter EN_LDO_VCOSXT; -extern const struct LMS7Parameter EN_LDO_CPSXT; -extern const struct LMS7Parameter EN_LOADIMP_LDO_CPSXT; -extern const struct LMS7Parameter EN_LOADIMP_LDO_DIG; -extern const struct LMS7Parameter EN_LOADIMP_LDO_DIGGN; -extern const struct LMS7Parameter EN_LOADIMP_LDO_DIGSXR; -extern const struct LMS7Parameter EN_LOADIMP_LDO_DIGSXT; -extern const struct LMS7Parameter EN_LOADIMP_LDO_DIVGN; -extern const struct LMS7Parameter EN_LOADIMP_LDO_DIVSXR; -extern const struct LMS7Parameter EN_LOADIMP_LDO_DIVSXT; -extern const struct LMS7Parameter EN_LOADIMP_LDO_LNA12; -extern const struct LMS7Parameter EN_LOADIMP_LDO_LNA14; -extern const struct LMS7Parameter EN_LOADIMP_LDO_MXRFE; -extern const struct LMS7Parameter EN_LOADIMP_LDO_RBB; -extern const struct LMS7Parameter EN_LOADIMP_LDO_RXBUF; -extern const struct LMS7Parameter EN_LOADIMP_LDO_TBB; -extern const struct LMS7Parameter EN_LOADIMP_LDO_TIA12; -extern const struct LMS7Parameter EN_LOADIMP_LDO_TIA14; -extern const struct LMS7Parameter BYP_LDO_TBB; -extern const struct LMS7Parameter BYP_LDO_TIA12; -extern const struct LMS7Parameter BYP_LDO_TIA14; -extern const struct LMS7Parameter BYP_LDO_TLOB; -extern const struct LMS7Parameter BYP_LDO_TPAD; -extern const struct LMS7Parameter BYP_LDO_TXBUF; -extern const struct LMS7Parameter BYP_LDO_VCOGN; -extern const struct LMS7Parameter BYP_LDO_VCOSXR; -extern const struct LMS7Parameter BYP_LDO_VCOSXT; -extern const struct LMS7Parameter EN_LOADIMP_LDO_AFE; -extern const struct LMS7Parameter EN_LOADIMP_LDO_CPGN; -extern const struct LMS7Parameter EN_LOADIMP_LDO_CPSXR; -extern const struct LMS7Parameter BYP_LDO_AFE; -extern const struct LMS7Parameter BYP_LDO_CPGN; -extern const struct LMS7Parameter BYP_LDO_CPSXR; -extern const struct LMS7Parameter BYP_LDO_CPSXT; -extern const struct LMS7Parameter BYP_LDO_DIG; -extern const struct LMS7Parameter BYP_LDO_DIGGN; -extern const struct LMS7Parameter BYP_LDO_DIGSXR; -extern const struct LMS7Parameter BYP_LDO_DIGSXT; -extern const struct LMS7Parameter BYP_LDO_DIVGN; -extern const struct LMS7Parameter BYP_LDO_DIVSXR; -extern const struct LMS7Parameter BYP_LDO_DIVSXT; -extern const struct LMS7Parameter BYP_LDO_LNA12; -extern const struct LMS7Parameter BYP_LDO_LNA14; -extern const struct LMS7Parameter BYP_LDO_MXRFE; -extern const struct LMS7Parameter BYP_LDO_RBB; -extern const struct LMS7Parameter BYP_LDO_RXBUF; -extern const struct LMS7Parameter SPDUP_LDO_DIVSXR; -extern const struct LMS7Parameter SPDUP_LDO_DIVSXT; -extern const struct LMS7Parameter SPDUP_LDO_LNA12; -extern const struct LMS7Parameter SPDUP_LDO_LNA14; -extern const struct LMS7Parameter SPDUP_LDO_MXRFE; -extern const struct LMS7Parameter SPDUP_LDO_RBB; -extern const struct LMS7Parameter SPDUP_LDO_RXBUF; -extern const struct LMS7Parameter SPDUP_LDO_TBB; -extern const struct LMS7Parameter SPDUP_LDO_TIA12; -extern const struct LMS7Parameter SPDUP_LDO_TIA14; -extern const struct LMS7Parameter SPDUP_LDO_TLOB; -extern const struct LMS7Parameter SPDUP_LDO_TPAD; -extern const struct LMS7Parameter SPDUP_LDO_TXBUF; -extern const struct LMS7Parameter SPDUP_LDO_VCOGN; -extern const struct LMS7Parameter SPDUP_LDO_VCOSXR; -extern const struct LMS7Parameter SPDUP_LDO_VCOSXT; -extern const struct LMS7Parameter SPDUP_LDO_AFE; -extern const struct LMS7Parameter SPDUP_LDO_CPGN; -extern const struct LMS7Parameter SPDUP_LDO_CPSXR; -extern const struct LMS7Parameter SPDUP_LDO_CPSXT; -extern const struct LMS7Parameter SPDUP_LDO_DIG; -extern const struct LMS7Parameter SPDUP_LDO_DIGGN; -extern const struct LMS7Parameter SPDUP_LDO_DIGSXR; -extern const struct LMS7Parameter SPDUP_LDO_DIGSXT; -extern const struct LMS7Parameter SPDUP_LDO_DIVGN; -extern const struct LMS7Parameter RDIV_VCOSXR; -extern const struct LMS7Parameter RDIV_VCOSXT; -extern const struct LMS7Parameter RDIV_TXBUF; -extern const struct LMS7Parameter RDIV_VCOGN; -extern const struct LMS7Parameter RDIV_TLOB; -extern const struct LMS7Parameter RDIV_TPAD; -extern const struct LMS7Parameter RDIV_TIA12; -extern const struct LMS7Parameter RDIV_TIA14; -extern const struct LMS7Parameter RDIV_RXBUF; -extern const struct LMS7Parameter RDIV_TBB; -extern const struct LMS7Parameter RDIV_MXRFE; -extern const struct LMS7Parameter RDIV_RBB; -extern const struct LMS7Parameter RDIV_LNA12; -extern const struct LMS7Parameter RDIV_LNA14; -extern const struct LMS7Parameter RDIV_DIVSXR; -extern const struct LMS7Parameter RDIV_DIVSXT; -extern const struct LMS7Parameter RDIV_DIGSXT; -extern const struct LMS7Parameter RDIV_DIVGN; -extern const struct LMS7Parameter RDIV_DIGGN; -extern const struct LMS7Parameter RDIV_DIGSXR; -extern const struct LMS7Parameter RDIV_CPSXT; -extern const struct LMS7Parameter RDIV_DIG; -extern const struct LMS7Parameter RDIV_CPGN; -extern const struct LMS7Parameter RDIV_CPSXR; -extern const struct LMS7Parameter RDIV_SPIBUF; -extern const struct LMS7Parameter RDIV_AFE; -extern const struct LMS7Parameter SPDUP_LDO_SPIBUF; -extern const struct LMS7Parameter SPDUP_LDO_DIGIp2; -extern const struct LMS7Parameter SPDUP_LDO_DIGIp1; -extern const struct LMS7Parameter BYP_LDO_SPIBUF; -extern const struct LMS7Parameter BYP_LDO_DIGIp2; -extern const struct LMS7Parameter BYP_LDO_DIGIp1; -extern const struct LMS7Parameter EN_LOADIMP_LDO_SPIBUF; -extern const struct LMS7Parameter EN_LOADIMP_LDO_DIGIp2; -extern const struct LMS7Parameter EN_LOADIMP_LDO_DIGIp1; -extern const struct LMS7Parameter PD_LDO_SPIBUF; -extern const struct LMS7Parameter PD_LDO_DIGIp2; -extern const struct LMS7Parameter PD_LDO_DIGIp1; -extern const struct LMS7Parameter EN_G_LDOP; -extern const struct LMS7Parameter RDIV_DIGIp2; -extern const struct LMS7Parameter RDIV_DIGIp1; -extern const struct LMS7Parameter BSIGT; -extern const struct LMS7Parameter BSTATE; -extern const struct LMS7Parameter EN_SDM_TSTO_SXT; -extern const struct LMS7Parameter EN_SDM_TSTO_SXR; -extern const struct LMS7Parameter EN_SDM_TSTO_CGEN; -extern const struct LMS7Parameter BENC; -extern const struct LMS7Parameter BENR; -extern const struct LMS7Parameter BENT; -extern const struct LMS7Parameter BSTART; -extern const struct LMS7Parameter BSIGR; -extern const struct LMS7Parameter BSIGC; -extern const struct LMS7Parameter CDS_MCLK2; -extern const struct LMS7Parameter CDS_MCLK1; -extern const struct LMS7Parameter CDSN_TXBTSP; -extern const struct LMS7Parameter CDSN_TXATSP; -extern const struct LMS7Parameter CDSN_RXBTSP; -extern const struct LMS7Parameter CDSN_RXATSP; -extern const struct LMS7Parameter CDSN_TXBLML; -extern const struct LMS7Parameter CDSN_TXALML; -extern const struct LMS7Parameter CDSN_RXBLML; -extern const struct LMS7Parameter CDSN_RXALML; -extern const struct LMS7Parameter CDSN_MCLK2; -extern const struct LMS7Parameter CDSN_MCLK1; -extern const struct LMS7Parameter CDS_TXBTSP; -extern const struct LMS7Parameter CDS_TXATSP; -extern const struct LMS7Parameter CDS_RXBTSP; -extern const struct LMS7Parameter CDS_RXATSP; -extern const struct LMS7Parameter CDS_TXBLML; -extern const struct LMS7Parameter CDS_TXALML; -extern const struct LMS7Parameter CDS_RXBLML; -extern const struct LMS7Parameter CDS_RXALML; -extern const struct LMS7Parameter EN_LOWBWLOMX_TMX_TRF; -extern const struct LMS7Parameter EN_NEXTTX_TRF; -extern const struct LMS7Parameter EN_AMPHF_PDET_TRF; -extern const struct LMS7Parameter LOADR_PDET_TRF; -extern const struct LMS7Parameter PD_PDET_TRF; -extern const struct LMS7Parameter PD_TLOBUF_TRF; -extern const struct LMS7Parameter PD_TXPAD_TRF; -extern const struct LMS7Parameter EN_G_TRF; -extern const struct LMS7Parameter F_TXPAD_TRF; -extern const struct LMS7Parameter L_LOOPB_TXPAD_TRF; -extern const struct LMS7Parameter LOSS_LIN_TXPAD_TRF; -extern const struct LMS7Parameter LOSS_MAIN_TXPAD_TRF; -extern const struct LMS7Parameter EN_LOOPB_TXPAD_TRF; -extern const struct LMS7Parameter GCAS_GNDREF_TXPAD_TRF; -extern const struct LMS7Parameter ICT_LIN_TXPAD_TRF; -extern const struct LMS7Parameter ICT_MAIN_TXPAD_TRF; -extern const struct LMS7Parameter VGCAS_TXPAD_TRF; -extern const struct LMS7Parameter SEL_BAND1_TRF; -extern const struct LMS7Parameter SEL_BAND2_TRF; -extern const struct LMS7Parameter LOBIASN_TXM_TRF; -extern const struct LMS7Parameter LOBIASP_TXX_TRF; -extern const struct LMS7Parameter CDC_I_TRF; -extern const struct LMS7Parameter CDC_Q_TRF; -extern const struct LMS7Parameter STATPULSE_TBB; -extern const struct LMS7Parameter LOOPB_TBB; -extern const struct LMS7Parameter PD_LPFH_TBB; -extern const struct LMS7Parameter PD_LPFIAMP_TBB; -extern const struct LMS7Parameter PD_LPFLAD_TBB; -extern const struct LMS7Parameter PD_LPFS5_TBB; -extern const struct LMS7Parameter EN_G_TBB; -extern const struct LMS7Parameter ICT_LPFS5_F_TBB; -extern const struct LMS7Parameter ICT_LPFS5_PT_TBB; -extern const struct LMS7Parameter ICT_LPF_H_PT_TBB; -extern const struct LMS7Parameter ICT_LPFH_F_TBB; -extern const struct LMS7Parameter ICT_LPFLAD_F_TBB; -extern const struct LMS7Parameter ICT_LPFLAD_PT_TBB; -extern const struct LMS7Parameter CG_IAMP_TBB; -extern const struct LMS7Parameter ICT_IAMP_FRP_TBB; -extern const struct LMS7Parameter ICT_IAMP_GG_FRP_TBB; -extern const struct LMS7Parameter RCAL_LPFH_TBB; -extern const struct LMS7Parameter RCAL_LPFLAD_TBB; -extern const struct LMS7Parameter TSTIN_TBB; -extern const struct LMS7Parameter BYPLADDER_TBB; -extern const struct LMS7Parameter CCAL_LPFLAD_TBB; -extern const struct LMS7Parameter RCAL_LPFS5_TBB; -extern const struct LMS7Parameter CDC_I_RFE; -extern const struct LMS7Parameter CDC_Q_RFE; -extern const struct LMS7Parameter PD_LNA_RFE; -extern const struct LMS7Parameter PD_RLOOPB_1_RFE; -extern const struct LMS7Parameter PD_RLOOPB_2_RFE; -extern const struct LMS7Parameter PD_MXLOBUF_RFE; -extern const struct LMS7Parameter PD_QGEN_RFE; -extern const struct LMS7Parameter PD_RSSI_RFE; -extern const struct LMS7Parameter PD_TIA_RFE; -extern const struct LMS7Parameter EN_G_RFE; -extern const struct LMS7Parameter SEL_PATH_RFE; -extern const struct LMS7Parameter EN_DCOFF_RXFE_RFE; -extern const struct LMS7Parameter EN_INSHSW_LB1_RFE; -extern const struct LMS7Parameter EN_INSHSW_LB2_RFE; -extern const struct LMS7Parameter EN_INSHSW_L_RFE; -extern const struct LMS7Parameter EN_INSHSW_W_RFE; -extern const struct LMS7Parameter EN_NEXTRX_RFE; -extern const struct LMS7Parameter DCOFFI_RFE; -extern const struct LMS7Parameter DCOFFQ_RFE; -extern const struct LMS7Parameter ICT_LOOPB_RFE; -extern const struct LMS7Parameter ICT_TIAMAIN_RFE; -extern const struct LMS7Parameter ICT_TIAOUT_RFE; -extern const struct LMS7Parameter ICT_LNACMO_RFE; -extern const struct LMS7Parameter ICT_LNA_RFE; -extern const struct LMS7Parameter ICT_LODC_RFE; -extern const struct LMS7Parameter CAP_RXMXO_RFE; -extern const struct LMS7Parameter CGSIN_LNA_RFE; -extern const struct LMS7Parameter CCOMP_TIA_RFE; -extern const struct LMS7Parameter CFB_TIA_RFE; -extern const struct LMS7Parameter G_LNA_RFE; -extern const struct LMS7Parameter G_RXLOOPB_RFE; -extern const struct LMS7Parameter G_TIA_RFE; -extern const struct LMS7Parameter RCOMP_TIA_RFE; -extern const struct LMS7Parameter RFB_TIA_RFE; -extern const struct LMS7Parameter EN_LB_LPFH_RBB; -extern const struct LMS7Parameter EN_LB_LPFL_RBB; -extern const struct LMS7Parameter PD_LPFH_RBB; -extern const struct LMS7Parameter PD_LPFL_RBB; -extern const struct LMS7Parameter PD_PGA_RBB; -extern const struct LMS7Parameter EN_G_RBB; -extern const struct LMS7Parameter R_CTL_LPF_RBB; -extern const struct LMS7Parameter RCC_CTL_LPFH_RBB; -extern const struct LMS7Parameter C_CTL_LPFH_RBB; -extern const struct LMS7Parameter RCC_CTL_LPFL_RBB; -extern const struct LMS7Parameter C_CTL_LPFL_RBB; -extern const struct LMS7Parameter INPUT_CTL_PGA_RBB; -extern const struct LMS7Parameter ICT_LPF_IN_RBB; -extern const struct LMS7Parameter ICT_LPF_OUT_RBB; -extern const struct LMS7Parameter OSW_PGA_RBB; -extern const struct LMS7Parameter ICT_PGA_OUT_RBB; -extern const struct LMS7Parameter ICT_PGA_IN_RBB; -extern const struct LMS7Parameter G_PGA_RBB; -extern const struct LMS7Parameter RCC_CTL_PGA_RBB; -extern const struct LMS7Parameter C_CTL_PGA_RBB; -extern const struct LMS7Parameter RESET_N; -extern const struct LMS7Parameter SPDUP_VCO; -extern const struct LMS7Parameter BYPLDO_VCO; -extern const struct LMS7Parameter EN_COARSEPLL; -extern const struct LMS7Parameter CURLIM_VCO; -extern const struct LMS7Parameter EN_DIV2_DIVPROG; -extern const struct LMS7Parameter EN_INTONLY_SDM; -extern const struct LMS7Parameter EN_SDM_CLK; -extern const struct LMS7Parameter PD_FBDIV; -extern const struct LMS7Parameter PD_LOCH_T2RBUF; -extern const struct LMS7Parameter PD_CP; -extern const struct LMS7Parameter PD_FDIV; -extern const struct LMS7Parameter PD_SDM; -extern const struct LMS7Parameter PD_VCO_COMP; -extern const struct LMS7Parameter PD_VCO; -extern const struct LMS7Parameter EN_G; -extern const struct LMS7Parameter FRAC_SDM_LSB; -extern const struct LMS7Parameter INT_SDM; -extern const struct LMS7Parameter FRAC_SDM_MSB; -extern const struct LMS7Parameter PW_DIV2_LOCH; -extern const struct LMS7Parameter PW_DIV4_LOCH; -extern const struct LMS7Parameter DIV_LOCH; -extern const struct LMS7Parameter TST_SX; -extern const struct LMS7Parameter SEL_SDMCLK; -extern const struct LMS7Parameter SX_DITHER_EN; -extern const struct LMS7Parameter REV_SDMCLK; -extern const struct LMS7Parameter VDIV_VCO; -extern const struct LMS7Parameter ICT_VCO; -extern const struct LMS7Parameter RSEL_LDO_VCO; -extern const struct LMS7Parameter CSW_VCO; -extern const struct LMS7Parameter SEL_VCO; -extern const struct LMS7Parameter COARSE_START; -extern const struct LMS7Parameter REVPH_PFD; -extern const struct LMS7Parameter IOFFSET_CP; -extern const struct LMS7Parameter IPULSE_CP; -extern const struct LMS7Parameter COARSE_STEPDONE; -extern const struct LMS7Parameter COARSEPLL_COMPO; -extern const struct LMS7Parameter VCO_CMPHO; -extern const struct LMS7Parameter VCO_CMPLO; -extern const struct LMS7Parameter CP2_PLL; -extern const struct LMS7Parameter CP3_PLL; -extern const struct LMS7Parameter CZ; -extern const struct LMS7Parameter EN_DIR_SXRSXT; -extern const struct LMS7Parameter EN_DIR_RBB; -extern const struct LMS7Parameter EN_DIR_RFE; -extern const struct LMS7Parameter EN_DIR_TBB; -extern const struct LMS7Parameter EN_DIR_TRF; -extern const struct LMS7Parameter TSGFC_TXTSP; -extern const struct LMS7Parameter TSGFCW_TXTSP; -extern const struct LMS7Parameter TSGDCLDQ_TXTSP; -extern const struct LMS7Parameter TSGDCLDI_TXTSP; -extern const struct LMS7Parameter TSGSWAPIQ_TXTSP; -extern const struct LMS7Parameter TSGMODE_TXTSP; -extern const struct LMS7Parameter INSEL_TXTSP; -extern const struct LMS7Parameter BSTART_TXTSP; -extern const struct LMS7Parameter EN_TXTSP; -extern const struct LMS7Parameter GCORRQ_TXTSP; -extern const struct LMS7Parameter GCORRI_TXTSP; -extern const struct LMS7Parameter HBI_OVR_TXTSP; -extern const struct LMS7Parameter IQCORR_TXTSP; -extern const struct LMS7Parameter DCCORRI_TXTSP; -extern const struct LMS7Parameter DCCORRQ_TXTSP; -extern const struct LMS7Parameter GFIR1_L_TXTSP; -extern const struct LMS7Parameter GFIR1_N_TXTSP; -extern const struct LMS7Parameter GFIR2_L_TXTSP; -extern const struct LMS7Parameter GFIR2_N_TXTSP; -extern const struct LMS7Parameter GFIR3_L_TXTSP; -extern const struct LMS7Parameter GFIR3_N_TXTSP; -extern const struct LMS7Parameter CMIX_GAIN_TXTSP; -extern const struct LMS7Parameter CMIX_SC_TXTSP; -extern const struct LMS7Parameter CMIX_BYP_TXTSP; -extern const struct LMS7Parameter ISINC_BYP_TXTSP; -extern const struct LMS7Parameter GFIR3_BYP_TXTSP; -extern const struct LMS7Parameter GFIR2_BYP_TXTSP; -extern const struct LMS7Parameter GFIR1_BYP_TXTSP; -extern const struct LMS7Parameter DC_BYP_TXTSP; -extern const struct LMS7Parameter GC_BYP_TXTSP; -extern const struct LMS7Parameter PH_BYP_TXTSP; -extern const struct LMS7Parameter BSIGI_TXTSP; -extern const struct LMS7Parameter BSTATE_TXTSP; -extern const struct LMS7Parameter BSIGQ_TXTSP; -extern const struct LMS7Parameter DC_REG_TXTSP; -extern const struct LMS7Parameter DTHBIT_TX; -extern const struct LMS7Parameter SEL_TX; -extern const struct LMS7Parameter MODE_TX; -extern const struct LMS7Parameter CAPTURE; -extern const struct LMS7Parameter CAPSEL; -extern const struct LMS7Parameter CAPSEL_ADC; -extern const struct LMS7Parameter TSGFC_RXTSP; -extern const struct LMS7Parameter TSGFCW_RXTSP; -extern const struct LMS7Parameter TSGDCLDQ_RXTSP; -extern const struct LMS7Parameter TSGDCLDI_RXTSP; -extern const struct LMS7Parameter TSGSWAPIQ_RXTSP; -extern const struct LMS7Parameter TSGMODE_RXTSP; -extern const struct LMS7Parameter INSEL_RXTSP; -extern const struct LMS7Parameter BSTART_RXTSP; -extern const struct LMS7Parameter EN_RXTSP; -extern const struct LMS7Parameter GCORRQ_RXTSP; -extern const struct LMS7Parameter GCORRI_RXTSP; -extern const struct LMS7Parameter HBD_OVR_RXTSP; -extern const struct LMS7Parameter IQCORR_RXTSP; -extern const struct LMS7Parameter HBD_DLY; -extern const struct LMS7Parameter DCLOOP_BYP; -extern const struct LMS7Parameter DCCORR_AVG_RXTSP; -extern const struct LMS7Parameter GFIR1_L_RXTSP; -extern const struct LMS7Parameter GFIR1_N_RXTSP; -extern const struct LMS7Parameter GFIR2_L_RXTSP; -extern const struct LMS7Parameter GFIR2_N_RXTSP; -extern const struct LMS7Parameter GFIR3_L_RXTSP; -extern const struct LMS7Parameter GFIR3_N_RXTSP; -extern const struct LMS7Parameter AGC_K_RXTSP; -extern const struct LMS7Parameter AGC_ADESIRED_RXTSP; -extern const struct LMS7Parameter RSSI_MODE; -extern const struct LMS7Parameter AGC_MODE_RXTSP; -extern const struct LMS7Parameter AGC_AVG_RXTSP; -extern const struct LMS7Parameter DC_REG_RXTSP; -extern const struct LMS7Parameter CMIX_GAIN_RXTSP; -extern const struct LMS7Parameter CMIX_SC_RXTSP; -extern const struct LMS7Parameter CMIX_BYP_RXTSP; -extern const struct LMS7Parameter AGC_BYP_RXTSP; -extern const struct LMS7Parameter GFIR3_BYP_RXTSP; -extern const struct LMS7Parameter GFIR2_BYP_RXTSP; -extern const struct LMS7Parameter GFIR1_BYP_RXTSP; -extern const struct LMS7Parameter DC_BYP_RXTSP; -extern const struct LMS7Parameter GC_BYP_RXTSP; -extern const struct LMS7Parameter PH_BYP_RXTSP; -extern const struct LMS7Parameter CAPD; -extern const struct LMS7Parameter DTHBIT_RX; -extern const struct LMS7Parameter SEL_RX; -extern const struct LMS7Parameter MODE_RX; - -#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_statuses.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_statuses.cpp deleted file mode 100644 index 4e00854e1443956870826ab0830dbed0c9a52498..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_statuses.cpp +++ /dev/null @@ -1,16 +0,0 @@ -/** -@file LMS7002M_statuses.cpp -@author Lime Microsystems (www.limemicro.com) -*/ - -#include "LMS7002M_statuses.h" - -const char* undefinedStatusStr = "undefined status"; - -const char* liblms7_status2string(liblms7_status status) -{ - if (status >= 0 && status < LIBLMS7_STATUS_COUNT) - return liblms7_status_strings[status]; - else - return undefinedStatusStr; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_statuses.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_statuses.h deleted file mode 100644 index 43b736bfd52f541581742a703ba2010356ec6ce4..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_statuses.h +++ /dev/null @@ -1,48 +0,0 @@ -/** -@file LMS7002M_statuses.h -@author Lime Microsystems (www.limemicro.com) -@brief LMS7002M control library statuses enumerations -*/ - -#ifndef LMS7API_STATUSES_H -#define LMS7API_STATUSES_H - -const char liblms7_status_strings[][64] = -{ -"success", -"failure", -"index out of range", -"too many values", -"connection manager is NULL", -"port not connected", -"frequency out of range", -"cannot deliver frequency", -"VCO is powered down", -"Bad SEL_PATH_RFE", -"Band not selected", -"file not found", -"file invalid format", -}; - -enum liblms7_status -{ - LIBLMS7_SUCCESS = 0, - LIBLMS7_FAILURE, - LIBLMS7_INDEX_OUT_OF_RANGE, - LIBLMS7_TOO_MANY_VALUES, - LIBLMS7_NO_CONNECTION_MANAGER, - LIBLMS7_NOT_CONNECTED, - LIBLMS7_FREQUENCY_OUT_OF_RANGE, - LIBLMS7_CANNOT_DELIVER_FREQUENCY, - LIBLMS7_VCO_IS_POWERED_DOWN, - LIBLMS7_BAD_SEL_PATH, - LIBLMS7_BAND_NOT_SELECTED, - LIBLMS7_FILE_NOT_FOUND, - LIBLMS7_FILE_INVALID_FORMAT, - - LIBLMS7_STATUS_COUNT -}; - -const char* liblms7_status2string(liblms7_status status); - -#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionCOM.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionCOM.cpp deleted file mode 100644 index 6c7fc0d8290d5c26a8ae575fbcc98b4058cae124..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionCOM.cpp +++ /dev/null @@ -1,596 +0,0 @@ -/** - @file ConnectionCOM.cpp - @author Lime Microsystems (www.limemicro.com) - @brief Implementation of communications through COM port -*/ - -#include "ConnectionCOM.h" - -#include "string.h" -#ifdef __unix__ -#include <fstream> -#include <errno.h> -#include <unistd.h> -#include <termios.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <stdlib.h> -#include <iostream> -#include <stdio.h> -#endif // LINUX - -const int COM_RETRY_INTERVAL = 20; //ms -const int COM_TOTAL_TIMEOUT = 300; //ms - -/** @brief Initializes com port connection -*/ -ConnectionCOM::ConnectionCOM() -{ - currentDeviceIndex = -1; - connected = false; - comPortList.clear(); - m_deviceNames.clear(); - m_connectionType = COM_PORT; -#ifndef __unix__ - hComm = INVALID_HANDLE_VALUE; -#else - hComm = -1; -#endif - comBaudrate = 9600; -} - -/** @brief When object is destroyed it closes it's opened COM port -*/ -ConnectionCOM::~ConnectionCOM() -{ - Close(); -} - -/** @brief Opens connection to first found chip - @return 0-success -*/ -IConnection::DeviceStatus ConnectionCOM::Open() -{ - comPortList.clear(); - if(comPortList.size() == 0) - FindAllComPorts(); - - m_deviceNames.clear(); - if(m_deviceNames.size() == 0) - RefreshDeviceList(); - - for(unsigned int i=0; i<m_deviceNames.size(); i++) - { - if( Open(i) == SUCCESS) - { - currentDeviceIndex = i; - return SUCCESS; - } - } - return FAILURE; -} - -/** @brief Opens connection to selected chip - @param index chip index in device list - @return 0-success -*/ -IConnection::DeviceStatus ConnectionCOM::Open(unsigned index) -{ - unsigned int toOpen = index; - Close(); - if(toOpen < m_deviceNames.size() && m_deviceNames.size() > 0 ) - { - comPortName = m_deviceNames[toOpen]; - IConnection::DeviceStatus status = Open(comPortName.c_str(), comBaudrate); - if( status == SUCCESS ) - currentDeviceIndex = toOpen; - return status; - } - return FAILURE; -} - -/** @brief Closes connection to chip -*/ -void ConnectionCOM::Close() -{ - connected = false; - currentDeviceIndex = -1; -#ifndef __unix__ - if (hComm != INVALID_HANDLE_VALUE) - { - SetCommTimeouts(hComm, &m_ctmoOld); - CloseHandle(hComm); - } - hComm = INVALID_HANDLE_VALUE; -#else - if( hComm >= 0) - { - close(hComm); - } - hComm = -1; -#endif -} - -/** @brief Returns whether chip is connected - @return chip is connected -*/ -bool ConnectionCOM::IsOpen() -{ -#ifndef __unix__ - if (hComm != INVALID_HANDLE_VALUE && TestConnectivity() ) - return true; -#else - if( hComm != -1 && TestConnectivity() ) - return true; -#endif - return false; -} - -int ConnectionCOM::GetOpenedIndex() -{ - return currentDeviceIndex; -} - -/** @brief Sends data through COM port - @param buffer data buffer to send - @param length size of data buffer - @param timeout_ms timeout limit for operation in milliseconds - @return Number of bytes sent -*/ -int ConnectionCOM::Write(const unsigned char *buffer, int length, int timeout_ms) -{ - if(timeout_ms == 0) - { - timeout_ms = COM_TOTAL_TIMEOUT; - } - int retryCount = 0; - const int maxRetries = (timeout_ms/COM_RETRY_INTERVAL) > 1 ? (timeout_ms/COM_RETRY_INTERVAL) : 1; - bool status = false; -#ifndef __unix__ - unsigned long bytesWriten = 0; - m_osWOverlap.InternalHigh = 0; - - for(int i = 0; i<maxRetries && status == false; ++i) - { - if (!WriteFile(hComm, buffer, length , &bytesWriten, NULL)) - { - status = false; - } - else - status = true; - ++retryCount; - } -#else - long bytesWriten = 0; - for(int i = 0; i<maxRetries && bytesWriten == 0; ++i) - { - bytesWriten = write(hComm, buffer, length); - if(bytesWriten <= 0) - { -// if(bytesWriten < 0) -// MessageLog::getInstance()->write("COM PORT: error writing data\n", LOG_ERROR); -// if(bytesWriten == 0) -// MessageLog::getInstance()->write("COM PORT: data bytes sent 0\n", LOG_WARNING); - status = false; - } - else - status = true; - ++retryCount; - } -#endif - if(bytesWriten == length) - status = true; - - return bytesWriten; -} - -/** @brief Reads data from COM port - @param buffer pointer to data buffer for receiving - @param length number of bytes to read - @param timeout_ms timeout limit for operation in milliseconds - @return Number of bytes received -*/ -int ConnectionCOM::Read(unsigned char *buffer, int length, int timeout_ms) -{ - if(timeout_ms == 0) - { - timeout_ms = COM_TOTAL_TIMEOUT; - } - int retryCount = 0; - const int maxRetries = (timeout_ms/COM_RETRY_INTERVAL) > 1 ? (timeout_ms/COM_RETRY_INTERVAL) : 1; - bool status = false; - - memset(buffer, 0, length); - long bytesReaded = 0; - unsigned long totalBytesReaded = 0; - char cRawData[COM_BUFFER_LENGTH]; - unsigned long bytesToRead = length; - - memset(cRawData, '\0', sizeof(cRawData[0])*COM_BUFFER_LENGTH); - - for(int i=0; i<maxRetries && status == false; ++i) - { - memset(cRawData, '\0', sizeof(cRawData[0])*COM_BUFFER_LENGTH); -#ifndef __unix__ - - DWORD bytesReceived = 0; - if ( !ReadFile(hComm, cRawData, bytesToRead, &bytesReceived, NULL) ) - { - status = false; - } - - bytesReaded = bytesReceived; -#else - bytesReaded = read(hComm, cRawData, bytesToRead); - if(bytesReaded <= 0) - { -// if(bytesReaded < 0) -// MessageLog::getInstance()->write("COM PORT: error reading data\n", LOG_ERROR); -// if(bytesReaded == 0) -// MessageLog::getInstance()->write("COM PORT: reading 0 bytes\n", LOG_WARNING); - status = false; - } -#endif - retryCount++; - - for(int j=0; j<bytesReaded; ++j) - { - buffer[totalBytesReaded+j] = cRawData[j]; - } - - totalBytesReaded += bytesReaded; - if(totalBytesReaded == bytesToRead) - status = true; - } - -// ss << " read(" << totalBytesReaded << "): "; -// for(unsigned int i=0; i<64; ++i) -// ss << int2hex(buffer[i], 1) << " "; -// ss << " - retries: " << retryCount-1 << endl; - //MessageLog::getInstance()->write(ss.str(), LOG_DATA); - -// if(retryCount == maxRetries) -// MessageLog::getInstance()->write("COM PORT: read data timeout\n", LOG_WARNING); -// -// if(totalBytesReaded > length) -// MessageLog::getInstance()->write("COM PORT: read data corrupted, received length > requested length\n", LOG_ERROR); - return totalBytesReaded; -} - -/** @brief Searches for available COM ports and adds them to list -*/ -void ConnectionCOM::FindAllComPorts() -{ - Close(); - comPortList.clear(); -#ifndef __unix__ - HKEY hSERIALCOMM; - if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_QUERY_VALUE, &hSERIALCOMM) == ERROR_SUCCESS) - { - // Get the max value name and max value lengths - DWORD dwMaxValueNameLen; - DWORD dwMaxValueLen; - DWORD dwQueryInfo = RegQueryInfoKey(hSERIALCOMM, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &dwMaxValueNameLen, &dwMaxValueLen, NULL, NULL); - if (dwQueryInfo == ERROR_SUCCESS) - { - DWORD dwMaxValueNameSizeInChars = dwMaxValueNameLen + 1; - // Include space for the NULL terminator - DWORD dwMaxValueNameSizeInBytes = dwMaxValueNameSizeInChars*sizeof(TCHAR); - DWORD dwMaxValueDataSizeInChars = dwMaxValueLen / sizeof(TCHAR) + 1; - // Include space for the NULL terminator - DWORD dwMaxValueDataSizeInBytes = dwMaxValueDataSizeInChars*sizeof(TCHAR); - - // Allocate some space for the value name and value data - TCHAR* szValueName = new TCHAR[dwMaxValueNameSizeInChars]; - TCHAR* byValue = new TCHAR[dwMaxValueDataSizeInBytes]; - if (szValueName && byValue) - { - // Enumerate all the values underneath HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM - DWORD dwIndex = 0; - DWORD dwType; - DWORD dwValueNameSize = dwMaxValueNameSizeInChars; - DWORD dwDataSize = dwMaxValueDataSizeInBytes; - memset(szValueName, 0, dwMaxValueNameSizeInBytes); - memset(byValue, 0, dwMaxValueDataSizeInBytes); - LONG nEnum = RegEnumValue(hSERIALCOMM, dwIndex, szValueName, &dwValueNameSize, NULL, &dwType, (LPBYTE)byValue, &dwDataSize); - while (nEnum == ERROR_SUCCESS) - { - // If the value is of the correct type, then add it to the array - if (dwType == REG_SZ) - { - char portname[512]; - TCHAR* szPort = byValue; - int nUserNameLenUnicode = lstrlen( szPort ); // Convert all UNICODE characters - int nUserNameLen = WideCharToMultiByte( CP_ACP, // ANSI Code Page - 0, // No special handling of unmapped chars - (LPCWSTR)szPort, // wide-character string to be converted - nUserNameLenUnicode, - NULL, 0, // No output buffer since we are calculating length - NULL, NULL ); // Unrepresented char replacement - Use Default - TCHAR* pszUserName = new TCHAR[ nUserNameLen ]; // nUserNameLen includes the NULL character - WideCharToMultiByte( CP_ACP, // ANSI Code Page - 0, // No special handling of unmapped chars - (LPCWSTR)szPort, // wide-character string to be converted - nUserNameLenUnicode, - portname, - nUserNameLen, - NULL, NULL ); // Unrepresented char replacement - Use Default - portname[nUserNameLen] = 0; -#ifdef UNICODE - comPortList.push_back(portname); -#else - comPortList.push_back(szPort); -#endif - } - // Prepare for the next time around - dwValueNameSize = dwMaxValueNameSizeInChars; - dwDataSize = dwMaxValueDataSizeInBytes; - memset(szValueName, 0, dwMaxValueNameSizeInBytes); - memset(byValue, 0, dwMaxValueDataSizeInBytes); - ++dwIndex; - nEnum = RegEnumValue(hSERIALCOMM, dwIndex, szValueName, &dwValueNameSize, NULL, &dwType, (LPBYTE)byValue, &dwDataSize); - } - } - delete szValueName; - delete byValue; - } - // Close the registry key now that we are finished with it - RegCloseKey(hSERIALCOMM); - - if (dwQueryInfo != ERROR_SUCCESS) - SetLastError(dwQueryInfo); - } -#else - char tempBuffer[256]; - string result = ""; -#warning Currently searching only for ACM connections - system( "ls /dev | grep ttyACM > /tmp/foundSerialPorts.txt"); - - fstream fin; - fin.open("/tmp/foundSerialPorts.txt", ios::in); - while(!fin.eof()) - { - fin.getline(tempBuffer, 256); - result = "/dev/"; - result.append(tempBuffer); - if( strlen(tempBuffer) > 3 ) //longer than tty - comPortList.push_back(result); - } - fin.close(); -#endif -} - -/** @brief Opens COM port - @param comName COM port name - @param baudrate COM port baudrate - @return 0 on success -*/ -IConnection::DeviceStatus ConnectionCOM::Open(const char *comName, int baudrate) -{ - Close(); - if (strlen(comName) == 0) - return FAILURE; - - DeviceStatus errorCode = SUCCESS; - -#ifndef __unix__ - // Initialize Overlap structures - m_osROverlap.Internal = 0; - m_osROverlap.InternalHigh = 0; - m_osROverlap.Offset = 0; - m_osROverlap.OffsetHigh = 0; - m_osROverlap.hEvent = CreateEvent(NULL, false, false, NULL); - - m_osWOverlap.Internal = 0; - m_osWOverlap.InternalHigh = 0; - m_osWOverlap.Offset = 0; - m_osWOverlap.OffsetHigh = 0; - m_osWOverlap.hEvent = CreateEvent(NULL, false, false, NULL); - - // Initialize DSB structure - memset(&m_dcbCommPort, 0, sizeof(m_dcbCommPort)); - - m_dcbCommPort.BaudRate = comBaudrate; - m_dcbCommPort.fBinary = 1; - m_dcbCommPort.fParity = 0; - m_dcbCommPort.fOutxCtsFlow = 0; - m_dcbCommPort.fOutxDsrFlow = 0; - m_dcbCommPort.fDtrControl = 0; - m_dcbCommPort.fDsrSensitivity = 0; - m_dcbCommPort.fTXContinueOnXoff = 0; - m_dcbCommPort.fOutX = 0; - m_dcbCommPort.fInX = 0; - m_dcbCommPort.fErrorChar = 0; - m_dcbCommPort.fNull = 0; - m_dcbCommPort.fRtsControl = 0; - m_dcbCommPort.fAbortOnError = 0; - m_dcbCommPort.fDummy2 = 0; - // m_dcbCommPort.wReserved = 0; - m_dcbCommPort.XonLim = 512; - m_dcbCommPort.XoffLim = 512; - m_dcbCommPort.ByteSize = 8; - m_dcbCommPort.Parity = 0; - m_dcbCommPort.StopBits = 0; - //m_dcbCommPort.StopBits = 1; - m_dcbCommPort.XonChar = 17; - m_dcbCommPort.XoffChar = 19; - m_dcbCommPort.ErrorChar = 0; - m_dcbCommPort.EofChar = 26; - m_dcbCommPort.EvtChar = 0; - m_dcbCommPort.wReserved1 = 0; - m_dcbCommPort.DCBlength = sizeof(DCB); - - // Initialize Timeout's - m_ctmoNew.ReadIntervalTimeout = 50; - m_ctmoNew.ReadTotalTimeoutMultiplier = 0; - m_ctmoNew.ReadTotalTimeoutConstant = 100; // 1; - m_ctmoNew.WriteTotalTimeoutMultiplier = 0; - m_ctmoNew.WriteTotalTimeoutConstant = 100; - - // Open COM port - string stmp; - stmp = "\\\\.\\"; - stmp.append(comName); - hComm = CreateFileA(stmp.c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); - - if (hComm != INVALID_HANDLE_VALUE) - { - // Set Events - if (!SetCommMask(hComm, 0)) - errorCode = FAILURE; - - // Set Timeouts - GetCommTimeouts(hComm, &m_ctmoOld); - if (!SetCommTimeouts(hComm, &m_ctmoNew)) - errorCode = FAILURE; - - // Set DCB - if (!SetCommState(hComm, &m_dcbCommPort)) - errorCode = FAILURE; - } - else - { - errorCode = FAILURE; - }; - - // Check the results - if (errorCode != 0) - { - //unsigned long err = GetLastError(); - CloseHandle(hComm); - hComm = INVALID_HANDLE_VALUE; - return errorCode; - } - else - { - PurgeComm(hComm, PURGE_TXCLEAR | PURGE_RXCLEAR); - return SUCCESS; - } -#else - hComm = open(comName, O_RDWR | O_NOCTTY | O_SYNC); - if(hComm < 0) - { -// printf("%s",strerror(errno)); -// MessageLog::getInstance()->write("Connection manager: failed opening COM port\n", LOG_ERROR); - return FAILURE; - } - - struct termios tty; - memset(&tty, 0, sizeof(tty)); - if( tcgetattr(hComm, &tty) != 0) - { -// MessageLog::getInstance()->write("Connection Manager: error from tcgetattr\n", LOG_ERROR); - return FAILURE; - } - int speed = B9600; - cfsetospeed(&tty, speed); - cfsetispeed(&tty, speed); - - tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; - tty.c_iflag &= ~IGNBRK; - tty.c_lflag = 0; - tty.c_oflag = 0; - tty.c_cc[VMIN] = 0; // read non blocking - tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout - - tty.c_iflag &= ~(IXON | IXOFF | IXANY); - tty.c_cflag |= (CLOCAL | CREAD); - - if(tcsetattr(hComm, TCSANOW, &tty) != 0) - { -// MessageLog::getInstance()->write("Connection manager: error from tcsetattr\n", LOG_ERROR); - return FAILURE; - } -#endif - return SUCCESS; -} - -/** @brief Checks if chip is connected to currently open port - @return chip is connected -*/ -bool ConnectionCOM::TestConnectivity() -{ -//currently set to always return true to show all com ports - return true; -#ifndef __unix__ - if (hComm != INVALID_HANDLE_VALUE) -#else - if( hComm >= 0) -#endif - { -// unsigned char out[64]; -// unsigned char in[64]; -// memset(in, 0, 64); -// out[0] = CMD_GET_INFO; -// SendData(out, 64); -// ReadData(in, 64); -// if(in[0] == CMD_GET_INFO && in[1] == 0x01) -// return true; -// else -// return false; - } - return false; -} - -/** @brief Finds all chips connected to com ports - @return number of devices found -*/ -int ConnectionCOM::RefreshDeviceList() -{ - int wasOpen = -1; - string wasOpenName = ""; - if(IsOpen()) - { - wasOpen = GetOpenedIndex(); - wasOpenName = comPortName; - } - Close(); - comPortList.clear(); - if(comPortList.size() == 0) - FindAllComPorts(); - - m_deviceNames.clear(); - string comName; - for(unsigned int i=0; i<comPortList.size(); i++) - { - comName = comPortList[i]; -#ifndef __unix__ - if( Open(comName.c_str(), comBaudrate) == SUCCESS) - { - if( TestConnectivity() ) //if responds add it to device list - m_deviceNames.push_back(comName); - } - Close(); -#else - m_deviceNames.push_back(comName); -#endif - } - if(wasOpen != -1) - { - for(unsigned i=0; i<m_deviceNames.size(); ++i) - if(m_deviceNames[i] == wasOpenName) - { - Open(i); - break; - } - } - return m_deviceNames.size(); -} - -/** @brief Returns found devices names - @return vector of device names -*/ -vector<string> ConnectionCOM::GetDeviceNames() -{ - return m_deviceNames; -} - -/** @brief Purges communication buffers -*/ -void ConnectionCOM::ClearComm() -{ -#ifndef __unix__ - PurgeComm(hComm, PURGE_TXCLEAR|PURGE_RXCLEAR); -#endif -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionCOM.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionCOM.h deleted file mode 100644 index 0549472db1b9efb7312d75f906b3c7614e1455a7..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionCOM.h +++ /dev/null @@ -1,62 +0,0 @@ -/** -@file ConnectionCOM.h -@author Lime Microsystems (www.limemicro.com) -@brief Class for data communications through COM port -*/ - -#ifndef CONNECTION_COM_PORT_H -#define CONNECTION_COM_PORT_H - -#ifndef __unix__ - #include "windows.h" -#endif - -#include "IConnection.h" - -class ConnectionCOM : public IConnection -{ -public: - static const int COM_BUFFER_LENGTH = 1024; //max buffer size for data - - ConnectionCOM(); - ~ConnectionCOM(); - - DeviceStatus Open(); - DeviceStatus Open(unsigned i); - void Close(); - bool IsOpen(); - int GetOpenedIndex(); - - int Write(const unsigned char *buffer, int length, int timeout_ms = 0); - int Read(unsigned char *buffer, int length, int timeout_ms = 0); - - std::vector<std::string> GetDeviceNames(); - int RefreshDeviceList(); - void ClearComm(); -private: - void FindAllComPorts(); - DeviceStatus Open(const char *comName, int baudrate); - - bool TestConnectivity(); - - std::string comPortName; - int comBaudrate; - bool connected; - - int currentDeviceIndex; - std::vector<std::string> comPortList; - std::vector<std::string> m_deviceNames; - -#ifndef __unix__ - HANDLE hComm; - COMMTIMEOUTS m_ctmoNew; - COMMTIMEOUTS m_ctmoOld; - OVERLAPPED m_osROverlap; - OVERLAPPED m_osWOverlap; - DCB m_dcbCommPort; -#else - int hComm; //com port file descriptor -#endif - -}; -#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionManager.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionManager.cpp deleted file mode 100644 index 36f73da5d75af7f5ff15ceb64b6164fdcd5a8a1d..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionManager.cpp +++ /dev/null @@ -1,314 +0,0 @@ -/** - @file ConnectionManager.cpp - @author Lime Microsystems (www.limemicro.com) - @brief Implementation of various connection types to devices -*/ - -#include "ConnectionManager.h" -#include "ConnectionCOM.h" - -#ifdef ENABLE_USB_CONNECTION - #include "ConnectionUSB.h" -#endif -#ifdef ENABLE_SPI_CONNECTION - #include "ConnectionSPI.h" -#endif - -#include <sstream> -#include <iomanip> -#include <iostream> - -/** @brief Creates connection interfaces -*/ -ConnectionManager::ConnectionManager() : activeControlPort(NULL) -{ - mLogData = false; - mOpenedDevice = -1; - m_connections[IConnection::COM_PORT] = new ConnectionCOM(); -#ifdef ENABLE_USB_CONNECTION - m_connections[IConnection::USB_PORT] = new ConnectionUSB(); -#endif -#ifdef ENABLE_SPI_CONNECTION - m_connections[IConnection::SPI_PORT] = new ConnectionSPI(); -#endif -} - -/** @brief Destroys connection interfaces -*/ -ConnectionManager::~ConnectionManager() -{ - for (auto iter = m_connections.begin(); iter != m_connections.end(); ++iter) - { - delete iter->second; - } -} - -/** @brief Checks if connection to device is opened - @return True if device is connected -*/ -bool ConnectionManager::IsOpen() -{ - return activeControlPort ? activeControlPort->IsOpen() : false; -} - -/** @brief Opens connection to first available device - @return True if connected to device -*/ -bool ConnectionManager::Open() -{ - return Open(0); -} - -/** @brief Connects to selected device - @param i device index from device list - @return 1:Success, 0:failure -*/ -int ConnectionManager::Open(unsigned i) -{ - if(i >= mDevices.size()) - return 0; - - if(activeControlPort) - activeControlPort->Close(); - switch(mDevices[i].port) - { - case IConnection::COM_PORT: - activeControlPort = m_connections[IConnection::COM_PORT]; - break; - case IConnection::USB_PORT: - activeControlPort = m_connections[IConnection::USB_PORT]; - break; - case IConnection::SPI_PORT: - activeControlPort = m_connections[IConnection::SPI_PORT]; - break; - default: - return 0; - } - mOpenedDevice = -1; - if( i < mDevices.size() ) - { - if( activeControlPort->Open(mDevices[i].portIndex) ) - { - mOpenedDevice = i; - return 1; - } - } - return 0; -} - -/** @brief Closes connection to device -*/ -void ConnectionManager::Close() -{ - if(activeControlPort) - { - activeControlPort->Close(); - //Notify(LMS_Message(MSG_BOARD_DISCONNECTED, "", 0, 0)); - } - mOpenedDevice = -1; -} - -/** @brief Finds all currently connected devices and forms device list - @return number of devices found -*/ -int ConnectionManager::RefreshDeviceList() -{ - mDeviceList.clear(); - mDevices.clear(); - DeviceInfo dev; - for (auto iter = m_connections.begin(); iter != m_connections.end(); ++iter) - { - vector<string> names; - IConnection *port = iter->second; - if(port->RefreshDeviceList() > 0) - { - names = port->GetDeviceNames(); - for(unsigned i=0; i<names.size(); ++i) - { - dev.name = names[i]; - dev.port = iter->first; - dev.portIndex = i; - mDevices.push_back(dev); - } - } - } - for(unsigned i=0; i<mDevices.size(); ++i) - mDeviceList.push_back(mDevices[i].name); - return mDevices.size(); -} - -/** @brief Returns currently opened connection index -*/ -int ConnectionManager::GetOpenedIndex() -{ - return mOpenedDevice; -} - -/** @brief Writes given data to currently opened connection - @param buffer outcomming data buffer - @param length bytes to write - @param timeout_ms timeout in milliseconds - @return number of bytes written, on failure negative values -*/ -int ConnectionManager::Write(const unsigned char *buffer, const int length, int timeout_ms) -{ - if(activeControlPort) - { - int bytesTransferred = activeControlPort->Write(buffer, length, timeout_ms); -#ifndef NDEBUG - if(mLogData) - { - stringstream ss; - ss << "WR(" << (bytesTransferred>=0?bytesTransferred: 0) << "): "; - ss << std::hex << std::setfill('0'); - int repeatedZeros = 0; - for(int i=length-1; i>=0; --i) - if(buffer[i] == 0) - ++repeatedZeros; - else break; - if(repeatedZeros == 1) - repeatedZeros = 0; - repeatedZeros = repeatedZeros - (repeatedZeros & 0x1); - for(int i=0; i<length-repeatedZeros; ++i) - //casting to short to print as numbers - ss << " " << std::setw(2) << (unsigned short)buffer[i]; - if(repeatedZeros > 1) - ss << " (00 x " << std::dec << repeatedZeros << " times)"; - cout << ss.str() << endl; - } -#endif - return bytesTransferred; - } - return -1; -} - -/** @brief Receives data from currently opened connection - @param buffer incomming data buffer, must be big enough for length bytes - @param length bytes to read - @param timeout_ms timeout in milliseconds - @return number of bytes received -*/ -int ConnectionManager::Read(unsigned char *buffer, int length, int timeout_ms) -{ - if(activeControlPort) - { - int bytesTransferred = activeControlPort->Read(buffer, length, timeout_ms); -#ifndef NDEBUG - if(mLogData) - { - stringstream ss; - ss << "RD(" << (bytesTransferred>=0?bytesTransferred: 0) << "): "; - ss << std::hex << std::setfill('0'); - int repeatedZeros = 0; - for(int i=length-1; i>=0; --i) - if(buffer[i] == 0) - ++repeatedZeros; - else break; - if(repeatedZeros == 2) - repeatedZeros = 0; - repeatedZeros = repeatedZeros - (repeatedZeros & 0x1); - for(int i=0; i<length-repeatedZeros; ++i) - //casting to short to print as numbers - ss << " " << std::setw(2) << (unsigned short)buffer[i]; - if(repeatedZeros > 2) - ss << " (00 x " << std::dec << repeatedZeros << " times)"; - cout << ss.str() << endl; - } -#endif - return bytesTransferred; - } - return -1; -} - -int ConnectionManager::WriteStream(const char *buffer, int length) -{ - return 0; -} - -int ConnectionManager::ReadStream(char *buffer, int length, unsigned int timeout_ms) -{ - /*int handle = activeControlPort->BeginDataReading(buffer, length); - activeControlPort->WaitForReading(handle, timeout_ms); - long received = length; - activeControlPort->FinishDataReading(buffer, received, handle); - return received; - */ - long len = length; - int status = activeControlPort->ReadDataBlocking(buffer, len, 0); - return len; -} - - -int ConnectionManager::BeginDataReading(char *buffer, long length) -{ - return activeControlPort->BeginDataReading(buffer, length); -} -/** -@brief Blocks until data is received or set number of milliseconds have passed. -@param contextHandle handle returned by BeginDataReading() -@param timeout_ms number of milliseconds to wait -@return 1-data received, 0-data not received -*/ -int ConnectionManager::WaitForReading(int contextHandle, unsigned int timeout_ms) -{ - return activeControlPort->WaitForReading(contextHandle, timeout_ms); -} -/** -@brief Finished asynchronous data reading. -@param buffer where to put received data -@param length number of bytes to read, will be changed to actual number of bytes received -@param contextHandle context handle returned by BeginDataReading() -@return received data length -*/ -int ConnectionManager::FinishDataReading(char *buffer, long &length, int contextHandle) -{ - return activeControlPort->FinishDataReading(buffer, length, contextHandle); -} - -/** -@brief Aborts reading operations -*/ -void ConnectionManager::AbortReading() -{ - activeControlPort->AbortReading(); -} - -/** -@brief Start asynchronous data sending. -@param buffer data buffer to be sent -@param length number of bytes to send. -@return context handle -*/ -int ConnectionManager::BeginDataSending(const char *buffer, long length) -{ - return activeControlPort->BeginDataSending(buffer, length); -} -/** -@brief Blocks until data is sent or set number of miliseconds have passed. -@param contextHandle handle returned by BeginDataReading() -@param timeout_ms number of miliseconds to wait -@return 1-data sent, 0-data not sent -*/ -int ConnectionManager::WaitForSending(int contextHandle, unsigned int timeout_ms) -{ - return activeControlPort->WaitForSending(contextHandle, timeout_ms); -} -/** -@brief Finished asynchronous data sending. -@param buffer where to put received data -@param length number of bytes to send, will be changed to actual number of bytes sent -@param contextHandle context handle returned by BeginDataReading() -@return sent data length -*/ -int ConnectionManager::FinishDataSending(const char *buffer, long &length, int contextHandle) -{ - return activeControlPort->FinishDataSending(buffer, length, contextHandle); -} - -/** -@brief Aborts sending operations -*/ -void ConnectionManager::AbortSending() -{ - activeControlPort->AbortSending(); -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionManager.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionManager.h deleted file mode 100644 index edd01d38332ae3b730f06a4e6c623f75fee10e0a..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionManager.h +++ /dev/null @@ -1,60 +0,0 @@ -/** - @file ConnectionManager.h - @author Lime Microsystems (www.limemicro.com) - @brief Class for managing connection to devices -*/ - -#ifndef LMS_CONNECTION_MANAGER_H -#define LMS_CONNECTION_MANAGER_H - -#include "IConnection.h" -#include <map> - -class ConnectionManager -{ -public: - struct DeviceInfo - { - std::string name; - IConnection::eConnectionType port; - int portIndex; - }; - - ConnectionManager(); - ~ConnectionManager(); - bool IsOpen(); - bool Open(); - int Open(unsigned i); - void Close(); - int RefreshDeviceList(); - int GetOpenedIndex(); - std::vector<std::string> GetDeviceList(){return mDeviceList;}; - - int Write(const unsigned char *buffer, int length, int timeout_ms = 0); - int Read(unsigned char *buffer, int length, int timeout_ms = 0); - - int WriteStream(const char *buffer, int length); - int ReadStream(char *buffer, int length, unsigned int timeout_ms); - - int BeginDataReading(char *buffer, long length); - int WaitForReading(int contextHandle, unsigned int timeout_ms); - int FinishDataReading(char *buffer, long &length, int contextHandle); - void AbortReading(); - - int BeginDataSending(const char *buffer, long length); - int WaitForSending(int contextHandle, unsigned int timeout_ms); - int FinishDataSending(const char *buffer, long &length, int contextHandle); - void AbortSending(); - -protected: - bool mLogData; - /// Port used for communication. - IConnection *activeControlPort; - std::vector<DeviceInfo> mDevices; - std::vector<std::string> mDeviceList; - int mOpenedDevice; - std::map<IConnection::eConnectionType, IConnection*> m_connections; -}; - -#endif // LMS_CONNECTION_MANAGER_H - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionSPI.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionSPI.cpp deleted file mode 100644 index e490db4dab480f4105e114809e11838cbd5e339d..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionSPI.cpp +++ /dev/null @@ -1,290 +0,0 @@ -/** - @file ConnectionSPI.cpp - @author Lime Microsystems (www.limemicro.com) - @brief Implementation of communications through SPI port -*/ - -#include "ConnectionSPI.h" - -#include "string.h" -#ifdef __unix__ -#include <fstream> -#include <errno.h> -#include <unistd.h> -#include <termios.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <stdlib.h> -#include <stdio.h> -#include <sys/ioctl.h> -#include <linux/types.h> -#include <linux/spi/spidev.h> -#include <linux/i2c-dev.h> -#endif // LINUX - -#include <iostream> -#include <sstream> - -const int ConnectionSPI::cSPI_BUF_SIZE = 128; -const int ConnectionSPI::cSPI_SPEED_HZ = 2000000; - -/** @brief Tries to read EEPROM for Novena board signature - @return true if Novena board -*/ -bool IsNovenaBoard() -{ -#ifdef __unix__ - char data[8]; - int count = 6; - memset(data, 0, 8); - int addr = 0; - struct i2c_rdwr_ioctl_data session; - struct i2c_msg messages[2]; - char set_addr_buf[2]; - memset(set_addr_buf, 0, sizeof(set_addr_buf)); - memset(data, 0, count); - set_addr_buf[0] = addr>>8; - set_addr_buf[1] = addr; - messages[0].addr = 0xac>>1; - messages[0].flags = 0; - messages[0].len = sizeof(set_addr_buf); - messages[0].buf = set_addr_buf; - messages[1].addr = 0xac>>1; - messages[1].flags = I2C_M_RD; - messages[1].len = count; - messages[1].buf = data; - session.msgs = messages; - session.nmsgs = 2; - - bool isNovena = false; - - int fd = open("/dev/i2c-2", O_RDWR); - if(fd > 0) - { - if(ioctl(fd, I2C_RDWR, &session) < 0) - { - perror("Unable to communicate with i2c device"); - isNovena = false; - } - if(strcmp("Novena", data) == 0) - isNovena = true; - } - close(fd); - return isNovena; -#else - return false; -#endif -} - -/** @brief Initializes SPI port and exports needed GPIO -*/ -ConnectionSPI::ConnectionSPI() -{ - fd = -1; - m_connectionType = SPI_PORT; - std::fstream gpio; - //export SEN pin - gpio.open("/sys/class/gpio/export", ios::out); - if(gpio.good()) - { - gpio << 122; - gpio.flush(); - gpio.close(); - gpio.open("/sys/class/gpio/gpio122/direction", ios::out); - gpio << "out"; - gpio.flush(); - gpio.close(); - m_SEN.open("/sys/class/gpio/gpio122/value", ios::out); - m_SEN<< 1; - m_SEN.flush(); - cout << "GPIO122: set to 1" << endl; - } -} - -ConnectionSPI::~ConnectionSPI() -{ - Close(); - m_SEN.close(); -} - -/** @brief Opens connection to first found chip - @return 0-success -*/ -IConnection::DeviceStatus ConnectionSPI::Open() -{ - Close(); -#ifdef __unix__ - fd = open("/dev/spidev2.0", O_RDWR | O_SYNC); - if (fd < 0) - { - //MessageLog::getInstance()->write("SPI PORT: device not found\n", LOG_ERROR); - return IConnection::FAILURE; - } - int mode = SPI_MODE_0; - int ret = ioctl(fd, SPI_IOC_WR_MODE, &mode); - if (ret == -1) - printf("can't set spi mode"); - - ret = ioctl(fd, SPI_IOC_RD_MODE, &mode); - if (ret == -1) - printf("can't get spi mode"); - - /* - * bits per word - */ - int bits = 8; - ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits); - if (ret == -1) - printf("can't set bits per word"); - - ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits); - if (ret == -1) - printf("can't get bits per word"); - - /* - * max speed hz - */ - int speed = cSPI_SPEED_HZ; - ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed); - if (ret == -1) - printf("can't set max speed hz"); - - ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed); - if (ret == -1) - printf("can't get max speed hz"); - - printf("spi mode: 0x%x\n", mode); - printf("bits per word: %d\n", bits); - printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000); - return IConnection::SUCCESS; -#else - return IConnection::FAILURE; -#endif -} - -/** @brief Opens connection to selected chip - @param index chip index in device list - @return 0-success -*/ -IConnection::DeviceStatus ConnectionSPI::Open(unsigned index) -{ - return Open(); -} - -/** @brief Closes connection to chip -*/ -void ConnectionSPI::Close() -{ -#ifdef __unix__ - close(fd); - fd = -1; -#endif -} - -/** @brief Returns whether chip is connected - @return chip is connected -*/ -bool ConnectionSPI::IsOpen() -{ - return (fd >= 0); -} - -/** @brief Sends data through SPI port - @param buffer data buffer to send - @param length size of data buffer - @param timeout_ms timeout limit for operation in milliseconds - @return Number of bytes sent -*/ -int ConnectionSPI::Write(const unsigned char *buffer, int length, int timeout_ms) -{ - #ifdef __unix__ - if(fd < 0) - return 0; - m_SEN << 0; - m_SEN.flush(); - unsigned long bytesWritten = 0; - rxbuf.clear(); - int bytesReceived = 0; - char rxbytes[2]; - while(bytesWritten < length) - { - int toWrite = length-bytesWritten > cSPI_BUF_SIZE ? cSPI_BUF_SIZE : length-bytesWritten; - for(int i=0; i<toWrite; i+=2) - { - if(buffer[i] < 0x80) //reading - { - write(fd, &buffer[i+bytesWritten], 2); - bytesReceived += read(fd, rxbytes, 2); - rxbuf.push_back(rxbytes[0]); - rxbuf.push_back(rxbytes[1]); - } - else //writing - { - write(fd, &buffer[i+bytesWritten], 4); - i+=2; //data bytes have been written - } - } - bytesWritten += toWrite; - } - m_SEN << 1; - m_SEN.flush(); - return bytesWritten; -#else - return 0; -#endif -} - -/** @brief Reads data from SPI port - @param buffer pointer to data buffer for receiving - @param length number of bytes to read - @param timeout_ms timeout limit for operation in milliseconds - @return Number of bytes received -*/ -int ConnectionSPI::Read(unsigned char *buffer, int length, int timeout_ms) -{ -#ifdef __unix__ - if(fd < 0) - return 0; - //because transfer is done in full duplex, function returns data from last transfer - int tocpy = length > rxbuf.size() ? rxbuf.size() : length; - memcpy(buffer, &rxbuf[0], tocpy); - rxbuf.clear(); - return tocpy; -#else - return 0; -#endif -} - -/** @brief Finds SPI port - @return number of devices found -*/ -int ConnectionSPI::RefreshDeviceList() -{ - m_deviceNames.clear(); -#ifdef __unix__ - int spidev = open("/dev/spidev2.0", O_RDWR); - if (spidev >= 0) - { - if(IsNovenaBoard() == true) - m_deviceNames.push_back("SPI (Novena)"); - else - m_deviceNames.push_back("SPI"); - } - close(spidev); -#endif - return m_deviceNames.size(); -} - -/** @brief Returns found devices names - @return vector of device names -*/ -vector<string> ConnectionSPI::GetDeviceNames() -{ - return m_deviceNames; -} - -int ConnectionSPI::GetOpenedIndex() -{ - return 0; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionSPI.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionSPI.h deleted file mode 100644 index 79d9bd9b9b690c470f156acfb1ebdd2a11e0b4ae..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionSPI.h +++ /dev/null @@ -1,41 +0,0 @@ -/** -@file ConnectionSPI.h -@author Lime Microsystems (www.limemicro.com) -@brief Class for data communications through SPI port -*/ - -#ifndef CONNECTION_SPI_PORT_H -#define CONNECTION_SPI_PORT_H - -#include "IConnection.h" -#include <fstream> -#include <string> -#include <vector> - -class ConnectionSPI : public IConnection -{ -public: - static const int cSPI_BUF_SIZE; - static const int cSPI_SPEED_HZ; - - ConnectionSPI(); - ~ConnectionSPI(); - - DeviceStatus Open(); - DeviceStatus Open(unsigned i); - void Close(); - bool IsOpen(); - int GetOpenedIndex(); - - int Write(const unsigned char *buffer, int length, int timeout_ms = 0); - int Read(unsigned char *buffer, int length, int timeout_ms = 0); - - std::vector<std::string> GetDeviceNames(); - int RefreshDeviceList(); -protected: - std::vector<std::string> m_deviceNames; - std::vector<unsigned char> rxbuf; - int fd; - std::fstream m_SEN; -}; -#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionUSB.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionUSB.cpp deleted file mode 100644 index b99fe6490bc30013bab77583e19deaa74b16c4b8..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionUSB.cpp +++ /dev/null @@ -1,762 +0,0 @@ -/** -@file ConnectionUSB.cpp -@author Lime Microsystems (www.limemicro.com) -@brief Data writing and reading through USB port -*/ - -#include "ConnectionUSB.h" -#include <string.h> - -#ifdef __unix__ - #include <thread> - #include <chrono> -#endif - -#define USB_TIMEOUT 1000 - -#define HW_LDIGIRED L"DigiRed" -#define HW_LDIGIGREEN L"DigiGreen" -#define HW_LSTREAMER L"Stream" - -#define HW_DIGIRED "DigiRed" -#define HW_DIGIGREEN "DigiGreen" -#define HW_STREAMER "Stream" - -#define CTR_W_REQCODE 0xC1 -#define CTR_W_VALUE 0x0000 -#define CTR_W_INDEX 0x0000 - -#define CTR_R_REQCODE 0xC0 -#define CTR_R_VALUE 0x0000 -#define CTR_R_INDEX 0x0000 - -/** @brief Initializes port type and object necessary to communicate to usb device. -*/ -ConnectionUSB::ConnectionUSB() -{ - m_hardwareName = ""; - isConnected = false; - m_connectionType = USB_PORT; -#ifndef __unix__ - USBDevicePrimary = new CCyUSBDevice(NULL); - OutCtrEndPt = NULL; - InCtrEndPt = NULL; - InCtrlEndPt3 = NULL; - OutCtrlEndPt3 = NULL; -#else - dev_handle = 0; - devs = 0; - int r = libusb_init(&ctx); //initialize the library for the session we just declared - if(r < 0) - printf("Init Error %i\n", r); //there was an error - libusb_set_debug(ctx, 3); //set verbosity level to 3, as suggested in the documentation -#endif - currentDeviceIndex = -1; -} - -/** @brief Closes connection to chip and deallocates used memory. -*/ -ConnectionUSB::~ConnectionUSB() -{ - Close(); -#ifndef __unix__ - delete USBDevicePrimary; -#else - libusb_exit(ctx); -#endif -} - -/** @brief Automatically open first available chip connected to usb port. - @return 0-success, other-failure -*/ -IConnection::DeviceStatus ConnectionUSB::Open() -{ - currentDeviceIndex = -1; - if(m_deviceNames.size() == 0) - RefreshDeviceList(); - -#ifndef __unix__ - for(int i=0; i<USBDevicePrimary->DeviceCount(); ++i) - if( Open(i) == SUCCESS) - { - currentDeviceIndex = i; - return SUCCESS; - } -#else - if(Open(0) == SUCCESS) - return SUCCESS; -#endif - return FAILURE; -} - -/** @brief Tries to open connected USB device and find communication endpoints. - @return Returns 1-Success, 0-EndPoints not found or device didn't connect. -*/ -IConnection::DeviceStatus ConnectionUSB::Open(unsigned index) -{ -#ifndef __unix__ - wstring m_hardwareDesc = L""; - if( index < USBDevicePrimary->DeviceCount()) - { - if(USBDevicePrimary->Open(index)) - { - m_hardwareDesc = USBDevicePrimary->Product; - unsigned int pos; - //determine connected board type - pos = m_hardwareDesc.find(HW_LDIGIRED, 0); - if( pos != wstring::npos ) - m_hardwareName = HW_DIGIRED; - else if (m_hardwareDesc.find(HW_LSTREAMER, 0) != wstring::npos) - m_hardwareName = HW_STREAMER; - else - m_hardwareName = HW_STREAMER; - - - if (InCtrlEndPt3) - { - delete InCtrlEndPt3; - InCtrlEndPt3 = NULL; - } - InCtrlEndPt3 = new CCyControlEndPoint(*USBDevicePrimary->ControlEndPt); - - if (OutCtrlEndPt3) - { - delete OutCtrlEndPt3; - OutCtrlEndPt3 = NULL; - } - OutCtrlEndPt3 = new CCyControlEndPoint(*USBDevicePrimary->ControlEndPt); - - InCtrlEndPt3->ReqCode = CTR_R_REQCODE; - InCtrlEndPt3->Value = CTR_R_VALUE; - InCtrlEndPt3->Index = CTR_R_INDEX; - - OutCtrlEndPt3->ReqCode = CTR_W_REQCODE; - OutCtrlEndPt3->Value = CTR_W_VALUE; - OutCtrlEndPt3->Index = CTR_W_INDEX; - - for (int i=0; i<USBDevicePrimary->EndPointCount(); i++) - if(USBDevicePrimary->EndPoints[i]->Address == 0x01) - { - OutEndPt = USBDevicePrimary->EndPoints[i]; - long len = OutEndPt->MaxPktSize * 64; - OutEndPt->SetXferSize(len); - break; - } - for (int i=0; i<USBDevicePrimary->EndPointCount(); i++) - if(USBDevicePrimary->EndPoints[i]->Address == 0x81) - { - InEndPt = USBDevicePrimary->EndPoints[i]; - long len = InEndPt->MaxPktSize * 64; - InEndPt->SetXferSize(len); - break; - } - isConnected = true; - return SUCCESS; - } //successfully opened device - } //if has devices - return FAILURE; -#else - if(index >= 0 && index < m_dev_pid_vid.size()) - { - dev_handle = libusb_open_device_with_vid_pid(ctx, m_dev_pid_vid[index].second, m_dev_pid_vid[index].first); - - if(dev_handle == 0) - return FAILURE; - if(libusb_kernel_driver_active(dev_handle, 0) == 1) //find out if kernel driver is attached - { - printf("Kernel Driver Active\n"); - if(libusb_detach_kernel_driver(dev_handle, 0) == 0) //detach it - printf("Kernel Driver Detached!\n"); - } - int r = libusb_claim_interface(dev_handle, 0); //claim interface 0 (the first) of device - if(r < 0) - { - printf("Cannot Claim Interface\n"); - return CANNOT_CLAIM_INTERFACE; - } - printf("Claimed Interface\n"); - isConnected = true; - return SUCCESS; - } - else - { - return FAILURE; - } -#endif -} - -/** @brief Closes communication to device. -*/ -void ConnectionUSB::Close() -{ - #ifndef __unix__ - USBDevicePrimary->Close(); - InEndPt = NULL; - OutEndPt = NULL; - if (InCtrlEndPt3) - { - delete InCtrlEndPt3; - InCtrlEndPt3 = NULL; - } - if (OutCtrlEndPt3) - { - delete OutCtrlEndPt3; - OutCtrlEndPt3 = NULL; - } - #else - if(dev_handle != 0) - { - libusb_release_interface(dev_handle, 0); - libusb_close(dev_handle); - dev_handle = 0; - } - #endif - isConnected = false; -} - -/** @brief Returns connection status - @return 1-connection open, 0-connection closed. -*/ -bool ConnectionUSB::IsOpen() -{ - #ifndef __unix__ - return USBDevicePrimary->IsOpen() && isConnected; - #else - return isConnected; - #endif -} - -/** @brief Sends given data buffer to chip through USB port. - @param buffer data buffer, must not be longer than 64 bytes. - @param length given buffer size. - @param timeout_ms timeout limit for operation in milliseconds - @return number of bytes sent. -*/ -int ConnectionUSB::Write(const unsigned char *buffer, const int length, int timeout_ms) -{ - long len = length; - if(IsOpen()) - { - unsigned char* wbuffer = new unsigned char[length]; - memcpy(wbuffer, buffer, length); - if(m_hardwareName == HW_DIGIRED || m_hardwareName == HW_STREAMER) - { - #ifndef __unix__ - if(OutCtrlEndPt3) - OutCtrlEndPt3->Write(wbuffer, len); - else - len = 0; - #else - len = libusb_control_transfer(dev_handle, LIBUSB_REQUEST_TYPE_VENDOR,CTR_W_REQCODE ,CTR_W_VALUE, CTR_W_INDEX, wbuffer, length, USB_TIMEOUT); - #endif - } - else - { - #ifndef __unix__ - if(OutCtrEndPt) - OutCtrEndPt->XferData(wbuffer, len); - else - len = 0; - #else - int actual = 0; - libusb_bulk_transfer(dev_handle, 0x01, wbuffer, len, &actual, USB_TIMEOUT); - len = actual; - #endif - } - delete wbuffer; - } - else - return 0; - return len; -} - -/** @brief Reads data coming from the chip through USB port. - @param buffer pointer to array where received data will be copied, array must be - big enough to fit received data. - @param length number of bytes to read from chip. - @param timeout_ms timeout limit for operation in milliseconds - @return number of bytes received. -*/ -int ConnectionUSB::Read(unsigned char *buffer, const int length, int timeout_ms) -{ - long len = length; - if(IsOpen()) - { - if(m_hardwareName == HW_DIGIRED || m_hardwareName == HW_STREAMER) - { - #ifndef __unix__ - if(InCtrlEndPt3) - InCtrlEndPt3->Read(buffer, len); - else - len = 0; - #else - len = libusb_control_transfer(dev_handle, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_IN ,CTR_R_REQCODE ,CTR_R_VALUE, CTR_R_INDEX, buffer, len, USB_TIMEOUT); - #endif - } - else - { - #ifndef __unix__ - if(InCtrEndPt) - InCtrEndPt->XferData(buffer, len); - else - len = 0; - #else - int actual = 0; - libusb_bulk_transfer(dev_handle, 0x81, buffer, len, &actual, USB_TIMEOUT); - len = actual; - #endif - } - } - return len; -} - -#ifdef __unix__ -/** @brief Function for handling libusb callbacks -*/ -void callback_libusbtransfer(libusb_transfer *trans) -{ - USBTransferContext *context = reinterpret_cast<USBTransferContext*>(trans->user_data); - switch(trans->status) - { - case LIBUSB_TRANSFER_CANCELLED: - printf("Transfer canceled\n" ); - context->bytesXfered = trans->actual_length; - context->done = true; - context->used = false; - context->reset(); - break; - case LIBUSB_TRANSFER_COMPLETED: - if(trans->actual_length == context->bytesExpected) - { - context->bytesXfered = trans->actual_length; - context->done = true; - } - //printf("Transfer complete %i\n", trans->actual_length); - break; - case LIBUSB_TRANSFER_ERROR: - printf("TRANSFER ERRRO\n"); - break; - case LIBUSB_TRANSFER_TIMED_OUT: - printf("transfer timed out\n"); - - break; - case LIBUSB_TRANSFER_OVERFLOW: - printf("transfer overflow\n"); - - break; - case LIBUSB_TRANSFER_STALL: - printf("transfer stalled\n"); - break; - } - context->mPacketProcessed.notify_one(); -} -#endif - -/** @brief Finds all chips connected to usb ports - @return number of devices found -*/ -int ConnectionUSB::RefreshDeviceList() -{ - #ifndef __unix__ - USBDevicePrimary->Close(); - currentDeviceIndex = -1; - m_deviceNames.clear(); - string name; - if (USBDevicePrimary->DeviceCount()) - { - for (int i=0; i<USBDevicePrimary->DeviceCount(); ++i) - { - Open(i); - name = DeviceName(); - m_deviceNames.push_back(name); - } - currentDeviceIndex = -1; - } - #else - m_dev_pid_vid.clear(); - m_deviceNames.clear(); - int usbDeviceCount = libusb_get_device_list(ctx, &devs); - if(usbDeviceCount > 0) - { - libusb_device_descriptor desc; - for(int i=0; i<usbDeviceCount; ++i) - { - int r = libusb_get_device_descriptor(devs[i], &desc); - if(r<0) - printf("failed to get device description\n"); - int pid = desc.idProduct; - int vid = desc.idVendor; - - if( vid == 1204) - { - if(pid == 34323) - { - m_hardwareName = HW_DIGIGREEN; - m_deviceNames.push_back("DigiGreen"); - m_dev_pid_vid.push_back( pair<int,int>(pid,vid)); - } - else if(pid == 241) - { - m_hardwareName = HW_DIGIRED; - libusb_device_handle *tempDev_handle; - tempDev_handle = libusb_open_device_with_vid_pid(ctx, vid, pid); - if(libusb_kernel_driver_active(tempDev_handle, 0) == 1) //find out if kernel driver is attached - { - if(libusb_detach_kernel_driver(tempDev_handle, 0) == 0) //detach it - printf("Kernel Driver Detached!\n"); - } - if(libusb_claim_interface(tempDev_handle, 0) < 0) //claim interface 0 (the first) of device - { - printf("Cannot Claim Interface\n"); - } - - string fullName; - //check operating speed - int speed = libusb_get_device_speed(devs[i]); - if(speed == LIBUSB_SPEED_HIGH) - fullName = "USB 2.0"; - else if(speed == LIBUSB_SPEED_SUPER) - fullName = "USB 3.0"; - else - fullName = "USB"; - fullName += " ("; - //read device name - char data[255]; - memset(data, 0, 255); - int st = libusb_get_string_descriptor_ascii(tempDev_handle, 2, (unsigned char*)data, 255); - if(strlen(data) > 0) - fullName += data; - fullName += ")"; - libusb_close(tempDev_handle); - - m_deviceNames.push_back(fullName); - m_dev_pid_vid.push_back( pair<int,int>(pid,vid)); - } - } - } - } - else - { - libusb_free_device_list(devs, 1); - return 0; - } - #endif - return m_deviceNames.size(); -} - -void ConnectionUSB::ClearComm() -{ -} - -/** @return name of currently opened device as string. -*/ -string ConnectionUSB::DeviceName() -{ -#ifndef __unix__ - string name; - char tempName[USB_STRING_MAXLEN]; - //memcpy(tempName, USBDevicePrimary->FriendlyName, USB_STRING_MAXLEN); - //name = tempName; - - for (int i = 0; i < USB_STRING_MAXLEN; ++i) - tempName[i] = USBDevicePrimary->DeviceName[i]; - if (USBDevicePrimary->bSuperSpeed == true) - name = "USB 3.0"; - else if (USBDevicePrimary->bHighSpeed == true) - name = "USB 2.0"; - else - name = "USB"; - name += " ("; - name += tempName; - name += ")"; - return name; -#else - if(dev_handle != 0) - { - char data[255]; - int st = libusb_get_string_descriptor_ascii(dev_handle, 2, (unsigned char*)data, 255); - return string(data); - } - return "no name"; -#endif -} - -/** - @brief Starts asynchronous data reading from board - @param *buffer buffer where to store received data - @param length number of bytes to read - @return handle of transfer context -*/ -int ConnectionUSB::BeginDataReading(char *buffer, long length) -{ - int i = 0; - bool contextFound = false; - //find not used context - for(i = 0; i<USB_MAX_CONTEXTS; i++) - { - if(!contexts[i].used) - { - contextFound = true; - break; - } - } - if(!contextFound) - return -1; - contexts[i].used = true; - #ifndef __unix__ - if(InEndPt) - contexts[i].context = InEndPt->BeginDataXfer((unsigned char*)buffer, length, contexts[i].inOvLap); - return i; - #else - unsigned int Timeout = 1000; - libusb_transfer *tr = contexts[i].transfer; - libusb_fill_bulk_transfer(tr, dev_handle, 0x81, (unsigned char*)buffer, length, callback_libusbtransfer, &contexts[i], Timeout); - contexts[i].done = false; - contexts[i].bytesXfered = 0; - contexts[i].bytesExpected = length; - int status = libusb_submit_transfer(tr); - int actual = 0; - //int status = libusb_bulk_transfer(dev_handle, 0x81, (unsigned char*)buffer, length, &actual, USB_TIMEOUT); - if(status != 0) - printf("ERROR BEGIN DATA TRANSFER %s\n", libusb_error_name(status)); - #endif - return i; -} - -/** - @brief Waits for asynchronous data reception - @param contextHandle handle of which context data to wait - @param timeout_ms number of miliseconds to wait - @return 1-data received, 0-data not received -*/ -int ConnectionUSB::WaitForReading(int contextHandle, unsigned int timeout_ms) -{ - if( contexts[contextHandle].used == true && contextHandle >= 0) - { - int status = 0; - #ifndef __unix__ - if(InEndPt) - status = InEndPt->WaitForXfer(contexts[contextHandle].inOvLap, timeout_ms); - return status; - #else - auto t1 = chrono::high_resolution_clock::now(); - auto t2 = chrono::high_resolution_clock::now(); - while(contexts[contextHandle].done == false && std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() < timeout_ms) - { - struct timeval tv; - tv.tv_sec = 1; - tv.tv_usec = 0; - //if(libusb_handle_events(ctx) != 0) - if(libusb_handle_events_timeout_completed(ctx, &tv, NULL) != 0) - printf("error libusb_handle_events %i\n", status); - t2 = chrono::high_resolution_clock::now(); - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - std::unique_lock<std::mutex> lck(contexts[contextHandle].m_lock); - while(contexts[contextHandle].done == false) //is changed in libusb callback - { - if(contexts[contextHandle].mPacketProcessed.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) - return 0; - } - return contexts[contextHandle].done == true; - #endif - } - else - return 0; -} - -/** - @brief Finishes asynchronous data reading from board - @param buffer array where to store received data - @param length number of bytes to read, function changes this value to number of bytes actually received - @param contextHandle handle of which context to finish - @return false failure, true number of bytes received -*/ -int ConnectionUSB::FinishDataReading(char *buffer, long &length, int contextHandle) -{ - if( contexts[contextHandle].used == true && contextHandle >= 0) - { - #ifndef __unix__ - int status = 0; - if(InEndPt) - status = InEndPt->FinishDataXfer((unsigned char*)buffer, length, contexts[contextHandle].inOvLap, contexts[contextHandle].context); - contexts[contextHandle].used = false; - contexts[contextHandle].reset(); - return length; - #else - length = contexts[contextHandle].bytesXfered; - contexts[contextHandle].used = false; - contexts[contextHandle].reset(); - return length; - #endif - } - else - return 0; -} - -int ConnectionUSB::ReadDataBlocking(char *buffer, long &length, int timeout_ms) -{ -#ifndef __unix__ - return InEndPt->XferData((unsigned char*)buffer, length); -#else - return 0; -#endif -} - - -/** - @brief Aborts reading operations -*/ -void ConnectionUSB::AbortReading() -{ -#ifndef __unix__ - InEndPt->Abort(); -#else - for(int i=0; i<USB_MAX_CONTEXTS; ++i) - { - libusb_cancel_transfer( contexts[i].transfer ); - } -#endif -} - -/** - @brief Starts asynchronous data Sending to board - @param *buffer buffer to send - @param length number of bytes to send - @return handle of transfer context -*/ -int ConnectionUSB::BeginDataSending(const char *buffer, long length) -{ - int i = 0; - //find not used context - bool contextFound = false; - for(i = 0; i<USB_MAX_CONTEXTS; i++) - { - if(!contextsToSend[i].used) - { - contextFound = true; - break; - } - } - if(!contextFound) - return -1; - contextsToSend[i].used = true; - #ifndef __unix__ - if(OutEndPt) - contextsToSend[i].context = OutEndPt->BeginDataXfer((unsigned char*)buffer, length, contextsToSend[i].inOvLap); - return i; - #else - unsigned int Timeout = 1000; - libusb_transfer *tr = contextsToSend[i].transfer; - //libusb_set_iso_packet_lengths(contexts[i].transfer, 512*64); - libusb_fill_bulk_transfer(tr, dev_handle, 0x1, (unsigned char*)buffer, length, callback_libusbtransfer, &contextsToSend[i], Timeout); - contextsToSend[i].done = false; - contextsToSend[i].bytesXfered = 0; - contextsToSend[i].bytesExpected = length; - libusb_submit_transfer(tr); - #endif - return i; -} - -/** - @brief Waits for asynchronous data sending - @param contextHandle handle of which context data to wait - @param timeout_ms number of miliseconds to wait - @return 1-data received, 0-data not received -*/ -int ConnectionUSB::WaitForSending(int contextHandle, unsigned int timeout_ms) -{ - if( contextsToSend[contextHandle].used == true ) - { - #ifndef __unix__ - int status = 0; - if(OutEndPt) - status = OutEndPt->WaitForXfer(contextsToSend[contextHandle].inOvLap, timeout_ms); - return status; - #else - auto t1 = chrono::high_resolution_clock::now(); - auto t2 = chrono::high_resolution_clock::now(); - while(contextsToSend[contextHandle].done == false && std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() < timeout_ms) - { - struct timeval tv; - tv.tv_sec = 1; - tv.tv_usec = 0; - int status = libusb_handle_events_timeout_completed(ctx, &tv, NULL); - if(status != 0) - printf("error libusb_handle_events %i\n", status); - t2 = chrono::high_resolution_clock::now(); - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - std::unique_lock<std::mutex> lck(contextsToSend[contextHandle].m_lock); - while(contextsToSend[contextHandle].done == false) //is changed in libusb callback - { - if(contextsToSend[contextHandle].mPacketProcessed.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) - return 0; - } - return contextsToSend[contextHandle].done == true; - #endif - } - else - return 0; -} - -/** - @brief Finishes asynchronous data sending to board - @param buffer array where to store received data - @param length number of bytes to read, function changes this value to number of bytes acctually received - @param contextHandle handle of which context to finish - @return false failure, true number of bytes sent -*/ -int ConnectionUSB::FinishDataSending(const char *buffer, long &length, int contextHandle) -{ - if( contextsToSend[contextHandle].used == true) - { - #ifndef __unix__ - if(OutEndPt) - OutEndPt->FinishDataXfer((unsigned char*)buffer, length, contextsToSend[contextHandle].inOvLap, contextsToSend[contextHandle].context); - contextsToSend[contextHandle].used = false; - contextsToSend[contextHandle].reset(); - return length; - #else - length = contextsToSend[contextHandle].bytesXfered; - contextsToSend[contextHandle].used = false; - contextsToSend[contextHandle].reset(); - return length; - #endif - } - else - return 0; -} - -/** - @brief Aborts sending operations -*/ -void ConnectionUSB::AbortSending() -{ -#ifndef __unix__ - OutEndPt->Abort(); -#else - for (int i = 0; i<USB_MAX_CONTEXTS; ++i) - { - libusb_cancel_transfer(contextsToSend[i].transfer); - } - for(int i=0; i<USB_MAX_CONTEXTS; ++i) - { - contextsToSend[i].used = false; - contextsToSend[i].reset(); - } -#endif -} - -int ConnectionUSB::GetOpenedIndex() -{ - return currentDeviceIndex; -} - -/** @brief Returns found devices names - @return vector of device names -*/ -vector<string> ConnectionUSB::GetDeviceNames() -{ - return m_deviceNames; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionUSB.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionUSB.h deleted file mode 100644 index f3048c184200e5bb5bdb875392c957ca45c75a7b..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionUSB.h +++ /dev/null @@ -1,144 +0,0 @@ -/** -@file ConnectionUSB.h -@author Lime Microsystems (www.limemicro.com) -@brief Class for data writing and reading through USB port -*/ - -#ifndef USB_PORT_CONNECTION_H -#define USB_PORT_CONNECTION_H - -#include "IConnection.h" - -#ifndef __unix__ -#include "windows.h" -#include "CyAPI.h" -#else -#include <libusb-1.0/libusb.h> -#include <mutex> -#include <condition_variable> -#include <chrono> -#endif - -#define USB_MAX_CONTEXTS 64 //maximum number of contexts for asynchronous transfers - -/** @brief Wrapper class for holding USB asynchronous transfers contexts -*/ -class USBTransferContext -{ -public: - USBTransferContext() : used(false) - { - #ifndef __unix__ - inOvLap = new OVERLAPPED; - memset(inOvLap, 0, sizeof(OVERLAPPED)); - inOvLap->hEvent = CreateEvent(NULL, false, false, NULL); - context = NULL; - #else - transfer = libusb_alloc_transfer(0); - bytesXfered = 0; - bytesExpected = 0; - done = 0; - #endif - } - ~USBTransferContext() - { - #ifndef __unix__ - CloseHandle(inOvLap->hEvent); - delete inOvLap; - #else - libusb_free_transfer(transfer); - #endif - } - bool reset() - { - if(used) - return false; - #ifndef __unix__ - CloseHandle(inOvLap->hEvent); - memset(inOvLap, 0, sizeof(OVERLAPPED)); - inOvLap->hEvent = CreateEvent(NULL, false, false, NULL); - #endif - return true; - } - bool used; - #ifndef __unix__ - PUCHAR context; - OVERLAPPED *inOvLap; - #else - libusb_transfer* transfer; - long bytesXfered; - long bytesExpected; - bool done; - std::mutex m_lock; - std::condition_variable mPacketProcessed; - #endif -}; - -class ConnectionUSB : public IConnection -{ -public: - ConnectionUSB(); - ~ConnectionUSB(); - - void FindDevices(); - DeviceStatus Open(); - DeviceStatus Open(unsigned index); - void Close(); - bool IsOpen(); - int GetOpenedIndex(); - - int Write(const unsigned char *buffer, int length, int timeout_ms = 0); - int Read(unsigned char *buffer, int length, int timeout_ms = 0); - - virtual int BeginDataReading(char *buffer, long length); - virtual int WaitForReading(int contextHandle, unsigned int timeout_ms); - virtual int FinishDataReading(char *buffer, long &length, int contextHandle); - virtual void AbortReading(); - virtual int ReadDataBlocking(char *buffer, long &length, int timeout_ms); - - virtual int BeginDataSending(const char *buffer, long length); - virtual int WaitForSending(int contextHandle, unsigned int timeout_ms); - virtual int FinishDataSending(const char *buffer, long &length, int contextHandle); - virtual void AbortSending(); - - std::vector<std::string> GetDeviceNames(); - int RefreshDeviceList(); - void ClearComm(); -private: - int currentDeviceIndex; - std::string DeviceName(); - - std::vector<std::string> m_deviceNames; - std::string m_hardwareName; - int m_hardwareVer; - - USBTransferContext contexts[USB_MAX_CONTEXTS]; - USBTransferContext contextsToSend[USB_MAX_CONTEXTS]; - void Initialize(); - - bool isConnected; - int currentPortIndex; - - #ifndef __unix__ - CCyUSBDevice *USBDevicePrimary; - //control endpoints for DigiRed - CCyControlEndPoint *InCtrlEndPt3; - CCyControlEndPoint *OutCtrlEndPt3; - - //control endpoints for DigiGreen - CCyUSBEndPoint *OutCtrEndPt; - CCyUSBEndPoint *InCtrEndPt; - - //end points for samples reading and writing - CCyUSBEndPoint *InEndPt; - CCyUSBEndPoint *OutEndPt; - - #else - libusb_device **devs; //pointer to pointer of device, used to retrieve a list of devices - libusb_device_handle *dev_handle; //a device handle - libusb_context *ctx; //a libusb session - std::vector<std::pair<int,int> > m_dev_pid_vid; - #endif -}; - -#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/IConnection.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/IConnection.h deleted file mode 100644 index 5804f1149f104c4d834c710eaf6f38f75bc9a6d3..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/IConnection.h +++ /dev/null @@ -1,68 +0,0 @@ -/** - @file IConnection.h - @author Lime Microsystems - @brief Interface class for connection types -*/ - -#ifndef ICONNECTION_H -#define ICONNECTION_H - -#include <string> -#include <vector> - -using namespace std; - -class IConnection -{ -public: - /// Supported connection types. - enum eConnectionType - { - CONNECTION_UNDEFINED = -1, - COM_PORT = 0, - USB_PORT = 1, - SPI_PORT = 2, - //insert new types here - CONNECTION_TYPES_COUNT //used only for memory allocation - }; - - enum DeviceStatus - { - SUCCESS, - FAILURE, - END_POINTS_NOT_FOUND, - CANNOT_CLAIM_INTERFACE - }; - - IConnection() : m_connectionType(CONNECTION_UNDEFINED){}; - virtual ~IConnection(){}; - virtual int RefreshDeviceList() = 0; - virtual DeviceStatus Open(unsigned i) = 0; - virtual void Close() = 0; - virtual bool IsOpen() = 0; - virtual int GetOpenedIndex() = 0; - - virtual int Write(const unsigned char *buffer, int length, int timeout_ms = 0) = 0; - virtual int Read(unsigned char *buffer, int length, int timeout_ms = 0) = 0; - - virtual std::vector<std::string> GetDeviceNames() = 0; - - virtual eConnectionType GetType() { return m_connectionType; }; - virtual bool SetParam(const char *name, const char* value) {return false;}; - - virtual int BeginDataReading(char *buffer, long length){ return -1; }; - virtual int WaitForReading(int contextHandle, unsigned int timeout_ms){ return 0;}; - virtual int FinishDataReading(char *buffer, long &length, int contextHandle){ return 0;} - virtual void AbortReading(){}; - virtual int ReadDataBlocking(char *buffer, long &length, int timeout_ms){ return 0; } - - virtual int BeginDataSending(const char *buffer, long length){ return -1; }; - virtual int WaitForSending(int contextHandle, unsigned int timeout_ms){ return 0;}; - virtual int FinishDataSending(const char *buffer, long &length, int contextHandle){ return 0;} - virtual void AbortSending(){}; -protected: - eConnectionType m_connectionType; -}; - -#endif - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/INI.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/INI.h deleted file mode 100644 index de54b4e7b49d9b8b113aa5abf7cc2849dce4df53..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/INI.h +++ /dev/null @@ -1,639 +0,0 @@ -/* - Feather INI Parser - 1.40 - You are free to use this however you wish. - - If you find a bug, please attept to debug the cause. - Post your environment details and the cause or fix in the issues section of GitHub. - - Written by Turbine. - - Website: - https://github.com/Turbine1991/feather-ini-parser - http://code.google.com/p/feather-ini-parser/downloads - - Help: - Bundled example & readme. - http://code.google.com/p/feather-ini-parser/wiki/Tutorials -*/ - -#pragma once - -#include <string> -#include <fstream> -#include <sstream> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> - -#define FINI_SAFE -#define FINI_BUFFER_SIZE 128 - -#if __cplusplus >= 201103L - #include <unordered_map> - #define FINI_CPP11 - #define ALLOCATE_SECTIONS 100 - #define ALLOCATE_KEYS 5 -#else - #include <map> -#endif - -#ifdef FINI_WIDE_SUPPORT - #include <wchar.h> - - typedef std::wstringstream fini_sstream_t; - typedef std::wstring fini_string_t; - typedef wchar_t fini_char_t; - typedef std::wifstream fini_ifstream_t; - typedef std::wofstream fini_ofstream_t; - - #define fini_strlen(a) wcslen(a) - #define fini_strncpy(a, b) wcscpy(a, b) - #define fini_strncpy(a, b, c) wcsncpy(a, b, c) - #define fini_strtok(a, b) wcstok(a, b) - - #define _T(x) L ##x -#else - #include <cstring> - - typedef std::stringstream fini_sstream_t; - typedef std::string fini_string_t; - typedef char fini_char_t; - typedef std::ifstream fini_ifstream_t; - typedef std::ofstream fini_ofstream_t; - - #define fini_strlen(a) strlen(a) - #define fini_strcpy(a, b) strcpy(a, b) - #define fini_strncpy(a, b, c) strncpy(a, b, c) - #define fini_strtok(a, b) strtok(a, b) - - #define _T(x) x -#endif - -#define CHAR_SIZE sizeof(fini_char_t) - -///Simple converter using templates and streams to effectively required for the flexibility of handling native types -class Converters -{ -public: - template <typename T, typename U> - static T Convert(U value); - template <typename T> - static void GetLine(fini_sstream_t& out, T& value); - static void GetLine(fini_sstream_t& out, fini_string_t& value); - template <typename T> - static size_t GetDataSize(T& value); - static size_t GetDataSize(fini_string_t value); -}; - -/// -template <typename T = fini_string_t, typename U = fini_string_t, typename V = fini_string_t> - class INI -{ -public: - typedef T section_t; - typedef U key_t; - typedef V value_t; - typedef INI<section_t, key_t, value_t> ini_t; - -///Type definition declarations -#ifdef FINI_CPP11 - typedef typename std::unordered_map<key_t, value_t> keys_t; - typedef typename std::unordered_map<section_t, keys_t*> sections_t; -#else - typedef typename std::map<key_t, value_t> keys_t; - typedef typename std::map<section_t, keys_t*> sections_t; -#endif - - typedef typename keys_t::iterator keysit_t; - typedef typename sections_t::iterator sectionsit_t; - - typedef typename std::pair<key_t, value_t> keyspair_t; - typedef typename std::pair<section_t, keys_t*> sectionspair_t; - - typedef char data_t; - - enum source_e {SOURCE_FILE, SOURCE_MEMORY}; - -///Data members - std::string filename; - data_t* data; - size_t dataSize; - keys_t* current; - sections_t sections; - source_e source; - -///Constuctor/Destructor - //Specify the filename to associate and whether to parse immediately - INI(const std::string filename, bool doParse): filename(filename) - { - init(SOURCE_FILE, doParse); - } - - //Used for loading INI from memory - INI(void* data, size_t dataSize, bool doParse): data((data_t*)data), dataSize(dataSize) - { - init(SOURCE_MEMORY, doParse); - } - - ~INI() - { - clear(); - } - -///Access Content - //Provide bracket access to section contents - keys_t& operator[](section_t section) - { - #ifdef FINI_SAFE - if (!sections[section]) - sections[section] = new keys_t; - #endif - - return *sections[section]; - } - - //Create a new section and select it - bool create(const section_t section) - { - if (select(section)) - return false; - - current = new keys_t; - sections[section] = current; - - reserveKeys(current); - - return true; - } - - //Select a section for performing operations - bool select(const section_t section) - { - sectionsit_t sectionsit = sections.find(section); - if (sectionsit == sections.end()) - return false; - - current = sectionsit->second; - - return true; - } - -///Set - //Assign a value for key under the selected section - bool set(const key_t key, const value_t value) - { - if (current == NULL) - return false; - - (*current)[key] = value; - - return true; - } - - template <typename W, typename X> - bool set(const W key, const X value) - { return set(Converters::Convert<key_t>(key), Converters::Convert<value_t>(value)); } - -///Get - value_t get(const key_t key, value_t def = value_t()) - { - keysit_t it = current->find(key); - if (current == NULL || it == current->end()) - return def; - - return it->second; - } - - value_t get(const section_t section, const key_t key, value_t def) - { - if (!select(section)) - return def; - - return get(key, def); - } - - template <typename W, typename X> - X get(const W key, const X def = value_t()) - { return Converters::Convert<X>(get(Converters::Convert<key_t>(key), Converters::Convert<value_t>(def))); } - - template <typename W> - fini_string_t get(const W key, const fini_char_t* def = _T("")) //Handle C string default value without casting - { return Converters::Convert<fini_string_t>(get(Converters::Convert<key_t>(key), Converters::Convert<value_t>(def))); } - - template <typename W, typename X, typename Y> - Y get(const W section, const X key, const Y def) - { return Converters::Convert<Y>(get(Converters::Convert<section_t>(section), Converters::Convert<key_t>(key), Converters::Convert<value_t>(def))); } - - template <typename W, typename X> - fini_string_t get(const W section, const X key, const fini_char_t* def) //Handle C string default value without casting - { return Converters::Convert<fini_string_t>(Converters::Convert<section_t>(section), get(Converters::Convert<key_t>(key), Converters::Convert<value_t>(def))); } - -///Functions - void parse(std::istream& file) - { - fini_char_t line[FINI_BUFFER_SIZE]; - bool first = true; - fini_sstream_t out; - - while(!file.eof()) - { - file.getline(line, FINI_BUFFER_SIZE); - - if (first) - { - first = false; - if (line[0] == 0xEF) //Allows handling of UTF-16/32 documents - { - memmove(line, line + (CHAR_SIZE * 3), CHAR_SIZE * (FINI_BUFFER_SIZE - 3)); - return; - } - } - - nake(line); - - if (line[0]) - { - size_t len = fini_strlen(line); - if (len > 0 && !((len >= 2 && (line[0] == '/' && line[1] == '/')) || (len >= 1 && line[0] == '#'))) //Ignore comment and empty lines - { - if (line[0] == '[') //Section - { - section_t section; - size_t length = fini_strlen(line) - 2; //Without section brackets - while(isspace(line[length + 1])) //Leave out any additional new line characters, not "spaces" as the name suggests - --length; - - fini_char_t* ssection = (fini_char_t*)calloc(CHAR_SIZE, length + 1); - fini_strncpy(ssection, line + 1, length); //Count after first bracket - - current = new keys_t; - - out << ssection; - free(ssection); - Converters::GetLine(out, section); - - sections[section] = current; - } - else //Key - { - key_t key; - value_t value; - - fini_char_t* skey; - fini_char_t* svalue; - - skey = fini_strtok(line, _T("=")); - svalue = fini_strtok(NULL, _T("\n")); - - if (skey && svalue) - { - size_t index = 0; //Without section brackets - while(isspace(skey[index])) //Leave out any additional new line characters, not "spaces" as the name suggests - index++; - - if (index != 0) //Has preceeding white space - fini_strcpy(skey, skey + index); - - out << skey; - - Converters::GetLine(out, key); - - out.clear(); - out.str(fini_string_t()); - - out << svalue; - Converters::GetLine(out, value); - - if (value != value_t()) - (*current)[key] = value; - } - } - - out.clear(); - out.str(fini_string_t()); //Clear existing stream; - } - } - } - } - - //Parse an INI's contents into memory from the filename given during construction - bool parse() - { - switch(source) - { - case SOURCE_FILE: { - fini_ifstream_t file(filename.c_str()); - - if (!file.is_open()) - return false; - - parse(file); - - file.close(); - } - break; - - case SOURCE_MEMORY: { - std::stringstream sstream; - sstream.rdbuf()->pubsetbuf(data, dataSize); - - parse(sstream); - } - break; - } - - return true; - } - - bool parseBinary() - { - fini_ifstream_t file(filename.c_str(), std::ios::binary); - if (!file.is_open()) - return false; - - size_t sectionCount; - size_t keyCount; - key_t key; - value_t value; - section_t section; - - //file.read((fini_char_t*)§ionCount, sizeof(sectionCount)); - file >> sectionCount; - - for(size_t i = 0; i < sectionCount; i++) - { - if (i > 0) - file.seekg(1 + file.tellg()); - - file.read((fini_char_t*)&keyCount, sizeof(keyCount)); - file >> section; - - create(section); - - for(size_t j = 0; j < keyCount; j++) - { - file >> key; - file >> value; - set(key, value); - } - } - - file.close(); - - return true; - } - - //Clear the contents from memory - void clear() - { - clean(); - sections.clear(); - } - -///Output - //Save from memory into file - bool save(const std::string filename = "") - { - if (!hasFileAssociation(filename)) - return false; - - fini_ofstream_t file(((filename == "")? this->filename: filename).c_str(), std::ios::trunc); - if (!file.is_open()) - return false; - - //Loop through sections - for(typename INI::sectionsit_t i = sections.begin(); i != sections.end(); i++) - { - if (i->second->size() == 0) //No keys/values in section, skip to next - continue; - - //Write section - const fini_string_t temp = makeSection(i->first); - const fini_char_t* line = temp.c_str(); - file.write(line, fini_strlen(line)); - - for(typename INI::keysit_t j = i->second->begin(); j != i->second->end(); j++) - { - //Write key and value - const fini_string_t temp = makeKeyValue(j->first, j->second); - const fini_char_t* line = temp.c_str(); - file.write(line, fini_strlen(line)); - } - } - - file.close(); - - return true; - } - - //Saves it without any conventional INI formatting characters, however it only uses string streams - bool saveBinary(const std::string filename = "") - { - if (!hasFileAssociation(filename)) - return false; - - fini_ofstream_t file(((filename == "")? this->filename: filename).c_str(), std::ios::trunc | std::ios::binary); - if (!file.is_open()) - return false; - - size_t sectionCount = sections.size(); - size_t keyCount; - - file.write((fini_char_t*)§ionCount, sizeof(sectionCount)); - - //Loop through sections - for(typename INI::sectionsit_t i = sections.begin(); i != sections.end(); i++) - { - keyCount = i->second->size(); - file.write((fini_char_t*)&keyCount, sizeof(keyCount)); - - file << i->first << std::endl; - - for(typename INI::keysit_t j = i->second->begin(); j != i->second->end(); j++) - { - file << j->first << std::endl; - file << j->second << std::endl; - } - } - - file.close(); - - return true; - } - - //Saves it as a true binary file, intended to replace the existing one. Don't bother using it with all strings. - bool saveBinaryExperimental(std::string filename = "") - { - if (!hasFileAssociation(filename)) - return false; - - fini_ofstream_t file(((filename == "")? this->filename: filename).c_str(), std::ios::trunc | std::ios::binary); - if (!file.is_open()) - return false; - - size_t sectionCount = sections.size(); - size_t keyCount; - - file.write((fini_char_t*)§ionCount, sizeof(sectionCount)); - - //Loop through sections - for(typename INI::sectionsit_t i = sections.begin(); i != sections.end(); i++) - { - keyCount = i->second->size(); - file.write((fini_char_t*)&keyCount, sizeof(keyCount)); - - file.write((fini_char_t*)&i->first, Converters::GetDataSize(i->first)); - - for(typename INI::keysit_t j = i->second->begin(); j != i->second->end(); j++) - { - file.write((fini_char_t*)&j->first, Converters::GetDataSize(j->first)); - file.write((fini_char_t*)&j->second, Converters::GetDataSize(j->second)); - } - } - - file.close(); - - return true; - } - - //Alows another INI's contents to be insert into another, with the ability to retain the original values - void merge(ini_t& other, bool retainValues = true) - { - for(typename INI::sectionsit_t i = other.sections.begin(); i != other.sections.end(); i++) - { - if (!select(i->first)) //Create and insert all key values into a missing section - { - keys_t* keys = new keys_t(*i->second); - sections.insert(std::make_pair(i->first, keys)); - } - else - { - for(typename INI::keysit_t j = i->second->begin(); j != i->second->end(); j++) - { - keysit_t it = current->find(j->first); - if (it == current->end()) - current->insert(std::make_pair(j->first, j->second)); - else if (!retainValues) - it->second = j->second; - } - } - } - } - -private: -///Functions - //Init the INI in with values set by constructor - void init(source_e source, bool doParse) - { - this->source = source; - - reserveSections(); - if (doParse) - parse(); - } - - //Clean the contents for descruction - void clean() - { - for(sectionsit_t i = sections.begin(); i != sections.end(); i++) - delete i->second; - - current = NULL; - } - - //Make any alterations to the raw line - void nake(const fini_char_t*) //Strip the line of any non-interpretable characters - { - - } - - void reserveSections() - { - #ifdef FINI_CPP11 - sections.reserve(ALLOCATE_SECTIONS); - #endif - } - - void reserveKeys(keys_t* current) - { - #ifdef FINI_CPP11 - current->reserve(ALLOCATE_KEYS); - #endif - } - - bool hasFileAssociation(std::string filename) - { - if (source == SOURCE_MEMORY && filename == "") //No association to a file - return false; - - return true; - } - -///Output - //Creates a section as a string - fini_string_t makeSection(const section_t& section) - { - fini_sstream_t line; - line << '[' << section << ']' << std::endl; - - return line.str(); - } - - //Creates a key and a value as a string - fini_string_t makeKeyValue(const key_t& key, const value_t& value) - { - fini_sstream_t line; - line << key << '=' << value << std::endl; - - return line.str(); - } -}; - -///Definitions -template <typename T, typename U> - inline T Converters::Convert(U value) -{ - fini_sstream_t sout; - T result; - - sout << value; - sout >> result; - - sout.str(fini_string_t()); - - return result; -} - -template <> - inline fini_string_t Converters::Convert<fini_string_t, fini_string_t>(fini_string_t value) -{ - return value; -} - -template <> - inline fini_string_t Converters::Convert<fini_string_t>(const fini_char_t* value) -{ - return value; -} - -template <typename T> - inline void Converters::GetLine(fini_sstream_t& out, T& value) -{ - out >> value; -} - -inline void Converters::GetLine(fini_sstream_t& out, fini_string_t& value) -{ - std::getline(out, value); -} - -template <typename T> - inline size_t Converters::GetDataSize(T& value) -{ - return sizeof(value); -} - -inline size_t Converters::GetDataSize(fini_string_t value) -{ - return value.size() + 1; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/LICENSE b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/LICENSE deleted file mode 100644 index 7d961cc6e56bcf624d2b15806266311da47fe28a..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Turbine1991 - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/README.md b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/README.md deleted file mode 100644 index f1245971cd05a49f7c070347e304c444b003d480..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/README.md +++ /dev/null @@ -1,47 +0,0 @@ -feather-ini-parser -================== - -Simple like your girlfriend, fast, lightweight, header, portable INI parser for ANSI C++. - -Why use feather-ini-parser? It's a fast, intuitive, uses C++, supports native data types, wide char support (enable), converting to data types simply by setting a default value or providing the type as a template parameter. - -##Methods - -Statement | Return Type -------------- | ------------- -ini(filename, doParse)|constructor -ini(data, dataSize, doParse)|constructor -ini.parse()|bool -ini.merge(other INI, retainValues)|void -ini.create(section)|bool -ini.select(section)|bool -ini.set(key, value)|bool -ini.get(key, dvalue = value_t())|dvalue_t -ini.save(filename = "")|bool -ini.clear()|bool -ini[section][key]|value_t& -ini[section]|keys_t& - -##Example -``` -#include <iostream> -#include "INI.h" - -using namespace std; -``` -... -``` -typedef INI<> ini_t; -//or -//typedef INI<section_t, key_t, value_t> ini_t; - -ini_t ini("filename.ini", true); -ini.create("section1"); //Create and select section1 -ini.set("key", "value"); -cout << ini.get("keynumeric", -1) << endl; -ini["section2"]["key"] = "value"; -ini.save(); -``` - -##More -Please see the example .cpp file and Code::Blocks .cbp project for a compilable GCC and VSC++ example. Additionally includes enabling wide char support and iterating through contents. diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/example.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/example.cpp deleted file mode 100644 index 462dd241dcd3525320d3d01001ea9ac209afccee..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/example.cpp +++ /dev/null @@ -1,130 +0,0 @@ -#include <iostream> -#include <cstring> -#include <stdint.h> -#include "../INI.h" - -using namespace std; - -void centerString(string str); //Printing to console -std::string getStringFromFile(const std::string& path); //Source for data loading from memory. - -int main() -{ - ///Declare - typedef INI<> ini_t; //Makes things shorter/easier to write <Section, Key, Value> - //or - //typedef INI<string, string, string> ini_t; //Equivelant to previous line when wide characters are disabled - ini_t ini("file.ini", true); //File to open/default save filename. The constuctor is set to parse by default, unless specified as false - - ///Manipulate and access contents - centerString("########## Access & Manipulate Contents ##########"); - - //Common usage - ini.create("Section 1"); - ini.create("Section 2"); - ini.get("Key1", "DefaultValue"); - ini.select("Section 1"); - ini.set("Key2", "Value"); - ini.save(); //Save contents to file, optional filename parameter available - ini.clear(); //Clear INI contents from memory - - //Extended usage - ini["Section Name"]["Key"] = "Value"; //You are not required to create a section first - - ini.create("Section1"); //Also selects as current section - ini.create("Section2"); //Current - - ini.set("Key1", "Value1"); //Added pair under section "Section2" - - ini.select("Section1"); //Current - cout << ini.get("Key1", "-1") << endl; //Returns "-1" as no key exists, no default will return NULL for data type, eg int() is 0 - - ini.select("Section2"); - ini.set("Key1", "1.123"); - cout << ini.get("Key1", -1.0) << endl; //Return value as double - ini.set(123, 123); //Will convert to provided INI data type for key/value, in this case string for both - - ini.save(); - ini.clear(); - ini.parse(); //Parses file into objects in memory - - cout << ini["Section2"]["Key1"] << endl; //Returns "Value1", slightly more overhead involved seeking section, avoid using excessively - - ///Iterate through sections and keys for both C++11 and C++98 - centerString("########## Iterate Contents ##########"); - -#ifdef FINI_CPP11 - for(auto i: ini.sections) - { - cout << "[" << i.first << "]" << endl; - - //for(auto j = i.second->begin(); j != i.second->end(); j++) - for(auto j: *i.second) - { - cout << " " << j.first << "=" << j.second << endl; - } - } -#else - for(ini_t::sectionsit_t i = ini.sections.begin(); i != ini.sections.end(); i++) - { - //Section name as ini_t::section_t - cout << i->first << endl; - - if (i->second->size() == 0) //No keys/values in section, skip to next - continue; - - for(ini_t::keysit_t j = i->second->begin(); j != i->second->end(); j++) - { - //Name as ini_t::key_t & Value as ini_t::key_t - cout << " " << j->first << "=" << j->second << endl; - } - } -#endif - -///Example with different data types - typedef INI <unsigned char, string, float> ini_int_t; //Makes things shorter/easier to write <Section, Key, Value> - ini_int_t ini_int("file_ints.ini", false); //File to open/default save filename. The constuctor is set to parse by default, unless specified as false - for(int i = 1; i <= 200; i++) - { - ini_int.create(i); //Section - ini_int.set("Key", i / 2.f); - } - - ini_int.save(); - -///Wide char support example (please define FINI_WIDE_SUPPORT in project) - /* - ini_t ini_w("file.ini", true); - wcout << ini_w[L"Section2"][L"Key1"] << endl; - */ - -///Load from memory - std::string str = getStringFromFile("config/test.ini"); //Allows us to tap into a source for the purpose of this example - - ini_t ini_mem((void*)str.c_str(), str.size(), true); //This is the line which parses data from memory - -///Merge contents and keep values - ini_t inid("file.ini", true); - ini_t inis("merge.ini", true); - inid.merge(inis, true); - inid.save("merged.ini"); - - return EXIT_SUCCESS; -} - -void centerString(string str) -{ - const char* s = str.c_str(); - int l = strlen(s); - int pos = (int)((80 - l) / 2); - for(int i = 0; i < pos; i++) - cout << " "; - cout << s << endl; -} - -std::string getStringFromFile(const std::string& path) { - std::ostringstream buf; - std::ifstream input (path.c_str()); - buf << input.rdbuf(); - return buf.str(); -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/file.ini b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/file.ini deleted file mode 100644 index e1c485ba2a657cf56d497a7aefc6e51daf0f0608..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/file.ini +++ /dev/null @@ -1,5 +0,0 @@ -[Section2] -123=123 -Key1=1.123 -[Section Name] -Key=Value diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/file_ints.ini b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/file_ints.ini deleted file mode 100644 index 3d71e76cae1ae33de74f9c0735021ea51e655b60..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/file_ints.ini +++ /dev/null @@ -1,400 +0,0 @@ -[200] -Key=100 -[199] -Key=99.5 -[198] -Key=99 -[197] -Key=98.5 -[196] -Key=98 -[195] -Key=97.5 -[194] -Key=97 -[193] -Key=96.5 -[192] -Key=96 -[191] -Key=95.5 -[190] -Key=95 -[189] -Key=94.5 -[188] -Key=94 -[187] -Key=93.5 -[186] -Key=93 -[185] -Key=92.5 -[184] -Key=92 -[183] -Key=91.5 -[182] -Key=91 -[181] -Key=90.5 -[180] -Key=90 -[179] -Key=89.5 -[178] -Key=89 -[177] -Key=88.5 -[176] -Key=88 -[175] -Key=87.5 -[174] -Key=87 -[173] -Key=86.5 -[172] -Key=86 -[171] -Key=85.5 -[170] -Key=85 -[169] -Key=84.5 -[168] -Key=84 -[167] -Key=83.5 -[166] -Key=83 -[165] -Key=82.5 -[164] -Key=82 -[163] -Key=81.5 -[162] -Key=81 -[161] -Key=80.5 -[160] -Key=80 -[159] -Key=79.5 -[158] -Key=79 -[157] -Key=78.5 -[156] -Key=78 -[155] -Key=77.5 -[154] -Key=77 -[153] -Key=76.5 -[152] -Key=76 -[151] -Key=75.5 -[150] -Key=75 -[149] -Key=74.5 -[148] -Key=74 -[147] -Key=73.5 -[146] -Key=73 -[145] -Key=72.5 -[144] -Key=72 -[143] -Key=71.5 -[142] -Key=71 -[141] -Key=70.5 -[140] -Key=70 -[139] -Key=69.5 -[138] -Key=69 -[137] -Key=68.5 -[136] -Key=68 -[135] -Key=67.5 -[134] -Key=67 -[133] -Key=66.5 -[132] -Key=66 -[131] -Key=65.5 -[130] -Key=65 -[129] -Key=64.5 -[128] -Key=64 -[127] -Key=63.5 -[126] -Key=63 -[125] -Key=62.5 -[124] -Key=62 -[123] -Key=61.5 -[122] -Key=61 -[121] -Key=60.5 -[120] -Key=60 -[119] -Key=59.5 -[118] -Key=59 -[117] -Key=58.5 -[116] -Key=58 -[115] -Key=57.5 -[114] -Key=57 -[113] -Key=56.5 -[112] -Key=56 -[111] -Key=55.5 -[110] -Key=55 -[109] -Key=54.5 -[108] -Key=54 -[107] -Key=53.5 -[106] -Key=53 -[105] -Key=52.5 -[104] -Key=52 -[103] -Key=51.5 -[1] -Key=0.5 -[2] -Key=1 -[3] -Key=1.5 -[4] -Key=2 -[5] -Key=2.5 -[6] -Key=3 -[7] -Key=3.5 -[8] -Key=4 -[9] -Key=4.5 -[10] -Key=5 -[11] -Key=5.5 -[12] -Key=6 -[13] -Key=6.5 -[14] -Key=7 -[15] -Key=7.5 -[16] -Key=8 -[17] -Key=8.5 -[18] -Key=9 -[19] -Key=9.5 -[20] -Key=10 -[21] -Key=10.5 -[22] -Key=11 -[23] -Key=11.5 -[24] -Key=12 -[25] -Key=12.5 -[26] -Key=13 -[27] -Key=13.5 -[28] -Key=14 -[29] -Key=14.5 -[30] -Key=15 -[31] -Key=15.5 -[32] -Key=16 -[33] -Key=16.5 -[34] -Key=17 -[35] -Key=17.5 -[36] -Key=18 -[37] -Key=18.5 -[38] -Key=19 -[39] -Key=19.5 -[40] -Key=20 -[41] -Key=20.5 -[42] -Key=21 -[43] -Key=21.5 -[44] -Key=22 -[45] -Key=22.5 -[46] -Key=23 -[47] -Key=23.5 -[48] -Key=24 -[49] -Key=24.5 -[50] -Key=25 -[51] -Key=25.5 -[52] -Key=26 -[53] -Key=26.5 -[54] -Key=27 -[55] -Key=27.5 -[56] -Key=28 -[57] -Key=28.5 -[58] -Key=29 -[59] -Key=29.5 -[60] -Key=30 -[61] -Key=30.5 -[62] -Key=31 -[63] -Key=31.5 -[64] -Key=32 -[65] -Key=32.5 -[66] -Key=33 -[67] -Key=33.5 -[68] -Key=34 -[69] -Key=34.5 -[70] -Key=35 -[71] -Key=35.5 -[72] -Key=36 -[73] -Key=36.5 -[74] -Key=37 -[75] -Key=37.5 -[76] -Key=38 -[77] -Key=38.5 -[78] -Key=39 -[79] -Key=39.5 -[80] -Key=40 -[81] -Key=40.5 -[82] -Key=41 -[83] -Key=41.5 -[84] -Key=42 -[85] -Key=42.5 -[86] -Key=43 -[87] -Key=43.5 -[88] -Key=44 -[89] -Key=44.5 -[90] -Key=45 -[91] -Key=45.5 -[92] -Key=46 -[93] -Key=46.5 -[94] -Key=47 -[95] -Key=47.5 -[96] -Key=48 -[97] -Key=48.5 -[98] -Key=49 -[99] -Key=49.5 -[100] -Key=50 -[101] -Key=50.5 -[102] -Key=51 diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/merge.ini b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/merge.ini deleted file mode 100644 index dfdc38108414680c510f65309feed47bf3e6c4d5..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/merge.ini +++ /dev/null @@ -1,5 +0,0 @@ -[NewSection] -Key=Value -[Section2] -NewKey=Value -123=456 \ No newline at end of file diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/project.cbp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/project.cbp deleted file mode 100644 index 913928a1159426daa67f8f0b6cfaa71596d6ca1f..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/project.cbp +++ /dev/null @@ -1,57 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> -<CodeBlocks_project_file> - <FileVersion major="1" minor="6" /> - <Project> - <Option title="project" /> - <Option pch_mode="2" /> - <Option compiler="gcc" /> - <Build> - <Target title="gcc_mingw"> - <Option output="bin/gcc_mingw/example" prefix_auto="1" extension_auto="1" /> - <Option object_output="obj/gcc_mingw/" /> - <Option type="1" /> - <Option compiler="gcc" /> - <Compiler> - <Add option="-O2" /> - <Add option="-Wall" /> - <Add option="-std=c++0x" /> - </Compiler> - </Target> - <Target title="vs_2013"> - <Option output="bin/vs/example" prefix_auto="1" extension_auto="1" /> - <Option object_output="obj/vs_2013/" /> - <Option type="1" /> - <Option compiler="microsoft_visual_c_2013" /> - <Compiler> - <Add option="/EHa" /> - <Add option="/W2" /> - <Add directory="C:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/include" /> - </Compiler> - <Linker> - <Add directory="C:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/lib" /> - <Add directory="C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/Lib" /> - </Linker> - </Target> - <Target title="vs_2010"> - <Option output="bin/vs/example" prefix_auto="1" extension_auto="1" /> - <Option object_output="obj/vs_2010/" /> - <Option type="1" /> - <Option compiler="msvc10" /> - <Compiler> - <Add option="/EHa" /> - <Add option="/W2" /> - </Compiler> - <Linker> - <Add directory="C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/Lib" /> - </Linker> - </Target> - </Build> - <Unit filename="../INI.h" /> - <Unit filename="example.cpp" /> - <Extensions> - <code_completion /> - <envvars /> - <debugger /> - </Extensions> - </Project> -</CodeBlocks_project_file> diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/project.depend b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/project.depend deleted file mode 100644 index 02c743092d1328388f1f3db9b6b14c7dc2ac01bb..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/project.depend +++ /dev/null @@ -1,802 +0,0 @@ -# depslib dependency file v1.0 -1399614205 source:d:\projects\feather-ini-parser\example\example.cpp - <iostream> - <cstring> - <stdint.h> - "../INI.h" - -1399625159 d:\projects\feather-ini-parser\ini.h - <string> - <fstream> - <sstream> - <stdint.h> - <stdio.h> - <stdlib.h> - <unordered_map> - <map> - <wchar.h> - <cstring> - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\iostream - <istream> - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\istream - <ostream> - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\ostream - <ios> - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\ios - <xlocnum> - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xlocnum - <climits> - <cmath> - <cstdio> - <cstdlib> - <streambuf> - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\climits - <yvals.h> - <limits.h> - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\yvals.h - <xkeycheck.h> - <crtdefs.h> - <use_ansi.h> - <crtwrn.h> - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xkeycheck.h - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\crtdefs.h - <sal.h> - <vadefs.h> - <winapifamily.h> - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\sal.h - "codeanalysis\sourceannotations.h" - <ConcurrencySal.h> - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\codeanalysis\sourceannotations.h - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\concurrencysal.h - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\vadefs.h - <cruntime.h> - -1379495880 c:\program files (x86)\microsoft visual studio 12.0\vc\include\use_ansi.h - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\crtwrn.h - <crtdefs.h> - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\limits.h - <crtdefs.h> - -1375351090 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cmath - <yvals.h> - <math.h> - <xtgmath.h> - <math.h> - <xtgmath.h> - -1379495880 c:\program files (x86)\microsoft visual studio 12.0\vc\include\math.h - <crtdefs.h> - -1379495880 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xtgmath.h - <xtr1common> - -1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xtr1common - <yvals.h> - -1375351090 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdio - <yvals.h> - <stdio.h> - <stdio.h> - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\stdio.h - <crtdefs.h> - <swprintf.inl> - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\swprintf.inl - <vadefs.h> - -1375351090 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib - <yvals.h> - <stdlib.h> - <stdlib.h> - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\stdlib.h - <crtdefs.h> - <limits.h> - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\streambuf - <xiosbase> - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xiosbase - <xlocale> - <system_error> - <share.h> - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xlocale - <climits> - <cstring> - <stdexcept> - <typeinfo> - <xlocinfo> - <xdebug> - <xfacet> - -1375351090 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstring - <yvals.h> - <string.h> - <string.h> - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\string.h - <crtdefs.h> - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\stdexcept - <exception> - <xstring> - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\exception - <xstddef> - <eh.h> - <malloc.h> - <string.h> - -1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xstddef - <stdlib.h> - <cstddef> - <initializer_list> - <xtr1common> - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstddef - <yvals.h> - <stddef.h> - <stddef.h> - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\stddef.h - <crtdefs.h> - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\initializer_list - <cstddef> - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\eh.h - <crtdefs.h> - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\malloc.h - <crtdefs.h> - -1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xstring - <xmemory0> - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0 - <cstdlib> - <limits> - <new> - <xutility> - <xatomic0.h> - <intrin.h> - <xatomic.h> - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\limits - <ymath.h> - <cfloat> - <climits> - <cmath> - <cwchar> - <xstddef> - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\ymath.h - <yvals.h> - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cfloat - <yvals.h> - <float.h> - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\float.h - <crtdefs.h> - <crtwrn.h> - -1375351090 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cwchar - <yvals.h> - <wchar.h> - <wchar.h> - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\wchar.h - <crtdefs.h> - <swprintf.inl> - <wtime.inl> - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\wtime.inl - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\new - <exception> - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility - <climits> - <cstdlib> - <utility> - -1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\utility - <xstddef> - <iosfwd> - <type_traits> - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\iosfwd - <cstdio> - <cstring> - <cwchar> - <xstddef> - <crtdbg.h> - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\crtdbg.h - <crtdefs.h> - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\type_traits - <xstddef> - <xrefwrap> - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xrefwrap - -1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xatomic0.h - <yvals.h> - -1379495880 c:\program files (x86)\microsoft visual studio 12.0\vc\include\intrin.h - <crtdefs.h> - <setjmp.h> - <stddef.h> - <immintrin.h> - <ammintrin.h> - <mm3dnow.h> - <armintr.h> - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\setjmp.h - <crtdefs.h> - <setjmpex.h> - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\setjmpex.h - <setjmp.h> - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\immintrin.h - <wmmintrin.h> - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\wmmintrin.h - <nmmintrin.h> - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\nmmintrin.h - <smmintrin.h> - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\smmintrin.h - <tmmintrin.h> - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\tmmintrin.h - <pmmintrin.h> - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\pmmintrin.h - <emmintrin.h> - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\emmintrin.h - <xmmintrin.h> - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmmintrin.h - <mmintrin.h> - "xmm_func.h" - <malloc.h> - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\mmintrin.h - <crtdefs.h> - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\ammintrin.h - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\mm3dnow.h - <crtdefs.h> - <mmintrin.h> - <xmmintrin.h> - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\armintr.h - -1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xatomic.h - <xatomic0.h> - <stddef.h> - <stdlib.h> - <string.h> - <intrin.h> - <xutility> - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\typeinfo - <xstddef> - <string.h> - <exception> - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xlocinfo - <xlocinfo.h> - <cstdlib> - <xstddef> - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xlocinfo.h - <ctype.h> - <locale.h> - <wchar.h> - <yvals.h> - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\ctype.h - <crtdefs.h> - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\locale.h - <crtdefs.h> - -1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xdebug - <yvals.h> - <crtdbg.h> - <xmemory> - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory - <xmemory0> - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xfacet - <yvals.h> - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\system_error - <cerrno> - <cstdlib> - <stdexcept> - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cerrno - <yvals.h> - <errno.h> - <errno.h> - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\errno.h - <crtdefs.h> - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\share.h - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\stdint.h - <crtdefs.h> - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\string - <iterator> - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\iterator - <istream> - <xutility> - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\fstream - <istream> - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\sstream - <string> - -1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\unordered_map - <xhash> - <tuple> - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xhash - <cstring> - <cwchar> - <list> - <vector> - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\list - <xmemory> - <stdexcept> - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\vector - <xmemory> - <stdexcept> - -1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\tuple - <type_traits> - <xutility> - <new> - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\map - <xtree> - <tuple> - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xtree - <xmemory> - <stdexcept> - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\iostream - <istream> - -1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream - <ostream> - -1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream - <ios> - -1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\ios - <xlocnum> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xlocnum - <climits> - <cmath> - <cstdio> - <cstdlib> - <streambuf> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\climits - <yvals.h> - <limits.h> - -1258271576 c:\program files (x86)\microsoft visual studio 10.0\vc\include\yvals.h - <crtdefs.h> - <xkeycheck.h> - <crtwrn.h> - <use_ansi.h> - <crtwrn.h> - <crtwrn.h> - -1260264954 c:\program files (x86)\microsoft visual studio 10.0\vc\include\crtdefs.h - <sal.h> - <vadefs.h> - -1263987576 c:\program files (x86)\microsoft visual studio 10.0\vc\include\sal.h - "codeanalysis\sourceannotations.h" - -1263303828 c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\vadefs.h - -1251647994 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xkeycheck.h - -1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\crtwrn.h - <crtdefs.h> - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\use_ansi.h - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\limits.h - <crtdefs.h> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cmath - <yvals.h> - <math.h> - <math.h> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h - <crtdefs.h> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cstdio - <yvals.h> - <stdio.h> - <stdio.h> - -1257335008 c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdio.h - <crtdefs.h> - <swprintf.inl> - -1256197836 c:\program files (x86)\microsoft visual studio 10.0\vc\include\swprintf.inl - <vadefs.h> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cstdlib - <yvals.h> - <stdlib.h> - <stdlib.h> - -1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdlib.h - <crtdefs.h> - <limits.h> - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\streambuf - <xiosbase> - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xiosbase - <xlocale> - <system_error> - <share.h> - -1263118342 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xlocale - <climits> - <cstring> - <stdexcept> - <typeinfo> - <xlocinfo> - <xdebug> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cstring - <yvals.h> - <string.h> - <string.h> - -1260264954 c:\program files (x86)\microsoft visual studio 10.0\vc\include\string.h - <crtdefs.h> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdexcept - <exception> - <xstring> - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\exception - <xstddef> - <eh.h> - <malloc.h> - <string.h> - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xstddef - <yvals.h> - <cstddef> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cstddef - <yvals.h> - <stddef.h> - <stddef.h> - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\stddef.h - <crtdefs.h> - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\eh.h - <crtdefs.h> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\malloc.h - <crtdefs.h> - -1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xstring - <xmemory> - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xmemory - <cstdlib> - <new> - <xutility> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\new - <exception> - -1258271576 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility - <climits> - <cstdlib> - <utility> - -1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility - <xstddef> - <iosfwd> - <type_traits> - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\iosfwd - <cstdio> - <cstring> - <cwchar> - <xstddef> - <crtdbg.h> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cwchar - <yvals.h> - <wchar.h> - <wchar.h> - -1257335008 c:\program files (x86)\microsoft visual studio 10.0\vc\include\wchar.h - <crtdefs.h> - <swprintf.inl> - <wtime.inl> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\wtime.inl - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\crtdbg.h - <crtdefs.h> - -1263118342 c:\program files (x86)\microsoft visual studio 10.0\vc\include\type_traits - <limits> - <xtr1common> - <xfwrap> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\limits - <ymath.h> - <cfloat> - <climits> - <cmath> - <cwchar> - <xstddef> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\ymath.h - <yvals.h> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cfloat - <yvals.h> - <float.h> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\float.h - <crtdefs.h> - <crtwrn.h> - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xtr1common - <yvals.h> - -1263118342 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xfwrap - <xfwrap1> - <xfwrap1> - <xfwrap1> - <xfwrap1> - <xfwrap1> - <xfwrap1> - <xfwrap1> - <xfwrap1> - <xfwrap1> - <xfwrap1> - <xfwrap1> - -1263118342 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xfwrap1 - <xxbind1> - <xxcallfun> - <xxcallobj> - <xxcallpmf> - <xxfunction> - <xxmem_fn> - <xxpmfcaller> - <xxrefwrap> - <xxresult> - <xxshared> - <xxtuple0> - <xxtuple1> - <xxtype_traits> - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxbind1 - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxcallfun - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxcallobj - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxcallpmf - -1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxfunction - -1251647994 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxmem_fn - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxpmfcaller - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxrefwrap - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxresult - -1251647994 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxshared - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxtuple0 - -1251647994 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxtuple1 - -1251647994 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxtype_traits - -1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\typeinfo - <xstddef> - <string.h> - <exception> - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xlocinfo - <xlocinfo.h> - <cstdlib> - <xstddef> - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xlocinfo.h - <ctype.h> - <locale.h> - <wchar.h> - <yvals.h> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\ctype.h - <crtdefs.h> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\locale.h - <crtdefs.h> - -1263118342 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xdebug - <yvals.h> - <crtdbg.h> - <xmemory> - -1260264954 c:\program files (x86)\microsoft visual studio 10.0\vc\include\system_error - <cerrno> - <cstdlib> - <stdexcept> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cerrno - <yvals.h> - <errno.h> - <errno.h> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\errno.h - <crtdefs.h> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\share.h - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdint.h - <yvals.h> - -1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\string - <istream> - -1263118342 c:\program files (x86)\microsoft visual studio 10.0\vc\include\fstream - <istream> - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\sstream - <string> - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\unordered_map - <xhash> - -1263720180 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xhash - <cstring> - <cwchar> - <xfunctional> - <list> - <vector> - -1251647994 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xfunctional - <cstdlib> - <xstring> - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\list - <xfunctional> - <memory> - <stdexcept> - -1267607544 c:\program files (x86)\microsoft visual studio 10.0\vc\include\memory - <xmemory> - <exception> - <typeinfo> - <type_traits> - <intrin.h> - <xfwrap> - <xfwrap> - <xfwrap> - -1263118342 c:\program files (x86)\microsoft visual studio 10.0\vc\include\intrin.h - <crtdefs.h> - <setjmp.h> - <stddef.h> - <immintrin.h> - <mm3dnow.h> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\setjmp.h - <crtdefs.h> - <setjmpex.h> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\setjmpex.h - <setjmp.h> - -1251647992 c:\program files (x86)\microsoft visual studio 10.0\vc\include\immintrin.h - <wmmintrin.h> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\wmmintrin.h - <nmmintrin.h> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\nmmintrin.h - <smmintrin.h> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\smmintrin.h - <tmmintrin.h> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\tmmintrin.h - <pmmintrin.h> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\pmmintrin.h - <emmintrin.h> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\emmintrin.h - <xmmintrin.h> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xmmintrin.h - <mmintrin.h> - "xmm_func.h" - <malloc.h> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\mmintrin.h - <crtdefs.h> - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\mm3dnow.h - <crtdefs.h> - <mmintrin.h> - <xmmintrin.h> - -1258271576 c:\program files (x86)\microsoft visual studio 10.0\vc\include\vector - <memory> - <stdexcept> - <xfunctional> - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\map - <xtree> - -1258271576 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xtree - <xfunctional> - <memory> - <stdexcept> - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lms7002_defines.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lms7002_defines.h deleted file mode 100644 index 6b06a51c7eda7c8add40ccfe19f60adde64b4053..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lms7002_defines.h +++ /dev/null @@ -1,218 +0,0 @@ -/** -@file lms7002_defines.h -@author Lime Microsystems -@brief enumerations of available LMS7002M commands and statuses -*/ -#pragma once - -const int LMS_RST_DEACTIVATE = 0; -const int LMS_RST_ACTIVATE = 1; -const int LMS_RST_PULSE = 2; - -enum eLMS_DEV -{ - LMS_DEV_UNKNOWN, - LMS_DEV_EVB6, - LMS_DEV_DIGIGREEN, - LMS_DEV_DIGIRED, - LMS_DEV_EVB7, - LMS_DEV_ZIPPER, - LMS_DEV_SOCKETBOARD, - LMS_DEV_EVB7V2, - LMS_DEV_STREAM, - LMS_DEV_NOVENA, - LMS_DEV_DATASPARK, - LMS_DEV_RFSPARK, - LMS_DEV_LMS6002USB, - LMS_DEV_RFESPARK, - LMS_DEV_SODERA, - - LMS_DEV_COUNT -}; - -const char LMS_DEV_NAMES[][80] = -{ - "UNKNOWN", - "EVB6", - "DigiGreen", - "DigiRed", - "EVB7", - "ZIPPER", - "Socket Board", - "EVB7_v2", - "Stream", - "Novena", - "DataSpark", - "RF-Spark", - "LMS6002-USB Stick", - "RF-ESpark", - "SoDeRa", -}; - -static const char* GetDeviceName(const eLMS_DEV device) -{ - if (LMS_DEV_UNKNOWN < device && device < LMS_DEV_COUNT) - return LMS_DEV_NAMES[device]; - else - return LMS_DEV_NAMES[LMS_DEV_UNKNOWN]; -} - -enum eEXP_BOARD -{ - EXP_BOARD_UNKNOWN, - EXP_BOARD_UNSUPPORTED, - EXP_BOARD_NO, - EXP_BOARD_MYRIAD1, - EXP_BOARD_MYRIAD2, - EXP_BOARD_MYRIAD_NOVENA, - EXP_BOARD_HPM1000, - EXP_BOARD_MYRIAD7, - EXP_BOARD_HPM7, - - EXP_BOARD_COUNT -}; - -const char EXP_BOARD_NAMES[][80] = -{ - "UNKNOWN", - "UNSUPPORTED", - "NOT AVAILABLE", - "Myriad1", - "Myriad2", - "Novena", - "HPM1000", - "Myriad7", - "HMP7" -}; - -static const char* GetExpansionBoardName(const eEXP_BOARD board) -{ - if (EXP_BOARD_UNKNOWN < board && board < EXP_BOARD_COUNT) - return EXP_BOARD_NAMES[board]; - else - return EXP_BOARD_NAMES[EXP_BOARD_UNKNOWN]; -} - -struct LMS64C_Info -{ - unsigned char firmware; - unsigned char deviceType; - unsigned char protocol; - unsigned char hardware; - unsigned char expansionBoard; -}; - -enum eCMD_LMS -{ - CMD_GET_INFO = 0x00, - CMD_LMS6002_RST = 0x10, - ///Writes data to SI5356 synthesizer via I2C - CMD_SI5356_WR = 0x11, - ///Reads data from SI5356 synthesizer via I2C - CMD_SI5356_RD = 0x12, - ///Writes data to SI5351 synthesizer via I2C - CMD_SI5351_WR = 0x13, - ///Reads data from SI5351 synthesizer via I2C - CMD_SI5351_RD = 0x14, - ///PanelBus DVI (HDMI) Transmitter control - CMD_TFP410_WR = 0x15, - ///PanelBus DVI (HDMI) Transmitter control - CMD_TFP410_RD = 0x16, - ///Sets new LMS7002M chip’s RESET pin level (0, 1, pulse) - CMD_LMS7002_RST = 0x20, - ///Writes data to LMS7002M chip via SPI - CMD_LMS7002_WR = 0x21, - ///Reads data from LMS7002M chip via SPI - CMD_LMS7002_RD = 0x22, - ///Writes data to LMS6002 chip via SPI - CMD_LMS6002_WR = 0x23, - ///Reads data from LMS6002 chip via SPI - CMD_LMS6002_RD = 0x24, - - CMD_LMS_LNA = 0x2A, - CMD_LMS_PA = 0x2B, - - CMD_PROG_MCU = 0x2C, - ///Writes data to ADF4002 chip via SPI - CMD_ADF4002_WR = 0x31, - - CMD_USB_FIFO_RST = 0x40, - CMD_PE636040_WR = 0x41, - CMD_PE636040_RD = 0x42, - - CMD_GPIO_WR = 0x51, - CMD_GPIO_RD = 0x52, - - CMD_ALTERA_FPGA_GW_WR = 0x53, - CMD_ALTERA_FPGA_GW_RD = 0x54, - - CMD_BRDSPI_WR = 0x55,//16 bit spi for stream, dataspark control - CMD_BRDSPI_RD = 0x56,//16 bit spi for stream, dataspark control - CMD_BRDSPI8_WR = 0x57, //8 + 8 bit spi for stream, dataspark control - CMD_BRDSPI8_RD = 0x58, //8 + 8 bit spi for stream, dataspark control - - CMD_BRDCONF_WR = 0x5D, //write config data to board - CMD_BRDCONF_RD = 0x5E, //read config data from board - - CMD_ANALOG_VAL_WR = 0x61, //write analog value - CMD_ANALOG_VAL_RD = 0x62, //read analog value - - CMD_MYRIAD_RST = 0x80, - CMD_MYRIAD_WR = 0x81, - CMD_MYRIAD_RD = 0x82, - CMD_MYRIAD_PROG = 0x8C -}; - -enum eCMD_STATUS -{ - STATUS_UNDEFINED, - STATUS_COMPLETED_CMD, - STATUS_UNKNOWN_CMD, - STATUS_BUSY_CMD, - STATUS_MANY_BLOCKS_CMD, - STATUS_ERROR_CMD, - STATUS_WRONG_ORDER_CMD, - STATUS_RESOURCE_DENIED_CMD, - STATUS_COUNT -}; - -static const char status_text[][32]= -{ - "Undefined/Failure", - "Completed", - "Unknown command", - "Busy", - "Too many blocks", - "Error", - "Wrong order", - "Resource denied" -}; - -static const char* status2string(const int status) -{ - if(status >= 0 && status < STATUS_COUNT) - return status_text[status]; - else - return "Unknown status"; -} - -enum eADC_UNITS -{ - RAW, - VOLTAGE, - CURRENT, - RESISTANCE, - POWER, - TEMPERATURE, - ADC_UNITS_COUNT -}; - -static const char adc_units_text[][8] = {"", "V", "A", "Ohm", "W", "C"}; - -static const char* adcUnits2string(const unsigned units) -{ - if (units < ADC_UNITS_COUNT) - return adc_units_text[units]; - else - return " unknown"; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lmsComms.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lmsComms.cpp deleted file mode 100644 index 5b74ef8975782a56f4c386714a48431e78ff2a1a..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lmsComms.cpp +++ /dev/null @@ -1,326 +0,0 @@ -/** -@file LMScomms.cpp -@author Lime Microsystems (www.limemicro.com) -@brief Implementation of data transmission to LMS boards -*/ - -#include "lmsComms.h" - -LMScomms::LMScomms() -{ - callback_logData = nullptr; - unsigned short test = 0x1234; - unsigned char* bytes = (unsigned char*)&test; - if(bytes[0] == 0x12 && bytes[1] == 0x34) - mSystemBigEndian = true; - else - mSystemBigEndian = false; -} - -LMScomms::~LMScomms() -{ -} - -/** @brief Transfers data between packet and connected device - @param pkt packet containing output data and to receive incomming data - @return 0: success, other: failure -*/ -LMScomms::TransferStatus LMScomms::TransferPacket(GenericPacket& pkt) -{ - std::lock_guard<std::mutex> lock(mControlPortLock); - TransferStatus status = TRANSFER_SUCCESS; - if(IsOpen() == false) - return NOT_CONNECTED; - - int packetLen; - eLMS_PROTOCOL protocol = LMS_PROTOCOL_UNDEFINED; - if(activeControlPort->GetType() == IConnection::SPI_PORT) - protocol = LMS_PROTOCOL_NOVENA; - else - protocol = LMS_PROTOCOL_LMS64C; - switch(protocol) - { - case LMS_PROTOCOL_UNDEFINED: - return TRANSFER_FAILED; - case LMS_PROTOCOL_LMS64C: - packetLen = ProtocolLMS64C::pktLength; - break; - case LMS_PROTOCOL_NOVENA: - packetLen = pkt.outBuffer.size() > ProtocolNovena::pktLength ? ProtocolNovena::pktLength : pkt.outBuffer.size(); - break; - default: - packetLen = 0; - return TRANSFER_FAILED; - } - int outLen = 0; - unsigned char* outBuffer = NULL; - outBuffer = PreparePacket(pkt, outLen, protocol); - unsigned char* inBuffer = new unsigned char[outLen]; - memset(inBuffer, 0, outLen); - - int outBufPos = 0; - int inDataPos = 0; - if(outLen == 0) - { - //printf("packet outlen = 0\n"); - outLen = 1; - } - - if(protocol == LMS_PROTOCOL_NOVENA) - { - bool transferData = true; //some commands are fake, so don't need transferring - if(pkt.cmd == CMD_GET_INFO) - { - //spi does not have GET INFO, fake it to inform what device it is - pkt.status = STATUS_COMPLETED_CMD; - pkt.inBuffer.clear(); - pkt.inBuffer.resize(64, 0); - pkt.inBuffer[0] = 0; //firmware - pkt.inBuffer[1] = LMS_DEV_NOVENA; //device - pkt.inBuffer[2] = 0; //protocol - pkt.inBuffer[3] = 0; //hardware - pkt.inBuffer[4] = EXP_BOARD_UNSUPPORTED; //expansion - transferData = false; - } - - if(transferData) - { - if (callback_logData) - callback_logData(true, outBuffer, outLen); - int bytesWritten = Write(outBuffer, outLen); - if( bytesWritten == outLen) - { - if(pkt.cmd == CMD_LMS7002_RD) - { - inDataPos = Read(&inBuffer[inDataPos], outLen); - if(inDataPos != outLen) - status = TRANSFER_FAILED; - else - { - if (callback_logData) - callback_logData(false, inBuffer, inDataPos); - } - } - ParsePacket(pkt, inBuffer, inDataPos, protocol); - } - else - status = TRANSFER_FAILED; - } - } - else - { - for(int i=0; i<outLen; i+=packetLen) - { - int bytesToSend = packetLen; - if (callback_logData) - callback_logData(true, &outBuffer[outBufPos], bytesToSend); - if( Write(&outBuffer[outBufPos], bytesToSend) ) - { - outBufPos += packetLen; - long readLen = packetLen; - int bread = Read(&inBuffer[inDataPos], readLen); - if(bread != readLen && protocol != LMS_PROTOCOL_NOVENA) - { - status = TRANSFER_FAILED; - break; - } - if (callback_logData) - callback_logData(false, &inBuffer[inDataPos], bread); - inDataPos += bread; - } - else - { - status = TRANSFER_FAILED; - break; - } - } - ParsePacket(pkt, inBuffer, inDataPos, protocol); - } - delete outBuffer; - delete inBuffer; - return status; -} - -/** @brief Returns connected device information -*/ -LMSinfo LMScomms::GetInfo() -{ - LMSinfo info; - info.device = LMS_DEV_UNKNOWN; - info.expansion = EXP_BOARD_UNKNOWN; - info.firmware = 0; - info.hardware = 0; - info.protocol = 0; - GenericPacket pkt; - pkt.cmd = CMD_GET_INFO; - LMScomms::TransferStatus status = TransferPacket(pkt); - if (status == LMScomms::TRANSFER_SUCCESS && pkt.inBuffer.size() >= 5) - { - info.firmware = pkt.inBuffer[0]; - info.device = pkt.inBuffer[1] < LMS_DEV_COUNT ? (eLMS_DEV)pkt.inBuffer[1] : LMS_DEV_UNKNOWN; - info.protocol = pkt.inBuffer[2]; - info.hardware = pkt.inBuffer[3]; - info.expansion = pkt.inBuffer[4] < EXP_BOARD_COUNT ? (eEXP_BOARD)pkt.inBuffer[4] : EXP_BOARD_UNKNOWN; - } - return info; -} - -/** @brief Takes generic packet and converts to specific protocol buffer - @param pkt generic data packet to convert - @param length returns length of returned buffer - @param protocol which protocol to use for data - @return pointer to data buffer, must be manually deleted after use -*/ -unsigned char* LMScomms::PreparePacket(const GenericPacket& pkt, int& length, const eLMS_PROTOCOL protocol) -{ - unsigned char* buffer = NULL; - if(protocol == LMS_PROTOCOL_UNDEFINED) - return NULL; - - if(protocol == LMS_PROTOCOL_LMS64C) - { - ProtocolLMS64C packet; - int maxDataLength = packet.maxDataLength; - packet.cmd = pkt.cmd; - packet.status = pkt.status; - int byteBlockRatio = 1; //block ratio - how many bytes in one block - switch( packet.cmd ) - { - case CMD_PROG_MCU: - case CMD_GET_INFO: - case CMD_SI5351_RD: - case CMD_SI5356_RD: - byteBlockRatio = 1; - break; - case CMD_SI5351_WR: - case CMD_SI5356_WR: - byteBlockRatio = 2; - break; - case CMD_LMS7002_RD: - case CMD_BRDSPI_RD: - case CMD_BRDSPI8_RD: - byteBlockRatio = 2; - break; - case CMD_ADF4002_WR: - byteBlockRatio = 3; - break; - case CMD_LMS7002_WR: - case CMD_BRDSPI_WR: - case CMD_ANALOG_VAL_WR: - byteBlockRatio = 4; - break; - default: - byteBlockRatio = 1; - } - if (packet.cmd == CMD_LMS7002_RD || packet.cmd == CMD_BRDSPI_RD) - maxDataLength = maxDataLength/2; - if (packet.cmd == CMD_ANALOG_VAL_RD) - maxDataLength = maxDataLength / 4; - int blockCount = pkt.outBuffer.size()/byteBlockRatio; - int bufLen = blockCount/(maxDataLength/byteBlockRatio) - +(blockCount%(maxDataLength/byteBlockRatio)!=0); - bufLen *= packet.pktLength; - if(bufLen == 0) - bufLen = packet.pktLength; - buffer = new unsigned char[bufLen]; - memset(buffer, 0, bufLen); - int srcPos = 0; - for(int j=0; j*packet.pktLength<bufLen; ++j) - { - int pktPos = j*packet.pktLength; - buffer[pktPos] = packet.cmd; - buffer[pktPos+1] = packet.status; - if(blockCount > (maxDataLength/byteBlockRatio)) - { - buffer[pktPos+2] = maxDataLength/byteBlockRatio; - blockCount -= buffer[pktPos+2]; - } - else - buffer[pktPos+2] = blockCount; - memcpy(&buffer[pktPos+3], packet.reserved, sizeof(packet.reserved)); - int bytesToPack = (maxDataLength/byteBlockRatio)*byteBlockRatio; - for (int k = 0; k<bytesToPack && srcPos < pkt.outBuffer.size(); ++srcPos, ++k) - buffer[pktPos + 8 + k] = pkt.outBuffer[srcPos]; - } - length = bufLen; - } - else if(protocol == LMS_PROTOCOL_NOVENA) - { - const uint16_t NOVENA_GPIO_ADDR = 0x0706; - if(pkt.cmd == CMD_LMS7002_RST) - { - buffer = new unsigned char[8]; - buffer[0] = (NOVENA_GPIO_ADDR >> 8) | 0x80; - buffer[1] = NOVENA_GPIO_ADDR & 0xFF; - buffer[2] = 0x00; - buffer[3] = 0x18; - buffer[4] = (NOVENA_GPIO_ADDR >> 8) | 0x80; - buffer[5] = NOVENA_GPIO_ADDR & 0xFF; - buffer[6] = 0x00; - buffer[7] = 0x38; - length = 8; - } - else - { - buffer = new unsigned char[pkt.outBuffer.size()]; - memcpy(buffer, &pkt.outBuffer[0], pkt.outBuffer.size()); - if (pkt.cmd == CMD_LMS7002_WR) - { - for(int i=0; i<pkt.outBuffer.size(); i+=4) - buffer[i] |= 0x80; - } - length = pkt.outBuffer.size(); - } - } - return buffer; -} - -/** @brief Parses given data buffer into generic packet - @param pkt destination packet - @param buffer received data from board - @param length received buffer length - @param protocol which protocol to use for data parsing - @return 1:success, 0:failure -*/ -int LMScomms::ParsePacket(GenericPacket& pkt, const unsigned char* buffer, const int length, const eLMS_PROTOCOL protocol) -{ - if(protocol == LMS_PROTOCOL_UNDEFINED) - return -1; - - if(protocol == LMS_PROTOCOL_LMS64C) - { - ProtocolLMS64C packet; - int inBufPos = 0; - pkt.inBuffer.resize(packet.maxDataLength*(length / packet.pktLength + (length % packet.pktLength)), 0); - for(int i=0; i<length; i+=packet.pktLength) - { - pkt.cmd = (eCMD_LMS)buffer[i]; - pkt.status = (eCMD_STATUS)buffer[i+1]; - memcpy(&pkt.inBuffer[inBufPos], &buffer[i+8], packet.maxDataLength); - inBufPos += packet.maxDataLength; - } - } - else if(protocol == LMS_PROTOCOL_NOVENA) - { - pkt.cmd = CMD_LMS7002_RD; - pkt.status = STATUS_COMPLETED_CMD; - pkt.inBuffer.clear(); - for(int i=0; i<length; i+=2) - { - //reading from spi returns only registers values - //fill addresses as zeros to match generic format of address, value pairs - pkt.inBuffer.push_back(0); //should be address msb - pkt.inBuffer.push_back(0); //should be address lsb - pkt.inBuffer.push_back(buffer[i]); - pkt.inBuffer.push_back(buffer[i+1]); - } - } - return 1; -} - -/** @brief Sets callback function which gets called each time data is sent or received -*/ -void LMScomms::SetDataLogCallback(std::function<void(bool, const unsigned char*, const unsigned int)> callback) -{ - callback_logData = callback; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lmsComms.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lmsComms.h deleted file mode 100644 index 3d94d8ece236d3e96dfb1484dd31263c4d440492..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lmsComms.h +++ /dev/null @@ -1,111 +0,0 @@ -/** -@file LMScomms.h -@author Lime Microsystems (www.limemicro.com) -@brief Class for handling data transmission to LMS boards -*/ - -#ifndef LMS_COMMS_H -#define LMS_COMMS_H - -#include "lms7002_defines.h" -#include "connectionManager/ConnectionManager.h" -#include <string.h> -#include <mutex> - -struct LMSinfo -{ - eLMS_DEV device; - eEXP_BOARD expansion; - int firmware; - int hardware; - int protocol; -}; - -/* @brief Class for abstracting transfering data to and from chip -*/ -class LMScomms : public ConnectionManager -{ -public: - enum TransferStatus - { - TRANSFER_SUCCESS, - TRANSFER_FAILED, - NOT_CONNECTED - }; - - enum eLMS_PROTOCOL - { - LMS_PROTOCOL_UNDEFINED = 0, - LMS_PROTOCOL_DIGIC, - LMS_PROTOCOL_LMS64C, - LMS_PROTOCOL_NOVENA, - }; - struct ProtocolDIGIC - { - static const int pktLength = 64; - static const int maxDataLength = 60; - ProtocolDIGIC() : cmd(0), i2cAddr(0), blockCount(0) {}; - unsigned char cmd; - unsigned char i2cAddr; - unsigned char blockCount; - unsigned char reserved; - unsigned char data[maxDataLength]; - }; - - struct ProtocolLMS64C - { - static const int pktLength = 64; - static const int maxDataLength = 56; - ProtocolLMS64C() :cmd(0),status(STATUS_UNDEFINED),blockCount(0) - { - memset(reserved, 0, 5); - }; - unsigned char cmd; - unsigned char status; - unsigned char blockCount; - unsigned char reserved[5]; - unsigned char data[maxDataLength]; - }; - - struct ProtocolNovena - { - static const int pktLength = 128; - static const int maxDataLength = 128; - ProtocolNovena() :cmd(0),status(0) {}; - unsigned char cmd; - unsigned char status; - unsigned char blockCount; - unsigned char data[maxDataLength]; - }; - - struct GenericPacket - { - GenericPacket() - { - cmd = CMD_GET_INFO; - status = STATUS_UNDEFINED; - } - - eCMD_LMS cmd; - eCMD_STATUS status; - vector<unsigned char> outBuffer; - vector<unsigned char> inBuffer; - }; - - LMScomms(); - ~LMScomms(); - - virtual TransferStatus TransferPacket(GenericPacket &pkt); - LMSinfo GetInfo(); - void SetDataLogCallback(std::function<void(bool, const unsigned char*, const unsigned int)> callback); -protected: - std::function<void(bool, const unsigned char*, const unsigned int)> callback_logData; - std::mutex mControlPortLock; - unsigned char* PreparePacket(const GenericPacket &pkt, int &length, const eLMS_PROTOCOL protocol); - int ParsePacket(GenericPacket &pkt, const unsigned char* buffer, const int length, const eLMS_PROTOCOL protocol); -protected: - bool mSystemBigEndian; -}; - -#endif // LMS_COMMS_H - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/typedefs.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/typedefs.h deleted file mode 100644 index 9ae0c25d93843298f9a95236aa2e10c3272ac3db..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/typedefs.h +++ /dev/null @@ -1,18 +0,0 @@ -/** -@file typedefs.h -@author Lime Microsystems (www.limemicro.com) -@brief Variables types definitions -*/ - -#ifndef LMS7002M_TYPEDEFS_H -#define LMS7002M_TYPEDEFS_H - -typedef unsigned int uint32_t; -typedef int int32_t; -typedef unsigned short uint16_t; -typedef short int16_t; -typedef signed char int8_t; -typedef unsigned char uint8_t; -typedef double float_type; - -#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/CMakeLists.txt b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/CMakeLists.txt deleted file mode 100644 index 0225e1d4d6148af3df4055101eadb954c86768d8..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/CMakeLists.txt +++ /dev/null @@ -1,58 +0,0 @@ -cmake_minimum_required(VERSION 2.8) -set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE TYPE INTERNAL FORCE) -project("matlab_StreamDLL") -#include modules for finding CyAPI -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") -cmake_policy(SET CMP0015 OLD) -if(${CMAKE_MAJOR_VERSION} GREATER 2) - cmake_policy(SET CMP0043 NEW) -endif() -ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS) -if(CMAKE_COMPILER_IS_GNUCXX) - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -fPIC") -endif() - -# Add sub-directories -add_subdirectory(LMS_StreamBoard) -include_directories(LMS_StreamBoard) -add_subdirectory(connectionManager) -include_directories(connectionManager) - -set(BINARY_OUTPUT_DIR "${CMAKE_BINARY_DIR}/bin") - -if (MSVC) - SET( MSVC_MULTITHREAD_COMPILE_FLAGS "/MP") - SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MSVC_MULTITHREAD_COMPILE_FLAGS}" ) -endif(MSVC) - -set(Library_file_list LMS_SDR.cpp ) - -set(BUILD_STATIC_LIB OFF CACHE BOOL "Build static or dynamic library") -if( BUILD_STATIC_LIB ) - add_library(LMS_SDR STATIC ${Library_file_list}) -else() - add_library(LMS_SDR SHARED ${Library_file_list}) -endif(BUILD_STATIC_LIB) - -set(AUTO_UPDATE_VERSION OFF CACHE BOOL "Uses python script to increment version") -if(AUTO_UPDATE_VERSION) - add_custom_target(updateVersion ALL COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/auto_version.py WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) - add_dependencies(LMS_SDR updateVersion) -endif() - -target_link_libraries(LMS_SDR - LMS_StreamBoard - ${CYAPI_LIBRARIES} - ) - -if(WIN32) - find_package(CyAPI REQUIRED) - LINK_DIRECTORIES(${CYAPI_LIBRARIES}) - include_directories(${CYAPI_INCLUDE_DIRS}) - set(CONNECTION_MANAGER_LIBS ${CYAPI_LIBRARIES} SetupAPI) -endif() -if(UNIX) - set(CONNECTION_MANAGER_LIBS usb-1.0 -lpthread) -endif() - -target_link_libraries(LMS_SDR ${CONNECTION_MANAGER_LIBS}) diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_SDR.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_SDR.cpp deleted file mode 100644 index 1ff4bbf1de7b1a3f9587f8183a74b14e53c8f2b9..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_SDR.cpp +++ /dev/null @@ -1,334 +0,0 @@ -/** -@author Lime Microsystems -@brief Stream board communications for Matlab -*/ - -#include "LMS_SDR.h" - -#include "lmsComms.h" -#include "LMS_StreamBoard.h" -#include "ringBuffer.h" -#include "IConnection.h" -#include "fifo.h" -#include "dataTypes.h" -#include <unistd.h> -#include <thread> - -#include <vector> -#include <atomic> -#include <thread> -#include <mutex> -#include <chrono> - -#define _USE_MATH_DEFINES -#include <math.h> - -using namespace std; - -typedef enum -{ - LMS_SUCCESS = 0, - LMS_ERROR -} LMS_STATUS; - -LMS_SamplesFIFO rxBuffer(1); -static thread rxThread; -atomic<bool> rxStop(1); -atomic<bool> rxRunning(0); -atomic<unsigned long> rxDroppedSamples(0); -atomic<long> RxDataRate(0); -atomic<uint32_t> rxSamplingRate(0); - -LMS_SamplesFIFO txBuffer(1); -static thread txThread; -atomic<bool> txStop(1); -atomic<bool> txRunning(0); -atomic<long> txDroppedSamples(0); -atomic<long> TxDataRate(0); -atomic<uint32_t> txSamplingRate(0); - -LMScomms comPort(IConnection::COM_PORT); -LMScomms usbPort(IConnection::USB_PORT); -LMS_StreamBoard streamer(&usbPort); - -const int samplesInPacket = 1024; -unsigned int opMode = 0; - -DLL_EXPORT void LMS_Stats(uint32_t *RxBufSize, uint32_t *RxBufFilled, uint32_t *RxSamplingRate, uint32_t *TxBufSize, uint32_t *TxBufFilled, uint32_t *TxSamplingRate) -{ - LMS_SamplesFIFO::BufferInfo rxStats = rxBuffer.GetInfo(); - LMS_SamplesFIFO::BufferInfo txStats = txBuffer.GetInfo(); - if (RxBufSize) - *RxBufSize = rxStats.size*samplesInPacket; - if (RxBufFilled) - *RxBufFilled = rxStats.itemsFilled*samplesInPacket; - if (TxBufSize) - *TxBufSize = txStats.size*samplesInPacket; - if (TxBufFilled) - *TxBufFilled = txStats.itemsFilled*samplesInPacket; - if (TxSamplingRate) - *TxSamplingRate = txSamplingRate.load(); - if (RxSamplingRate) - *RxSamplingRate = rxSamplingRate.load(); -} - -DLL_EXPORT int LMS_Init(const int OperationMode, uint32_t trxBuffersLength) -{ - opMode = OperationMode; - unsigned int packetsNeeded = trxBuffersLength / samplesInPacket; - if (trxBuffersLength % samplesInPacket != 0) - ++packetsNeeded; - if (packetsNeeded >= (uint32_t)(1 << 31)) - packetsNeeded = (uint32_t)(1 << 31); - for (int i = 0; i < 32; ++i) - if ((1 << i) >= packetsNeeded) - { - packetsNeeded = (1 << i); - break; - } - rxBuffer.Reset(packetsNeeded); - txBuffer.Reset(packetsNeeded); - return LMS_SUCCESS; -} - -DLL_EXPORT int LMS_Destroy() -{ - LMS_RxStop(); - //buffers size is reduced to lower memory consumption when not used - rxBuffer.Reset(1); - txBuffer.Reset(1); - return LMS_SUCCESS; -} - -DLL_EXPORT LMScomms* LMS_GetUSBPort() -{ - return &usbPort; -} - -DLL_EXPORT LMScomms* LMS_GetCOMPort() -{ - return &comPort; -} - -const int maxDevListLen = 32; -const int maxDevNameLen = 256; //each device name not longer than 256 -static char DeviceNames[maxDevListLen][maxDevNameLen]; - -DLL_EXPORT int LMS_UpdateDeviceList(LMScomms* port) -{ - memset(DeviceNames, 0, maxDevListLen*maxDevNameLen); - port->Close(); - int devCount = port->RefreshDeviceList(); - vector<string> names = port->GetDeviceList(); - int charsWritten = 0; - for (unsigned int i = 0; i < names.size() && i < maxDevListLen; ++i) - { - charsWritten += sprintf(DeviceNames[i], "[%i] %.*s", i, maxDevNameLen, names[i].c_str()); - } - return devCount; -} - -DLL_EXPORT const char* LMS_GetDeviceName(LMScomms* port, unsigned int deviceIndex) -{ - if (deviceIndex < maxDevListLen) - return DeviceNames[deviceIndex]; - else - return ""; -} - -DLL_EXPORT int LMS_DeviceOpen(LMScomms* port, const uint32_t deviceIndex) -{ - port->Close(); - int status = port->Open(deviceIndex); - if (status == 1) - { - return LMS_SUCCESS; - } - else - { - return LMS_ERROR; - } -} - -DLL_EXPORT void LMS_DeviceClose(LMScomms* port) -{ - port->Close(); -} - -DLL_EXPORT uint32_t LMS_ControlWrite(LMScomms* port, const uint8_t *buffer, const uint16_t bufLen) -{ - return port->Write(buffer, bufLen, 0); -} - -DLL_EXPORT uint32_t LMS_ControlRead(LMScomms* port, uint8_t* buffer, const uint16_t bufLen) -{ - return port->Read(buffer, bufLen, 0); -} - - - -const int RX_BUFF_SZ (1020*1024/4); -uint32_t rx_buffer[RX_BUFF_SZ]; -uint64_t start_timestamp = 0;; -uint32_t wr_pos = 0; -uint32_t rd_pos = 0; - -void ReceivePackets() -{ - rxRunning.store(true); - uint32_t samplesCollected = 0; - - const int bufferSize = 4096;// 4096; - const int buffersCount = 32; // must be power of 2 - const int buffersCountMask = buffersCount - 1; - int handles[buffersCount]= {0}; - char buffers[buffersCount*bufferSize]={0}; - - struct sched_param sp; - sp.sched_priority = sched_get_priority_max(SCHED_FIFO); - if (pthread_setschedparam(pthread_self(),SCHED_FIFO,&sp)!=0) - { - printf("Shed prams failed\n"); - } - - //switch off Rx - uint16_t regVal = streamer.SPI_read(0x0005); - streamer.SPI_write(0x0005, regVal & ~0x6); - //USB FIFO reset - LMScomms::GenericPacket ctrPkt; - ctrPkt.cmd = CMD_USB_FIFO_RST; - ctrPkt.outBuffer.push_back(0x01); - usbPort.TransferPacket(ctrPkt); - ctrPkt.outBuffer[0] = 0x00; - usbPort.TransferPacket(ctrPkt); - - streamer.SPI_write(0x0005, regVal | 0x6); - - streamer.SPI_write(0x0001, 0x0001); - streamer.SPI_write(0x0007, 0x0000); - - for (int i = 0; i<buffersCount; ++i) - handles[i] = usbPort.BeginDataReading(&buffers[i*bufferSize], bufferSize); - - int bi = 0; - - while (rxStop.load() != true) - { - if (usbPort.WaitForReading(handles[bi], 1000) == false) - break; - - long bytesToRead = bufferSize; - long bytesReceived = usbPort.FinishDataReading(&buffers[bi*bufferSize], bytesToRead, handles[bi]); - if (bytesReceived > 0) - { - PacketLTE* pkt = (PacketLTE*)&buffers[bi*bufferSize]; - for(uint16_t sampleIndex = 0; sampleIndex < sizeof(pkt->samples)/sizeof(int16_t); sampleIndex++) - { - pkt->samples[sampleIndex] <<= 4; - pkt->samples[sampleIndex] >>= 4; - } - - rxBuffer.push_samples((complex16_t*)pkt->samples, 1020, pkt->counter, 100); - } - // Re-submit this request to keep the queue full - memset(&buffers[bi*bufferSize], 0, bufferSize); - handles[bi] = usbPort.BeginDataReading(&buffers[bi*bufferSize], bufferSize); - bi = (bi + 1) & buffersCountMask; - pthread_yield(); - } - - usbPort.AbortReading(); - for (int j = 0; j<buffersCount; j++) - { - long bytesToRead = bufferSize; - usbPort.WaitForReading(handles[j], 1000); - usbPort.FinishDataReading(&buffers[j*bufferSize], bytesToRead, handles[j]); - } - rxRunning.store(false); -} - - -DLL_EXPORT uint32_t LMS_TRxWrite(const int16_t *data, const uint32_t samplesCount, const uint32_t antenna_id, uint64_t timestamp) -{ - static uint32_t tx_buffer[1020]; - static int index = 0; - - const int bufferSize = 1024 * 4; - const int buffersCount = 32; // must be power of 2 - const int buffersCountMask = buffersCount - 1; - - static int handles[buffersCount] = {0}; - static char buffers[buffersCount*bufferSize]={0}; - static bool bufferUsed[buffersCount] = {0}; - static int bi = 0; //buffer index - PacketLTE* pkt; - - uint64_t ts = timestamp - index; - - pkt = (PacketLTE*)&buffers[bi*bufferSize]; - - for (int i=0;i<samplesCount;i++) - { - ((uint32_t*)pkt->samples)[index++]=(((uint32_t*)data)[i]& 0xFFF0FFF) | 0x1000; - - if (index == 1020) - { - pkt->counter = ts; - - if (bufferUsed[bi]) - { - if (usbPort.WaitForSending(handles[bi], 1000) == false) - return -1; - // Must always call FinishDataXfer to release memory of contexts[i] - long tempToSend = sizeof(PacketLTE); - usbPort.FinishDataSending(&buffers[bi*bufferSize], tempToSend, handles[bi]); - - bufferUsed[bi] = false; - } - handles[bi] = usbPort.BeginDataSending(&buffers[bi*bufferSize], sizeof(PacketLTE)); - bufferUsed[bi] = true; - bi = (bi + 1) & buffersCountMask; - pkt = (PacketLTE*)&buffers[bi*bufferSize]; - ts += 1020; - index = 0; - } - } -} - -vector<PacketLTE> PacketsBuffer(2048, PacketLTE()); -DLL_EXPORT uint32_t LMS_TRxRead(int16_t *buffer, const uint32_t samplesCount, const uint32_t antenna_id, uint64_t *timestamp, const uint32_t timeout_ms) -{ - if (usbPort.IsOpen() == false && opMode != -1) - return 0; - pthread_yield(); - uint32_t samplesPopped = rxBuffer.pop_samples((complex16_t*)buffer, samplesCount, timestamp, timeout_ms); - return samplesPopped; -} - - -DLL_EXPORT int LMS_RxStart() -{ - if (rxRunning.load()) - return 1; - if (usbPort.IsOpen() == false && opMode != -1) - return 1; - rxStop.store(false); - unsigned int bufSz = rxBuffer.GetInfo().size; - rxBuffer.Reset(bufSz); - rxThread = thread(ReceivePackets); - return 0; -} - -DLL_EXPORT int LMS_RxStop() -{ - if (rxRunning.load()) - { - if (rxThread.joinable()) - { - rxStop.store(true); - rxThread.join(); - } - rxStop.store(true); - } - return 0; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_SDR.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_SDR.h deleted file mode 100644 index 27a72e351a63ba5b71e2b92add5614a40ef654b9..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_SDR.h +++ /dev/null @@ -1,143 +0,0 @@ -/** -@author Lime Microsystems -@brief Interface for implementing SDR using Lime microsystems boards -*/ - -#ifndef LMS_SDR_INTERFACE_H -#define LMS_SDR_INTERFACE_H - -#include <stdint.h> - -#ifdef __cplusplus -class LMScomms; -#else -typedef void LMScomms; -#endif - -#define BUILD_DLL -#ifndef __unix__ -#ifdef BUILD_DLL - #define DLL_EXPORT __declspec(dllexport) -#else - #define DLL_EXPORT __declspec(dllimport) -#endif -#else -#define DLL_EXPORT -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/** @brief Returns stats of internal buffers - @param RxBufSize Receiver buffer size in samples - @param RxBufFilled Number of samples currently in the receiver buffer - @param RxSamplingRate Approximate receiver sampling rate, calculated from incomming data - @param TxBufSize Transmitter buffer size in samples - @param TxBufFilled Number of samples currently in the transmitter buffer - @param TxSamplingRate Approximate transmitter sampling rate, calculated from incomming data -*/ -DLL_EXPORT void LMS_Stats(uint32_t *RxBufSize, uint32_t *RxBufFilled, uint32_t *RxSamplingRate, uint32_t *TxBufSize, uint32_t *TxBufFilled, uint32_t *TxSamplingRate); - -/** @brief Initializes internal memory for samples buffering to hardware - @param OperationMode samples transfering mode: 0-packets synchronized, 1-packets not synchronized - @param trxBuffersLength Rx and Tx internal buffers size in samples - @return 0 success, -1 failure - - Generally trxBuffersSamplesCount should be more than 65536 -*/ -DLL_EXPORT int LMS_Init(const int OperationMode, uint32_t trxBuffersLength); - -/** @brief Stops internal threads and frees internal buffers memory - @return 0 success, -1 failure -*/ -DLL_EXPORT int LMS_Destroy(); - -///@name Device connection -/** @return object for communicating over USB port -*/ -DLL_EXPORT LMScomms* LMS_GetUSBPort(); - -/** @return object for communicating over COM port -*/ -DLL_EXPORT LMScomms* LMS_GetCOMPort(); - -/** @brief Refreshes currently connected device list - @param port Communications port to update - @return number of devices connected -*/ -DLL_EXPORT int LMS_UpdateDeviceList(LMScomms* port); - -/** @brief Returns pointer to static null terminated c-string name of selected device - @param port Communications port object - @param deviceIndex index from communications port device list -*/ -DLL_EXPORT const char* LMS_GetDeviceName(LMScomms* port, unsigned int deviceIndex); - -/** @brief Connects to selected device on given port - @param port Communications port object - @param deviceIndex index from communications port device list - @return 0-success -*/ -DLL_EXPORT int LMS_DeviceOpen(LMScomms* port, const uint32_t deviceIndex); - -/** @brief Closes connection on given port - @param port Communications port to close -*/ -DLL_EXPORT void LMS_DeviceClose(LMScomms* port); -///@} - -///@name Communications -/** @brief Writes given data to control port - @param port Port for communications - @param buffer data to be written - @param bufLen buffer length in bytes - @return number of bytes written -*/ -DLL_EXPORT uint32_t LMS_ControlWrite(LMScomms* port, const uint8_t *buffer, const uint16_t bufLen); - -/** @brief Reads given data from SPI regiter - @param port Port for communications - @param buffer destination buffer for data - @param bufLen number of bytes to read - @return number of bytes read -*/ -DLL_EXPORT uint32_t LMS_ControlRead(LMScomms* port, uint8_t* buffer, const uint16_t bufLen); - -/** @brief Starts thread for samples receiving - @return 0-success -*/ -DLL_EXPORT int LMS_RxStart(); - -/** @brief Stops samples receiving thread - @return 0:success, 1:failed -*/ -DLL_EXPORT int LMS_RxStop(); - -/** @brief Adds given samples to transmitter buffer, to be sent at specified timestamp -@param buffer source array for interleaved values (IQIQIQ...), each value amplitude should be from -2048 to 2047 -@param samplesCount number of samples in buffer, 1 sample = 2 bytes I + 2 bytes Q -@param channel_id destination channel -@param timestamp timestamp when the first sample in buffer should be transmitted (used only in synchronized operating mode) -@param timeout_ms time amount in milliseconds to try adding samples -@return number of samples written -*/ -DLL_EXPORT uint32_t LMS_TRxWrite(const int16_t *buffer, const uint32_t samplesCount, const uint32_t channel_id, uint64_t timestamp); - -/** @brief Reads samples from receiver buffer -@param buffer destination array for interleaved values (IQIQIQ...), must be big enough to store requested number of samples, each value amplitude will be from -2048 to 2047 -@param samplesCount number of samples to read, 1 sample = 2 bytes I + 2 bytes Q -@param antenna_id source channel -@param timestamp returns timestamp of the first sample in the buffer (used only in synchronized operating mode) -@param timeout_ms time amount in milliseconds to try reading samples -@return number of samples read -*/ -DLL_EXPORT uint32_t LMS_TRxRead(int16_t *buffer, const uint32_t samplesCount, const uint32_t channel_id, uint64_t *timestamp, const uint32_t timeout_ms); - -///@} - -#ifdef __cplusplus -} //extern "C" -#endif - -#endif //LMS_SDR_INTERFACE_H diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/CMakeLists.txt b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/CMakeLists.txt deleted file mode 100644 index 02e6bb5ab92be2e0ea821285697f5dd771fc189a..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -set(streamBoard_src_files - LMS_StreamBoard.cpp -) - -add_library(LMS_StreamBoard STATIC ${streamBoard_src_files}) -target_include_directories(LMS_StreamBoard PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) - -target_link_libraries(LMS_StreamBoard ConnectionManager) - -if(WIN32 AND ENABLE_USB_CONNECTION) - find_package(CyAPI REQUIRED) - LINK_DIRECTORIES(${CYAPI_LIBRARIES}) - include_directories(${CYAPI_INCLUDE_DIRS}) - set(CONNECTION_MANAGER_LIBS ${CYAPI_LIBRARIES} SetupAPI) - target_link_libraries(LMS_StreamBoard ${CONNECTION_MANAGER_LIBS}) -endif() -if(UNIX AND ENABLE_USB_CONNECTION) - set(CONNECTION_MANAGER_LIBS usb-1.0 -lpthread) - target_link_libraries(LMS_StreamBoard ${CONNECTION_MANAGER_LIBS}) -endif() - - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard.cpp deleted file mode 100644 index da9e4a7b8e6e97ab27c22f4757bd7ddba3141cf9..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard.cpp +++ /dev/null @@ -1,770 +0,0 @@ -#include "LMS_StreamBoard.h" -#include "lmsComms.h" -#include "lms7002_defines.h" -#include <assert.h> -#include <iostream> - -/** @brief Configures Stream board FPGA clocks - @param serPort Communications port to send data - @param fOutTx_MHz transmitter frequency in MHz - @param fOutRx_MHz receiver frequency in MHz - @param phaseShift_deg IQ phase shift in degrees - @return 0-success, other-failure -*/ -LMS_StreamBoard::Status LMS_StreamBoard::ConfigurePLL(LMScomms *serPort, const float fOutTx_MHz, const float fOutRx_MHz, const float phaseShift_deg) -{ - assert(serPort != nullptr); - if (serPort == NULL) - return FAILURE; - if (serPort->IsOpen() == false) - return FAILURE; - const float vcoLimits_MHz[2] = { 600, 1300 }; - int M, C; - const short bufSize = 64; - - float fOut_MHz = fOutTx_MHz; - float coef = 0.8*vcoLimits_MHz[1] / fOut_MHz; - M = C = (int)coef; - int chigh = (((int)coef) / 2) + ((int)(coef) % 2); - int clow = ((int)coef) / 2; - - LMScomms::GenericPacket pkt; - pkt.cmd = CMD_BRDSPI_WR; - - if (fOut_MHz*M > vcoLimits_MHz[0] && fOut_MHz*M < vcoLimits_MHz[1]) - { - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x0F); - pkt.outBuffer.push_back(0x15); //c4-c2_bypassed - pkt.outBuffer.push_back(0x01 | ((M % 2 != 0) ? 0x08 : 0x00) | ((C % 2 != 0) ? 0x20 : 0x00)); //N_bypassed - - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x08); - pkt.outBuffer.push_back(1); //N_high_cnt - pkt.outBuffer.push_back(1);//N_low_cnt - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x09); - pkt.outBuffer.push_back(chigh); //M_high_cnt - pkt.outBuffer.push_back(clow); //M_low_cnt - for (int i = 0; i <= 1; ++i) - { - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x0A + i); - pkt.outBuffer.push_back(chigh); //cX_high_cnt - pkt.outBuffer.push_back(clow); //cX_low_cnt - } - - float Fstep_us = 1 / (8 * fOutTx_MHz*C); - float Fstep_deg = (360 * Fstep_us) / (1 / fOutTx_MHz); - short nSteps = phaseShift_deg / Fstep_deg; - unsigned short reg2 = 0x0400 | (nSteps & 0x3FF); - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x02); - pkt.outBuffer.push_back((reg2 >> 8)); - pkt.outBuffer.push_back(reg2); //phase - - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x03); - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x01); - - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x03); - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x00); - - reg2 = reg2 | 0x800; - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x02); - pkt.outBuffer.push_back((reg2 >> 8)); - pkt.outBuffer.push_back(reg2); - - if(serPort->TransferPacket(pkt) != LMScomms::TRANSFER_SUCCESS || pkt.status != STATUS_COMPLETED_CMD) - return FAILURE; - } - else - return FAILURE; - - fOut_MHz = fOutRx_MHz; - coef = 0.8*vcoLimits_MHz[1] / fOut_MHz; - M = C = (int)coef; - chigh = (((int)coef) / 2) + ((int)(coef) % 2); - clow = ((int)coef) / 2; - if (fOut_MHz*M > vcoLimits_MHz[0] && fOut_MHz*M < vcoLimits_MHz[1]) - { - short index = 0; - pkt.outBuffer.clear(); - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x0F); - pkt.outBuffer.push_back(0x15); //c4-c2_bypassed - pkt.outBuffer.push_back(0x41 | ((M % 2 != 0) ? 0x08 : 0x00) | ((C % 2 != 0) ? 0x20 : 0x00)); //N_bypassed, c1 bypassed - - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x08); - pkt.outBuffer.push_back(1); //N_high_cnt - pkt.outBuffer.push_back(1);//N_low_cnt - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x09); - pkt.outBuffer.push_back(chigh); //M_high_cnt - pkt.outBuffer.push_back(clow); //M_low_cnt - for (int i = 0; i <= 1; ++i) - { - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x0A + i); - pkt.outBuffer.push_back(chigh); //cX_high_cnt - pkt.outBuffer.push_back(clow); //cX_low_cnt - } - - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x03); - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x02); - - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x03); - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x00); - - if (serPort->TransferPacket(pkt) != LMScomms::TRANSFER_SUCCESS || pkt.status != STATUS_COMPLETED_CMD) - return FAILURE; - } - else - return FAILURE; - return SUCCESS; -} - -/** @brief Captures IQ samples from Stream board, this is blocking function, it blocks until desired frames count is captured - @param isamples destination array for I samples, must be big enough to contain samplesCount - @param qsamples destination array for Q samples, must be big enough to contain samplesCount - @param framesCount number of IQ frames to capture - @param frameStart frame start indicator 0 or 1 - @return 0-success, other-failure -*/ -LMS_StreamBoard::Status LMS_StreamBoard::CaptureIQSamples(LMScomms *dataPort, int16_t *isamples, int16_t *qsamples, const uint32_t framesCount, const bool frameStart) -{ - assert(dataPort != nullptr); - if (dataPort == NULL) - return FAILURE; - if (dataPort->IsOpen() == false) - return FAILURE; - - int16_t sample_value; - const uint32_t bufSize = framesCount * 2 * sizeof(uint16_t); - char *buffer = new char[bufSize]; - if (buffer == 0) - { -#ifndef NDEBUG - std::cout << "Failed to allocate memory for samples buffer" << std::endl; -#endif - return FAILURE; - } - memset(buffer, 0, bufSize); - - LMScomms::GenericPacket pkt; - pkt.cmd = CMD_BRDSPI_RD; - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x05); - dataPort->TransferPacket(pkt); - if (pkt.status != STATUS_COMPLETED_CMD) - return FAILURE; - - uint16_t regVal = (pkt.inBuffer[2] * 256) + pkt.inBuffer[3]; - pkt.cmd = CMD_BRDSPI_WR; - pkt.outBuffer.clear(); - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x05); - pkt.outBuffer.push_back(0); - pkt.outBuffer.push_back(regVal | 0x4); - dataPort->TransferPacket(pkt); - if (pkt.status != STATUS_COMPLETED_CMD) - return FAILURE; - - int bytesReceived = 0; - for(int i = 0; i<3; ++i) - bytesReceived = dataPort->ReadStream(buffer, bufSize, 5000); - if (bytesReceived > 0) - { - bool iqSelect = false; - int16_t frameCounter = 0; - for (uint32_t b = 0; b < bufSize;) - { - sample_value = buffer[b++] & 0xFF; - sample_value |= (buffer[b++] & 0x0F) << 8; - sample_value = sample_value << 4; //shift left then right to fill sign bits - sample_value = sample_value >> 4; - if (iqSelect == false) - isamples[frameCounter] = sample_value; - else - qsamples[frameCounter] = sample_value; - frameCounter += iqSelect; - iqSelect = !iqSelect; - } - } - pkt.cmd = CMD_BRDSPI_RD; - pkt.outBuffer.clear(); - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x01); - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x05); - dataPort->TransferPacket(pkt); - - regVal = (pkt.inBuffer[2] * 256) + pkt.inBuffer[3]; - pkt.cmd = CMD_BRDSPI_WR; - pkt.outBuffer.clear(); - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x05); - pkt.outBuffer.push_back(0); - pkt.outBuffer.push_back(regVal & ~0x4); - dataPort->TransferPacket(pkt); - - delete[] buffer; - return SUCCESS; -} - -/** @brief Blocking operation to upload IQ samples to Stream board RAM - @param serPort port to use for communication - @param isamples I channel samples - @param qsamples Q channel samples - @param framesCount number of samples in arrays - @return 0-success, other-failure -*/ -LMS_StreamBoard::Status LMS_StreamBoard::UploadIQSamples(LMScomms* serPort, int16_t *isamples, int16_t *qsamples, const uint32_t framesCount) -{ - int bufferSize = framesCount * 2; - uint16_t *buffer = new uint16_t[bufferSize]; - memset(buffer, 0, bufferSize*sizeof(uint16_t)); - int bufPos = 0; - for (unsigned i = 0; i<framesCount; ++i) - { - buffer[bufPos] = (isamples[i] & 0xFFF); - buffer[bufPos + 1] = (qsamples[i] & 0xFFF) | 0x1000; - bufPos += 2; - } - const long outLen = bufPos * 2; - int packetSize = 65536; - int sent = 0; - bool success = true; - - LMScomms::GenericPacket pkt; - pkt.cmd = CMD_BRDSPI_RD; - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x05); - - serPort->TransferPacket(pkt); - pkt.cmd = CMD_BRDSPI_WR; - pkt.outBuffer.clear(); - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x05); - pkt.outBuffer.push_back(pkt.inBuffer[2]); - pkt.outBuffer.push_back(pkt.inBuffer[3] & ~0x7); - serPort->TransferPacket(pkt); - - while (sent<outLen) - { - char *outBuf = (char*)buffer; - const long toSendBytes = outLen - sent > packetSize ? packetSize : outLen - sent; - long toSend = toSendBytes; - int context = serPort->BeginDataSending(&outBuf[sent], toSend); - if (serPort->WaitForSending(context, 5000) == false) - { - success = false; - serPort->FinishDataSending(&outBuf[sent], toSend, context); - break; - } - sent += serPort->FinishDataSending(&outBuf[sent], toSend, context); - } - - pkt.cmd = CMD_BRDSPI_RD; - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x05); - - serPort->TransferPacket(pkt); - pkt.cmd = CMD_BRDSPI_WR; - pkt.outBuffer.clear(); - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x05); - pkt.outBuffer.push_back(pkt.inBuffer[2]); - pkt.outBuffer.push_back(pkt.inBuffer[3] | 0x3); - serPort->TransferPacket(pkt); - return success ? SUCCESS : FAILURE; -} - -LMS_StreamBoard::LMS_StreamBoard(LMScomms* dataPort) -{ - mRxFrameStart.store(true); - mDataPort = dataPort; - mRxFIFO = new LMS_StreamBoard_FIFO<SamplesPacket>(1024*4); - mTxFIFO = new LMS_StreamBoard_FIFO<SamplesPacket>(1024*4); - mStreamRunning.store(false); - mTxCyclicRunning.store(false); -} - -LMS_StreamBoard::~LMS_StreamBoard() -{ - StopReceiving(); - delete mRxFIFO; - delete mTxFIFO; -} - -/** @brief Crates threads for packets receiving, processing and transmitting -*/ -LMS_StreamBoard::Status LMS_StreamBoard::StartReceiving(unsigned int fftSize) -{ - if (mStreamRunning.load() == true) - return FAILURE; - if (mDataPort->IsOpen() == false) - return FAILURE; - mRxFIFO->reset(); - stopRx.store(false); - threadRx = std::thread(ReceivePackets, this); - mStreamRunning.store(true); - return SUCCESS; -} - -/** @brief Stops receiving, processing and transmitting threads -*/ -LMS_StreamBoard::Status LMS_StreamBoard::StopReceiving() -{ - if (mStreamRunning.load() == false) - return FAILURE; - stopTx.store(true); - stopRx.store(true); - threadRx.join(); - mStreamRunning.store(false); - return SUCCESS; -} - -/** @brief Function dedicated for receiving data samples from board -*/ -void LMS_StreamBoard::ReceivePackets(LMS_StreamBoard* pthis) -{ - SamplesPacket pkt; - int samplesCollected = 0; - auto t1 = chrono::high_resolution_clock::now(); - auto t2 = chrono::high_resolution_clock::now(); - - const int buffer_size = 65536;// 4096; - const int buffers_count = 16; // must be power of 2 - const int buffers_count_mask = buffers_count - 1; - int handles[buffers_count]; - memset(handles, 0, sizeof(int)*buffers_count); - char *buffers = NULL; - buffers = new char[buffers_count*buffer_size]; - if (buffers == 0) - { - printf("error allocating buffers\n"); - return; - } - memset(buffers, 0, buffers_count*buffer_size); - - //USB FIFO reset - LMScomms::GenericPacket ctrPkt; - ctrPkt.cmd = CMD_USB_FIFO_RST; - ctrPkt.outBuffer.push_back(0x01); - pthis->mDataPort->TransferPacket(ctrPkt); - ctrPkt.outBuffer[0] = 0x00; - pthis->mDataPort->TransferPacket(ctrPkt); - - uint16_t regVal = pthis->SPI_read(0x0005); - pthis->SPI_write(0x0005, regVal | 0x4); - - for (int i = 0; i<buffers_count; ++i) - handles[i] = pthis->mDataPort->BeginDataReading(&buffers[i*buffer_size], buffer_size); - - int bi = 0; - int packetsReceived = 0; - unsigned long BytesReceived = 0; - int m_bufferFailures = 0; - short sample; - - bool frameStart = pthis->mRxFrameStart.load(); - while (pthis->stopRx.load() == false) - { - if (pthis->mDataPort->WaitForReading(handles[bi], 1000) == false) - ++m_bufferFailures; - - long bytesToRead = buffer_size; - long bytesReceived = pthis->mDataPort->FinishDataReading(&buffers[bi*buffer_size], bytesToRead, handles[bi]); - if (bytesReceived > 0) - { - ++packetsReceived; - BytesReceived += bytesReceived; - char* bufStart = &buffers[bi*buffer_size]; - - for (int p = 0; p < bytesReceived; p+=2) - { - if (samplesCollected == 0) //find frame start - { - int frameStartOffset = FindFrameStart(&bufStart[p], bytesReceived-p, frameStart); - if (frameStartOffset < 0) - break; //frame start was not found, move on to next buffer - p += frameStartOffset; - } - sample = (bufStart[p+1] & 0x0F); - sample = sample << 8; - sample |= (bufStart[p] & 0xFF); - sample = sample << 4; - sample = sample >> 4; - pkt.iqdata[samplesCollected] = sample; - ++samplesCollected; - if (pkt.samplesCount == samplesCollected) - { - samplesCollected = 0; - if (pthis->mRxFIFO->push_back(pkt, 200) == false) - ++m_bufferFailures; - } - } - } - else - { - ++m_bufferFailures; - } - - t2 = chrono::high_resolution_clock::now(); - long timePeriod = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count(); - if (timePeriod >= 1000) - { - // periodically update frame start, user might change it during operation - frameStart = pthis->mRxFrameStart.load(); - float m_dataRate = 1000.0*BytesReceived / timePeriod; - t1 = t2; - BytesReceived = 0; - LMS_StreamBoard_FIFO<SamplesPacket>::Status rxstats = pthis->mRxFIFO->GetStatus(); - - pthis->mRxDataRate.store(m_dataRate); - pthis->mRxFIFOfilled.store(100.0*rxstats.filledElements / rxstats.maxElements); -#ifndef NDEBUG - printf("Rx: %.1f%% \t rate: %.0f kB/s failures:%i\n", 100.0*rxstats.filledElements / rxstats.maxElements, m_dataRate / 1000.0, m_bufferFailures); -#endif - m_bufferFailures = 0; - } - - // Re-submit this request to keep the queue full - memset(&buffers[bi*buffer_size], 0, buffer_size); - handles[bi] = pthis->mDataPort->BeginDataReading(&buffers[bi*buffer_size], buffer_size); - bi = (bi + 1) & buffers_count_mask; - } - pthis->mDataPort->AbortReading(); - for (int j = 0; j<buffers_count; j++) - { - long bytesToRead = buffer_size; - pthis->mDataPort->WaitForReading(handles[j], 1000); - pthis->mDataPort->FinishDataReading(&buffers[j*buffer_size], bytesToRead, handles[j]); - } - - regVal = pthis->SPI_read(0x0005); - pthis->SPI_write(0x0005, regVal & ~0x4); - - delete[] buffers; -#ifndef NDEBUG - printf("Rx finished\n"); -#endif -} - -/** @brief Function dedicated for transmitting samples to board -*/ -void LMS_StreamBoard::TransmitPackets(LMS_StreamBoard* pthis) -{ - const int packetsToBatch = 16; - const int buffer_size = sizeof(SamplesPacket)*packetsToBatch; - const int buffers_count = 16; // must be power of 2 - const int buffers_count_mask = buffers_count - 1; - int handles[buffers_count]; - memset(handles, 0, sizeof(int)*buffers_count); - char *buffers = NULL; - buffers = new char[buffers_count*buffer_size]; - if (buffers == 0) - { - printf("error allocating buffers\n"); - } - memset(buffers, 0, buffers_count*buffer_size); - bool *bufferUsed = new bool[buffers_count]; - memset(bufferUsed, 0, sizeof(bool)*buffers_count); - - int bi = 0; //buffer index - - SamplesPacket* pkt = new SamplesPacket[packetsToBatch]; - int m_bufferFailures = 0; - long bytesSent = 0; - auto t1 = chrono::high_resolution_clock::now(); - auto t2 = chrono::high_resolution_clock::now(); - long totalBytesSent = 0; - - unsigned long outputCounter = 0; - - while (pthis->stopTx.load() == false) - { - for (int i = 0; i < packetsToBatch; ++i) - { - if (pthis->mTxFIFO->pop_front(&pkt[i], 200) == false) - { - printf("Error popping from TX\n"); - if (pthis->stopTx.load() == false) - break; - continue; - } - } - //wait for desired slot buffer to be transferred - if (bufferUsed[bi]) - { - if (pthis->mDataPort->WaitForSending(handles[bi], 1000) == false) - { - ++m_bufferFailures; - } - // Must always call FinishDataXfer to release memory of contexts[i] - long bytesToSend = buffer_size; - bytesSent = pthis->mDataPort->FinishDataSending(&buffers[bi*buffer_size], bytesToSend, handles[bi]); - if (bytesSent > 0) - totalBytesSent += bytesSent; - else - ++m_bufferFailures; - bufferUsed[bi] = false; - } - - memcpy(&buffers[bi*buffer_size], &pkt[0], sizeof(SamplesPacket)*packetsToBatch); - handles[bi] = pthis->mDataPort->BeginDataSending(&buffers[bi*buffer_size], buffer_size); - bufferUsed[bi] = true; - - t2 = chrono::high_resolution_clock::now(); - long timePeriod = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count(); - if (timePeriod >= 1000) - { - float m_dataRate = 1000.0*totalBytesSent / timePeriod; - t1 = t2; - totalBytesSent = 0; -#ifndef NDEBUG - cout << "Tx rate: " << m_dataRate / 1000 << " kB/s\t failures: " << m_bufferFailures << endl; -#endif - LMS_StreamBoard_FIFO<SamplesPacket>::Status txstats = pthis->mTxFIFO->GetStatus(); - pthis->mTxDataRate.store(m_dataRate); - pthis->mTxFIFOfilled.store(100.0*txstats.filledElements / txstats.maxElements); - m_bufferFailures = 0; - } - bi = (bi + 1) & buffers_count_mask; - } - - // Wait for all the queued requests to be cancelled - pthis->mDataPort->AbortSending(); - for (int j = 0; j<buffers_count; j++) - { - long bytesToSend = buffer_size; - if (bufferUsed[bi]) - { - pthis->mDataPort->WaitForSending(handles[j], 1000); - pthis->mDataPort->FinishDataSending(&buffers[j*buffer_size], bytesToSend, handles[j]); - } - } - - delete[] buffers; - delete[] bufferUsed; - delete[] pkt; -#ifndef NDEBUG - printf("Tx finished\n"); -#endif -} - -/** @brief Returns current data state for user interface -*/ -LMS_StreamBoard::DataToGUI LMS_StreamBoard::GetIncomingData() -{ - std::unique_lock<std::mutex> lck(mLockIncomingPacket); - return mIncomingPacket; -} - -/** @brief Returns data rate info and Tx Rx FIFO fill percentage -*/ -LMS_StreamBoard::ProgressStats LMS_StreamBoard::GetStats() -{ - ProgressStats stats; - stats.RxRate_Bps = mRxDataRate.load(); - stats.TxRate_Bps = mTxDataRate.load(); - stats.RxFIFOfilled = mRxFIFOfilled.load(); - stats.TxFIFOfilled = mTxFIFOfilled.load(); - return stats; -} - -/** @brief Helper function to write board spi regiters - @param address spi address - @param data register value -*/ -LMS_StreamBoard::Status LMS_StreamBoard::SPI_write(uint16_t address, uint16_t data) -{ - assert(mDataPort != nullptr); - LMScomms::GenericPacket ctrPkt; - ctrPkt.cmd = CMD_BRDSPI_WR; - ctrPkt.outBuffer.push_back((address >> 8) & 0xFF); - ctrPkt.outBuffer.push_back(address & 0xFF); - ctrPkt.outBuffer.push_back((data >> 8) & 0xFF); - ctrPkt.outBuffer.push_back(data & 0xFF); - mDataPort->TransferPacket(ctrPkt); - return ctrPkt.status == 1 ? SUCCESS : FAILURE; -} - -/** @brief Helper function to read board spi registers - @param address spi address - @return register value -*/ -uint16_t LMS_StreamBoard::SPI_read(uint16_t address) -{ - assert(mDataPort != nullptr); - LMScomms::GenericPacket ctrPkt; - ctrPkt.cmd = CMD_BRDSPI_RD; - ctrPkt.outBuffer.push_back((address >> 8) & 0xFF); - ctrPkt.outBuffer.push_back(address & 0xFF); - mDataPort->TransferPacket(ctrPkt); - if (ctrPkt.status == STATUS_COMPLETED_CMD && ctrPkt.inBuffer.size() >= 4) - return ctrPkt.inBuffer[2] * 256 + ctrPkt.inBuffer[3]; - else - return 0; -} - -/** @brief Changes which frame start to look for when receiving data -*/ -void LMS_StreamBoard::SetRxFrameStart(const bool startValue) -{ - mRxFrameStart.store(startValue); -} - -/** @brief Searches for frame start index in given buffer - @return frameStart index in buffer, -1 if frame start was not found - Frame start indicator is 13th bit inside each I and Q sample -*/ -int LMS_StreamBoard::FindFrameStart(const char* buffer, const int bufLen, const bool frameStart) -{ - int startIndex = -1; - for (int i = 0; i < bufLen; i+=2) - if ((buffer[i+1] & 0x10)>0 == frameStart) - { - startIndex = i; - break; - } - return startIndex; -} - -/** @brief Starts a thread for continuous cyclic transmitting of given samples - @param isamples I channel samples - @param qsamples Q channel samples - @param framesCount number of samples in given arrays - @return 0:success, other:failure -*/ -LMS_StreamBoard::Status LMS_StreamBoard::StartCyclicTransmitting(const int16_t* isamples, const int16_t* qsamples, uint32_t framesCount) -{ - if (mDataPort->IsOpen() == false) - return FAILURE; - - stopTxCyclic.store(false); - threadTxCyclic = std::thread([](LMS_StreamBoard* pthis) - { - const int buffer_size = 65536; - const int buffers_count = 16; // must be power of 2 - const int buffers_count_mask = buffers_count - 1; - int handles[buffers_count]; - memset(handles, 0, sizeof(int)*buffers_count); - char *buffers = NULL; - buffers = new char[buffers_count*buffer_size]; - if (buffers == 0) - { - printf("error allocating buffers\n"); - return 0; - } - memset(buffers, 0, buffers_count*buffer_size); - - //timers for data rate calculation - auto t1 = chrono::high_resolution_clock::now(); - auto t2 = chrono::high_resolution_clock::now(); - - int bi = 0; //buffer index - - //setup output data - int dataIndex = 0; - for (int i = 0; i < buffers_count; ++i) - { - for (int j = 0; j < buffer_size; ++j) - { - buffers[i*buffer_size + j] = pthis->mCyclicTransmittingSourceData[dataIndex]; - ++dataIndex; - if (dataIndex > pthis->mCyclicTransmittingSourceData.size()) - dataIndex = 0; - } - } - - for (int i = 0; i < buffers_count; ++i) - handles[i] = pthis->mDataPort->BeginDataSending(&buffers[i*buffer_size], buffer_size); - - int m_bufferFailures = 0; - int bytesSent = 0; - int totalBytesSent = 0; - int sleepTime = 200; - while (pthis->stopTxCyclic.load() != true) - { - if (pthis->mDataPort->WaitForSending(handles[bi], 1000) == false) - { - ++m_bufferFailures; - } - long bytesToSend = buffer_size; - bytesSent = pthis->mDataPort->FinishDataSending(&buffers[bi*buffer_size], bytesToSend, handles[bi]); - if (bytesSent > 0) - totalBytesSent += bytesSent; - else - { - ++m_bufferFailures; - } - - t2 = chrono::high_resolution_clock::now(); - long timePeriod = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count(); - if (timePeriod >= 1000) - { - pthis->mTxDataRate.store(1000.0*totalBytesSent / timePeriod); - t1 = t2; - totalBytesSent = 0; -#ifndef NDEBUG - printf("Upload rate: %f\t failures:%li\n", 1000.0*totalBytesSent / timePeriod, m_bufferFailures); -#endif - m_bufferFailures = 0; - } - - //fill up next buffer - for (int j = 0; j < buffer_size; ++j) - { - buffers[bi*buffer_size + j] = pthis->mCyclicTransmittingSourceData[dataIndex]; - ++dataIndex; - if (dataIndex >= pthis->mCyclicTransmittingSourceData.size()) - dataIndex = 0; - } - - // Re-submit this request to keep the queue full - handles[bi] = pthis->mDataPort->BeginDataSending(&buffers[bi*buffer_size], buffer_size); - bi = (bi + 1) & buffers_count_mask; - } - - // Wait for all the queued requests to be cancelled - pthis->mDataPort->AbortSending(); - for (int j = 0; j < buffers_count; j++) - { - long bytesToSend = buffer_size; - pthis->mDataPort->WaitForSending(handles[j], 1000); - pthis->mDataPort->FinishDataSending(&buffers[j*buffer_size], bytesToSend, handles[j]); - } -#ifndef NDEBUG - printf("Cyclic transmitting FULLY STOPPED\n"); -#endif - delete[] buffers; - return 0; - }, this); - mTxCyclicRunning.store(true); - - return LMS_StreamBoard::SUCCESS; -} - -/** @brief Stops cyclic transmitting thread -*/ -LMS_StreamBoard::Status LMS_StreamBoard::StopCyclicTransmitting() -{ - stopTxCyclic.store(true); - if (mTxCyclicRunning.load() == true) - { - threadTxCyclic.join(); - mTxCyclicRunning.store(false); - } - return LMS_StreamBoard::SUCCESS; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard.h deleted file mode 100644 index 99b363633607c8fb7d8b88c316bb1c44cfd68da8..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard.h +++ /dev/null @@ -1,107 +0,0 @@ -#ifndef STREAM_BOARD_API_H -#define STREAM_BOARD_API_H - -#include <stdint.h> -#include <mutex> -#include <atomic> -#include <thread> -#include "LMS_StreamBoard_FIFO.h" - -class LMScomms; - -class LMS_StreamBoard -{ -public: - struct SamplesPacket - { - public: - SamplesPacket() : channel(0) - {} - ~SamplesPacket() - {} - - SamplesPacket& operator=(const SamplesPacket& obj) - { - memcpy(this->iqdata, obj.iqdata, sizeof(float)*samplesCount); - this->channel = obj.channel; - return *this; - } - const static int samplesCount = 32768; - float iqdata[samplesCount]; - int channel; - }; - - - enum Status - { - SUCCESS, - FAILURE, - }; - - static Status CaptureIQSamples(LMScomms* serPort, int16_t *isamples, int16_t *qsamples, uint32_t framesCount, bool frameStart); - static Status UploadIQSamples(LMScomms* serPort, int16_t *isamples, int16_t *qsamples, uint32_t framesCount); - static Status ConfigurePLL(LMScomms *serPort, const float fOutTx_MHz, const float fOutRx_MHz, const float phaseShift_deg); - - struct DataToGUI - { - std::vector<double> samplesI; - std::vector<double> samplesQ; - std::vector<double> fftBins_dbFS; - float nyquist_MHz; - }; - - struct ProgressStats - { - float RxRate_Bps; - float TxRate_Bps; - float RxFIFOfilled; - float TxFIFOfilled; - }; - - LMS_StreamBoard(LMScomms* dataPort); - virtual ~LMS_StreamBoard(); - - void SetRxFrameStart(const bool startValue); - virtual Status StartReceiving(unsigned int fftSize); - virtual Status StopReceiving(); - - virtual Status StartCyclicTransmitting(const int16_t* isamples, const int16_t* qsamples, uint32_t framesCount); - virtual Status StopCyclicTransmitting(); - - DataToGUI GetIncomingData(); - ProgressStats GetStats(); - - Status SPI_write(uint16_t address, uint16_t data); - uint16_t SPI_read(uint16_t address); -protected: - static int FindFrameStart(const char* buffer, const int bufLen, const bool frameStart); - std::mutex mLockIncomingPacket; - DataToGUI mIncomingPacket; - - LMS_StreamBoard_FIFO<SamplesPacket> *mRxFIFO; - LMS_StreamBoard_FIFO<SamplesPacket> *mTxFIFO; - - static void ReceivePackets(LMS_StreamBoard* pthis); - static void TransmitPackets(LMS_StreamBoard* pthis); - - std::atomic_bool mRxFrameStart; - std::atomic_bool mStreamRunning; - std::atomic_bool stopRx; - std::atomic_bool stopTx; - - std::thread threadRx; - std::thread threadTx; - LMScomms* mDataPort; - - std::atomic<unsigned long> mRxDataRate; - std::atomic<unsigned long> mTxDataRate; - std::atomic<int> mRxFIFOfilled; - std::atomic<int> mTxFIFOfilled; - - std::vector<int16_t> mCyclicTransmittingSourceData; - std::atomic_bool mTxCyclicRunning; - std::thread threadTxCyclic; - std::atomic_bool stopTxCyclic; -}; -#endif - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard_FIFO.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard_FIFO.h deleted file mode 100644 index 833f7a37c008c63123ca4774e8477b78037ca8a8..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard_FIFO.h +++ /dev/null @@ -1,122 +0,0 @@ -/** -@file LMS_StreamBoard_FIFO.h -@author Lime Microsystems (www.limemicro.com) -@brief blocking FIFO for packets storing -*/ - -#ifndef LMS_STREAMBOARD_FIFO_H -#define LMS_STREAMBOARD_FIFO_H - -#include <string.h> -#include <stdio.h> -#include <assert.h> -#include <vector> -#include <mutex> -#include <chrono> -#include <condition_variable> - -template<class T> -class LMS_StreamBoard_FIFO -{ -private: - LMS_StreamBoard_FIFO(){}; -public: - struct Status - { - uint32_t maxElements; - uint32_t filledElements; - uint32_t head; - uint32_t tail; - }; - - LMS_StreamBoard_FIFO(uint64_t FIFO_length) - { - mHead = 0; - mTail = 0; - mElements.resize(FIFO_length); - mElementsFilled = 0; - } - - ~LMS_StreamBoard_FIFO() - { - - } - - /** @brief Copies given src element to queue. - @param src Source data - @return true if element was inserted - - Copies element to queue. This function blocks until element is copied to - queue or certain amount of time has passed. - */ - bool push_back(const T &src, unsigned int timeout_ms = 200) - { - std::unique_lock<std::mutex> lck(mElementsLock); - while (mElementsFilled == mElements.size()) - { - if (canWrite.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) - return false; - } - memcpy(&mElements[mTail], &src, sizeof(T)); - mTail = (mTail+1) % mElements.size(); - ++mElementsFilled; - canRead.notify_one(); - return true; - } - - /** @brief Copies and removes first element from queue to dest. - @param dest destination container for data - @return true if element was copied - Copies element from queue to destination and then removes it. - This function blocks until element is returned, or certain amount of time - has passed. - */ - bool pop_front(T *dest, unsigned int timeout_ms = 200) - { - assert(dest != nullptr); - std::unique_lock<std::mutex> lck(mElementsLock); - while (mElementsFilled == 0) - { - if (canRead.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) - return false; - } - if (mElementsFilled == 0) - return false; - *dest = mElements[mHead]; - memcpy(dest, &mElements[mHead], sizeof(T)); - mHead = (mHead + 1) % mElements.size(); - --mElementsFilled; - canWrite.notify_one(); - return true; - } - void reset() - { - std::unique_lock<std::mutex> lck(mElementsLock); - mElementsFilled = 0; - mHead = 0; - mTail = 0; - } - - Status GetStatus() - { - Status stats; - std::unique_lock<std::mutex> lck(mElementsLock); - stats.maxElements = mElements.size(); - stats.filledElements = mElementsFilled; - stats.head = mHead; - stats.tail = mTail; - return stats; - }; - -protected: - uint32_t mHead; //reading pos - uint32_t mTail; //writing pos - uint32_t mElementsFilled; - - std::mutex mElementsLock; // condition variable for critical section - std::vector<T> mElements; - std::condition_variable canWrite; - std::condition_variable canRead; -}; - -#endif // LMS_STREAMBOARD_FIFO_H diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/lms7002_defines.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/lms7002_defines.h deleted file mode 100644 index c098dfe9657d2e80be7ad38599124090ed96cfae..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/lms7002_defines.h +++ /dev/null @@ -1,215 +0,0 @@ -/** -@file lms7002_defines.h -@author Lime Microsystems -@brief enumerations of available LMS7002M commands and statuses -*/ -#pragma once - -const int LMS_RST_DEACTIVATE = 0; -const int LMS_RST_ACTIVATE = 1; -const int LMS_RST_PULSE = 2; - -enum eLMS_DEV -{ - LMS_DEV_UNKNOWN, - LMS_DEV_EVB6, - LMS_DEV_DIGIGREEN, - LMS_DEV_DIGIRED, - LMS_DEV_EVB7, - LMS_DEV_ZIPPER, - LMS_DEV_SOCKETBOARD, - LMS_DEV_EVB7V2, - LMS_DEV_STREAM, - LMS_DEV_NOVENA, - LMS_DEV_DATASPARK, - LMS_DEV_RFSPARK, - LMS_DEV_LMS6002USB, - LMS_DEV_RFESPARK, - - LMS_DEV_COUNT -}; - -const char LMS_DEV_NAMES[][80] = -{ - "UNKNOWN", - "EVB6", - "DigiGreen", - "DigiRed", - "EVB7", - "ZIPPER", - "Socket Board", - "EVB7_v2", - "Stream", - "Novena", - "DataSpark", - "RF-Spark", - "LMS6002-USB Stick", - "RF-ESpark" -}; - -static const char* GetDeviceName(const eLMS_DEV device) -{ - if (LMS_DEV_UNKNOWN < device && device < LMS_DEV_COUNT) - return LMS_DEV_NAMES[device]; - else - return LMS_DEV_NAMES[LMS_DEV_UNKNOWN]; -} - -enum eEXP_BOARD -{ - EXP_BOARD_UNKNOWN, - EXP_BOARD_UNSUPPORTED, - EXP_BOARD_NO, - EXP_BOARD_MYRIAD1, - EXP_BOARD_MYRIAD2, - EXP_BOARD_MYRIAD_NOVENA, - EXP_BOARD_HPM1000, - EXP_BOARD_MYRIAD7, - EXP_BOARD_HPM7, - - EXP_BOARD_COUNT -}; - -const char EXP_BOARD_NAMES[][80] = -{ - "UNKNOWN", - "UNSUPPORTED", - "NOT AVAILABLE", - "Myriad1", - "Myriad2", - "Novena", - "HPM1000", - "Myriad7", - "HMP7" -}; - -static const char* GetExpansionBoardName(const eEXP_BOARD board) -{ - if (EXP_BOARD_UNKNOWN < board && board < EXP_BOARD_COUNT) - return EXP_BOARD_NAMES[board]; - else - return EXP_BOARD_NAMES[EXP_BOARD_UNKNOWN]; -} - -struct LMS64C_Info -{ - unsigned char firmware; - unsigned char deviceType; - unsigned char protocol; - unsigned char hardware; - unsigned char expansionBoard; -}; - -enum eCMD_LMS -{ - CMD_GET_INFO = 0x00, - CMD_LMS6002_RST = 0x10, - ///Writes data to SI5356 synthesizer via I2C - CMD_SI5356_WR = 0x11, - ///Reads data from SI5356 synthesizer via I2C - CMD_SI5356_RD = 0x12, - ///Writes data to SI5351 synthesizer via I2C - CMD_SI5351_WR = 0x13, - ///Reads data from SI5351 synthesizer via I2C - CMD_SI5351_RD = 0x14, - ///PanelBus DVI (HDMI) Transmitter control - CMD_TFP410_WR = 0x15, - ///PanelBus DVI (HDMI) Transmitter control - CMD_TFP410_RD = 0x16, - ///Sets new LMS7002M chip’s RESET pin level (0, 1, pulse) - CMD_LMS7002_RST = 0x20, - ///Writes data to LMS7002M chip via SPI - CMD_LMS7002_WR = 0x21, - ///Reads data from LMS7002M chip via SPI - CMD_LMS7002_RD = 0x22, - ///Writes data to LMS6002 chip via SPI - CMD_LMS6002_WR = 0x23, - ///Reads data from LMS6002 chip via SPI - CMD_LMS6002_RD = 0x24, - - CMD_LMS_LNA = 0x2A, - CMD_LMS_PA = 0x2B, - - CMD_PROG_MCU = 0x2C, - ///Writes data to ADF4002 chip via SPI - CMD_ADF4002_WR = 0x31, - - CMD_USB_FIFO_RST = 0x40, - CMD_PE636040_WR = 0x41, - CMD_PE636040_RD = 0x42, - - CMD_GPIO_WR = 0x51, - CMD_GPIO_RD = 0x52, - - CMD_ALTERA_FPGA_GW_WR = 0x53, - CMD_ALTERA_FPGA_GW_RD = 0x54, - - CMD_BRDSPI_WR = 0x55,//16 bit spi for stream, dataspark control - CMD_BRDSPI_RD = 0x56,//16 bit spi for stream, dataspark control - CMD_BRDSPI8_WR = 0x57, //8 + 8 bit spi for stream, dataspark control - CMD_BRDSPI8_RD = 0x58, //8 + 8 bit spi for stream, dataspark control - - CMD_BRDCONF_WR = 0x5D, //write config data to board - CMD_BRDCONF_RD = 0x5E, //read config data from board - - CMD_ANALOG_VAL_WR = 0x61, //write analog value - CMD_ANALOG_VAL_RD = 0x62, //read analog value - - CMD_MYRIAD_RST = 0x80, - CMD_MYRIAD_WR = 0x81, - CMD_MYRIAD_RD = 0x82, - CMD_MYRIAD_PROG = 0x8C -}; - -enum eCMD_STATUS -{ - STATUS_UNDEFINED, - STATUS_COMPLETED_CMD, - STATUS_UNKNOWN_CMD, - STATUS_BUSY_CMD, - STATUS_MANY_BLOCKS_CMD, - STATUS_ERROR_CMD, - STATUS_WRONG_ORDER_CMD, - STATUS_RESOURCE_DENIED_CMD, - STATUS_COUNT -}; - -static const char status_text[][32]= -{ - "Undefined/Failure", - "Completed", - "Unknown command", - "Busy", - "Too many blocks", - "Error", - "Wrong order", - "Resource denied" -}; - -static const char* status2string(const int status) -{ - if(status >= 0 && status < STATUS_COUNT) - return status_text[status]; - else - return "Unknown status"; -} - -enum eADC_UNITS -{ - RAW, - VOLTAGE, - CURRENT, - RESISTANCE, - POWER, - ADC_UNITS_COUNT -}; - -static const char adc_units_text[][8] = {"", "V", "A", "Ohm", "W"}; - -static const char* adcUnits2string(const unsigned units) -{ - if (units < ADC_UNITS_COUNT) - return adc_units_text[units]; - else - return " unknown"; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/CMakeLists.txt b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/CMakeLists.txt deleted file mode 100644 index d9124aaef13d009fedc0b4fb5dc7b1998701fde2..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/CMakeLists.txt +++ /dev/null @@ -1,34 +0,0 @@ -set(ENABLE_USB_CONNECTION "YES" CACHE BOOL INTERNAL) -set(ENABLE_SPI_CONNECTION "NO" CACHE BOOL INTERNAL) -set(CONNECTION_MANAGER_DIR connectionManager) -set(connectionManager_src_files - ConnectionManager.cpp - ConnectionCOM.cpp - ConnectionManager.h - ConnectionCOM.h - lmsComms.h - lmsComms.cpp -) -if(ENABLE_USB_CONNECTION) - list(APPEND connectionManager_src_files ConnectionUSB.cpp ConnectionUSB.h) - add_definitions(-DENABLE_USB_CONNECTION) -endif() -if(ENABLE_SPI_CONNECTION) - list(APPEND connectionManager_src_files ConnectionSPI.cpp ConnectionSPI.h) - add_definitions(-DENABLE_SPI_CONNECTION) -endif() - -add_library(ConnectionManager STATIC ${connectionManager_src_files}) -target_include_directories(ConnectionManager PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) - -if(WIN32 AND ENABLE_USB_CONNECTION) - find_package(CyAPI REQUIRED) - LINK_DIRECTORIES(${CYAPI_LIBRARIES}) - include_directories(${CYAPI_INCLUDE_DIRS}) - set(CONNECTION_MANAGER_LIBS ${CYAPI_LIBRARIES} SetupAPI) - target_link_libraries(ConnectionManager ${CONNECTION_MANAGER_LIBS}) -endif() -if(UNIX AND ENABLE_USB_CONNECTION) - set(CONNECTION_MANAGER_LIBS usb-1.0 -lpthread) - target_link_libraries(ConnectionManager ${CONNECTION_MANAGER_LIBS}) -endif() diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionCOM.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionCOM.cpp deleted file mode 100644 index 6c7fc0d8290d5c26a8ae575fbcc98b4058cae124..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionCOM.cpp +++ /dev/null @@ -1,596 +0,0 @@ -/** - @file ConnectionCOM.cpp - @author Lime Microsystems (www.limemicro.com) - @brief Implementation of communications through COM port -*/ - -#include "ConnectionCOM.h" - -#include "string.h" -#ifdef __unix__ -#include <fstream> -#include <errno.h> -#include <unistd.h> -#include <termios.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <stdlib.h> -#include <iostream> -#include <stdio.h> -#endif // LINUX - -const int COM_RETRY_INTERVAL = 20; //ms -const int COM_TOTAL_TIMEOUT = 300; //ms - -/** @brief Initializes com port connection -*/ -ConnectionCOM::ConnectionCOM() -{ - currentDeviceIndex = -1; - connected = false; - comPortList.clear(); - m_deviceNames.clear(); - m_connectionType = COM_PORT; -#ifndef __unix__ - hComm = INVALID_HANDLE_VALUE; -#else - hComm = -1; -#endif - comBaudrate = 9600; -} - -/** @brief When object is destroyed it closes it's opened COM port -*/ -ConnectionCOM::~ConnectionCOM() -{ - Close(); -} - -/** @brief Opens connection to first found chip - @return 0-success -*/ -IConnection::DeviceStatus ConnectionCOM::Open() -{ - comPortList.clear(); - if(comPortList.size() == 0) - FindAllComPorts(); - - m_deviceNames.clear(); - if(m_deviceNames.size() == 0) - RefreshDeviceList(); - - for(unsigned int i=0; i<m_deviceNames.size(); i++) - { - if( Open(i) == SUCCESS) - { - currentDeviceIndex = i; - return SUCCESS; - } - } - return FAILURE; -} - -/** @brief Opens connection to selected chip - @param index chip index in device list - @return 0-success -*/ -IConnection::DeviceStatus ConnectionCOM::Open(unsigned index) -{ - unsigned int toOpen = index; - Close(); - if(toOpen < m_deviceNames.size() && m_deviceNames.size() > 0 ) - { - comPortName = m_deviceNames[toOpen]; - IConnection::DeviceStatus status = Open(comPortName.c_str(), comBaudrate); - if( status == SUCCESS ) - currentDeviceIndex = toOpen; - return status; - } - return FAILURE; -} - -/** @brief Closes connection to chip -*/ -void ConnectionCOM::Close() -{ - connected = false; - currentDeviceIndex = -1; -#ifndef __unix__ - if (hComm != INVALID_HANDLE_VALUE) - { - SetCommTimeouts(hComm, &m_ctmoOld); - CloseHandle(hComm); - } - hComm = INVALID_HANDLE_VALUE; -#else - if( hComm >= 0) - { - close(hComm); - } - hComm = -1; -#endif -} - -/** @brief Returns whether chip is connected - @return chip is connected -*/ -bool ConnectionCOM::IsOpen() -{ -#ifndef __unix__ - if (hComm != INVALID_HANDLE_VALUE && TestConnectivity() ) - return true; -#else - if( hComm != -1 && TestConnectivity() ) - return true; -#endif - return false; -} - -int ConnectionCOM::GetOpenedIndex() -{ - return currentDeviceIndex; -} - -/** @brief Sends data through COM port - @param buffer data buffer to send - @param length size of data buffer - @param timeout_ms timeout limit for operation in milliseconds - @return Number of bytes sent -*/ -int ConnectionCOM::Write(const unsigned char *buffer, int length, int timeout_ms) -{ - if(timeout_ms == 0) - { - timeout_ms = COM_TOTAL_TIMEOUT; - } - int retryCount = 0; - const int maxRetries = (timeout_ms/COM_RETRY_INTERVAL) > 1 ? (timeout_ms/COM_RETRY_INTERVAL) : 1; - bool status = false; -#ifndef __unix__ - unsigned long bytesWriten = 0; - m_osWOverlap.InternalHigh = 0; - - for(int i = 0; i<maxRetries && status == false; ++i) - { - if (!WriteFile(hComm, buffer, length , &bytesWriten, NULL)) - { - status = false; - } - else - status = true; - ++retryCount; - } -#else - long bytesWriten = 0; - for(int i = 0; i<maxRetries && bytesWriten == 0; ++i) - { - bytesWriten = write(hComm, buffer, length); - if(bytesWriten <= 0) - { -// if(bytesWriten < 0) -// MessageLog::getInstance()->write("COM PORT: error writing data\n", LOG_ERROR); -// if(bytesWriten == 0) -// MessageLog::getInstance()->write("COM PORT: data bytes sent 0\n", LOG_WARNING); - status = false; - } - else - status = true; - ++retryCount; - } -#endif - if(bytesWriten == length) - status = true; - - return bytesWriten; -} - -/** @brief Reads data from COM port - @param buffer pointer to data buffer for receiving - @param length number of bytes to read - @param timeout_ms timeout limit for operation in milliseconds - @return Number of bytes received -*/ -int ConnectionCOM::Read(unsigned char *buffer, int length, int timeout_ms) -{ - if(timeout_ms == 0) - { - timeout_ms = COM_TOTAL_TIMEOUT; - } - int retryCount = 0; - const int maxRetries = (timeout_ms/COM_RETRY_INTERVAL) > 1 ? (timeout_ms/COM_RETRY_INTERVAL) : 1; - bool status = false; - - memset(buffer, 0, length); - long bytesReaded = 0; - unsigned long totalBytesReaded = 0; - char cRawData[COM_BUFFER_LENGTH]; - unsigned long bytesToRead = length; - - memset(cRawData, '\0', sizeof(cRawData[0])*COM_BUFFER_LENGTH); - - for(int i=0; i<maxRetries && status == false; ++i) - { - memset(cRawData, '\0', sizeof(cRawData[0])*COM_BUFFER_LENGTH); -#ifndef __unix__ - - DWORD bytesReceived = 0; - if ( !ReadFile(hComm, cRawData, bytesToRead, &bytesReceived, NULL) ) - { - status = false; - } - - bytesReaded = bytesReceived; -#else - bytesReaded = read(hComm, cRawData, bytesToRead); - if(bytesReaded <= 0) - { -// if(bytesReaded < 0) -// MessageLog::getInstance()->write("COM PORT: error reading data\n", LOG_ERROR); -// if(bytesReaded == 0) -// MessageLog::getInstance()->write("COM PORT: reading 0 bytes\n", LOG_WARNING); - status = false; - } -#endif - retryCount++; - - for(int j=0; j<bytesReaded; ++j) - { - buffer[totalBytesReaded+j] = cRawData[j]; - } - - totalBytesReaded += bytesReaded; - if(totalBytesReaded == bytesToRead) - status = true; - } - -// ss << " read(" << totalBytesReaded << "): "; -// for(unsigned int i=0; i<64; ++i) -// ss << int2hex(buffer[i], 1) << " "; -// ss << " - retries: " << retryCount-1 << endl; - //MessageLog::getInstance()->write(ss.str(), LOG_DATA); - -// if(retryCount == maxRetries) -// MessageLog::getInstance()->write("COM PORT: read data timeout\n", LOG_WARNING); -// -// if(totalBytesReaded > length) -// MessageLog::getInstance()->write("COM PORT: read data corrupted, received length > requested length\n", LOG_ERROR); - return totalBytesReaded; -} - -/** @brief Searches for available COM ports and adds them to list -*/ -void ConnectionCOM::FindAllComPorts() -{ - Close(); - comPortList.clear(); -#ifndef __unix__ - HKEY hSERIALCOMM; - if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_QUERY_VALUE, &hSERIALCOMM) == ERROR_SUCCESS) - { - // Get the max value name and max value lengths - DWORD dwMaxValueNameLen; - DWORD dwMaxValueLen; - DWORD dwQueryInfo = RegQueryInfoKey(hSERIALCOMM, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &dwMaxValueNameLen, &dwMaxValueLen, NULL, NULL); - if (dwQueryInfo == ERROR_SUCCESS) - { - DWORD dwMaxValueNameSizeInChars = dwMaxValueNameLen + 1; - // Include space for the NULL terminator - DWORD dwMaxValueNameSizeInBytes = dwMaxValueNameSizeInChars*sizeof(TCHAR); - DWORD dwMaxValueDataSizeInChars = dwMaxValueLen / sizeof(TCHAR) + 1; - // Include space for the NULL terminator - DWORD dwMaxValueDataSizeInBytes = dwMaxValueDataSizeInChars*sizeof(TCHAR); - - // Allocate some space for the value name and value data - TCHAR* szValueName = new TCHAR[dwMaxValueNameSizeInChars]; - TCHAR* byValue = new TCHAR[dwMaxValueDataSizeInBytes]; - if (szValueName && byValue) - { - // Enumerate all the values underneath HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM - DWORD dwIndex = 0; - DWORD dwType; - DWORD dwValueNameSize = dwMaxValueNameSizeInChars; - DWORD dwDataSize = dwMaxValueDataSizeInBytes; - memset(szValueName, 0, dwMaxValueNameSizeInBytes); - memset(byValue, 0, dwMaxValueDataSizeInBytes); - LONG nEnum = RegEnumValue(hSERIALCOMM, dwIndex, szValueName, &dwValueNameSize, NULL, &dwType, (LPBYTE)byValue, &dwDataSize); - while (nEnum == ERROR_SUCCESS) - { - // If the value is of the correct type, then add it to the array - if (dwType == REG_SZ) - { - char portname[512]; - TCHAR* szPort = byValue; - int nUserNameLenUnicode = lstrlen( szPort ); // Convert all UNICODE characters - int nUserNameLen = WideCharToMultiByte( CP_ACP, // ANSI Code Page - 0, // No special handling of unmapped chars - (LPCWSTR)szPort, // wide-character string to be converted - nUserNameLenUnicode, - NULL, 0, // No output buffer since we are calculating length - NULL, NULL ); // Unrepresented char replacement - Use Default - TCHAR* pszUserName = new TCHAR[ nUserNameLen ]; // nUserNameLen includes the NULL character - WideCharToMultiByte( CP_ACP, // ANSI Code Page - 0, // No special handling of unmapped chars - (LPCWSTR)szPort, // wide-character string to be converted - nUserNameLenUnicode, - portname, - nUserNameLen, - NULL, NULL ); // Unrepresented char replacement - Use Default - portname[nUserNameLen] = 0; -#ifdef UNICODE - comPortList.push_back(portname); -#else - comPortList.push_back(szPort); -#endif - } - // Prepare for the next time around - dwValueNameSize = dwMaxValueNameSizeInChars; - dwDataSize = dwMaxValueDataSizeInBytes; - memset(szValueName, 0, dwMaxValueNameSizeInBytes); - memset(byValue, 0, dwMaxValueDataSizeInBytes); - ++dwIndex; - nEnum = RegEnumValue(hSERIALCOMM, dwIndex, szValueName, &dwValueNameSize, NULL, &dwType, (LPBYTE)byValue, &dwDataSize); - } - } - delete szValueName; - delete byValue; - } - // Close the registry key now that we are finished with it - RegCloseKey(hSERIALCOMM); - - if (dwQueryInfo != ERROR_SUCCESS) - SetLastError(dwQueryInfo); - } -#else - char tempBuffer[256]; - string result = ""; -#warning Currently searching only for ACM connections - system( "ls /dev | grep ttyACM > /tmp/foundSerialPorts.txt"); - - fstream fin; - fin.open("/tmp/foundSerialPorts.txt", ios::in); - while(!fin.eof()) - { - fin.getline(tempBuffer, 256); - result = "/dev/"; - result.append(tempBuffer); - if( strlen(tempBuffer) > 3 ) //longer than tty - comPortList.push_back(result); - } - fin.close(); -#endif -} - -/** @brief Opens COM port - @param comName COM port name - @param baudrate COM port baudrate - @return 0 on success -*/ -IConnection::DeviceStatus ConnectionCOM::Open(const char *comName, int baudrate) -{ - Close(); - if (strlen(comName) == 0) - return FAILURE; - - DeviceStatus errorCode = SUCCESS; - -#ifndef __unix__ - // Initialize Overlap structures - m_osROverlap.Internal = 0; - m_osROverlap.InternalHigh = 0; - m_osROverlap.Offset = 0; - m_osROverlap.OffsetHigh = 0; - m_osROverlap.hEvent = CreateEvent(NULL, false, false, NULL); - - m_osWOverlap.Internal = 0; - m_osWOverlap.InternalHigh = 0; - m_osWOverlap.Offset = 0; - m_osWOverlap.OffsetHigh = 0; - m_osWOverlap.hEvent = CreateEvent(NULL, false, false, NULL); - - // Initialize DSB structure - memset(&m_dcbCommPort, 0, sizeof(m_dcbCommPort)); - - m_dcbCommPort.BaudRate = comBaudrate; - m_dcbCommPort.fBinary = 1; - m_dcbCommPort.fParity = 0; - m_dcbCommPort.fOutxCtsFlow = 0; - m_dcbCommPort.fOutxDsrFlow = 0; - m_dcbCommPort.fDtrControl = 0; - m_dcbCommPort.fDsrSensitivity = 0; - m_dcbCommPort.fTXContinueOnXoff = 0; - m_dcbCommPort.fOutX = 0; - m_dcbCommPort.fInX = 0; - m_dcbCommPort.fErrorChar = 0; - m_dcbCommPort.fNull = 0; - m_dcbCommPort.fRtsControl = 0; - m_dcbCommPort.fAbortOnError = 0; - m_dcbCommPort.fDummy2 = 0; - // m_dcbCommPort.wReserved = 0; - m_dcbCommPort.XonLim = 512; - m_dcbCommPort.XoffLim = 512; - m_dcbCommPort.ByteSize = 8; - m_dcbCommPort.Parity = 0; - m_dcbCommPort.StopBits = 0; - //m_dcbCommPort.StopBits = 1; - m_dcbCommPort.XonChar = 17; - m_dcbCommPort.XoffChar = 19; - m_dcbCommPort.ErrorChar = 0; - m_dcbCommPort.EofChar = 26; - m_dcbCommPort.EvtChar = 0; - m_dcbCommPort.wReserved1 = 0; - m_dcbCommPort.DCBlength = sizeof(DCB); - - // Initialize Timeout's - m_ctmoNew.ReadIntervalTimeout = 50; - m_ctmoNew.ReadTotalTimeoutMultiplier = 0; - m_ctmoNew.ReadTotalTimeoutConstant = 100; // 1; - m_ctmoNew.WriteTotalTimeoutMultiplier = 0; - m_ctmoNew.WriteTotalTimeoutConstant = 100; - - // Open COM port - string stmp; - stmp = "\\\\.\\"; - stmp.append(comName); - hComm = CreateFileA(stmp.c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); - - if (hComm != INVALID_HANDLE_VALUE) - { - // Set Events - if (!SetCommMask(hComm, 0)) - errorCode = FAILURE; - - // Set Timeouts - GetCommTimeouts(hComm, &m_ctmoOld); - if (!SetCommTimeouts(hComm, &m_ctmoNew)) - errorCode = FAILURE; - - // Set DCB - if (!SetCommState(hComm, &m_dcbCommPort)) - errorCode = FAILURE; - } - else - { - errorCode = FAILURE; - }; - - // Check the results - if (errorCode != 0) - { - //unsigned long err = GetLastError(); - CloseHandle(hComm); - hComm = INVALID_HANDLE_VALUE; - return errorCode; - } - else - { - PurgeComm(hComm, PURGE_TXCLEAR | PURGE_RXCLEAR); - return SUCCESS; - } -#else - hComm = open(comName, O_RDWR | O_NOCTTY | O_SYNC); - if(hComm < 0) - { -// printf("%s",strerror(errno)); -// MessageLog::getInstance()->write("Connection manager: failed opening COM port\n", LOG_ERROR); - return FAILURE; - } - - struct termios tty; - memset(&tty, 0, sizeof(tty)); - if( tcgetattr(hComm, &tty) != 0) - { -// MessageLog::getInstance()->write("Connection Manager: error from tcgetattr\n", LOG_ERROR); - return FAILURE; - } - int speed = B9600; - cfsetospeed(&tty, speed); - cfsetispeed(&tty, speed); - - tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; - tty.c_iflag &= ~IGNBRK; - tty.c_lflag = 0; - tty.c_oflag = 0; - tty.c_cc[VMIN] = 0; // read non blocking - tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout - - tty.c_iflag &= ~(IXON | IXOFF | IXANY); - tty.c_cflag |= (CLOCAL | CREAD); - - if(tcsetattr(hComm, TCSANOW, &tty) != 0) - { -// MessageLog::getInstance()->write("Connection manager: error from tcsetattr\n", LOG_ERROR); - return FAILURE; - } -#endif - return SUCCESS; -} - -/** @brief Checks if chip is connected to currently open port - @return chip is connected -*/ -bool ConnectionCOM::TestConnectivity() -{ -//currently set to always return true to show all com ports - return true; -#ifndef __unix__ - if (hComm != INVALID_HANDLE_VALUE) -#else - if( hComm >= 0) -#endif - { -// unsigned char out[64]; -// unsigned char in[64]; -// memset(in, 0, 64); -// out[0] = CMD_GET_INFO; -// SendData(out, 64); -// ReadData(in, 64); -// if(in[0] == CMD_GET_INFO && in[1] == 0x01) -// return true; -// else -// return false; - } - return false; -} - -/** @brief Finds all chips connected to com ports - @return number of devices found -*/ -int ConnectionCOM::RefreshDeviceList() -{ - int wasOpen = -1; - string wasOpenName = ""; - if(IsOpen()) - { - wasOpen = GetOpenedIndex(); - wasOpenName = comPortName; - } - Close(); - comPortList.clear(); - if(comPortList.size() == 0) - FindAllComPorts(); - - m_deviceNames.clear(); - string comName; - for(unsigned int i=0; i<comPortList.size(); i++) - { - comName = comPortList[i]; -#ifndef __unix__ - if( Open(comName.c_str(), comBaudrate) == SUCCESS) - { - if( TestConnectivity() ) //if responds add it to device list - m_deviceNames.push_back(comName); - } - Close(); -#else - m_deviceNames.push_back(comName); -#endif - } - if(wasOpen != -1) - { - for(unsigned i=0; i<m_deviceNames.size(); ++i) - if(m_deviceNames[i] == wasOpenName) - { - Open(i); - break; - } - } - return m_deviceNames.size(); -} - -/** @brief Returns found devices names - @return vector of device names -*/ -vector<string> ConnectionCOM::GetDeviceNames() -{ - return m_deviceNames; -} - -/** @brief Purges communication buffers -*/ -void ConnectionCOM::ClearComm() -{ -#ifndef __unix__ - PurgeComm(hComm, PURGE_TXCLEAR|PURGE_RXCLEAR); -#endif -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionCOM.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionCOM.h deleted file mode 100644 index 0549472db1b9efb7312d75f906b3c7614e1455a7..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionCOM.h +++ /dev/null @@ -1,62 +0,0 @@ -/** -@file ConnectionCOM.h -@author Lime Microsystems (www.limemicro.com) -@brief Class for data communications through COM port -*/ - -#ifndef CONNECTION_COM_PORT_H -#define CONNECTION_COM_PORT_H - -#ifndef __unix__ - #include "windows.h" -#endif - -#include "IConnection.h" - -class ConnectionCOM : public IConnection -{ -public: - static const int COM_BUFFER_LENGTH = 1024; //max buffer size for data - - ConnectionCOM(); - ~ConnectionCOM(); - - DeviceStatus Open(); - DeviceStatus Open(unsigned i); - void Close(); - bool IsOpen(); - int GetOpenedIndex(); - - int Write(const unsigned char *buffer, int length, int timeout_ms = 0); - int Read(unsigned char *buffer, int length, int timeout_ms = 0); - - std::vector<std::string> GetDeviceNames(); - int RefreshDeviceList(); - void ClearComm(); -private: - void FindAllComPorts(); - DeviceStatus Open(const char *comName, int baudrate); - - bool TestConnectivity(); - - std::string comPortName; - int comBaudrate; - bool connected; - - int currentDeviceIndex; - std::vector<std::string> comPortList; - std::vector<std::string> m_deviceNames; - -#ifndef __unix__ - HANDLE hComm; - COMMTIMEOUTS m_ctmoNew; - COMMTIMEOUTS m_ctmoOld; - OVERLAPPED m_osROverlap; - OVERLAPPED m_osWOverlap; - DCB m_dcbCommPort; -#else - int hComm; //com port file descriptor -#endif - -}; -#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionManager.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionManager.cpp deleted file mode 100644 index 9ec16e0d8845a9902ce9bffa4ea9b5e1309a91a4..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionManager.cpp +++ /dev/null @@ -1,319 +0,0 @@ -/** - @file ConnectionManager.cpp - @author Lime Microsystems (www.limemicro.com) - @brief Implementation of various connection types to devices -*/ - -#include "ConnectionManager.h" -#include "ConnectionCOM.h" - -#ifdef ENABLE_USB_CONNECTION - #include "ConnectionUSB.h" -#endif -#ifdef ENABLE_SPI_CONNECTION - #include "ConnectionSPI.h" -#endif - -#include <sstream> -#include <iomanip> -#include <iostream> - -/** @brief Creates connection interfaces -*/ -ConnectionManager::ConnectionManager(const IConnection::eConnectionType port_type) : activeControlPort(NULL) -{ - mLogData = false; - mOpenedDevice = -1; - if (port_type == IConnection::COM_PORT) - m_connections[IConnection::COM_PORT] = new ConnectionCOM(); -#ifdef ENABLE_USB_CONNECTION - if (port_type == IConnection::USB_PORT) - m_connections[IConnection::USB_PORT] = new ConnectionUSB(); -#endif -#ifdef ENABLE_SPI_CONNECTION - m_connections[IConnection::SPI_PORT] = new ConnectionSPI(); -#endif -} - -/** @brief Destroys connection interfaces -*/ -ConnectionManager::~ConnectionManager() -{ - for (auto iter = m_connections.begin(); iter != m_connections.end(); ++iter) - { - delete iter->second; - } -} - -/** @brief Checks if connection to device is opened - @return True if device is connected -*/ -bool ConnectionManager::IsOpen() -{ - return activeControlPort ? activeControlPort->IsOpen() : false; -} - -/** @brief Opens connection to first available device - @return True if connected to device -*/ -bool ConnectionManager::Open() -{ - return Open(0); -} - -/** @brief Connects to selected device - @param i device index from device list - @return 1:Success, 0:failure -*/ -int ConnectionManager::Open(unsigned i) -{ - if(i >= mDevices.size()) - return 0; - - if(activeControlPort) - activeControlPort->Close(); - switch(mDevices[i].port) - { - case IConnection::COM_PORT: - activeControlPort = m_connections[IConnection::COM_PORT]; - break; - case IConnection::USB_PORT: - activeControlPort = m_connections[IConnection::USB_PORT]; - break; - case IConnection::SPI_PORT: - activeControlPort = m_connections[IConnection::SPI_PORT]; - break; - default: - return 0; - } - mOpenedDevice = -1; - if( i < mDevices.size() ) - { - if (activeControlPort->Open(mDevices[i].portIndex) == IConnection::SUCCESS) - { - mOpenedDevice = i; - return 1; - } - } - return 0; -} - -/** @brief Closes connection to device -*/ -void ConnectionManager::Close() -{ - if(activeControlPort) - { - activeControlPort->Close(); - //Notify(LMS_Message(MSG_BOARD_DISCONNECTED, "", 0, 0)); - } - mOpenedDevice = -1; -} - -/** @brief Finds all currently connected devices and forms device list - @return number of devices found -*/ -int ConnectionManager::RefreshDeviceList() -{ - mDeviceList.clear(); - mDevices.clear(); - DeviceInfo dev; - for (auto iter = m_connections.begin(); iter != m_connections.end(); ++iter) - { - vector<string> names; - IConnection *port = iter->second; - if(port->RefreshDeviceList() > 0) - { - names = port->GetDeviceNames(); - for(unsigned i=0; i<names.size(); ++i) - { - dev.name = names[i]; - dev.port = iter->first; - dev.portIndex = i; - mDevices.push_back(dev); - } - } - } - for(unsigned i=0; i<mDevices.size(); ++i) - mDeviceList.push_back(mDevices[i].name); - return mDevices.size(); -} - -/** @brief Returns currently opened connection index -*/ -int ConnectionManager::GetOpenedIndex() -{ - return mOpenedDevice; -} - -/** @brief Writes given data to currently opened connection - @param buffer outcomming data buffer - @param length bytes to write - @param timeout_ms timeout in milliseconds - @return number of bytes written, on failure negative values -*/ -int ConnectionManager::Write(const unsigned char *buffer, const int length, int timeout_ms) -{ - if(activeControlPort) - { - int bytesTransferred = activeControlPort->Write(buffer, length, timeout_ms); -#ifndef NDEBUG - if(mLogData) - { - stringstream ss; - ss << "WR(" << (bytesTransferred>=0?bytesTransferred: 0) << "): "; - ss << std::hex << std::setfill('0'); - int repeatedZeros = 0; - for(int i=length-1; i>=0; --i) - if(buffer[i] == 0) - ++repeatedZeros; - else break; - if(repeatedZeros == 1) - repeatedZeros = 0; - repeatedZeros = repeatedZeros - (repeatedZeros & 0x1); - for(int i=0; i<length-repeatedZeros; ++i) - //casting to short to print as numbers - ss << " " << std::setw(2) << (unsigned short)buffer[i]; - if(repeatedZeros > 1) - ss << " (00 x " << std::dec << repeatedZeros << " times)"; - cout << ss.str() << endl; -#ifndef __unix__ - OutputDebugString(ss.str().c_str()); -#endif - } -#endif - return bytesTransferred; - } - return -1; -} - -/** @brief Receives data from currently opened connection - @param buffer incomming data buffer, must be big enough for length bytes - @param length bytes to read - @param timeout_ms timeout in milliseconds - @return number of bytes received -*/ -int ConnectionManager::Read(unsigned char *buffer, int length, int timeout_ms) -{ - if(activeControlPort) - { - int bytesTransferred = activeControlPort->Read(buffer, length, timeout_ms); -#ifndef NDEBUG - if(mLogData) - { - stringstream ss; - ss << "RD(" << (bytesTransferred>=0?bytesTransferred: 0) << "): "; - ss << std::hex << std::setfill('0'); - int repeatedZeros = 0; - for(int i=length-1; i>=0; --i) - if(buffer[i] == 0) - ++repeatedZeros; - else break; - if(repeatedZeros == 2) - repeatedZeros = 0; - repeatedZeros = repeatedZeros - (repeatedZeros & 0x1); - for(int i=0; i<length-repeatedZeros; ++i) - //casting to short to print as numbers - ss << " " << std::setw(2) << (unsigned short)buffer[i]; - if(repeatedZeros > 2) - ss << " (00 x " << std::dec << repeatedZeros << " times)"; - cout << ss.str() << endl; - } -#endif - return bytesTransferred; - } - return -1; -} - -int ConnectionManager::WriteStream(const char *buffer, int length) -{ - return 0; -} - -int ConnectionManager::ReadStream(char *buffer, int length, unsigned int timeout_ms) -{ - /*int handle = activeControlPort->BeginDataReading(buffer, length); - activeControlPort->WaitForReading(handle, timeout_ms); - long received = length; - activeControlPort->FinishDataReading(buffer, received, handle); - return received; - */ - long len = length; - int status = activeControlPort->ReadDataBlocking(buffer, len, 0); - return len; -} - - -int ConnectionManager::BeginDataReading(char *buffer, long length) -{ - return activeControlPort->BeginDataReading(buffer, length); -} -/** -@brief Blocks until data is received or set number of milliseconds have passed. -@param contextHandle handle returned by BeginDataReading() -@param timeout_ms number of milliseconds to wait -@return 1-data received, 0-data not received -*/ -int ConnectionManager::WaitForReading(int contextHandle, unsigned int timeout_ms) -{ - return activeControlPort->WaitForReading(contextHandle, timeout_ms); -} -/** -@brief Finished asynchronous data reading. -@param buffer where to put received data -@param length number of bytes to read, will be changed to actual number of bytes received -@param contextHandle context handle returned by BeginDataReading() -@return received data length -*/ -int ConnectionManager::FinishDataReading(char *buffer, long &length, int contextHandle) -{ - return activeControlPort->FinishDataReading(buffer, length, contextHandle); -} - -/** -@brief Aborts reading operations -*/ -void ConnectionManager::AbortReading() -{ - activeControlPort->AbortReading(); -} - -/** -@brief Start asynchronous data sending. -@param buffer data buffer to be sent -@param length number of bytes to send. -@return context handle -*/ -int ConnectionManager::BeginDataSending(const char *buffer, long length) -{ - return activeControlPort->BeginDataSending(buffer, length); -} -/** -@brief Blocks until data is sent or set number of miliseconds have passed. -@param contextHandle handle returned by BeginDataReading() -@param timeout_ms number of miliseconds to wait -@return 1-data sent, 0-data not sent -*/ -int ConnectionManager::WaitForSending(int contextHandle, unsigned int timeout_ms) -{ - return activeControlPort->WaitForSending(contextHandle, timeout_ms); -} -/** -@brief Finished asynchronous data sending. -@param buffer where to put received data -@param length number of bytes to send, will be changed to actual number of bytes sent -@param contextHandle context handle returned by BeginDataReading() -@return sent data length -*/ -int ConnectionManager::FinishDataSending(const char *buffer, long &length, int contextHandle) -{ - return activeControlPort->FinishDataSending(buffer, length, contextHandle); -} - -/** -@brief Aborts sending operations -*/ -void ConnectionManager::AbortSending() -{ - activeControlPort->AbortSending(); -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionManager.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionManager.h deleted file mode 100644 index 68819011ffaca85af49acc67956937144f8dab36..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionManager.h +++ /dev/null @@ -1,60 +0,0 @@ -/** - @file ConnectionManager.h - @author Lime Microsystems (www.limemicro.com) - @brief Class for managing connection to devices -*/ - -#ifndef LMS_CONNECTION_MANAGER_H -#define LMS_CONNECTION_MANAGER_H - -#include "IConnection.h" -#include <map> - -class ConnectionManager -{ -public: - struct DeviceInfo - { - std::string name; - IConnection::eConnectionType port; - int portIndex; - }; - - ConnectionManager(const IConnection::eConnectionType port_type); - ~ConnectionManager(); - bool IsOpen(); - bool Open(); - int Open(unsigned i); - void Close(); - int RefreshDeviceList(); - int GetOpenedIndex(); - std::vector<std::string> GetDeviceList(){return mDeviceList;}; - - int Write(const unsigned char *buffer, int length, int timeout_ms = 0); - int Read(unsigned char *buffer, int length, int timeout_ms = 0); - - int WriteStream(const char *buffer, int length); - int ReadStream(char *buffer, int length, unsigned int timeout_ms); - - int BeginDataReading(char *buffer, long length); - int WaitForReading(int contextHandle, unsigned int timeout_ms); - int FinishDataReading(char *buffer, long &length, int contextHandle); - void AbortReading(); - - int BeginDataSending(const char *buffer, long length); - int WaitForSending(int contextHandle, unsigned int timeout_ms); - int FinishDataSending(const char *buffer, long &length, int contextHandle); - void AbortSending(); - -protected: - bool mLogData; - /// Port used for communication. - IConnection *activeControlPort; - std::vector<DeviceInfo> mDevices; - std::vector<std::string> mDeviceList; - int mOpenedDevice; - std::map<IConnection::eConnectionType, IConnection*> m_connections; -}; - -#endif // LMS_CONNECTION_MANAGER_H - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionSPI.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionSPI.cpp deleted file mode 100644 index fb305f9c1ccfe627c70006f96d84dbc758310056..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionSPI.cpp +++ /dev/null @@ -1,313 +0,0 @@ -/** - @file ConnectionSPI.cpp - @author Lime Microsystems (www.limemicro.com) - @brief Implementation of communications through SPI port -*/ - -#include "ConnectionSPI.h" - -#include "string.h" -#ifdef __unix__ -#include <fstream> -#include <errno.h> -#include <unistd.h> -#include <termios.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <stdlib.h> -#include <stdio.h> -#include <sys/ioctl.h> -#include <linux/types.h> -#include <linux/spi/spidev.h> -#include <linux/i2c-dev.h> -#endif // LINUX - -#include <iostream> -#include <sstream> - -const int ConnectionSPI::cSPI_BUF_SIZE = 128; -const int ConnectionSPI::cSPI_SPEED_HZ = 2000000; - -/** @brief Tries to read EEPROM for Novena board signature - @return true if Novena board -*/ -bool IsNovenaBoard() -{ -#ifdef __unix__ - char data[8]; - int count = 6; - memset(data, 0, 8); - int addr = 0; - struct i2c_rdwr_ioctl_data session; - struct i2c_msg messages[2]; - char set_addr_buf[2]; - memset(set_addr_buf, 0, sizeof(set_addr_buf)); - memset(data, 0, count); - set_addr_buf[0] = addr>>8; - set_addr_buf[1] = addr; - messages[0].addr = 0xac>>1; - messages[0].flags = 0; - messages[0].len = sizeof(set_addr_buf); - messages[0].buf = set_addr_buf; - messages[1].addr = 0xac>>1; - messages[1].flags = I2C_M_RD; - messages[1].len = count; - messages[1].buf = data; - session.msgs = messages; - session.nmsgs = 2; - - bool isNovena = false; - - int fd = open("/dev/i2c-2", O_RDWR); - if(fd > 0) - { - if(ioctl(fd, I2C_RDWR, &session) < 0) - { - perror("Unable to communicate with i2c device"); - isNovena = false; - } - if(strcmp("Novena", data) == 0) - isNovena = true; - } - close(fd); - return isNovena; -#else - return false; -#endif -} - -/** @brief Initializes SPI port and exports needed GPIO -*/ -ConnectionSPI::ConnectionSPI() -{ - fd = -1; - m_connectionType = SPI_PORT; - std::fstream gpio; - //export SEN pin - gpio.open("/sys/class/gpio/export", ios::out); - if(gpio.good()) - { - gpio << 122; - gpio.flush(); - gpio.close(); - gpio.open("/sys/class/gpio/gpio122/direction", ios::out); - gpio << "out"; - gpio.flush(); - gpio.close(); - m_SEN.open("/sys/class/gpio/gpio122/value", ios::out); - m_SEN<< 1; - m_SEN.flush(); - cout << "GPIO122: set to 1" << endl; - } -} - -ConnectionSPI::~ConnectionSPI() -{ - Close(); - m_SEN.close(); -} - -/** @brief Opens connection to first found chip - @return 0-success -*/ -IConnection::DeviceStatus ConnectionSPI::Open() -{ - Close(); -#ifdef __unix__ - fd = open("/dev/spidev2.0", O_RDWR | O_SYNC); - if (fd < 0) - { - //MessageLog::getInstance()->write("SPI PORT: device not found\n", LOG_ERROR); - return IConnection::FAILURE; - } - int mode = SPI_MODE_0; - int ret = ioctl(fd, SPI_IOC_WR_MODE, &mode); - if (ret == -1) - printf("can't set spi mode"); - - ret = ioctl(fd, SPI_IOC_RD_MODE, &mode); - if (ret == -1) - printf("can't get spi mode"); - - /* - * bits per word - */ - int bits = 8; - ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits); - if (ret == -1) - printf("can't set bits per word"); - - ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits); - if (ret == -1) - printf("can't get bits per word"); - - /* - * max speed hz - */ - int speed = cSPI_SPEED_HZ; - ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed); - if (ret == -1) - printf("can't set max speed hz"); - - ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed); - if (ret == -1) - printf("can't get max speed hz"); - - printf("spi mode: 0x%x\n", mode); - printf("bits per word: %d\n", bits); - printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000); - return IConnection::SUCCESS; -#else - return IConnection::FAILURE; -#endif -} - -/** @brief Opens connection to selected chip - @param index chip index in device list - @return 0-success -*/ -IConnection::DeviceStatus ConnectionSPI::Open(unsigned index) -{ - return Open(); -} - -/** @brief Closes connection to chip -*/ -void ConnectionSPI::Close() -{ -#ifdef __unix__ - close(fd); - fd = -1; -#endif -} - -/** @brief Returns whether chip is connected - @return chip is connected -*/ -bool ConnectionSPI::IsOpen() -{ - return (fd >= 0); -} - -/** @brief Sends data through COM port - @param buffer data buffer to send - @param length size of data buffer - @param timeout_ms timeout limit for operation in milliseconds - @return Number of bytes sent -*/ -int ConnectionSPI::Write(const unsigned char *buffer, int length, int timeout_ms) -{ - #ifdef __unix__ - if(fd < 0) - return 0; - m_SEN << 0; - m_SEN.flush(); - unsigned long bytesWritten = 0; - rxbuf.clear(); - int bytesReceived = 0; - char rxbytes[2]; - while(bytesWritten < length) - { - int toWrite = length-bytesWritten > cSPI_BUF_SIZE ? cSPI_BUF_SIZE : length-bytesWritten; - for(int i=0; i<toWrite; i+=2) - { - if(buffer[i] < 0x80) //reading - { - write(fd, &buffer[i+bytesWritten], 2); - bytesReceived += read(fd, rxbytes, 2); - rxbuf.push_back(rxbytes[0]); - rxbuf.push_back(rxbytes[1]); - } - else //writing - { - write(fd, &buffer[i+bytesWritten], 4); - i+=2; //data bytes have been written - } - } -// stringstream ss; -// ss << "write(" << toWrite << "): "; -// for(int i=0; i<toWrite; ++i) -// { -// char ctemp[16]; -// sprintf(ctemp, "%02X", buffer[bytesWritten+i]); -// ss << ctemp << " "; -// } -// ss << endl; -// if(bytesReceived > 0) -// { -// ss << " re443ad(" << toWrite << "): "; -// for(int i=0; i<toWrite; ++i) -// { -// char ctemp[16]; -// sprintf(ctemp, "%02X", rxbuf[bytesWritten+i]); -// ss << ctemp << " "; -// } -// ss << endl; -// } -// cout << ss.str() << endl; -// MessageLog::getInstance()->write(ss.str(), LOG_DATA); - - bytesWritten += toWrite; - } - m_SEN << 1; - m_SEN.flush(); - return bytesWritten; -#else - return 0; -#endif -} - -/** @brief Reads data from COM port - @param buffer pointer to data buffer for receiving - @param length number of bytes to read - @param timeout_ms timeout limit for operation in milliseconds - @return Number of bytes received -*/ -int ConnectionSPI::Read(unsigned char *buffer, int length, int timeout_ms) -{ -#ifdef __unix__ - if(fd < 0) - return 0; - //because transfer is done in full duplex, function returns data from last transfer - int tocpy = length > rxbuf.size() ? rxbuf.size() : length; - memcpy(buffer, &rxbuf[0], tocpy); - rxbuf.clear(); - return tocpy; -#else - return 0; -#endif -} - -/** @brief Finds all chips connected to com ports - @return number of devices found -*/ -int ConnectionSPI::RefreshDeviceList() -{ - m_deviceNames.clear(); -#ifdef __unix__ - int spidev = open("/dev/spidev2.0", O_RDWR); - if (spidev >= 0) - { - if(IsNovenaBoard() == true) - m_deviceNames.push_back("SPI (Novena)"); - else - m_deviceNames.push_back("SPI"); - } - close(spidev); -#endif - return m_deviceNames.size(); -} - -/** @brief Returns found devices names - @return vector of device names -*/ -vector<string> ConnectionSPI::GetDeviceNames() -{ - return m_deviceNames; -} - -int ConnectionSPI::GetOpenedIndex() -{ - return 0; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionSPI.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionSPI.h deleted file mode 100644 index 79d9bd9b9b690c470f156acfb1ebdd2a11e0b4ae..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionSPI.h +++ /dev/null @@ -1,41 +0,0 @@ -/** -@file ConnectionSPI.h -@author Lime Microsystems (www.limemicro.com) -@brief Class for data communications through SPI port -*/ - -#ifndef CONNECTION_SPI_PORT_H -#define CONNECTION_SPI_PORT_H - -#include "IConnection.h" -#include <fstream> -#include <string> -#include <vector> - -class ConnectionSPI : public IConnection -{ -public: - static const int cSPI_BUF_SIZE; - static const int cSPI_SPEED_HZ; - - ConnectionSPI(); - ~ConnectionSPI(); - - DeviceStatus Open(); - DeviceStatus Open(unsigned i); - void Close(); - bool IsOpen(); - int GetOpenedIndex(); - - int Write(const unsigned char *buffer, int length, int timeout_ms = 0); - int Read(unsigned char *buffer, int length, int timeout_ms = 0); - - std::vector<std::string> GetDeviceNames(); - int RefreshDeviceList(); -protected: - std::vector<std::string> m_deviceNames; - std::vector<unsigned char> rxbuf; - int fd; - std::fstream m_SEN; -}; -#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionUSB.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionUSB.cpp deleted file mode 100644 index 148b7b776bc776c8ac5f7fbd2bb1bc923a98dbb4..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionUSB.cpp +++ /dev/null @@ -1,771 +0,0 @@ -/** -@file ConnectionUSB.cpp -@author Lime Microsystems (www.limemicro.com) -@brief Data writing and reading through USB port -*/ - -#include "ConnectionUSB.h" -#include <string.h> - -#ifdef __unix__ - #include <thread> - #include <chrono> -#endif - -#define USB_TIMEOUT 1000 - -#define HW_LDIGIRED L"DigiRed" -#define HW_LDIGIGREEN L"DigiGreen" -#define HW_LSTREAMER L"Stream" - -#define HW_DIGIRED "DigiRed" -#define HW_DIGIGREEN "DigiGreen" -#define HW_STREAMER "Stream" - -#define CTR_W_REQCODE 0xC1 -#define CTR_W_VALUE 0x0000 -#define CTR_W_INDEX 0x0000 - -#define CTR_R_REQCODE 0xC0 -#define CTR_R_VALUE 0x0000 -#define CTR_R_INDEX 0x0000 - -/** @brief Initializes port type and object necessary to communicate to usb device. -*/ -ConnectionUSB::ConnectionUSB() -{ - m_hardwareName = ""; - isConnected = false; - m_connectionType = USB_PORT; -#ifndef __unix__ - USBDevicePrimary = new CCyUSBDevice(NULL); - OutCtrEndPt = NULL; - InCtrEndPt = NULL; - InCtrlEndPt3 = NULL; - OutCtrlEndPt3 = NULL; -#else - dev_handle = 0; - devs = 0; - int r = libusb_init(&ctx); //initialize the library for the session we just declared - if(r < 0) - printf("Init Error %i\n", r); //there was an error - libusb_set_debug(ctx, 3); //set verbosity level to 3, as suggested in the documentation -#endif - currentDeviceIndex = -1; -} - -/** @brief Closes connection to chip and deallocates used memory. -*/ -ConnectionUSB::~ConnectionUSB() -{ - Close(); -#ifndef __unix__ - delete USBDevicePrimary; -#else - libusb_exit(ctx); -#endif -} - -/** @brief Automatically open first available chip connected to usb port. - @return 0-success, other-failure -*/ -IConnection::DeviceStatus ConnectionUSB::Open() -{ - currentDeviceIndex = -1; - if(m_deviceNames.size() == 0) - RefreshDeviceList(); - -#ifndef __unix__ - for(int i=0; i<USBDevicePrimary->DeviceCount(); ++i) - if( Open(i) == SUCCESS) - { - currentDeviceIndex = i; - return SUCCESS; - } -#else - if(Open(0) == SUCCESS) - return SUCCESS; -#endif - return FAILURE; -} - -/** @brief Tries to open connected USB device and find communication endpoints. - @return Returns 1-Success, 0-EndPoints not found or device didn't connect. -*/ -IConnection::DeviceStatus ConnectionUSB::Open(unsigned index) -{ -#ifndef __unix__ - wstring m_hardwareDesc = L""; - if( index < USBDevicePrimary->DeviceCount()) - { - if(USBDevicePrimary->Open(index)) - { - m_hardwareDesc = USBDevicePrimary->Product; - unsigned int pos; - //determine connected board type - pos = m_hardwareDesc.find(HW_LDIGIRED, 0); - if( pos != wstring::npos ) - m_hardwareName = HW_DIGIRED; - else if (m_hardwareDesc.find(HW_LSTREAMER, 0) != wstring::npos) - m_hardwareName = HW_STREAMER; - else - m_hardwareName = HW_STREAMER; - - - if (InCtrlEndPt3) - { - delete InCtrlEndPt3; - InCtrlEndPt3 = NULL; - } - InCtrlEndPt3 = new CCyControlEndPoint(*USBDevicePrimary->ControlEndPt); - - if (OutCtrlEndPt3) - { - delete OutCtrlEndPt3; - OutCtrlEndPt3 = NULL; - } - OutCtrlEndPt3 = new CCyControlEndPoint(*USBDevicePrimary->ControlEndPt); - - InCtrlEndPt3->ReqCode = CTR_R_REQCODE; - InCtrlEndPt3->Value = CTR_R_VALUE; - InCtrlEndPt3->Index = CTR_R_INDEX; - - OutCtrlEndPt3->ReqCode = CTR_W_REQCODE; - OutCtrlEndPt3->Value = CTR_W_VALUE; - OutCtrlEndPt3->Index = CTR_W_INDEX; - - for (int i=0; i<USBDevicePrimary->EndPointCount(); i++) - if(USBDevicePrimary->EndPoints[i]->Address == 0x01) - { - OutEndPt = USBDevicePrimary->EndPoints[i]; - long len = OutEndPt->MaxPktSize * 64; - OutEndPt->SetXferSize(len); - break; - } - for (int i=0; i<USBDevicePrimary->EndPointCount(); i++) - if(USBDevicePrimary->EndPoints[i]->Address == 0x81) - { - InEndPt = USBDevicePrimary->EndPoints[i]; - long len = InEndPt->MaxPktSize * 64; - InEndPt->SetXferSize(len); - break; - } - isConnected = true; - return SUCCESS; - } //successfully opened device - } //if has devices - return FAILURE; -#else - if(index >= 0 && index < m_dev_pid_vid.size()) - { - dev_handle = libusb_open_device_with_vid_pid(ctx, m_dev_pid_vid[index].second, m_dev_pid_vid[index].first); - - if(dev_handle == 0) - return FAILURE; - if(libusb_kernel_driver_active(dev_handle, 0) == 1) //find out if kernel driver is attached - { - printf("Kernel Driver Active\n"); - if(libusb_detach_kernel_driver(dev_handle, 0) == 0) //detach it - printf("Kernel Driver Detached!\n"); - } - int r = libusb_claim_interface(dev_handle, 0); //claim interface 0 (the first) of device - if(r < 0) - { - printf("Cannot Claim Interface\n"); - return CANNOT_CLAIM_INTERFACE; - } - printf("Claimed Interface\n"); - isConnected = true; - return SUCCESS; - } - else - { - return FAILURE; - } -#endif -} - -/** @brief Closes communication to device. -*/ -void ConnectionUSB::Close() -{ - #ifndef __unix__ - USBDevicePrimary->Close(); - InEndPt = NULL; - OutEndPt = NULL; - if (InCtrlEndPt3) - { - delete InCtrlEndPt3; - InCtrlEndPt3 = NULL; - } - if (OutCtrlEndPt3) - { - delete OutCtrlEndPt3; - OutCtrlEndPt3 = NULL; - } - #else - if(dev_handle != 0) - { - libusb_release_interface(dev_handle, 0); - libusb_close(dev_handle); - dev_handle = 0; - } - #endif - isConnected = false; -} - -/** @brief Returns connection status - @return 1-connection open, 0-connection closed. -*/ -bool ConnectionUSB::IsOpen() -{ - #ifndef __unix__ - return USBDevicePrimary->IsOpen() && isConnected; - #else - return isConnected; - #endif -} - -/** @brief Sends given data buffer to chip through USB port. - @param buffer data buffer, must not be longer than 64 bytes. - @param length given buffer size. - @param timeout_ms timeout limit for operation in milliseconds - @return number of bytes sent. -*/ -int ConnectionUSB::Write(const unsigned char *buffer, const int length, int timeout_ms) -{ - long len = length; - if(IsOpen()) - { - unsigned char* wbuffer = new unsigned char[length]; - memcpy(wbuffer, buffer, length); - if(m_hardwareName == HW_DIGIRED || m_hardwareName == HW_STREAMER) - { - #ifndef __unix__ - if(OutCtrlEndPt3) - OutCtrlEndPt3->Write(wbuffer, len); - else - len = 0; - #else - len = libusb_control_transfer(dev_handle, LIBUSB_REQUEST_TYPE_VENDOR,CTR_W_REQCODE ,CTR_W_VALUE, CTR_W_INDEX, wbuffer, length, USB_TIMEOUT); - #endif - } - else - { - #ifndef __unix__ - if(OutCtrEndPt) - OutCtrEndPt->XferData(wbuffer, len); - else - len = 0; - #else - int actual = 0; - libusb_bulk_transfer(dev_handle, 0x01, wbuffer, len, &actual, USB_TIMEOUT); - len = actual; - #endif - } - delete wbuffer; - } - else - return 0; - return len; -} - -/** @brief Reads data coming from the chip through USB port. - @param buffer pointer to array where received data will be copied, array must be - big enough to fit received data. - @param length number of bytes to read from chip. - @param timeout_ms timeout limit for operation in milliseconds - @return number of bytes received. -*/ -int ConnectionUSB::Read(unsigned char *buffer, const int length, int timeout_ms) -{ - long len = length; - if(IsOpen()) - { - if(m_hardwareName == HW_DIGIRED || m_hardwareName == HW_STREAMER) - { - #ifndef __unix__ - if(InCtrlEndPt3) - InCtrlEndPt3->Read(buffer, len); - else - len = 0; - #else - len = libusb_control_transfer(dev_handle, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_IN ,CTR_R_REQCODE ,CTR_R_VALUE, CTR_R_INDEX, buffer, len, USB_TIMEOUT); - #endif - } - else - { - #ifndef __unix__ - if(InCtrEndPt) - InCtrEndPt->XferData(buffer, len); - else - len = 0; - #else - int actual = 0; - libusb_bulk_transfer(dev_handle, 0x81, buffer, len, &actual, USB_TIMEOUT); - len = actual; - #endif - } - } - return len; -} - -#ifdef __unix__ -/** @brief Function for handling libusb callbacks -*/ -void callback_libusbtransfer(libusb_transfer *trans) -{ - USBTransferContext *context = reinterpret_cast<USBTransferContext*>(trans->user_data); - switch(trans->status) - { - case LIBUSB_TRANSFER_CANCELLED: - printf("Transfer canceled\n" ); - context->bytesXfered = trans->actual_length; - context->done = true; - context->used = false; - context->reset(); - break; - case LIBUSB_TRANSFER_COMPLETED: - if(trans->actual_length == context->bytesExpected) - { - context->bytesXfered = trans->actual_length; - context->done = true; - } - //printf("Transfer complete %i\n", trans->actual_length); - break; - case LIBUSB_TRANSFER_ERROR: - printf("TRANSFER ERRRO\n"); - break; - case LIBUSB_TRANSFER_TIMED_OUT: - printf("transfer timed out\n"); - - break; - case LIBUSB_TRANSFER_OVERFLOW: - printf("transfer overflow\n"); - - break; - case LIBUSB_TRANSFER_STALL: - printf("transfer stalled\n"); - break; - } - context->mPacketProcessed.notify_one(); -} -#endif - -/** @brief Finds all chips connected to usb ports - @return number of devices found -*/ -int ConnectionUSB::RefreshDeviceList() -{ - #ifndef __unix__ - USBDevicePrimary->Close(); - currentDeviceIndex = -1; - m_deviceNames.clear(); - string name; - if (USBDevicePrimary->DeviceCount()) - { - for (int i=0; i<USBDevicePrimary->DeviceCount(); ++i) - { - Open(i); - name = DeviceName(); - m_deviceNames.push_back(name); - } - currentDeviceIndex = -1; - } - #else - m_dev_pid_vid.clear(); - m_deviceNames.clear(); - int usbDeviceCount = libusb_get_device_list(ctx, &devs); - if(usbDeviceCount > 0) - { - libusb_device_descriptor desc; - for(int i=0; i<usbDeviceCount; ++i) - { - int r = libusb_get_device_descriptor(devs[i], &desc); - if(r<0) - printf("failed to get device description\n"); - int pid = desc.idProduct; - int vid = desc.idVendor; - - if( vid == 1204) - { - if(pid == 34323) - { - m_hardwareName = HW_DIGIGREEN; - m_deviceNames.push_back("DigiGreen"); - m_dev_pid_vid.push_back( pair<int,int>(pid,vid)); - } - else if(pid == 241) - { - m_hardwareName = HW_DIGIRED; - libusb_device_handle *tempDev_handle; - tempDev_handle = libusb_open_device_with_vid_pid(ctx, vid, pid); - if(libusb_kernel_driver_active(tempDev_handle, 0) == 1) //find out if kernel driver is attached - { - if(libusb_detach_kernel_driver(tempDev_handle, 0) == 0) //detach it - printf("Kernel Driver Detached!\n"); - } - if(libusb_claim_interface(tempDev_handle, 0) < 0) //claim interface 0 (the first) of device - { - printf("Cannot Claim Interface\n"); - } - - string fullName; - //check operating speed - int speed = libusb_get_device_speed(devs[i]); - if(speed == LIBUSB_SPEED_HIGH) - fullName = "USB 2.0"; - else if(speed == LIBUSB_SPEED_SUPER) - fullName = "USB 3.0"; - else - fullName = "USB"; - fullName += " ("; - //read device name - char data[255]; - memset(data, 0, 255); - int st = libusb_get_string_descriptor_ascii(tempDev_handle, 2, (unsigned char*)data, 255); - if(strlen(data) > 0) - fullName += data; - fullName += ")"; - libusb_close(tempDev_handle); - - m_deviceNames.push_back(fullName); - m_dev_pid_vid.push_back( pair<int,int>(pid,vid)); - } - } - } - } - else - { - libusb_free_device_list(devs, 1); - return 0; - } - #endif - return m_deviceNames.size(); -} - -void ConnectionUSB::ClearComm() -{ -} - -/** @return name of currently opened device as string. -*/ -string ConnectionUSB::DeviceName() -{ -#ifndef __unix__ - string name; - char tempName[USB_STRING_MAXLEN]; - //memcpy(tempName, USBDevicePrimary->FriendlyName, USB_STRING_MAXLEN); - //name = tempName; - - for (int i = 0; i < USB_STRING_MAXLEN; ++i) - tempName[i] = USBDevicePrimary->DeviceName[i]; - if (USBDevicePrimary->bSuperSpeed == true) - name = "USB 3.0"; - else if (USBDevicePrimary->bHighSpeed == true) - name = "USB 2.0"; - else - name = "USB"; - name += " ("; - name += tempName; - name += ")"; - return name; -#else - if(dev_handle != 0) - { - char data[255]; - int st = libusb_get_string_descriptor_ascii(dev_handle, 2, (unsigned char*)data, 255); - return string(data); - } - return "no name"; -#endif -} - -/** - @brief Starts asynchronous data reading from board - @param *buffer buffer where to store received data - @param length number of bytes to read - @return handle of transfer context -*/ -int ConnectionUSB::BeginDataReading(char *buffer, long length) -{ - int i = 0; - bool contextFound = false; - //find not used context - for(i = 0; i<USB_MAX_CONTEXTS; i++) - { - if(!contexts[i].used) - { - contextFound = true; - break; - } - } - if(!contextFound) - return -1; - contexts[i].used = true; - #ifndef __unix__ - if(InEndPt) - contexts[i].context = InEndPt->BeginDataXfer((unsigned char*)buffer, length, contexts[i].inOvLap); - return i; - #else - unsigned int Timeout = 1000; - libusb_transfer *tr = contexts[i].transfer; - libusb_fill_bulk_transfer(tr, dev_handle, 0x81, (unsigned char*)buffer, length, callback_libusbtransfer, &contexts[i], Timeout); - contexts[i].done = false; - contexts[i].bytesXfered = 0; - contexts[i].bytesExpected = length; - int status = libusb_submit_transfer(tr); - int actual = 0; - //int status = libusb_bulk_transfer(dev_handle, 0x81, (unsigned char*)buffer, length, &actual, USB_TIMEOUT); - if(status != 0) - printf("ERROR BEGIN DATA TRANSFER %s\n", libusb_error_name(status)); - #endif - return i; -} - -/** - @brief Waits for asynchronous data reception - @param contextHandle handle of which context data to wait - @param timeout_ms number of miliseconds to wait - @return 1-data received, 0-data not received -*/ -int ConnectionUSB::WaitForReading(int contextHandle, unsigned int timeout_ms) -{ - if( contexts[contextHandle].used == true && contextHandle >= 0) - { - int status = 0; - #ifndef __unix__ - if(InEndPt) - status = InEndPt->WaitForXfer(contexts[contextHandle].inOvLap, timeout_ms); - return status; - #else - - struct timeval tv; - tv.tv_sec = 0; - tv.tv_usec = 0; - if(libusb_handle_events_timeout_completed(ctx, &tv, NULL) != 0) - printf("error libusb_handle_events %i\n", status); - - auto t1 = chrono::high_resolution_clock::now(); - auto t2 = chrono::high_resolution_clock::now(); - - while(contexts[contextHandle].done == false && std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() < timeout_ms) - { - struct timeval tv; - tv.tv_sec = 0; - tv.tv_usec = 300; - std::this_thread::yield(); - //if(libusb_handle_events(ctx) != 0) - if(libusb_handle_events_timeout_completed(ctx, &tv, NULL) != 0) - printf("error libusb_handle_events %i\n", status); - t2 = chrono::high_resolution_clock::now(); - //std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - std::unique_lock<std::mutex> lck(contexts[contextHandle].m_lock); - while(contexts[contextHandle].done == false) //is changed in libusb callback - { - if(contexts[contextHandle].mPacketProcessed.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) - return 0; - } - return contexts[contextHandle].done == true; - #endif - } - else - return 0; -} - -/** - @brief Finishes asynchronous data reading from board - @param buffer array where to store received data - @param length number of bytes to read, function changes this value to number of bytes actually received - @param contextHandle handle of which context to finish - @return false failure, true number of bytes received -*/ -int ConnectionUSB::FinishDataReading(char *buffer, long &length, int contextHandle) -{ - if( contexts[contextHandle].used == true && contextHandle >= 0) - { - #ifndef __unix__ - int status = 0; - if(InEndPt) - status = InEndPt->FinishDataXfer((unsigned char*)buffer, length, contexts[contextHandle].inOvLap, contexts[contextHandle].context); - contexts[contextHandle].used = false; - contexts[contextHandle].reset(); - return length; - #else - length = contexts[contextHandle].bytesXfered; - contexts[contextHandle].used = false; - contexts[contextHandle].reset(); - return length; - #endif - } - else - return 0; -} - -int ConnectionUSB::ReadDataBlocking(char *buffer, long &length, int timeout_ms) -{ -#ifndef __unix__ - return InEndPt->XferData((unsigned char*)buffer, length); -#else - return 0; -#endif -} - - -/** - @brief Aborts reading operations -*/ -void ConnectionUSB::AbortReading() -{ -#ifndef __unix__ - InEndPt->Abort(); -#else - for(int i=0; i<USB_MAX_CONTEXTS; ++i) - { - libusb_cancel_transfer( contexts[i].transfer ); - } -#endif -} - -/** - @brief Starts asynchronous data Sending to board - @param *buffer buffer to send - @param length number of bytes to send - @return handle of transfer context -*/ -int ConnectionUSB::BeginDataSending(const char *buffer, long length) -{ - int i = 0; - //find not used context - bool contextFound = false; - for(i = 0; i<USB_MAX_CONTEXTS; i++) - { - if(!contextsToSend[i].used) - { - contextFound = true; - break; - } - } - if(!contextFound) - return -1; - contextsToSend[i].used = true; - #ifndef __unix__ - if(OutEndPt) - contextsToSend[i].context = OutEndPt->BeginDataXfer((unsigned char*)buffer, length, contextsToSend[i].inOvLap); - return i; - #else - unsigned int Timeout = 1000; - libusb_transfer *tr = contextsToSend[i].transfer; - //libusb_set_iso_packet_lengths(contexts[i].transfer, 512*64); - libusb_fill_bulk_transfer(tr, dev_handle, 0x1, (unsigned char*)buffer, length, callback_libusbtransfer, &contextsToSend[i], Timeout); - contextsToSend[i].done = false; - contextsToSend[i].bytesXfered = 0; - contextsToSend[i].bytesExpected = length; - libusb_submit_transfer(tr); - #endif - return i; -} - -/** - @brief Waits for asynchronous data sending - @param contextHandle handle of which context data to wait - @param timeout_ms number of miliseconds to wait - @return 1-data received, 0-data not received -*/ -int ConnectionUSB::WaitForSending(int contextHandle, unsigned int timeout_ms) -{ - if( contextsToSend[contextHandle].used == true ) - { - #ifndef __unix__ - int status = 0; - if(OutEndPt) - status = OutEndPt->WaitForXfer(contextsToSend[contextHandle].inOvLap, timeout_ms); - return status; - #else - auto t1 = chrono::high_resolution_clock::now(); - auto t2 = chrono::high_resolution_clock::now(); - while(contextsToSend[contextHandle].done == false && std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() < timeout_ms) - { - /* struct timeval tv; - tv.tv_sec = 1; - tv.tv_usec = 0; - int status = libusb_handle_events_timeout_completed(ctx, &tv, NULL); - if(status != 0) - printf("error libusb_handle_events %i\n", status);*/ - t2 = chrono::high_resolution_clock::now(); - //std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - std::unique_lock<std::mutex> lck(contextsToSend[contextHandle].m_lock); - while(contextsToSend[contextHandle].done == false) //is changed in libusb callback - { - if(contextsToSend[contextHandle].mPacketProcessed.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) - return 0; - } - return contextsToSend[contextHandle].done == true; - #endif - } - else - return 0; -} - -/** - @brief Finishes asynchronous data sending to board - @param buffer array where to store received data - @param length number of bytes to read, function changes this value to number of bytes acctually received - @param contextHandle handle of which context to finish - @return false failure, true number of bytes sent -*/ -int ConnectionUSB::FinishDataSending(const char *buffer, long &length, int contextHandle) -{ - if( contextsToSend[contextHandle].used == true) - { - #ifndef __unix__ - if(OutEndPt) - OutEndPt->FinishDataXfer((unsigned char*)buffer, length, contextsToSend[contextHandle].inOvLap, contextsToSend[contextHandle].context); - contextsToSend[contextHandle].used = false; - contextsToSend[contextHandle].reset(); - return length; - #else - length = contextsToSend[contextHandle].bytesXfered; - contextsToSend[contextHandle].used = false; - contextsToSend[contextHandle].reset(); - return length; - #endif - } - else - return 0; -} - -/** - @brief Aborts sending operations -*/ -void ConnectionUSB::AbortSending() -{ -#ifndef __unix__ - OutEndPt->Abort(); -#else - for (int i = 0; i<USB_MAX_CONTEXTS; ++i) - { - libusb_cancel_transfer(contextsToSend[i].transfer); - } - for(int i=0; i<USB_MAX_CONTEXTS; ++i) - { - contextsToSend[i].used = false; - contextsToSend[i].reset(); - } -#endif -} - -int ConnectionUSB::GetOpenedIndex() -{ - return currentDeviceIndex; -} - -/** @brief Returns found devices names - @return vector of device names -*/ -vector<string> ConnectionUSB::GetDeviceNames() -{ - return m_deviceNames; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionUSB.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionUSB.h deleted file mode 100644 index f3048c184200e5bb5bdb875392c957ca45c75a7b..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionUSB.h +++ /dev/null @@ -1,144 +0,0 @@ -/** -@file ConnectionUSB.h -@author Lime Microsystems (www.limemicro.com) -@brief Class for data writing and reading through USB port -*/ - -#ifndef USB_PORT_CONNECTION_H -#define USB_PORT_CONNECTION_H - -#include "IConnection.h" - -#ifndef __unix__ -#include "windows.h" -#include "CyAPI.h" -#else -#include <libusb-1.0/libusb.h> -#include <mutex> -#include <condition_variable> -#include <chrono> -#endif - -#define USB_MAX_CONTEXTS 64 //maximum number of contexts for asynchronous transfers - -/** @brief Wrapper class for holding USB asynchronous transfers contexts -*/ -class USBTransferContext -{ -public: - USBTransferContext() : used(false) - { - #ifndef __unix__ - inOvLap = new OVERLAPPED; - memset(inOvLap, 0, sizeof(OVERLAPPED)); - inOvLap->hEvent = CreateEvent(NULL, false, false, NULL); - context = NULL; - #else - transfer = libusb_alloc_transfer(0); - bytesXfered = 0; - bytesExpected = 0; - done = 0; - #endif - } - ~USBTransferContext() - { - #ifndef __unix__ - CloseHandle(inOvLap->hEvent); - delete inOvLap; - #else - libusb_free_transfer(transfer); - #endif - } - bool reset() - { - if(used) - return false; - #ifndef __unix__ - CloseHandle(inOvLap->hEvent); - memset(inOvLap, 0, sizeof(OVERLAPPED)); - inOvLap->hEvent = CreateEvent(NULL, false, false, NULL); - #endif - return true; - } - bool used; - #ifndef __unix__ - PUCHAR context; - OVERLAPPED *inOvLap; - #else - libusb_transfer* transfer; - long bytesXfered; - long bytesExpected; - bool done; - std::mutex m_lock; - std::condition_variable mPacketProcessed; - #endif -}; - -class ConnectionUSB : public IConnection -{ -public: - ConnectionUSB(); - ~ConnectionUSB(); - - void FindDevices(); - DeviceStatus Open(); - DeviceStatus Open(unsigned index); - void Close(); - bool IsOpen(); - int GetOpenedIndex(); - - int Write(const unsigned char *buffer, int length, int timeout_ms = 0); - int Read(unsigned char *buffer, int length, int timeout_ms = 0); - - virtual int BeginDataReading(char *buffer, long length); - virtual int WaitForReading(int contextHandle, unsigned int timeout_ms); - virtual int FinishDataReading(char *buffer, long &length, int contextHandle); - virtual void AbortReading(); - virtual int ReadDataBlocking(char *buffer, long &length, int timeout_ms); - - virtual int BeginDataSending(const char *buffer, long length); - virtual int WaitForSending(int contextHandle, unsigned int timeout_ms); - virtual int FinishDataSending(const char *buffer, long &length, int contextHandle); - virtual void AbortSending(); - - std::vector<std::string> GetDeviceNames(); - int RefreshDeviceList(); - void ClearComm(); -private: - int currentDeviceIndex; - std::string DeviceName(); - - std::vector<std::string> m_deviceNames; - std::string m_hardwareName; - int m_hardwareVer; - - USBTransferContext contexts[USB_MAX_CONTEXTS]; - USBTransferContext contextsToSend[USB_MAX_CONTEXTS]; - void Initialize(); - - bool isConnected; - int currentPortIndex; - - #ifndef __unix__ - CCyUSBDevice *USBDevicePrimary; - //control endpoints for DigiRed - CCyControlEndPoint *InCtrlEndPt3; - CCyControlEndPoint *OutCtrlEndPt3; - - //control endpoints for DigiGreen - CCyUSBEndPoint *OutCtrEndPt; - CCyUSBEndPoint *InCtrEndPt; - - //end points for samples reading and writing - CCyUSBEndPoint *InEndPt; - CCyUSBEndPoint *OutEndPt; - - #else - libusb_device **devs; //pointer to pointer of device, used to retrieve a list of devices - libusb_device_handle *dev_handle; //a device handle - libusb_context *ctx; //a libusb session - std::vector<std::pair<int,int> > m_dev_pid_vid; - #endif -}; - -#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/IConnection.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/IConnection.h deleted file mode 100644 index 5804f1149f104c4d834c710eaf6f38f75bc9a6d3..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/IConnection.h +++ /dev/null @@ -1,68 +0,0 @@ -/** - @file IConnection.h - @author Lime Microsystems - @brief Interface class for connection types -*/ - -#ifndef ICONNECTION_H -#define ICONNECTION_H - -#include <string> -#include <vector> - -using namespace std; - -class IConnection -{ -public: - /// Supported connection types. - enum eConnectionType - { - CONNECTION_UNDEFINED = -1, - COM_PORT = 0, - USB_PORT = 1, - SPI_PORT = 2, - //insert new types here - CONNECTION_TYPES_COUNT //used only for memory allocation - }; - - enum DeviceStatus - { - SUCCESS, - FAILURE, - END_POINTS_NOT_FOUND, - CANNOT_CLAIM_INTERFACE - }; - - IConnection() : m_connectionType(CONNECTION_UNDEFINED){}; - virtual ~IConnection(){}; - virtual int RefreshDeviceList() = 0; - virtual DeviceStatus Open(unsigned i) = 0; - virtual void Close() = 0; - virtual bool IsOpen() = 0; - virtual int GetOpenedIndex() = 0; - - virtual int Write(const unsigned char *buffer, int length, int timeout_ms = 0) = 0; - virtual int Read(unsigned char *buffer, int length, int timeout_ms = 0) = 0; - - virtual std::vector<std::string> GetDeviceNames() = 0; - - virtual eConnectionType GetType() { return m_connectionType; }; - virtual bool SetParam(const char *name, const char* value) {return false;}; - - virtual int BeginDataReading(char *buffer, long length){ return -1; }; - virtual int WaitForReading(int contextHandle, unsigned int timeout_ms){ return 0;}; - virtual int FinishDataReading(char *buffer, long &length, int contextHandle){ return 0;} - virtual void AbortReading(){}; - virtual int ReadDataBlocking(char *buffer, long &length, int timeout_ms){ return 0; } - - virtual int BeginDataSending(const char *buffer, long length){ return -1; }; - virtual int WaitForSending(int contextHandle, unsigned int timeout_ms){ return 0;}; - virtual int FinishDataSending(const char *buffer, long &length, int contextHandle){ return 0;} - virtual void AbortSending(){}; -protected: - eConnectionType m_connectionType; -}; - -#endif - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/lmsComms.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/lmsComms.cpp deleted file mode 100644 index 0e5ec667621f7b3c797aacba8ffc89742645c96f..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/lmsComms.cpp +++ /dev/null @@ -1,325 +0,0 @@ -/** -@file LMScomms.cpp -@author Lime Microsystems (www.limemicro.com) -@brief Implementation of data transmission to LMS boards -*/ - -#include "lmsComms.h" - -LMScomms::LMScomms(const IConnection::eConnectionType port_type) : ConnectionManager(port_type) -{ - callback_logData = nullptr; - unsigned short test = 0x1234; - unsigned char* bytes = (unsigned char*)&test; - if(bytes[0] == 0x12 && bytes[1] == 0x34) - mSystemBigEndian = true; - else - mSystemBigEndian = false; -} - -LMScomms::~LMScomms() -{ -} - -/** @brief Transfers data between packet and connected device - @param pkt packet containing output data and to receive incomming data - @return 0: success, other: failure -*/ -LMScomms::TransferStatus LMScomms::TransferPacket(GenericPacket& pkt) -{ - std::lock_guard<std::mutex> lock(mControlPortLock); - TransferStatus status = TRANSFER_SUCCESS; - if(IsOpen() == false) - return NOT_CONNECTED; - - int packetLen; - eLMS_PROTOCOL protocol = LMS_PROTOCOL_UNDEFINED; - if(activeControlPort->GetType() == IConnection::SPI_PORT) - protocol = LMS_PROTOCOL_NOVENA; - else - protocol = LMS_PROTOCOL_LMS64C; - switch(protocol) - { - case LMS_PROTOCOL_UNDEFINED: - return TRANSFER_FAILED; - case LMS_PROTOCOL_LMS64C: - packetLen = ProtocolLMS64C::pktLength; - break; - case LMS_PROTOCOL_NOVENA: - packetLen = pkt.outBuffer.size() > ProtocolNovena::pktLength ? ProtocolNovena::pktLength : pkt.outBuffer.size(); - break; - default: - packetLen = 0; - return TRANSFER_FAILED; - } - int outLen = 0; - unsigned char* outBuffer = NULL; - outBuffer = PreparePacket(pkt, outLen, protocol); - unsigned char* inBuffer = new unsigned char[outLen]; - memset(inBuffer, 0, outLen); - - int outBufPos = 0; - int inDataPos = 0; - if(outLen == 0) - { - //printf("packet outlen = 0\n"); - outLen = 1; - } - - if(protocol == LMS_PROTOCOL_NOVENA) - { - bool transferData = true; //some commands are fake, so don't need transferring - if(pkt.cmd == CMD_GET_INFO) - { - //spi does not have GET INFO, fake it to inform what device it is - pkt.status = STATUS_COMPLETED_CMD; - pkt.inBuffer.clear(); - pkt.inBuffer.resize(64, 0); - pkt.inBuffer[0] = 0; //firmware - pkt.inBuffer[1] = LMS_DEV_NOVENA; //device - pkt.inBuffer[2] = 0; //protocol - pkt.inBuffer[3] = 0; //hardware - pkt.inBuffer[4] = EXP_BOARD_UNSUPPORTED; //expansion - transferData = false; - } - - if(transferData) - { - if (callback_logData) - callback_logData(true, outBuffer, outLen); - int bytesWritten = Write(outBuffer, outLen); - if( bytesWritten == outLen) - { - if(pkt.cmd == CMD_LMS7002_RD) - { - inDataPos = Read(&inBuffer[inDataPos], outLen); - if(inDataPos != outLen) - status = TRANSFER_FAILED; - else - { - if (callback_logData) - callback_logData(false, inBuffer, inDataPos); - } - } - ParsePacket(pkt, inBuffer, inDataPos, protocol); - } - else - status = TRANSFER_FAILED; - } - } - else - { - for(int i=0; i<outLen; i+=packetLen) - { - int bytesToSend = packetLen; - if (callback_logData) - callback_logData(true, &outBuffer[outBufPos], bytesToSend); - if( Write(&outBuffer[outBufPos], bytesToSend) ) - { - outBufPos += packetLen; - long readLen = packetLen; - int bread = Read(&inBuffer[inDataPos], readLen); - if(bread != readLen && protocol != LMS_PROTOCOL_NOVENA) - { - status = TRANSFER_FAILED; - break; - } - if (callback_logData) - callback_logData(false, &inBuffer[inDataPos], bread); - inDataPos += bread; - } - else - { - status = TRANSFER_FAILED; - break; - } - } - ParsePacket(pkt, inBuffer, inDataPos, protocol); - } - delete outBuffer; - delete inBuffer; - return status; -} - -/** @brief Returns connected device information -*/ -LMSinfo LMScomms::GetInfo() -{ - LMSinfo info; - info.device = LMS_DEV_UNKNOWN; - info.expansion = EXP_BOARD_UNKNOWN; - info.firmware = 0; - info.hardware = 0; - info.protocol = 0; - GenericPacket pkt; - pkt.cmd = CMD_GET_INFO; - LMScomms::TransferStatus status = TransferPacket(pkt); - if (status == LMScomms::TRANSFER_SUCCESS && pkt.inBuffer.size() >= 5) - { - info.firmware = pkt.inBuffer[0]; - info.device = pkt.inBuffer[1] < LMS_DEV_COUNT ? (eLMS_DEV)pkt.inBuffer[1] : LMS_DEV_UNKNOWN; - info.protocol = pkt.inBuffer[2]; - info.hardware = pkt.inBuffer[3]; - info.expansion = pkt.inBuffer[4] < EXP_BOARD_COUNT ? (eEXP_BOARD)pkt.inBuffer[4] : EXP_BOARD_UNKNOWN; - } - return info; -} - -/** @brief Takes generic packet and converts to specific protocol buffer - @param pkt generic data packet to convert - @param length returns length of returned buffer - @param protocol which protocol to use for data - @return pointer to data buffer, must be manually deleted after use -*/ -unsigned char* LMScomms::PreparePacket(const GenericPacket& pkt, int& length, const eLMS_PROTOCOL protocol) -{ - unsigned char* buffer = NULL; - if(protocol == LMS_PROTOCOL_UNDEFINED) - return NULL; - - if(protocol == LMS_PROTOCOL_LMS64C) - { - ProtocolLMS64C packet; - int maxDataLength = packet.maxDataLength; - packet.cmd = pkt.cmd; - packet.status = pkt.status; - int byteBlockRatio = 1; //block ratio - how many bytes in one block - switch( packet.cmd ) - { - case CMD_PROG_MCU: - case CMD_GET_INFO: - case CMD_SI5351_RD: - case CMD_SI5356_RD: - byteBlockRatio = 1; - break; - case CMD_SI5351_WR: - case CMD_SI5356_WR: - byteBlockRatio = 2; - break; - case CMD_LMS7002_RD: - case CMD_BRDSPI_RD: - case CMD_BRDSPI8_RD: - byteBlockRatio = 2; - break; - case CMD_ADF4002_WR: - byteBlockRatio = 3; - break; - case CMD_LMS7002_WR: - case CMD_BRDSPI_WR: - case CMD_ANALOG_VAL_WR: - byteBlockRatio = 4; - break; - default: - byteBlockRatio = 1; - } - if (packet.cmd == CMD_LMS7002_RD || packet.cmd == CMD_BRDSPI_RD) - maxDataLength = maxDataLength/2; - if (packet.cmd == CMD_ANALOG_VAL_RD) - maxDataLength = maxDataLength / 4; - int blockCount = pkt.outBuffer.size()/byteBlockRatio; - int bufLen = blockCount/(maxDataLength/byteBlockRatio) - +(blockCount%(maxDataLength/byteBlockRatio)!=0); - bufLen *= packet.pktLength; - if(bufLen == 0) - bufLen = packet.pktLength; - buffer = new unsigned char[bufLen]; - memset(buffer, 0, bufLen); - int srcPos = 0; - for(int j=0; j*packet.pktLength<bufLen; ++j) - { - int pktPos = j*packet.pktLength; - buffer[pktPos] = packet.cmd; - buffer[pktPos+1] = packet.status; - if(blockCount > (maxDataLength/byteBlockRatio)) - { - buffer[pktPos+2] = maxDataLength/byteBlockRatio; - blockCount -= buffer[pktPos+2]; - } - else - buffer[pktPos+2] = blockCount; - memcpy(&buffer[pktPos+3], packet.reserved, sizeof(packet.reserved)); - int bytesToPack = (maxDataLength/byteBlockRatio)*byteBlockRatio; - for (int k = 0; k<bytesToPack && srcPos < pkt.outBuffer.size(); ++srcPos, ++k) - buffer[pktPos + 8 + k] = pkt.outBuffer[srcPos]; - } - length = bufLen; - } - else if(protocol == LMS_PROTOCOL_NOVENA) - { - if(pkt.cmd == CMD_LMS7002_RST) - { - buffer = new unsigned char[8]; - buffer[0] = 0x88; - buffer[1] = 0x06; - buffer[2] = 0x00; - buffer[3] = 0x18; - buffer[4] = 0x88; - buffer[5] = 0x06; - buffer[6] = 0x00; - buffer[7] = 0x38; - length = 8; - } - else - { - buffer = new unsigned char[pkt.outBuffer.size()]; - memcpy(buffer, &pkt.outBuffer[0], pkt.outBuffer.size()); - if (pkt.cmd == CMD_LMS7002_WR) - { - for(int i=0; i<pkt.outBuffer.size(); i+=4) - buffer[i] |= 0x80; - } - length = pkt.outBuffer.size(); - } - } - return buffer; -} - -/** @brief Parses given data buffer into generic packet - @param pkt destination packet - @param buffer received data from board - @param length received buffer length - @param protocol which protocol to use for data parsing - @return 1:success, 0:failure -*/ -int LMScomms::ParsePacket(GenericPacket& pkt, const unsigned char* buffer, const int length, const eLMS_PROTOCOL protocol) -{ - if(protocol == LMS_PROTOCOL_UNDEFINED) - return -1; - - if(protocol == LMS_PROTOCOL_LMS64C) - { - ProtocolLMS64C packet; - int inBufPos = 0; - pkt.inBuffer.resize(packet.maxDataLength*(length / packet.pktLength + (length % packet.pktLength)), 0); - for(int i=0; i<length; i+=packet.pktLength) - { - pkt.cmd = (eCMD_LMS)buffer[i]; - pkt.status = (eCMD_STATUS)buffer[i+1]; - memcpy(&pkt.inBuffer[inBufPos], &buffer[i+8], packet.maxDataLength); - inBufPos += packet.maxDataLength; - } - } - else if(protocol == LMS_PROTOCOL_NOVENA) - { - pkt.cmd = CMD_LMS7002_RD; - pkt.status = STATUS_COMPLETED_CMD; - pkt.inBuffer.clear(); - for(int i=0; i<length; i+=2) - { - //reading from spi returns only registers values - //fill addresses as zeros to match generic format of address, value pairs - pkt.inBuffer.push_back(0); //should be address msb - pkt.inBuffer.push_back(0); //should be address lsb - pkt.inBuffer.push_back(buffer[i]); - pkt.inBuffer.push_back(buffer[i+1]); - } - } - return 1; -} - -/** @brief Sets callback function which gets called each time data is sent or received -*/ -void LMScomms::SetDataLogCallback(std::function<void(bool, const unsigned char*, const unsigned int)> callback) -{ - callback_logData = callback; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/lmsComms.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/lmsComms.h deleted file mode 100644 index f811d293025e0e7c2dce6289dd6e0cbaf04ba278..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/lmsComms.h +++ /dev/null @@ -1,111 +0,0 @@ -/** -@file LMScomms.h -@author Lime Microsystems (www.limemicro.com) -@brief Class for handling data transmission to LMS boards -*/ - -#ifndef LMS_COMMS_H -#define LMS_COMMS_H - -#include "lms7002_defines.h" -#include "ConnectionManager.h" -#include <string.h> -#include <mutex> - -struct LMSinfo -{ - eLMS_DEV device; - eEXP_BOARD expansion; - int firmware; - int hardware; - int protocol; -}; - -/* @brief Class for abstracting transfering data to and from chip -*/ -class LMScomms : public ConnectionManager -{ -public: - enum TransferStatus - { - TRANSFER_SUCCESS, - TRANSFER_FAILED, - NOT_CONNECTED - }; - - enum eLMS_PROTOCOL - { - LMS_PROTOCOL_UNDEFINED = 0, - LMS_PROTOCOL_DIGIC, - LMS_PROTOCOL_LMS64C, - LMS_PROTOCOL_NOVENA, - }; - struct ProtocolDIGIC - { - static const int pktLength = 64; - static const int maxDataLength = 60; - ProtocolDIGIC() : cmd(0), i2cAddr(0), blockCount(0) {}; - unsigned char cmd; - unsigned char i2cAddr; - unsigned char blockCount; - unsigned char reserved; - unsigned char data[maxDataLength]; - }; - - struct ProtocolLMS64C - { - static const int pktLength = 64; - static const int maxDataLength = 56; - ProtocolLMS64C() :cmd(0),status(STATUS_UNDEFINED),blockCount(0) - { - memset(reserved, 0, 5); - }; - unsigned char cmd; - unsigned char status; - unsigned char blockCount; - unsigned char reserved[5]; - unsigned char data[maxDataLength]; - }; - - struct ProtocolNovena - { - static const int pktLength = 128; - static const int maxDataLength = 128; - ProtocolNovena() :cmd(0),status(0) {}; - unsigned char cmd; - unsigned char status; - unsigned char blockCount; - unsigned char data[maxDataLength]; - }; - - struct GenericPacket - { - GenericPacket() - { - cmd = CMD_GET_INFO; - status = STATUS_UNDEFINED; - } - - eCMD_LMS cmd; - eCMD_STATUS status; - vector<unsigned char> outBuffer; - vector<unsigned char> inBuffer; - }; - - LMScomms(const IConnection::eConnectionType port_type); - ~LMScomms(); - - virtual TransferStatus TransferPacket(GenericPacket &pkt); - LMSinfo GetInfo(); - void SetDataLogCallback(std::function<void(bool, const unsigned char*, const unsigned int)> callback); -protected: - std::function<void(bool, const unsigned char*, const unsigned int)> callback_logData; - std::mutex mControlPortLock; - unsigned char* PreparePacket(const GenericPacket &pkt, int &length, const eLMS_PROTOCOL protocol); - int ParsePacket(GenericPacket &pkt, const unsigned char* buffer, const int length, const eLMS_PROTOCOL protocol); -protected: - bool mSystemBigEndian; -}; - -#endif // LMS_COMMS_H - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/dataTypes.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/dataTypes.h deleted file mode 100644 index c97ac7857df021918df23abbddee645ed18e35e1..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/dataTypes.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef LMS_DATA_TYPES_H -#define LMS_DATA_TYPES_H - -typedef struct -{ - uint8_t reserved[8]; - uint64_t counter; - int16_t samples[2040]; -} PacketLTE; - -typedef struct -{ - int16_t i; - int16_t q; -} complex16_t; - -class SamplesPacket -{ - public: - uint64_t timestamp; //timestamp of the packet - uint16_t first; //index of first unused sample in samples[] - uint16_t last; //end index of samples - static const uint16_t samplesCount = 1024; //maximum number of samples in packet - complex16_t samples[samplesCount]; //must be power of two -}; - -complex16_t operator &=(complex16_t & other1, const complex16_t & other) // copy assignment -{ - other1.i = other.i; - other1.q = other.q; - return other1; -} - -#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/fifo.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/fifo.h deleted file mode 100644 index 1868c64af71d1205e0aeb422c9ab9ea87635a747..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/fifo.h +++ /dev/null @@ -1,180 +0,0 @@ -#ifndef LMS_FIFO_BUFFER_H -#define LMS_FIFO_BUFFER_H - -#include <mutex> -#include <atomic> -#include <vector> -#include <thread> -#include <condition_variable> -#include "dataTypes.h" - -class LMS_SamplesFIFO -{ -public: - struct BufferInfo - { - uint32_t size; - uint32_t itemsFilled; - }; - - BufferInfo GetInfo() - { - std::unique_lock<std::mutex> lck2(readLock); - std::unique_lock<std::mutex> lck(writeLock); - BufferInfo stats; - stats.size = (uint32_t)mBuffer.size(); - stats.itemsFilled = mElementsFilled.load(); - return stats; - } - - LMS_SamplesFIFO(uint32_t bufLength) - { - Reset(bufLength); - } - - ~LMS_SamplesFIFO(){}; - - /** @brief inserts items to ring buffer - @param buffer data source - @param itemCount number of buffer items to insert - @param timeout_ms timeout duration for operation - @param overwrite enable to overwrite oldest items inside the buffer - @return number of items added - */ - uint32_t push_packet(SamplesPacket *buffer, const uint32_t itemCount, const uint32_t timeout_ms, const bool overwrite = true) - { - uint32_t addedItems = 0; - std::unique_lock<std::mutex> lck(writeLock); - while (addedItems < itemCount) - { - while (mElementsFilled.load() >= mBuffer.size()) //wait for free space to insert items - { - if (canWrite.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) - return addedItems; //dropped all items - } - - uint32_t itemsToInsert = itemCount - addedItems; - uint32_t itemsToEnd = (uint32_t)mBuffer.size() - mTail.load(); //might need to split memcpy into two operations - if (itemsToInsert > itemsToEnd) - { - memcpy(&mBuffer[mTail], &buffer[addedItems], itemsToEnd*sizeof(SamplesPacket)); - memcpy(&mBuffer[0], &buffer[addedItems+itemsToEnd], (itemsToInsert - itemsToEnd)*sizeof(SamplesPacket)); - } - else - memcpy(&mBuffer[mTail], &buffer[addedItems], itemsToInsert*sizeof(SamplesPacket)); - mTail.store((mTail.load() + itemsToInsert) & (mBuffer.size() - 1)); - mElementsFilled.fetch_add(itemsToInsert); - canRead.notify_one(); - addedItems += itemsToInsert; - } - return addedItems; - } - - /** @brief inserts items to ring buffer - @param buffer data source - @param itemCount number of buffer items to insert - @param timeout_ms timeout duration for operation - @param overwrite enable to overwrite oldest items inside the buffer - @return number of items added - */ - uint32_t push_samples(const complex16_t *buffer, const uint32_t samplesCount, uint64_t timestamp, const uint32_t timeout_ms, const bool overwrite = true) - { - assert(buffer != nullptr); - const int samplesInPacket = SamplesPacket::samplesCount; - uint32_t samplesTaken = 0; - std::unique_lock<std::mutex> lck(writeLock); - while (samplesTaken < samplesCount) - { - while (mElementsFilled.load() >= mBuffer.size()) //buffer might be full, wait for free slots - { - if (canWrite.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) - return samplesTaken; - } - - int tailIndex = mTail.load(); //which element to fill - while (mElementsFilled.load() < mBuffer.size() && samplesTaken < samplesCount) // not to release lock too often - { - mBuffer[tailIndex].timestamp = timestamp + samplesTaken; - mBuffer[tailIndex].first = 0; - mBuffer[tailIndex].last = 0; - while (mBuffer[tailIndex].last < samplesInPacket && samplesTaken < samplesCount) - { - mBuffer[tailIndex].samples[mBuffer[tailIndex].last++] = buffer[samplesTaken++]; - } - mTail.store((tailIndex + 1) & (mBuffer.size() - 1));//advance to next one - tailIndex = mTail.load(); - mElementsFilled.fetch_add(1); - canRead.notify_one(); - } - } - return samplesTaken; - } - - /** @brief Takes items out of ring buffer - @param buffer data destination - @param samplesCount number of samples to pop - @param timestamp returns timestamp of the first sample in buffer - @param timeout_ms timeout duration for operation - @return number of samples returned - */ - uint32_t pop_samples(complex16_t* buffer, const uint32_t samplesCount, uint64_t *timestamp, const uint32_t timeout_ms) - { - assert(buffer != nullptr); - const int samplesInPacket = SamplesPacket::samplesCount; - uint32_t samplesFilled = 0; - *timestamp = 0; - std::unique_lock<std::mutex> lck(readLock); - while (samplesFilled < samplesCount) - { - while (mElementsFilled.load() == 0) //buffer might be empty, wait for packets - { - if (canRead.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) - return samplesFilled; - } - if(samplesFilled == 0) - *timestamp = mBuffer[mHead.load()].timestamp + mBuffer[mHead.load()].first; - - while(mElementsFilled.load() > 0 && samplesFilled < samplesCount) - { - int headIndex = mHead.load(); - while (mBuffer[headIndex].first < mBuffer[headIndex].last && samplesFilled < samplesCount) - { - buffer[samplesFilled++] = mBuffer[headIndex].samples[mBuffer[headIndex].first++]; - } - if (mBuffer[headIndex].first == mBuffer[headIndex].last) //packet depleated - { - mBuffer[headIndex].first = 0; - mBuffer[headIndex].last = 0; - mBuffer[headIndex].timestamp = 0; - mHead.store( (headIndex + 1) & (mBuffer.size() - 1) );//advance to next one - headIndex = mHead.load(); - mElementsFilled.fetch_sub(1); - canWrite.notify_one(); - } - } - } - return samplesFilled; - } - - void Reset(uint32_t bufLength) - { - std::unique_lock<std::mutex> lck(writeLock); - std::unique_lock<std::mutex> lck2(readLock); - mBuffer.resize(bufLength); - mHead.store(0); - mTail.store(0); - mElementsFilled.store(0); - } - -protected: - std::vector<SamplesPacket> mBuffer; - std::atomic<uint32_t> mHead; - std::atomic<uint32_t> mTail; - std::mutex writeLock; - std::mutex readLock; - std::atomic<uint32_t> mElementsFilled; - std::condition_variable canWrite; - std::condition_variable canRead; -}; - -#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/ringBuffer.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/ringBuffer.h deleted file mode 100644 index e4882f8924cf624b6554b6e04aa95898ff40d66d..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/ringBuffer.h +++ /dev/null @@ -1,143 +0,0 @@ -#ifndef LMS_RING_BUFFER_H -#define LMS_RING_BUFFER_H - -#include <mutex> -#include <atomic> -#include <vector> -#include <condition_variable> - -template<class T> -class RingBuffer -{ -public: - struct BufferInfo - { - uint32_t size; - uint32_t itemsFilled; - }; - - BufferInfo GetInfo() - { - unique_lock<mutex> lck(mLock); - BufferInfo stats; - stats.size = (uint32_t)mBuffer.size(); - stats.itemsFilled = mElementsFilled; - return stats; - } - - RingBuffer(uint32_t bufLength) - { - Reset(bufLength); - } - ~RingBuffer(){}; - - /** @brief inserts items to ring buffer - @param buffer data source - @param itemCount number of buffer items to insert - @param timeout_ms timeout duration for operation - @return number of items added - */ - uint32_t push_back(const T* buffer, const uint32_t itemCount, const uint32_t timeout_ms) - { - uint32_t addedItems = 0; - while (addedItems < itemCount) - { - unique_lock<mutex> lck(mLock); - while (mElementsFilled >= mBuffer.size()) //wait for free space to insert items - { - if (canWrite.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) - return addedItems; //dropped all items - } - - uint32_t itemsToInsert = itemCount - addedItems; - uint32_t itemsToEnd = (uint32_t)mBuffer.size() - mTail.load(); //might need to split memcpy into two operations - if (itemsToInsert > itemsToEnd) - { - memcpy(&mBuffer[mTail], &buffer[addedItems], itemsToEnd*sizeof(T)); - memcpy(&mBuffer[0], &buffer[addedItems+itemsToEnd], (itemsToInsert - itemsToEnd)*sizeof(T)); - } - else - memcpy(&mBuffer[mTail], &buffer[addedItems], itemsToInsert*sizeof(T)); - mTail.store((mTail.load() + itemsToInsert) & (mBuffer.size() - 1)); - mElementsFilled += itemsToInsert; - lck.unlock(); - canRead.notify_one(); - addedItems += itemsToInsert; - } - return addedItems; - } - - /** @brief Takes items out of ring buffer - @param buffer data destination - @param itemCount number of items to extract from ring buffer - @param timeout_ms timeout duration for operation - @return number of items returned - */ - uint32_t pop_front(T* buffer, const uint32_t itemCount, const uint32_t timeout_ms) - { - assert(buffer != nullptr); - uint32_t itemsTaken = 0; - T* destBuffer = buffer; - while (itemsTaken < itemCount) - { - unique_lock<mutex> lck(mLock); - while (mElementsFilled == 0) //buffer might be empty, wait for items - { - if (canRead.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) - return itemsTaken; - } - - unsigned int itemsToCopy = itemCount - itemsTaken; - if (itemsToCopy > mElementsFilled) - itemsToCopy = mElementsFilled; - unsigned int itemsToEnd = (uint32_t)mBuffer.size() - mHead.load(); //migth need to split memcpy into two operations - if (itemsToEnd < itemsToCopy) - { - memcpy(&destBuffer[itemsTaken], &mBuffer[mHead.load()], sizeof(T)*itemsToEnd); - memcpy(&destBuffer[itemsTaken+itemsToEnd], &mBuffer[0], sizeof(T)*(itemsToCopy - itemsToEnd)); - mHead.store((itemsToCopy - itemsToEnd) & (mBuffer.size() - 1)); - } - else - { - memcpy(&destBuffer[itemsTaken], &mBuffer[mHead.load()], sizeof(T)*itemsToCopy); - int headVal = mHead.load(); - int valueToStore = (headVal + itemsToCopy) & (mBuffer.size() - 1); - mHead.store(valueToStore); - headVal = mHead.load(); - } - mElementsFilled -= itemsToCopy; - lck.unlock(); - canWrite.notify_one(); - itemsTaken += itemsToCopy; - } - return itemsTaken; - } - - void Reset(uint32_t bufLength) - { - std::unique_lock<std::mutex> lck(mLock); - if (bufLength >= (uint32_t)(1 << 31)) - bufLength = (uint32_t)(1 << 31); - for (int i = 0; i < 32; ++i) - if ((1 << i) >= bufLength) - { - bufLength = (1 << i); - break; - } - mBuffer.resize(bufLength); - mHead.store(0); - mTail.store(0); - mElementsFilled = 0; - } - -protected: - std::vector<T> mBuffer; - std::atomic<uint32_t> mHead; - std::atomic<uint32_t> mTail; - std::mutex mLock; - uint32_t mElementsFilled; - std::condition_variable canWrite; - std::condition_variable canRead; -}; - -#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp index 104b64dd3595acb67aa44c320b4c60019c23439d..3a9878e82b182c670602344442321b6ffdb52804 100644 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp @@ -31,32 +31,24 @@ #include <unistd.h> #include <errno.h> -#include "common_lib.h" -#include "LMS_SDR.h" -#include "LMS7002M.h" -#include "Si5351C.h" -#include "LMS_StreamBoard.h" -#include "LMS7002M_RegistersMap.h" - #include <cmath> /** @addtogroup _LMSSDR_PHY_RF_INTERFACE_ * @{ */ +#include <lime/LimeSuite.h> +#include <lime/LMS7002M.h> +#include <lime/LMS7002M_RegistersMap.h> +#include "common_lib.h" -///define for parameter enumeration if prefix might be needed -#define LMS7param(id) id - -LMScomms* usbport; -LMScomms* comport; -LMS7002M* lms7; -Si5351C* Si; -LMS_StreamBoard *lmsStream; +lms_device_t* lms_device; +lms_stream_t rx_stream; +lms_stream_t tx_stream; #define RXDCLENGTH 4096 -#define NUMBUFF 40 -int16_t cos_fsover8[8] = {2047, 1447, 0, -1448, -2047, -1448, 0, 1447}; -int16_t cos_3fsover8[8] = {2047, -1448, 0, 1447, -2047, 1447, 0, -1448}; +#define NUMBUFF 32 + +using namespace lime; extern "C" { @@ -65,18 +57,23 @@ int write_output(const char *fname,const char *vname,void *data,int length,int d /*! \brief Called to send samples to the LMSSDR RF target \param device pointer to the device structure specific to the RF hardware target - \param timestamp The timestamp at whicch the first sample MUST be sent + \param timestamp The timestamp at whicch the first sample MUST be sent \param buff Buffer which holds the samples \param nsamps number of samples to be sent \param antenna_id index of the antenna \param flags Ignored for the moment \returns 0 on success -*/ +*/ int trx_lms_write(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int antenna_id, int flags) { - - LMS_TRxWrite((int16_t*)buff[0], nsamps,0, timestamp); - return nsamps; + + lms_stream_meta_t meta; + meta.waitForTimestamp = true; + meta.flushPartialPacket = false; + meta.timestamp = timestamp; + + + return LMS_SendStream(&tx_stream,(const void*)buff[0],nsamps,&meta,30); } /*! \brief Receive samples from hardware. @@ -91,16 +88,18 @@ int trx_lms_write(openair0_device *device, openair0_timestamp timestamp, void ** * \returns number of samples read */ int trx_lms_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int antenna_id) { - - uint64_t timestamp; - int16_t *dst_ptr = (int16_t*) buff[0]; - int ret; - ret = LMS_TRxRead(dst_ptr, nsamps,0,×tamp, 10); - *ptimestamp=timestamp; - return ret; + lms_stream_meta_t meta; + meta.waitForTimestamp = false; + meta.flushPartialPacket = false; + + int ret; + ret = LMS_RecvStream(&rx_stream,buff[0],nsamps,&meta,50); + *ptimestamp = meta.timestamp; + return ret; } + /*! \brief set RX gain offset from calibration table * \param openair0_cfg RF frontend parameters set by application * \param chain_index RF chain ID @@ -123,227 +122,177 @@ void set_rx_gain_offset(openair0_config_t *openair0_cfg, int chain_index) { } i++; } - + } /*! \brief Set Gains (TX/RX) on LMSSDR * \param device the hardware to use * \param openair0_cfg openair0 Config structure - * \returns 0 in success + * \returns 0 in success */ - int trx_lms_set_gains(openair0_device* device, openair0_config_t *openair0_cfg) { - double gv = openair0_cfg[0].rx_gain[0] - openair0_cfg[0].rx_gain_offset[0]; + LMS_SetNormalizedGain(lms_device, LMS_CH_TX, 0, openair0_cfg[0].tx_gain[0]/100.0); + + // RX gains, use low-level setting + + double gv = openair0_cfg[0].rx_gain[0] - openair0_cfg[0].rx_gain_offset[0]; + if (gv > 31) { + printf("RX Gain 0 too high, reduce by %f dB\n",gv-31); + gv = 31; + } + if (gv < 0) { + printf("RX Gain 0 too low, increase by %f dB\n",-gv); + gv = 0; + } + printf("[LMS] Setting 7002M G_PGA_RBB to %d\n", (int16_t)gv); + LMS7002M lms7; + lms7.SetConnection(lms7.GetConnection()); + lms7.Modify_SPI_Reg_bits(LMS7param(G_PGA_RBB),(int16_t)gv); - if (gv > 31) { - printf("RX Gain 0 too high, reduce by %f dB\n",gv-31); - gv = 31; - } - if (gv < 0) { - printf("RX Gain 0 too low, increase by %f dB\n",-gv); - gv = 0; - } - printf("[LMS] Setting 7002M G_PGA_RBB to %d\n", (int16_t)gv); - lms7->Modify_SPI_Reg_bits(LMS7param(G_PGA_RBB),(int16_t)gv); return(0); } /*! \brief Start LMSSDR - * \param device the hardware to use + * \param device the hardware to use * \returns 0 on success */ int trx_lms_start(openair0_device *device){ - - - LMS_Init(0, 128*1024); - usbport = LMS_GetUSBPort(); - //connect data stream port - LMS_UpdateDeviceList(usbport); - const char *name = LMS_GetDeviceName(usbport, 0); - printf("Connecting to device: %s\n",name); - - - - if (LMS_DeviceOpen(usbport, 0)==0) - { - Si = new Si5351C(); - lms7 = new LMS7002M(usbport); - liblms7_status opStatus; - - printf("Configuring Si5351C\n"); - Si->Initialize(usbport); - Si->SetPLL(0, 25000000, 0); - Si->SetPLL(1, 25000000, 0); - Si->SetClock(0, 27000000, true, false); - Si->SetClock(1, 27000000, true, false); - for (int i = 2; i < 8; ++i) - Si->SetClock(i, 27000000, false, false); - Si5351C::Status status = Si->ConfigureClocks(); - if (status != Si5351C::SUCCESS) - { - printf("Failed to configure Si5351C"); - exit(-1); - } - status = Si->UploadConfiguration(); - if (status != Si5351C::SUCCESS) - printf("Failed to upload Si5351C configuration"); - + lms_info_str_t list[16]={0}; - lms7->ResetChip(); + int n= LMS_GetDeviceList(list); - opStatus = lms7->LoadConfig(device->openair0_cfg[0].configFilename); - - if (opStatus != LIBLMS7_SUCCESS) { - printf("Failed to load configuration file %s\n",device->openair0_cfg[0].configFilename); - exit(-1); + if (n <= 0) { + fprintf(stderr, "No LimeSDR board found: %s\n", n < 0?LMS_GetLastErrorMessage():""); + return -1; } - opStatus = lms7->UploadAll(); - if (opStatus != LIBLMS7_SUCCESS) { - printf("Failed to upload configuration file\n"); - exit(-1); + printf("Connecting to device: %s\n",list[0]); + if (LMS_Open(&lms_device,list[0],NULL)<0) { + fprintf(stderr, "Can't open device port: %s\n",LMS_GetLastErrorMessage()); + return -1; } - // Set TX filter - - printf("Tuning TX filter\n"); - opStatus = lms7->TuneTxFilter(LMS7002M::TxFilter::TX_HIGHBAND,device->openair0_cfg[0].tx_bw/1e6); + LMS_Init(lms_device); + LMS_EnableCalibCache(lms_device,false); - if (opStatus != LIBLMS7_SUCCESS) { - printf("Warning: Could not tune TX filter to %f MHz\n",device->openair0_cfg[0].tx_bw/1e6); + if (LMS_LoadConfig(lms_device,device->openair0_cfg[0].configFilename) != 0) + { + printf("Failed to load configuration file %s\n%s",device->openair0_cfg[0].configFilename,LMS_GetLastErrorMessage()); + exit(-1); } - - printf("Tuning RX filter\n"); - - opStatus = lms7->TuneRxFilter(LMS7002M::RxFilter::RX_LPF_LOWBAND,device->openair0_cfg[0].rx_bw/1e6); - if (opStatus != LIBLMS7_SUCCESS) { - printf("Warning: Could not tune RX filter to %f MHz\n",device->openair0_cfg[0].rx_bw/1e6); + /* LMS_EnableChannel(lms_device,LMS_CH_RX,0,true); + LMS_EnableChannel(lms_device,LMS_CH_TX,0,true); + if (device->openair0_cfg->rx_num_channels == 2) + { + LMS_EnableChannel(lms_device,LMS_CH_RX,1,true); + LMS_EnableChannel(lms_device,LMS_CH_TX,1,true); + } */ + LMS_VCTCXOWrite(lms_device,129); + + if (LMS_SetSampleRate(lms_device,device->openair0_cfg->sample_rate,2)!=0) + { + fprintf(stderr, "Failed to set sample rate %s\n",LMS_GetLastErrorMessage()); + return -1; } + printf("Set sample rate %f MHz\n",device->openair0_cfg->sample_rate/1e6); - /* printf("Tuning TIA filter\n"); - opStatus = lms7->TuneRxFilter(LMS7002M::RxFilter::RX_TIA,7.0); - - if (opStatus != LIBLMS7_SUCCESS) { - printf("Warning: Could not tune RX TIA filter\n"); - }*/ - - opStatus = lms7->SetInterfaceFrequency(lms7->GetFrequencyCGEN_MHz(), - lms7->Get_SPI_Reg_bits(HBI_OVR_TXTSP), - lms7->Get_SPI_Reg_bits(HBD_OVR_RXTSP)); - if (opStatus != LIBLMS7_SUCCESS) { - printf("SetInterfaceFrequency failed: %f,%d,%d\n", - lms7->GetFrequencyCGEN_MHz(), - lms7->Get_SPI_Reg_bits(HBI_OVR_TXTSP), - lms7->Get_SPI_Reg_bits(HBD_OVR_RXTSP)); + if (LMS_SetLOFrequency(lms_device,LMS_CH_RX, 0, device->openair0_cfg[0].rx_freq[0])!=0) + { + fprintf(stderr, "Failed to Set Rx frequency: %s\n", LMS_GetLastErrorMessage()); + return -1; } - else { - printf("SetInterfaceFrequency as %f,%d,%d\n", - lms7->GetFrequencyCGEN_MHz(), - lms7->Get_SPI_Reg_bits(HBI_OVR_TXTSP), - lms7->Get_SPI_Reg_bits(HBD_OVR_RXTSP)); - } - lmsStream = new LMS_StreamBoard(usbport); - LMS_StreamBoard::Status opStreamStatus; - // this will configure that sampling rate at output of FPGA - opStreamStatus = lmsStream->ConfigurePLL(usbport, - device->openair0_cfg[0].sample_rate, - device->openair0_cfg[0].sample_rate,90); - if (opStatus != LIBLMS7_SUCCESS){ - printf("Sample rate programming failed\n"); - exit(-1); + if (LMS_SetLOFrequency(lms_device,LMS_CH_TX, 0,device->openair0_cfg[0].tx_freq[0])!=0) + { + fprintf(stderr, "Failed to Set Tx frequency: %s\n", LMS_GetLastErrorMessage()); + return -1; } + printf("Set TX frequency %f MHz\n",device->openair0_cfg[0].tx_freq[0]/1e6); - opStatus = lms7->SetFrequencySX(LMS7002M::Tx, device->openair0_cfg[0].tx_freq[0]/1e6,30.72); + printf("Override antenna settings to: RX1_H, TXA_2"); + LMS_SetAntenna(lms_device, LMS_CH_RX, 0, 1); + LMS_SetAntenna(lms_device, LMS_CH_TX, 0, 2); - if (opStatus != LIBLMS7_SUCCESS) { - printf("Cannot set TX frequency %f MHz\n",device->openair0_cfg[0].tx_freq[0]/1e6); - exit(-1); - } - else { - printf("Set TX frequency %f MHz\n",device->openair0_cfg[0].tx_freq[0]/1e6); - } - opStatus = lms7->SetFrequencySX(LMS7002M::Rx, device->openair0_cfg[0].rx_freq[0]/1e6,30.72); - if (opStatus != LIBLMS7_SUCCESS) { - printf("Cannot set RX frequency %f MHz\n",device->openair0_cfg[0].rx_freq[0]/1e6); - exit(-1); - } - else { - printf("Set RX frequency %f MHz\n",device->openair0_cfg[0].rx_freq[0]/1e6); + + for (int i = 0; i< device->openair0_cfg->rx_num_channels; i++) + { + if (LMS_SetLPFBW(lms_device,LMS_CH_RX,i,device->openair0_cfg->rx_bw)!=0) + printf("RX ch:%d filter calibration failed, bw:%fMHz\n%s\n",i,device->openair0_cfg->rx_bw/1e6,LMS_GetLastErrorMessage()); + if (LMS_SetLPFBW(lms_device,LMS_CH_TX,i,device->openair0_cfg->tx_bw)!=0) + printf("TX ch:%d filter calibration failed, bw:%fMHz\n%s\n",i,device->openair0_cfg->tx_bw/1e6,LMS_GetLastErrorMessage()); + + if (LMS_Calibrate(lms_device,LMS_CH_RX,i,device->openair0_cfg->rx_bw,0)!=0) + printf("RX ch:%d calibration failed, bw:%f MHz\n%s\n",i,device->openair0_cfg->rx_bw/1e6,LMS_GetLastErrorMessage()); + if (LMS_Calibrate(lms_device,LMS_CH_TX,i,device->openair0_cfg->tx_bw,0)!=0) + printf("TX ch:%d calibration failed, bw:%fMHz\n%s\n",i,device->openair0_cfg->tx_bw/1e6,LMS_GetLastErrorMessage()); } + + rx_stream.channel = 0; + rx_stream.fifoSize = 256*1024; + rx_stream.throughputVsLatency = 0.1; + rx_stream.dataFmt = lms_stream_t::LMS_FMT_I12; + rx_stream.isTx = false; + if (LMS_SetupStream(lms_device, &rx_stream)!=0) + printf("RX stream setup failed %s\n",LMS_GetLastErrorMessage()); + tx_stream.channel = 0; + tx_stream.fifoSize = 256*1024; + tx_stream.throughputVsLatency = 0.1; + tx_stream.dataFmt = lms_stream_t::LMS_FMT_I12; + tx_stream.isTx = true; + trx_lms_set_gains(device, device->openair0_cfg); - // Run calibration procedure - // calibrate_rf(device); - //lms7->CalibrateTx(5.0); - LMS_RxStart(); - } - else - { - return(-1); - } - - //connect control port - - /* comport = LMS_GetCOMPort(); - LMS_UpdateDeviceList(comport); - name = LMS_GetDeviceName(comport, 0); - if (*name == 0) - comport = usbport; //attempt to use data port - else - { - printf("Connecting to device: %s\n",name); - if (LMS_DeviceOpen(comport, 0)!=0) - return (-1); - } - lms7 = new LMS7002M(comport); - if( access( "./config.ini", F_OK ) != -1 ) //load config file - lms7->LoadConfig("./config.ini"); - //calibration takes too long - //lms7->CalibrateRx(5.0); - //lms7->CalibrateTx(5.0); - */ - return 0; + if (LMS_SetupStream(lms_device, &tx_stream)!=0) + printf("TX stream setup failed %s\n",LMS_GetLastErrorMessage()); + + printf("SR: %.3f MHz\n", (float)device->openair0_cfg->sample_rate / 1e6); + + + printf("SR: %.3f MHz\n", (float)device->openair0_cfg->sample_rate / 1e6); + + if (LMS_StartStream(&rx_stream)!=0) + printf("Failed to start TX stream %s\n",LMS_GetLastErrorMessage()); + if (LMS_StartStream(&tx_stream)!=0) + printf("Failed to start Rx stream %s\n",LMS_GetLastErrorMessage()); + return 0; } /*! \brief Stop LMSSDR - * \param card Index of the RF card to use + * \param card Index of the RF card to use * \returns 0 on success */ int trx_lms_stop(openair0_device *device) { - /* - LMS_DeviceClose(usbport); - LMS_DeviceClose(comport); - delete lms7; - return LMS_Destroy(); - */ + LMS_StopStream(&rx_stream); + LMS_StopStream(&tx_stream); + LMS_DestroyStream(lms_device,&rx_stream); + LMS_DestroyStream(lms_device,&tx_stream); + LMS_Close(lms_device); } /*! \brief Set frequencies (TX/RX) * \param device the hardware to use * \param openair0_cfg openair0 Config structure (ignored. It is there to comply with RF common API) * \param exmimo_dump_config (ignored) - * \returns 0 in success + * \returns 0 in success */ int trx_lms_set_freq(openair0_device* device, openair0_config_t *openair0_cfg,int exmimo_dump_config) { - //Control port must be connected - - lms7->SetFrequencySX(LMS7002M::Tx,openair0_cfg->tx_freq[0]/1e6,30.72); - lms7->SetFrequencySX(LMS7002M::Rx,openair0_cfg->rx_freq[0]/1e6,30.72); + //Control port must be connected + LMS_SetLOFrequency(lms_device,LMS_CH_TX,0,openair0_cfg->tx_freq[0]); + LMS_SetLOFrequency(lms_device,LMS_CH_RX,0,openair0_cfg->rx_freq[0]); printf ("[LMS] rx frequency:%f;\n",openair0_cfg->rx_freq[0]/1e6); set_rx_gain_offset(openair0_cfg,0); return(0); - + } // 31 = 19 dB => 105 dB total gain @ 2.6 GHz /*! \brief calibration table for LMSSDR */ -rx_gain_calib_table_t calib_table_sodera[] = { +rx_gain_calib_table_t calib_table_lmssdr[] = { {3500000000.0,70.0}, {2660000000.0,80.0}, {2300000000.0,80.0}, @@ -355,10 +304,12 @@ rx_gain_calib_table_t calib_table_sodera[] = { + /*! \brief Get LMSSDR Statistics * \param device the hardware to use - * \returns 0 in success + * \returns 0 in success */ + int trx_lms_get_stats(openair0_device* device) { return(0); @@ -367,7 +318,7 @@ int trx_lms_get_stats(openair0_device* device) { /*! \brief Reset LMSSDR Statistics * \param device the hardware to use - * \returns 0 in success + * \returns 0 in success */ int trx_lms_reset_stats(openair0_device* device) { @@ -376,7 +327,7 @@ int trx_lms_reset_stats(openair0_device* device) { } -/*! \brief Terminate operation of the LMSSDR transceiver -- free all associated resources +/*! \brief Terminate operation of the LMSSDR transceiver -- free all associated resources * \param device the hardware to use */ void trx_lms_end(openair0_device *device) { @@ -398,25 +349,25 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg){ case 30720000: // from usrp_time_offset openair0_cfg[0].samples_per_packet = 2048; - openair0_cfg[0].tx_sample_advance = 15; + openair0_cfg[0].tx_sample_advance = 40; openair0_cfg[0].tx_bw = 30.72e6; openair0_cfg[0].rx_bw = 30.72e6; break; case 15360000: openair0_cfg[0].samples_per_packet = 2048; - openair0_cfg[0].tx_sample_advance = 45; - openair0_cfg[0].tx_bw = 28e6; + openair0_cfg[0].tx_sample_advance = 70; + openair0_cfg[0].tx_bw = 10e6; openair0_cfg[0].rx_bw = 10e6; break; case 7680000: openair0_cfg[0].samples_per_packet = 1024; - openair0_cfg[0].tx_sample_advance = 70; - openair0_cfg[0].tx_bw = 28e6; + openair0_cfg[0].tx_sample_advance = 50; + openair0_cfg[0].tx_bw = 5.0e6; openair0_cfg[0].rx_bw = 5.0e6; break; case 1920000: openair0_cfg[0].samples_per_packet = 256; - openair0_cfg[0].tx_sample_advance = 50; + openair0_cfg[0].tx_sample_advance = 10; openair0_cfg[0].tx_bw = 1.25e6; openair0_cfg[0].rx_bw = 1.25e6; break; @@ -426,20 +377,20 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg){ break; } - openair0_cfg[0].rx_gain_calib_table = calib_table_sodera; + openair0_cfg[0].rx_gain_calib_table = calib_table_lmssdr; set_rx_gain_offset(openair0_cfg,0); device->Mod_id = 1; device->trx_start_func = trx_lms_start; device->trx_write_func = trx_lms_write; - device->trx_read_func = trx_lms_read; + device->trx_read_func = trx_lms_read; device->trx_get_stats_func = trx_lms_get_stats; device->trx_reset_stats_func = trx_lms_reset_stats; device->trx_end_func = trx_lms_end; device->trx_stop_func = trx_lms_stop; device->trx_set_freq_func = trx_lms_set_freq; device->trx_set_gains_func = trx_lms_set_gains; - + device->openair0_cfg = openair0_cfg; return 0; diff --git a/targets/ARCH/LMSSDR/enb_sodera_highband_10MHz_rx19dB_txfull.ini b/targets/ARCH/LMSSDR/enb_sodera_highband_10MHz_rx19dB_txfull.ini deleted file mode 100644 index e4e420c33435b03ab74cd530465f70c11f20854d..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/enb_sodera_highband_10MHz_rx19dB_txfull.ini +++ /dev/null @@ -1,1128 +0,0 @@ -[file_info] -type=lms7002m_minimal_config -version=1 -[lms7002_registers_a] -0x0493=0x0000 -0x0492=0x0000 -0x0491=0x0000 -0x029B=0x0000 -0x048E=0x0000 -0x0022=0x07FF -0x0283=0x0000 -0x0487=0x0000 -0x0486=0x0000 -0x045F=0x0000 -0x0480=0x0000 -0x0460=0x0000 -0x0447=0x0000 -0x045A=0x0000 -0x02DA=0x0000 -0x0458=0x0000 -0x0314=0x0000 -0x0456=0x0000 -0x0559=0xACB9 -0x0451=0x0000 -0x0390=0x0000 -0x044B=0x0000 -0x0448=0x0000 -0x0454=0x0000 -0x0446=0x0000 -0x04CA=0x0000 -0x0444=0x0000 -0x0443=0x0000 -0x0508=0xEF99 -0x0441=0x0000 -0x040D=0x0000 -0x040B=0x000F -0x0409=0x0000 -0x0580=0xEFF2 -0x0407=0x0000 -0x0405=0x0000 -0x0254=0x0000 -0x0404=0x0000 -0x00A0=0x6565 -0x0560=0x174B -0x0403=0x0013 -0x0402=0x07D9 -0x055E=0xDB10 -0x03A7=0x0000 -0x0520=0x174B -0x03A5=0x0000 -0x03A4=0x0000 -0x03A3=0x0000 -0x03A2=0x0000 -0x051C=0x0000 -0x048D=0x0000 -0x059A=0x0000 -0x03A1=0x0000 -0x02A2=0x0000 -0x04E1=0x0000 -0x039F=0x0000 -0x0248=0x0000 -0x039B=0x0000 -0x0408=0x0000 -0x0398=0x0000 -0x0393=0x0000 -0x0305=0x0000 -0x038E=0x0000 -0x0324=0x0000 -0x02E7=0x0000 -0x038D=0x0000 -0x0387=0x0000 -0x03A0=0x0000 -0x02D0=0x0000 -0x009A=0x658C -0x054E=0x8184 -0x0386=0x0000 -0x040F=0x43E4 -0x04E3=0x0000 -0x0389=0x0000 -0x054F=0x18C9 -0x0385=0x0000 -0x0315=0x0000 -0x0384=0x0000 -0x0382=0x0000 -0x0288=0x0000 -0x0366=0x0000 -0x0365=0x0000 -0x0364=0x0000 -0x0325=0x0000 -0x0081=0x0000 -0x0362=0x0000 -0x038A=0x0000 -0x035E=0x0000 -0x035D=0x0000 -0x0442=0x0000 -0x0449=0x0000 -0x035A=0x0000 -0x02C8=0x0000 -0x0452=0x0000 -0x0299=0x0000 -0x0359=0x0000 -0x0358=0x0000 -0x048B=0x0000 -0x0354=0x0000 -0x0351=0x0000 -0x03A6=0x0000 -0x0293=0x0000 -0x034E=0x0000 -0x035C=0x0000 -0x034D=0x0000 -0x034B=0x0000 -0x011A=0x2E14 -0x0455=0x0000 -0x034A=0x0000 -0x0348=0x0000 -0x0084=0x0400 -0x0498=0x0000 -0x035B=0x0000 -0x0505=0x00D8 -0x0345=0x0000 -0x0484=0x0000 -0x0586=0x196B -0x0344=0x0000 -0x0561=0xAB08 -0x0343=0x0000 -0x0342=0x0000 -0x0380=0x0000 -0x0327=0x0000 -0x0322=0x0000 -0x059B=0x0000 -0x0321=0x0000 -0x045E=0x0000 -0x0440=0x0024 -0x031D=0x0000 -0x0363=0x0000 -0x031A=0x0000 -0x031C=0x0000 -0x028F=0x0000 -0x0341=0x0000 -0x0287=0x0000 -0x0318=0x0000 -0x031F=0x0000 -0x0316=0x0000 -0x030D=0x0000 -0x040E=0x0003 -0x0352=0x0000 -0x028C=0x0000 -0x0360=0x0000 -0x0313=0x0000 -0x0461=0x0000 -0x010A=0x104C -0x051B=0xB77F -0x0312=0x0000 -0x0346=0x0000 -0x024E=0x0000 -0x0311=0x0000 -0x02D6=0x0000 -0x030C=0x0000 -0x04DF=0x0000 -0x030B=0x0000 -0x0392=0x0000 -0x030A=0x0000 -0x029F=0x0000 -0x0309=0x0000 -0x048A=0x0000 -0x0308=0x0000 -0x0588=0xE6C7 -0x0397=0x0000 -0x02E3=0x0000 -0x049C=0x0000 -0x044A=0x0000 -0x04A4=0x0000 -0x0306=0x0000 -0x0304=0x0000 -0x04D5=0x0000 -0x0303=0x0000 -0x0302=0x0000 -0x0510=0xE6C7 -0x044E=0x0000 -0x0300=0x0000 -0x034F=0x0000 -0x045B=0x0000 -0x02E6=0x0000 -0x00A3=0x6565 -0x04DA=0x0000 -0x025E=0x0000 -0x020A=0x0080 -0x0102=0x3180 -0x020C=0x8000 -0x05A2=0x0000 -0x040A=0x1000 -0x0556=0xA2B5 -0x0243=0x0000 -0x051D=0x4F91 -0x0259=0x0000 -0x02D5=0x0000 -0x02E1=0x0000 -0x011D=0xAAAA -0x039E=0x0000 -0x0252=0x0000 -0x0204=0xC016 -0x0255=0x0000 -0x0281=0x0000 -0x0200=0x0301 -0x0594=0xF40D -0x02C5=0x0000 -0x0406=0x0000 -0x030F=0x0000 -0x025D=0x0000 -0x0319=0x0000 -0x0121=0x3760 -0x0101=0x7800 -0x025B=0x0000 -0x02C6=0x0000 -0x0558=0x5009 -0x0021=0x0E9F -0x04C2=0x0000 -0x0290=0x0000 -0x02DF=0x0000 -0x0291=0x0000 -0x0296=0x0000 -0x029C=0x0000 -0x028D=0x0000 -0x02A1=0x0000 -0x008B=0x2756 -0x02A3=0x0000 -0x05A4=0x0000 -0x02A7=0x0000 -0x0483=0x0000 -0x0201=0x07FF -0x02C2=0x0000 -0x02C4=0x0000 -0x044D=0x0000 -0x02E2=0x0000 -0x02D1=0x0000 -0x0546=0x8D44 -0x04C8=0x0000 -0x0207=0x0000 -0x04C6=0x0000 -0x0096=0x0000 -0x0093=0x0000 -0x0250=0x0000 -0x02CB=0x0000 -0x02D3=0x0000 -0x0494=0x0000 -0x04CF=0x0000 -0x025F=0x0000 -0x0251=0x0000 -0x0488=0x0000 -0x0496=0x0000 -0x04C3=0x0000 -0x0100=0x3409 -0x04CC=0x0000 -0x02A5=0x0000 -0x0257=0x0000 -0x04D6=0x0000 -0x04A6=0x0000 -0x049A=0x0000 -0x049B=0x0000 -0x0097=0x0000 -0x011E=0x0A2A -0x0285=0x0000 -0x0280=0x0000 -0x049E=0x0000 -0x0020=0xFFFD -0x02DD=0x0000 -0x0297=0x0000 -0x049F=0x0000 -0x0522=0xDB10 -0x044C=0x0000 -0x0355=0x0000 -0x04A0=0x0000 -0x02CF=0x0000 -0x04D1=0x0000 -0x0526=0xBE2A -0x0092=0x0001 -0x031B=0x0000 -0x0541=0x4C24 -0x0518=0xEFF2 -0x0543=0xBD96 -0x02C0=0x0000 -0x0499=0x0000 -0x04A1=0x0000 -0x058D=0xF5EF -0x02D7=0x0000 -0x0513=0xDAA2 -0x0549=0x18C9 -0x0552=0x8D44 -0x0521=0x5852 -0x0509=0x0605 -0x0286=0x0000 -0x024F=0x0000 -0x04E0=0x0000 -0x0545=0x364E -0x0349=0x0000 -0x0555=0xBD96 -0x04E4=0x0000 -0x02E4=0x0000 -0x0551=0xD7B7 -0x055D=0xA6B5 -0x0298=0x0000 -0x055F=0x5852 -0x009E=0x658C -0x0547=0xD7B7 -0x0598=0xF61D -0x0123=0x067B -0x0497=0x0000 -0x04A5=0x0000 -0x0565=0xB77F -0x0124=0x0000 -0x0592=0x0DF1 -0x0591=0xFCFE -0x0548=0x79FA -0x04D2=0x0000 -0x0599=0x0000 -0x0511=0x1D10 -0x0506=0x0DF1 -0x0595=0x00BC -0x0584=0xE7E2 -0x0242=0x0000 -0x025A=0x0000 -0x04E2=0x0000 -0x04C5=0x0000 -0x058C=0xEA50 -0x0450=0x0000 -0x0596=0x0A94 -0x05A7=0x0000 -0x058A=0x17DC -0x059D=0x0000 -0x0485=0x0000 -0x058E=0x1316 -0x0550=0x79FA -0x0554=0x6901 -0x0593=0x00D8 -0x0542=0xA2B5 -0x0553=0x364E -0x0563=0x4F91 -0x024D=0x0000 -0x0567=0x4049 -0x055A=0xBE2A -0x0295=0x0000 -0x0566=0x0906 -0x028A=0x0000 -0x059C=0x0000 -0x04DD=0x0000 -0x054C=0x7FFF -0x0582=0x150F -0x0585=0xDAA2 -0x0109=0x8CC1 -0x04A2=0x0000 -0x0292=0x0000 -0x059F=0x0000 -0x0583=0x2E45 -0x050E=0x17DC -0x0516=0x150F -0x0523=0xA6B5 -0x0525=0x57AC -0x0206=0x0000 -0x051A=0x0906 -0x055C=0x3347 -0x0514=0xE7E2 -0x050F=0xEA5F -0x05A6=0x0000 -0x051E=0xF524 -0x050A=0x1316 -0x04C7=0x0000 -0x049D=0x0000 -0x0527=0xACB9 -0x050C=0xEA50 -0x0087=0x0000 -0x0399=0x0000 -0x050B=0xF5EF -0x0507=0xFCFE -0x010D=0x00DE -0x04C4=0x0000 -0x0495=0x0000 -0x0246=0x0000 -0x0503=0x00BC -0x0320=0x0000 -0x0323=0x0000 -0x02E5=0x0000 -0x055B=0x57AC -0x0114=0x0110 -0x04D8=0x0000 -0x04E7=0x0000 -0x04D0=0x0000 -0x04E6=0x0000 -0x00AE=0x0000 -0x0544=0x6901 -0x0258=0x0000 -0x0502=0x0A94 -0x04DE=0x0000 -0x058B=0x0F45 -0x0028=0x0101 -0x029E=0x0000 -0x04DC=0x0000 -0x04D9=0x0000 -0x0557=0x4C24 -0x058F=0x0605 -0x04DB=0x0000 -0x04D7=0x0000 -0x059E=0x0000 -0x024C=0x0000 -0x02DC=0x0000 -0x04D4=0x0000 -0x0504=0xF40D -0x02C3=0x0000 -0x04C1=0x0000 -0x04D3=0x0000 -0x0590=0xEF99 -0x04CE=0x0000 -0x05A5=0x0000 -0x04A7=0x0000 -0x0489=0x0000 -0x02E0=0x0000 -0x0118=0x018C -0x002A=0x0086 -0x0245=0x0000 -0x045D=0x0000 -0x0581=0xC89D -0x02D2=0x0000 -0x039C=0x0000 -0x002B=0x4032 -0x02A0=0x0000 -0x010E=0x0285 -0x0394=0x0000 -0x0459=0x0000 -0x0088=0x04F0 -0x0085=0x0001 -0x0089=0x0048 -0x0256=0x0000 -0x0111=0x0099 -0x0095=0x0000 -0x0203=0x2F99 -0x030E=0x0000 -0x0482=0x0000 -0x05A0=0x0000 -0x009C=0x658C -0x0381=0x0000 -0x0122=0x033F -0x0110=0x0BFF -0x0026=0x0101 -0x0294=0x0000 -0x009D=0x6565 -0x0524=0x3347 -0x0106=0x3182 -0x028E=0x0000 -0x0326=0x0000 -0x0113=0x03C3 -0x0391=0x0000 -0x04CB=0x0000 -0x010F=0x3042 -0x0119=0x18DF -0x02A6=0x0000 -0x05A1=0x0000 -0x02C9=0x0000 -0x0500=0xF61D -0x039D=0x0000 -0x011F=0x3600 -0x0395=0x0000 -0x024B=0x0000 -0x045C=0x0000 -0x0247=0x0000 -0x0512=0x196B -0x04E5=0x0000 -0x0024=0x50D8 -0x0353=0x0000 -0x050D=0x0F45 -0x02CD=0x0000 -0x0490=0x0000 -0x0501=0xFDFB -0x034C=0x0000 -0x00AA=0x0000 -0x0350=0x0000 -0x0445=0x0000 -0x048F=0x0000 -0x008A=0x0491 -0x0453=0x0000 -0x0260=0x0000 -0x00A1=0x6565 -0x0356=0x0000 -0x0241=0x0000 -0x008C=0x267B -0x038F=0x0000 -0x054A=0x8184 -0x00A4=0x6565 -0x0401=0x07FF -0x04CD=0x0000 -0x0249=0x0000 -0x002C=0x0000 -0x054D=0xF7A3 -0x00A6=0x0001 -0x002D=0xFFFF -0x00AC=0x2000 -0x0253=0x0000 -0x028B=0x0000 -0x040C=0x40F8 -0x0310=0x0000 -0x0099=0x6565 -0x00A2=0x6565 -0x0589=0xEA5F -0x002F=0x3840 -0x035F=0x0000 -0x0597=0xFDFB -0x0116=0x8180 -0x02CC=0x0000 -0x0025=0x0101 -0x0562=0xF524 -0x011C=0xA941 -0x0289=0x0000 -0x0282=0x0000 -0x0307=0x0000 -0x038C=0x0000 -0x02C7=0x0000 -0x054B=0xF7A3 -0x0519=0x4049 -0x009F=0x658C -0x025C=0x0000 -0x0515=0x2E45 -0x00A5=0x6565 -0x0301=0x0000 -0x02C1=0x0000 -0x0481=0x0000 -0x0517=0xC89D -0x00A8=0x0000 -0x0564=0x0000 -0x00AB=0x0040 -0x0261=0x0000 -0x002E=0x0000 -0x02DE=0x0000 -0x02A4=0x0000 -0x0540=0x5009 -0x00AD=0x03FF -0x0029=0x0101 -0x024A=0x0000 -0x00A7=0x6565 -0x0027=0x05E4 -0x0117=0x100C -0x0098=0x0000 -0x0108=0xFC26 -0x020B=0x4000 -0x0383=0x0000 -0x0202=0x0794 -0x0086=0x4101 -0x010C=0x8865 -0x02D8=0x0000 -0x0347=0x0000 -0x0457=0x0000 -0x0103=0x0612 -0x0104=0x0088 -0x0357=0x0000 -0x02DB=0x0000 -0x0400=0x0101 -0x009B=0x6565 -0x0105=0x0007 -0x05A3=0x0000 -0x0240=0x0028 -0x0367=0x0000 -0x044F=0x0000 -0x038B=0x0000 -0x02D9=0x0000 -0x02CE=0x0000 -0x0284=0x0000 -0x0396=0x0000 -0x029A=0x0000 -0x051F=0xAB08 -0x0361=0x0000 -0x0205=0x0000 -0x031E=0x0000 -0x04C0=0x0000 -0x0587=0x1D10 -0x0023=0x5550 -0x048C=0x0000 -0x0112=0x3171 -0x039A=0x0000 -0x0115=0x0009 -0x00A9=0x8000 -0x0317=0x0000 -0x0244=0x0000 -0x0094=0x0000 -0x0340=0x0000 -0x0208=0x0170 -0x04A3=0x0000 -0x029D=0x0000 -0x0388=0x0000 -0x0120=0xB9FF -0x04C9=0x0000 -0x02CA=0x0000 -0x0209=0x0000 -0x0082=0x8001 -0x02D4=0x0000 -0x0107=0x318C -[lms7002_registers_b] -0x04E1=0x0000 -0x03A1=0x0000 -0x02A2=0x0000 -0x04E0=0x0000 -0x04DE=0x0000 -0x058B=0x0000 -0x04DC=0x0000 -0x04DB=0x0000 -0x04D9=0x0000 -0x04D5=0x0000 -0x0304=0x0000 -0x04D4=0x0000 -0x0504=0x0000 -0x04D3=0x0000 -0x04D2=0x0000 -0x0548=0x0000 -0x04D0=0x0000 -0x04CF=0x0000 -0x025F=0x0000 -0x04CE=0x0000 -0x04CC=0x0000 -0x02A5=0x0000 -0x04C6=0x0000 -0x0207=0x0000 -0x04C1=0x0000 -0x02C3=0x0000 -0x04C9=0x0000 -0x02CA=0x0000 -0x04C0=0x0000 -0x031E=0x0000 -0x04D6=0x0000 -0x0257=0x0000 -0x04A6=0x0000 -0x04A5=0x0000 -0x04A2=0x0000 -0x0109=0x61C1 -0x049D=0x0000 -0x04C7=0x0000 -0x049C=0x0000 -0x0397=0x0000 -0x02E3=0x0000 -0x0499=0x0000 -0x02C0=0x0000 -0x0496=0x0000 -0x04C3=0x0000 -0x0493=0x0000 -0x04A1=0x0000 -0x0492=0x0000 -0x0491=0x0000 -0x029B=0x0000 -0x048E=0x0000 -0x0283=0x0000 -0x048C=0x0000 -0x048B=0x0000 -0x0358=0x0000 -0x0487=0x0000 -0x0486=0x0000 -0x045F=0x0000 -0x0480=0x0000 -0x0460=0x0000 -0x0447=0x0000 -0x045A=0x0000 -0x02DA=0x0000 -0x0458=0x0000 -0x0314=0x0000 -0x0456=0x0000 -0x0559=0x0000 -0x0453=0x0000 -0x0451=0x0000 -0x0390=0x0000 -0x044D=0x0000 -0x02E2=0x0000 -0x044B=0x0000 -0x0448=0x0000 -0x0454=0x0000 -0x0446=0x0000 -0x04CA=0x0000 -0x0444=0x0000 -0x0443=0x0000 -0x0508=0x0000 -0x0441=0x0000 -0x040D=0x0000 -0x040B=0x7FFF -0x0409=0x0000 -0x0580=0x0000 -0x0407=0x0000 -0x0405=0x0000 -0x0254=0x0000 -0x0404=0x0000 -0x0560=0x0000 -0x04D8=0x0000 -0x0403=0x0000 -0x0402=0x07FF -0x055E=0x0000 -0x03A7=0x0000 -0x0520=0x0000 -0x03A5=0x0000 -0x03A4=0x0000 -0x03A3=0x0000 -0x03A2=0x0000 -0x051C=0x0000 -0x048D=0x0000 -0x059A=0x0000 -0x049E=0x0000 -0x039F=0x0000 -0x0248=0x0000 -0x039B=0x0000 -0x0399=0x0000 -0x0408=0x0000 -0x0398=0x0000 -0x0497=0x0000 -0x0123=0x267B -0x0394=0x0000 -0x0459=0x0000 -0x0393=0x0000 -0x0305=0x0000 -0x038E=0x0000 -0x0324=0x0000 -0x02E7=0x0000 -0x038D=0x0000 -0x0395=0x0000 -0x038A=0x0000 -0x0362=0x0000 -0x0387=0x0000 -0x0200=0x0081 -0x0594=0x0000 -0x02C5=0x0000 -0x02A7=0x0000 -0x0318=0x0000 -0x0544=0x0000 -0x049A=0x0000 -0x0388=0x0000 -0x0120=0xB9FF -0x020A=0x0080 -0x0102=0x3180 -0x0290=0x0000 -0x02DF=0x0000 -0x0291=0x0000 -0x0295=0x0000 -0x055A=0x0000 -0x029C=0x0000 -0x010E=0x2040 -0x02A0=0x0000 -0x010F=0x3042 -0x02A6=0x0000 -0x0119=0x18CB -0x02D2=0x0000 -0x039C=0x0000 -0x028D=0x0000 -0x02A1=0x0000 -0x02C2=0x0000 -0x045E=0x0000 -0x031D=0x0000 -0x0440=0x0020 -0x02C4=0x0000 -0x04D1=0x0000 -0x02CF=0x0000 -0x02C1=0x0000 -0x02C7=0x0000 -0x054B=0x0000 -0x02D3=0x0000 -0x04C8=0x0000 -0x02D1=0x0000 -0x0546=0x0000 -0x0306=0x0000 -0x02D7=0x0000 -0x058D=0x0000 -0x0457=0x0000 -0x02D8=0x0000 -0x0347=0x0000 -0x0103=0x0A12 -0x0104=0x0088 -0x0357=0x0000 -0x02DB=0x0000 -0x0400=0x0081 -0x0209=0x0000 -0x0297=0x0000 -0x02DD=0x0000 -0x029E=0x0000 -0x02DE=0x0000 -0x0527=0x0000 -0x02D5=0x0000 -0x02E1=0x0000 -0x0259=0x0000 -0x0481=0x0000 -0x0517=0x0000 -0x029A=0x0000 -0x051F=0x0000 -0x0483=0x0000 -0x0201=0x07FF -0x0507=0x0000 -0x0321=0x0000 -0x034F=0x0000 -0x0296=0x0000 -0x0510=0x0000 -0x0302=0x0000 -0x038C=0x0000 -0x0307=0x0000 -0x0282=0x0000 -0x0392=0x0000 -0x030B=0x0000 -0x0588=0x0000 -0x0308=0x0000 -0x048A=0x0000 -0x044A=0x0000 -0x04A4=0x0000 -0x04C4=0x0000 -0x010D=0x009E -0x0300=0x0000 -0x0587=0x0000 -0x044E=0x0000 -0x0309=0x0000 -0x0585=0x0000 -0x02E5=0x0000 -0x055B=0x0000 -0x0114=0x008D -0x0323=0x0000 -0x0320=0x0000 -0x0503=0x0000 -0x0513=0x0000 -0x0319=0x0000 -0x0260=0x0000 -0x0549=0x0000 -0x0552=0x0000 -0x0509=0x0000 -0x0521=0x0000 -0x0286=0x0000 -0x04D7=0x0000 -0x059E=0x0000 -0x0557=0x0000 -0x058F=0x0000 -0x0322=0x0000 -0x059B=0x0000 -0x0545=0x0000 -0x0349=0x0000 -0x0555=0x0000 -0x02E4=0x0000 -0x04E4=0x0000 -0x0551=0x0000 -0x0312=0x0000 -0x055D=0x0000 -0x0298=0x0000 -0x055F=0x0000 -0x011D=0xAAAA -0x039E=0x0000 -0x0547=0x0000 -0x0598=0x0000 -0x0449=0x0000 -0x0564=0x0000 -0x0242=0x0000 -0x0525=0x0000 -0x0523=0x0000 -0x0565=0x0000 -0x0124=0x0000 -0x0592=0x0000 -0x0591=0x0000 -0x0563=0x0000 -0x024D=0x0000 -0x0567=0x0000 -0x05A5=0x0000 -0x0566=0x0000 -0x030A=0x0000 -0x029F=0x0000 -0x054C=0x0000 -0x0582=0x0000 -0x0599=0x0000 -0x0511=0x0000 -0x0506=0x0000 -0x0301=0x0000 -0x0595=0x0000 -0x0584=0x0000 -0x058C=0x0000 -0x051E=0x0000 -0x05A6=0x0000 -0x050F=0x0000 -0x0590=0x0000 -0x05A0=0x0000 -0x0596=0x0000 -0x05A7=0x0000 -0x0562=0x0000 -0x058A=0x0000 -0x059D=0x0000 -0x0485=0x0000 -0x0581=0x0000 -0x045D=0x0000 -0x0245=0x0000 -0x0310=0x0000 -0x058E=0x0000 -0x05A2=0x0000 -0x054D=0x0000 -0x020C=0x7FFF -0x0589=0x0000 -0x0522=0x0000 -0x049F=0x0000 -0x031F=0x0000 -0x0292=0x0000 -0x059F=0x0000 -0x0583=0x0000 -0x0543=0x0000 -0x0317=0x0000 -0x0244=0x0000 -0x0554=0x0000 -0x0593=0x0000 -0x05A4=0x0000 -0x02A3=0x0000 -0x0553=0x0000 -0x0542=0x0000 -0x0519=0x0000 -0x024F=0x0000 -0x0524=0x0000 -0x0518=0x0000 -0x0354=0x0000 -0x0526=0x0000 -0x031B=0x0000 -0x050E=0x0000 -0x0516=0x0000 -0x02CB=0x0000 -0x0250=0x0000 -0x031C=0x0000 -0x028F=0x0000 -0x051A=0x0000 -0x055C=0x0000 -0x0514=0x0000 -0x050A=0x0000 -0x050C=0x0000 -0x050B=0x0000 -0x04E7=0x0000 -0x04E6=0x0000 -0x04E5=0x0000 -0x0512=0x0000 -0x0206=0x0000 -0x0550=0x0000 -0x0360=0x0000 -0x030E=0x0000 -0x0203=0x0000 -0x0482=0x0000 -0x0541=0x0000 -0x0122=0x033F -0x0110=0x0BF4 -0x0204=0x0000 -0x0252=0x0000 -0x011E=0x0AA7 -0x049B=0x0000 -0x0294=0x0000 -0x011C=0xA941 -0x02D6=0x0000 -0x0311=0x0000 -0x0117=0x280C -0x02A4=0x0000 -0x0540=0x0000 -0x02E0=0x0000 -0x0118=0x018C -0x0489=0x0000 -0x04A7=0x0000 -0x0101=0x7800 -0x0558=0x0000 -0x02C6=0x0000 -0x05A1=0x0000 -0x02C9=0x0000 -0x039D=0x0000 -0x0500=0x0000 -0x0450=0x0000 -0x011F=0x3600 -0x030C=0x0000 -0x04DF=0x0000 -0x0281=0x0000 -0x0106=0x3182 -0x028E=0x0000 -0x0326=0x0000 -0x0113=0x03C3 -0x04CB=0x0000 -0x0391=0x0000 -0x0105=0x0007 -0x02D9=0x0000 -0x02CE=0x0000 -0x038B=0x0000 -0x044F=0x0000 -0x02D4=0x0000 -0x0107=0x318C -0x0495=0x0000 -0x0246=0x0000 -0x0303=0x0000 -0x02E6=0x0000 -0x045B=0x0000 -0x0100=0x3409 -0x0340=0x0000 -0x0208=0x0070 -0x0111=0x0083 -0x0247=0x0000 -0x024B=0x0000 -0x045C=0x0000 -0x0383=0x0000 -0x0202=0x07FF -0x054A=0x0000 -0x0401=0x07FF -0x0341=0x0000 -0x0287=0x0000 -0x034C=0x0000 -0x0501=0x0000 -0x030F=0x0000 -0x025D=0x0000 -0x0406=0x0000 -0x0313=0x0000 -0x010A=0x104C -0x0461=0x0000 -0x051B=0x0000 -0x0121=0x31FA -0x0115=0x0009 -0x0112=0xC0E6 -0x039A=0x0000 -0x02CC=0x0000 -0x0116=0x8180 -0x04A0=0x0000 -0x0108=0x9442 -0x020B=0x4000 -0x0251=0x0000 -0x0488=0x0000 -0x0241=0x0000 -0x038F=0x0000 -0x02DC=0x0000 -0x024C=0x0000 -0x0494=0x0000 -0x051D=0x0000 -0x0243=0x0000 -0x0556=0x0000 -0x040A=0x0000 -0x04CD=0x0000 -0x0249=0x0000 -0x0261=0x0000 -0x024A=0x0000 -0x0285=0x0000 -0x0280=0x0000 -0x0346=0x0000 -0x024E=0x0000 -0x0253=0x0000 -0x028B=0x0000 -0x040C=0x0000 -0x0255=0x0000 -0x0258=0x0000 -0x0502=0x0000 -0x05A3=0x0000 -0x0367=0x0000 -0x0240=0x0020 -0x0256=0x0000 -0x025A=0x0000 -0x04E2=0x0000 -0x04C5=0x0000 -0x025B=0x0000 -0x0205=0x0000 -0x0361=0x0000 -0x0515=0x0000 -0x025C=0x0000 -0x0355=0x0000 -0x044C=0x0000 -0x010C=0x88FD -0x0284=0x0000 -0x0396=0x0000 -0x0363=0x0000 -0x031A=0x0000 -0x0289=0x0000 -0x028A=0x0000 -0x04DD=0x0000 -0x059C=0x0000 -0x0352=0x0000 -0x028C=0x0000 -0x04C2=0x0000 -0x04DA=0x0000 -0x025E=0x0000 -0x0327=0x0000 -0x0380=0x0000 -0x0342=0x0000 -0x0343=0x0000 -0x0344=0x0000 -0x0561=0x0000 -0x035A=0x0000 -0x02C8=0x0000 -0x0484=0x0000 -0x0586=0x0000 -0x0597=0x0000 -0x035F=0x0000 -0x0345=0x0000 -0x0505=0x0000 -0x035B=0x0000 -0x034A=0x0000 -0x0455=0x0000 -0x011A=0x2E02 -0x034B=0x0000 -0x034D=0x0000 -0x035C=0x0000 -0x034E=0x0000 -0x0293=0x0000 -0x03A6=0x0000 -0x0350=0x0000 -0x0445=0x0000 -0x048F=0x0000 -0x0351=0x0000 -0x0353=0x0000 -0x050D=0x0000 -0x02CD=0x0000 -0x0490=0x0000 -0x0498=0x0000 -0x0348=0x0000 -0x0356=0x0000 -0x030D=0x0000 -0x0316=0x0000 -0x040E=0x0000 -0x04A3=0x0000 -0x029D=0x0000 -0x0359=0x0000 -0x0299=0x0000 -0x0452=0x0000 -0x0442=0x0000 -0x035D=0x0000 -0x035E=0x0000 -0x0325=0x0000 -0x0364=0x0000 -0x0365=0x0000 -0x0366=0x0000 -0x0381=0x0000 -0x0288=0x0000 -0x0382=0x0000 -0x0384=0x0000 -0x0315=0x0000 -0x0385=0x0000 -0x04E3=0x0000 -0x040F=0x0000 -0x0389=0x0000 -0x054F=0x0000 -0x0386=0x0000 -0x02D0=0x0000 -0x054E=0x0000 -0x03A0=0x0000 -[reference_clocks] -sxt_ref_clk_mhz=30.72 -sxr_ref_clk_mhz=30.72 diff --git a/targets/ARCH/LMSSDR/enb_sodera_highband_5MHz_rx19dB_txfull.ini b/targets/ARCH/LMSSDR/enb_sodera_highband_5MHz_rx19dB_txfull.ini deleted file mode 100644 index a3c1aa2e6f40fb1bd38e3fb22aa5706905ec8724..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/enb_sodera_highband_5MHz_rx19dB_txfull.ini +++ /dev/null @@ -1,1128 +0,0 @@ -[reference_clocks] -sxr_ref_clk_mhz=30.72 -sxt_ref_clk_mhz=30.72 -[lms7002_registers_b] -0x03A0=0x0000 -0x054E=0x0000 -0x02D0=0x0000 -0x0386=0x0000 -0x054F=0x0000 -0x0389=0x0000 -0x040F=0x0000 -0x04E3=0x0000 -0x0385=0x0000 -0x0315=0x0000 -0x0384=0x0000 -0x0382=0x0000 -0x0288=0x0000 -0x0381=0x0000 -0x0366=0x0000 -0x0365=0x0000 -0x0364=0x0000 -0x0325=0x0000 -0x035E=0x0000 -0x035D=0x0000 -0x0442=0x0000 -0x0452=0x0000 -0x0299=0x0000 -0x0359=0x0000 -0x029D=0x0000 -0x04A3=0x0000 -0x040E=0x0000 -0x0316=0x0000 -0x030D=0x0000 -0x0356=0x0000 -0x0348=0x0000 -0x0498=0x0000 -0x0490=0x0000 -0x02CD=0x0000 -0x050D=0x0000 -0x0353=0x0000 -0x0351=0x0000 -0x048F=0x0000 -0x0445=0x0000 -0x0350=0x0000 -0x03A6=0x0000 -0x0293=0x0000 -0x034E=0x0000 -0x035C=0x0000 -0x034D=0x0000 -0x034B=0x0000 -0x011A=0x2E02 -0x0455=0x0000 -0x034A=0x0000 -0x035B=0x0000 -0x0505=0x0000 -0x0345=0x0000 -0x035F=0x0000 -0x0597=0x0000 -0x0586=0x0000 -0x0484=0x0000 -0x02C8=0x0000 -0x035A=0x0000 -0x0561=0x0000 -0x0344=0x0000 -0x0343=0x0000 -0x0342=0x0000 -0x0380=0x0000 -0x0327=0x0000 -0x025E=0x0000 -0x04DA=0x0000 -0x04C2=0x0000 -0x028C=0x0000 -0x0352=0x0000 -0x059C=0x0000 -0x04DD=0x0000 -0x028A=0x0000 -0x0289=0x0000 -0x031A=0x0000 -0x0363=0x0000 -0x0396=0x0000 -0x0284=0x0000 -0x010C=0x88FD -0x044C=0x0000 -0x0355=0x0000 -0x025C=0x0000 -0x0515=0x0000 -0x0361=0x0000 -0x0205=0x0000 -0x025B=0x0000 -0x04C5=0x0000 -0x04E2=0x0000 -0x025A=0x0000 -0x0256=0x0000 -0x0240=0x0020 -0x0367=0x0000 -0x05A3=0x0000 -0x0502=0x0000 -0x0258=0x0000 -0x0255=0x0000 -0x040C=0x0000 -0x028B=0x0000 -0x0253=0x0000 -0x024E=0x0000 -0x0346=0x0000 -0x0280=0x0000 -0x0285=0x0000 -0x024A=0x0000 -0x0261=0x0000 -0x0249=0x0000 -0x04CD=0x0000 -0x040A=0x0000 -0x0556=0x0000 -0x0243=0x0000 -0x051D=0x0000 -0x0494=0x0000 -0x024C=0x0000 -0x02DC=0x0000 -0x038F=0x0000 -0x0241=0x0000 -0x0488=0x0000 -0x0251=0x0000 -0x020B=0x4000 -0x0108=0x9442 -0x04A0=0x0000 -0x0116=0x8180 -0x02CC=0x0000 -0x039A=0x0000 -0x0112=0xC0E6 -0x0307=0x0000 -0x038C=0x0000 -0x0282=0x0000 -0x0321=0x0000 -0x0507=0x0000 -0x0483=0x0000 -0x0201=0x07FF -0x02E1=0x0000 -0x0517=0x0000 -0x0481=0x0000 -0x02D5=0x0000 -0x0259=0x0000 -0x0527=0x0000 -0x02DD=0x0000 -0x0209=0x0000 -0x0297=0x0000 -0x0400=0x0081 -0x0104=0x0088 -0x0103=0x0A12 -0x0347=0x0000 -0x02D8=0x0000 -0x0457=0x0000 -0x0306=0x0000 -0x02D1=0x0000 -0x04C8=0x0000 -0x0546=0x0000 -0x0440=0x0020 -0x045E=0x0000 -0x031D=0x0000 -0x039C=0x0000 -0x02D2=0x0000 -0x010E=0x2040 -0x02A0=0x0000 -0x0544=0x0000 -0x029C=0x0000 -0x055A=0x0000 -0x0295=0x0000 -0x02CF=0x0000 -0x04D1=0x0000 -0x0291=0x0000 -0x02DF=0x0000 -0x0290=0x0000 -0x020A=0x0080 -0x0102=0x3180 -0x0120=0xB9FF -0x0388=0x0000 -0x0318=0x0000 -0x02A7=0x0000 -0x0200=0x0081 -0x0594=0x0000 -0x02C5=0x0000 -0x028D=0x0000 -0x02A1=0x0000 -0x0362=0x0000 -0x038A=0x0000 -0x0395=0x0000 -0x058D=0x0000 -0x02D7=0x0000 -0x0305=0x0000 -0x0393=0x0000 -0x0398=0x0000 -0x0408=0x0000 -0x039B=0x0000 -0x049E=0x0000 -0x02DB=0x0000 -0x0357=0x0000 -0x02C2=0x0000 -0x0514=0x0000 -0x051C=0x0000 -0x03A2=0x0000 -0x03A4=0x0000 -0x03A3=0x0000 -0x0493=0x0000 -0x0454=0x0000 -0x0448=0x0000 -0x0397=0x0000 -0x02E3=0x0000 -0x049C=0x0000 -0x040D=0x0000 -0x0281=0x0000 -0x048C=0x0000 -0x049A=0x0000 -0x0119=0x18CB -0x010F=0x3042 -0x02A6=0x0000 -0x0257=0x0000 -0x04D6=0x0000 -0x04A6=0x0000 -0x0324=0x0000 -0x038E=0x0000 -0x02E7=0x0000 -0x034F=0x0000 -0x04E0=0x0000 -0x0123=0x267B -0x0497=0x0000 -0x0459=0x0000 -0x0394=0x0000 -0x04A5=0x0000 -0x04D9=0x0000 -0x0304=0x0000 -0x04D5=0x0000 -0x0508=0x0000 -0x0443=0x0000 -0x0301=0x0000 -0x0548=0x0000 -0x04D2=0x0000 -0x0592=0x0000 -0x0591=0x0000 -0x04C7=0x0000 -0x049D=0x0000 -0x029A=0x0000 -0x051F=0x0000 -0x0309=0x0000 -0x0585=0x0000 -0x03A5=0x0000 -0x02D3=0x0000 -0x0451=0x0000 -0x0390=0x0000 -0x0562=0x0000 -0x02C4=0x0000 -0x029E=0x0000 -0x031E=0x0000 -0x04C0=0x0000 -0x04DC=0x0000 -0x04DE=0x0000 -0x058B=0x0000 -0x04DB=0x0000 -0x04D0=0x0000 -0x0492=0x0000 -0x04A1=0x0000 -0x054B=0x0000 -0x02C7=0x0000 -0x05A0=0x0000 -0x044B=0x0000 -0x0100=0x3409 -0x04CA=0x0000 -0x0446=0x0000 -0x02E4=0x0000 -0x04E4=0x0000 -0x04C3=0x0000 -0x0496=0x0000 -0x04CF=0x0000 -0x025F=0x0000 -0x04D4=0x0000 -0x0504=0x0000 -0x04CE=0x0000 -0x02DE=0x0000 -0x0399=0x0000 -0x050C=0x0000 -0x02A5=0x0000 -0x04CC=0x0000 -0x03A1=0x0000 -0x04E1=0x0000 -0x02A2=0x0000 -0x040B=0x7FFF -0x0283=0x0000 -0x048E=0x0000 -0x0580=0x0000 -0x0409=0x0000 -0x039F=0x0000 -0x0248=0x0000 -0x048B=0x0000 -0x0358=0x0000 -0x0589=0x0000 -0x038D=0x0000 -0x0487=0x0000 -0x0510=0x0000 -0x0302=0x0000 -0x0486=0x0000 -0x045F=0x0000 -0x0480=0x0000 -0x0567=0x0000 -0x02DA=0x0000 -0x045A=0x0000 -0x0254=0x0000 -0x0405=0x0000 -0x0387=0x0000 -0x0458=0x0000 -0x0314=0x0000 -0x0360=0x0000 -0x0559=0x0000 -0x0456=0x0000 -0x0453=0x0000 -0x02E2=0x0000 -0x044D=0x0000 -0x0441=0x0000 -0x02C3=0x0000 -0x04C1=0x0000 -0x04D3=0x0000 -0x0444=0x0000 -0x0207=0x0000 -0x04C6=0x0000 -0x0296=0x0000 -0x0555=0x0000 -0x0349=0x0000 -0x0109=0x61C1 -0x04A2=0x0000 -0x0447=0x0000 -0x0460=0x0000 -0x048D=0x0000 -0x059A=0x0000 -0x0407=0x0000 -0x02C0=0x0000 -0x0499=0x0000 -0x0543=0x0000 -0x04C9=0x0000 -0x02CA=0x0000 -0x0404=0x0000 -0x0560=0x0000 -0x02C1=0x0000 -0x04D8=0x0000 -0x0403=0x0000 -0x0491=0x0000 -0x029B=0x0000 -0x04C4=0x0000 -0x010D=0x009E -0x0402=0x07FF -0x055E=0x0000 -0x03A7=0x0000 -0x0520=0x0000 -0x0392=0x0000 -0x030B=0x0000 -0x0588=0x0000 -0x0308=0x0000 -0x048A=0x0000 -0x044A=0x0000 -0x04A4=0x0000 -0x0300=0x0000 -0x0587=0x0000 -0x044E=0x0000 -0x055B=0x0000 -0x02E5=0x0000 -0x0114=0x008D -0x0323=0x0000 -0x0320=0x0000 -0x0503=0x0000 -0x0513=0x0000 -0x0319=0x0000 -0x0260=0x0000 -0x0549=0x0000 -0x0552=0x0000 -0x0509=0x0000 -0x0521=0x0000 -0x0286=0x0000 -0x04D7=0x0000 -0x059E=0x0000 -0x058F=0x0000 -0x0557=0x0000 -0x0322=0x0000 -0x059B=0x0000 -0x049F=0x0000 -0x0522=0x0000 -0x0545=0x0000 -0x0551=0x0000 -0x0312=0x0000 -0x055D=0x0000 -0x0298=0x0000 -0x055F=0x0000 -0x011D=0xAAAA -0x039E=0x0000 -0x0547=0x0000 -0x0598=0x0000 -0x0449=0x0000 -0x0564=0x0000 -0x0242=0x0000 -0x0525=0x0000 -0x0523=0x0000 -0x0565=0x0000 -0x0124=0x0000 -0x0563=0x0000 -0x024D=0x0000 -0x05A5=0x0000 -0x0566=0x0000 -0x030A=0x0000 -0x029F=0x0000 -0x054C=0x0000 -0x0582=0x0000 -0x0599=0x0000 -0x0511=0x0000 -0x0506=0x0000 -0x0595=0x0000 -0x0584=0x0000 -0x058C=0x0000 -0x05A6=0x0000 -0x051E=0x0000 -0x050F=0x0000 -0x0590=0x0000 -0x0596=0x0000 -0x05A7=0x0000 -0x058A=0x0000 -0x059D=0x0000 -0x0485=0x0000 -0x0581=0x0000 -0x045D=0x0000 -0x0245=0x0000 -0x0310=0x0000 -0x058E=0x0000 -0x05A2=0x0000 -0x054D=0x0000 -0x020C=0x7FFF -0x031F=0x0000 -0x0292=0x0000 -0x059F=0x0000 -0x0583=0x0000 -0x0317=0x0000 -0x0244=0x0000 -0x0554=0x0000 -0x0593=0x0000 -0x05A4=0x0000 -0x02A3=0x0000 -0x0553=0x0000 -0x0542=0x0000 -0x0519=0x0000 -0x024F=0x0000 -0x0524=0x0000 -0x0518=0x0000 -0x0354=0x0000 -0x0526=0x0000 -0x031B=0x0000 -0x050E=0x0000 -0x0516=0x0000 -0x02CB=0x0000 -0x0250=0x0000 -0x031C=0x0000 -0x028F=0x0000 -0x051A=0x0000 -0x055C=0x0000 -0x050A=0x0000 -0x050B=0x0000 -0x04E7=0x0000 -0x04E6=0x0000 -0x04E5=0x0000 -0x0512=0x0000 -0x0206=0x0000 -0x0550=0x0000 -0x030E=0x0000 -0x0203=0x0000 -0x0482=0x0000 -0x0541=0x0000 -0x0122=0x033F -0x0110=0x0BF4 -0x0204=0x0000 -0x0252=0x0000 -0x011E=0x0AA7 -0x049B=0x0000 -0x0294=0x0000 -0x011C=0xA941 -0x02D6=0x0000 -0x0311=0x0000 -0x0117=0x280C -0x02A4=0x0000 -0x0540=0x0000 -0x02E0=0x0000 -0x0118=0x018C -0x0489=0x0000 -0x04A7=0x0000 -0x0101=0x7800 -0x0558=0x0000 -0x02C6=0x0000 -0x05A1=0x0000 -0x02C9=0x0000 -0x039D=0x0000 -0x0500=0x0000 -0x0450=0x0000 -0x011F=0x3600 -0x030C=0x0000 -0x04DF=0x0000 -0x0106=0x3182 -0x028E=0x0000 -0x0326=0x0000 -0x0113=0x03C3 -0x04CB=0x0000 -0x0391=0x0000 -0x0105=0x0007 -0x02D9=0x0000 -0x02CE=0x0000 -0x044F=0x0000 -0x038B=0x0000 -0x02D4=0x0000 -0x0107=0x318C -0x0495=0x0000 -0x0246=0x0000 -0x0303=0x0000 -0x02E6=0x0000 -0x045B=0x0000 -0x0340=0x0000 -0x0208=0x0070 -0x0111=0x0083 -0x0247=0x0000 -0x024B=0x0000 -0x045C=0x0000 -0x0383=0x0000 -0x0202=0x07FF -0x054A=0x0000 -0x0401=0x07FF -0x0341=0x0000 -0x0287=0x0000 -0x034C=0x0000 -0x0501=0x0000 -0x030F=0x0000 -0x025D=0x0000 -0x0406=0x0000 -0x0313=0x0000 -0x010A=0x104C -0x0461=0x0000 -0x051B=0x0000 -0x0121=0x31FA -0x0115=0x0009 -[lms7002_registers_a] -0x0107=0x318C -0x02D4=0x0000 -0x0082=0x8001 -0x0209=0x0000 -0x02CA=0x0000 -0x04C9=0x0000 -0x0120=0xB9FF -0x0388=0x0000 -0x029D=0x0000 -0x04A3=0x0000 -0x0208=0x0170 -0x0340=0x0000 -0x0094=0x0000 -0x0244=0x0000 -0x0317=0x0000 -0x00A9=0x8000 -0x0115=0x0009 -0x039A=0x0000 -0x0112=0x3171 -0x048C=0x0000 -0x0023=0x5550 -0x0587=0x1D10 -0x04C0=0x0000 -0x031E=0x0000 -0x0205=0x0000 -0x0361=0x0000 -0x051F=0xAB08 -0x029A=0x0000 -0x0396=0x0000 -0x0284=0x0000 -0x02CE=0x0000 -0x02D9=0x0000 -0x038B=0x0000 -0x044F=0x0000 -0x0367=0x0000 -0x0240=0x0028 -0x05A3=0x0000 -0x0105=0x0007 -0x009B=0x6565 -0x0400=0x0101 -0x02DB=0x0000 -0x0357=0x0000 -0x0104=0x0088 -0x0103=0x0612 -0x0457=0x0000 -0x0347=0x0000 -0x02D8=0x0000 -0x010C=0x8865 -0x0086=0x4101 -0x0202=0x0794 -0x0383=0x0000 -0x020B=0x4000 -0x0108=0xFC26 -0x0098=0x0000 -0x0117=0x100C -0x0027=0x05E4 -0x00A7=0x6565 -0x024A=0x0000 -0x0029=0x0101 -0x00AD=0x03FF -0x0540=0x5009 -0x02A4=0x0000 -0x02DE=0x0000 -0x002E=0x0000 -0x0261=0x0000 -0x00AB=0x0040 -0x0564=0x0000 -0x00A8=0x0000 -0x0517=0xC89D -0x0481=0x0000 -0x02C1=0x0000 -0x0301=0x0000 -0x00A5=0x6565 -0x0515=0x2E45 -0x025C=0x0000 -0x009F=0x658C -0x0519=0x4049 -0x054B=0xF7A3 -0x02C7=0x0000 -0x038C=0x0000 -0x0307=0x0000 -0x0282=0x0000 -0x0289=0x0000 -0x011C=0xA941 -0x0562=0xF524 -0x0025=0x0101 -0x02CC=0x0000 -0x0116=0x8180 -0x0597=0xFDFB -0x035F=0x0000 -0x002F=0x3840 -0x0589=0xEA5F -0x00A2=0x6565 -0x0099=0x6565 -0x0310=0x0000 -0x040C=0x40F8 -0x028B=0x0000 -0x0253=0x0000 -0x00AC=0x2000 -0x002D=0xFFFF -0x00A6=0x0001 -0x054D=0xF7A3 -0x002C=0x0000 -0x0249=0x0000 -0x04CD=0x0000 -0x0401=0x07FF -0x00A4=0x6565 -0x054A=0x8184 -0x038F=0x0000 -0x008C=0x267B -0x0241=0x0000 -0x0356=0x0000 -0x00A1=0x6565 -0x0260=0x0000 -0x0453=0x0000 -0x008A=0x0491 -0x048F=0x0000 -0x0445=0x0000 -0x0350=0x0000 -0x00AA=0x0000 -0x034C=0x0000 -0x0501=0xFDFB -0x0490=0x0000 -0x02CD=0x0000 -0x050D=0x0F45 -0x0353=0x0000 -0x0024=0x50D8 -0x04E5=0x0000 -0x0512=0x196B -0x0247=0x0000 -0x045C=0x0000 -0x024B=0x0000 -0x0395=0x0000 -0x011F=0x3600 -0x039D=0x0000 -0x0500=0xF61D -0x02C9=0x0000 -0x05A1=0x0000 -0x02A6=0x0000 -0x0119=0x18DF -0x010F=0x3042 -0x04CB=0x0000 -0x0391=0x0000 -0x0113=0x03C3 -0x0326=0x0000 -0x028E=0x0000 -0x0106=0x3182 -0x0524=0x3347 -0x009D=0x6565 -0x0294=0x0000 -0x0026=0x0101 -0x0110=0x0BFF -0x0122=0x033F -0x0381=0x0000 -0x009C=0x658C -0x05A0=0x0000 -0x0482=0x0000 -0x030E=0x0000 -0x0203=0x2F99 -0x0095=0x0000 -0x0111=0x0099 -0x0256=0x0000 -0x0089=0x00A0 -0x0085=0x0001 -0x0088=0x0530 -0x0459=0x0000 -0x0394=0x0000 -0x010E=0x0285 -0x02A0=0x0000 -0x002B=0x4038 -0x039C=0x0000 -0x02D2=0x0000 -0x0581=0xC89D -0x045D=0x0000 -0x0245=0x0000 -0x002A=0x0086 -0x0118=0x018C -0x02E0=0x0000 -0x0489=0x0000 -0x04A7=0x0000 -0x039E=0x0000 -0x011D=0xAAAA -0x02E1=0x0000 -0x0259=0x0000 -0x02D5=0x0000 -0x051D=0x4F91 -0x0243=0x0000 -0x0556=0xA2B5 -0x040A=0x1000 -0x05A2=0x0000 -0x020C=0x8000 -0x020A=0x0080 -0x0102=0x3180 -0x034F=0x0000 -0x0303=0x0000 -0x0306=0x0000 -0x0255=0x0000 -0x0300=0x0000 -0x044E=0x0000 -0x0309=0x0000 -0x0585=0xDAA2 -0x0527=0xACB9 -0x044A=0x0000 -0x04A4=0x0000 -0x048A=0x0000 -0x0392=0x0000 -0x030B=0x0000 -0x05A7=0x0000 -0x0252=0x0000 -0x0204=0xC016 -0x0308=0x0000 -0x0588=0xE6C7 -0x0321=0x0000 -0x0507=0xFCFE -0x0312=0x0000 -0x050B=0xF5EF -0x0360=0x0000 -0x0021=0x0E9F -0x04C2=0x0000 -0x030D=0x0000 -0x040E=0x0003 -0x0316=0x0000 -0x031F=0x0000 -0x030C=0x0000 -0x04DF=0x0000 -0x0318=0x0000 -0x0250=0x0000 -0x02CB=0x0000 -0x045E=0x0000 -0x0440=0x0024 -0x031D=0x0000 -0x058D=0xF5EF -0x02D7=0x0000 -0x0380=0x0000 -0x0342=0x0000 -0x0343=0x0000 -0x0566=0x0906 -0x0345=0x0000 -0x049C=0x0000 -0x02E3=0x0000 -0x0397=0x0000 -0x035B=0x0000 -0x0505=0x00D8 -0x028D=0x0000 -0x02A1=0x0000 -0x028F=0x0000 -0x031C=0x0000 -0x031A=0x0000 -0x0363=0x0000 -0x0596=0x0A94 -0x0354=0x0000 -0x0518=0xEFF2 -0x035C=0x0000 -0x034D=0x0000 -0x0344=0x0000 -0x0561=0xAB08 -0x0096=0x0000 -0x010D=0x00DE -0x04C4=0x0000 -0x0351=0x0000 -0x0311=0x0000 -0x02D6=0x0000 -0x02D1=0x0000 -0x0546=0x8D44 -0x04C8=0x0000 -0x048B=0x0000 -0x0358=0x0000 -0x0522=0xDB10 -0x049F=0x0000 -0x034A=0x0000 -0x0455=0x0000 -0x0359=0x0000 -0x03A4=0x0000 -0x03A3=0x0000 -0x0341=0x0000 -0x0287=0x0000 -0x04DA=0x0000 -0x025E=0x0000 -0x0580=0xEFF2 -0x0409=0x0000 -0x059A=0x0000 -0x048D=0x0000 -0x0514=0xE7E2 -0x039B=0x0000 -0x0101=0x7800 -0x0558=0x5009 -0x02C6=0x0000 -0x051B=0xB77F -0x0313=0x0000 -0x010A=0x104C -0x0461=0x0000 -0x0406=0x0000 -0x030F=0x0000 -0x025D=0x0000 -0x034B=0x0000 -0x011A=0x2E14 -0x029F=0x0000 -0x030A=0x0000 -0x034E=0x0000 -0x0293=0x0000 -0x03A6=0x0000 -0x0560=0x174B -0x0404=0x0000 -0x00A0=0x6565 -0x0547=0xD7B7 -0x0454=0x0000 -0x0448=0x0000 -0x0327=0x0000 -0x0305=0x0000 -0x0393=0x0000 -0x0510=0xE6C7 -0x0302=0x0000 -0x0486=0x0000 -0x045F=0x0000 -0x0365=0x0000 -0x048E=0x0000 -0x0022=0x07FF -0x0283=0x0000 -0x044B=0x0000 -0x045A=0x0000 -0x02DA=0x0000 -0x04E4=0x0000 -0x02E4=0x0000 -0x03A5=0x0000 -0x040B=0x000F -0x0366=0x0000 -0x0443=0x0000 -0x0508=0xEF99 -0x00A3=0x6565 -0x02E2=0x0000 -0x044D=0x0000 -0x0314=0x0000 -0x0458=0x0000 -0x0493=0x0000 -0x0346=0x0000 -0x024E=0x0000 -0x055E=0xDB10 -0x0402=0x07D9 -0x0384=0x0000 -0x02E6=0x0000 -0x045B=0x0000 -0x0480=0x0000 -0x0567=0x4049 -0x04CA=0x0000 -0x0446=0x0000 -0x0447=0x0000 -0x0460=0x0000 -0x0559=0xACB9 -0x0456=0x0000 -0x0441=0x0000 -0x0444=0x0000 -0x0390=0x0000 -0x0451=0x0000 -0x049E=0x0000 -0x0324=0x0000 -0x02E7=0x0000 -0x038E=0x0000 -0x0403=0x0013 -0x04D8=0x0000 -0x029B=0x0000 -0x0491=0x0000 -0x03A1=0x0000 -0x04E1=0x0000 -0x02A2=0x0000 -0x051C=0x0000 -0x03A2=0x0000 -0x0407=0x0000 -0x0258=0x0000 -0x0502=0x0A94 -0x038A=0x0000 -0x0362=0x0000 -0x028C=0x0000 -0x0352=0x0000 -0x0385=0x0000 -0x0315=0x0000 -0x040D=0x0000 -0x039F=0x0000 -0x0248=0x0000 -0x0405=0x0000 -0x0254=0x0000 -0x0398=0x0000 -0x0408=0x0000 -0x0487=0x0000 -0x038D=0x0000 -0x035E=0x0000 -0x03A7=0x0000 -0x0520=0x174B -0x0449=0x0000 -0x02C8=0x0000 -0x035A=0x0000 -0x0387=0x0000 -0x0386=0x0000 -0x0452=0x0000 -0x0299=0x0000 -0x0084=0x0400 -0x0498=0x0000 -0x0348=0x0000 -0x02D0=0x0000 -0x054E=0x8184 -0x03A0=0x0000 -0x009A=0x658C -0x055D=0xA6B5 -0x0298=0x0000 -0x0364=0x0000 -0x0081=0x0000 -0x0325=0x0000 -0x040F=0x43E4 -0x04E3=0x0000 -0x050E=0x17DC -0x0516=0x150F -0x0389=0x0000 -0x054F=0x18C9 -0x0304=0x0000 -0x04D5=0x0000 -0x059B=0x0000 -0x0322=0x0000 -0x0442=0x0000 -0x035D=0x0000 -0x0492=0x0000 -0x04A1=0x0000 -0x0382=0x0000 -0x0288=0x0000 -0x0296=0x0000 -0x0555=0xBD96 -0x0349=0x0000 -0x0484=0x0000 -0x0586=0x196B -0x0281=0x0000 -0x0200=0x0301 -0x0594=0xF40D -0x02C5=0x0000 -0x0319=0x0000 -0x0121=0x3760 -0x025B=0x0000 -0x0290=0x0000 -0x02DF=0x0000 -0x0291=0x0000 -0x029C=0x0000 -0x008B=0x278A -0x02A3=0x0000 -0x05A4=0x0000 -0x02A7=0x0000 -0x0483=0x0000 -0x0201=0x07FF -0x02C2=0x0000 -0x02C4=0x0000 -0x0207=0x0000 -0x04C6=0x0000 -0x0093=0x0000 -0x02D3=0x0000 -0x0494=0x0000 -0x04CF=0x0000 -0x025F=0x0000 -0x0251=0x0000 -0x0488=0x0000 -0x0496=0x0000 -0x04C3=0x0000 -0x0100=0x3409 -0x04CC=0x0000 -0x02A5=0x0000 -0x0257=0x0000 -0x04D6=0x0000 -0x04A6=0x0000 -0x049A=0x0000 -0x049B=0x0000 -0x0097=0x0000 -0x011E=0x0A2A -0x0285=0x0000 -0x0280=0x0000 -0x0020=0xFFFD -0x02DD=0x0000 -0x0297=0x0000 -0x044C=0x0000 -0x0355=0x0000 -0x04A0=0x0000 -0x02CF=0x0000 -0x04D1=0x0000 -0x0526=0xBE2A -0x0092=0x0001 -0x031B=0x0000 -0x0541=0x4C24 -0x0543=0xBD96 -0x02C0=0x0000 -0x0499=0x0000 -0x0513=0xDAA2 -0x0549=0x18C9 -0x0552=0x8D44 -0x0521=0x5852 -0x0509=0x0605 -0x0286=0x0000 -0x024F=0x0000 -0x04E0=0x0000 -0x0545=0x364E -0x0551=0xD7B7 -0x055F=0x5852 -0x009E=0x658C -0x0598=0xF61D -0x0123=0x067B -0x0497=0x0000 -0x04A5=0x0000 -0x0565=0xB77F -0x0124=0x0000 -0x0592=0x0DF1 -0x0591=0xFCFE -0x0548=0x79FA -0x04D2=0x0000 -0x0599=0x0000 -0x0511=0x1D10 -0x0506=0x0DF1 -0x0595=0x00BC -0x0584=0xE7E2 -0x0242=0x0000 -0x025A=0x0000 -0x04E2=0x0000 -0x04C5=0x0000 -0x058C=0xEA50 -0x0450=0x0000 -0x058A=0x17DC -0x059D=0x0000 -0x0485=0x0000 -0x058E=0x1316 -0x0550=0x79FA -0x0554=0x6901 -0x0593=0x00D8 -0x0553=0x364E -0x0542=0xA2B5 -0x0563=0x4F91 -0x024D=0x0000 -0x055A=0xBE2A -0x0295=0x0000 -0x028A=0x0000 -0x059C=0x0000 -0x04DD=0x0000 -0x054C=0x7FFF -0x0582=0x150F -0x0109=0x8CC1 -0x04A2=0x0000 -0x0292=0x0000 -0x0583=0x2E45 -0x059F=0x0000 -0x0525=0x57AC -0x0523=0xA6B5 -0x0206=0x0000 -0x051A=0x0906 -0x055C=0x3347 -0x05A6=0x0000 -0x050F=0xEA5F -0x051E=0xF524 -0x050A=0x1316 -0x04C7=0x0000 -0x049D=0x0000 -0x050C=0xEA50 -0x0087=0x0000 -0x0399=0x0000 -0x0495=0x0000 -0x0246=0x0000 -0x0503=0x00BC -0x0320=0x0000 -0x0323=0x0000 -0x055B=0x57AC -0x0114=0x0110 -0x02E5=0x0000 -0x04E7=0x0000 -0x04D0=0x0000 -0x04E6=0x0000 -0x00AE=0x0000 -0x0544=0x6901 -0x04DE=0x0000 -0x058B=0x0F45 -0x0028=0x0101 -0x029E=0x0000 -0x04DC=0x0000 -0x04D9=0x0000 -0x058F=0x0605 -0x0557=0x4C24 -0x04DB=0x0000 -0x04D7=0x0000 -0x059E=0x0000 -0x024C=0x0000 -0x02DC=0x0000 -0x04D4=0x0000 -0x0504=0xF40D -0x02C3=0x0000 -0x04C1=0x0000 -0x04D3=0x0000 -0x0590=0xEF99 -0x04CE=0x0000 -0x05A5=0x0000 -[file_info] -version=1 -type=lms7002m_minimal_config diff --git a/targets/ARCH/LMSSDR/enb_sodera_lowband_Lrx_10MHz_rx19dB_txfull.ini b/targets/ARCH/LMSSDR/enb_sodera_lowband_Lrx_10MHz_rx19dB_txfull.ini deleted file mode 100644 index f47d3bf433b617f82c7cd66b0b53ee22557a2726..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/enb_sodera_lowband_Lrx_10MHz_rx19dB_txfull.ini +++ /dev/null @@ -1,1128 +0,0 @@ -[reference_clocks] -sxr_ref_clk_mhz=30.72 -sxt_ref_clk_mhz=30.72 -[lms7002_registers_b] -0x05A7=0x0000 -0x05A5=0x0000 -0x05A2=0x0000 -0x05A0=0x0000 -0x0599=0x0000 -0x0598=0x0000 -0x0596=0x0000 -0x0594=0x0000 -0x0592=0x0000 -0x0591=0x0000 -0x0590=0x0000 -0x058E=0x0000 -0x058C=0x0000 -0x059D=0x0000 -0x058A=0x0000 -0x0589=0x0000 -0x0587=0x0000 -0x0585=0x0000 -0x0595=0x0000 -0x0584=0x0000 -0x059F=0x0000 -0x0583=0x0000 -0x0582=0x0000 -0x0567=0x0000 -0x0566=0x0000 -0x0565=0x0000 -0x0564=0x0000 -0x0563=0x0000 -0x0562=0x0000 -0x055F=0x0000 -0x055D=0x0000 -0x055A=0x0000 -0x058F=0x0000 -0x0557=0x0000 -0x0593=0x0000 -0x0554=0x0000 -0x0552=0x0000 -0x0551=0x0000 -0x0550=0x0000 -0x054D=0x0000 -0x054C=0x0000 -0x0549=0x0000 -0x0547=0x0000 -0x0546=0x0000 -0x0545=0x0000 -0x0544=0x0000 -0x0543=0x0000 -0x0553=0x0000 -0x0542=0x0000 -0x0541=0x0000 -0x0527=0x0000 -0x0526=0x0000 -0x0524=0x0000 -0x0525=0x0000 -0x0523=0x0000 -0x0521=0x0000 -0x055C=0x0000 -0x051A=0x0000 -0x0519=0x0000 -0x0518=0x0000 -0x0514=0x0000 -0x0513=0x0000 -0x0511=0x0000 -0x05A6=0x0000 -0x051E=0x0000 -0x050F=0x0000 -0x0516=0x0000 -0x050E=0x0000 -0x050C=0x0000 -0x050B=0x0000 -0x050A=0x0000 -0x0509=0x0000 -0x0507=0x0000 -0x0506=0x0000 -0x0503=0x0000 -0x04E7=0x0000 -0x04E6=0x0000 -0x0512=0x0000 -0x04E5=0x0000 -0x04E4=0x0000 -0x0321=0x0000 -0x0320=0x0000 -0x0323=0x0000 -0x031B=0x0000 -0x0319=0x0000 -0x0260=0x0000 -0x031F=0x0000 -0x0360=0x0000 -0x0312=0x0000 -0x0310=0x0000 -0x0245=0x0000 -0x0581=0x0000 -0x045D=0x0000 -0x030E=0x0000 -0x0203=0x0000 -0x0482=0x0000 -0x0588=0x0000 -0x0308=0x0000 -0x048A=0x0000 -0x0307=0x0000 -0x0282=0x0000 -0x038C=0x0000 -0x0510=0x0000 -0x0302=0x0000 -0x0301=0x0000 -0x0309=0x0000 -0x0300=0x0000 -0x044E=0x0000 -0x034F=0x0000 -0x055B=0x0000 -0x0114=0x008D -0x02E5=0x0000 -0x02E4=0x0000 -0x02E1=0x0000 -0x02D5=0x0000 -0x0259=0x0000 -0x0517=0x0000 -0x0481=0x0000 -0x030B=0x0000 -0x0392=0x0000 -0x02DE=0x0000 -0x02DD=0x0000 -0x0297=0x0000 -0x0209=0x0000 -0x0400=0x0081 -0x02D8=0x0000 -0x0104=0x0088 -0x0103=0x0A12 -0x0347=0x0000 -0x0457=0x0000 -0x058D=0x0000 -0x02D7=0x0000 -0x02D1=0x0000 -0x04C8=0x0000 -0x02D3=0x0000 -0x02CB=0x0000 -0x0250=0x0000 -0x0306=0x0000 -0x04A4=0x0000 -0x044A=0x0000 -0x054B=0x0000 -0x02C7=0x0000 -0x02C1=0x0000 -0x031D=0x0000 -0x0440=0x0020 -0x045E=0x0000 -0x02C4=0x0000 -0x02C2=0x0000 -0x02DB=0x0000 -0x0357=0x0000 -0x0201=0x07FF -0x0483=0x0000 -0x05A4=0x0000 -0x02A3=0x0000 -0x02A1=0x0000 -0x028D=0x0000 -0x02D2=0x0000 -0x039C=0x0000 -0x02A0=0x0000 -0x010E=0x2040 -0x030A=0x0000 -0x029F=0x0000 -0x029C=0x0000 -0x029E=0x0000 -0x011D=0x9555 -0x039E=0x0000 -0x0296=0x0000 -0x0555=0x0000 -0x0349=0x0000 -0x0295=0x0000 -0x010D=0x009E -0x04C4=0x0000 -0x0292=0x0000 -0x02CF=0x0000 -0x04D1=0x0000 -0x0291=0x0000 -0x02DF=0x0000 -0x0290=0x0000 -0x020A=0x0080 -0x0102=0x3180 -0x0388=0x0000 -0x0120=0xB9FF -0x0317=0x0000 -0x0244=0x0000 -0x059B=0x0000 -0x0322=0x0000 -0x010F=0x3042 -0x0119=0x18CB -0x02A6=0x0000 -0x051F=0x0000 -0x029A=0x0000 -0x049A=0x0000 -0x059E=0x0000 -0x04D7=0x0000 -0x0318=0x0000 -0x02A7=0x0000 -0x0200=0x0081 -0x02C5=0x0000 -0x0122=0x033F -0x0110=0x0BF4 -0x0204=0x0000 -0x0252=0x0000 -0x011E=0x05DC -0x049B=0x0000 -0x0294=0x0000 -0x011C=0xAD41 -0x02D6=0x0000 -0x0311=0x0000 -0x0117=0x280C -0x0540=0x0000 -0x02A4=0x0000 -0x0485=0x0000 -0x02E0=0x0000 -0x0118=0x018C -0x0489=0x0000 -0x04A7=0x0000 -0x0101=0x7800 -0x0558=0x0000 -0x02C6=0x0000 -0x05A1=0x0000 -0x02C9=0x0000 -0x0500=0x0000 -0x039D=0x0000 -0x011F=0x3680 -0x030C=0x0000 -0x04DF=0x0000 -0x0281=0x0000 -0x0106=0x3182 -0x028E=0x0000 -0x0326=0x0000 -0x0113=0x03C3 -0x04CB=0x0000 -0x0391=0x0000 -0x0105=0x0007 -0x02D9=0x0000 -0x02CE=0x0000 -0x044F=0x0000 -0x038B=0x0000 -0x02D4=0x0000 -0x0107=0x318C -0x0495=0x0000 -0x0246=0x0000 -0x0303=0x0000 -0x02E6=0x0000 -0x045B=0x0000 -0x0100=0x3409 -0x0340=0x0000 -0x0208=0x0070 -0x0111=0x0083 -0x0247=0x0000 -0x024B=0x0000 -0x045C=0x0000 -0x024D=0x0000 -0x0202=0x07FF -0x0383=0x0000 -0x054A=0x0000 -0x0401=0x07FF -0x0206=0x0000 -0x0124=0x0000 -0x0341=0x0000 -0x0287=0x0000 -0x0501=0x0000 -0x034C=0x0000 -0x030F=0x0000 -0x025D=0x0000 -0x0406=0x0000 -0x051B=0x0000 -0x0313=0x0000 -0x010A=0x104C -0x0461=0x0000 -0x0121=0x356A -0x0115=0x0009 -0x0112=0xC0E6 -0x039A=0x0000 -0x02CC=0x0000 -0x0116=0x8180 -0x04A0=0x0000 -0x0108=0x9442 -0x020B=0x4000 -0x0251=0x0000 -0x0488=0x0000 -0x0241=0x0000 -0x038F=0x0000 -0x02DC=0x0000 -0x024C=0x0000 -0x0494=0x0000 -0x051D=0x0000 -0x0243=0x0000 -0x0556=0x0000 -0x040A=0x0000 -0x04CD=0x0000 -0x0249=0x0000 -0x0261=0x0000 -0x024A=0x0000 -0x0285=0x0000 -0x0280=0x0000 -0x0346=0x0000 -0x024E=0x0000 -0x024F=0x0000 -0x0253=0x0000 -0x0255=0x0000 -0x0502=0x0000 -0x0258=0x0000 -0x0298=0x0000 -0x05A3=0x0000 -0x0367=0x0000 -0x0240=0x0020 -0x0256=0x0000 -0x0242=0x0000 -0x025A=0x0000 -0x04E2=0x0000 -0x04C5=0x0000 -0x025B=0x0000 -0x020C=0x7FFF -0x0205=0x0000 -0x0361=0x0000 -0x0515=0x0000 -0x025C=0x0000 -0x0355=0x0000 -0x044C=0x0000 -0x010C=0x88FD -0x0284=0x0000 -0x0396=0x0000 -0x0286=0x0000 -0x028F=0x0000 -0x031C=0x0000 -0x031A=0x0000 -0x0363=0x0000 -0x0289=0x0000 -0x059C=0x0000 -0x04DD=0x0000 -0x028A=0x0000 -0x040C=0x0000 -0x028B=0x0000 -0x0450=0x0000 -0x0352=0x0000 -0x028C=0x0000 -0x04C2=0x0000 -0x025E=0x0000 -0x04DA=0x0000 -0x0327=0x0000 -0x0380=0x0000 -0x0342=0x0000 -0x0343=0x0000 -0x0561=0x0000 -0x0344=0x0000 -0x0586=0x0000 -0x0484=0x0000 -0x0345=0x0000 -0x0505=0x0000 -0x035B=0x0000 -0x034A=0x0000 -0x0455=0x0000 -0x011A=0x2E02 -0x034B=0x0000 -0x034D=0x0000 -0x035C=0x0000 -0x034E=0x0000 -0x0293=0x0000 -0x03A6=0x0000 -0x0350=0x0000 -0x0445=0x0000 -0x048F=0x0000 -0x0351=0x0000 -0x0353=0x0000 -0x050D=0x0000 -0x02CD=0x0000 -0x0490=0x0000 -0x0354=0x0000 -0x0348=0x0000 -0x0498=0x0000 -0x0356=0x0000 -0x0316=0x0000 -0x030D=0x0000 -0x040E=0x0000 -0x0522=0x0000 -0x049F=0x0000 -0x029D=0x0000 -0x04A3=0x0000 -0x0359=0x0000 -0x0299=0x0000 -0x0452=0x0000 -0x02C8=0x0000 -0x035A=0x0000 -0x0449=0x0000 -0x0442=0x0000 -0x035D=0x0000 -0x035E=0x0000 -0x0597=0x0000 -0x035F=0x0000 -0x0325=0x0000 -0x0364=0x0000 -0x0365=0x0000 -0x0366=0x0000 -0x0381=0x0000 -0x0288=0x0000 -0x0382=0x0000 -0x0384=0x0000 -0x0315=0x0000 -0x0385=0x0000 -0x054F=0x0000 -0x0389=0x0000 -0x04E3=0x0000 -0x040F=0x0000 -0x0386=0x0000 -0x054E=0x0000 -0x02D0=0x0000 -0x03A0=0x0000 -0x0387=0x0000 -0x0362=0x0000 -0x038A=0x0000 -0x0395=0x0000 -0x038D=0x0000 -0x02E7=0x0000 -0x0324=0x0000 -0x038E=0x0000 -0x0305=0x0000 -0x0393=0x0000 -0x0459=0x0000 -0x0394=0x0000 -0x0123=0x267B -0x0497=0x0000 -0x0398=0x0000 -0x0408=0x0000 -0x0399=0x0000 -0x039B=0x0000 -0x0248=0x0000 -0x039F=0x0000 -0x049E=0x0000 -0x059A=0x0000 -0x048D=0x0000 -0x051C=0x0000 -0x03A2=0x0000 -0x03A3=0x0000 -0x03A4=0x0000 -0x03A5=0x0000 -0x0520=0x0000 -0x03A7=0x0000 -0x055E=0x0000 -0x0402=0x07FF -0x0403=0x0000 -0x04D8=0x0000 -0x0560=0x0000 -0x0404=0x0000 -0x0254=0x0000 -0x0405=0x0000 -0x0407=0x0000 -0x0580=0x0000 -0x0409=0x0000 -0x040B=0x7FFF -0x040D=0x0000 -0x0441=0x0000 -0x0508=0x0000 -0x0443=0x0000 -0x0444=0x0000 -0x04CA=0x0000 -0x0446=0x0000 -0x0454=0x0000 -0x0448=0x0000 -0x044B=0x0000 -0x02E2=0x0000 -0x044D=0x0000 -0x0390=0x0000 -0x0451=0x0000 -0x0453=0x0000 -0x0559=0x0000 -0x0456=0x0000 -0x0314=0x0000 -0x0458=0x0000 -0x02DA=0x0000 -0x045A=0x0000 -0x0447=0x0000 -0x0460=0x0000 -0x0480=0x0000 -0x045F=0x0000 -0x0486=0x0000 -0x0487=0x0000 -0x0358=0x0000 -0x048B=0x0000 -0x048C=0x0000 -0x0283=0x0000 -0x048E=0x0000 -0x029B=0x0000 -0x0491=0x0000 -0x0492=0x0000 -0x04A1=0x0000 -0x0493=0x0000 -0x04C3=0x0000 -0x0496=0x0000 -0x02C0=0x0000 -0x0499=0x0000 -0x02E3=0x0000 -0x0397=0x0000 -0x049C=0x0000 -0x04C7=0x0000 -0x049D=0x0000 -0x0109=0x61C1 -0x04A2=0x0000 -0x04A5=0x0000 -0x04A6=0x0000 -0x0257=0x0000 -0x04D6=0x0000 -0x031E=0x0000 -0x04C0=0x0000 -0x02CA=0x0000 -0x04C9=0x0000 -0x02C3=0x0000 -0x04C1=0x0000 -0x0207=0x0000 -0x04C6=0x0000 -0x02A5=0x0000 -0x04CC=0x0000 -0x04CE=0x0000 -0x025F=0x0000 -0x04CF=0x0000 -0x04D0=0x0000 -0x0548=0x0000 -0x04D2=0x0000 -0x04D3=0x0000 -0x0504=0x0000 -0x04D4=0x0000 -0x0304=0x0000 -0x04D5=0x0000 -0x04D9=0x0000 -0x04DB=0x0000 -0x04DC=0x0000 -0x058B=0x0000 -0x04DE=0x0000 -0x04E0=0x0000 -0x02A2=0x0000 -0x03A1=0x0000 -0x04E1=0x0000 -[lms7002_registers_a] -0x05A7=0x0000 -0x05A5=0x0000 -0x05A2=0x0000 -0x0599=0x0000 -0x0598=0xF61D -0x0596=0x0A94 -0x0594=0xF40D -0x0592=0x0DF1 -0x0591=0xFCFE -0x0590=0xEF99 -0x058E=0x1316 -0x058C=0xEA50 -0x059D=0x0000 -0x058A=0x17DC -0x0585=0xDAA2 -0x0595=0x00BC -0x0584=0xE7E2 -0x059F=0x0000 -0x0583=0x2E45 -0x0582=0x150F -0x0567=0x4049 -0x0566=0x0906 -0x0565=0xB77F -0x0563=0x4F91 -0x055F=0x5852 -0x055D=0xA6B5 -0x055A=0xBE2A -0x058F=0x0605 -0x0557=0x4C24 -0x0593=0x00D8 -0x0554=0x6901 -0x0552=0x8D44 -0x0551=0xD7B7 -0x0550=0x79FA -0x054C=0x7FFF -0x0549=0x18C9 -0x0547=0xD7B7 -0x0546=0x8D44 -0x0545=0x364E -0x0544=0x6901 -0x0543=0xBD96 -0x0553=0x364E -0x0542=0xA2B5 -0x0541=0x4C24 -0x0527=0xACB9 -0x0526=0xBE2A -0x0525=0x57AC -0x0523=0xA6B5 -0x0521=0x5852 -0x055C=0x3347 -0x051A=0x0906 -0x0518=0xEFF2 -0x0514=0xE7E2 -0x0513=0xDAA2 -0x0511=0x1D10 -0x05A6=0x0000 -0x051E=0xF524 -0x050F=0xEA5F -0x0516=0x150F -0x050E=0x17DC -0x050C=0xEA50 -0x050B=0xF5EF -0x050A=0x1316 -0x0509=0x0605 -0x0507=0xFCFE -0x0506=0x0DF1 -0x0503=0x00BC -0x04E7=0x0000 -0x04E6=0x0000 -0x04E4=0x0000 -0x04E0=0x0000 -0x058B=0x0F45 -0x04DE=0x0000 -0x04DC=0x0000 -0x04DB=0x0000 -0x04D9=0x0000 -0x04D8=0x0000 -0x059E=0x0000 -0x04D7=0x0000 -0x0504=0xF40D -0x04D4=0x0000 -0x04D3=0x0000 -0x0548=0x79FA -0x04D2=0x0000 -0x04D1=0x0000 -0x04D0=0x0000 -0x04CE=0x0000 -0x04C8=0x0000 -0x04E2=0x0000 -0x04C5=0x0000 -0x04C4=0x0000 -0x04C2=0x0000 -0x04A7=0x0000 -0x04A6=0x0000 -0x04A5=0x0000 -0x04A1=0x0000 -0x04A0=0x0000 -0x0522=0xDB10 -0x049F=0x0000 -0x049E=0x0000 -0x04C7=0x0000 -0x049D=0x0000 -0x049B=0x0000 -0x049A=0x0000 -0x04C3=0x0000 -0x0496=0x0000 -0x0494=0x0000 -0x02D3=0x0000 -0x02D1=0x0000 -0x02CB=0x0000 -0x0250=0x0000 -0x0096=0x0000 -0x04C1=0x0000 -0x02C3=0x0000 -0x02C4=0x0000 -0x02C2=0x0000 -0x0499=0x0000 -0x02C0=0x0000 -0x0201=0x07FF -0x0483=0x0000 -0x05A4=0x0000 -0x02A3=0x0000 -0x008B=0x2756 -0x02A1=0x0000 -0x028D=0x0000 -0x029C=0x0000 -0x029E=0x0000 -0x0297=0x0000 -0x0296=0x0000 -0x0555=0xBD96 -0x0349=0x0000 -0x010D=0x015C -0x02CF=0x0000 -0x0291=0x0000 -0x02DF=0x0000 -0x0290=0x0000 -0x0021=0x0E9F -0x0450=0x0000 -0x0558=0x5009 -0x02C6=0x0000 -0x0101=0x7800 -0x059C=0x0000 -0x04DD=0x0000 -0x028A=0x0000 -0x0121=0x3652 -0x0285=0x0000 -0x0280=0x0000 -0x0319=0x0000 -0x04CF=0x0000 -0x025F=0x0000 -0x025D=0x0000 -0x030F=0x0000 -0x0406=0x0000 -0x02C5=0x0000 -0x0200=0x0301 -0x0281=0x0000 -0x04A2=0x0000 -0x0109=0x8CC1 -0x0355=0x0000 -0x044C=0x0000 -0x025B=0x0000 -0x0298=0x0000 -0x0502=0x0A94 -0x0258=0x0000 -0x0255=0x0000 -0x04D6=0x0000 -0x0257=0x0000 -0x0252=0x0000 -0x0204=0xC016 -0x024F=0x0000 -0x04CC=0x0000 -0x02A5=0x0000 -0x0497=0x0000 -0x0123=0x067B -0x0495=0x0000 -0x0246=0x0000 -0x051D=0x4F91 -0x0243=0x0000 -0x0556=0xA2B5 -0x040A=0x1000 -0x025A=0x0000 -0x0242=0x0000 -0x020C=0x8000 -0x0251=0x0000 -0x02DD=0x0000 -0x0020=0xFFFD -0x0488=0x0000 -0x020A=0x0080 -0x0102=0x3180 -0x04C6=0x0000 -0x0207=0x0000 -0x04DA=0x0000 -0x025E=0x0000 -0x0206=0x0000 -0x00A3=0x6565 -0x02E2=0x0000 -0x044D=0x0000 -0x0292=0x0000 -0x002A=0x0086 -0x0245=0x0000 -0x0581=0xC89D -0x045D=0x0000 -0x024D=0x0000 -0x002B=0x4032 -0x02A0=0x0000 -0x010E=0x0285 -0x0286=0x0000 -0x009E=0x658C -0x0088=0x04F0 -0x0085=0x0001 -0x0295=0x0000 -0x0089=0x0048 -0x0256=0x0000 -0x0093=0x0000 -0x0092=0x0001 -0x031B=0x0000 -0x0111=0x0099 -0x0095=0x0000 -0x02A7=0x0000 -0x0203=0x2F99 -0x030E=0x0000 -0x0482=0x0000 -0x05A0=0x0000 -0x009C=0x658C -0x0381=0x0000 -0x0122=0x033F -0x0110=0x0BFF -0x0100=0xB409 -0x0028=0x0101 -0x0026=0x0101 -0x0524=0x3347 -0x009D=0x6565 -0x0294=0x0000 -0x0106=0x3182 -0x028E=0x0000 -0x0326=0x0000 -0x0113=0x03C3 -0x04CB=0x0000 -0x0391=0x0000 -0x05A1=0x0000 -0x02C9=0x0000 -0x0500=0xF61D -0x039D=0x0000 -0x011F=0x3680 -0x0395=0x0000 -0x024B=0x0000 -0x045C=0x0000 -0x0247=0x0000 -0x0512=0x196B -0x04E5=0x0000 -0x0024=0x50D8 -0x0353=0x0000 -0x050D=0x0F45 -0x02CD=0x0000 -0x0490=0x0000 -0x0501=0xFDFB -0x034C=0x0000 -0x00AA=0x0000 -0x0350=0x0000 -0x0445=0x0000 -0x048F=0x0000 -0x008A=0x0491 -0x0453=0x0000 -0x0124=0x0000 -0x0260=0x0000 -0x00A1=0x6565 -0x0356=0x0000 -0x0241=0x0000 -0x04CD=0x0000 -0x0249=0x0000 -0x002C=0x0000 -0x038F=0x0000 -0x008C=0x267B -0x0459=0x0000 -0x0394=0x0000 -0x054D=0xF7A3 -0x00A6=0x0001 -0x002D=0xFFFF -0x00AC=0x2000 -0x0253=0x0000 -0x028B=0x0000 -0x040C=0x40F8 -0x0099=0x6565 -0x0310=0x0000 -0x00A2=0x6565 -0x0589=0xEA5F -0x002F=0x3840 -0x0597=0xFDFB -0x035F=0x0000 -0x0562=0xF524 -0x0025=0x0101 -0x011C=0xAD41 -0x011D=0x2AAA -0x039E=0x0000 -0x0289=0x0000 -0x0282=0x0000 -0x0307=0x0000 -0x038C=0x0000 -0x0087=0x0000 -0x0399=0x0000 -0x054B=0xF7A3 -0x02C7=0x0000 -0x0519=0x4049 -0x009F=0x658C -0x0515=0x2E45 -0x025C=0x0000 -0x00A5=0x6565 -0x0301=0x0000 -0x02C1=0x0000 -0x0259=0x0000 -0x02D5=0x0000 -0x02E1=0x0000 -0x0517=0xC89D -0x0481=0x0000 -0x00A8=0x0000 -0x02D2=0x0000 -0x039C=0x0000 -0x0564=0x0000 -0x00AB=0x0040 -0x0261=0x0000 -0x002E=0x0000 -0x02DE=0x0000 -0x0540=0x5009 -0x02A4=0x0000 -0x0485=0x0000 -0x0489=0x0000 -0x00AD=0x03FF -0x024A=0x0000 -0x0029=0x0101 -0x0097=0x0000 -0x011E=0x061D -0x00AE=0x0000 -0x00A7=0x6565 -0x020B=0x4000 -0x0098=0x0000 -0x0108=0xFC26 -0x0027=0x05E4 -0x0117=0x100C -0x0383=0x0000 -0x0202=0x0794 -0x054A=0x8184 -0x00A4=0x6565 -0x0401=0x07FF -0x0086=0x4101 -0x010C=0x8865 -0x02D8=0x0000 -0x0347=0x0000 -0x0457=0x0000 -0x0103=0x0A12 -0x0104=0x0088 -0x0357=0x0000 -0x02DB=0x0000 -0x0400=0x0101 -0x009B=0x6565 -0x0105=0x0007 -0x05A3=0x0000 -0x0240=0x0028 -0x0367=0x0000 -0x044F=0x0000 -0x038B=0x0000 -0x0284=0x0000 -0x0396=0x0000 -0x051F=0xAB08 -0x029A=0x0000 -0x0361=0x0000 -0x0205=0x0000 -0x0119=0x18DF -0x02A6=0x0000 -0x010F=0x3042 -0x04C0=0x0000 -0x031E=0x0000 -0x02CC=0x0000 -0x0116=0x8180 -0x0587=0x1D10 -0x0023=0x5550 -0x048C=0x0000 -0x0112=0x3171 -0x039A=0x0000 -0x0320=0x0000 -0x0323=0x0000 -0x0115=0x0009 -0x00A9=0x8000 -0x0244=0x0000 -0x0094=0x0000 -0x0317=0x0000 -0x0208=0x0170 -0x0340=0x0000 -0x058D=0xF5EF -0x02D7=0x0000 -0x04A3=0x0000 -0x029D=0x0000 -0x0388=0x0000 -0x0120=0xB9FF -0x04C9=0x0000 -0x02CA=0x0000 -0x0209=0x0000 -0x0082=0x8001 -0x0107=0x318C -0x02D4=0x0000 -0x02CE=0x0000 -0x02D9=0x0000 -0x02E4=0x0000 -0x024C=0x0000 -0x02DC=0x0000 -0x0118=0x018C -0x02E0=0x0000 -0x055B=0x57AC -0x0114=0x0110 -0x02E5=0x0000 -0x02E6=0x0000 -0x045B=0x0000 -0x034F=0x0000 -0x0300=0x0000 -0x044E=0x0000 -0x0510=0xE6C7 -0x0302=0x0000 -0x0303=0x0000 -0x04D5=0x0000 -0x0304=0x0000 -0x0306=0x0000 -0x04A4=0x0000 -0x044A=0x0000 -0x049C=0x0000 -0x02E3=0x0000 -0x0397=0x0000 -0x0588=0xE6C7 -0x0308=0x0000 -0x048A=0x0000 -0x0309=0x0000 -0x029F=0x0000 -0x030A=0x0000 -0x0392=0x0000 -0x030B=0x0000 -0x04DF=0x0000 -0x030C=0x0000 -0x02D6=0x0000 -0x0311=0x0000 -0x024E=0x0000 -0x0346=0x0000 -0x0312=0x0000 -0x051B=0xB77F -0x010A=0x104C -0x0461=0x0000 -0x0313=0x0000 -0x0360=0x0000 -0x028C=0x0000 -0x0352=0x0000 -0x040E=0x0003 -0x030D=0x0000 -0x0316=0x0000 -0x031F=0x0000 -0x0318=0x0000 -0x0287=0x0000 -0x0341=0x0000 -0x028F=0x0000 -0x031C=0x0000 -0x031A=0x0000 -0x0363=0x0000 -0x031D=0x0000 -0x0440=0x0024 -0x045E=0x0000 -0x0321=0x0000 -0x059B=0x0000 -0x0322=0x0000 -0x0327=0x0000 -0x0380=0x0000 -0x0342=0x0000 -0x0343=0x0000 -0x0561=0xAB08 -0x0344=0x0000 -0x0586=0x196B -0x0484=0x0000 -0x0345=0x0000 -0x0505=0x00D8 -0x035B=0x0000 -0x0498=0x0000 -0x0084=0x0400 -0x0348=0x0000 -0x034A=0x0000 -0x0455=0x0000 -0x011A=0x2E14 -0x034B=0x0000 -0x034D=0x0000 -0x035C=0x0000 -0x034E=0x0000 -0x0293=0x0000 -0x03A6=0x0000 -0x0351=0x0000 -0x0354=0x0000 -0x048B=0x0000 -0x0358=0x0000 -0x0359=0x0000 -0x0299=0x0000 -0x0452=0x0000 -0x02C8=0x0000 -0x035A=0x0000 -0x0449=0x0000 -0x0442=0x0000 -0x035D=0x0000 -0x035E=0x0000 -0x038A=0x0000 -0x0362=0x0000 -0x0081=0x0000 -0x0325=0x0000 -0x0364=0x0000 -0x0365=0x0000 -0x0366=0x0000 -0x0288=0x0000 -0x0382=0x0000 -0x0384=0x0000 -0x0315=0x0000 -0x0385=0x0000 -0x054F=0x18C9 -0x0389=0x0000 -0x04E3=0x0000 -0x040F=0x43E4 -0x0386=0x0000 -0x054E=0x8184 -0x009A=0x658C -0x02D0=0x0000 -0x03A0=0x0000 -0x0387=0x0000 -0x038D=0x0000 -0x02E7=0x0000 -0x0324=0x0000 -0x038E=0x0000 -0x0305=0x0000 -0x0393=0x0000 -0x0398=0x0000 -0x0408=0x0000 -0x039B=0x0000 -0x0248=0x0000 -0x039F=0x0000 -0x04E1=0x0000 -0x02A2=0x0000 -0x03A1=0x0000 -0x059A=0x0000 -0x048D=0x0000 -0x051C=0x0000 -0x03A2=0x0000 -0x03A3=0x0000 -0x03A4=0x0000 -0x03A5=0x0000 -0x0520=0x174B -0x03A7=0x0000 -0x055E=0xDB10 -0x0402=0x07D9 -0x0403=0x0013 -0x0560=0x174B -0x00A0=0x6565 -0x0404=0x0000 -0x0254=0x0000 -0x0405=0x0000 -0x0407=0x0000 -0x0580=0xEFF2 -0x0409=0x0000 -0x040B=0x000F -0x040D=0x0000 -0x0441=0x0000 -0x0508=0xEF99 -0x0443=0x0000 -0x0444=0x0000 -0x04CA=0x0000 -0x0446=0x0000 -0x0454=0x0000 -0x0448=0x0000 -0x044B=0x0000 -0x0390=0x0000 -0x0451=0x0000 -0x0559=0xACB9 -0x0456=0x0000 -0x0314=0x0000 -0x0458=0x0000 -0x02DA=0x0000 -0x045A=0x0000 -0x0447=0x0000 -0x0460=0x0000 -0x0480=0x0000 -0x045F=0x0000 -0x0486=0x0000 -0x0487=0x0000 -0x0283=0x0000 -0x0022=0x07FF -0x048E=0x0000 -0x029B=0x0000 -0x0491=0x0000 -0x0492=0x0000 -0x0493=0x0000 -[file_info] -version=1 -type=lms7002m_minimal_config diff --git a/targets/ARCH/LMSSDR/enb_sodera_lowband_Lrx_5MHz_rx19dB_txfull.ini b/targets/ARCH/LMSSDR/enb_sodera_lowband_Lrx_5MHz_rx19dB_txfull.ini deleted file mode 100644 index 34ce70c888f089f0498a5000848e4d99858de8ce..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/enb_sodera_lowband_Lrx_5MHz_rx19dB_txfull.ini +++ /dev/null @@ -1,1128 +0,0 @@ -[reference_clocks] -sxr_ref_clk_mhz=30.72 -sxt_ref_clk_mhz=30.72 -[lms7002_registers_b] -0x05A7=0x0000 -0x05A5=0x0000 -0x05A2=0x0000 -0x05A0=0x0000 -0x0599=0x0000 -0x0598=0x0000 -0x0596=0x0000 -0x0594=0x0000 -0x0592=0x0000 -0x0591=0x0000 -0x0590=0x0000 -0x058E=0x0000 -0x058C=0x0000 -0x059D=0x0000 -0x058A=0x0000 -0x0589=0x0000 -0x0587=0x0000 -0x0585=0x0000 -0x0595=0x0000 -0x0584=0x0000 -0x059F=0x0000 -0x0583=0x0000 -0x0582=0x0000 -0x0567=0x0000 -0x0566=0x0000 -0x0565=0x0000 -0x0564=0x0000 -0x0563=0x0000 -0x0562=0x0000 -0x055F=0x0000 -0x055D=0x0000 -0x055A=0x0000 -0x058F=0x0000 -0x0557=0x0000 -0x0593=0x0000 -0x0554=0x0000 -0x0552=0x0000 -0x0551=0x0000 -0x0550=0x0000 -0x054D=0x0000 -0x054C=0x0000 -0x0549=0x0000 -0x0547=0x0000 -0x0546=0x0000 -0x0545=0x0000 -0x0544=0x0000 -0x0543=0x0000 -0x0553=0x0000 -0x0542=0x0000 -0x0541=0x0000 -0x0527=0x0000 -0x0526=0x0000 -0x0524=0x0000 -0x0525=0x0000 -0x0523=0x0000 -0x0521=0x0000 -0x055C=0x0000 -0x051A=0x0000 -0x0519=0x0000 -0x0518=0x0000 -0x0514=0x0000 -0x0513=0x0000 -0x0511=0x0000 -0x05A6=0x0000 -0x051E=0x0000 -0x050F=0x0000 -0x0516=0x0000 -0x050E=0x0000 -0x050C=0x0000 -0x050B=0x0000 -0x050A=0x0000 -0x0509=0x0000 -0x0507=0x0000 -0x0506=0x0000 -0x0503=0x0000 -0x04E7=0x0000 -0x04E6=0x0000 -0x0512=0x0000 -0x04E5=0x0000 -0x04E4=0x0000 -0x0321=0x0000 -0x0320=0x0000 -0x0323=0x0000 -0x031B=0x0000 -0x0319=0x0000 -0x0260=0x0000 -0x031F=0x0000 -0x0360=0x0000 -0x0312=0x0000 -0x0310=0x0000 -0x0245=0x0000 -0x0581=0x0000 -0x045D=0x0000 -0x030E=0x0000 -0x0203=0x0000 -0x0482=0x0000 -0x0588=0x0000 -0x0308=0x0000 -0x048A=0x0000 -0x0307=0x0000 -0x0282=0x0000 -0x038C=0x0000 -0x0510=0x0000 -0x0302=0x0000 -0x0301=0x0000 -0x0309=0x0000 -0x0300=0x0000 -0x044E=0x0000 -0x034F=0x0000 -0x055B=0x0000 -0x0114=0x008D -0x02E5=0x0000 -0x02E4=0x0000 -0x02E1=0x0000 -0x02D5=0x0000 -0x0259=0x0000 -0x0517=0x0000 -0x0481=0x0000 -0x030B=0x0000 -0x0392=0x0000 -0x02DE=0x0000 -0x02DD=0x0000 -0x0297=0x0000 -0x0209=0x0000 -0x0400=0x0081 -0x02D8=0x0000 -0x0104=0x0088 -0x0103=0x0A12 -0x0347=0x0000 -0x0457=0x0000 -0x058D=0x0000 -0x02D7=0x0000 -0x02D1=0x0000 -0x04C8=0x0000 -0x02D3=0x0000 -0x02CB=0x0000 -0x0250=0x0000 -0x0306=0x0000 -0x04A4=0x0000 -0x044A=0x0000 -0x054B=0x0000 -0x02C7=0x0000 -0x02C1=0x0000 -0x031D=0x0000 -0x0440=0x0020 -0x045E=0x0000 -0x02C4=0x0000 -0x02C2=0x0000 -0x02DB=0x0000 -0x0357=0x0000 -0x0201=0x07FF -0x0483=0x0000 -0x05A4=0x0000 -0x02A3=0x0000 -0x02A1=0x0000 -0x028D=0x0000 -0x02D2=0x0000 -0x039C=0x0000 -0x02A0=0x0000 -0x010E=0x2040 -0x030A=0x0000 -0x029F=0x0000 -0x029C=0x0000 -0x029E=0x0000 -0x011D=0x699D -0x039E=0x0000 -0x0296=0x0000 -0x0555=0x0000 -0x0349=0x0000 -0x0295=0x0000 -0x010D=0x009E -0x04C4=0x0000 -0x0292=0x0000 -0x02CF=0x0000 -0x04D1=0x0000 -0x0291=0x0000 -0x02DF=0x0000 -0x0290=0x0000 -0x020A=0x0080 -0x0102=0x3180 -0x0388=0x0000 -0x0120=0xB9FF -0x0317=0x0000 -0x0244=0x0000 -0x059B=0x0000 -0x0322=0x0000 -0x010F=0x3042 -0x0119=0x18CB -0x02A6=0x0000 -0x051F=0x0000 -0x029A=0x0000 -0x049A=0x0000 -0x059E=0x0000 -0x04D7=0x0000 -0x0318=0x0000 -0x02A7=0x0000 -0x0200=0x0081 -0x02C5=0x0000 -0x0122=0x033F -0x0110=0x0BF4 -0x0204=0x0000 -0x0252=0x0000 -0x011E=0x06B9 -0x049B=0x0000 -0x0294=0x0000 -0x011C=0xAD41 -0x02D6=0x0000 -0x0311=0x0000 -0x0117=0x280C -0x0540=0x0000 -0x02A4=0x0000 -0x0485=0x0000 -0x02E0=0x0000 -0x0118=0x018C -0x0489=0x0000 -0x04A7=0x0000 -0x0101=0x7800 -0x0558=0x0000 -0x02C6=0x0000 -0x05A1=0x0000 -0x02C9=0x0000 -0x0500=0x0000 -0x039D=0x0000 -0x011F=0x3680 -0x030C=0x0000 -0x04DF=0x0000 -0x0281=0x0000 -0x0106=0x3182 -0x028E=0x0000 -0x0326=0x0000 -0x0113=0x03C3 -0x04CB=0x0000 -0x0391=0x0000 -0x0105=0x0007 -0x02D9=0x0000 -0x02CE=0x0000 -0x044F=0x0000 -0x038B=0x0000 -0x02D4=0x0000 -0x0107=0x318C -0x0495=0x0000 -0x0246=0x0000 -0x0303=0x0000 -0x02E6=0x0000 -0x045B=0x0000 -0x0100=0x3409 -0x0340=0x0000 -0x0208=0x0070 -0x0111=0x0083 -0x0247=0x0000 -0x024B=0x0000 -0x045C=0x0000 -0x024D=0x0000 -0x0202=0x07FF -0x0383=0x0000 -0x054A=0x0000 -0x0401=0x07FF -0x0206=0x0000 -0x0124=0x0000 -0x0341=0x0000 -0x0287=0x0000 -0x0501=0x0000 -0x034C=0x0000 -0x030F=0x0000 -0x025D=0x0000 -0x0406=0x0000 -0x051B=0x0000 -0x0313=0x0000 -0x010A=0x104C -0x0461=0x0000 -0x0121=0x333C -0x0115=0x0009 -0x0112=0xC0E6 -0x039A=0x0000 -0x02CC=0x0000 -0x0116=0x8180 -0x04A0=0x0000 -0x0108=0x9442 -0x020B=0x4000 -0x0251=0x0000 -0x0488=0x0000 -0x0241=0x0000 -0x038F=0x0000 -0x02DC=0x0000 -0x024C=0x0000 -0x0494=0x0000 -0x051D=0x0000 -0x0243=0x0000 -0x0556=0x0000 -0x040A=0x0000 -0x04CD=0x0000 -0x0249=0x0000 -0x0261=0x0000 -0x024A=0x0000 -0x0285=0x0000 -0x0280=0x0000 -0x0346=0x0000 -0x024E=0x0000 -0x024F=0x0000 -0x0253=0x0000 -0x0255=0x0000 -0x0502=0x0000 -0x0258=0x0000 -0x0298=0x0000 -0x05A3=0x0000 -0x0367=0x0000 -0x0240=0x0020 -0x0256=0x0000 -0x0242=0x0000 -0x025A=0x0000 -0x04E2=0x0000 -0x04C5=0x0000 -0x025B=0x0000 -0x020C=0x7FFF -0x0205=0x0000 -0x0361=0x0000 -0x0515=0x0000 -0x025C=0x0000 -0x0355=0x0000 -0x044C=0x0000 -0x010C=0x88FD -0x0284=0x0000 -0x0396=0x0000 -0x0286=0x0000 -0x028F=0x0000 -0x031C=0x0000 -0x031A=0x0000 -0x0363=0x0000 -0x0289=0x0000 -0x059C=0x0000 -0x04DD=0x0000 -0x028A=0x0000 -0x040C=0x0000 -0x028B=0x0000 -0x0450=0x0000 -0x0352=0x0000 -0x028C=0x0000 -0x04C2=0x0000 -0x025E=0x0000 -0x04DA=0x0000 -0x0327=0x0000 -0x0380=0x0000 -0x0342=0x0000 -0x0343=0x0000 -0x0561=0x0000 -0x0344=0x0000 -0x0586=0x0000 -0x0484=0x0000 -0x0345=0x0000 -0x0505=0x0000 -0x035B=0x0000 -0x034A=0x0000 -0x0455=0x0000 -0x011A=0x2E02 -0x034B=0x0000 -0x034D=0x0000 -0x035C=0x0000 -0x034E=0x0000 -0x0293=0x0000 -0x03A6=0x0000 -0x0350=0x0000 -0x0445=0x0000 -0x048F=0x0000 -0x0351=0x0000 -0x0353=0x0000 -0x050D=0x0000 -0x02CD=0x0000 -0x0490=0x0000 -0x0354=0x0000 -0x0348=0x0000 -0x0498=0x0000 -0x0356=0x0000 -0x0316=0x0000 -0x030D=0x0000 -0x040E=0x0000 -0x0522=0x0000 -0x049F=0x0000 -0x029D=0x0000 -0x04A3=0x0000 -0x0359=0x0000 -0x0299=0x0000 -0x0452=0x0000 -0x02C8=0x0000 -0x035A=0x0000 -0x0449=0x0000 -0x0442=0x0000 -0x035D=0x0000 -0x035E=0x0000 -0x0597=0x0000 -0x035F=0x0000 -0x0325=0x0000 -0x0364=0x0000 -0x0365=0x0000 -0x0366=0x0000 -0x0381=0x0000 -0x0288=0x0000 -0x0382=0x0000 -0x0384=0x0000 -0x0315=0x0000 -0x0385=0x0000 -0x054F=0x0000 -0x0389=0x0000 -0x04E3=0x0000 -0x040F=0x0000 -0x0386=0x0000 -0x054E=0x0000 -0x02D0=0x0000 -0x03A0=0x0000 -0x0387=0x0000 -0x0362=0x0000 -0x038A=0x0000 -0x0395=0x0000 -0x038D=0x0000 -0x02E7=0x0000 -0x0324=0x0000 -0x038E=0x0000 -0x0305=0x0000 -0x0393=0x0000 -0x0459=0x0000 -0x0394=0x0000 -0x0123=0x267B -0x0497=0x0000 -0x0398=0x0000 -0x0408=0x0000 -0x0399=0x0000 -0x039B=0x0000 -0x0248=0x0000 -0x039F=0x0000 -0x049E=0x0000 -0x059A=0x0000 -0x048D=0x0000 -0x051C=0x0000 -0x03A2=0x0000 -0x03A3=0x0000 -0x03A4=0x0000 -0x03A5=0x0000 -0x0520=0x0000 -0x03A7=0x0000 -0x055E=0x0000 -0x0402=0x07FF -0x0403=0x0000 -0x04D8=0x0000 -0x0560=0x0000 -0x0404=0x0000 -0x0254=0x0000 -0x0405=0x0000 -0x0407=0x0000 -0x0580=0x0000 -0x0409=0x0000 -0x040B=0x7FFF -0x040D=0x0000 -0x0441=0x0000 -0x0508=0x0000 -0x0443=0x0000 -0x0444=0x0000 -0x04CA=0x0000 -0x0446=0x0000 -0x0454=0x0000 -0x0448=0x0000 -0x044B=0x0000 -0x02E2=0x0000 -0x044D=0x0000 -0x0390=0x0000 -0x0451=0x0000 -0x0453=0x0000 -0x0559=0x0000 -0x0456=0x0000 -0x0314=0x0000 -0x0458=0x0000 -0x02DA=0x0000 -0x045A=0x0000 -0x0447=0x0000 -0x0460=0x0000 -0x0480=0x0000 -0x045F=0x0000 -0x0486=0x0000 -0x0487=0x0000 -0x0358=0x0000 -0x048B=0x0000 -0x048C=0x0000 -0x0283=0x0000 -0x048E=0x0000 -0x029B=0x0000 -0x0491=0x0000 -0x0492=0x0000 -0x04A1=0x0000 -0x0493=0x0000 -0x04C3=0x0000 -0x0496=0x0000 -0x02C0=0x0000 -0x0499=0x0000 -0x02E3=0x0000 -0x0397=0x0000 -0x049C=0x0000 -0x04C7=0x0000 -0x049D=0x0000 -0x0109=0x61C1 -0x04A2=0x0000 -0x04A5=0x0000 -0x04A6=0x0000 -0x0257=0x0000 -0x04D6=0x0000 -0x031E=0x0000 -0x04C0=0x0000 -0x02CA=0x0000 -0x04C9=0x0000 -0x02C3=0x0000 -0x04C1=0x0000 -0x0207=0x0000 -0x04C6=0x0000 -0x02A5=0x0000 -0x04CC=0x0000 -0x04CE=0x0000 -0x025F=0x0000 -0x04CF=0x0000 -0x04D0=0x0000 -0x0548=0x0000 -0x04D2=0x0000 -0x04D3=0x0000 -0x0504=0x0000 -0x04D4=0x0000 -0x0304=0x0000 -0x04D5=0x0000 -0x04D9=0x0000 -0x04DB=0x0000 -0x04DC=0x0000 -0x058B=0x0000 -0x04DE=0x0000 -0x04E0=0x0000 -0x02A2=0x0000 -0x03A1=0x0000 -0x04E1=0x0000 -[lms7002_registers_a] -0x05A7=0x0000 -0x05A5=0x0000 -0x05A2=0x0000 -0x0599=0x0000 -0x0598=0xF61D -0x0596=0x0A94 -0x0594=0xF40D -0x0592=0x0DF1 -0x0591=0xFCFE -0x0590=0xEF99 -0x058E=0x1316 -0x058C=0xEA50 -0x059D=0x0000 -0x058A=0x17DC -0x0585=0xDAA2 -0x0595=0x00BC -0x0584=0xE7E2 -0x059F=0x0000 -0x0583=0x2E45 -0x0582=0x150F -0x0567=0x4049 -0x0566=0x0906 -0x0565=0xB77F -0x0563=0x4F91 -0x055F=0x5852 -0x055D=0xA6B5 -0x055A=0xBE2A -0x058F=0x0605 -0x0557=0x4C24 -0x0593=0x00D8 -0x0554=0x6901 -0x0552=0x8D44 -0x0551=0xD7B7 -0x0550=0x79FA -0x054C=0x7FFF -0x0549=0x18C9 -0x0547=0xD7B7 -0x0546=0x8D44 -0x0545=0x364E -0x0544=0x6901 -0x0543=0xBD96 -0x0553=0x364E -0x0542=0xA2B5 -0x0541=0x4C24 -0x0527=0xACB9 -0x0526=0xBE2A -0x0525=0x57AC -0x0523=0xA6B5 -0x0521=0x5852 -0x055C=0x3347 -0x051A=0x0906 -0x0518=0xEFF2 -0x0514=0xE7E2 -0x0513=0xDAA2 -0x0511=0x1D10 -0x05A6=0x0000 -0x051E=0xF524 -0x050F=0xEA5F -0x0516=0x150F -0x050E=0x17DC -0x050C=0xEA50 -0x050B=0xF5EF -0x050A=0x1316 -0x0509=0x0605 -0x0507=0xFCFE -0x0506=0x0DF1 -0x0503=0x00BC -0x04E7=0x0000 -0x04E6=0x0000 -0x04E4=0x0000 -0x04E0=0x0000 -0x058B=0x0F45 -0x04DE=0x0000 -0x04DC=0x0000 -0x04DB=0x0000 -0x04D9=0x0000 -0x04D8=0x0000 -0x059E=0x0000 -0x04D7=0x0000 -0x0504=0xF40D -0x04D4=0x0000 -0x04D3=0x0000 -0x0548=0x79FA -0x04D2=0x0000 -0x04D1=0x0000 -0x04D0=0x0000 -0x04CE=0x0000 -0x04C8=0x0000 -0x04E2=0x0000 -0x04C5=0x0000 -0x04C4=0x0000 -0x04C2=0x0000 -0x04A7=0x0000 -0x04A6=0x0000 -0x04A5=0x0000 -0x04A1=0x0000 -0x04A0=0x0000 -0x0522=0xDB10 -0x049F=0x0000 -0x049E=0x0000 -0x04C7=0x0000 -0x049D=0x0000 -0x049B=0x0000 -0x049A=0x0000 -0x04C3=0x0000 -0x0496=0x0000 -0x0494=0x0000 -0x02D3=0x0000 -0x02D1=0x0000 -0x02CB=0x0000 -0x0250=0x0000 -0x0096=0x0000 -0x04C1=0x0000 -0x02C3=0x0000 -0x02C4=0x0000 -0x02C2=0x0000 -0x0499=0x0000 -0x02C0=0x0000 -0x0201=0x07FF -0x0483=0x0000 -0x05A4=0x0000 -0x02A3=0x0000 -0x008B=0x278A -0x02A1=0x0000 -0x028D=0x0000 -0x029C=0x0000 -0x029E=0x0000 -0x0297=0x0000 -0x0296=0x0000 -0x0555=0xBD96 -0x0349=0x0000 -0x010D=0x015C -0x02CF=0x0000 -0x0291=0x0000 -0x02DF=0x0000 -0x0290=0x0000 -0x0021=0x0E9F -0x0450=0x0000 -0x0558=0x5009 -0x02C6=0x0000 -0x0101=0x7800 -0x059C=0x0000 -0x04DD=0x0000 -0x028A=0x0000 -0x0121=0x313C -0x0285=0x0000 -0x0280=0x0000 -0x0319=0x0000 -0x04CF=0x0000 -0x025F=0x0000 -0x025D=0x0000 -0x030F=0x0000 -0x0406=0x0000 -0x02C5=0x0000 -0x0200=0x0301 -0x0281=0x0000 -0x04A2=0x0000 -0x0109=0x03C1 -0x0355=0x0000 -0x044C=0x0000 -0x025B=0x0000 -0x0298=0x0000 -0x0502=0x0A94 -0x0258=0x0000 -0x0255=0x0000 -0x04D6=0x0000 -0x0257=0x0000 -0x0252=0x0000 -0x0204=0xFFAD -0x024F=0x0000 -0x04CC=0x0000 -0x02A5=0x0000 -0x0497=0x0000 -0x0123=0x267B -0x0495=0x0000 -0x0246=0x0000 -0x051D=0x4F91 -0x0243=0x0000 -0x0556=0xA2B5 -0x040A=0x1000 -0x025A=0x0000 -0x0242=0x0000 -0x020C=0x8000 -0x0251=0x0000 -0x02DD=0x0000 -0x0020=0xFFFD -0x0488=0x0000 -0x020A=0x0000 -0x0102=0x3180 -0x04C6=0x0000 -0x0207=0x0000 -0x04DA=0x0000 -0x025E=0x0000 -0x0206=0x0000 -0x00A3=0x6565 -0x02E2=0x0000 -0x044D=0x0000 -0x0292=0x0000 -0x002A=0x0086 -0x0245=0x0000 -0x0581=0xC89D -0x045D=0x0000 -0x024D=0x0000 -0x002B=0x4032 -0x02A0=0x0000 -0x010E=0x070C -0x0286=0x0000 -0x009E=0x658C -0x0088=0x0530 -0x0085=0x0001 -0x0295=0x0000 -0x0089=0x00A0 -0x0256=0x0000 -0x0093=0x0000 -0x0092=0x0001 -0x031B=0x0000 -0x0111=0x0099 -0x0095=0x0000 -0x02A7=0x0000 -0x0203=0x2F6C -0x030E=0x0000 -0x0482=0x0000 -0x05A0=0x0000 -0x009C=0x658C -0x0381=0x0000 -0x0122=0x033F -0x0110=0x0BFF -0x0100=0xB409 -0x0028=0x0101 -0x0026=0x0101 -0x0524=0x3347 -0x009D=0x6565 -0x0294=0x0000 -0x0106=0x3182 -0x028E=0x0000 -0x0326=0x0000 -0x0113=0x03C3 -0x04CB=0x0000 -0x0391=0x0000 -0x05A1=0x0000 -0x02C9=0x0000 -0x0500=0xF61D -0x039D=0x0000 -0x011F=0x3680 -0x0395=0x0000 -0x024B=0x0000 -0x045C=0x0000 -0x0247=0x0000 -0x0512=0x196B -0x04E5=0x0000 -0x0024=0x50D8 -0x0353=0x0000 -0x050D=0x0F45 -0x02CD=0x0000 -0x0490=0x0000 -0x0501=0xFDFB -0x034C=0x0000 -0x00AA=0x0000 -0x0350=0x0000 -0x0445=0x0000 -0x048F=0x0000 -0x008A=0x0491 -0x0453=0x0000 -0x0124=0x0000 -0x0260=0x0000 -0x00A1=0x6565 -0x0356=0x0000 -0x0241=0x0000 -0x04CD=0x0000 -0x0249=0x0000 -0x002C=0x0100 -0x038F=0x0000 -0x008C=0x267B -0x0459=0x0000 -0x0394=0x0000 -0x054D=0xF7A3 -0x00A6=0x0001 -0x002D=0xFFFF -0x00AC=0x2000 -0x0253=0x0000 -0x028B=0x0000 -0x040C=0x40F8 -0x0099=0x6565 -0x0310=0x0000 -0x00A2=0x6565 -0x0589=0xEA5F -0x002F=0x3840 -0x0597=0xFDFB -0x035F=0x0000 -0x0562=0xF524 -0x0025=0x0101 -0x011C=0xAD41 -0x011D=0xFEEE -0x039E=0x0000 -0x0289=0x0000 -0x0282=0x0000 -0x0307=0x0000 -0x038C=0x0000 -0x0087=0x0000 -0x0399=0x0000 -0x054B=0xF7A3 -0x02C7=0x0000 -0x0519=0x4049 -0x009F=0x658C -0x0515=0x2E45 -0x025C=0x0000 -0x00A5=0x6565 -0x0301=0x0000 -0x02C1=0x0000 -0x0259=0x0000 -0x02D5=0x0000 -0x02E1=0x0000 -0x0517=0xC89D -0x0481=0x0000 -0x00A8=0x0000 -0x02D2=0x0000 -0x039C=0x0000 -0x0564=0x0000 -0x00AB=0x0040 -0x0261=0x0000 -0x002E=0x0000 -0x02DE=0x0000 -0x0540=0x5009 -0x02A4=0x0000 -0x0485=0x0000 -0x0489=0x0000 -0x00AD=0x03FF -0x024A=0x0000 -0x0029=0x0101 -0x0097=0x0000 -0x011E=0x0663 -0x00AE=0x0000 -0x00A7=0x6565 -0x020B=0x0000 -0x0098=0x0000 -0x0108=0xFC26 -0x0027=0x05E4 -0x0117=0x1939 -0x0383=0x0000 -0x0202=0x07F9 -0x054A=0x8184 -0x00A4=0x6565 -0x0401=0x07ED -0x0086=0x4101 -0x010C=0x8865 -0x02D8=0x0000 -0x0347=0x0000 -0x0457=0x0000 -0x0103=0x0A12 -0x0104=0x0088 -0x0357=0x0000 -0x02DB=0x0000 -0x0400=0x0101 -0x009B=0x6565 -0x0105=0x0007 -0x05A3=0x0000 -0x0240=0x0028 -0x0367=0x0000 -0x044F=0x0000 -0x038B=0x0000 -0x0284=0x0000 -0x0396=0x0000 -0x051F=0xAB08 -0x029A=0x0000 -0x0361=0x0000 -0x0205=0x0000 -0x0119=0x529F -0x02A6=0x0000 -0x010F=0x3042 -0x04C0=0x0000 -0x031E=0x0000 -0x02CC=0x0000 -0x0116=0x8180 -0x0587=0x1D10 -0x0023=0x5550 -0x048C=0x0000 -0x0112=0x20E5 -0x039A=0x0000 -0x0320=0x0000 -0x0323=0x0000 -0x0115=0x0009 -0x00A9=0x8000 -0x0244=0x0000 -0x0094=0x0000 -0x0317=0x0000 -0x0208=0x0170 -0x0340=0x0000 -0x058D=0xF5EF -0x02D7=0x0000 -0x04A3=0x0000 -0x029D=0x0000 -0x0388=0x0000 -0x0120=0xB9FF -0x04C9=0x0000 -0x02CA=0x0000 -0x0209=0x0000 -0x0082=0x8001 -0x0107=0x318C -0x02D4=0x0000 -0x02CE=0x0000 -0x02D9=0x0000 -0x02E4=0x0000 -0x024C=0x0000 -0x02DC=0x0000 -0x0118=0x218C -0x02E0=0x0000 -0x055B=0x57AC -0x0114=0x0170 -0x02E5=0x0000 -0x02E6=0x0000 -0x045B=0x0000 -0x034F=0x0000 -0x0300=0x0000 -0x044E=0x0000 -0x0510=0xE6C7 -0x0302=0x0000 -0x0303=0x0000 -0x04D5=0x0000 -0x0304=0x0000 -0x0306=0x0000 -0x04A4=0x0000 -0x044A=0x0000 -0x049C=0x0000 -0x02E3=0x0000 -0x0397=0x0000 -0x0588=0xE6C7 -0x0308=0x0000 -0x048A=0x0000 -0x0309=0x0000 -0x029F=0x0000 -0x030A=0x0000 -0x0392=0x0000 -0x030B=0x0000 -0x04DF=0x0000 -0x030C=0x0000 -0x02D6=0x0000 -0x0311=0x0000 -0x024E=0x0000 -0x0346=0x0000 -0x0312=0x0000 -0x051B=0xB77F -0x010A=0x184C -0x0461=0x0000 -0x0313=0x0000 -0x0360=0x0000 -0x028C=0x0000 -0x0352=0x0000 -0x040E=0x0000 -0x030D=0x0000 -0x0316=0x0000 -0x031F=0x0000 -0x0318=0x0000 -0x0287=0x0000 -0x0341=0x0000 -0x028F=0x0000 -0x031C=0x0000 -0x031A=0x0000 -0x0363=0x0000 -0x031D=0x0000 -0x0440=0x0024 -0x045E=0x0000 -0x0321=0x0000 -0x059B=0x0000 -0x0322=0x0000 -0x0327=0x0000 -0x0380=0x0000 -0x0342=0x0000 -0x0343=0x0000 -0x0561=0xAB08 -0x0344=0x0000 -0x0586=0x196B -0x0484=0x0000 -0x0345=0x0000 -0x0505=0x00D8 -0x035B=0x0000 -0x0498=0x0000 -0x0084=0x0400 -0x0348=0x0000 -0x034A=0x0000 -0x0455=0x0000 -0x011A=0x2E03 -0x034B=0x0000 -0x034D=0x0000 -0x035C=0x0000 -0x034E=0x0000 -0x0293=0x0000 -0x03A6=0x0000 -0x0351=0x0000 -0x0354=0x0000 -0x048B=0x0000 -0x0358=0x0000 -0x0359=0x0000 -0x0299=0x0000 -0x0452=0x0000 -0x02C8=0x0000 -0x035A=0x0000 -0x0449=0x0000 -0x0442=0x0000 -0x035D=0x0000 -0x035E=0x0000 -0x038A=0x0000 -0x0362=0x0000 -0x0081=0x0000 -0x0325=0x0000 -0x0364=0x0000 -0x0365=0x0000 -0x0366=0x0000 -0x0288=0x0000 -0x0382=0x0000 -0x0384=0x0000 -0x0315=0x0000 -0x0385=0x0000 -0x054F=0x18C9 -0x0389=0x0000 -0x04E3=0x0000 -0x040F=0x0000 -0x0386=0x0000 -0x054E=0x8184 -0x009A=0x658C -0x02D0=0x0000 -0x03A0=0x0000 -0x0387=0x0000 -0x038D=0x0000 -0x02E7=0x0000 -0x0324=0x0000 -0x038E=0x0000 -0x0305=0x0000 -0x0393=0x0000 -0x0398=0x0000 -0x0408=0x0000 -0x039B=0x0000 -0x0248=0x0000 -0x039F=0x0000 -0x04E1=0x0000 -0x02A2=0x0000 -0x03A1=0x0000 -0x059A=0x0000 -0x048D=0x0000 -0x051C=0x0000 -0x03A2=0x0000 -0x03A3=0x0000 -0x03A4=0x0000 -0x03A5=0x0000 -0x0520=0x174B -0x03A7=0x0000 -0x055E=0xDB10 -0x0402=0x07FF -0x0403=0x009C -0x0560=0x174B -0x00A0=0x6565 -0x0404=0x0000 -0x0254=0x0000 -0x0405=0x0000 -0x0407=0x0000 -0x0580=0xEFF2 -0x0409=0x0000 -0x040B=0x000F -0x040D=0x0000 -0x0441=0x0000 -0x0508=0xEF99 -0x0443=0x0000 -0x0444=0x0000 -0x04CA=0x0000 -0x0446=0x0000 -0x0454=0x0000 -0x0448=0x0000 -0x044B=0x0000 -0x0390=0x0000 -0x0451=0x0000 -0x0559=0xACB9 -0x0456=0x0000 -0x0314=0x0000 -0x0458=0x0000 -0x02DA=0x0000 -0x045A=0x0000 -0x0447=0x0000 -0x0460=0x0000 -0x0480=0x0000 -0x045F=0x0000 -0x0486=0x0000 -0x0487=0x0000 -0x0283=0x0000 -0x0022=0x07FF -0x048E=0x0000 -0x029B=0x0000 -0x0491=0x0000 -0x0492=0x0000 -0x0493=0x0000 -[file_info] -version=1 -type=lms7002m_minimal_config diff --git a/targets/ARCH/LMSSDR/enb_sodera_lowband_Wrx_5MHz_rx19dB_txfull.ini b/targets/ARCH/LMSSDR/enb_sodera_lowband_Wrx_5MHz_rx19dB_txfull.ini deleted file mode 100644 index 0243742f32e2297a96e2cf49f8ca19545cfee859..0000000000000000000000000000000000000000 --- a/targets/ARCH/LMSSDR/enb_sodera_lowband_Wrx_5MHz_rx19dB_txfull.ini +++ /dev/null @@ -1,1128 +0,0 @@ -[file_info] -type=lms7002m_minimal_config -version=1 -[lms7002_registers_a] -0x0493=0x0000 -0x0492=0x0000 -0x0491=0x0000 -0x029B=0x0000 -0x048E=0x0000 -0x0022=0x07FF -0x0283=0x0000 -0x0487=0x0000 -0x0486=0x0000 -0x045F=0x0000 -0x0480=0x0000 -0x0460=0x0000 -0x0447=0x0000 -0x045A=0x0000 -0x02DA=0x0000 -0x0458=0x0000 -0x0314=0x0000 -0x0456=0x0000 -0x0559=0xACB9 -0x0451=0x0000 -0x0390=0x0000 -0x044B=0x0000 -0x0448=0x0000 -0x0454=0x0000 -0x0446=0x0000 -0x04CA=0x0000 -0x0444=0x0000 -0x0443=0x0000 -0x0508=0xEF99 -0x0441=0x0000 -0x040D=0x0000 -0x040B=0x000F -0x0409=0x0000 -0x0580=0xEFF2 -0x0407=0x0000 -0x0405=0x0000 -0x0254=0x0000 -0x0404=0x0000 -0x00A0=0x6565 -0x0560=0x174B -0x0403=0x009C -0x0402=0x07FF -0x055E=0xDB10 -0x03A7=0x0000 -0x0520=0x174B -0x03A5=0x0000 -0x03A4=0x0000 -0x03A3=0x0000 -0x03A2=0x0000 -0x051C=0x0000 -0x048D=0x0000 -0x059A=0x0000 -0x03A1=0x0000 -0x02A2=0x0000 -0x04E1=0x0000 -0x039F=0x0000 -0x0248=0x0000 -0x039B=0x0000 -0x0408=0x0000 -0x0398=0x0000 -0x0393=0x0000 -0x0305=0x0000 -0x038E=0x0000 -0x0324=0x0000 -0x02E7=0x0000 -0x038D=0x0000 -0x0387=0x0000 -0x03A0=0x0000 -0x02D0=0x0000 -0x009A=0x658C -0x054E=0x8184 -0x0386=0x0000 -0x040F=0x0000 -0x04E3=0x0000 -0x0389=0x0000 -0x054F=0x18C9 -0x0385=0x0000 -0x0315=0x0000 -0x0384=0x0000 -0x0382=0x0000 -0x0288=0x0000 -0x0366=0x0000 -0x0365=0x0000 -0x0364=0x0000 -0x0325=0x0000 -0x0081=0x0000 -0x0362=0x0000 -0x038A=0x0000 -0x035E=0x0000 -0x035D=0x0000 -0x0442=0x0000 -0x0449=0x0000 -0x035A=0x0000 -0x02C8=0x0000 -0x0452=0x0000 -0x0299=0x0000 -0x0359=0x0000 -0x0358=0x0000 -0x048B=0x0000 -0x0354=0x0000 -0x0351=0x0000 -0x03A6=0x0000 -0x0293=0x0000 -0x034E=0x0000 -0x035C=0x0000 -0x034D=0x0000 -0x034B=0x0000 -0x011A=0x2E03 -0x0455=0x0000 -0x034A=0x0000 -0x0348=0x0000 -0x0084=0x0400 -0x0498=0x0000 -0x035B=0x0000 -0x0505=0x00D8 -0x0345=0x0000 -0x0484=0x0000 -0x0586=0x196B -0x0344=0x0000 -0x0561=0xAB08 -0x0343=0x0000 -0x0342=0x0000 -0x0380=0x0000 -0x0327=0x0000 -0x0322=0x0000 -0x059B=0x0000 -0x0321=0x0000 -0x045E=0x0000 -0x0440=0x0024 -0x031D=0x0000 -0x0363=0x0000 -0x031A=0x0000 -0x031C=0x0000 -0x028F=0x0000 -0x0341=0x0000 -0x0287=0x0000 -0x0318=0x0000 -0x031F=0x0000 -0x0316=0x0000 -0x030D=0x0000 -0x040E=0x0000 -0x0352=0x0000 -0x028C=0x0000 -0x0360=0x0000 -0x0313=0x0000 -0x0461=0x0000 -0x010A=0x184C -0x051B=0xB77F -0x0312=0x0000 -0x0346=0x0000 -0x024E=0x0000 -0x0311=0x0000 -0x02D6=0x0000 -0x030C=0x0000 -0x04DF=0x0000 -0x030B=0x0000 -0x0392=0x0000 -0x030A=0x0000 -0x029F=0x0000 -0x0309=0x0000 -0x048A=0x0000 -0x0308=0x0000 -0x0588=0xE6C7 -0x0397=0x0000 -0x02E3=0x0000 -0x049C=0x0000 -0x044A=0x0000 -0x04A4=0x0000 -0x0306=0x0000 -0x0304=0x0000 -0x04D5=0x0000 -0x0303=0x0000 -0x0302=0x0000 -0x0510=0xE6C7 -0x044E=0x0000 -0x0300=0x0000 -0x034F=0x0000 -0x045B=0x0000 -0x02E6=0x0000 -0x00A3=0x6565 -0x04DA=0x0000 -0x025E=0x0000 -0x020A=0x0000 -0x0102=0x3180 -0x020C=0x8000 -0x05A2=0x0000 -0x040A=0x1000 -0x0556=0xA2B5 -0x0243=0x0000 -0x051D=0x4F91 -0x0259=0x0000 -0x02D5=0x0000 -0x02E1=0x0000 -0x011D=0xFEEE -0x039E=0x0000 -0x0252=0x0000 -0x0204=0xFFAD -0x0255=0x0000 -0x0281=0x0000 -0x0200=0x0301 -0x0594=0xF40D -0x02C5=0x0000 -0x0406=0x0000 -0x030F=0x0000 -0x025D=0x0000 -0x0319=0x0000 -0x0121=0x313C -0x0101=0x7800 -0x025B=0x0000 -0x02C6=0x0000 -0x0558=0x5009 -0x0021=0x0E9F -0x04C2=0x0000 -0x0290=0x0000 -0x02DF=0x0000 -0x0291=0x0000 -0x0296=0x0000 -0x029C=0x0000 -0x028D=0x0000 -0x02A1=0x0000 -0x008B=0x278A -0x02A3=0x0000 -0x05A4=0x0000 -0x02A7=0x0000 -0x0483=0x0000 -0x0201=0x07FF -0x02C2=0x0000 -0x02C4=0x0000 -0x044D=0x0000 -0x02E2=0x0000 -0x02D1=0x0000 -0x0546=0x8D44 -0x04C8=0x0000 -0x0207=0x0000 -0x04C6=0x0000 -0x0096=0x0000 -0x0093=0x0000 -0x0250=0x0000 -0x02CB=0x0000 -0x02D3=0x0000 -0x0494=0x0000 -0x04CF=0x0000 -0x025F=0x0000 -0x0251=0x0000 -0x0488=0x0000 -0x0496=0x0000 -0x04C3=0x0000 -0x0100=0xB409 -0x04CC=0x0000 -0x02A5=0x0000 -0x0257=0x0000 -0x04D6=0x0000 -0x04A6=0x0000 -0x049A=0x0000 -0x049B=0x0000 -0x0097=0x0000 -0x011E=0x0663 -0x0285=0x0000 -0x0280=0x0000 -0x049E=0x0000 -0x0020=0xFFFD -0x02DD=0x0000 -0x0297=0x0000 -0x049F=0x0000 -0x0522=0xDB10 -0x044C=0x0000 -0x0355=0x0000 -0x04A0=0x0000 -0x02CF=0x0000 -0x04D1=0x0000 -0x0526=0xBE2A -0x0092=0x0001 -0x031B=0x0000 -0x0541=0x4C24 -0x0518=0xEFF2 -0x0543=0xBD96 -0x02C0=0x0000 -0x0499=0x0000 -0x04A1=0x0000 -0x058D=0xF5EF -0x02D7=0x0000 -0x0513=0xDAA2 -0x0549=0x18C9 -0x0552=0x8D44 -0x0521=0x5852 -0x0509=0x0605 -0x0286=0x0000 -0x024F=0x0000 -0x04E0=0x0000 -0x0545=0x364E -0x0349=0x0000 -0x0555=0xBD96 -0x04E4=0x0000 -0x02E4=0x0000 -0x0551=0xD7B7 -0x055D=0xA6B5 -0x0298=0x0000 -0x055F=0x5852 -0x009E=0x658C -0x0547=0xD7B7 -0x0598=0xF61D -0x0123=0x267B -0x0497=0x0000 -0x04A5=0x0000 -0x0565=0xB77F -0x0124=0x0000 -0x0592=0x0DF1 -0x0591=0xFCFE -0x0548=0x79FA -0x04D2=0x0000 -0x0599=0x0000 -0x0511=0x1D10 -0x0506=0x0DF1 -0x0595=0x00BC -0x0584=0xE7E2 -0x0242=0x0000 -0x025A=0x0000 -0x04E2=0x0000 -0x04C5=0x0000 -0x058C=0xEA50 -0x0450=0x0000 -0x0596=0x0A94 -0x05A7=0x0000 -0x058A=0x17DC -0x059D=0x0000 -0x0485=0x0000 -0x058E=0x1316 -0x0550=0x79FA -0x0554=0x6901 -0x0593=0x00D8 -0x0542=0xA2B5 -0x0553=0x364E -0x0563=0x4F91 -0x024D=0x0000 -0x0567=0x4049 -0x055A=0xBE2A -0x0295=0x0000 -0x0566=0x0906 -0x028A=0x0000 -0x059C=0x0000 -0x04DD=0x0000 -0x054C=0x7FFF -0x0582=0x150F -0x0585=0xDAA2 -0x0109=0x03C1 -0x04A2=0x0000 -0x0292=0x0000 -0x059F=0x0000 -0x0583=0x2E45 -0x050E=0x17DC -0x0516=0x150F -0x0523=0xA6B5 -0x0525=0x57AC -0x0206=0x0000 -0x051A=0x0906 -0x055C=0x3347 -0x0514=0xE7E2 -0x050F=0xEA5F -0x05A6=0x0000 -0x051E=0xF524 -0x050A=0x1316 -0x04C7=0x0000 -0x049D=0x0000 -0x0527=0xACB9 -0x050C=0xEA50 -0x0087=0x0000 -0x0399=0x0000 -0x050B=0xF5EF -0x0507=0xFCFE -0x010D=0x01DC -0x04C4=0x0000 -0x0495=0x0000 -0x0246=0x0000 -0x0503=0x00BC -0x0320=0x0000 -0x0323=0x0000 -0x02E5=0x0000 -0x055B=0x57AC -0x0114=0x0170 -0x04D8=0x0000 -0x04E7=0x0000 -0x04D0=0x0000 -0x04E6=0x0000 -0x00AE=0x0000 -0x0544=0x6901 -0x0258=0x0000 -0x0502=0x0A94 -0x04DE=0x0000 -0x058B=0x0F45 -0x0028=0x0101 -0x029E=0x0000 -0x04DC=0x0000 -0x04D9=0x0000 -0x0557=0x4C24 -0x058F=0x0605 -0x04DB=0x0000 -0x04D7=0x0000 -0x059E=0x0000 -0x024C=0x0000 -0x02DC=0x0000 -0x04D4=0x0000 -0x0504=0xF40D -0x02C3=0x0000 -0x04C1=0x0000 -0x04D3=0x0000 -0x0590=0xEF99 -0x04CE=0x0000 -0x05A5=0x0000 -0x04A7=0x0000 -0x0489=0x0000 -0x02E0=0x0000 -0x0118=0x218C -0x002A=0x0086 -0x0245=0x0000 -0x045D=0x0000 -0x0581=0xC89D -0x02D2=0x0000 -0x039C=0x0000 -0x002B=0x4032 -0x02A0=0x0000 -0x010E=0x070C -0x0394=0x0000 -0x0459=0x0000 -0x0088=0x0530 -0x0085=0x0001 -0x0089=0x00A0 -0x0256=0x0000 -0x0111=0x0099 -0x0095=0x0000 -0x0203=0x2F6C -0x030E=0x0000 -0x0482=0x0000 -0x05A0=0x0000 -0x009C=0x658C -0x0381=0x0000 -0x0122=0x033F -0x0110=0x0BFF -0x0026=0x0101 -0x0294=0x0000 -0x009D=0x6565 -0x0524=0x3347 -0x0106=0x3182 -0x028E=0x0000 -0x0326=0x0000 -0x0113=0x03C3 -0x0391=0x0000 -0x04CB=0x0000 -0x010F=0x3042 -0x0119=0x529F -0x02A6=0x0000 -0x05A1=0x0000 -0x02C9=0x0000 -0x0500=0xF61D -0x039D=0x0000 -0x011F=0x3680 -0x0395=0x0000 -0x024B=0x0000 -0x045C=0x0000 -0x0247=0x0000 -0x0512=0x196B -0x04E5=0x0000 -0x0024=0x50D8 -0x0353=0x0000 -0x050D=0x0F45 -0x02CD=0x0000 -0x0490=0x0000 -0x0501=0xFDFB -0x034C=0x0000 -0x00AA=0x0000 -0x0350=0x0000 -0x0445=0x0000 -0x048F=0x0000 -0x008A=0x0491 -0x0453=0x0000 -0x0260=0x0000 -0x00A1=0x6565 -0x0356=0x0000 -0x0241=0x0000 -0x008C=0x267B -0x038F=0x0000 -0x054A=0x8184 -0x00A4=0x6565 -0x0401=0x07ED -0x04CD=0x0000 -0x0249=0x0000 -0x002C=0x0100 -0x054D=0xF7A3 -0x00A6=0x0001 -0x002D=0xFFFF -0x00AC=0x2000 -0x0253=0x0000 -0x028B=0x0000 -0x040C=0x40F8 -0x0310=0x0000 -0x0099=0x6565 -0x00A2=0x6565 -0x0589=0xEA5F -0x002F=0x3840 -0x035F=0x0000 -0x0597=0xFDFB -0x0116=0x8180 -0x02CC=0x0000 -0x0025=0x0101 -0x0562=0xF524 -0x011C=0xAD41 -0x0289=0x0000 -0x0282=0x0000 -0x0307=0x0000 -0x038C=0x0000 -0x02C7=0x0000 -0x054B=0xF7A3 -0x0519=0x4049 -0x009F=0x658C -0x025C=0x0000 -0x0515=0x2E45 -0x00A5=0x6565 -0x0301=0x0000 -0x02C1=0x0000 -0x0481=0x0000 -0x0517=0xC89D -0x00A8=0x0000 -0x0564=0x0000 -0x00AB=0x0040 -0x0261=0x0000 -0x002E=0x0000 -0x02DE=0x0000 -0x02A4=0x0000 -0x0540=0x5009 -0x00AD=0x03FF -0x0029=0x0101 -0x024A=0x0000 -0x00A7=0x6565 -0x0027=0x05E4 -0x0117=0x1939 -0x0098=0x0000 -0x0108=0xFC26 -0x020B=0x0000 -0x0383=0x0000 -0x0202=0x07F9 -0x0086=0x4101 -0x010C=0x8865 -0x02D8=0x0000 -0x0347=0x0000 -0x0457=0x0000 -0x0103=0x0A12 -0x0104=0x0088 -0x0357=0x0000 -0x02DB=0x0000 -0x0400=0x0101 -0x009B=0x6565 -0x0105=0x0007 -0x05A3=0x0000 -0x0240=0x0028 -0x0367=0x0000 -0x044F=0x0000 -0x038B=0x0000 -0x02D9=0x0000 -0x02CE=0x0000 -0x0284=0x0000 -0x0396=0x0000 -0x029A=0x0000 -0x051F=0xAB08 -0x0361=0x0000 -0x0205=0x0000 -0x031E=0x0000 -0x04C0=0x0000 -0x0587=0x1D10 -0x0023=0x5550 -0x048C=0x0000 -0x0112=0x20E5 -0x039A=0x0000 -0x0115=0x0009 -0x00A9=0x8000 -0x0317=0x0000 -0x0244=0x0000 -0x0094=0x0000 -0x0340=0x0000 -0x0208=0x0170 -0x04A3=0x0000 -0x029D=0x0000 -0x0388=0x0000 -0x0120=0xB9FF -0x04C9=0x0000 -0x02CA=0x0000 -0x0209=0x0000 -0x0082=0x8001 -0x02D4=0x0000 -0x0107=0x318C -[lms7002_registers_b] -0x04E1=0x0000 -0x03A1=0x0000 -0x02A2=0x0000 -0x04E0=0x0000 -0x04DE=0x0000 -0x058B=0x0000 -0x04DC=0x0000 -0x04DB=0x0000 -0x04D9=0x0000 -0x04D5=0x0000 -0x0304=0x0000 -0x04D4=0x0000 -0x0504=0x0000 -0x04D3=0x0000 -0x04D2=0x0000 -0x0548=0x0000 -0x04D0=0x0000 -0x04CF=0x0000 -0x025F=0x0000 -0x04CE=0x0000 -0x04CC=0x0000 -0x02A5=0x0000 -0x04C6=0x0000 -0x0207=0x0000 -0x04C1=0x0000 -0x02C3=0x0000 -0x04C9=0x0000 -0x02CA=0x0000 -0x04C0=0x0000 -0x031E=0x0000 -0x04D6=0x0000 -0x0257=0x0000 -0x04A6=0x0000 -0x04A5=0x0000 -0x04A2=0x0000 -0x0109=0x61C1 -0x049D=0x0000 -0x04C7=0x0000 -0x049C=0x0000 -0x0397=0x0000 -0x02E3=0x0000 -0x0499=0x0000 -0x02C0=0x0000 -0x0496=0x0000 -0x04C3=0x0000 -0x0493=0x0000 -0x04A1=0x0000 -0x0492=0x0000 -0x0491=0x0000 -0x029B=0x0000 -0x048E=0x0000 -0x0283=0x0000 -0x048C=0x0000 -0x048B=0x0000 -0x0358=0x0000 -0x0487=0x0000 -0x0486=0x0000 -0x045F=0x0000 -0x0480=0x0000 -0x0460=0x0000 -0x0447=0x0000 -0x045A=0x0000 -0x02DA=0x0000 -0x0458=0x0000 -0x0314=0x0000 -0x0456=0x0000 -0x0559=0x0000 -0x0453=0x0000 -0x0451=0x0000 -0x0390=0x0000 -0x044D=0x0000 -0x02E2=0x0000 -0x044B=0x0000 -0x0448=0x0000 -0x0454=0x0000 -0x0446=0x0000 -0x04CA=0x0000 -0x0444=0x0000 -0x0443=0x0000 -0x0508=0x0000 -0x0441=0x0000 -0x040D=0x0000 -0x040B=0x7FFF -0x0409=0x0000 -0x0580=0x0000 -0x0407=0x0000 -0x0405=0x0000 -0x0254=0x0000 -0x0404=0x0000 -0x0560=0x0000 -0x04D8=0x0000 -0x0403=0x0000 -0x0402=0x07FF -0x055E=0x0000 -0x03A7=0x0000 -0x0520=0x0000 -0x03A5=0x0000 -0x03A4=0x0000 -0x03A3=0x0000 -0x03A2=0x0000 -0x051C=0x0000 -0x048D=0x0000 -0x059A=0x0000 -0x049E=0x0000 -0x039F=0x0000 -0x0248=0x0000 -0x039B=0x0000 -0x0399=0x0000 -0x0408=0x0000 -0x0398=0x0000 -0x0497=0x0000 -0x0123=0x267B -0x0394=0x0000 -0x0459=0x0000 -0x0393=0x0000 -0x0305=0x0000 -0x038E=0x0000 -0x0324=0x0000 -0x02E7=0x0000 -0x038D=0x0000 -0x0395=0x0000 -0x038A=0x0000 -0x0362=0x0000 -0x0387=0x0000 -0x0200=0x0081 -0x0594=0x0000 -0x02C5=0x0000 -0x02A7=0x0000 -0x0318=0x0000 -0x0544=0x0000 -0x049A=0x0000 -0x0388=0x0000 -0x0120=0xB9FF -0x020A=0x0080 -0x0102=0x3180 -0x0290=0x0000 -0x02DF=0x0000 -0x0291=0x0000 -0x0295=0x0000 -0x055A=0x0000 -0x029C=0x0000 -0x010E=0x2040 -0x02A0=0x0000 -0x010F=0x3042 -0x02A6=0x0000 -0x0119=0x18CB -0x02D2=0x0000 -0x039C=0x0000 -0x028D=0x0000 -0x02A1=0x0000 -0x02C2=0x0000 -0x045E=0x0000 -0x031D=0x0000 -0x0440=0x0020 -0x02C4=0x0000 -0x04D1=0x0000 -0x02CF=0x0000 -0x02C1=0x0000 -0x02C7=0x0000 -0x054B=0x0000 -0x02D3=0x0000 -0x04C8=0x0000 -0x02D1=0x0000 -0x0546=0x0000 -0x0306=0x0000 -0x02D7=0x0000 -0x058D=0x0000 -0x0457=0x0000 -0x02D8=0x0000 -0x0347=0x0000 -0x0103=0x0A12 -0x0104=0x0088 -0x0357=0x0000 -0x02DB=0x0000 -0x0400=0x0081 -0x0209=0x0000 -0x0297=0x0000 -0x02DD=0x0000 -0x029E=0x0000 -0x02DE=0x0000 -0x0527=0x0000 -0x02D5=0x0000 -0x02E1=0x0000 -0x0259=0x0000 -0x0481=0x0000 -0x0517=0x0000 -0x029A=0x0000 -0x051F=0x0000 -0x0483=0x0000 -0x0201=0x07FF -0x0507=0x0000 -0x0321=0x0000 -0x034F=0x0000 -0x0296=0x0000 -0x0510=0x0000 -0x0302=0x0000 -0x038C=0x0000 -0x0307=0x0000 -0x0282=0x0000 -0x0392=0x0000 -0x030B=0x0000 -0x0588=0x0000 -0x0308=0x0000 -0x048A=0x0000 -0x044A=0x0000 -0x04A4=0x0000 -0x04C4=0x0000 -0x010D=0x009E -0x0300=0x0000 -0x0587=0x0000 -0x044E=0x0000 -0x0309=0x0000 -0x0585=0x0000 -0x02E5=0x0000 -0x055B=0x0000 -0x0114=0x008D -0x0323=0x0000 -0x0320=0x0000 -0x0503=0x0000 -0x0513=0x0000 -0x0319=0x0000 -0x0260=0x0000 -0x0549=0x0000 -0x0552=0x0000 -0x0509=0x0000 -0x0521=0x0000 -0x0286=0x0000 -0x04D7=0x0000 -0x059E=0x0000 -0x0557=0x0000 -0x058F=0x0000 -0x0322=0x0000 -0x059B=0x0000 -0x0545=0x0000 -0x0349=0x0000 -0x0555=0x0000 -0x02E4=0x0000 -0x04E4=0x0000 -0x0551=0x0000 -0x0312=0x0000 -0x055D=0x0000 -0x0298=0x0000 -0x055F=0x0000 -0x011D=0x699D -0x039E=0x0000 -0x0547=0x0000 -0x0598=0x0000 -0x0449=0x0000 -0x0564=0x0000 -0x0242=0x0000 -0x0525=0x0000 -0x0523=0x0000 -0x0565=0x0000 -0x0124=0x0000 -0x0592=0x0000 -0x0591=0x0000 -0x0563=0x0000 -0x024D=0x0000 -0x0567=0x0000 -0x05A5=0x0000 -0x0566=0x0000 -0x030A=0x0000 -0x029F=0x0000 -0x054C=0x0000 -0x0582=0x0000 -0x0599=0x0000 -0x0511=0x0000 -0x0506=0x0000 -0x0301=0x0000 -0x0595=0x0000 -0x0584=0x0000 -0x058C=0x0000 -0x051E=0x0000 -0x05A6=0x0000 -0x050F=0x0000 -0x0590=0x0000 -0x05A0=0x0000 -0x0596=0x0000 -0x05A7=0x0000 -0x0562=0x0000 -0x058A=0x0000 -0x059D=0x0000 -0x0485=0x0000 -0x0581=0x0000 -0x045D=0x0000 -0x0245=0x0000 -0x0310=0x0000 -0x058E=0x0000 -0x05A2=0x0000 -0x054D=0x0000 -0x020C=0x7FFF -0x0589=0x0000 -0x0522=0x0000 -0x049F=0x0000 -0x031F=0x0000 -0x0292=0x0000 -0x059F=0x0000 -0x0583=0x0000 -0x0543=0x0000 -0x0317=0x0000 -0x0244=0x0000 -0x0554=0x0000 -0x0593=0x0000 -0x05A4=0x0000 -0x02A3=0x0000 -0x0553=0x0000 -0x0542=0x0000 -0x0519=0x0000 -0x024F=0x0000 -0x0524=0x0000 -0x0518=0x0000 -0x0354=0x0000 -0x0526=0x0000 -0x031B=0x0000 -0x050E=0x0000 -0x0516=0x0000 -0x02CB=0x0000 -0x0250=0x0000 -0x031C=0x0000 -0x028F=0x0000 -0x051A=0x0000 -0x055C=0x0000 -0x0514=0x0000 -0x050A=0x0000 -0x050C=0x0000 -0x050B=0x0000 -0x04E7=0x0000 -0x04E6=0x0000 -0x04E5=0x0000 -0x0512=0x0000 -0x0206=0x0000 -0x0550=0x0000 -0x0360=0x0000 -0x030E=0x0000 -0x0203=0x0000 -0x0482=0x0000 -0x0541=0x0000 -0x0122=0x033F -0x0110=0x0BF4 -0x0204=0x0000 -0x0252=0x0000 -0x011E=0x06B9 -0x049B=0x0000 -0x0294=0x0000 -0x011C=0xAD41 -0x02D6=0x0000 -0x0311=0x0000 -0x0117=0x280C -0x02A4=0x0000 -0x0540=0x0000 -0x02E0=0x0000 -0x0118=0x018C -0x0489=0x0000 -0x04A7=0x0000 -0x0101=0x7800 -0x0558=0x0000 -0x02C6=0x0000 -0x05A1=0x0000 -0x02C9=0x0000 -0x039D=0x0000 -0x0500=0x0000 -0x0450=0x0000 -0x011F=0x3680 -0x030C=0x0000 -0x04DF=0x0000 -0x0281=0x0000 -0x0106=0x3182 -0x028E=0x0000 -0x0326=0x0000 -0x0113=0x03C3 -0x04CB=0x0000 -0x0391=0x0000 -0x0105=0x0007 -0x02D9=0x0000 -0x02CE=0x0000 -0x038B=0x0000 -0x044F=0x0000 -0x02D4=0x0000 -0x0107=0x318C -0x0495=0x0000 -0x0246=0x0000 -0x0303=0x0000 -0x02E6=0x0000 -0x045B=0x0000 -0x0100=0x3409 -0x0340=0x0000 -0x0208=0x0070 -0x0111=0x0083 -0x0247=0x0000 -0x024B=0x0000 -0x045C=0x0000 -0x0383=0x0000 -0x0202=0x07FF -0x054A=0x0000 -0x0401=0x07FF -0x0341=0x0000 -0x0287=0x0000 -0x034C=0x0000 -0x0501=0x0000 -0x030F=0x0000 -0x025D=0x0000 -0x0406=0x0000 -0x0313=0x0000 -0x010A=0x104C -0x0461=0x0000 -0x051B=0x0000 -0x0121=0x333C -0x0115=0x0009 -0x0112=0xC0E6 -0x039A=0x0000 -0x02CC=0x0000 -0x0116=0x8180 -0x04A0=0x0000 -0x0108=0x9442 -0x020B=0x4000 -0x0251=0x0000 -0x0488=0x0000 -0x0241=0x0000 -0x038F=0x0000 -0x02DC=0x0000 -0x024C=0x0000 -0x0494=0x0000 -0x051D=0x0000 -0x0243=0x0000 -0x0556=0x0000 -0x040A=0x0000 -0x04CD=0x0000 -0x0249=0x0000 -0x0261=0x0000 -0x024A=0x0000 -0x0285=0x0000 -0x0280=0x0000 -0x0346=0x0000 -0x024E=0x0000 -0x0253=0x0000 -0x028B=0x0000 -0x040C=0x0000 -0x0255=0x0000 -0x0258=0x0000 -0x0502=0x0000 -0x05A3=0x0000 -0x0367=0x0000 -0x0240=0x0020 -0x0256=0x0000 -0x025A=0x0000 -0x04E2=0x0000 -0x04C5=0x0000 -0x025B=0x0000 -0x0205=0x0000 -0x0361=0x0000 -0x0515=0x0000 -0x025C=0x0000 -0x0355=0x0000 -0x044C=0x0000 -0x010C=0x88FD -0x0284=0x0000 -0x0396=0x0000 -0x0363=0x0000 -0x031A=0x0000 -0x0289=0x0000 -0x028A=0x0000 -0x04DD=0x0000 -0x059C=0x0000 -0x0352=0x0000 -0x028C=0x0000 -0x04C2=0x0000 -0x04DA=0x0000 -0x025E=0x0000 -0x0327=0x0000 -0x0380=0x0000 -0x0342=0x0000 -0x0343=0x0000 -0x0344=0x0000 -0x0561=0x0000 -0x035A=0x0000 -0x02C8=0x0000 -0x0484=0x0000 -0x0586=0x0000 -0x0597=0x0000 -0x035F=0x0000 -0x0345=0x0000 -0x0505=0x0000 -0x035B=0x0000 -0x034A=0x0000 -0x0455=0x0000 -0x011A=0x2E02 -0x034B=0x0000 -0x034D=0x0000 -0x035C=0x0000 -0x034E=0x0000 -0x0293=0x0000 -0x03A6=0x0000 -0x0350=0x0000 -0x0445=0x0000 -0x048F=0x0000 -0x0351=0x0000 -0x0353=0x0000 -0x050D=0x0000 -0x02CD=0x0000 -0x0490=0x0000 -0x0498=0x0000 -0x0348=0x0000 -0x0356=0x0000 -0x030D=0x0000 -0x0316=0x0000 -0x040E=0x0000 -0x04A3=0x0000 -0x029D=0x0000 -0x0359=0x0000 -0x0299=0x0000 -0x0452=0x0000 -0x0442=0x0000 -0x035D=0x0000 -0x035E=0x0000 -0x0325=0x0000 -0x0364=0x0000 -0x0365=0x0000 -0x0366=0x0000 -0x0381=0x0000 -0x0288=0x0000 -0x0382=0x0000 -0x0384=0x0000 -0x0315=0x0000 -0x0385=0x0000 -0x04E3=0x0000 -0x040F=0x0000 -0x0389=0x0000 -0x054F=0x0000 -0x0386=0x0000 -0x02D0=0x0000 -0x054E=0x0000 -0x03A0=0x0000 -[reference_clocks] -sxt_ref_clk_mhz=30.72 -sxr_ref_clk_mhz=30.72 diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index 0161761d97f3b70b94fa27f4720757a1ea60863d..2a2e09f40cbe800e7cd7fb654d059f88b1ff3113 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -177,10 +177,27 @@ static int trx_usrp_write(openair0_device *device, openair0_timestamp timestamp, s->tx_md.time_spec = uhd::time_spec_t::from_ticks(timestamp, s->sample_rate); - if(flags) + if(flags>0) s->tx_md.has_time_spec = true; else s->tx_md.has_time_spec = false; + + if (flags == 2) { // start of burst + s->tx_md.start_of_burst = true; + s->tx_md.end_of_burst = false; + } + else if (flags == 3) { // end of burst + s->tx_md.start_of_burst = false; + s->tx_md.end_of_burst = true; + } + else if (flags == 4) { // start and end + s->tx_md.start_of_burst = true; + s->tx_md.end_of_burst = true; + } + else if (flags==1) { // middle of burst + s->tx_md.start_of_burst = false; + s->tx_md.end_of_burst = false; + } if (cc>1) { std::vector<void *> buff_ptrs; @@ -190,7 +207,7 @@ static int trx_usrp_write(openair0_device *device, openair0_timestamp timestamp, else ret = (int)s->tx_stream->send(buff[0], nsamps, s->tx_md,1e-3); - s->tx_md.start_of_burst = false; + if (ret != nsamps) { printf("[xmit] tx samples %d != %d\n",ret,nsamps); @@ -352,19 +369,34 @@ static bool is_equal(double a, double b) return std::fabs(a-b) < std::numeric_limits<double>::epsilon(); } -/*! \brief Set frequencies (TX/RX) +void *freq_thread(void *arg) { + + openair0_device *device=(openair0_device *)arg; + usrp_state_t *s = (usrp_state_t*)device->priv; + + s->usrp->set_tx_freq(device->openair0_cfg[0].tx_freq[0]); + s->usrp->set_rx_freq(device->openair0_cfg[0].rx_freq[0]); +} +/*! \brief Set frequencies (TX/RX). Spawns a thread to handle the frequency change to not block the calling thread * \param device the hardware to use * \param openair0_cfg RF frontend parameters set by application * \param dummy dummy variable not used * \returns 0 in success */ -int trx_usrp_set_freq(openair0_device* device, openair0_config_t *openair0_cfg, int dummy) { +int trx_usrp_set_freq(openair0_device* device, openair0_config_t *openair0_cfg, int dont_block) { usrp_state_t *s = (usrp_state_t*)device->priv; + pthread_t f_thread; printf("Setting USRP TX Freq %f, RX Freq %f\n",openair0_cfg[0].tx_freq[0],openair0_cfg[0].rx_freq[0]); - s->usrp->set_tx_freq(openair0_cfg[0].tx_freq[0]); - s->usrp->set_rx_freq(openair0_cfg[0].rx_freq[0]); + + // spawn a thread to handle the frequency change to not block the calling thread + if (dont_block == 1) + pthread_create(&f_thread,NULL,freq_thread,(void*)device); + else { + s->usrp->set_tx_freq(device->openair0_cfg[0].tx_freq[0]); + s->usrp->set_rx_freq(device->openair0_cfg[0].rx_freq[0]); + } return(0); @@ -579,7 +611,10 @@ extern "C" { // s->usrp->set_tx_subdev_spec(tx_subdev); // lock mboard clocks - s->usrp->set_clock_source("internal"); + if (openair0_cfg[0].clock_source == internal) + s->usrp->set_clock_source("internal"); + else + s->usrp->set_clock_source("external"); //Setting device type to USRP X300/X310 device->type=USRP_X300_DEV; @@ -635,6 +670,12 @@ extern "C" { // s->usrp->set_clock_source("internal"); // set master clock rate and sample rate for tx & rx for streaming + // lock mboard clocks + if (openair0_cfg[0].clock_source == internal) + s->usrp->set_clock_source("internal"); + else + s->usrp->set_clock_source("external"); + device->type = USRP_B200_DEV; @@ -735,7 +776,10 @@ extern "C" { // create tx & rx streamer uhd::stream_args_t stream_args_rx("sc16", "sc16"); - //stream_args_rx.args["spp"] = str(boost::format("%d") % 2048);//(openair0_cfg[0].rx_num_channels*openair0_cfg[0].samples_per_packet)); + int samples=openair0_cfg[0].sample_rate; + samples/=24000; + // stream_args_rx.args["spp"] = str(boost::format("%d") % samples); + for (i = 0; i<openair0_cfg[0].rx_num_channels; i++) stream_args_rx.channels.push_back(i); s->rx_stream = s->usrp->get_rx_stream(stream_args_rx); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.usrpb210.conf index 83f8af699e940b71861641babb4f1b5d661421c4..d6970e8e44fae45f512aa4afd5c78603347c55df 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.usrpb210.conf @@ -17,12 +17,15 @@ eNBs = mobile_country_code = "208"; - mobile_network_code = "95"; + mobile_network_code = "93"; ////////// Physical parameters: component_carriers = ( { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; @@ -34,6 +37,7 @@ eNBs = N_RB_DL = 50; Nid_cell_mbsfn = 0; nb_antennas_tx = 1; + nb_antenna_ports = 1; nb_antennas_rx = 1; tx_gain = 90; rx_gain = 110; @@ -46,7 +50,7 @@ eNBs = pucch_nRB_CQI = 1; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -15; + pdsch_referenceSignalPower = -23; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; @@ -64,9 +68,9 @@ eNBs = srs_ackNackST =; srs_MaxUpPts =;*/ - pusch_p0_Nominal = -90; + pusch_p0_Nominal = -96; pusch_alpha = "AL1"; - pucch_p0_Nominal = -96; + pucch_p0_Nominal = -104; msg3_delta_Preamble = 6; pucch_deltaF_Format1 = "deltaF2"; pucch_deltaF_Format1b = "deltaF3"; @@ -98,6 +102,7 @@ eNBs = ue_TimersAndConstants_n310 = 20; ue_TimersAndConstants_n311 = 1; + ue_TransmissionMode = 1; } ); @@ -133,7 +138,7 @@ eNBs = ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.170"; + mme_ip_address = ( { ipv4 = "127.0.0.3"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; @@ -142,11 +147,11 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.241/24"; + ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24"; - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.241/24"; + ENB_INTERFACE_NAME_FOR_S1U = "lo"; + ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.5/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band39.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band39.tm1.usrpb210.conf index 8caeca0edb909ceedf998e43b12008ccb47ce957..dba8eb7ddd43006f958d394b84ec28cc2b49318c 100755 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band39.tm1.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band39.tm1.usrpb210.conf @@ -19,19 +19,13 @@ eNBs = mobile_network_code = "92"; - ////////// Channel parameters: - // Default Paging DRX of the eNB as defined in TS 36.304 - default_paging_drx = "PAGING_DRX_256"; - - ////////// Physical parameters: - frame_type = "TDD"; - prefix_type = "NORMAL"; - eutra_band = 39; - downlink_frequency = 1910000000L; - uplink_frequency_offset = 0; + ////////// Physical parameters: component_carriers = ( { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; frame_type = "TDD"; tdd_config = 3; tdd_config_s = 0; @@ -43,15 +37,16 @@ eNBs = Nid_cell = 0; N_RB_DL = 25; Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; nb_antennas_tx = 1; nb_antennas_rx = 1; tx_gain = 90; - rx_gain = 120; - prach_root = 22; - prach_config_index = 3; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; prach_high_speed = "DISABLE"; - prach_zero_correlation = 0; - prach_freq_offset = 0; + prach_zero_correlation = 1; + prach_freq_offset = 2; pucch_delta_shift = 1; pucch_nRB_CQI = 1; pucch_nCS_AN = 0; @@ -61,7 +56,7 @@ eNBs = pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 4; + pusch_hoppingOffset = 0; pusch_groupHoppingEnabled = "DISABLE"; pusch_groupAssignment = 0; pusch_sequenceHoppingEnabled = "DISABLE"; @@ -74,9 +69,9 @@ eNBs = srs_ackNackST =; srs_MaxUpPts =;*/ - pusch_p0_Nominal = -95; - pusch_alpha = "AL08"; - pucch_p0_Nominal = -108; + pusch_p0_Nominal = -96; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -103; msg3_delta_Preamble = 6; pucch_deltaF_Format1 = "deltaF2"; pucch_deltaF_Format1b = "deltaF3"; @@ -84,16 +79,16 @@ eNBs = pucch_deltaF_Format2a = "deltaF0"; pucch_deltaF_Format2b = "deltaF0"; - rach_numberOfRA_Preambles = 52; + rach_numberOfRA_Preambles = 64; rach_preamblesGroupAConfig = "DISABLE"; /* rach_sizeOfRA_PreamblesGroupA = ; rach_messageSizeGroupA = ; rach_messagePowerOffsetGroupB = ; */ - rach_powerRampingStep = 2; + rach_powerRampingStep = 4; rach_preambleInitialReceivedTargetPower = -104; - rach_preambleTransMax = 6; + rach_preambleTransMax = 10; rach_raResponseWindowSize = 10; rach_macContentionResolutionTimer = 48; rach_maxHARQ_Msg3Tx = 4; @@ -107,6 +102,8 @@ eNBs = ue_TimersAndConstants_t311 = 10000; ue_TimersAndConstants_n310 = 20; ue_TimersAndConstants_n311 = 1; + + ue_TransmissionMode = 1; } ); @@ -161,12 +158,12 @@ eNBs = log_config : { - global_log_level ="debug"; - global_log_verbosity ="high"; + global_log_level ="info"; + global_log_verbosity ="medium"; hw_log_level ="info"; hw_log_verbosity ="medium"; - phy_log_level ="debug"; - phy_log_verbosity ="high"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; mac_log_level ="info"; mac_log_verbosity ="high"; rlc_log_level ="info"; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band4.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band4.tm1.usrpb210.conf index 853db14393ea2a084eb42866cdb26beb13ac9e14..4004b5faec9cd61103d88b88f5e905be860fdef4 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band4.tm1.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band4.tm1.usrpb210.conf @@ -17,12 +17,15 @@ eNBs = mobile_country_code = "208"; - mobile_network_code = "93"; + mobile_network_code = "92"; ////////// Physical parameters: component_carriers = ( { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; @@ -35,6 +38,7 @@ eNBs = Nid_cell_mbsfn = 0; nb_antennas_tx = 1; nb_antennas_rx = 1; + nb_antenna_ports = 1; tx_gain = 90; rx_gain = 128; prach_root = 0; @@ -97,6 +101,8 @@ eNBs = ue_TimersAndConstants_t311 = 10000; ue_TimersAndConstants_n310 = 20; ue_TimersAndConstants_n311 = 1; + + ue_TransmissionMode = 1; } ); @@ -131,7 +137,7 @@ eNBs = }; ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.11"; + mme_ip_address = ( { ipv4 = "192.168.12.70"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; @@ -141,10 +147,10 @@ eNBs = NETWORK_INTERFACES : { ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.150/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.150/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band40.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band40.tm1.usrpb210.conf new file mode 100644 index 0000000000000000000000000000000000000000..6549df89751d676f7e1ba44d792e775567055506 --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band40.tm1.usrpb210.conf @@ -0,0 +1,175 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "94"; + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "TDD"; + tdd_config = 1; + tdd_config_s = 5; + prefix_type = "NORMAL"; + eutra_band = 40; + downlink_frequency = 2350000000L; + uplink_frequency_offset = 0; + Nid_cell = 0; + N_RB_DL = 25; + Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -24; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -96; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -103; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -104; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + ue_TransmissionMode = 1; + } + ); + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + ////////// MME parameters: + + mme_ip_address = ( { ipv4 = "127.0.0.3"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24"; + ENB_INTERFACE_NAME_FOR_S1U = "lo"; + ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.4/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + } +); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf index f4ed76a21e178ef824c0211f1d0d1003e46b490d..c974345888ead5524830608fd7f5d7b30b1e5833 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf @@ -31,7 +31,7 @@ eNBs = tdd_config_s = 0; prefix_type = "NORMAL"; eutra_band = 7; - downlink_frequency = 2660000000L; + downlink_frequency = 2680000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; N_RB_DL = 100; @@ -70,7 +70,7 @@ eNBs = pusch_p0_Nominal = -96; pusch_alpha = "AL1"; - pucch_p0_Nominal = -100; + pucch_p0_Nominal = -104; msg3_delta_Preamble = 6; pucch_deltaF_Format1 = "deltaF2"; pucch_deltaF_Format1b = "deltaF3"; @@ -149,7 +149,7 @@ eNBs = ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24"; ENB_INTERFACE_NAME_FOR_S1U = "lo"; - ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.4/24"; + ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.5/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.lmssdr.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.lmssdr.conf index dae0187f18732e178551ff69747a772f8c145e33..e12acef70340404256fb63ee2538fc7a1f97b130 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.lmssdr.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.lmssdr.conf @@ -7,122 +7,126 @@ eNBs = { ////////// Identification parameters: eNB_ID = 0xe00; - + cell_type = "CELL_MACRO_ENB"; - + eNB_name = "eNB_Eurecom_LTEBox"; - + // Tracking area code, 0x0000 and 0xfffe are reserved values tracking_area_code = "1"; - + mobile_country_code = "208"; - - mobile_network_code = "95"; - + + mobile_network_code = "93"; + ////////// Physical parameters: - + component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2660000000L; - uplink_frequency_offset = -120000000; - Nid_cell = 0; - N_RB_DL = 50; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 60; - rx_gain = 111; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -29; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 1; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -85; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -96; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; -/* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; -*/ - rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -100; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - - } - ); + { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2680000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 50; + Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 100; + rx_gain = 111; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -30; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -96; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -104; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -104; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + ue_TransmissionMode = 1; + } + ); srb1_parameters : { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] timer_poll_retransmit = 80; - + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] timer_reordering = 35; - + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] timer_status_prohibit = 0; - + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] poll_pdu = 4; - + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] poll_byte = 99999; - + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] max_retx_threshold = 4; } - + # ------- SCTP definitions SCTP : { @@ -130,42 +134,41 @@ eNBs = SCTP_INSTREAMS = 2; SCTP_OUTSTREAMS = 2; }; - + ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.62"; + mme_ip_address = ( { ipv4 = "127.0.0.3"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; } ); - NETWORK_INTERFACES : + NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth4"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.242/24"; + ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24"; - ENB_INTERFACE_NAME_FOR_S1U = "eth4"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.242/24"; + ENB_INTERFACE_NAME_FOR_S1U = "lo"; + ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.5/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; - - log_config : + + log_config : { - global_log_level ="info"; - global_log_verbosity ="medium"; - hw_log_level ="info"; - hw_log_verbosity ="medium"; - phy_log_level ="info"; - phy_log_verbosity ="medium"; - mac_log_level ="info"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="info"; - rrc_log_verbosity ="medium"; - }; - + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf index c3c88323aac7f1268b27a3835b3e45e6bc29fe85..3cf1e7d15b48efdc4c4bd90085eb756b2625ba4a 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf @@ -31,7 +31,7 @@ eNBs = tdd_config_s = 0; prefix_type = "NORMAL"; eutra_band = 7; - downlink_frequency = 2660000000L; + downlink_frequency = 2685000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; N_RB_DL = 50; @@ -40,7 +40,7 @@ eNBs = nb_antennas_tx = 1; nb_antennas_rx = 1; tx_gain = 90; - rx_gain = 125; + rx_gain = 120; prach_root = 0; prach_config_index = 0; prach_high_speed = "DISABLE"; @@ -70,7 +70,7 @@ eNBs = pusch_p0_Nominal = -96; pusch_alpha = "AL1"; - pucch_p0_Nominal = -100; + pucch_p0_Nominal = -104; msg3_delta_Preamble = 6; pucch_deltaF_Format1 = "deltaF2"; pucch_deltaF_Format1b = "deltaF3"; @@ -149,7 +149,7 @@ eNBs = ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24"; ENB_INTERFACE_NAME_FOR_S1U = "lo"; - ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.4/24"; + ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.5/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf index b0ef9e037418c5aa6a4ad13751d51b10f23655e2..d912b1a10213a42d9332a00199e4c3c3a88df14b 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf @@ -39,7 +39,7 @@ eNBs = nb_antennas_ports = 1; nb_antennas_tx = 1; nb_antennas_rx = 1; - tx_gain = 60; + tx_gain = 100; rx_gain = 111; prach_root = 0; prach_config_index = 0; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if4p5-ercom.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if4p5-ercom.conf index 9ce8fac59fdc740aace0286b6f2f139a0009e06b..1afa860c16366d7d46632f5b6424902061bfcbb3 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if4p5-ercom.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if4p5-ercom.conf @@ -17,7 +17,7 @@ eNBs = mobile_country_code = "208"; - mobile_network_code = "93"; + mobile_network_code = "92"; ////////// Physical parameters: @@ -129,7 +129,7 @@ eNBs = prach_root = 0; prach_config_index = 0; prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; + prach_zero_correlation = 3; prach_freq_offset = 2; pucch_delta_shift = 1; pucch_nRB_CQI = 1; @@ -265,7 +265,7 @@ eNBs = rrh_gw_active = "yes"; tr_preference = "raw_if5_mobipass"; rf_preference = "usrp_b200"; - iq_txshift = 4; + iq_txshift = 0; tx_sample_advance = 80; tx_scheduling_advance = 9; } diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.100PRB.if4p5.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.100PRB.conf similarity index 96% rename from targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.100PRB.if4p5.conf rename to targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.100PRB.conf index d97dc0c00210342fced2e5cae007dcbda0412e30..e52a36542fc005d63bf8ccfa91724d895f476172 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.100PRB.if4p5.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.100PRB.conf @@ -31,11 +31,12 @@ eNBs = tdd_config_s = 0; prefix_type = "NORMAL"; eutra_band = 7; - downlink_frequency = 2660000000L; + downlink_frequency = 2680000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; N_RB_DL = 100; Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; nb_antennas_tx = 1; nb_antennas_rx = 1; tx_gain = 90; @@ -100,7 +101,7 @@ eNBs = ue_TimersAndConstants_t311 = 10000; ue_TimersAndConstants_n310 = 20; ue_TimersAndConstants_n311 = 1; - + ue_TransmissionMode = 1; } ); @@ -156,12 +157,12 @@ eNBs = rrh_gw_config = ( { local_if_name = "eth0"; - remote_address = "74:d4:35:cc:8d:15"; - local_address = "34:e6:d7:3c:ae:fc"; + remote_address = "10.10.10.60"; + local_address = "10.10.10.215"; local_port = 50000; #for raw option local port must be the same to remote remote_port = 50000; rrh_gw_active = "yes"; - tr_preference = "raw_if4p5"; + tr_preference = "udp_if4p5"; rf_preference = "usrp_b200"; iq_txshift = 4; tx_sample_advance = 80; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.25PRB.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.25PRB.conf index e8ffde20b627961259c9e188a677a414864dce19..f9ebec3ab53561789e5cbf9b81130c0cf7640c38 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.25PRB.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.25PRB.conf @@ -31,11 +31,12 @@ eNBs = tdd_config_s = 0; prefix_type = "NORMAL"; eutra_band = 7; - downlink_frequency = 2660000000L; + downlink_frequency = 2685000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; N_RB_DL = 25; Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; nb_antennas_tx = 1; nb_antennas_rx = 1; tx_gain = 90; @@ -67,9 +68,9 @@ eNBs = srs_ackNackST =; srs_MaxUpPts =;*/ - pusch_p0_Nominal = -90; + pusch_p0_Nominal = -96; pusch_alpha = "AL1"; - pucch_p0_Nominal = -96; + pucch_p0_Nominal = -104; msg3_delta_Preamble = 6; pucch_deltaF_Format1 = "deltaF2"; pucch_deltaF_Format1b = "deltaF3"; @@ -100,7 +101,7 @@ eNBs = ue_TimersAndConstants_t311 = 10000; ue_TimersAndConstants_n310 = 20; ue_TimersAndConstants_n311 = 1; - + ue_TransmissionMode = 1; } ); @@ -149,19 +150,19 @@ eNBs = ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24"; ENB_INTERFACE_NAME_FOR_S1U = "lo"; - ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.4/24"; + ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.5/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; rrh_gw_config = ( { local_if_name = "eth0"; - remote_address = "74:d4:35:cc:8d:15"; - local_address = "34:e6:d7:3c:ae:fc"; + remote_address = "10.10.10.60"; + local_address = "10.10.10.215"; local_port = 50000; #for raw option local port must be the same to remote remote_port = 50000; rrh_gw_active = "yes"; - tr_preference = "raw_if4p5"; + tr_preference = "udp_if4p5"; rf_preference = "usrp_b200"; iq_txshift = 4; tx_sample_advance = 80; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if4p5.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.conf similarity index 93% rename from targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if4p5.conf rename to targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.conf index b264993dd42eac40ba811c260f103484d2778394..4ad5767ce9a8343a5c117b8bcf1001636b4b12dc 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if4p5.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.conf @@ -31,11 +31,12 @@ eNBs = tdd_config_s = 0; prefix_type = "NORMAL"; eutra_band = 7; - downlink_frequency = 2660000000L; + downlink_frequency = 2685000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; N_RB_DL = 50; Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; nb_antennas_tx = 1; nb_antennas_rx = 1; tx_gain = 90; @@ -49,7 +50,7 @@ eNBs = pucch_nRB_CQI = 1; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -29; + pdsch_referenceSignalPower = -27; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; @@ -67,9 +68,9 @@ eNBs = srs_ackNackST =; srs_MaxUpPts =;*/ - pusch_p0_Nominal = -90; + pusch_p0_Nominal = -96; pusch_alpha = "AL1"; - pucch_p0_Nominal = -96; + pucch_p0_Nominal = -104; msg3_delta_Preamble = 6; pucch_deltaF_Format1 = "deltaF2"; pucch_deltaF_Format1b = "deltaF3"; @@ -100,6 +101,7 @@ eNBs = ue_TimersAndConstants_t311 = 10000; ue_TimersAndConstants_n310 = 20; ue_TimersAndConstants_n311 = 1; + ue_TransmissionMode = 1; } ); @@ -149,19 +151,19 @@ eNBs = ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24"; ENB_INTERFACE_NAME_FOR_S1U = "lo"; - ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.4/24"; + ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.5/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; rrh_gw_config = ( { local_if_name = "eth0"; - remote_address = "74:d4:35:cc:8d:15"; - local_address = "34:e6:d7:3c:ae:fc"; + remote_address = "10.10.10.60"; + local_address = "10.10.10.215"; local_port = 50000; #for raw option local port must be the same to remote remote_port = 50000; rrh_gw_active = "yes"; - tr_preference = "raw_if4p5"; + tr_preference = "udp_if4p5"; rf_preference = "usrp_b200"; iq_txshift = 4; tx_sample_advance = 80; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if5.25PRB.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if5.25PRB.conf new file mode 100644 index 0000000000000000000000000000000000000000..7541fa1ee14abc9beab14d1bec662397867b191e --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if5.25PRB.conf @@ -0,0 +1,191 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "93"; + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "eNodeB_3GPP_BBU"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2685000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 25; + Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -96; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -104; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -104; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + ue_TransmissionMode = 1; + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "127.0.0.3"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24"; + ENB_INTERFACE_NAME_FOR_S1U = "lo"; + ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.5/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + rrh_gw_config = ( + { + local_if_name = "eth0"; + remote_address = "10.10.10.60"; + local_address = "10.10.10.215"; + local_port = 50000; #for raw option local port must be the same to remote + remote_port = 50000; + rrh_gw_active = "yes"; + tr_preference = "udp"; + rf_preference = "usrp_b200"; + iq_txshift = 4; + tx_sample_advance = 80; + tx_scheduling_advance = 9; + } + ); + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + } +); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if5.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if5.50PRB.conf similarity index 96% rename from targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if5.usrpb210.conf rename to targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if5.50PRB.conf index 4929f39b3bc52f73674e552b594bbd96bb36d46f..1044726c265738f2081f05e00923c469479cfde2 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if5.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if5.50PRB.conf @@ -36,6 +36,7 @@ eNBs = Nid_cell = 0; N_RB_DL = 50; Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; nb_antennas_tx = 1; nb_antennas_rx = 1; tx_gain = 90; @@ -100,6 +101,10 @@ eNBs = ue_TimersAndConstants_t311 = 10000; ue_TimersAndConstants_n310 = 20; ue_TimersAndConstants_n311 = 1; + ue_TransmissionMode = 1; + + + } ); @@ -155,13 +160,13 @@ eNBs = rrh_gw_config = ( { - local_if_name = "eth0"; - remote_address = "74:d4:35:cc:8d:15"; - local_address = "34:e6:d7:3c:ae:fc"; + local_if_name = "eth2"; + remote_address = "10.10.10.60"; + local_address = "10.10.10.215"; local_port = 50000; #for raw option local port must be the same to remote remote_port = 50000; rrh_gw_active = "yes"; - tr_preference = "raw_if5"; + tr_preference = "udp"; rf_preference = "usrp_b200"; iq_txshift = 4; tx_sample_advance = 80; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.50PRB.if5.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.50PRB.if5.usrpb210.conf index 902420ae08be1d0736c9ca02dc3b5c328d6960a7..6c309df4db831ceca7394635cf30a28f4442e416 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.50PRB.if5.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.50PRB.if5.usrpb210.conf @@ -155,9 +155,9 @@ eNBs = rrh_gw_config = ( { - local_if_name = "eth0"; - remote_address = "34:e6:d7:3c:ae:fc"; - local_address = "74:d4:35:cc:8d:15"; + local_if_name = "eth0"; + remote_address = "90:e2:ba:c5:fc:04"; + local_address = "00:13:95:1f:a0:af"; local_port = 50000; #for raw option local port must be the same to remote remote_port = 50000; rrh_gw_active = "yes"; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.100PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.100PRB.usrpb210.conf index b1c4298104181a08db7f262f0ce51a3ee4417f18..aa731c8d8a23ee2e269682c3ccf3f2fc522b31e3 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.100PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.100PRB.usrpb210.conf @@ -31,15 +31,16 @@ eNBs = tdd_config_s = 0; prefix_type = "NORMAL"; eutra_band = 7; - downlink_frequency = 2660000000L; + downlink_frequency = 2680000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; N_RB_DL = 100; Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; nb_antennas_tx = 1; nb_antennas_rx = 1; - tx_gain = 90; - rx_gain = 125; + tx_gain = 90; + rx_gain = 120; prach_root = 0; prach_config_index = 0; prach_high_speed = "DISABLE"; @@ -67,9 +68,9 @@ eNBs = srs_ackNackST =; srs_MaxUpPts =;*/ - pusch_p0_Nominal = -90; + pusch_p0_Nominal = -95; pusch_alpha = "AL1"; - pucch_p0_Nominal = -96; + pucch_p0_Nominal = -104; msg3_delta_Preamble = 6; pucch_deltaF_Format1 = "deltaF2"; pucch_deltaF_Format1b = "deltaF3"; @@ -85,7 +86,7 @@ eNBs = rach_messagePowerOffsetGroupB = ; */ rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -108; + rach_preambleInitialReceivedTargetPower = -104; rach_preambleTransMax = 10; rach_raResponseWindowSize = 10; rach_macContentionResolutionTimer = 48; @@ -101,6 +102,8 @@ eNBs = ue_TimersAndConstants_n310 = 20; ue_TimersAndConstants_n311 = 1; + ue_TransmissionMode = 1; + } ); @@ -156,12 +159,12 @@ eNBs = rrh_gw_config = ( { local_if_name = "eth0"; - remote_address = "34:e6:d7:3c:ae:fc"; - local_address = "74:d4:35:cc:8d:15"; + remote_address = "10.10.10.215"; + local_address = "10.10.10.60"; local_port = 50000; #for raw option local port must be the same to remote remote_port = 50000; rrh_gw_active = "yes"; - tr_preference = "raw_if4p5"; + tr_preference = "udp_if4p5"; rf_preference = "usrp_b200"; iq_txshift = 4; tx_sample_advance = 80; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.25PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.25PRB.usrpb210.conf new file mode 100644 index 0000000000000000000000000000000000000000..c97b215c77bc10e3a4305a2c33c3f02c49f99d2f --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.25PRB.usrpb210.conf @@ -0,0 +1,193 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "93"; + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "NGFI_RRU_IF4p5"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2685000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 25; + Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 120; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -95; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -104; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -104; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + ue_TransmissionMode = 1; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.11"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + ENB_INTERFACE_NAME_FOR_S1_MME = "eth3"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; + ENB_INTERFACE_NAME_FOR_S1U = "eth3"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + rrh_gw_config = ( + { + local_if_name = "eth0"; + remote_address = "10.10.10.155"; + local_address = "10.10.10.60"; + local_port = 50000; #for raw option local port must be the same to remote + remote_port = 50000; + rrh_gw_active = "yes"; + tr_preference = "udp_if4p5"; + rf_preference = "usrp_b200"; + iq_txshift = 4; + tx_sample_advance = 80; + tx_scheduling_advance = 9; + } + ); + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + } +); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.50PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.50PRB.usrpb210.conf index 831010a89a35b42bb594b031620b8cc596cf524d..d40b9017856958d26ed6d9a408ec059a0b7fa778 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.50PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.50PRB.usrpb210.conf @@ -31,15 +31,16 @@ eNBs = tdd_config_s = 0; prefix_type = "NORMAL"; eutra_band = 7; - downlink_frequency = 2660000000L; + downlink_frequency = 2685000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; N_RB_DL = 50; Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; nb_antennas_tx = 1; nb_antennas_rx = 1; tx_gain = 90; - rx_gain = 125; + rx_gain = 120; prach_root = 0; prach_config_index = 0; prach_high_speed = "DISABLE"; @@ -67,9 +68,9 @@ eNBs = srs_ackNackST =; srs_MaxUpPts =;*/ - pusch_p0_Nominal = -90; + pusch_p0_Nominal = -95; pusch_alpha = "AL1"; - pucch_p0_Nominal = -96; + pucch_p0_Nominal = -104; msg3_delta_Preamble = 6; pucch_deltaF_Format1 = "deltaF2"; pucch_deltaF_Format1b = "deltaF3"; @@ -85,7 +86,7 @@ eNBs = rach_messagePowerOffsetGroupB = ; */ rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -108; + rach_preambleInitialReceivedTargetPower = -104; rach_preambleTransMax = 10; rach_raResponseWindowSize = 10; rach_macContentionResolutionTimer = 48; @@ -101,6 +102,8 @@ eNBs = ue_TimersAndConstants_n310 = 20; ue_TimersAndConstants_n311 = 1; + ue_TransmissionMode = 1; + } ); @@ -156,12 +159,12 @@ eNBs = rrh_gw_config = ( { local_if_name = "eth0"; - remote_address = "34:e6:d7:3c:ae:fc"; - local_address = "74:d4:35:cc:8d:15"; + remote_address = "10.10.10.215"; + local_address = "10.10.10.60"; local_port = 50000; #for raw option local port must be the same to remote remote_port = 50000; rrh_gw_active = "yes"; - tr_preference = "raw_if4p5"; + tr_preference = "udp_if4p5"; rf_preference = "usrp_b200"; iq_txshift = 4; tx_sample_advance = 80; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if5.25PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if5.25PRB.usrpb210.conf new file mode 100644 index 0000000000000000000000000000000000000000..71e435e2f41a34c16655417eb3444d9c6f038f6a --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if5.25PRB.usrpb210.conf @@ -0,0 +1,193 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "93"; + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "NGFI_RRU_IF5"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2685000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 25; + Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 120; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -95; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -104; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -104; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + ue_TransmissionMode = 1; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.11"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + ENB_INTERFACE_NAME_FOR_S1_MME = "eth3"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; + ENB_INTERFACE_NAME_FOR_S1U = "eth3"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + rrh_gw_config = ( + { + local_if_name = "eth0"; + remote_address = "10.10.10.155"; + local_address = "10.10.10.60"; + local_port = 50000; #for raw option local port must be the same to remote + remote_port = 50000; + rrh_gw_active = "yes"; + tr_preference = "udp"; + rf_preference = "usrp_b200"; + iq_txshift = 4; + tx_sample_advance = 80; + tx_scheduling_advance = 9; + } + ); + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + } +); diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index eebfb2da093e4e4d3c6b889a2aea3abaf849e4bc..0605dff2ab5607123d9dc5f73b0c1c6ec47ecd36 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -128,7 +128,7 @@ extern pthread_cond_t sync_cond; extern pthread_mutex_t sync_mutex; extern int sync_var; -extern transmission_mode; +extern int transmission_mode; //pthread_t main_eNB_thread; @@ -157,7 +157,7 @@ extern double cpuf; void exit_fun(const char* s); -void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst,eth_params_t *,int); +void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst,eth_params_t *,int,int); void stop_eNB(int nb_inst); @@ -279,6 +279,7 @@ static inline void wait_sync(char *thread_name) { void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) { + int CC_id = phy_vars_eNB->proc.CC_id; unsigned int aa,slot_offset; //int dummy_tx_b[7680*4] __attribute__((aligned(32))); int i, tx_offset; @@ -288,7 +289,6 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) slot_offset = subframe*phy_vars_eNB->frame_parms.samples_per_tti; - if ((subframe_select(&phy_vars_eNB->frame_parms,subframe)==SF_DL)|| ((subframe_select(&phy_vars_eNB->frame_parms,subframe)==SF_S))) { // LOG_D(HW,"Frame %d: Generating slot %d\n",frame,next_slot); @@ -296,16 +296,18 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_OFDM_MODULATION,1); do_OFDM_mod_symbol(&phy_vars_eNB->common_vars, - 0, - subframe<<1, - &phy_vars_eNB->frame_parms); + 0, + subframe<<1, + &phy_vars_eNB->frame_parms, + phy_vars_eNB->do_precoding); // if S-subframe generate first slot only if (subframe_select(&phy_vars_eNB->frame_parms,subframe) == SF_DL) { do_OFDM_mod_symbol(&phy_vars_eNB->common_vars, - 0, - 1+(subframe<<1), - &phy_vars_eNB->frame_parms); + 0, + 1+(subframe<<1), + &phy_vars_eNB->frame_parms, + phy_vars_eNB->do_precoding); } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_OFDM_MODULATION,0); @@ -368,9 +370,9 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) ((short*)&phy_vars_eNB->common_vars.txdata[0][aa][tx_offset])[1] = ((short*)dummy_tx_b)[2*i+1]<<openair0_cfg[0].iq_txshift; */ - ((short*)&phy_vars_eNB->common_vars.txdata[0][aa][tx_offset])[0] = ((short*)&phy_vars_eNB->common_vars.txdata[0][aa][tx_offset])[0]<<openair0_cfg[0].iq_txshift; + ((short*)&phy_vars_eNB->common_vars.txdata[0][aa][tx_offset])[0] = ((short*)&phy_vars_eNB->common_vars.txdata[0][aa][tx_offset])[0]<<openair0_cfg[CC_id].iq_txshift; - ((short*)&phy_vars_eNB->common_vars.txdata[0][aa][tx_offset])[1] = ((short*)&phy_vars_eNB->common_vars.txdata[0][aa][tx_offset])[1]<<openair0_cfg[0].iq_txshift; + ((short*)&phy_vars_eNB->common_vars.txdata[0][aa][tx_offset])[1] = ((short*)&phy_vars_eNB->common_vars.txdata[0][aa][tx_offset])[1]<<openair0_cfg[CC_id].iq_txshift; } // if S-subframe switch to RX in second subframe if (subframe_select(&phy_vars_eNB->frame_parms,subframe) == SF_S) { @@ -404,16 +406,25 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) void tx_fh_if5(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) { VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, proc->timestamp_tx&0xffffffff ); - send_IF5(eNB, proc->timestamp_tx, proc->subframe_tx, &seqno, IF5_RRH_GW_DL); + if ((eNB->frame_parms.frame_type==FDD) || + ((eNB->frame_parms.frame_type==TDD) && + (subframe_select(&eNB->frame_parms,proc->subframe_tx) != SF_UL))) + send_IF5(eNB, proc->timestamp_tx, proc->subframe_tx, &seqno, IF5_RRH_GW_DL); } void tx_fh_if5_mobipass(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) { VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, proc->timestamp_tx&0xffffffff ); - send_IF5(eNB, proc->timestamp_tx, proc->subframe_tx, &seqno, IF5_MOBIPASS); + if ((eNB->frame_parms.frame_type==FDD) || + ((eNB->frame_parms.frame_type==TDD) && + (subframe_select(&eNB->frame_parms,proc->subframe_tx) != SF_UL))) + send_IF5(eNB, proc->timestamp_tx, proc->subframe_tx, &seqno, IF5_MOBIPASS); } -void tx_fh_if4p5(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) { - send_IF4p5(eNB,proc->frame_tx, proc->subframe_tx, IF4p5_PDLFFT, 0); +void tx_fh_if4p5(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) { + if ((eNB->frame_parms.frame_type==FDD) || + ((eNB->frame_parms.frame_type==TDD) && + (subframe_select(&eNB->frame_parms,proc->subframe_tx) != SF_UL))) + send_IF4p5(eNB,proc->frame_tx,proc->subframe_tx, IF4p5_PDLFFT, 0); } void proc_tx_high0(PHY_VARS_eNB *eNB, @@ -551,9 +562,12 @@ static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_nam start_meas(&softmodem_stats_rxtx_sf); -// **************************************** + // **************************************** // Common RX procedures subframe n - phy_procedures_eNB_common_RX(eNB); + + if ((eNB->do_prach)&&((eNB->node_function != NGFI_RCC_IF4p5))) + eNB->do_prach(eNB,proc->frame_rx,proc->subframe_rx); + phy_procedures_eNB_common_RX(eNB,proc); // UE-specific RX processing for subframe n if (eNB->proc_uespec_rx) eNB->proc_uespec_rx(eNB, proc, no_relay ); @@ -609,7 +623,8 @@ static void* eNB_thread_rxtx( void* param ) { if (oai_exit) break; - if (rxtx(eNB,proc,thread_name) < 0) break; + if (eNB->CC_id==0) + if (rxtx(eNB,proc,thread_name) < 0) break; } // while !oai_exit @@ -641,32 +656,43 @@ static void wait_system_ready (char *message, volatile int *start_flag) { #endif -// asynchronous UL with IF4p5 (RCC,RAU,eNodeB_BBU) +// asynchronous UL with IF5 (RCC,RAU,eNodeB_BBU) void fh_if5_asynch_UL(PHY_VARS_eNB *eNB,int *frame,int *subframe) { eNB_proc_t *proc = &eNB->proc; LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; - recv_IF5(eNB, &proc->timestamp_rx, *subframe, IF5_RRH_GW_UL); - - proc->subframe_rx = (proc->timestamp_rx/fp->samples_per_tti)%10; - proc->frame_rx = (proc->timestamp_rx/(10*fp->samples_per_tti))&1023; + recv_IF5(eNB, &proc->timestamp_rx, *subframe, IF5_MOBIPASS); - if (proc->first_rx != 0) { - proc->first_rx = 0; + int offset_mobipass = 40120; + pthread_mutex_lock(&proc->mutex_asynch_rxtx); + proc->subframe_rx = ((proc->timestamp_rx-offset_mobipass)/fp->samples_per_tti)%10; + proc->frame_rx = ((proc->timestamp_rx-offset_mobipass)/(fp->samples_per_tti*10))&1023; + + if (proc->first_rx == 1) { + proc->first_rx =2; *subframe = proc->subframe_rx; *frame = proc->frame_rx; + LOG_E(PHY,"[Mobipass]timestamp_rx:%llu, frame_rx %d, subframe: %d\n",proc->timestamp_rx,proc->frame_rx,proc->subframe_rx); } else { if (proc->subframe_rx != *subframe) { - LOG_E(PHY,"subframe_rx %d is not what we expect %d\n",proc->subframe_rx,*subframe); - exit_fun("Exiting"); + proc->first_rx++; + LOG_E(PHY,"[Mobipass]timestamp:%llu, subframe_rx %d is not what we expect %d, first_rx:%d\n",proc->timestamp_rx, proc->subframe_rx,*subframe, proc->first_rx); + //exit_fun("Exiting"); } if (proc->frame_rx != *frame) { - LOG_E(PHY,"subframe_rx %d is not what we expect %d\n",proc->frame_rx,*frame); - exit_fun("Exiting"); + proc->first_rx++; + LOG_E(PHY,"[Mobipass]timestamp:%llu, frame_rx %d is not what we expect %d, first_rx:%d\n",proc->timestamp_rx,proc->frame_rx,*frame, proc->first_rx); + // exit_fun("Exiting"); } + // temporary solution + *subframe = proc->subframe_rx; + *frame = proc->frame_rx; } + + pthread_mutex_unlock(&proc->mutex_asynch_rxtx); + } // eNodeB_3GPP_BBU // asynchronous UL with IF4p5 (RCC,RAU,eNodeB_BBU) @@ -689,15 +715,15 @@ void fh_if4p5_asynch_UL(PHY_VARS_eNB *eNB,int *frame,int *subframe) { if (proc->first_rx != 0) { *frame = proc->frame_rx; *subframe = proc->subframe_rx; - proc->first_rx = 0; + proc->first_rx--; } else { if (proc->frame_rx != *frame) { - LOG_E(PHY,"frame_rx %d is not what we expect %d\n",proc->frame_rx,*frame); + LOG_E(PHY,"fh_if4p5_asynch_UL: frame_rx %d is not what we expect %d\n",proc->frame_rx,*frame); exit_fun("Exiting"); } if (proc->subframe_rx != *subframe) { - LOG_E(PHY,"subframe_rx %d is not what we expect %d\n",proc->subframe_rx,*subframe); + LOG_E(PHY,"fh_if4p5_asynch_UL: subframe_rx %d is not what we expect %d\n",proc->subframe_rx,*subframe); exit_fun("Exiting"); } } @@ -721,11 +747,14 @@ void fh_if5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) { openair0_timestamp timestamp_tx; recv_IF5(eNB, ×tamp_tx, *subframe, IF5_RRH_GW_DL); - // printf("Received subframe %d (TS %llu) from RCC\n",subframe_tx,timestamp_tx); + //printf("Received subframe %d (TS %llu) from RCC\n",subframe_tx,timestamp_tx); subframe_tx = (timestamp_tx/fp->samples_per_tti)%10; frame_tx = (timestamp_tx/(fp->samples_per_tti*10))&1023; + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB, frame_tx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_ENB, subframe_tx ); + if (proc->first_tx != 0) { *subframe = subframe_tx; *frame = frame_tx; @@ -733,11 +762,11 @@ void fh_if5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) { } else { if (subframe_tx != *subframe) { - LOG_E(PHY,"subframe_tx %d is not what we expect %d\n",subframe_tx,*subframe); + LOG_E(PHY,"fh_if5_asynch_DL: subframe_tx %d is not what we expect %d\n",subframe_tx,*subframe); exit_fun("Exiting"); } if (frame_tx != *frame) { - LOG_E(PHY,"frame_tx %d is not what we expect %d\n",frame_tx,*frame); + LOG_E(PHY,"fh_if5_asynch_DL: frame_tx %d is not what we expect %d\n",frame_tx,*frame); exit_fun("Exiting"); } } @@ -749,40 +778,67 @@ void fh_if4p5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) { eNB_proc_t *proc = &eNB->proc; uint16_t packet_type; - uint32_t symbol_number,symbol_mask,symbol_mask_full; + uint32_t symbol_number,symbol_mask_full; int subframe_tx,frame_tx; symbol_number = 0; - symbol_mask = 0; - symbol_mask_full = (1<<fp->symbols_per_tti)-1; + LOG_D(PHY,"fh_asynch_DL_IF4p5: in, frame %d, subframe %d\n",*frame,*subframe); + + // correct for TDD + if (fp->frame_type == TDD) { + while (subframe_select(fp,*subframe) == SF_UL) { + *subframe=*subframe+1; + if (*subframe==10) { + *subframe=0; + *frame=*frame+1; + } + } + } + + LOG_D(PHY,"fh_asynch_DL_IF4p5: after TDD correction, frame %d, subframe %d\n",*frame,*subframe); + + symbol_mask_full = ((subframe_select(fp,*subframe) == SF_S) ? (1<<fp->dl_symbols_in_S_subframe) : (1<<fp->symbols_per_tti))-1; do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!! recv_IF4p5(eNB, &frame_tx, &subframe_tx, &packet_type, &symbol_number); if (proc->first_tx != 0) { *frame = frame_tx; *subframe = subframe_tx; proc->first_tx = 0; + proc->frame_offset = frame_tx - proc->frame_tx; + symbol_mask_full = ((subframe_select(fp,*subframe) == SF_S) ? (1<<fp->dl_symbols_in_S_subframe) : (1<<fp->symbols_per_tti))-1; + } else { if (frame_tx != *frame) { - LOG_E(PHY,"frame_tx %d is not what we expect %d\n",frame_tx,*frame); + LOG_E(PHY,"fh_if4p5_asynch_DL: frame_tx %d is not what we expect %d\n",frame_tx,*frame); exit_fun("Exiting"); } if (subframe_tx != *subframe) { - LOG_E(PHY,"subframe_tx %d is not what we expect %d\n",subframe_tx,*subframe); + LOG_E(PHY,"fh_if4p5_asynch_DL: (frame %d) subframe_tx %d is not what we expect %d\n",frame_tx,subframe_tx,*subframe); + //*subframe = subframe_tx; exit_fun("Exiting"); } } if (packet_type == IF4p5_PDLFFT) { - symbol_mask = symbol_mask | (1<<symbol_number); + proc->symbol_mask[subframe_tx] =proc->symbol_mask[subframe_tx] | (1<<symbol_number); } else { LOG_E(PHY,"Illegal IF4p5 packet type (should only be IF4p5_PDLFFT%d\n",packet_type); exit_fun("Exiting"); } - } while (symbol_mask != symbol_mask_full); + } while (proc->symbol_mask[*subframe] != symbol_mask_full); + + *frame = frame_tx; + + + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB, frame_tx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_ENB, subframe_tx ); + + // intialize this to zero after we're done with the subframe + proc->symbol_mask[*subframe] = 0; - do_OFDM_mod_rt(subframe_tx, eNB); + do_OFDM_mod_rt(*subframe, eNB); } /*! @@ -848,65 +904,117 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) { void *rxp[fp->nb_antennas_rx],*txp[fp->nb_antennas_tx]; unsigned int rxs,txs; int i; - int tx_sfoffset = 3;//(eNB->single_thread_flag == 1) ? 3 : 3; + int tx_sfoffset = (eNB->single_thread_flag == 1) ? 3 : 2; + openair0_timestamp ts,old_ts; + if (proc->first_rx==0) { // Transmit TX buffer based on timestamp from RX // printf("trx_write -> USRP TS %llu (sf %d)\n", (proc->timestamp_rx+(3*fp->samples_per_tti)),(proc->subframe_rx+2)%10); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_rx+(tx_sfoffset*fp->samples_per_tti)-openair0_cfg[0].tx_sample_advance)&0xffffffff ); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); // prepare tx buffer pointers - - for (i=0; i<fp->nb_antennas_tx; i++) - txp[i] = (void*)&eNB->common_vars.txdata[0][i][((proc->subframe_rx+tx_sfoffset)%10)*fp->samples_per_tti]; - - txs = eNB->rfdevice.trx_write_func(&eNB->rfdevice, - proc->timestamp_rx+(tx_sfoffset*fp->samples_per_tti)-openair0_cfg[0].tx_sample_advance, - txp, - fp->samples_per_tti, - fp->nb_antennas_tx, - 1); - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); - - - - if (txs != fp->samples_per_tti) { - LOG_E(PHY,"TX : Timeout (sent %d/%d)\n",txs, fp->samples_per_tti); - exit_fun( "problem transmitting samples" ); - } + + lte_subframe_t SF_type = subframe_select(fp,(proc->subframe_rx+tx_sfoffset)%10); + lte_subframe_t prevSF_type = subframe_select(fp,(proc->subframe_rx+tx_sfoffset+9)%10); + lte_subframe_t nextSF_type = subframe_select(fp,(proc->subframe_rx+tx_sfoffset+1)%10); + if ((SF_type == SF_DL) || + (SF_type == SF_S)) { + + for (i=0; i<fp->nb_antennas_tx; i++) + txp[i] = (void*)&eNB->common_vars.txdata[0][i][((proc->subframe_rx+tx_sfoffset)%10)*fp->samples_per_tti]; + + int siglen=fp->samples_per_tti,flags=1; + + if (SF_type == SF_S) { + siglen = fp->dl_symbols_in_S_subframe*(fp->ofdm_symbol_size+fp->nb_prefix_samples0); + flags=3; // end of burst + } + if ((fp->frame_type == TDD) && + (SF_type == SF_DL)&& + (prevSF_type == SF_UL) && + (nextSF_type == SF_DL)) + flags = 2; // start of burst + + if ((fp->frame_type == TDD) && + (SF_type == SF_DL)&& + (prevSF_type == SF_UL) && + (nextSF_type == SF_UL)) + flags = 4; // start of burst and end of burst (only one DL SF between two UL) + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_WRITE_FLAGS,flags); + txs = eNB->rfdevice.trx_write_func(&eNB->rfdevice, + proc->timestamp_rx+eNB->ts_offset+(tx_sfoffset*fp->samples_per_tti)-openair0_cfg[0].tx_sample_advance, + txp, + siglen, + fp->nb_antennas_tx, + flags); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); + + + + if (txs != siglen) { + LOG_E(PHY,"TX : Timeout (sent %d/%d)\n",txs, fp->samples_per_tti); + exit_fun( "problem transmitting samples" ); + } + } } - + for (i=0; i<fp->nb_antennas_rx; i++) rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][*subframe*fp->samples_per_tti]; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); + old_ts = proc->timestamp_rx; + rxs = eNB->rfdevice.trx_read_func(&eNB->rfdevice, - &(proc->timestamp_rx), + &ts, rxp, fp->samples_per_tti, fp->nb_antennas_rx); + proc->timestamp_rx = ts-eNB->ts_offset; + + if (rxs != fp->samples_per_tti) + LOG_E(PHY,"rx_rf: Asked for %d samples, got %d from USRP\n",fp->samples_per_tti,rxs); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); - + + if (proc->first_rx == 1) { + eNB->ts_offset = proc->timestamp_rx; + proc->timestamp_rx=0; + } + else { + + if (proc->timestamp_rx - old_ts != fp->samples_per_tti) { + LOG_I(PHY,"rx_rf: rfdevice timing drift of %d samples\n",proc->timestamp_rx - old_ts - fp->samples_per_tti); + eNB->ts_offset += (proc->timestamp_rx - old_ts - fp->samples_per_tti); + proc->timestamp_rx = ts-eNB->ts_offset; + } + } proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; + proc->frame_rx = (proc->frame_rx+proc->frame_offset)&1023; + proc->frame_tx = proc->frame_rx; + if (proc->subframe_rx > 5) proc->frame_tx=(proc->frame_tx+1)&1023; + // synchronize first reception to frame 0 subframe 0 + proc->timestamp_tx = proc->timestamp_rx+(4*fp->samples_per_tti); - // printf("trx_read <- USRP TS %llu (sf %d, first_rx %d)\n", proc->timestamp_rx,proc->subframe_rx,proc->first_rx); + // printf("trx_read <- USRP TS %lu (offset %d sf %d, f %d, first_rx %d)\n", proc->timestamp_rx,eNB->ts_offset,proc->subframe_rx,proc->frame_rx,proc->first_rx); if (proc->first_rx == 0) { if (proc->subframe_rx != *subframe){ - LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,*subframe); + LOG_E(PHY,"rx_rf: Received Timestamp (%llu) doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->timestamp_rx,proc->subframe_rx,*subframe); exit_fun("Exiting"); } - - if (proc->frame_rx != *frame) { - LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,*frame); + int f2 = (*frame+proc->frame_offset)&1023; + if (proc->frame_rx != f2) { + LOG_E(PHY,"rx_rf: Received Timestamp (%llu) doesn't correspond to the time we think it is (proc->frame_rx %d frame %d, frame_offset %d, f2 %d)\n",proc->timestamp_rx,proc->frame_rx,*frame,proc->frame_offset,f2); exit_fun("Exiting"); } } else { - proc->first_rx = 0; + proc->first_rx--; *frame = proc->frame_rx; *subframe = proc->subframe_rx; } @@ -934,19 +1042,23 @@ void rx_fh_if5(PHY_VARS_eNB *eNB,int *frame, int *subframe) { if (proc->first_rx == 0) { if (proc->subframe_rx != *subframe){ - LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); + LOG_E(PHY,"rx_fh_if5: Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,*subframe); exit_fun("Exiting"); } if (proc->frame_rx != *frame) { - LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); + LOG_E(PHY,"rx_fh_if5: Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,*frame); exit_fun("Exiting"); } } else { - proc->first_rx = 0; + proc->first_rx--; *frame = proc->frame_rx; *subframe = proc->subframe_rx; } + + + + proc->timestamp_tx = proc->timestamp_rx + (4*fp->samples_per_tti); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); @@ -957,50 +1069,80 @@ void rx_fh_if4p5(PHY_VARS_eNB *eNB,int *frame,int *subframe) { LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; eNB_proc_t *proc = &eNB->proc; - - int prach_rx; + int f,sf; uint16_t packet_type; uint32_t symbol_number=0; - uint32_t symbol_mask, symbol_mask_full; + uint32_t symbol_mask_full; - symbol_mask = 0; - symbol_mask_full = (1<<fp->symbols_per_tti)-1; - prach_rx = 0; + if ((fp->frame_type == TDD) && (subframe_select(fp,*subframe)==SF_S)) + symbol_mask_full = (1<<fp->ul_symbols_in_S_subframe)-1; + else + symbol_mask_full = (1<<fp->symbols_per_tti)-1; + if (eNB->CC_id==1) LOG_I(PHY,"rx_fh_if4p5: frame %d, subframe %d\n",*frame,*subframe); do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!! - recv_IF4p5(eNB, &proc->frame_rx, &proc->subframe_rx, &packet_type, &symbol_number); + recv_IF4p5(eNB, &f, &sf, &packet_type, &symbol_number); + //proc->frame_rx = (proc->frame_rx + proc->frame_offset)&1023; if (packet_type == IF4p5_PULFFT) { - symbol_mask = symbol_mask | (1<<symbol_number); - prach_rx = (is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx)>0) ? 1 : 0; + LOG_D(PHY,"rx_fh_if4p5: frame %d, subframe %d, PULFFT symbol %d\n",f,sf,symbol_number); + + proc->symbol_mask[sf] = proc->symbol_mask[sf] | (1<<symbol_number); + } else if (packet_type == IF4p5_PULTICK) { + + if ((proc->first_rx==0) && (f!=*frame)) + LOG_E(PHY,"rx_fh_if4p5: PULTICK received frame %d != expected %d\n",f,*frame); + if ((proc->first_rx==0) && (sf!=*subframe)) + LOG_E(PHY,"rx_fh_if4p5: PULTICK received subframe %d != expected %d (first_rx %d)\n",sf,*subframe,proc->first_rx); + break; } else if (packet_type == IF4p5_PRACH) { - prach_rx = 0; + LOG_D(PHY,"rx_fh:if4p5: frame %d, subframe %d, PRACH\n",f,sf); + // wakeup prach processing + if (eNB->do_prach) eNB->do_prach(eNB,f,sf); } - } while( (symbol_mask != symbol_mask_full) || (prach_rx == 1)); + if (eNB->CC_id==1) LOG_I(PHY,"rx_fh_if4p5: symbol_mask[%d] %x\n",*subframe,proc->symbol_mask[*subframe]); + + } while(proc->symbol_mask[*subframe] != symbol_mask_full); + + proc->subframe_rx = sf; + proc->frame_rx = f; + + proc->symbol_mask[*subframe] = 0; + proc->symbol_mask[(9+*subframe)%10]= 0; // to handle a resynchronization event + + if (eNB->CC_id==1) LOG_I(PHY,"Clearing symbol_mask[%d]\n",*subframe); //caculate timestamp_rx, timestamp_tx based on frame and subframe - proc->timestamp_rx = ((proc->frame_rx * 10) + proc->subframe_rx ) * fp->samples_per_tti ; - proc->timestamp_tx = proc->timestamp_rx + (4*fp->samples_per_tti); - + proc->timestamp_rx = ((proc->frame_rx * 10) + proc->subframe_rx ) * fp->samples_per_tti ; + proc->timestamp_tx = proc->timestamp_rx + (4*fp->samples_per_tti); + if (proc->first_rx == 0) { if (proc->subframe_rx != *subframe){ - LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,*subframe); - exit_fun("Exiting"); + LOG_E(PHY,"rx_fh_if4p5, CC_id %d: Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d,CCid %d)\n",eNB->CC_id,proc->subframe_rx,*subframe,eNB->CC_id); } if (proc->frame_rx != *frame) { - LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,*frame); - exit_fun("Exiting"); + if (proc->frame_rx == proc->frame_offset) // This means that the RRU has adjusted its frame timing + proc->frame_offset = 0; + else + LOG_E(PHY,"rx_fh_if4p5: Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d,CCid %d)\n",proc->frame_rx,*frame,eNB->CC_id); } } else { proc->first_rx = 0; - *frame = proc->frame_rx; + if (eNB->CC_id==0) + proc->frame_offset = 0; + else + proc->frame_offset = PHY_vars_eNB_g[0][0]->proc.frame_rx; + + *frame = proc->frame_rx;//(proc->frame_rx + proc->frame_offset)&1023; *subframe = proc->subframe_rx; } - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); + + + if (eNB->CC_id==0) VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); } @@ -1083,15 +1225,22 @@ void wakeup_slaves(eNB_proc_t *proc) { // wake up slave FH thread // lock the FH mutex and make sure the thread is ready if (pthread_mutex_timedlock(&slave_proc->mutex_FH,&wait) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB CCid %d slave CCid %d (IC %d)\n",proc->CC_id,slave_proc->CC_id); + /* TODO: fix this log, what is 'IC'? */ + /*LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB CCid %d slave CCid %d (IC %d)\n",proc->CC_id,slave_proc->CC_id);*/ + LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB CCid %d slave CCid %d\n",proc->CC_id,slave_proc->CC_id); exit_fun( "error locking mutex_rxtx" ); break; } - + + while (slave_proc->instance_cnt_FH == 0) { + // LOG_W( PHY,"[eNB] Frame:%d , eNB rx_fh_slave thread busy!! (cnt_FH %i)\n", proc->frame_rx,slave_proc->instance_cnt_FH ); + usleep(500); + } + int cnt_slave = ++slave_proc->instance_cnt_FH; slave_proc->frame_rx = proc->frame_rx; slave_proc->subframe_rx = proc->subframe_rx; - slave_proc->timestamp_rx = proc->timestamp_rx; + //slave_proc->timestamp_rx = proc->timestamp_rx; slave_proc->timestamp_tx = proc->timestamp_tx; pthread_mutex_unlock( &slave_proc->mutex_FH ); @@ -1111,6 +1260,117 @@ void wakeup_slaves(eNB_proc_t *proc) { } } +uint32_t sync_corr[307200] __attribute__((aligned(32))); + +// This thread run the initial synchronization like a UE +void *eNB_thread_synch(void *arg) { + + PHY_VARS_eNB *eNB = (PHY_VARS_eNB*)arg; + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; + int32_t sync_pos,sync_pos2; + uint32_t peak_val; + + thread_top_init("eNB_thread_synch",0,5000000,10000000,10000000); + + wait_sync("eNB_thread_synch"); + + // initialize variables for PSS detection + lte_sync_time_init(&eNB->frame_parms); + + while (!oai_exit) { + + // wait to be woken up + pthread_mutex_lock(&eNB->proc.mutex_synch); + while (eNB->proc.instance_cnt_synch < 0) + pthread_cond_wait(&eNB->proc.cond_synch,&eNB->proc.mutex_synch); + pthread_mutex_unlock(&eNB->proc.mutex_synch); + + // if we're not in synch, then run initial synch + if (eNB->in_synch == 0) { + // run intial synch like UE + LOG_I(PHY,"Running initial synchronization\n"); + + sync_pos = lte_sync_time_eNB(eNB->common_vars.rxdata[0], + fp, + fp->samples_per_tti*5, + &peak_val, + sync_corr); + LOG_I(PHY,"eNB synch: %d, val %d\n",sync_pos,peak_val); + + if (sync_pos >= 0) { + if (sync_pos >= fp->nb_prefix_samples) + sync_pos2 = sync_pos - fp->nb_prefix_samples; + else + sync_pos2 = sync_pos + (fp->samples_per_tti*10) - fp->nb_prefix_samples; + + if (fp->frame_type == FDD) { + + // PSS is hypothesized in last symbol of first slot in Frame + int sync_pos_slot = (fp->samples_per_tti>>1) - fp->ofdm_symbol_size - fp->nb_prefix_samples; + + if (sync_pos2 >= sync_pos_slot) + eNB->rx_offset = sync_pos2 - sync_pos_slot; + else + eNB->rx_offset = (fp->samples_per_tti*10) + sync_pos2 - sync_pos_slot; + } + else { + + } + + LOG_I(PHY,"Estimated sync_pos %d, peak_val %d => timing offset %d\n",sync_pos,peak_val,eNB->rx_offset); + + /* + if ((peak_val > 300000) && (sync_pos > 0)) { + // if (sync_pos++ > 3) { + write_output("eNB_sync.m","sync",(void*)&sync_corr[0],fp->samples_per_tti*5,1,2); + write_output("eNB_rx.m","rxs",(void*)eNB->common_vars.rxdata[0][0],fp->samples_per_tti*10,1,1); + exit(-1); + } + */ + eNB->in_synch=1; + } + } + + // release thread + pthread_mutex_lock(&eNB->proc.mutex_synch); + eNB->proc.instance_cnt_synch--; + pthread_mutex_unlock(&eNB->proc.mutex_synch); + } // oai_exit + + lte_sync_time_free(); + + return NULL; +} + +int wakeup_synch(PHY_VARS_eNB *eNB){ + + struct timespec wait; + + wait.tv_sec=0; + wait.tv_nsec=5000000L; + + // wake up synch thread + // lock the synch mutex and make sure the thread is ready + if (pthread_mutex_timedlock(&eNB->proc.mutex_synch,&wait) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB synch thread (IC %d)\n", eNB->proc.instance_cnt_synch ); + exit_fun( "error locking mutex_synch" ); + return(-1); + } + + ++eNB->proc.instance_cnt_synch; + + // the thread can now be woken up + if (pthread_cond_signal(&eNB->proc.cond_synch) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB synch thread\n"); + exit_fun( "ERROR pthread_cond_signal" ); + return(-1); + } + + pthread_mutex_unlock( &eNB->proc.mutex_synch ); + + return(0); +} + /*! * \brief The Fronthaul thread of RRU/RAU/RCC/eNB * In the case of RRU/eNB, handles interface with external RF @@ -1231,6 +1491,8 @@ static void* eNB_thread_prach( void* param ) { return &eNB_thread_prach_status; } + + static void* eNB_thread_single( void* param ) { static int eNB_thread_single_status; @@ -1238,9 +1500,25 @@ static void* eNB_thread_single( void* param ) { eNB_proc_t *proc = (eNB_proc_t*)param; eNB_rxtx_proc_t *proc_rxtx = &proc->proc_rxtx[0]; PHY_VARS_eNB *eNB = PHY_vars_eNB_g[0][proc->CC_id]; + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + eNB->CC_id = proc->CC_id; + + void *rxp[2],*rxp2[2]; int subframe=0, frame=0; + int32_t dummy_rx[fp->nb_antennas_rx][fp->samples_per_tti] __attribute__((aligned(32))); + + int ic; + + int rxs; + + int i; + + // initialize the synchronization buffer to the common_vars.rxdata + for (int i=0;i<fp->nb_antennas_rx;i++) + rxp[i] = &eNB->common_vars.rxdata[0][i][0]; + // set default return value eNB_thread_single_status = 0; @@ -1269,6 +1547,74 @@ static void* eNB_thread_single( void* param ) { pthread_mutex_unlock(&proc->mutex_asynch_rxtx); pthread_cond_signal(&proc->cond_asynch_rxtx); + + + // if this is a slave eNB, try to synchronize on the DL frequency + if ((eNB->is_slave) && + ((eNB->node_function >= NGFI_RRU_IF5))) { + // if FDD, switch RX on DL frequency + + double temp_freq1 = eNB->rfdevice.openair0_cfg->rx_freq[0]; + double temp_freq2 = eNB->rfdevice.openair0_cfg->tx_freq[0]; + for (i=0;i<4;i++) { + eNB->rfdevice.openair0_cfg->rx_freq[i] = eNB->rfdevice.openair0_cfg->tx_freq[i]; + eNB->rfdevice.openair0_cfg->tx_freq[i] = temp_freq1; + } + eNB->rfdevice.trx_set_freq_func(&eNB->rfdevice,eNB->rfdevice.openair0_cfg,0); + + while ((eNB->in_synch ==0)&&(!oai_exit)) { + // read in frame + rxs = eNB->rfdevice.trx_read_func(&eNB->rfdevice, + &(proc->timestamp_rx), + rxp, + fp->samples_per_tti*10, + fp->nb_antennas_rx); + + if (rxs != (fp->samples_per_tti*10)) + exit_fun("Problem receiving samples\n"); + + // wakeup synchronization processing thread + wakeup_synch(eNB); + ic=0; + + while ((ic>=0)&&(!oai_exit)) { + // continuously read in frames, 1ms at a time, + // until we are done with the synchronization procedure + + for (i=0; i<fp->nb_antennas_rx; i++) + rxp2[i] = (void*)&dummy_rx[i][0]; + for (i=0;i<10;i++) + rxs = eNB->rfdevice.trx_read_func(&eNB->rfdevice, + &(proc->timestamp_rx), + rxp2, + fp->samples_per_tti, + fp->nb_antennas_rx); + if (rxs != fp->samples_per_tti) + exit_fun( "problem receiving samples" ); + + pthread_mutex_lock(&eNB->proc.mutex_synch); + ic = eNB->proc.instance_cnt_synch; + pthread_mutex_unlock(&eNB->proc.mutex_synch); + } // ic>=0 + } // in_synch==0 + // read in rx_offset samples + LOG_I(PHY,"Resynchronizing by %d samples\n",eNB->rx_offset); + rxs = eNB->rfdevice.trx_read_func(&eNB->rfdevice, + &(proc->timestamp_rx), + rxp, + eNB->rx_offset, + fp->nb_antennas_rx); + if (rxs != eNB->rx_offset) + exit_fun( "problem receiving samples" ); + + for (i=0;i<4;i++) { + eNB->rfdevice.openair0_cfg->rx_freq[i] = temp_freq1; + eNB->rfdevice.openair0_cfg->tx_freq[i] = temp_freq2; + } + eNB->rfdevice.trx_set_freq_func(&eNB->rfdevice,eNB->rfdevice.openair0_cfg,1); + } // if RRU and slave + + // This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices while (!oai_exit) { @@ -1282,7 +1628,9 @@ static void* eNB_thread_single( void* param ) { subframe++; } - LOG_D(PHY,"eNB Fronthaul thread, frame %d, subframe %d\n",frame,subframe); + if (eNB->CC_id==1) + LOG_D(PHY,"eNB thread single %p (proc %p, CC_id %d), frame %d (%p), subframe %d (%p)\n", + pthread_self(), proc, eNB->CC_id, frame,&frame,subframe,&subframe); // synchronization on FH interface, acquire signals/data and block if (eNB->rx_fh) eNB->rx_fh(eNB,&frame,&subframe); @@ -1293,8 +1641,11 @@ static void* eNB_thread_single( void* param ) { proc_rxtx->subframe_rx = proc->subframe_rx; proc_rxtx->frame_rx = proc->frame_rx; proc_rxtx->subframe_tx = (proc->subframe_rx+4)%10; - proc_rxtx->frame_tx = (proc->subframe_rx < 6) ? proc->frame_rx : (proc->frame_rx+1)&1023; + proc_rxtx->frame_tx = (proc->subframe_rx>5) ? (1+proc->frame_rx)&1023 : proc->frame_rx; + proc->frame_tx = proc_rxtx->frame_tx; proc_rxtx->timestamp_tx = proc->timestamp_tx; + // adjust for timing offset between RRU + if (eNB->CC_id!=0) proc_rxtx->frame_tx = (proc_rxtx->frame_tx+proc->frame_offset)&1023; // At this point, all information for subframe has been received on FH interface // If this proc is to provide synchronization, do so @@ -1322,7 +1673,7 @@ void init_eNB_proc(int inst) { PHY_VARS_eNB *eNB; eNB_proc_t *proc; eNB_rxtx_proc_t *proc_rxtx; - pthread_attr_t *attr0=NULL,*attr1=NULL,*attr_FH=NULL,*attr_prach=NULL,*attr_asynch=NULL,*attr_single=NULL,*attr_fep=NULL,*attr_td=NULL,*attr_te; + pthread_attr_t *attr0=NULL,*attr1=NULL,*attr_FH=NULL,*attr_prach=NULL,*attr_asynch=NULL,*attr_single=NULL,*attr_fep=NULL,*attr_td=NULL,*attr_te=NULL,*attr_synch=NULL; for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { eNB = PHY_vars_eNB_g[inst][CC_id]; @@ -1338,9 +1689,13 @@ void init_eNB_proc(int inst) { proc->instance_cnt_FH = -1; proc->instance_cnt_asynch_rxtx = -1; proc->CC_id = CC_id; - + proc->instance_cnt_synch = -1; + proc->first_rx=1; proc->first_tx=1; + proc->frame_offset = 0; + + for (i=0;i<10;i++) proc->symbol_mask[i]=0; pthread_mutex_init( &proc_rxtx[0].mutex_rxtx, NULL); pthread_mutex_init( &proc_rxtx[1].mutex_rxtx, NULL); @@ -1349,13 +1704,16 @@ void init_eNB_proc(int inst) { pthread_mutex_init( &proc->mutex_prach, NULL); pthread_mutex_init( &proc->mutex_asynch_rxtx, NULL); + pthread_mutex_init( &proc->mutex_synch,NULL); pthread_cond_init( &proc->cond_prach, NULL); pthread_cond_init( &proc->cond_FH, NULL); pthread_cond_init( &proc->cond_asynch_rxtx, NULL); + pthread_cond_init( &proc->cond_synch,NULL); pthread_attr_init( &proc->attr_FH); pthread_attr_init( &proc->attr_prach); + pthread_attr_init( &proc->attr_synch); pthread_attr_init( &proc->attr_asynch_rxtx); pthread_attr_init( &proc->attr_single); pthread_attr_init( &proc->attr_fep); @@ -1368,6 +1726,7 @@ void init_eNB_proc(int inst) { attr1 = &proc_rxtx[1].attr_rxtx; attr_FH = &proc->attr_FH; attr_prach = &proc->attr_prach; + attr_synch = &proc->attr_synch; attr_asynch = &proc->attr_asynch_rxtx; attr_single = &proc->attr_single; attr_fep = &proc->attr_fep; @@ -1387,6 +1746,7 @@ void init_eNB_proc(int inst) { init_te_thread(eNB,attr_te); } pthread_create( &proc->pthread_prach, attr_prach, eNB_thread_prach, &eNB->proc ); + pthread_create( &proc->pthread_synch, attr_synch, eNB_thread_synch, eNB); if ((eNB->node_timing == synch_to_other) || (eNB->node_function == NGFI_RRU_IF5) || (eNB->node_function == NGFI_RRU_IF4p5)) @@ -1410,6 +1770,7 @@ void init_eNB_proc(int inst) { } //for multiple CCs: setup master and slaves + /* for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { eNB = PHY_vars_eNB_g[inst][CC_id]; @@ -1422,8 +1783,8 @@ void init_eNB_proc(int inst) { if (i >= CC_id) eNB->proc.slave_proc[i] = &(PHY_vars_eNB_g[inst][i+1]->proc); } } - } - + } +*/ /* setup PHY proc TX sync mechanism */ pthread_mutex_init(&sync_phy_proc.mutex_phy_proc_tx, NULL); @@ -1608,12 +1969,12 @@ int start_rf(PHY_VARS_eNB *eNB) { return(eNB->rfdevice.trx_start_func(&eNB->rfdevice)); } -extern void eNB_fep_rru_if5(PHY_VARS_eNB *eNB); -extern void eNB_fep_full(PHY_VARS_eNB *eNB); -extern void eNB_fep_full_2thread(PHY_VARS_eNB *eNB); -extern void do_prach(PHY_VARS_eNB *eNB); +extern void eNB_fep_rru_if5(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc); +extern void eNB_fep_full(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc); +extern void eNB_fep_full_2thread(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc); +extern void do_prach(PHY_VARS_eNB *eNB,int frame,int subframe); -void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst,eth_params_t *eth_params,int single_thread_flag) { +void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst,eth_params_t *eth_params,int single_thread_flag,int wait_for_sync) { int CC_id; int inst; @@ -1627,6 +1988,11 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst eNB->node_timing = node_timing[CC_id]; eNB->abstraction_flag = 0; eNB->single_thread_flag = single_thread_flag; + eNB->ts_offset = 0; + eNB->in_synch = 0; + eNB->is_slave = (wait_for_sync>0) ? 1 : 0; + + #ifndef OCP_FRAMEWORK LOG_I(PHY,"Initializing eNB %d CC_id %d : (%s,%s)\n",inst,CC_id,eNB_functions[node_function[CC_id]],eNB_timing[node_timing[CC_id]]); #endif @@ -1634,6 +2000,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst switch (node_function[CC_id]) { case NGFI_RRU_IF5: eNB->do_prach = NULL; + eNB->do_precoding = 0; eNB->fep = eNB_fep_rru_if5; eNB->td = NULL; eNB->te = NULL; @@ -1659,6 +2026,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst } break; case NGFI_RRU_IF4p5: + eNB->do_precoding = 0; eNB->do_prach = do_prach; eNB->fep = eNB_fep_full;//(single_thread_flag==1) ? eNB_fep_full_2thread : eNB_fep_full; eNB->td = NULL; @@ -1677,6 +2045,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst } eNB->rfdevice.host_type = RRH_HOST; eNB->ifdevice.host_type = RRH_HOST; + printf("loading transport interface ...\n"); ret = openair0_transport_load(&eNB->ifdevice, &openair0_cfg[CC_id], (eth_params+CC_id)); printf("openair0_transport_init returns %d for CC_id %d\n",ret,CC_id); if (ret<0) { @@ -1688,6 +2057,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst break; case eNodeB_3GPP: + eNB->do_precoding = eNB->frame_parms.nb_antennas_tx!=eNB->frame_parms.nb_antenna_ports_eNB; eNB->do_prach = do_prach; eNB->fep = eNB_fep_full;//(single_thread_flag==1) ? eNB_fep_full_2thread : eNB_fep_full; eNB->td = ulsch_decoding_data;//(single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data; @@ -1708,26 +2078,27 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst eNB->ifdevice.host_type = BBU_HOST; break; case eNodeB_3GPP_BBU: - eNB->do_prach = do_prach; - eNB->fep = eNB_fep_full;//(single_thread_flag==1) ? eNB_fep_full_2thread : eNB_fep_full; - eNB->td = ulsch_decoding_data;//(single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data; - eNB->te = dlsch_encoding;//(single_thread_flag==1) ? dlsch_encoding_2threads : dlsch_encoding; - eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; - eNB->proc_tx = proc_tx_full; + eNB->do_precoding = eNB->frame_parms.nb_antennas_tx!=eNB->frame_parms.nb_antenna_ports_eNB; + eNB->do_prach = do_prach; + eNB->fep = eNB_fep_full;//(single_thread_flag==1) ? eNB_fep_full_2thread : eNB_fep_full; + eNB->td = ulsch_decoding_data;//(single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data; + eNB->te = dlsch_encoding;//(single_thread_flag==1) ? dlsch_encoding_2threads : dlsch_encoding; + eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; + eNB->proc_tx = proc_tx_full; if (eNB->node_timing == synch_to_other) { - eNB->tx_fh = tx_fh_if5_mobipass; - eNB->rx_fh = rx_fh_slave; - eNB->fh_asynch = fh_if5_asynch_UL; + eNB->tx_fh = tx_fh_if5_mobipass; + eNB->rx_fh = rx_fh_slave; + eNB->fh_asynch = fh_if5_asynch_UL; } else { - eNB->tx_fh = tx_fh_if5; - eNB->rx_fh = rx_fh_if5; - eNB->fh_asynch = NULL; + eNB->tx_fh = tx_fh_if5; + eNB->rx_fh = rx_fh_if5; + eNB->fh_asynch = NULL; } - eNB->start_rf = NULL; - eNB->start_if = start_if; + eNB->start_rf = NULL; + eNB->start_if = start_if; eNB->rfdevice.host_type = BBU_HOST; eNB->ifdevice.host_type = BBU_HOST; @@ -1740,6 +2111,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst } break; case NGFI_RCC_IF4p5: + eNB->do_precoding = 0; eNB->do_prach = do_prach; eNB->fep = NULL; eNB->td = ulsch_decoding_data;//(single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data; @@ -1763,6 +2135,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst break; case NGFI_RAU_IF4p5: + eNB->do_precoding = 0; eNB->do_prach = do_prach; eNB->fep = NULL; @@ -1790,7 +2163,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst } } - if (setup_eNB_buffers(PHY_vars_eNB_g[inst],&openair0_cfg[0])!=0) { + if (setup_eNB_buffers(PHY_vars_eNB_g[inst],&openair0_cfg[CC_id])!=0) { printf("Exiting, cannot initialize eNodeB Buffers\n"); exit(-1); } diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 012eb44e45518a92d88d91b1fdf64f20082f6d51..6a2aa28d7a4c19a1c0838a534e9850e2d6c39bdc 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -112,7 +112,7 @@ extern int netlink_init(void); // In lte-enb.c extern int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg); -extern void init_eNB(eNB_func_t *, eNB_timing_t *,int,eth_params_t *,int); +extern void init_eNB(eNB_func_t *, eNB_timing_t *,int,eth_params_t *,int,int); extern void stop_eNB(int); extern void kill_eNB_proc(void); @@ -160,6 +160,9 @@ volatile int oai_exit = 0; +static clock_source_t clock_source = internal; + +static wait_for_sync = 0; static char UE_flag=0; unsigned int mmapped_dma=0; @@ -379,6 +382,7 @@ void help (void) { printf(" --ue-scan_carrier set UE to scan around carrier\n"); printf(" --loop-memory get softmodem (UE) to loop through memory instead of acquiring from HW\n"); printf(" --mmapped-dma sets flag for improved EXMIMO UE performance\n"); + printf(" --external-clock tells hardware to use an external clock reference\n"); printf(" --usim-test use XOR autentication algo in case of test usim mode\n"); printf(" --single-thread-disable. Disables single-thread mode in lte-softmodem\n"); printf(" -C Set the downlink frequency for all component carriers\n"); @@ -652,7 +656,7 @@ void *l2l1_task(void *arg) #endif - + static void get_options (int argc, char **argv) { @@ -689,6 +693,8 @@ static void get_options (int argc, char **argv) LONG_OPTION_PHYTEST, LONG_OPTION_USIMTEST, LONG_OPTION_MMAPPED_DMA, + LONG_OPTION_EXTERNAL_CLOCK, + LONG_OPTION_WAIT_FOR_SYNC, LONG_OPTION_SINGLE_THREAD_DISABLE, #if T_TRACER LONG_OPTION_T_PORT, @@ -716,6 +722,8 @@ static void get_options (int argc, char **argv) {"phy-test", no_argument, NULL, LONG_OPTION_PHYTEST}, {"usim-test", no_argument, NULL, LONG_OPTION_USIMTEST}, {"mmapped-dma", no_argument, NULL, LONG_OPTION_MMAPPED_DMA}, + {"external-clock", no_argument, NULL, LONG_OPTION_EXTERNAL_CLOCK}, + {"wait-for-sync", no_argument, NULL, LONG_OPTION_WAIT_FOR_SYNC}, {"single-thread-disable", no_argument, NULL, LONG_OPTION_SINGLE_THREAD_DISABLE}, #if T_TRACER {"T_port", required_argument, 0, LONG_OPTION_T_PORT}, @@ -824,7 +832,15 @@ static void get_options (int argc, char **argv) case LONG_OPTION_SINGLE_THREAD_DISABLE: single_thread_flag = 0; break; - + + case LONG_OPTION_EXTERNAL_CLOCK: + clock_source = external; + break; + + case LONG_OPTION_WAIT_FOR_SYNC: + wait_for_sync = 1; + break; + #if T_TRACER case LONG_OPTION_T_PORT: { extern int T_port; @@ -1335,6 +1351,7 @@ void init_openair0() { openair0_cfg[card].num_rb_dl=frame_parms[0]->N_RB_DL; + openair0_cfg[card].clock_source = clock_source; openair0_cfg[card].tx_num_channels=min(2,((UE_flag==0) ? PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx : PHY_vars_UE_g[0][0]->frame_parms.nb_antennas_tx)); openair0_cfg[card].rx_num_channels=min(2,((UE_flag==0) ? PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_rx : PHY_vars_UE_g[0][0]->frame_parms.nb_antennas_rx)); @@ -1360,6 +1377,7 @@ void init_openair0() { openair0_cfg[card].rx_gain[i] = PHY_vars_UE_g[0][0]->rx_total_gain_dB - rx_gain_off; } + openair0_cfg[card].configFilename = rf_config_file; printf("Card %d, channel %d, Setting tx_gain %f, rx_gain %f, tx_freq %f, rx_freq %f\n", card,i, openair0_cfg[card].tx_gain[i], openair0_cfg[card].rx_gain[i], @@ -1617,14 +1635,11 @@ int main( int argc, char **argv ) PHY_vars_eNB_g[0] = malloc(sizeof(PHY_VARS_eNB*)); for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { - PHY_vars_eNB_g[0][CC_id] = init_lte_eNB(frame_parms[CC_id],0,frame_parms[CC_id]->Nid_cell,abstraction_flag); - PHY_vars_eNB_g[0][CC_id]->CC_id = CC_id; - + PHY_vars_eNB_g[0][CC_id] = init_lte_eNB(frame_parms[CC_id],0,frame_parms[CC_id]->Nid_cell,node_function[CC_id],abstraction_flag); PHY_vars_eNB_g[0][CC_id]->ue_dl_rb_alloc=0x1fff; PHY_vars_eNB_g[0][CC_id]->target_ue_dl_mcs=target_dl_mcs; PHY_vars_eNB_g[0][CC_id]->ue_ul_nb_rb=6; PHY_vars_eNB_g[0][CC_id]->target_ue_ul_mcs=target_ul_mcs; - // initialization for phy-test for (k=0;k<NUMBER_OF_UE_MAX;k++) { PHY_vars_eNB_g[0][CC_id]->transmission_mode[k] = transmission_mode; @@ -1636,31 +1651,43 @@ int main( int argc, char **argv ) for (re=0; re<frame_parms[CC_id]->ofdm_symbol_size; re++) PHY_vars_eNB_g[0][CC_id]->common_vars.beam_weights[0][0][j][re] = 0x00007fff/frame_parms[CC_id]->nb_antennas_tx; } + if (phy_test==1) PHY_vars_eNB_g[0][CC_id]->mac_enabled = 0; else PHY_vars_eNB_g[0][CC_id]->mac_enabled = 1; - + if (PHY_vars_eNB_g[0][CC_id]->mac_enabled == 0) { //set default parameters for testing mode for (i=0; i<NUMBER_OF_UE_MAX; i++) { - PHY_vars_eNB_g[0][CC_id]->pusch_config_dedicated[i].betaOffset_ACK_Index = beta_ACK; - PHY_vars_eNB_g[0][CC_id]->pusch_config_dedicated[i].betaOffset_RI_Index = beta_RI; - PHY_vars_eNB_g[0][CC_id]->pusch_config_dedicated[i].betaOffset_CQI_Index = beta_CQI; - - PHY_vars_eNB_g[0][CC_id]->scheduling_request_config[i].sr_PUCCH_ResourceIndex = i; - PHY_vars_eNB_g[0][CC_id]->scheduling_request_config[i].sr_ConfigIndex = 7+(i%3); - PHY_vars_eNB_g[0][CC_id]->scheduling_request_config[i].dsr_TransMax = sr_n4; + PHY_vars_eNB_g[0][CC_id]->pusch_config_dedicated[i].betaOffset_ACK_Index = beta_ACK; + PHY_vars_eNB_g[0][CC_id]->pusch_config_dedicated[i].betaOffset_RI_Index = beta_RI; + PHY_vars_eNB_g[0][CC_id]->pusch_config_dedicated[i].betaOffset_CQI_Index = beta_CQI; + + PHY_vars_eNB_g[0][CC_id]->scheduling_request_config[i].sr_PUCCH_ResourceIndex = i; + PHY_vars_eNB_g[0][CC_id]->scheduling_request_config[i].sr_ConfigIndex = 7+(i%3); + PHY_vars_eNB_g[0][CC_id]->scheduling_request_config[i].dsr_TransMax = sr_n4; } } - + compute_prach_seq(&PHY_vars_eNB_g[0][CC_id]->frame_parms.prach_config_common, - PHY_vars_eNB_g[0][CC_id]->frame_parms.frame_type, - PHY_vars_eNB_g[0][CC_id]->X_u); - + PHY_vars_eNB_g[0][CC_id]->frame_parms.frame_type, + PHY_vars_eNB_g[0][CC_id]->X_u); + + PHY_vars_eNB_g[0][CC_id]->rx_total_gain_dB = (int)rx_gain[CC_id][0]; - PHY_vars_eNB_g[0][CC_id]->N_TA_offset = 0; + if (frame_parms[CC_id]->frame_type==FDD) { + PHY_vars_eNB_g[0][CC_id]->N_TA_offset = 0; + } + else { + if (frame_parms[CC_id]->N_RB_DL == 100) + PHY_vars_eNB_g[0][CC_id]->N_TA_offset = 624; + else if (frame_parms[CC_id]->N_RB_DL == 50) + PHY_vars_eNB_g[0][CC_id]->N_TA_offset = 624/2; + else if (frame_parms[CC_id]->N_RB_DL == 25) + PHY_vars_eNB_g[0][CC_id]->N_TA_offset = 624/4; + } } - + NB_eNB_INST=1; NB_INST=1; @@ -1840,9 +1867,9 @@ int main( int argc, char **argv ) } } else { - init_eNB(node_function,node_timing,1,eth_params,single_thread_flag); - // Sleep to allow all threads to setup - + printf("Initializing eNB threads\n"); + init_eNB(node_function,node_timing,1,eth_params,single_thread_flag,wait_for_sync); + number_of_cards = 1; for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 6583ac2e22026c6555612fc8e997df4f3bbc6316..5555444dbaef994f4a488b98bc606ede701ecc11 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -856,8 +856,8 @@ static void *UE_thread_rxn_txnp4(void *arg) -#define RX_OFF_MAX 10 -#define RX_OFF_MIN 5 +#define RX_OFF_MAX 23 +#define RX_OFF_MIN 0 #define RX_OFF_MID ((RX_OFF_MAX+RX_OFF_MIN)/2) /*! @@ -960,7 +960,7 @@ void *UE_thread(void *arg) { if (instance_cnt_synch < 0) { // we can invoke the synch // grab 10 ms of signal and wakeup synch thread for (int i=0; i<UE->frame_parms.nb_antennas_rx; i++) - rxp[i] = (void*)&rxdata[i][0]; + rxp[i] = (void*)&UE->common_vars.rxdata[i][0]; if (UE->mode != loop_through_memory) { rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, @@ -1024,7 +1024,7 @@ void *UE_thread(void *arg) { LOG_I(PHY,"Resynchronizing RX by %d samples (mode = %d)\n",UE->rx_offset,UE->mode); rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, ×tamp, - (void**)rxdata, + (void**)UE->common_vars.rxdata, UE->rx_offset, UE->frame_parms.nb_antennas_rx); if (rxs != UE->rx_offset) { @@ -1033,6 +1033,7 @@ void *UE_thread(void *arg) { return &UE_thread_retval; } } + LOG_D(PHY,"Set rx_offset to 0 \n"); UE->rx_offset=0; UE->proc.proc_rxtx[0].frame_rx++; UE->proc.proc_rxtx[1].frame_rx++; @@ -1040,7 +1041,7 @@ void *UE_thread(void *arg) { // read in first symbol rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, ×tamp, - (void**)rxdata, + (void**)UE->common_vars.rxdata, UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0, UE->frame_parms.nb_antennas_rx); if (rxs != (UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0)) { @@ -1069,7 +1070,7 @@ void *UE_thread(void *arg) { for (int sf=0;sf<10;sf++) { for (i=0; i<UE->frame_parms.nb_antennas_rx; i++) - rxp[i] = (void*)&rxdata[i][UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0+(sf*UE->frame_parms.samples_per_tti)]; + rxp[i] = (void*)&UE->common_vars.rxdata[i][UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0+(sf*UE->frame_parms.samples_per_tti)]; // grab signal for subframe if (UE->mode != loop_through_memory) { if (sf<9) { @@ -1079,6 +1080,8 @@ void *UE_thread(void *arg) { rxp, UE->frame_parms.samples_per_tti, UE->frame_parms.nb_antennas_rx); + LOG_D(PHY,"grab signal for subframe %d offset %d Nbsamples %d \n", sf, UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0+(sf*UE->frame_parms.samples_per_tti), + UE->frame_parms.samples_per_tti); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_READ_NS, rxs ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_READ_NS_MISSING, UE->frame_parms.samples_per_tti - rxs); @@ -1119,6 +1122,9 @@ void *UE_thread(void *arg) { rxp, UE->frame_parms.samples_per_tti-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0, UE->frame_parms.nb_antennas_rx); + + LOG_D(PHY,"grab signal for subframe %d offset %d Nbsamples %d \n", sf, UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0+(sf*UE->frame_parms.samples_per_tti), + UE->frame_parms.samples_per_tti-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_SF9, 0 ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_READ_NS, rxs ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_READ_NS_MISSING, (UE->frame_parms.samples_per_tti-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0) - rxs); @@ -1152,18 +1158,37 @@ void *UE_thread(void *arg) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_SF9, 1 ); // read in first symbol of next frame and adjust for timing drift + for (i=0; i<UE->frame_parms.nb_antennas_rx; i++) + { + rxp[i] = (void*)&UE->common_vars.rxdata[i][0]; + } + + rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, + ×tamp1, + rxp, + UE->frame_parms.nb_prefix_samples0 - rx_off_diff, + UE->frame_parms.nb_antennas_rx); + + for (i=0; i<UE->frame_parms.nb_antennas_rx; i++) + { + rxp[i] = (void*)&UE->common_vars.rxdata[i][UE->frame_parms.nb_prefix_samples0]; + } + rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, ×tamp1, - (void**)rxdata, - UE->frame_parms.ofdm_symbol_size + UE->frame_parms.nb_prefix_samples0 - rx_off_diff, + rxp, + UE->frame_parms.ofdm_symbol_size, UE->frame_parms.nb_antennas_rx); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_SF9, 0 ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_READ_NS, rxs ); - if (rxs != (UE->frame_parms.ofdm_symbol_size + UE->frame_parms.nb_prefix_samples0 - rx_off_diff)) { + if (rxs != (UE->frame_parms.ofdm_symbol_size)) { LOG_E(PHY, "problem in rx 7! expect #samples=%d but got only %d! rx_off_diff=%d\n", UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0 - rx_off_diff, rxs, rx_off_diff); exit_fun("problem in rx 7!"); return &UE_thread_retval; } + UE->rx_offset_diff = rx_off_diff; + LOG_D(PHY,"SET rx_off_diff to %d\n",UE->rx_offset_diff); rx_off_diff = 0; } } @@ -1232,17 +1257,21 @@ void *UE_thread(void *arg) { getchar(); } }// for sf=0..10 + + uint8_t proc_select = 9&1; + UE_rxtx_proc_t *proc = &UE->proc.proc_rxtx[proc_select]; + if ((UE->rx_offset<(5*UE->frame_parms.samples_per_tti)) && - (UE->rx_offset > RX_OFF_MIN) && + (UE->rx_offset > 0) && (rx_correction_timer == 0)) { - rx_off_diff = -UE->rx_offset + RX_OFF_MIN; - LOG_D(PHY,"UE->rx_offset %d > %d, diff %d\n",UE->rx_offset,RX_OFF_MIN,rx_off_diff); + rx_off_diff = -1 ; + LOG_D(PHY,"AbsSubframe %d.%d UE->rx_offset %d > %d, diff %d\n",proc->frame_rx,proc->subframe_rx,UE->rx_offset,0,rx_off_diff); rx_correction_timer = 5; } else if ((UE->rx_offset>(5*UE->frame_parms.samples_per_tti)) && - (UE->rx_offset < ((10*UE->frame_parms.samples_per_tti)-RX_OFF_MIN)) && + (UE->rx_offset < ((10*UE->frame_parms.samples_per_tti))) && (rx_correction_timer == 0)) { // moving to the left so drop rx_off_diff samples - rx_off_diff = 10*UE->frame_parms.samples_per_tti - RX_OFF_MIN - UE->rx_offset; - LOG_D(PHY,"UE->rx_offset %d < %d, diff %d\n",UE->rx_offset,10*UE->frame_parms.samples_per_tti-RX_OFF_MIN,rx_off_diff); + rx_off_diff = 1; + LOG_D(PHY,"AbsSubframe %d.%d UE->rx_offset %d < %d, diff %d\n",proc->frame_rx,proc->subframe_rx,UE->rx_offset,10*UE->frame_parms.samples_per_tti,rx_off_diff); rx_correction_timer = 5; } diff --git a/targets/RT/USER/rru_if4p5_usrp.gtkw b/targets/RT/USER/rru_if4p5_usrp.gtkw index df8de754db63657dad91a994779180c2e6dae4a8..1a13e6d15f1e243af267b137390b0145a2956bec 100644 --- a/targets/RT/USER/rru_if4p5_usrp.gtkw +++ b/targets/RT/USER/rru_if4p5_usrp.gtkw @@ -1,15 +1,15 @@ [*] [*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI -[*] Mon Aug 1 18:43:22 2016 +[*] Sun Jan 15 07:26:50 2017 [*] [dumpfile] "/tmp/openair_dump_eNB.vcd" -[dumpfile_mtime] "Mon Aug 1 18:41:49 2016" -[dumpfile_size] 22622 -[savefile] "/home/papillon/openairinterface5g/targets/RT/USER/rru_if4p5_usrp.gtkw" -[timestart] 0 +[dumpfile_mtime] "Sun Jan 15 07:04:19 2017" +[dumpfile_size] 18140627 +[savefile] "/home/uprru1/oai/openairinterface5g/targets/RT/USER/rru_if4p5_usrp.gtkw" +[timestart] 29977510000 [size] 1301 716 [pos] 309 0 -*-19.793451 29983948856 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 +*-21.793451 29983948856 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 [sst_width] 284 [signals_width] 262 [sst_expanded] 1 @@ -17,10 +17,12 @@ @28 functions.trx_read functions.trx_write +@25 +variables.trx_write_flags[63:0] +@28 functions.trx_write_if functions.send_if4 functions.trx_read_if -@29 functions.recv_if4 @24 variables.trx_ts[63:0] @@ -40,121 +42,8 @@ variables.subframe_number_RX1_eNB[63:0] variables.frame_number_TX1_eNB[63:0] variables.subframe_number_TX1_eNB[63:0] @28 -functions.phy_enb_sfgen +functions.phy_eNB_ofdm_mod_l functions.phy_eNB_slot_fep functions.phy_enb_prach_rx -@24 -variables.dci_info[63:0] -variables.ue0_BO[63:0] -@420 -variables.ue0_BSR[63:0] -variables.ue0_timing_advance[63:0] -@28 -functions.macxface_initiate_ra_proc -functions.macxface_terminate_ra_proc -functions.phy_enb_ulsch_msg3 -functions.macxface_SR_indication -@420 -variables.ue0_SR_ENERGY[63:0] -variables.ue0_SR_THRES[63:0] -@28 -functions.phy_enb_ulsch_decoding0 -@24 -variables.ue0_res0[63:0] -@420 -variables.ue0_rssi0[63:0] -variables.ue0_MCS0[63:0] -variables.ue0_RB0[63:0] -@24 -variables.ue0_ROUND0[63:0] -variables.ue0_SFN0[63:0] -@28 -functions.phy_enb_ulsch_decoding1 -@24 -variables.ue0_res1[63:0] -@420 -variables.ue0_rssi1[63:0] -variables.ue0_MCS1[63:0] -variables.ue0_RB1[63:0] -@24 -variables.ue0_ROUND1[63:0] -variables.ue0_SFN1[63:0] -@28 -functions.phy_enb_ulsch_decoding2 -@24 -variables.ue0_res2[63:0] -@420 -variables.ue0_rssi2[63:0] -variables.ue0_MCS2[63:0] -variables.ue0_RB2[63:0] -@24 -variables.ue0_ROUND2[63:0] -variables.ue0_SFN2[63:0] -@28 -functions.phy_enb_ulsch_decoding3 -@24 -variables.ue0_res3[63:0] -@420 -variables.ue0_rssi3[63:0] -variables.ue0_MCS3[63:0] -variables.ue0_RB3[63:0] -@24 -variables.ue0_ROUND3[63:0] -variables.ue0_SFN3[63:0] -@28 -functions.phy_enb_ulsch_decoding4 -@420 -variables.ue0_rssi4[63:0] -@24 -variables.ue0_res4[63:0] -@420 -variables.ue0_MCS4[63:0] -variables.ue0_RB4[63:0] -@24 -variables.ue0_ROUND4[63:0] -variables.ue0_SFN4[63:0] -@28 -functions.phy_enb_ulsch_decoding5 -@24 -variables.ue0_res5[63:0] -@420 -variables.ue0_rssi5[63:0] -variables.ue0_MCS5[63:0] -variables.ue0_RB5[63:0] -@24 -variables.ue0_ROUND5[63:0] -variables.ue0_SFN5[63:0] -@28 -functions.phy_enb_ulsch_decoding6 -@24 -variables.ue0_res6[63:0] -@420 -variables.ue0_rssi6[63:0] -variables.ue0_MCS6[63:0] -variables.ue0_RB6[63:0] -@24 -variables.ue0_ROUND6[63:0] -variables.ue0_SFN6[63:0] -@28 -functions.phy_enb_ulsch_decoding7 -@24 -variables.ue0_res7[63:0] -@420 -variables.ue0_rssi7[63:0] -variables.ue0_MCS7[63:0] -variables.ue0_RB7[63:0] -@24 -variables.ue0_ROUND7[63:0] -variables.ue0_SFN7[63:0] -@28 -functions.phy_enb_prach_rx -functions.phy_eNB_dlsch_encoding -functions.phy_eNB_dlsch_modulation -functions.phy_eNB_dlsch_scrambling -functions.phy_enb_pdcch_tx -functions.phy_enb_rs_tx -functions.rrc_mac_config_req -functions.rlc_data_req -functions.udp_enb_task [pattern_trace] 1 [pattern_trace] 0 diff --git a/targets/SIMU/USER/channel_sim.c b/targets/SIMU/USER/channel_sim.c index a884fd5624e1c19a563d2888da46f6bed4dc312e..514f87693979ca0f64d884a32881068fa872c92e 100644 --- a/targets/SIMU/USER/channel_sim.c +++ b/targets/SIMU/USER/channel_sim.c @@ -180,7 +180,7 @@ void do_DL_sig(channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][MAX_N //dlsch_abstraction(PHY_vars_UE_g[UE_id]->sinr_dB, rb_alloc, 8); // fill in perfect channel estimates channel_desc_t *desc1 = eNB2UE[att_eNB_id][UE_id][CC_id]; - int32_t **dl_channel_est = PHY_vars_UE_g[UE_id][CC_id]->common_vars.dl_ch_estimates[0]; + int32_t **dl_channel_est = PHY_vars_UE_g[UE_id][CC_id]->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0]; // double scale = pow(10.0,(enb_data[att_eNB_id]->tx_power_dBm + eNB2UE[att_eNB_id][UE_id]->path_loss_dB + (double) PHY_vars_UE_g[UE_id]->rx_total_gain_dB)/20.0); double scale = pow(10.0,(frame_parms->pdsch_config_common.referenceSignalPower+eNB2UE[att_eNB_id][UE_id][CC_id]->path_loss_dB + (double) PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB)/20.0); LOG_D(OCM,"scale =%lf (%d dB)\n",scale,(int) (20*log10(scale))); diff --git a/targets/SIMU/USER/init_lte.c b/targets/SIMU/USER/init_lte.c index 7da3c3dcd193cda9fd6914046f742e0911d336b7..62273185b23445b689c6ae6774cbc763aa420253 100644 --- a/targets/SIMU/USER/init_lte.c +++ b/targets/SIMU/USER/init_lte.c @@ -41,10 +41,11 @@ PHY_VARS_eNB* init_lte_eNB(LTE_DL_FRAME_PARMS *frame_parms, uint8_t eNB_id, uint8_t Nid_cell, + eNB_func_t node_function, uint8_t abstraction_flag) { - int i,j,layer,aa,re; + int i,j; PHY_VARS_eNB* PHY_vars_eNB = malloc(sizeof(PHY_VARS_eNB)); memset(PHY_vars_eNB,0,sizeof(PHY_VARS_eNB)); PHY_vars_eNB->Mod_id=eNB_id; @@ -54,6 +55,7 @@ PHY_VARS_eNB* init_lte_eNB(LTE_DL_FRAME_PARMS *frame_parms, PHY_vars_eNB->frame_parms.nushift = PHY_vars_eNB->frame_parms.Nid_cell%6; phy_init_lte_eNB(PHY_vars_eNB,0,abstraction_flag); + LOG_I(PHY,"init eNB: Node Function %d\n",node_function); LOG_I(PHY,"init eNB: Nid_cell %d\n", frame_parms->Nid_cell); LOG_I(PHY,"init eNB: frame_type %d,tdd_config %d\n", frame_parms->frame_type,frame_parms->tdd_config); LOG_I(PHY,"init eNB: number of ue max %d number of enb max %d number of harq pid max %d\n", @@ -61,27 +63,32 @@ PHY_VARS_eNB* init_lte_eNB(LTE_DL_FRAME_PARMS *frame_parms, LOG_I(PHY,"init eNB: N_RB_DL %d\n", frame_parms->N_RB_DL); LOG_I(PHY,"init eNB: prach_config_index %d\n", frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex); + if (node_function >= NGFI_RRU_IF5) + // For RRU, don't allocate DLSCH/ULSCH Transport channel buffers + return (PHY_vars_eNB); + for (i=0; i<NUMBER_OF_UE_MAX; i++) { + LOG_I(PHY,"Allocating Transport Channel Buffers for DLSCH, UE %d\n",i); for (j=0; j<2; j++) { PHY_vars_eNB->dlsch[i][j] = new_eNB_dlsch(1,8,NSOFT,frame_parms->N_RB_DL,abstraction_flag,frame_parms); - if (!PHY_vars_eNB->dlsch[i][j]) { - LOG_E(PHY,"Can't get eNB dlsch structures for UE %d \n", i); - exit(-1); + LOG_E(PHY,"Can't get eNB dlsch structures for UE %d \n", i); + exit(-1); } else { - LOG_D(PHY,"dlsch[%d][%d] => %p\n",i,j,PHY_vars_eNB->dlsch[i][j]); - PHY_vars_eNB->dlsch[i][j]->rnti=0; + LOG_D(PHY,"dlsch[%d][%d] => %p\n",i,j,PHY_vars_eNB->dlsch[i][j]); + PHY_vars_eNB->dlsch[i][j]->rnti=0; } } - + + LOG_I(PHY,"Allocating Transport Channel Buffer for ULSCH, UE %d\n"); PHY_vars_eNB->ulsch[1+i] = new_eNB_ulsch(MAX_TURBO_ITERATIONS,frame_parms->N_RB_UL, abstraction_flag); - + if (!PHY_vars_eNB->ulsch[1+i]) { LOG_E(PHY,"Can't get eNB ulsch structures\n"); exit(-1); } - + // this is the transmission mode for the signalling channels // this will be overwritten with the real transmission mode by the RRC once the UE is connected PHY_vars_eNB->transmission_mode[i] = frame_parms->nb_antenna_ports_eNB==1 ? 1 : 2; @@ -91,7 +98,7 @@ PHY_VARS_eNB* init_lte_eNB(LTE_DL_FRAME_PARMS *frame_parms, gettimeofday(&ts, NULL); PHY_vars_eNB->ulsch[1+i]->reference_timestamp_ms = ts.tv_sec * 1000 + ts.tv_usec / 1000; int j; - + for (j=0; j<10; j++) { initialize(&PHY_vars_eNB->ulsch[1+i]->loc_rss_list[j]); initialize(&PHY_vars_eNB->ulsch[1+i]->loc_rssi_list[j]); @@ -99,7 +106,7 @@ PHY_VARS_eNB* init_lte_eNB(LTE_DL_FRAME_PARMS *frame_parms, initialize(&PHY_vars_eNB->ulsch[1+i]->loc_timing_advance_list[j]); initialize(&PHY_vars_eNB->ulsch[1+i]->loc_timing_update_list[j]); } - + initialize(&PHY_vars_eNB->ulsch[1+i]->tot_loc_rss_list); initialize(&PHY_vars_eNB->ulsch[1+i]->tot_loc_rssi_list); initialize(&PHY_vars_eNB->ulsch[1+i]->tot_loc_subcarrier_rss_list); @@ -107,37 +114,36 @@ PHY_VARS_eNB* init_lte_eNB(LTE_DL_FRAME_PARMS *frame_parms, initialize(&PHY_vars_eNB->ulsch[1+i]->tot_loc_timing_update_list); #endif } - + // ULSCH for RA PHY_vars_eNB->ulsch[0] = new_eNB_ulsch(MAX_TURBO_ITERATIONS, frame_parms->N_RB_UL, abstraction_flag); - + if (!PHY_vars_eNB->ulsch[0]) { LOG_E(PHY,"Can't get eNB ulsch structures\n"); exit(-1); } - PHY_vars_eNB->dlsch_SI = new_eNB_dlsch(1,8,NSOFT,frame_parms->N_RB_DL, abstraction_flag, frame_parms); LOG_D(PHY,"eNB %d : SI %p\n",eNB_id,PHY_vars_eNB->dlsch_SI); PHY_vars_eNB->dlsch_ra = new_eNB_dlsch(1,8,NSOFT,frame_parms->N_RB_DL, abstraction_flag, frame_parms); LOG_D(PHY,"eNB %d : RA %p\n",eNB_id,PHY_vars_eNB->dlsch_ra); PHY_vars_eNB->dlsch_MCH = new_eNB_dlsch(1,8,NSOFT,frame_parms->N_RB_DL, 0, frame_parms); LOG_D(PHY,"eNB %d : MCH %p\n",eNB_id,PHY_vars_eNB->dlsch_MCH); - - + + PHY_vars_eNB->rx_total_gain_dB=130; - + for(i=0; i<NUMBER_OF_UE_MAX; i++) PHY_vars_eNB->mu_mimo_mode[i].dl_pow_off = 2; - + PHY_vars_eNB->check_for_total_transmissions = 0; - + PHY_vars_eNB->check_for_MUMIMO_transmissions = 0; - + PHY_vars_eNB->FULL_MUMIMO_transmissions = 0; - + PHY_vars_eNB->check_for_SUMIMO_transmissions = 0; - - PHY_vars_eNB->frame_parms.pucch_config_common.deltaPUCCH_Shift = 1; + + PHY_vars_eNB->frame_parms.pucch_config_common.deltaPUCCH_Shift = 1; return (PHY_vars_eNB); } @@ -271,7 +277,7 @@ void init_lte_vars(LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs], PHY_vars_eNB_g[eNB_id] = (PHY_VARS_eNB**) malloc(MAX_NUM_CCs*sizeof(PHY_VARS_eNB*)); for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { - PHY_vars_eNB_g[eNB_id][CC_id] = init_lte_eNB(frame_parms[CC_id],eNB_id,Nid_cell,abstraction_flag); + PHY_vars_eNB_g[eNB_id][CC_id] = init_lte_eNB(frame_parms[CC_id],eNB_id,Nid_cell,eNodeB_3GPP,abstraction_flag); PHY_vars_eNB_g[eNB_id][CC_id]->Mod_id=eNB_id; PHY_vars_eNB_g[eNB_id][CC_id]->CC_id=CC_id; } diff --git a/targets/SIMU/USER/init_lte.h b/targets/SIMU/USER/init_lte.h index bcb257056502c0bcab711555e3e93a805a2b0745..e49c24a15b75c82a568ccdfd4ea79d9aa64a39e0 100644 --- a/targets/SIMU/USER/init_lte.h +++ b/targets/SIMU/USER/init_lte.h @@ -25,6 +25,7 @@ PHY_VARS_eNB* init_lte_eNB(LTE_DL_FRAME_PARMS *frame_parms, uint8_t eNB_id, uint8_t Nid_cell, + eNB_func_t node_function, uint8_t abstraction_flag); PHY_VARS_UE* init_lte_UE(LTE_DL_FRAME_PARMS *frame_parms, diff --git a/targets/SIMU/USER/oaisim.c b/targets/SIMU/USER/oaisim.c index 3a06a627803f3bd3d1d92fdbbb259ca6b5960f55..23665f6763194e2c0e3fc9db8fb90a3d66fa4048 100644 --- a/targets/SIMU/USER/oaisim.c +++ b/targets/SIMU/USER/oaisim.c @@ -1043,19 +1043,19 @@ l2l1_task (void *args_p) write_output ("dlchan0.m", "dlch0", - &(PHY_vars_UE_g[0][0]->common_vars.dl_ch_estimates[0][0][0]), + &(PHY_vars_UE_g[0][0]->common_vars.common_vars_rx_data_per_thread[0].dl_ch_estimates[0][0][0]), (6 * (PHY_vars_UE_g[0][0]->frame_parms.ofdm_symbol_size)), 1, 1); write_output ("dlchan1.m", "dlch1", - &(PHY_vars_UE_g[0][0]->common_vars.dl_ch_estimates[1][0][0]), + &(PHY_vars_UE_g[0][0]->common_vars.common_vars_rx_data_per_thread[0].dl_ch_estimates[1][0][0]), (6 * (PHY_vars_UE_g[0][0]->frame_parms.ofdm_symbol_size)), 1, 1); write_output ("dlchan2.m", "dlch2", - &(PHY_vars_UE_g[0][0]->common_vars.dl_ch_estimates[2][0][0]), + &(PHY_vars_UE_g[0][0]->common_vars.common_vars_rx_data_per_thread[0].dl_ch_estimates[2][0][0]), (6 * (PHY_vars_UE_g[0][0]->frame_parms.ofdm_symbol_size)), 1, 1); diff --git a/targets/SIMU/USER/oaisim_pad.c b/targets/SIMU/USER/oaisim_pad.c index 153a522cd4cdf795f51eb4010e067a03df5be8c9..58589ef8f7e80e5c00748335bb71df9be754ef02 100644 --- a/targets/SIMU/USER/oaisim_pad.c +++ b/targets/SIMU/USER/oaisim_pad.c @@ -859,13 +859,13 @@ void run(int argc, char *argv[]) && (abstraction_flag == 0) && (oai_emulation.info.n_frames == 1)) { write_output ("dlchan0.m", "dlch0", - &(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[0][0][0]), + &(PHY_vars_UE_g[0]->lte_ue_common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][0][0]), (6 * (PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)), 1, 1); write_output ("dlchan1.m", "dlch1", - &(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[1][0][0]), + &(PHY_vars_UE_g[0]->lte_ue_common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[1][0][0]), (6 * (PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)), 1, 1); write_output ("dlchan2.m", "dlch2", - &(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[2][0][0]), + &(PHY_vars_UE_g[0]->lte_ue_common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[2][0][0]), (6 * (PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)), 1, 1); write_output ("pbch_rxF_comp0.m", "pbch_comp0", PHY_vars_UE_g[0]->lte_ue_pbch_vars[0]->rxdataF_comp[0], 6 * 12 * 4, 1, 1);