From d19b10ae06f95ebb6725a3b8593b9aa83f4c938a Mon Sep 17 00:00:00 2001 From: ignasj Date: Tue, 7 Jun 2016 17:44:11 +0300 Subject: [PATCH 001/128] LimeSDR --- cmake_targets/CMakeLists.txt | 20 +- openair3/INTERTASK_INTERFACE | 1 - .../USERSPACE/LIB/Si5351C/CMakeLists.txt | 11 - .../LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.cpp | 872 ------ .../LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.h | 100 - .../USERSPACE/LIB/lms7002m/CMakeLists.txt | 63 - .../USERSPACE/LIB/lms7002m/LMS7002M.cpp | 2612 ----------------- .../LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M.h | 177 -- .../LIB/lms7002m/LMS7002M_RegistersMap.cpp | 68 - .../LIB/lms7002m/LMS7002M_RegistersMap.h | 35 - .../lms7002m/LMS7002M_filtersCalibration.cpp | 861 ------ .../LIB/lms7002m/LMS7002M_parameters.cpp | 601 ---- .../LIB/lms7002m/LMS7002M_parameters.h | 613 ---- .../LIB/lms7002m/LMS7002M_statuses.cpp | 16 - .../LIB/lms7002m/LMS7002M_statuses.h | 48 - .../connectionManager/ConnectionCOM.cpp | 596 ---- .../connectionManager/ConnectionCOM.h | 62 - .../connectionManager/ConnectionManager.cpp | 314 -- .../connectionManager/ConnectionManager.h | 60 - .../connectionManager/ConnectionSPI.cpp | 290 -- .../connectionManager/ConnectionSPI.h | 41 - .../connectionManager/ConnectionUSB.cpp | 762 ----- .../connectionManager/ConnectionUSB.h | 144 - .../lms7002m/connectionManager/IConnection.h | 68 - .../LIB/lms7002m/cpp-feather-ini-parser/INI.h | 639 ---- .../lms7002m/cpp-feather-ini-parser/LICENSE | 21 - .../lms7002m/cpp-feather-ini-parser/README.md | 47 - .../example/example.cpp | 130 - .../cpp-feather-ini-parser/example/file.ini | 5 - .../example/file_ints.ini | 400 --- .../cpp-feather-ini-parser/example/merge.ini | 5 - .../example/project.cbp | 57 - .../example/project.depend | 802 ----- .../USERSPACE/LIB/lms7002m/lms7002_defines.h | 218 -- .../USERSPACE/LIB/lms7002m/lmsComms.cpp | 326 -- .../LMSSDR/USERSPACE/LIB/lms7002m/lmsComms.h | 111 - .../LMSSDR/USERSPACE/LIB/lms7002m/typedefs.h | 18 - .../USERSPACE/LIB/lmsSDR/CMakeLists.txt | 58 - .../LMSSDR/USERSPACE/LIB/lmsSDR/LMS_SDR.cpp | 334 --- .../LMSSDR/USERSPACE/LIB/lmsSDR/LMS_SDR.h | 143 - .../LIB/lmsSDR/LMS_StreamBoard/CMakeLists.txt | 22 - .../LMS_StreamBoard/LMS_StreamBoard.cpp | 770 ----- .../lmsSDR/LMS_StreamBoard/LMS_StreamBoard.h | 107 - .../LMS_StreamBoard/LMS_StreamBoard_FIFO.h | 122 - .../lmsSDR/LMS_StreamBoard/lms7002_defines.h | 215 -- .../lmsSDR/connectionManager/CMakeLists.txt | 34 - .../connectionManager/ConnectionCOM.cpp | 596 ---- .../lmsSDR/connectionManager/ConnectionCOM.h | 62 - .../connectionManager/ConnectionManager.cpp | 319 -- .../connectionManager/ConnectionManager.h | 60 - .../connectionManager/ConnectionSPI.cpp | 313 -- .../lmsSDR/connectionManager/ConnectionSPI.h | 41 - .../connectionManager/ConnectionUSB.cpp | 771 ----- .../lmsSDR/connectionManager/ConnectionUSB.h | 144 - .../lmsSDR/connectionManager/IConnection.h | 68 - .../LIB/lmsSDR/connectionManager/lmsComms.cpp | 325 -- .../LIB/lmsSDR/connectionManager/lmsComms.h | 111 - .../LMSSDR/USERSPACE/LIB/lmsSDR/dataTypes.h | 34 - .../ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/fifo.h | 180 -- .../LMSSDR/USERSPACE/LIB/lmsSDR/ringBuffer.h | 143 - targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp | 335 +-- .../ARCH/LMSSDR/USERSPACE/LIB/sodera_lib.cpp | 723 ----- ...nb_sodera_highband_10MHz_rx19dB_txfull.ini | 1128 ------- ...enb_sodera_highband_5MHz_rx19dB_txfull.ini | 1128 ------- ...sodera_lowband_Lrx_10MHz_rx19dB_txfull.ini | 1128 ------- ..._sodera_lowband_Lrx_5MHz_rx19dB_txfull.ini | 1128 ------- ...sodera_lowband_Wrx_10MHz_rx19dB_txfull.ini | 1128 ------- ..._sodera_lowband_Wrx_5MHz_rx19dB_txfull.ini | 1128 ------- 68 files changed, 141 insertions(+), 23871 deletions(-) delete mode 120000 openair3/INTERTASK_INTERFACE delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/CMakeLists.txt delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.cpp delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.h delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/CMakeLists.txt delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M.cpp delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M.h delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_RegistersMap.cpp delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_RegistersMap.h delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_filtersCalibration.cpp delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_parameters.cpp delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_parameters.h delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_statuses.cpp delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_statuses.h delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionCOM.cpp delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionCOM.h delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionManager.cpp delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionManager.h delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionSPI.cpp delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionSPI.h delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionUSB.cpp delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionUSB.h delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/IConnection.h delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/INI.h delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/LICENSE delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/README.md delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/example.cpp delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/file.ini delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/file_ints.ini delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/merge.ini delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/project.cbp delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/project.depend delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lms7002_defines.h delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lmsComms.cpp delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lmsComms.h delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/typedefs.h delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/CMakeLists.txt delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_SDR.cpp delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_SDR.h delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/CMakeLists.txt delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard.cpp delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard.h delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard_FIFO.h delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/lms7002_defines.h delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/CMakeLists.txt delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionCOM.cpp delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionCOM.h delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionManager.cpp delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionManager.h delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionSPI.cpp delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionSPI.h delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionUSB.cpp delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionUSB.h delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/IConnection.h delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/lmsComms.cpp delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/lmsComms.h delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/dataTypes.h delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/fifo.h delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/ringBuffer.h delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/sodera_lib.cpp delete mode 100644 targets/ARCH/LMSSDR/enb_sodera_highband_10MHz_rx19dB_txfull.ini delete mode 100644 targets/ARCH/LMSSDR/enb_sodera_highband_5MHz_rx19dB_txfull.ini delete mode 100644 targets/ARCH/LMSSDR/enb_sodera_lowband_Lrx_10MHz_rx19dB_txfull.ini delete mode 100644 targets/ARCH/LMSSDR/enb_sodera_lowband_Lrx_5MHz_rx19dB_txfull.ini delete mode 100644 targets/ARCH/LMSSDR/enb_sodera_lowband_Wrx_10MHz_rx19dB_txfull.ini delete mode 100644 targets/ARCH/LMSSDR/enb_sodera_lowband_Wrx_5MHz_rx19dB_txfull.ini diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 2a9cd6bba3..0a8938ced3 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -42,10 +42,6 @@ set (OPENAIR_BIN_DIR ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}) project (OpenAirInterface) -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 ################################################ @@ -523,7 +519,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 ) @@ -570,16 +566,12 @@ 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") 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} @@ -1701,14 +1693,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/openair3/INTERTASK_INTERFACE b/openair3/INTERTASK_INTERFACE deleted file mode 120000 index 4bc54522d8..0000000000 --- a/openair3/INTERTASK_INTERFACE +++ /dev/null @@ -1 +0,0 @@ -../common/utils/itti \ No newline at end of file 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 c331185e17..0000000000 --- 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 88bcb74f3d..0000000000 --- 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 -#include -#include -#include -#include -#include -#include -#include -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; iIsOpen() ) - { - 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 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 clk6freqs; - set clk7freqs; - set 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::iterator it6=clk6freqs.begin(); it6!=clk6freqs.end(); ++it6) - { - for (set::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::iterator it=sharedFreqs.begin(); it!=sharedFreqs.end(); ++it) - { - availableFrequenciesPLLA.insert( pair (*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::iterator it6=clk6freqs.begin(); it6!=clk6freqs.end(); ++it6) - { - availableFrequenciesPLLA.insert( pair(*it6, 0) ); - } - } - if(!clk7satisfied) - { - clocks[7].pllSource = 1; - clk7satisfied = true; - pllBused = true; - for (set::iterator it7=clk7freqs.begin(); it7!=clk7freqs.end(); ++it7) - { - availableFrequenciesPLLB.insert( pair (*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 (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::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 Fmin ? clocks[i].outputFreqHz : (clocks[i].outputFreqHz*((Fmin/clocks[i].outputFreqHz) + ((Fmin%clocks[i].outputFreqHz)!=0))); - while(freq >= Fmin && freq <= Fmax) - { - availableFrequenciesPLLB.insert( pair (freq, 0)); - freq += clocks[i].outputFreqHz; - } - } - } - - bestScore = 0; - //calculate scores for all available frequencies - unsigned long bestVCOB = 0; - for (map::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> 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; iTransferPacket(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 971a2d1d69..0000000000 --- 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 -#include -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 4613e9ce72..0000000000 --- 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 ded70e114f..0000000000 --- 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 -#include -#include "lmsComms.h" -#include "INI.h" -#include -#include -#include -#include "LMS7002M_RegistersMap.h" - -#include -#include - -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 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 addrToWrite; - vector 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 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 addrToWrite; - vector 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 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 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=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=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 addresses; - vector 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 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 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; iGetValue(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 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 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 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 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 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 addrToWrite; - vector dataToWrite; - vector dataReceived; - vector 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 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 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 addrs; - vector 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 addrToRead = mRegistersMap->GetUsedAddresses(0); - vector 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 addrToWrite; - vector 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 addrToRead = mRegistersMap->GetUsedAddresses(0); - vector 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 81234c28a3..0000000000 --- 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 - -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 8c870ffcc0..0000000000 --- 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::const_iterator iter = mChannelA.find(address); - if( iter != mChannelA.end()) - return iter->second.defaultValue; - else - return 0; -} - -void LMS7002M_RegistersMap::InitializeDefaultValues(const std::vector 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 *regMap; - if(channel == 0) - regMap = &mChannelA; - else if(channel == 1) - regMap = &mChannelB; - std::map::const_iterator iter; - iter = regMap->find(address); - if (iter != regMap->end()) - return iter->second.value; - else - return 0; -} - -std::vector LMS7002M_RegistersMap::GetUsedAddresses(const uint8_t channel) const -{ - std::vector 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 5ccda752db..0000000000 --- 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 -#include -#include - -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 parameterList); - uint16_t GetDefaultValue(uint16_t address) const; - std::vector GetUsedAddresses(const uint8_t channel) const; - -protected: - std::map mChannelA; - std::map 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 2f3d38c1b5..0000000000 --- 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 - -///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 b28887d776..0000000000 --- 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 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 3fc4e0be6b..0000000000 --- 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 - -struct LMS7Parameter; -extern std::vector 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 4e00854e14..0000000000 --- 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 43b736bfd5..0000000000 --- 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 6c7fc0d829..0000000000 --- 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#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 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; iwrite("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; iwrite("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; jwrite(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 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 0549472db1..0000000000 --- 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 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 comPortList; - std::vector 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 36f73da5d7..0000000000 --- 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 -#include -#include - -/** @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 names; - IConnection *port = iter->second; - if(port->RefreshDeviceList() > 0) - { - names = port->GetDeviceNames(); - for(unsigned i=0; ifirst; - dev.portIndex = i; - mDevices.push_back(dev); - } - } - } - for(unsigned i=0; iWrite(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 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 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 edd01d3833..0000000000 --- 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 - -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 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 mDevices; - std::vector mDeviceList; - int mOpenedDevice; - std::map 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 e490db4dab..0000000000 --- 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#endif // LINUX - -#include -#include - -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 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 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 79d9bd9b9b..0000000000 --- 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 -#include -#include - -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 GetDeviceNames(); - int RefreshDeviceList(); -protected: - std::vector m_deviceNames; - std::vector 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 b99fe6490b..0000000000 --- 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 - -#ifdef __unix__ - #include - #include -#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; iDeviceCount(); ++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; iEndPointCount(); i++) - if(USBDevicePrimary->EndPoints[i]->Address == 0x01) - { - OutEndPt = USBDevicePrimary->EndPoints[i]; - long len = OutEndPt->MaxPktSize * 64; - OutEndPt->SetXferSize(len); - break; - } - for (int i=0; iEndPointCount(); 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(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; iDeviceCount(); ++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(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(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; iBeginDataXfer((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(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 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; iBeginDataXfer((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(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 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 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 f3048c1842..0000000000 --- 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 -#include -#include -#include -#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 GetDeviceNames(); - int RefreshDeviceList(); - void ClearComm(); -private: - int currentDeviceIndex; - std::string DeviceName(); - - std::vector 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 > 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 5804f1149f..0000000000 --- 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 -#include - -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 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 de54b4e7b4..0000000000 --- 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 -#include -#include -#include -#include -#include - -#define FINI_SAFE -#define FINI_BUFFER_SIZE 128 - -#if __cplusplus >= 201103L - #include - #define FINI_CPP11 - #define ALLOCATE_SECTIONS 100 - #define ALLOCATE_KEYS 5 -#else - #include -#endif - -#ifdef FINI_WIDE_SUPPORT - #include - - 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 - - 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 - static T Convert(U value); - template - static void GetLine(fini_sstream_t& out, T& value); - static void GetLine(fini_sstream_t& out, fini_string_t& value); - template - static size_t GetDataSize(T& value); - static size_t GetDataSize(fini_string_t value); -}; - -/// -template - class INI -{ -public: - typedef T section_t; - typedef U key_t; - typedef V value_t; - typedef INI ini_t; - -///Type definition declarations -#ifdef FINI_CPP11 - typedef typename std::unordered_map keys_t; - typedef typename std::unordered_map sections_t; -#else - typedef typename std::map keys_t; - typedef typename std::map sections_t; -#endif - - typedef typename keys_t::iterator keysit_t; - typedef typename sections_t::iterator sectionsit_t; - - typedef typename std::pair keyspair_t; - typedef typename std::pair 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 - bool set(const W key, const X value) - { return set(Converters::Convert(key), Converters::Convert(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 - X get(const W key, const X def = value_t()) - { return Converters::Convert(get(Converters::Convert(key), Converters::Convert(def))); } - - template - fini_string_t get(const W key, const fini_char_t* def = _T("")) //Handle C string default value without casting - { return Converters::Convert(get(Converters::Convert(key), Converters::Convert(def))); } - - template - Y get(const W section, const X key, const Y def) - { return Converters::Convert(get(Converters::Convert(section), Converters::Convert(key), Converters::Convert(def))); } - - template - 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(Converters::Convert(section), get(Converters::Convert(key), Converters::Convert(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 - 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 value) -{ - return value; -} - -template <> - inline fini_string_t Converters::Convert(const fini_char_t* value) -{ - return value; -} - -template - 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 - 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 7d961cc6e5..0000000000 --- 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 f1245971cd..0000000000 --- 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 -#include "INI.h" - -using namespace std; -``` -... -``` -typedef INI<> ini_t; -//or -//typedef INI 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 462dd241dc..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/example.cpp +++ /dev/null @@ -1,130 +0,0 @@ -#include -#include -#include -#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 - //or - //typedef INI 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 ini_int_t; //Makes things shorter/easier to write - 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 e1c485ba2a..0000000000 --- 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 3d71e76cae..0000000000 --- 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 dfdc381084..0000000000 --- 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 913928a115..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/project.cbp +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - 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 02c743092d..0000000000 --- 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 - - - - "../INI.h" - -1399625159 d:\projects\feather-ini-parser\ini.h - - - - - - - - - - - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\iostream - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\istream - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\ostream - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\ios - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xlocnum - - - - - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\climits - - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\yvals.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 - - - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\sal.h - "codeanalysis\sourceannotations.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 - - -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 - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\limits.h - - -1375351090 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cmath - - - - - - -1379495880 c:\program files (x86)\microsoft visual studio 12.0\vc\include\math.h - - -1379495880 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xtgmath.h - - -1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xtr1common - - -1375351090 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdio - - - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\stdio.h - - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\swprintf.inl - - -1375351090 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib - - - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\stdlib.h - - - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\streambuf - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xiosbase - - - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xlocale - - - - - - - - -1375351090 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstring - - - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\string.h - - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\stdexcept - - - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\exception - - - - - -1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xstddef - - - - - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstddef - - - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\stddef.h - - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\initializer_list - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\eh.h - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\malloc.h - - -1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xstring - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0 - - - - - - - - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\limits - - - - - - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\ymath.h - - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cfloat - - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\float.h - - - -1375351090 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cwchar - - - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\wchar.h - - - - -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 - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility - - - - -1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\utility - - - - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\iosfwd - - - - - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\crtdbg.h - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\type_traits - - - -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 - - -1379495880 c:\program files (x86)\microsoft visual studio 12.0\vc\include\intrin.h - - - - - - - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\setjmp.h - - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\setjmpex.h - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\immintrin.h - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\wmmintrin.h - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\nmmintrin.h - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\smmintrin.h - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\tmmintrin.h - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\pmmintrin.h - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\emmintrin.h - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmmintrin.h - - "xmm_func.h" - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\mmintrin.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 - - - - -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 - - - - - - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\typeinfo - - - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xlocinfo - - - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xlocinfo.h - - - - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\ctype.h - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\locale.h - - -1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xdebug - - - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xfacet - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\system_error - - - - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cerrno - - - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\errno.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 - - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\string - - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\iterator - - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\fstream - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\sstream - - -1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\unordered_map - - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xhash - - - - - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\list - - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\vector - - - -1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\tuple - - - - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\map - - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xtree - - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\iostream - - -1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream - - -1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream - - -1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\ios - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xlocnum - - - - - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\climits - - - -1258271576 c:\program files (x86)\microsoft visual studio 10.0\vc\include\yvals.h - - - - - - - -1260264954 c:\program files (x86)\microsoft visual studio 10.0\vc\include\crtdefs.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 - - -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 - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cmath - - - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cstdio - - - - -1257335008 c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdio.h - - - -1256197836 c:\program files (x86)\microsoft visual studio 10.0\vc\include\swprintf.inl - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cstdlib - - - - -1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdlib.h - - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\streambuf - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xiosbase - - - - -1263118342 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xlocale - - - - - - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cstring - - - - -1260264954 c:\program files (x86)\microsoft visual studio 10.0\vc\include\string.h - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdexcept - - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\exception - - - - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xstddef - - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cstddef - - - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\stddef.h - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\eh.h - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\malloc.h - - -1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xstring - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xmemory - - - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\new - - -1258271576 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility - - - - -1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility - - - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\iosfwd - - - - - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cwchar - - - - -1257335008 c:\program files (x86)\microsoft visual studio 10.0\vc\include\wchar.h - - - - -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 - - -1263118342 c:\program files (x86)\microsoft visual studio 10.0\vc\include\type_traits - - - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\limits - - - - - - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\ymath.h - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cfloat - - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\float.h - - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xtr1common - - -1263118342 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xfwrap - - - - - - - - - - - - -1263118342 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xfwrap1 - - - - - - - - - - - - - - -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 - - - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xlocinfo - - - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xlocinfo.h - - - - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\ctype.h - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\locale.h - - -1263118342 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xdebug - - - - -1260264954 c:\program files (x86)\microsoft visual studio 10.0\vc\include\system_error - - - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cerrno - - - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\errno.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 - - -1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\string - - -1263118342 c:\program files (x86)\microsoft visual studio 10.0\vc\include\fstream - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\sstream - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\unordered_map - - -1263720180 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xhash - - - - - - -1251647994 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xfunctional - - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\list - - - - -1267607544 c:\program files (x86)\microsoft visual studio 10.0\vc\include\memory - - - - - - - - - -1263118342 c:\program files (x86)\microsoft visual studio 10.0\vc\include\intrin.h - - - - - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\setjmp.h - - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\setjmpex.h - - -1251647992 c:\program files (x86)\microsoft visual studio 10.0\vc\include\immintrin.h - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\wmmintrin.h - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\nmmintrin.h - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\smmintrin.h - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\tmmintrin.h - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\pmmintrin.h - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\emmintrin.h - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xmmintrin.h - - "xmm_func.h" - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\mmintrin.h - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\mm3dnow.h - - - - -1258271576 c:\program files (x86)\microsoft visual studio 10.0\vc\include\vector - - - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\map - - -1258271576 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xtree - - - - 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 6b06a51c7e..0000000000 --- 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 5b74ef8975..0000000000 --- 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 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= 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 (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> 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 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 3d94d8ece2..0000000000 --- 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 -#include - -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 outBuffer; - vector inBuffer; - }; - - LMScomms(); - ~LMScomms(); - - virtual TransferStatus TransferPacket(GenericPacket &pkt); - LMSinfo GetInfo(); - void SetDataLogCallback(std::function callback); -protected: - std::function 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 9ae0c25d93..0000000000 --- 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 0225e1d4d6..0000000000 --- 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 1ff4bbf1de..0000000000 --- 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 -#include - -#include -#include -#include -#include -#include - -#define _USE_MATH_DEFINES -#include - -using namespace std; - -typedef enum -{ - LMS_SUCCESS = 0, - LMS_ERROR -} LMS_STATUS; - -LMS_SamplesFIFO rxBuffer(1); -static thread rxThread; -atomic rxStop(1); -atomic rxRunning(0); -atomic rxDroppedSamples(0); -atomic RxDataRate(0); -atomic rxSamplingRate(0); - -LMS_SamplesFIFO txBuffer(1); -static thread txThread; -atomic txStop(1); -atomic txRunning(0); -atomic txDroppedSamples(0); -atomic TxDataRate(0); -atomic 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 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 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; jsamples)[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 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 27a72e351a..0000000000 --- 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 - -#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 02e6bb5ab9..0000000000 --- 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 da9e4a7b8e..0000000000 --- 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 -#include - -/** @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; iTransferPacket(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 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(1024*4); - mTxFIFO = new LMS_StreamBoard_FIFO(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; imDataPort->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(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::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; jmDataPort->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(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::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; jmDataPort->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 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(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 99b3636336..0000000000 --- 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 -#include -#include -#include -#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 samplesI; - std::vector samplesQ; - std::vector 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 *mRxFIFO; - LMS_StreamBoard_FIFO *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 mRxDataRate; - std::atomic mTxDataRate; - std::atomic mRxFIFOfilled; - std::atomic mTxFIFOfilled; - - std::vector 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 833f7a37c0..0000000000 --- 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 -#include -#include -#include -#include -#include -#include - -template -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 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 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 lck(mElementsLock); - mElementsFilled = 0; - mHead = 0; - mTail = 0; - } - - Status GetStatus() - { - Status stats; - std::unique_lock 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 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 c098dfe965..0000000000 --- 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 d9124aaef1..0000000000 --- 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 6c7fc0d829..0000000000 --- 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#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 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; iwrite("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; iwrite("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; jwrite(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 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 0549472db1..0000000000 --- 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 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 comPortList; - std::vector 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 9ec16e0d88..0000000000 --- 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 -#include -#include - -/** @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 names; - IConnection *port = iter->second; - if(port->RefreshDeviceList() > 0) - { - names = port->GetDeviceNames(); - for(unsigned i=0; ifirst; - dev.portIndex = i; - mDevices.push_back(dev); - } - } - } - for(unsigned i=0; iWrite(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 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 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 68819011ff..0000000000 --- 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 - -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 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 mDevices; - std::vector mDeviceList; - int mOpenedDevice; - std::map 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 fb305f9c1c..0000000000 --- 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#endif // LINUX - -#include -#include - -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 0) -// { -// ss << " re443ad(" << toWrite << "): "; -// for(int i=0; iwrite(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 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 79d9bd9b9b..0000000000 --- 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 -#include -#include - -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 GetDeviceNames(); - int RefreshDeviceList(); -protected: - std::vector m_deviceNames; - std::vector 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 148b7b776b..0000000000 --- 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 - -#ifdef __unix__ - #include - #include -#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; iDeviceCount(); ++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; iEndPointCount(); i++) - if(USBDevicePrimary->EndPoints[i]->Address == 0x01) - { - OutEndPt = USBDevicePrimary->EndPoints[i]; - long len = OutEndPt->MaxPktSize * 64; - OutEndPt->SetXferSize(len); - break; - } - for (int i=0; iEndPointCount(); 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(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; iDeviceCount(); ++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(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(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; iBeginDataXfer((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(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 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; iBeginDataXfer((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(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 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 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 f3048c1842..0000000000 --- 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 -#include -#include -#include -#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 GetDeviceNames(); - int RefreshDeviceList(); - void ClearComm(); -private: - int currentDeviceIndex; - std::string DeviceName(); - - std::vector 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 > 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 5804f1149f..0000000000 --- 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 -#include - -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 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 0e5ec66762..0000000000 --- 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 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= 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 (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 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 f811d29302..0000000000 --- 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 -#include - -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 outBuffer; - vector inBuffer; - }; - - LMScomms(const IConnection::eConnectionType port_type); - ~LMScomms(); - - virtual TransferStatus TransferPacket(GenericPacket &pkt); - LMSinfo GetInfo(); - void SetDataLogCallback(std::function callback); -protected: - std::function 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 c97ac7857d..0000000000 --- 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 1868c64af7..0000000000 --- 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 -#include -#include -#include -#include -#include "dataTypes.h" - -class LMS_SamplesFIFO -{ -public: - struct BufferInfo - { - uint32_t size; - uint32_t itemsFilled; - }; - - BufferInfo GetInfo() - { - std::unique_lock lck2(readLock); - std::unique_lock 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 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 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 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 lck(writeLock); - std::unique_lock lck2(readLock); - mBuffer.resize(bufLength); - mHead.store(0); - mTail.store(0); - mElementsFilled.store(0); - } - -protected: - std::vector mBuffer; - std::atomic mHead; - std::atomic mTail; - std::mutex writeLock; - std::mutex readLock; - std::atomic 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 e4882f8924..0000000000 --- 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 -#include -#include -#include - -template -class RingBuffer -{ -public: - struct BufferInfo - { - uint32_t size; - uint32_t itemsFilled; - }; - - BufferInfo GetInfo() - { - unique_lock 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 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 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 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 mBuffer; - std::atomic mHead; - std::atomic 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 4be796e588..3775be13b4 100644 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp @@ -40,30 +40,21 @@ #include #include -#include "common_lib.h" -#include "LMS_SDR.h" -#include "LMS7002M.h" -#include "Si5351C.h" -#include "LMS_StreamBoard.h" -#include "LMS7002M_RegistersMap.h" - #include /** @addtogroup _LMSSDR_PHY_RF_INTERFACE_ * @{ */ +#include +#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 +#define NUMBUFF 32 + 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}; @@ -74,18 +65,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. @@ -100,16 +96,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 @@ -132,18 +130,17 @@ 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]; + /* 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); @@ -153,201 +150,145 @@ int trx_lms_set_gains(openair0_device* device, openair0_config_t *openair0_cfg) 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); + printf("[LMS] Setting 7002M G_PGA_RBB to %d\n", (uint16_t)gv); + LMS_WriteParam(lms_device,LMS7param(G_PGA_RBB),(uint16_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); + lms_info_str_t list[16]={0}; + int n= LMS_GetDeviceList(list); - - 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"); - - - - lms7->ResetChip(); - - 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"); + 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; + } + + LMS_Init(lms_device); + LMS_EnableCalibCache(lms_device,false); + + 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); } - // Set TX filter - - printf("Tuning TX filter\n"); - opStatus = lms7->TuneTxFilter(LMS7002M::TxFilter::TX_HIGHBAND,device->openair0_cfg[0].tx_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,125); - if (opStatus != LIBLMS7_SUCCESS) { - printf("Warning: Could not tune TX filter to %f MHz\n",device->openair0_cfg[0].tx_bw/1e6); + 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("Tuning RX filter\n"); - - opStatus = lms7->TuneRxFilter(LMS7002M::RxFilter::RX_LPF_LOWBAND,device->openair0_cfg[0].rx_bw/1e6); + printf("Set sample rate %f MHz\n",device->openair0_cfg->sample_rate/1e6); - if (opStatus != LIBLMS7_SUCCESS) { - printf("Warning: Could not tune RX filter to %f MHz\n",device->openair0_cfg[0].rx_bw/1e6); + 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; } + 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); - /* 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)); - } - 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); - } - - opStatus = lms7->SetFrequencySX(LMS7002M::Tx, device->openair0_cfg[0].tx_freq[0]/1e6,30.72); - - 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); - } + printf("Override antenna settings to: RX1_W, TXA_2"); + LMS_SetAntenna(lms_device, LMS_CH_RX, 0, 3); + LMS_SetAntenna(lms_device, LMS_CH_TX, 0, 2); 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 + /*LMS_SetNormalizedGain(lms_device, LMS_CH_TX, 0, 0.175); + LMS_SetNormalizedGain(lms_device, LMS_CH_RX, 0, 0.65);*/ - /* 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); - */ + 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()); - return 0; + 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_I16; + 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_I16; + tx_stream.isTx = true; + 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(int card) { - /* - 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 @@ -364,10 +305,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); @@ -376,7 +319,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) { @@ -385,7 +328,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) { @@ -407,28 +350,28 @@ 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; openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; 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; openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; 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; openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; 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; openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; @@ -445,14 +388,14 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg){ 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/USERSPACE/LIB/sodera_lib.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/sodera_lib.cpp deleted file mode 100644 index 30a2106b34..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/sodera_lib.cpp +++ /dev/null @@ -1,723 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - -/** sodera_lib.c - * - * Author: Raymond Knopp - */ - -#include -#include -#include -#include -#include -#include -#include -#include - - -#include -#include -#include -#include - -#include "common_lib.h" - -#include "lmsComms.h" -#include "LMS7002M.h" -#include "Si5351C.h" -#include "LMS_StreamBoard.h" - -#ifdef __SSE4_1__ -# include -#endif - -#ifdef __AVX2__ -# include -#endif - -using namespace std; - -int num_devices=0; -/*These items configure the underlying asynch stream used by the the sync interface. - */ - -#define BUFFERSIZE 4096 -#define BUFFERSCOUNT 32 -typedef struct -{ - - // -------------------------------- - // variables for SoDeRa configuration - // -------------------------------- - - LMScomms Port; - Si5351C Si; - LMS7002M lmsControl; - LMS_StreamBoard *lmsStream; - - char buffers_rx[BUFFERSIZE*BUFFERSCOUNT]; - int handles[BUFFERSCOUNT]; - int current_handle; - int samples_left_buffer; - - double sample_rate; - // time offset between transmiter timestamp and receiver timestamp; - double tdiff; - - int channelscount; - // -------------------------------- - // Debug and output control - // -------------------------------- - int num_underflows; - int num_overflows; - int num_seq_errors; - - int64_t tx_count; - int64_t rx_count; - openair0_timestamp rx_timestamp; - -} sodera_t; - -typedef struct { - uint8_t reserved[8]; - uint64_t counter; - char data[4080]; -} StreamPacket_t; - -sodera_t sodera_state; - -enum STATUS { - SUCCESS, - FAILURE -}; - -STATUS SPI_write(LMScomms* dataPort, uint16_t address, uint16_t data) -{ - assert(dataPort != 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); - dataPort->TransferPacket(ctrPkt); - return ctrPkt.status == 1 ? SUCCESS : FAILURE; -} - -uint16_t SPI_read(LMScomms* dataPort, uint16_t address) -{ - assert(dataPort != nullptr); - LMScomms::GenericPacket ctrPkt; - ctrPkt.cmd = CMD_BRDSPI_RD; - ctrPkt.outBuffer.push_back((address >> 8) & 0xFF); - ctrPkt.outBuffer.push_back(address & 0xFF); - dataPort->TransferPacket(ctrPkt); - if (ctrPkt.inBuffer.size() > 4) - return ctrPkt.inBuffer[2] * 256 + ctrPkt.inBuffer[3]; - else - return 0; -} - -static int trx_sodera_start(openair0_device *device) -{ - sodera_t *s = (sodera_t*)device->priv; - - - // init recv and send streaming - - printf("Starting LMS Streaming\n"); - s->rx_count = 0; - s->tx_count = 0; - s->rx_timestamp = 0; - s->current_handle = 0; - - // switch off RX - uint16_t regVal = SPI_read(&s->Port,0x0005); - SPI_write(&s->Port,0x0005,regVal & ~0x6); - - - - - - - // USB FIFO reset - LMScomms::GenericPacket ctrPkt; - ctrPkt.cmd = CMD_USB_FIFO_RST; - ctrPkt.outBuffer.push_back(0x01); - s->Port.TransferPacket(ctrPkt); - ctrPkt.outBuffer[0]=0x00; - s->Port.TransferPacket(ctrPkt); - - regVal = SPI_read(&s->Port,0x0005); - // provide timestamp, set streamTXEN, set TX/RX enable - SPI_write(&s->Port,0x0005,(regVal & ~0x20) | 0x6); - - - if (s->channelscount==2) { - SPI_write(&s->Port,0x0001,0x0003); - SPI_write(&s->Port,0x0007,0x000A); - } - else { - SPI_write(&s->Port,0x0001,0x0001); - SPI_write(&s->Port,0x0007,0x0008); - } - - - for (int i=0; i< BUFFERSCOUNT ; i++) - s->handles[i] = s->Port.BeginDataReading(&s->buffers_rx[i*BUFFERSIZE],BUFFERSIZE); - printf("Armed %d transfers\n",BUFFERSCOUNT); - return 0; -} - -static void trx_sodera_end(openair0_device *device) -{ - sodera_t *s = (sodera_t*)device->priv; - - - // stop TX/RX if they were active - uint16_t regVal = SPI_read(&s->Port,0x0005); - SPI_write(&s->Port,0x0005,regVal & ~0x6); - -} - -static int trx_sodera_write(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) -{ - sodera_t *s = (sodera_t*)device->priv; - - - return 0; -} - -#define DEBUG_READ 1 - -static int trx_sodera_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) -{ - sodera_t *s = (sodera_t*)device->priv; - int samples_received=0,i,j; - int nsamps2; // aligned to upper 32 or 16 byte boundary - StreamPacket_t *p; - int16_t sampleI,sampleQ; - char *pktStart; - int offset = 0; - int num_p; - int ind=0; - int buffsize; - int spp; - int bufindex; - - // this assumes that each request is of size 4096 bytes (spp = 4080/4/channelscount) - spp = sizeof(p->data)>>2; // spp = size of payload in samples - spp /= s->channelscount; - -#ifdef DEBUG_READ - printf("\nIn trx_read\n"); - printf("s->current_handle %d\n", s->current_handle); - printf("s->samples_left_buffer %d\n",s->samples_left_buffer); -#endif - // first get rid of remaining samples - if (s->samples_left_buffer > 0) { - buffsize = min(s->samples_left_buffer,nsamps); - pktStart = ((StreamPacket_t*)&s->buffers_rx[s->current_handle*BUFFERSIZE])->data; - pktStart += (spp-s->samples_left_buffer); - const int stepSize = s->channelscount * 3; - - for (int b=0;bchannelscount;ch++) { - // I sample - sampleI = (pktStart[b + 1 + 3*ch]&0x0F)<<8; - sampleI |= (pktStart[b + 3*ch]&0xFF); - sampleI = (sampleI<<4)>>4; - // Q sample - sampleQ = (pktStart[b + 2 + 3*ch]&0x0F)<<8; - sampleQ |= (pktStart[b + 1 + 3*ch]&0xFF); - sampleQ = (sampleQ<<4)>>4; - ((uint32_t*)buff[ch])[ind] = ((uint32_t)sampleI) | (((uint32_t)sampleQ)<<16); - } - ind++; - } - } - if (ind == nsamps) { - s->samples_left_buffer -= nsamps; - s->rx_count += nsamps; - *ptimestamp = s->rx_timestamp; - s->rx_timestamp+=nsamps; - - return(nsamps); - } - else { - s->samples_left_buffer = 0; - nsamps -= ind; - samples_received = ind; - } - - // This is for the left-over part => READ from USB - - - - num_p = nsamps / spp; - if ((nsamps%spp) > 0) - num_p++; - s->samples_left_buffer = (num_p*spp)-nsamps; - - -#ifdef DEBUG_READ - printf("num_p %d\n",num_p); -#endif - const int stepSize = s->channelscount * 3; - - for (i=0;icurrent_handle+i)&(BUFFERSCOUNT-1); - if (s->Port.WaitForReading(s->handles[bufindex],1000) == false) { - printf("[recv] Error: request %d samples (%d/%d) WaitForReading timed out\n",nsamps,bufindex,num_p); - *ptimestamp = s->rx_timestamp; - s->rx_timestamp+=samples_received; - return(samples_received); - } - long bytesToRead=BUFFERSIZE; - if (s->Port.FinishDataReading(&s->buffers_rx[bufindex*BUFFERSIZE],bytesToRead,s->handles[bufindex]) != BUFFERSIZE) { - printf("[recv] Error: request %d samples (%d/%d) WaitForReading timed out\n",nsamps,bufindex,num_p); - *ptimestamp = s->rx_timestamp; - s->rx_timestamp+=samples_received; - return(samples_received); - } - - p = (StreamPacket_t*)&s->buffers_rx[bufindex*BUFFERSIZE]; - // handle timestamp - if ((i==0) & (ind==0)) { // grab the timestamp from HW - *ptimestamp = p->counter; - s->rx_timestamp = p->counter+nsamps; // for next time -#ifdef DEBUG_READ - printf("RX timestamp %d\n",s->rx_timestamp); -#endif - } - else { // check the timestamp - if (i==0) { - if ((s->rx_timestamp + ind) != p->counter) { - printf("Error, RX timestamp error, got %llu, should be %llu\n",p->counter,s->rx_timestamp+ind); - return(ind); - } - } - *ptimestamp = s->rx_timestamp; - s->rx_timestamp+=nsamps; - } - pktStart = p->data; - for (uint16_t b=0;bdata);b+=stepSize) { - for (int ch=0;ch < s->channelscount;ch++) { - // I sample - sampleI = (pktStart[b + 1 + 3*ch]&0x0F)<<8; - sampleI |= (pktStart[b + 3*ch]&0xFF); - sampleI = (sampleI<<4)>>4; - // Q sample - sampleQ = (pktStart[b + 2 + 3*ch]&0x0F)<<8; - sampleQ |= (pktStart[b + 1 + 3*ch]&0xFF); - sampleQ = (sampleQ<<4)>>4; - ((uint32_t*)buff[ch])[ind] = ((uint32_t)sampleI) | (((uint32_t)sampleQ)<<16); - } - ind++; - } - samples_received+=spp; - // schedule a new transmission for this index - s->handles[bufindex] = s->Port.BeginDataReading(&s->buffers_rx[bufindex*BUFFERSIZE],BUFFERSIZE); - s->current_handle=(s->current_handle+1)&(BUFFERSCOUNT-1); - } - - //handle the error code - - s->rx_count += samples_received; - // s->rx_timestamp = s->rx_md.time_spec.to_ticks(s->sample_rate); - - return samples_received; -} - - - -static bool is_equal(double a, double b) -{ - return fabs(a-b) < 1e-6; -} - -int trx_sodera_set_freq(openair0_device* device, openair0_config_t *openair0_cfg, int dummy) { - - sodera_t *s = (sodera_t*)device->priv; - - // s->usrp->set_tx_freq(openair0_cfg[0].tx_freq[0]); - // s->usrp->set_rx_freq(openair0_cfg[0].rx_freq[0]); - - return(0); - -} - -int openair0_set_rx_frequencies(openair0_device* device, openair0_config_t *openair0_cfg) { - - sodera_t *s = (sodera_t*)device->priv; - static int first_call=1; - static double rf_freq,diff; - - // uhd::tune_request_t rx_tune_req(openair0_cfg[0].rx_freq[0]); - - // rx_tune_req.rf_freq_policy = uhd::tune_request_t::POLICY_MANUAL; - // rx_tune_req.rf_freq = openair0_cfg[0].rx_freq[0]; - // rf_freq=openair0_cfg[0].rx_freq[0]; - // s->usrp->set_rx_freq(rx_tune_req); - - return(0); - -} - -int trx_sodera_set_gains(openair0_device* device, - openair0_config_t *openair0_cfg) { - - sodera_t *s = (sodera_t*)device->priv; - - // s->usrp->set_tx_gain(openair0_cfg[0].tx_gain[0]); - // ::uhd::gain_range_t gain_range = s->usrp->get_rx_gain_range(0); - // limit to maximum gain - /* if (openair0_cfg[0].rx_gain[0]-openair0_cfg[0].rx_gain_offset[0] > gain_range.stop()) { - - printf("RX Gain 0 too high, reduce by %f dB\n", - openair0_cfg[0].rx_gain[0]-openair0_cfg[0].rx_gain_offset[0] - gain_range.stop()); - exit(-1); - } - s->usrp->set_rx_gain(openair0_cfg[0].rx_gain[0]-openair0_cfg[0].rx_gain_offset[0]); - printf("Setting SODERA RX gain to %f (rx_gain %f,gain_range.stop() %f)\n", openair0_cfg[0].rx_gain[0]-openair0_cfg[0].rx_gain_offset[0],openair0_cfg[0].rx_gain[0],gain_range.stop()); - */ - return(0); -} - -int trx_sodera_stop(int card) { - return(0); -} - - -rx_gain_calib_table_t calib_table_sodera[] = { - {3500000000.0,44.0}, - {2660000000.0,49.0}, - {2300000000.0,50.0}, - {1880000000.0,53.0}, - {816000000.0,58.0}, - {-1,0}}; - -void set_rx_gain_offset(openair0_config_t *openair0_cfg, int chain_index,int bw_gain_adjust) { - - int i=0; - // loop through calibration table to find best adjustment factor for RX frequency - double min_diff = 6e9,diff,gain_adj=0.0; - if (bw_gain_adjust==1) { - switch ((int)openair0_cfg[0].sample_rate) { - case 30720000: - break; - case 23040000: - gain_adj=1.25; - break; - case 15360000: - gain_adj=3.0; - break; - case 7680000: - gain_adj=6.0; - break; - case 3840000: - gain_adj=9.0; - break; - case 1920000: - gain_adj=12.0; - break; - default: - printf("unknown sampling rate %d\n",(int)openair0_cfg[0].sample_rate); - exit(-1); - break; - } - } - while (openair0_cfg->rx_gain_calib_table[i].freq>0) { - diff = fabs(openair0_cfg->rx_freq[chain_index] - openair0_cfg->rx_gain_calib_table[i].freq); - printf("cal %d: freq %f, offset %f, diff %f\n", - i, - openair0_cfg->rx_gain_calib_table[i].freq, - openair0_cfg->rx_gain_calib_table[i].offset,diff); - if (min_diff > diff) { - min_diff = diff; - openair0_cfg->rx_gain_offset[chain_index] = openair0_cfg->rx_gain_calib_table[i].offset+gain_adj; - } - i++; - } - -} - - -int trx_sodera_get_stats(openair0_device* device) { - - return(0); - -} -int trx_sodera_reset_stats(openair0_device* device) { - - return(0); - -} - - -int openair0_dev_init_sodera(openair0_device* device, openair0_config_t *openair0_cfg) -{ - - sodera_t *s=&sodera_state; - - size_t i; - - // Initialize SODERA device - s->Port.RefreshDeviceList(); - vector deviceNames=s->Port.GetDeviceList(); - - if (deviceNames.size() == 1) { - if (s->Port.Open(0) != IConnection::SUCCESS) { - printf("Cannot open SoDeRa\n"); - exit(-1); - } - LMSinfo devInfo = s->Port.GetInfo(); - printf("Device %s, HW: %d, FW: %d, Protocol %d\n", - GetDeviceName(devInfo.device), - (int)devInfo.hardware, - (int)devInfo.firmware, - (int)devInfo.protocol); - - printf("Configuring Si5351C\n"); - s->Si.Initialize(&s->Port); - s->Si.SetPLL(0, 25000000, 0); - s->Si.SetPLL(1, 25000000, 0); - s->Si.SetClock(0, 27000000, true, false); - s->Si.SetClock(1, 27000000, true, false); - for (int i = 2; i < 8; ++i) - s->Si.SetClock(i, 27000000, false, false); - Si5351C::Status status = s->Si.ConfigureClocks(); - if (status != Si5351C::SUCCESS) - { - printf("Failed to configure Si5351C"); - exit(-1); - } - status = s->Si.UploadConfiguration(); - if (status != Si5351C::SUCCESS) - printf("Failed to upload Si5351C configuration"); - - - printf("Configuring LMS7002\n"); - - int bw_gain_adjust=0; - - - openair0_cfg[0].rx_gain_calib_table = calib_table_sodera; - - switch ((int)openair0_cfg[0].sample_rate) { - case 30720000: - // from usrp_time_offset - openair0_cfg[0].samples_per_packet = 2048; - openair0_cfg[0].tx_sample_advance = 15; - openair0_cfg[0].tx_bw = 20e6; - openair0_cfg[0].rx_bw = 20e6; - openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; - break; - case 15360000: - openair0_cfg[0].samples_per_packet = 2048; - openair0_cfg[0].tx_sample_advance = 45; - openair0_cfg[0].tx_bw = 10e6; - openair0_cfg[0].rx_bw = 10e6; - openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet; - break; - case 7680000: - openair0_cfg[0].samples_per_packet = 1024; - openair0_cfg[0].tx_sample_advance = 50; - openair0_cfg[0].tx_bw = 5e6; - openair0_cfg[0].rx_bw = 5e6; - openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet; - break; - case 1920000: - openair0_cfg[0].samples_per_packet = 256; - openair0_cfg[0].tx_sample_advance = 50; - openair0_cfg[0].tx_bw = 1.25e6; - openair0_cfg[0].rx_bw = 1.25e6; - openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; - break; - default: - printf("Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); - exit(-1); - break; - - } - - s->lmsControl = LMS7002M(&s->Port); - - liblms7_status opStatus; - s->lmsControl.ResetChip(); - opStatus = s->lmsControl.LoadConfig(openair0_cfg[0].configFilename); - - if (opStatus != LIBLMS7_SUCCESS) { - printf("Failed to load configuration file %s\n",openair0_cfg[0].configFilename); - exit(-1); - } - opStatus = s->lmsControl.UploadAll(); - - if (opStatus != LIBLMS7_SUCCESS) { - printf("Failed to upload configuration file\n"); - exit(-1); - } - - opStatus = s->lmsControl.SetFrequencySX(LMS7002M::Tx, openair0_cfg[0].tx_freq[0]/1e6,30.72); - - if (opStatus != LIBLMS7_SUCCESS) { - printf("Cannot set TX frequency %f MHz\n",openair0_cfg[0].tx_freq[0]/1e6); - exit(-1); - } - - opStatus = s->lmsControl.SetFrequencySX(LMS7002M::Rx, openair0_cfg[0].rx_freq[0]/1e6,30.72); - - if (opStatus != LIBLMS7_SUCCESS) { - printf("Cannot set RX frequency %f MHz\n",openair0_cfg[0].rx_freq[0]/1e6); - exit(-1); - } - - - - // this makes RX/TX sampling rates equal - opStatus = s->lmsControl.Modify_SPI_Reg_bits(EN_ADCCLKH_CLKGN,0); - if (opStatus != LIBLMS7_SUCCESS) { - printf("Cannot modify SPI (EN_ADCCLKH_CLKGN)\n"); - exit(-1); - } - opStatus = s->lmsControl.Modify_SPI_Reg_bits(CLKH_OV_CLKL_CGEN,2); - if (opStatus != LIBLMS7_SUCCESS) { - printf("Cannot modify SPI (CLKH_OV_CLKL_CGEN)\n"); - exit(-1); - } - - const float cgen_freq_MHz = 245.76; - const int interpolation = 0; // real interpolation = 2 - const int decimation = 0; // real decimation = 2 - opStatus = s->lmsControl.SetInterfaceFrequency(cgen_freq_MHz,interpolation,decimation); - if (opStatus != LIBLMS7_SUCCESS) { - printf("Cannot SetInterfaceFrequency (%f,%d,%d)\n",cgen_freq_MHz,interpolation,decimation); - exit(-1); - } - /* - // Run calibration procedure - float txrx_calibrationBandwidth_MHz = 5; - opStatus = s->lmsControl.CalibrateTx(txrx_calibrationBandwidth_MHz); - if (opStatus != LIBLMS7_SUCCESS){ - printf("TX Calibration failed\n"); - exit(-1); - } - opStatus = s->lmsControl.CalibrateRx(txrx_calibrationBandwidth_MHz); - if (opStatus != LIBLMS7_SUCCESS){ - printf("RX Calibration failed\n"); - exit(-1); - } - */ - - s->lmsStream = new LMS_StreamBoard(&s->Port); - LMS_StreamBoard::Status opStreamStatus; - // this will configure that sampling rate at output of FPGA - opStreamStatus = s->lmsStream->ConfigurePLL(&s->Port,openair0_cfg[0].sample_rate,openair0_cfg[0].sample_rate,90); - if (opStatus != LIBLMS7_SUCCESS){ - printf("Sample rate programming failed\n"); - exit(-1); - } - - /* - ::uhd::gain_range_t gain_range = s->usrp->get_rx_gain_range(i); - // limit to maximum gain - if (openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i] > gain_range.stop()) { - - printf("RX Gain %lu too high, lower by %f dB\n",i,openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i] - gain_range.stop()); - exit(-1); - } - s->usrp->set_rx_gain(openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i],i); - printf("RX Gain %lu %f (%f) => %f (max %f)\n",i, - openair0_cfg[0].rx_gain[i],openair0_cfg[0].rx_gain_offset[i], - openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i],gain_range.stop()); - } - } - for(i=0;iusrp->get_tx_num_channels();i++) { - if (iusrp->set_tx_rate(openair0_cfg[0].sample_rate,i); - s->usrp->set_tx_bandwidth(openair0_cfg[0].tx_bw,i); - printf("Setting tx freq/gain on channel %lu/%lu: BW %f (readback %f)\n",i,s->usrp->get_tx_num_channels(),openair0_cfg[0].tx_bw/1e6,s->usrp->get_tx_bandwidth(i)/1e6); - s->usrp->set_tx_freq(openair0_cfg[0].tx_freq[i],i); - s->usrp->set_tx_gain(openair0_cfg[0].tx_gain[i],i); - } - } - */ - - // create tx & rx streamer - - //stream_args_rx.args["spp"] = str(boost::format("%d") % 2048);//(openair0_cfg[0].rx_num_channels*openair0_cfg[0].samples_per_packet)); - - /* - for (i=0;iusrp->get_rx_rate(i)/1e6) << std::endl; - std::cout << boost::format("Actual RX frequency: %fGHz...") % (s->usrp->get_rx_freq(i)/1e9) << std::endl; - std::cout << boost::format("Actual RX gain: %f...") % (s->usrp->get_rx_gain(i)) << std::endl; - std::cout << boost::format("Actual RX bandwidth: %fM...") % (s->usrp->get_rx_bandwidth(i)/1e6) << std::endl; - std::cout << boost::format("Actual RX antenna: %s...") % (s->usrp->get_rx_antenna(i)) << std::endl; - } - } - - for (i=0;iusrp->get_tx_rate(i)/1e6) << std::endl; - std::cout << boost::format("Actual TX frequency: %fGHz...") % (s->usrp->get_tx_freq(i)/1e9) << std::endl; - std::cout << boost::format("Actual TX gain: %f...") % (s->usrp->get_tx_gain(i)) << std::endl; - std::cout << boost::format("Actual TX bandwidth: %fM...") % (s->usrp->get_tx_bandwidth(i)/1e6) << std::endl; - std::cout << boost::format("Actual TX antenna: %s...") % (s->usrp->get_tx_antenna(i)) << std::endl; - } - */ - } - else { - printf("Please connect SoDeRa\n"); - exit(-1); - } - - device->priv = s; - device->trx_start_func = trx_sodera_start; - device->trx_write_func = trx_sodera_write; - device->trx_read_func = trx_sodera_read; - device->trx_get_stats_func = trx_sodera_get_stats; - device->trx_reset_stats_func = trx_sodera_reset_stats; - device->trx_end_func = trx_sodera_end; - device->trx_stop_func = trx_sodera_stop; - device->trx_set_freq_func = trx_sodera_set_freq; - device->trx_set_gains_func = trx_sodera_set_gains; - - s->sample_rate = openair0_cfg[0].sample_rate; - s->channelscount = openair0_cfg[0].rx_num_channels; - - // TODO: - 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 e4e420c334..0000000000 --- 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 a3c1aa2e6f..0000000000 --- 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 f47d3bf433..0000000000 --- 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 34ce70c888..0000000000 --- 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_10MHz_rx19dB_txfull.ini b/targets/ARCH/LMSSDR/enb_sodera_lowband_Wrx_10MHz_rx19dB_txfull.ini deleted file mode 100644 index a0793ad395..0000000000 --- a/targets/ARCH/LMSSDR/enb_sodera_lowband_Wrx_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] -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=0x9555 -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=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 -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 -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=0x356A -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=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 -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=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 -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 -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=0x0048 -0x0085=0x0001 -0x0088=0x04F0 -0x0459=0x0000 -0x0394=0x0000 -0x010E=0x0285 -0x02A0=0x0000 -0x002B=0x4032 -0x039C=0x0000 -0x02D2=0x0000 -0x0581=0xC89D -0x045D=0x0000 -0x0245=0x0000 -0x002A=0x0086 -0x0118=0x018C -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 -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=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 -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=0x3652 -0x025B=0x0000 -0x0290=0x0000 -0x02DF=0x0000 -0x0291=0x0000 -0x029C=0x0000 -0x008B=0x2756 -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=0xB409 -0x04CC=0x0000 -0x02A5=0x0000 -0x0257=0x0000 -0x04D6=0x0000 -0x04A6=0x0000 -0x049A=0x0000 -0x049B=0x0000 -0x0097=0x0000 -0x011E=0x061D -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_Wrx_5MHz_rx19dB_txfull.ini b/targets/ARCH/LMSSDR/enb_sodera_lowband_Wrx_5MHz_rx19dB_txfull.ini deleted file mode 100644 index 0243742f32..0000000000 --- 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 From 094f439626250f3dc5e28714a13d924f9083a2de Mon Sep 17 00:00:00 2001 From: luhan wang Date: Wed, 21 Sep 2016 09:18:31 +0200 Subject: [PATCH 002/128] comment in phy_procedures_lte_eNb.c --- openair1/SCHED/phy_procedures_lte_eNb.c | 2 +- .../CONF/rcc.band7.tm1.50PRB.if4p5.conf | 14 +++++++------- .../CONF/rcc.band7.tm1.50PRB.if5.usrpb210.conf | 6 +++--- targets/RT/USER/lte-enb.c | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 980fa3335a..18c986c39e 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1923,7 +1923,7 @@ void prach_procedures(PHY_VARS_eNB *eNB) { eNB->UE_stats[(uint32_t)UE_id].UE_timing_offset = preamble_delay_list[preamble_max]&0x1FFF; //limit to 13 (=11+2) bits eNB->UE_stats[(uint32_t)UE_id].sector = 0; - LOG_D(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure (UE_id %d) with preamble %d, energy %d.%d dB, delay %d\n", + LOG_I(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure (UE_id %d) with preamble %d, energy %d.%d dB, delay %d\n", eNB->Mod_id, eNB->CC_id, frame, 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.50PRB.if4p5.conf index b264993dd4..5fc097f0df 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if4p5.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if4p5.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; @@ -67,9 +67,9 @@ eNBs = srs_ackNackST =; srs_MaxUpPts =;*/ - pusch_p0_Nominal = -90; + pusch_p0_Nominal = -102; 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 +85,7 @@ eNBs = rach_messagePowerOffsetGroupB = ; */ rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -108; + rach_preambleInitialReceivedTargetPower = -104; rach_preambleTransMax = 10; rach_raResponseWindowSize = 10; rach_macContentionResolutionTimer = 48; @@ -155,9 +155,9 @@ 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 = "00:13:95:1f:a0:af"; + local_address = "90:e2:ba:c5:fc:04"; 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/rcc.band7.tm1.50PRB.if5.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if5.usrpb210.conf index 4929f39b3b..edf698b077 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.50PRB.if5.usrpb210.conf @@ -155,9 +155,9 @@ 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 = "00:13:95:1f:a0:af"; + local_address = "90:e2:ba:c5:fc:04"; 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/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 9d4b0f1aeb..09901ccd88 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -191,7 +191,7 @@ static inline void thread_top_init(char *thread_name, exit_fun("Error setting deadline scheduler"); } - LOG_I( HW, "[SCHED] eNB %s deadline thread (TID %ld) started on CPU %d\n", gettid(), thread_name,sched_getcpu() ); + LOG_I( HW, "[SCHED] eNB %s deadline thread started on CPU %d\n", thread_name,sched_getcpu() ); #else //LOW_LATENCY int policy, s, j; From 8c37787e236f73a5fd9629fefa8f23dcb270cbca Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Wed, 19 Oct 2016 09:30:42 +0200 Subject: [PATCH 003/128] added 25 PRB rru file --- .../rru.band7.tm1.if4p5.25PRB.usrpb210.conf | 193 ++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.25PRB.usrpb210.conf 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 0000000000..7806e917ac --- /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 = "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"; + tr_preference = "raw_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"; + }; + } +); From 25ab1c35ee43551d1fdec740a7aae0e361607d99 Mon Sep 17 00:00:00 2001 From: luhan wang Date: Thu, 20 Oct 2016 14:18:32 +0200 Subject: [PATCH 004/128] modifications for if4p5 UDP --- targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c | 969 +++++++++--------- 1 file changed, 487 insertions(+), 482 deletions(-) diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c index 11aa8ed9ba..7d5fecbbf2 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c @@ -1,482 +1,487 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ -/*! \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 - * \date 2015 - * \version 0.2 - * \company Eurecom - * \maintainer: navid.nikaein@eurecom.fr - * \note - * \warning - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "vcd_signal_dumper.h" - -#include "common_lib.h" -#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]; - - -uint16_t pck_seq_num = 1; -uint16_t pck_seq_num_cur=0; -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; - int local_port=0, remote_port=0; - int sock_dom=0; - int sock_type=0; - int sock_proto=0; - int enable=1; - - if (device->host_type == RRH_HOST ) { - local_ip = device->openair0_cfg->my_addr; - local_port = device->openair0_cfg->my_port; - remote_ip = "0.0.0.0"; - remote_port = 0; - printf("[%s] local ip addr %s port %d\n", "RRH", local_ip, local_port); - } else { - local_ip = device->openair0_cfg->my_addr; - local_port = device->openair0_cfg->my_port; - remote_ip = device->openair0_cfg->remote_addr; - remote_port = device->openair0_cfg->remote_port; - printf("[%s] local ip addr %s port %d\n","BBU", local_ip, local_port); - } - - /* Open socket to send on */ - sock_dom=AF_INET; - sock_type=SOCK_DGRAM; - sock_proto=IPPROTO_UDP; - - if ((eth->sockfd[Mod_id] = 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])); - } - - addr_len[Mod_id] = 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); - - - 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); - - - /* set reuse address flag */ - if (setsockopt(eth->sockfd[Mod_id], 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) { - 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)); - } - - return 0; -} - -int trx_eth_read_udp_IF4p5(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; - 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]); - if (bytes_received ==-1) { - eth->num_rx_errors++; - perror("ETHERNET IF4p5 READ (payload): "); - exit(-1); - } else { - eth->rx_actual_nsamps = bytes_received>>1; - eth->rx_count++; - } - } - - eth->rx_nsamps = nsamps; - return(bytes_received); -} - -int trx_eth_write_udp_IF4p5(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) { - - int nblocks = nsamps; - int bytes_sent = 0; - - eth_state_t *eth = (eth_state_t*)device->priv; - int Mod_id = device->Mod_id; - - ssize_t packet_size; - - if (flags == IF4p5_PDLFFT) { - 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_PRACH) { - packet_size = UDP_IF4p5_PRACH_SIZE_BYTES; - } else { - printf("trx_eth_write_udp_IF4p5: unknown flags %d\n",flags); - return(-1); - } - - eth->tx_nsamps = nblocks; - - bytes_sent = sendto(eth->sockfd[Mod_id], - buff[0], - packet_size, - 0, - (struct sockaddr*)&dest_addr[Mod_id], - addr_len[Mod_id]); - - if (bytes_sent == -1) { - eth->num_tx_errors++; - perror("ETHERNET WRITE: "); - exit(-1); - } else { - eth->tx_actual_nsamps = bytes_sent>>1; - eth->tx_count++; - } - - return (bytes_sent); -} - -int trx_eth_write_udp(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags) { - - 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; - eth->tx_nsamps=nsamps; - - for (i=0;ipck_header.seq_num = pck_seq_num; - //eth->pck_header.antenna_id = 1+(i<<1); - //eth->pck_header.timestamp = timestamp; - *(uint16_t *)buff2 = pck_seq_num; - *(uint16_t *)(buff2 + sizeof(uint16_t)) = 1+(i<<1); - *(openair0_timestamp *)(buff2 + sizeof(int32_t)) = timestamp; - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TX_SEQ_NUM, pck_seq_num); - - while(bytes_sent < UDP_PACKET_SIZE_BYTES(nsamps)) { -#if DEBUG - printf("------- TX ------: buff2 current position=%d remaining_bytes=%d bytes_sent=%d \n", - (void *)(buff2+bytes_sent), - UDP_PACKET_SIZE_BYTES(nsamps) - bytes_sent, - bytes_sent); -#endif - /* Send packet */ - bytes_sent += sendto(eth->sockfd[Mod_id], - buff2, - UDP_PACKET_SIZE_BYTES(nsamps), - sendto_flag, - (struct sockaddr*)&dest_addr[Mod_id], - addr_len[Mod_id]); - - if ( bytes_sent == -1) { - eth->num_tx_errors++; - perror("ETHERNET WRITE: "); - exit(-1); - } else { -#if DEBUG - printf("------- TX ------: nu=%d an_id=%d ts%d bytes_send=%d\n", - *(int16_t *)buff2, - *(int16_t *)(buff2 + sizeof(int16_t)), - *(openair0_timestamp *)(buff2 + sizeof(int32_t)), - bytes_sent); - dump_packet((device->host_type == BBU_HOST)? "BBU":"RRH", buff2, UDP_PACKET_SIZE_BYTES(nsamps), TX_FLAG); -#endif - 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; - } - } - /* tx buffer values restored */ - *(int32_t *)buff2 = temp0; - *(openair0_timestamp *)(buff2 + sizeof(int32_t)) = temp1; - } - - return (bytes_sent-APP_HEADER_SIZE_BYTES)>>2; -} - - - -int trx_eth_read_udp(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc) { - - 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; - int i=0; - - eth->rx_nsamps=nsamps; - - for (i=0;isockfd[Mod_id], - buff2, - UDP_PACKET_SIZE_BYTES(nsamps), - rcvfrom_flag, - (struct sockaddr *)&dest_addr[Mod_id], - (socklen_t *)&addr_len[Mod_id]); - - if (bytes_received ==-1) { - eth->num_rx_errors++; - if (errno == EAGAIN) { - again_cnt++; - usleep(10); - if (again_cnt == 1000) { - perror("ETHERNET READ: "); - exit(-1); - } else { - printf("AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN \n"); - goto again; - } - } else if (errno == EWOULDBLOCK) { - block_cnt++; - usleep(10); - if (block_cnt == 1000) { - perror("ETHERNET READ: "); - exit(-1); - } else { - printf("BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK \n"); - goto again; - } - } - } else { -#if DEBUG - printf("------- RX------: nu=%d an_id=%d ts%d bytes_recv=%d\n", - *(int16_t *)buff2, - *(int16_t *)(buff2 + sizeof(int16_t)), - *(openair0_timestamp *)(buff2 + sizeof(int32_t)), - bytes_received); - dump_packet((device->host_type == BBU_HOST)? "BBU":"RRH", buff2, UDP_PACKET_SIZE_BYTES(nsamps),RX_FLAG); -#endif - - /* store the timestamp value from packet's header */ - *timestamp = *(openair0_timestamp *)(buff2 + sizeof(int32_t)); - /* store the sequence number of the previous packet received */ - if (pck_seq_num_cur == 0) { - pck_seq_num_prev = *(uint16_t *)buff2; - } else { - pck_seq_num_prev = pck_seq_num_cur; - } - /* 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 ))){ - 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); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RX_SEQ_NUM_PRV,pck_seq_num_prev); - eth->rx_actual_nsamps=bytes_received>>2; - eth->rx_count++; - } - - } - /* tx buffer values restored */ - *(int32_t *)buff2 = temp0; - *(openair0_timestamp *)(buff2 + sizeof(int32_t)) = temp1; - - } - return (bytes_received-APP_HEADER_SIZE_BYTES)>>2; -} - - - - -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; - - - /* a BBU client sents to RRH a set of configuration parameters (openair0_config_t) - so that RF front end is configured appropriately and - frame/packet size etc. can be set */ - - 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: "); - exit(0); - } - - return 0; -} - -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; - - 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); - - /* RRH receives from BBU openair0_config_t */ - if (recvfrom(eth->sockfd[Mod_id], - msg, - msg_len, - 0, - (struct sockaddr *)&dest_addr[Mod_id], - (socklen_t *)&addr_len[Mod_id])==-1) { - perror("ETHERNET: "); - 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); */ - /* 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); */ - /* 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); */ - return 0; -} +/******************************************************************************* + OpenAirInterface + Copyright(c) 1999 - 2014 Eurecom + + OpenAirInterface is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + + OpenAirInterface is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OpenAirInterface.The full GNU General Public License is + included in this distribution in the file called "COPYING". If not, + see . + + Contact Information + OpenAirInterface Admin: openair_admin@eurecom.fr + OpenAirInterface Tech : openair_tech@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr + + Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE + + *******************************************************************************/ +/*! \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 + * \date 2015 + * \version 0.2 + * \company Eurecom + * \maintainer: navid.nikaein@eurecom.fr + * \note + * \warning + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "vcd_signal_dumper.h" + +#include "common_lib.h" +#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]; + + +uint16_t pck_seq_num = 1; +uint16_t pck_seq_num_cur=0; +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; + int local_port=0, remote_port=0; + int sock_dom=0; + int sock_type=0; + int sock_proto=0; + int enable=1; + + if (device->host_type == RRH_HOST ) { + local_ip = device->openair0_cfg->my_addr; + local_port = device->openair0_cfg->my_port; + remote_ip = "0.0.0.0"; + remote_port = 0; + printf("[%s] local ip addr %s port %d\n", "RRH", local_ip, local_port); + } else { + local_ip = device->openair0_cfg->my_addr; + local_port = device->openair0_cfg->my_port; + remote_ip = device->openair0_cfg->remote_addr; + remote_port = device->openair0_cfg->remote_port; + printf("[%s] local ip addr %s port %d\n","BBU", local_ip, local_port); + } + + /* Open socket to send on */ + sock_dom=AF_INET; + sock_type=SOCK_DGRAM; + sock_proto=IPPROTO_UDP; + + if ((eth->sockfd[Mod_id] = 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])); + } + + addr_len[Mod_id] = 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); + + + 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); + + + /* set reuse address flag */ + if (setsockopt(eth->sockfd[Mod_id], 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) { + 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)); + } + + return 0; +} + +int trx_eth_read_udp_IF4p5(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc) { + + // Read nblocks info from packet itself + int nblocks = nsamps; + 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]); + + 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[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++; + 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; + } + } 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 { + *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); +} + +int trx_eth_write_udp_IF4p5(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) { + + int nblocks = nsamps; + int bytes_sent = 0; + + eth_state_t *eth = (eth_state_t*)device->priv; + int Mod_id = device->Mod_id; + + ssize_t packet_size; + + if (flags == IF4p5_PDLFFT) { + 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_PRACH) { + packet_size = UDP_IF4p5_PRACH_SIZE_BYTES; + } else { + printf("trx_eth_write_udp_IF4p5: unknown flags %d\n",flags); + return(-1); + } + + eth->tx_nsamps = nblocks; + + bytes_sent = sendto(eth->sockfd[Mod_id], + buff[0], + packet_size, + 0, + (struct sockaddr*)&dest_addr[Mod_id], + addr_len[Mod_id]); + + if (bytes_sent == -1) { + eth->num_tx_errors++; + perror("ETHERNET WRITE: "); + exit(-1); + } else { + eth->tx_actual_nsamps = bytes_sent>>1; + eth->tx_count++; + } + + return (bytes_sent); +} + +int trx_eth_write_udp(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags) { + + 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; + eth->tx_nsamps=nsamps; + + for (i=0;ipck_header.seq_num = pck_seq_num; + //eth->pck_header.antenna_id = 1+(i<<1); + //eth->pck_header.timestamp = timestamp; + *(uint16_t *)buff2 = pck_seq_num; + *(uint16_t *)(buff2 + sizeof(uint16_t)) = 1+(i<<1); + *(openair0_timestamp *)(buff2 + sizeof(int32_t)) = timestamp; + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TX_SEQ_NUM, pck_seq_num); + + while(bytes_sent < UDP_PACKET_SIZE_BYTES(nsamps)) { +#if DEBUG + printf("------- TX ------: buff2 current position=%d remaining_bytes=%d bytes_sent=%d \n", + (void *)(buff2+bytes_sent), + UDP_PACKET_SIZE_BYTES(nsamps) - bytes_sent, + bytes_sent); +#endif + /* Send packet */ + bytes_sent += sendto(eth->sockfd[Mod_id], + buff2, + UDP_PACKET_SIZE_BYTES(nsamps), + sendto_flag, + (struct sockaddr*)&dest_addr[Mod_id], + addr_len[Mod_id]); + + if ( bytes_sent == -1) { + eth->num_tx_errors++; + perror("ETHERNET WRITE: "); + exit(-1); + } else { +#if DEBUG + printf("------- TX ------: nu=%d an_id=%d ts%d bytes_send=%d\n", + *(int16_t *)buff2, + *(int16_t *)(buff2 + sizeof(int16_t)), + *(openair0_timestamp *)(buff2 + sizeof(int32_t)), + bytes_sent); + dump_packet((device->host_type == BBU_HOST)? "BBU":"RRH", buff2, UDP_PACKET_SIZE_BYTES(nsamps), TX_FLAG); +#endif + eth->tx_actual_nsamps=bytes_sent>>2; + eth->tx_count++; + pck_seq_num++; + if ( pck_seq_num > MAX_PACKET_SEQ_NUM(nsamps,device->openair0_cfg->samples_per_frame) ) pck_seq_num = 1; + } + } + /* tx buffer values restored */ + *(int32_t *)buff2 = temp0; + *(openair0_timestamp *)(buff2 + sizeof(int32_t)) = temp1; + } + + return (bytes_sent-APP_HEADER_SIZE_BYTES)>>2; +} + + + +int trx_eth_read_udp(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc) { + + 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; + int i=0; + + eth->rx_nsamps=nsamps; + + for (i=0;isockfd[Mod_id], + buff2, + UDP_PACKET_SIZE_BYTES(nsamps), + rcvfrom_flag, + (struct sockaddr *)&dest_addr[Mod_id], + (socklen_t *)&addr_len[Mod_id]); + + if (bytes_received ==-1) { + eth->num_rx_errors++; + if (errno == EAGAIN) { + again_cnt++; + usleep(10); + if (again_cnt == 1000) { + perror("ETHERNET READ: "); + exit(-1); + } else { + printf("AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN \n"); + goto again; + } + } else if (errno == EWOULDBLOCK) { + block_cnt++; + usleep(10); + if (block_cnt == 1000) { + perror("ETHERNET READ: "); + exit(-1); + } else { + printf("BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK \n"); + goto again; + } + } + } else { +#if DEBUG + printf("------- RX------: nu=%d an_id=%d ts%d bytes_recv=%d\n", + *(int16_t *)buff2, + *(int16_t *)(buff2 + sizeof(int16_t)), + *(openair0_timestamp *)(buff2 + sizeof(int32_t)), + bytes_received); + dump_packet((device->host_type == BBU_HOST)? "BBU":"RRH", buff2, UDP_PACKET_SIZE_BYTES(nsamps),RX_FLAG); +#endif + + /* store the timestamp value from packet's header */ + *timestamp = *(openair0_timestamp *)(buff2 + sizeof(int32_t)); + /* store the sequence number of the previous packet received */ + if (pck_seq_num_cur == 0) { + pck_seq_num_prev = *(uint16_t *)buff2; + } else { + pck_seq_num_prev = pck_seq_num_cur; + } + /* 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==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); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RX_SEQ_NUM_PRV,pck_seq_num_prev); + eth->rx_actual_nsamps=bytes_received>>2; + eth->rx_count++; + } + + } + /* tx buffer values restored */ + *(int32_t *)buff2 = temp0; + *(openair0_timestamp *)(buff2 + sizeof(int32_t)) = temp1; + + } + return (bytes_received-APP_HEADER_SIZE_BYTES)>>2; +} + + + + +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; + + + /* a BBU client sents to RRH a set of configuration parameters (openair0_config_t) + so that RF front end is configured appropriately and + frame/packet size etc. can be set */ + + 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: "); + exit(0); + } + + return 0; +} + +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; + + 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); + + /* RRH receives from BBU openair0_config_t */ + if (recvfrom(eth->sockfd[Mod_id], + msg, + msg_len, + 0, + (struct sockaddr *)&dest_addr[Mod_id], + (socklen_t *)&addr_len[Mod_id])==-1) { + perror("ETHERNET: "); + 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); */ + /* 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); */ + /* 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); */ + return 0; +} From 08499a69e2ed74157188b35ac4a74740a9444e6d Mon Sep 17 00:00:00 2001 From: luhan wang Date: Thu, 20 Oct 2016 14:19:18 +0200 Subject: [PATCH 005/128] modifications for IF4p5 UDP transport --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 104 +++++++++++++++++-------- 1 file changed, 72 insertions(+), 32 deletions(-) mode change 100644 => 100755 openair1/PHY/LTE_TRANSPORT/if4_tools.c 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 26e19df2a4..1176450ddb --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -41,7 +41,8 @@ #include "PHY/defs.h" #include "PHY/TOOLS/alaw_lut.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) { @@ -57,6 +58,9 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type uint16_t *data_block=NULL, *i=NULL; + IF4p5_header_t *packet_header=NULL; + eth_state_t *eth = (eth_state_t*) (eNB->ifdevice.priv); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); if (packet_type == IF4p5_PDLFFT) { @@ -65,10 +69,14 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type 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_idsymbols_per_tti; symbol_id++) { @@ -80,8 +88,8 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type 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, @@ -101,10 +109,14 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type 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); + 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, frame, subframe); for (symbol_id=0; symbol_idsymbols_per_tti; symbol_id++) { @@ -116,8 +128,8 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type 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; + packet_header->frame_status &= ~(0x000f<<26); + packet_header->frame_status |= (symbol_id&0x000f)<<26; if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice, symbol_id, @@ -134,16 +146,25 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type } else if (packet_type == IF4p5_PRACH) { // FIX: hard coded prach samples length db_fulllength = 840*2; + 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_prach_header(packet_header, frame, subframe); - 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); + if (eth->flags == ETH_RAW_IF4p5_MODE) { + memcpy((int16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t), + (&rxsigF[0][k]), + db_fulllength*sizeof(int16_t)); + } else { + memcpy((int16_t*)(tx_buffer + sizeof_IF4p5_header_t), + (&rxsigF[0][k]), + db_fulllength*sizeof(int16_t)); + } - 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, @@ -171,6 +192,7 @@ 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 ); @@ -191,12 +213,18 @@ 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) { @@ -234,11 +262,17 @@ void recv_IF4p5(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_t } else if (*packet_type == IF4p5_PRACH) { // 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)); - + + if (eth->flags == ETH_RAW_IF4p5_MODE) { + memcpy((&rxsigF[0][0]), + (int16_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES+sizeof_IF4p5_header_t), + db_fulllength*sizeof(int16_t)); + } else { + memcpy((&rxsigF[0][0]), + (int16_t*) (rx_buffer+sizeof_IF4p5_header_t), + db_fulllength*sizeof(int16_t)); + } + } else { AssertFatal(1==0, "recv_IF4p5 - Unknown packet_type %x", *packet_type); } @@ -290,6 +324,12 @@ 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); + if (eth->flags == ETH_RAW_IF4p5_MODE) { + eNB->ifbuffer.tx = malloc(RAW_IF4p5_PRACH_SIZE_BYTES); + eNB->ifbuffer.rx = malloc(RAW_IF4p5_PRACH_SIZE_BYTES); + } else { + eNB->ifbuffer.tx = malloc(UDP_IF4p5_PRACH_SIZE_BYTES); + eNB->ifbuffer.rx = malloc(UDP_IF4p5_PRACH_SIZE_BYTES); + } } From 5affbe3848196e8819ede04b23857c0915b992b5 Mon Sep 17 00:00:00 2001 From: luhan wang Date: Thu, 20 Oct 2016 17:32:56 +0200 Subject: [PATCH 006/128] added resynchronization parameters to PHY_VARS_eNB --- openair1/PHY/defs.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 3532fa3c6f..40444d284f 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -410,6 +410,8 @@ typedef struct PHY_VARS_eNB_s { int single_thread_flag; openair0_rf_map rf_map; int abstraction_flag; + int iframe_offset; + int isubframe_offset; void (*do_prach)(struct PHY_VARS_eNB_s *eNB); void (*fep)(struct PHY_VARS_eNB_s *eNB); int (*td)(struct PHY_VARS_eNB_s *eNB,int UE_id,int harq_pid,int llr8_flag); From db8c2a05370628af0435f08ebfa51b22346b83c6 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 23 Oct 2016 23:29:21 -0700 Subject: [PATCH 007/128] update of ETHERNET interfaces (removal of global variables). --- targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c | 79 +++++++------ targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c | 104 ++++++++---------- .../ETHERNET/USERSPACE/LIB/ethernet_lib.c | 68 ++++++------ .../ETHERNET/USERSPACE/LIB/ethernet_lib.h | 16 ++- 4 files changed, 134 insertions(+), 133 deletions(-) diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c index 126030d3d4..1bd3c068ef 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c @@ -54,16 +54,14 @@ #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; @@ -85,30 +83,29 @@ 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); + 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); } @@ -121,7 +118,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; } @@ -131,7 +128,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; @@ -164,7 +160,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); @@ -202,7 +198,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; @@ -221,7 +216,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); @@ -245,7 +240,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; @@ -263,7 +257,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); @@ -306,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); @@ -321,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;isub_type; if (test_header->sub_type == IF4p5_PDLFFT) { @@ -334,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); @@ -356,7 +357,6 @@ int trx_eth_read_raw_IF4p5(openair0_device *device, openair0_timestamp *timestam 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; @@ -372,7 +372,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) { @@ -388,7 +388,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; @@ -404,7 +403,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) { @@ -419,7 +418,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; @@ -427,7 +425,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) { @@ -439,7 +437,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; } @@ -449,7 +447,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; @@ -457,7 +454,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) { @@ -469,7 +466,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 7d5fecbbf2..fc8c175ae9 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c @@ -54,9 +54,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; @@ -65,9 +65,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; @@ -96,43 +94,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; @@ -144,8 +141,7 @@ int trx_eth_read_udp_IF4p5(openair0_device *device, openair0_timestamp *timestam int nblocks = nsamps; 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]); @@ -155,12 +151,12 @@ int trx_eth_read_udp_IF4p5(openair0_device *device, openair0_timestamp *timestam while(bytes_received == -1) { again: - bytes_received = recvfrom(eth->sockfd[Mod_id], + bytes_received = recvfrom(eth->sockfd, buff[0], packet_size, 0, - (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++; if (errno == EAGAIN) { @@ -206,7 +202,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; @@ -223,12 +218,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++; @@ -246,7 +241,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; @@ -280,12 +274,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++; @@ -321,7 +315,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; @@ -350,12 +343,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++; @@ -401,7 +394,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==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))) { + 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); @@ -424,7 +417,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; @@ -437,9 +429,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); } @@ -449,7 +442,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; @@ -457,31 +449,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 6079781ba1..45778849b2 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -52,9 +52,9 @@ #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 num_devices_eth = 0; +//struct sockaddr_in dest_addr[MAX_INST]; +//int dest_addr_len[MAX_INST]; int trx_eth_start(openair0_device *device) { @@ -119,13 +119,12 @@ int trx_eth_start(openair0_device *device) { 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 ) { + if ( close(eth->sockfd) <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); + printf("[%s] socket has been successfully closed.\n",(device->host_type == BBU_HOST)? "BBU":"RRH"); } } @@ -133,15 +132,15 @@ void trx_eth_end(openair0_device *device) { 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) { + + if (sendto(eth->sockfd,msg,msg_len,0,(struct sockaddr *)ð->dest_addr,eth->addr_len)==-1) { perror("ETHERNET: "); exit(0); } - + return 0; } @@ -149,19 +148,21 @@ int trx_eth_request(openair0_device *device, void *msg, ssize_t msg_len) { 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], + + if (recvfrom(eth->sockfd, msg, msg_len, 0, - (struct sockaddr *)&dest_addr[Mod_id], - (socklen_t *)&dest_addr_len[Mod_id])==-1) { - perror("ETHERNET: "); - exit(0); - } - + (struct sockaddr *)ð->dest_addr, + (socklen_t *)ð->addr_len)==-1) { + perror("ETHERNET: recv_from in trx_eth_reply "); + exit(0); + } + + + return 0; } @@ -191,7 +192,6 @@ 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]; @@ -204,7 +204,7 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) { /****************** socket level options ************************/ switch(option) { case SND_BUF_SIZE: /* transmit socket buffer size */ - if (setsockopt(eth->sockfd[Mod_id], + if (setsockopt(eth->sockfd, SOL_SOCKET, SO_SNDBUF, &value,sizeof(value))) { @@ -215,7 +215,7 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) { break; case RCV_BUF_SIZE: /* receive socket buffer size */ - if (setsockopt(eth->sockfd[Mod_id], + if (setsockopt(eth->sockfd, SOL_SOCKET, SO_RCVBUF, &value,sizeof(value))) { @@ -228,7 +228,7 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) { case RCV_TIMEOUT: timeout.tv_sec = value/1000000; timeout.tv_usec = value%1000000;//less than rt_period? - if (setsockopt(eth->sockfd[Mod_id], + if (setsockopt(eth->sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout,sizeof(timeout))) { @@ -241,7 +241,7 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) { case SND_TIMEOUT: timeout.tv_sec = value/1000000000; timeout.tv_usec = value%1000000000;//less than rt_period? - if (setsockopt(eth->sockfd[Mod_id], + if (setsockopt(eth->sockfd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout,sizeof(timeout))) { @@ -255,27 +255,27 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) { /******************* 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)); + strncpy(ifr.ifr_name,eth->if_name, sizeof(ifr.ifr_name)); ifr.ifr_mtu =value; - if (ioctl(eth->sockfd[Mod_id],SIOCSIFMTU,(caddr_t)&ifr) < 0 ) + 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[Mod_id],ifr.ifr_mtu); + 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[Mod_id], sizeof(ifr.ifr_name)); + strncpy(ifr.ifr_name,eth->if_name, sizeof(ifr.ifr_name)); ifr.ifr_qlen =value; - if (ioctl(eth->sockfd[Mod_id],SIOCSIFTXQLEN,(caddr_t)&ifr) < 0 ) + 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[Mod_id],ifr.ifr_qlen); + 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); + 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) { @@ -290,8 +290,8 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) { 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]); + 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); @@ -307,7 +307,7 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) { break; case RING_PAR: - ret=snprintf(system_cmd,sizeof(system_cmd),"ethtool -G %s val %d",eth->if_name[Mod_id],value); + 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) { @@ -351,7 +351,7 @@ int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth } printf("[ETHERNET]: Initializing openair0_device for %s ...\n", ((device->host_type == BBU_HOST) ? "BBU": "RRH")); - device->Mod_id = num_devices_eth++; + 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; @@ -383,7 +383,7 @@ int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth //device->trx_read_func = trx_eth_read_udp_IF4p5; } - eth->if_name[device->Mod_id] = eth_params->local_if_name; + eth->if_name = eth_params->local_if_name; device->priv = eth; /* device specific */ diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h index 0d80dbd023..9c65561566 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h @@ -62,11 +62,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 */ From 3c7ec4e41623cf94b2da41008a2da3487a9b90f7 Mon Sep 17 00:00:00 2001 From: luhan wang Date: Thu, 27 Oct 2016 07:47:47 +0200 Subject: [PATCH 008/128] added gtkw files for rcc --- targets/RT/USER/rcc_if4.gtkw | 161 +++++++++++++++++++++++++++++++++++ targets/RT/USER/rcc_if5.gtkw | 154 +++++++++++++++++++++++++++++++++ 2 files changed, 315 insertions(+) create mode 100644 targets/RT/USER/rcc_if4.gtkw create mode 100644 targets/RT/USER/rcc_if5.gtkw diff --git a/targets/RT/USER/rcc_if4.gtkw b/targets/RT/USER/rcc_if4.gtkw new file mode 100644 index 0000000000..e099e466c1 --- /dev/null +++ b/targets/RT/USER/rcc_if4.gtkw @@ -0,0 +1,161 @@ +[*] +[*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI +[*] Sat Aug 6 15:00:27 2016 +[*] +[dumpfile] "/tmp/openair_dump_eNB.vcd" +[dumpfile_mtime] "Sat Aug 6 14:59:21 2016" +[dumpfile_size] 991809002 +[savefile] "/home/fourmi/openairinterface5g/targets/RT/USER/rcc_if4.gtkw" +[timestart] 0 +[size] 1301 716 +[pos] 309 0 +*-19.793451 7382528436 -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 +[sst_vpaned_height] 294 +@24 +variables.trx_ts[63:0] +variables.trx_tst[63:0] +@28 +functions.recv_if4 +functions.send_if4 +functions.eNB_thread_rxtx0 +@24 +variables.frame_number_RX0_eNB[63:0] +variables.subframe_number_RX0_eNB[63:0] +variables.frame_number_TX0_eNB[63:0] +variables.subframe_number_TX0_eNB[63:0] +@28 +functions.phy_procedures_eNb_tx0 +functions.phy_procedures_eNb_rx_common0 +functions.phy_procedures_eNb_rx_uespec0 +functions.eNB_thread_rxtx1 +@24 +variables.frame_number_RX1_eNB[63:0] +variables.subframe_number_RX1_eNB[63:0] +variables.frame_number_TX1_eNB[63:0] +variables.subframe_number_TX1_eNB[63:0] +@29 +functions.phy_procedures_eNb_tx1 +@28 +functions.phy_procedures_eNb_rx_common1 +functions.phy_procedures_eNb_rx_uespec1 +functions.phy_enb_sfgen +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/RT/USER/rcc_if5.gtkw b/targets/RT/USER/rcc_if5.gtkw new file mode 100644 index 0000000000..d64a9ca0fb --- /dev/null +++ b/targets/RT/USER/rcc_if5.gtkw @@ -0,0 +1,154 @@ +[*] +[*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI +[*] Sun Jul 31 13:30:42 2016 +[*] +[dumpfile] "/tmp/openair_dump_eNB.vcd" +[dumpfile_mtime] "Sun Jul 31 13:21:59 2016" +[dumpfile_size] 18273240 +[savefile] "/home/fourmi/openairinterface5g/targets/RT/USER/rcc_if5.gtkw" +[timestart] 24070893000 +[size] 1301 716 +[pos] 309 0 +*-19.793451 29026062100 -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 +[sst_vpaned_height] 294 +@24 +variables.trx_ts[63:0] +variables.trx_tst[63:0] +@28 +functions.send_if5 +functions.recv_if5 +functions.eNB_thread_rxtx0 +@24 +variables.frame_number_RX0_eNB[63:0] +variables.subframe_number_RX0_eNB[63:0] +variables.frame_number_TX0_eNB[63:0] +variables.subframe_number_TX0_eNB[63:0] +@28 +functions.eNB_thread_rxtx1 +@24 +variables.frame_number_RX1_eNB[63:0] +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_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 From 727cdb4a871755f19399625bf4765ec223d9fa7e Mon Sep 17 00:00:00 2001 From: luhan wang Date: Thu, 27 Oct 2016 09:45:56 +0200 Subject: [PATCH 009/128] updates for udp IF4p5 --- cmake_targets/CMakeLists.txt | 2 +- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 4 + targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c | 10 ++- targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c | 74 ++++++++++--------- .../ETHERNET/USERSPACE/LIB/ethernet_lib.c | 74 ++++++++++++------- .../CONF/rcc.band7.tm1.50PRB.if4p5.conf | 4 +- targets/RT/USER/lte-enb.c | 12 ++- 7 files changed, 113 insertions(+), 67 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 5e86d59378..c1507de61b 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -664,7 +664,7 @@ add_boolean_option(ENABLE_NEW_MULTICAST False "specific to oaisim") add_boolean_option(EXMIMO_IOT True "????") add_boolean_option(LARGE_SCALE False "specific to oaisim: defines max eNB=2 and max UE=120") add_boolean_option(LOCALIZATION False "???") -add_integer_option(MAX_NUM_CCs 1 "????") +add_integer_option(MAX_NUM_CCs 2 "????") add_boolean_option(MU_RECEIVER False "????") add_boolean_option(NEW_FFT True "????") add_boolean_option(OPENAIR1 True "????") diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 1176450ddb..1bf2f4b2d0 100755 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -222,10 +222,14 @@ void recv_IF4p5(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_t data_block = (uint16_t*) (rx_buffer+sizeof_IF4p5_header_t); } + + *frame = ((packet_header->frame_status)>>6)&0xffff; *subframe = ((packet_header->frame_status)>>22)&0x000f; + *packet_type = packet_header->sub_type; + printf("CC_id %d : frame %d, subframe %d\n",eNB->CC_id,*frame,*subframe); if (*packet_type == IF4p5_PDLFFT) { *symbol_number = ((packet_header->frame_status)>>26)&0x000f; diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c index 126030d3d4..00500f2e02 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c @@ -311,6 +311,9 @@ int trx_eth_read_raw_IF4p5(openair0_device *device, openair0_timestamp *timestam 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[Mod_id]); +#endif bytes_received = recv(eth->sockfd[Mod_id], buff[0], @@ -321,7 +324,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;isub_type; if (test_header->sub_type == IF4p5_PDLFFT) { diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c index 7d5fecbbf2..0e9f8d4730 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c @@ -54,9 +54,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; @@ -96,7 +96,7 @@ 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); } @@ -107,32 +107,32 @@ int eth_socket_init_udp(openair0_device *device) { bzero((void *)&(local_addr[i]), sizeof(local_addr[i])); } - addr_len[Mod_id] = sizeof(struct sockaddr_in); + eth->udp.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->udp.dest_addr.sin_family = AF_INET; + inet_pton(AF_INET,remote_ip,&(dest_addr.sin_addr.s_addr)); + eth->udp.dest_addr.sin_port=htons(remote_port); + inet_ntop(AF_INET, &(eth->udp.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); + device->local_addr.sin_family = AF_INET; + inet_pton(AF_INET,local_ip,&(device->local_addr.sin_addr.s_addr)); + device->local_addr.sin_port=htons(local_port); + inet_ntop(AF_INET, &(device->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 *)ð->udp.local_addr,addr_len[Mod_id])<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 mod_%d to %s:%d\n","RRH",Mod_id,str_local,ntohs(eth->udp.local_addr.sin_port)); } return 0; @@ -155,11 +155,11 @@ int trx_eth_read_udp_IF4p5(openair0_device *device, openair0_timestamp *timestam while(bytes_received == -1) { again: - bytes_received = recvfrom(eth->sockfd[Mod_id], + bytes_received = recvfrom(eth->sockfd, buff[0], packet_size, 0, - (struct sockaddr *)&dest_addr[Mod_id], + (struct sockaddr *)ð->udp.dest_addr, (socklen_t *)&addr_len[Mod_id]); if (bytes_received ==-1) { eth->num_rx_errors++; @@ -223,11 +223,11 @@ 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], + (struct sockaddr*)ð->udp.dest_addr, addr_len[Mod_id]); if (bytes_sent == -1) { @@ -280,11 +280,11 @@ 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], + (struct sockaddr*)ð->udp.dest_addr, addr_len[Mod_id]); if ( bytes_sent == -1) { @@ -350,12 +350,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 *)ð->udp.dest_addr, + (socklen_t *)&device->udp.addr_len); if (bytes_received ==-1) { eth->num_rx_errors++; @@ -437,9 +437,13 @@ 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); + + printf("Sending configuration to device %p (%d.%d.%d.%d)\n",device, + eth->udp.dest_addr[3],eth->udp.dest_addr[2],eth->udp.dest_addr[1],eth->udp.dest_addr[0],msg_len); - if (sendto(eth->sockfd[Mod_id],msg,msg_len,0,(struct sockaddr *)&dest_addr[Mod_id],addr_len[Mod_id])==-1) { + if (sendto(eth->sockfd,msg,msg_len,0,(struct sockaddr *)ð->udp.dest_addr,device->udp.addr_len)==-1) { perror("ETHERNET: "); + printf("addr_len[%d] : %d, msg_len %d\n",Mod_id,device->udp.addr_len,msg_len); exit(0); } @@ -457,15 +461,15 @@ 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->udp.local_addr.sin_addr), str, INET_ADDRSTRLEN); + inet_ntop(AF_INET, &(eth->udp.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], + (struct sockaddr *)ð->udp.dest_addr, (socklen_t *)&addr_len[Mod_id])==-1) { perror("ETHERNET: "); exit(0); @@ -473,15 +477,15 @@ int eth_get_dev_conf_udp(openair0_device *device) { 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->udp.dest_addr.sin_addr), str1, INET_ADDRSTRLEN); */ + /* device->openair0_cfg->remote_port =ntohs(eth->udp.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->udp.local_addr.sin_addr), str, INET_ADDRSTRLEN); */ + /* device->openair0_cfg->my_port =ntohs(eth->udp.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 6079781ba1..b9900c3364 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -52,9 +52,9 @@ #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 num_devices_eth = 0; +//struct sockaddr_in dest_addr[MAX_INST]; +//int dest_addr_len[MAX_INST]; int trx_eth_start(openair0_device *device) { @@ -121,7 +121,7 @@ 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 ) { + if ( close(eth->sockfd) <0 ) { perror("ETHERNET: Failed to close socket"); exit(0); } else { @@ -137,10 +137,17 @@ int trx_eth_request(openair0_device *device, void *msg, ssize_t msg_len) { 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); - } + + if ((eth->flags == ETH_RAW_MODE) || (eth->flags == ETH_RAW_IF4p5_MODE)) + if (sendto(eth->sockfd,msg,msg_len,0,(struct sockaddr *)ð->raw.dest_addr,eth->raw.dest_addr_len)==-1) { + perror("ETHERNET: "); + exit(0); + } + else + if (sendto(eth->sockfd,msg,msg_len,0,(struct sockaddr *)ð->udp.dest_addr,eth->udp.dest_addr_len)==-1) { + perror("ETHERNET: "); + exit(0); + } return 0; } @@ -152,16 +159,33 @@ int trx_eth_reply(openair0_device *device, void *msg, ssize_t msg_len) { 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); - } - + + if ((eth->flags == ETH_RAW_MODE) || (eth->flags == ETH_RAW_IF4p5_MODE)) { + + if (recvfrom(eth->sockfd, + msg, + msg_len, + 0, + (struct sockaddr *)ð->raw.dest_addr, + (socklen_t *)ð->raw.dest_addr_len)==-1) { + perror("ETHERNET: "); + exit(0); + } + } + else { + if (recvfrom(eth->sockfd, + msg, + msg_len, + 0, + (struct sockaddr *)ð->udp.dest_addr, + (socklen_t *)ð->udp.dest_addr_len)==-1) { + perror("ETHERNET: "); + exit(0); + } + } + + + return 0; } @@ -204,7 +228,7 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) { /****************** socket level options ************************/ switch(option) { case SND_BUF_SIZE: /* transmit socket buffer size */ - if (setsockopt(eth->sockfd[Mod_id], + if (setsockopt(eth->sockfd, SOL_SOCKET, SO_SNDBUF, &value,sizeof(value))) { @@ -215,7 +239,7 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) { break; case RCV_BUF_SIZE: /* receive socket buffer size */ - if (setsockopt(eth->sockfd[Mod_id], + if (setsockopt(eth->sockfd, SOL_SOCKET, SO_RCVBUF, &value,sizeof(value))) { @@ -228,7 +252,7 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) { case RCV_TIMEOUT: timeout.tv_sec = value/1000000; timeout.tv_usec = value%1000000;//less than rt_period? - if (setsockopt(eth->sockfd[Mod_id], + if (setsockopt(eth->sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout,sizeof(timeout))) { @@ -241,7 +265,7 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) { case SND_TIMEOUT: timeout.tv_sec = value/1000000000; timeout.tv_usec = value%1000000000;//less than rt_period? - if (setsockopt(eth->sockfd[Mod_id], + if (setsockopt(eth->sockfd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout,sizeof(timeout))) { @@ -257,7 +281,7 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) { 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 ) + 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[Mod_id],ifr.ifr_mtu); @@ -267,7 +291,7 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) { 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 ) + 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[Mod_id],ifr.ifr_qlen); @@ -351,7 +375,7 @@ int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth } printf("[ETHERNET]: Initializing openair0_device for %s ...\n", ((device->host_type == BBU_HOST) ? "BBU": "RRH")); - device->Mod_id = num_devices_eth++; + 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; 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.50PRB.if4p5.conf index 5fc097f0df..7890736e5e 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if4p5.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if4p5.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; @@ -67,7 +68,7 @@ eNBs = srs_ackNackST =; srs_MaxUpPts =;*/ - pusch_p0_Nominal = -102; + pusch_p0_Nominal = -96; pusch_alpha = "AL1"; pucch_p0_Nominal = -104; msg3_delta_Preamble = 6; @@ -100,6 +101,7 @@ eNBs = ue_TimersAndConstants_t311 = 10000; ue_TimersAndConstants_n310 = 20; ue_TimersAndConstants_n311 = 1; + ue_TransmissionMode = 1; } ); diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index fd5d38f696..25b816f4f1 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -981,11 +981,11 @@ void rx_fh_if4p5(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,"Received Timestamp (IF4p5) doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d,CCid %d)\n",proc->subframe_rx,*subframe,eNB->CC_id); 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,"Received Timestamp (IF4p5) 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); exit_fun("Exiting"); } } else { @@ -1276,7 +1276,8 @@ static void* eNB_thread_single( void* param ) { subframe++; } - LOG_D(PHY,"eNB Fronthaul thread, frame %d, subframe %d\n",frame,subframe); + 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); @@ -1400,6 +1401,7 @@ void init_eNB_proc(int inst) { } //for multiple CCs: setup master and slaves + /* for (CC_id=0; CC_id= CC_id) eNB->proc.slave_proc[i] = &(PHY_vars_eNB_g[inst][i+1]->proc); } } - } + }*/ /* setup PHY proc TX sync mechanism */ @@ -1614,6 +1616,8 @@ 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->iframe_offset = -1; + eNB->isubframe_offset = -1; 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]]); switch (node_function[CC_id]) { From 5e1d462aa9b4d5110eaea35294e8b74b0c968cfd Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Thu, 27 Oct 2016 09:56:23 +0200 Subject: [PATCH 010/128] resynch for initial RF acqusition --- openair3/COMMON/as_message.h | 579 +++++++++++++++++- openair3/INTERTASK_INTERFACE | 1 - openair3/NAS/COMMON/API/NETWORK/as_message.h | 579 +++++++++++++++++- openair3/NAS/COMMON/commonDef.h | 343 ++++++++++- openair3/NAS/COMMON/networkDef.h | 279 ++++++++- .../rru.band7.tm1.50PRB.if5.usrpb210.conf | 6 +- .../rru.band7.tm1.if4p5.25PRB.usrpb210.conf | 6 +- .../rru.band7.tm1.if4p5.50PRB.usrpb210.conf | 17 +- targets/RT/USER/lte-enb.c | 12 + 9 files changed, 1804 insertions(+), 18 deletions(-) mode change 120000 => 100644 openair3/COMMON/as_message.h delete mode 120000 openair3/INTERTASK_INTERFACE mode change 120000 => 100644 openair3/NAS/COMMON/API/NETWORK/as_message.h mode change 120000 => 100644 openair3/NAS/COMMON/commonDef.h mode change 120000 => 100644 openair3/NAS/COMMON/networkDef.h diff --git a/openair3/COMMON/as_message.h b/openair3/COMMON/as_message.h deleted file mode 120000 index 3bfc76865a..0000000000 --- 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 0000000000..30810a325e --- /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/INTERTASK_INTERFACE b/openair3/INTERTASK_INTERFACE deleted file mode 120000 index 4bc54522d8..0000000000 --- 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 ef8d3686fd..0000000000 --- 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 0000000000..30810a325e --- /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/commonDef.h b/openair3/NAS/COMMON/commonDef.h deleted file mode 120000 index 19553e9b64..0000000000 --- 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 0000000000..64216b0094 --- /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 +#include +#include + +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; /* + */ + lac_t lac; /* Location Area Code */ +} lai_t; + +/* + * GPRS Routing Area Identification + */ +typedef struct { + plmn_t plmn; /* + */ + lac_t lac; /* Location Area Code */ + rac_t rac; /* Routing Area Code */ +} RAI_t; + +/* + * EPS Tracking Area Identification + */ +typedef struct { + plmn_t plmn; /* + */ + tac_t tac; /* Tracking Area Code */ +} tai_t; + +/* + * EPS Globally Unique MME Identity + */ +typedef struct { + plmn_t plmn; /* + */ + 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 2648b55e99..0000000000 --- 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 0000000000..46716bee24 --- /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/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 902420ae08..6c309df4db 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.25PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.25PRB.usrpb210.conf index 7806e917ac..7f92dff947 100644 --- 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 @@ -159,12 +159,12 @@ eNBs = rrh_gw_config = ( { local_if_name = "eth0"; - remote_address = "90:e2:ba:c5:fc:04"; - local_address = "00:13:95:1f:a0:af"; + remote_address = "10.10.10.155"; + local_address = "10.10.10.58"; 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.50PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.50PRB.usrpb210.conf index 831010a89a..c8c5b73974 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,8 +159,8 @@ 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 = "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/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index fd5d38f696..d6b2d4ac82 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -886,6 +886,15 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) { proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; + // synchronize first reception to frame 0 subframe 0 + if (eNB->iframe_offset == -1) + eNB->iframe_offset = proc->frame_rx; + if (eNB->isubframe_offset == -1) + eNB->isubframe_offset = proc->subframe_rx; + + proc->frame_rx -= eNB->iframe_offset; + proc->subframe_rx -= eNB->isubframe_offset; + 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); @@ -1614,6 +1623,9 @@ 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->iframe_offset = -1; + eNB->isubframe_offset = -1; + 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]]); switch (node_function[CC_id]) { From e156079e33dee635b1e2ea2dafe449d52b03b304 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Thu, 27 Oct 2016 12:36:38 +0200 Subject: [PATCH 011/128] timeout for UDP recvfrom --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 2 +- targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c | 4 ++++ targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 1bf2f4b2d0..e1fd166800 100755 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -229,7 +229,7 @@ void recv_IF4p5(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_t *packet_type = packet_header->sub_type; - printf("CC_id %d : frame %d, subframe %d\n",eNB->CC_id,*frame,*subframe); + // printf("CC_id %d : frame %d, subframe %d\n",eNB->CC_id,*frame,*subframe); if (*packet_type == IF4p5_PDLFFT) { *symbol_number = ((packet_header->frame_status)>>26)&0x000f; diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c index fc8c175ae9..d507385dd4 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c @@ -160,6 +160,7 @@ int trx_eth_read_udp_IF4p5(openair0_device *device, openair0_timestamp *timestam if (bytes_received ==-1) { eth->num_rx_errors++; if (errno == EAGAIN) { + /* again_cnt++; usleep(10); if (again_cnt == 1000) { @@ -169,6 +170,9 @@ int trx_eth_read_udp_IF4p5(openair0_device *device, openair0_timestamp *timestam 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); diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c index e770c61935..67ad93f044 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -96,6 +96,7 @@ int trx_eth_start(openair0_device *device) { } else { if(eth_get_dev_conf_udp(device)!=0) return -1; } + if(ethernet_tune (device,RCV_TIMEOUT,999999)!=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; From 90e3931e4e666467e932abbacffb806b76ffc1c8 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Thu, 27 Oct 2016 14:41:58 +0200 Subject: [PATCH 012/128] resynch for timestamp --- openair1/PHY/defs.h | 3 +-- targets/RT/USER/lte-enb.c | 25 ++++++++++--------------- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 40444d284f..703bdd2d6f 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -410,8 +410,7 @@ typedef struct PHY_VARS_eNB_s { int single_thread_flag; openair0_rf_map rf_map; int abstraction_flag; - int iframe_offset; - int isubframe_offset; + openair0_timestamp ts_offset; void (*do_prach)(struct PHY_VARS_eNB_s *eNB); void (*fep)(struct PHY_VARS_eNB_s *eNB); int (*td)(struct PHY_VARS_eNB_s *eNB,int UE_id,int harq_pid,int llr8_flag); diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index a8b5e18556..230a10629e 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -883,29 +883,25 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) { fp->nb_antennas_rx); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); - - proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; - proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; + + if (proc->first_rx == 1) + eNB->ts_offset = proc->timestamp_rx; + + proc->frame_rx = ((proc->timestamp_rx-eNB->ts_offset) / (fp->samples_per_tti*10))&1023; + proc->subframe_rx = ((proc->timestamp_rx-eNB->ts_offset) / fp->samples_per_tti)%10; // synchronize first reception to frame 0 subframe 0 - if (eNB->iframe_offset == -1) - eNB->iframe_offset = proc->frame_rx; - if (eNB->isubframe_offset == -1) - eNB->isubframe_offset = proc->subframe_rx; - - proc->frame_rx -= eNB->iframe_offset; - proc->subframe_rx -= eNB->isubframe_offset; 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 %llu (sf %d, f %d, first_rx %d)\n", proc->timestamp_rx,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,"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); + LOG_E(PHY,"Received Timestamp (%llu) doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->timestamp_rx,proc->frame_rx,*frame); exit_fun("Exiting"); } } else { @@ -1625,8 +1621,7 @@ 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->iframe_offset = -1; - eNB->isubframe_offset = -1; + eNB->ts_offset = 0; 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]]); switch (node_function[CC_id]) { From bc7df9f5c4637ecb899f683bc22f8e7d45f4407c Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Thu, 27 Oct 2016 14:44:08 +0200 Subject: [PATCH 013/128] removed debugging traces --- targets/RT/USER/lte-enb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 230a10629e..fdad1e12c1 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -892,7 +892,7 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) { // 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, f %d, first_rx %d)\n", proc->timestamp_rx,proc->subframe_rx,proc->frame_rx,proc->first_rx); + //printf("trx_read <- USRP TS %llu (sf %d, f %d, first_rx %d)\n", proc->timestamp_rx,proc->subframe_rx,proc->frame_rx,proc->first_rx); if (proc->first_rx == 0) { if (proc->subframe_rx != *subframe){ From 7b39d594d5f99ed138747f73fcebd40cc5685673 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Mon, 31 Oct 2016 09:49:02 -0700 Subject: [PATCH 014/128] new library for LMSSDR. Integrated by Lime. --- targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp index 3775be13b4..23362efb96 100644 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp @@ -193,7 +193,7 @@ int trx_lms_start(openair0_device *device){ LMS_EnableChannel(lms_device,LMS_CH_RX,1,true); LMS_EnableChannel(lms_device,LMS_CH_TX,1,true); } */ - LMS_VCTCXOWrite(lms_device,125); + LMS_VCTCXOWrite(lms_device,129); if (LMS_SetSampleRate(lms_device,device->openair0_cfg->sample_rate,2)!=0) { @@ -239,14 +239,14 @@ int trx_lms_start(openair0_device *device){ rx_stream.channel = 0; rx_stream.fifoSize = 256*1024; rx_stream.throughputVsLatency = 0.1; - rx_stream.dataFmt = lms_stream_t::LMS_FMT_I16; + 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_I16; + tx_stream.dataFmt = lms_stream_t::LMS_FMT_I12; tx_stream.isTx = true; if (LMS_SetupStream(lms_device, &tx_stream)!=0) printf("TX stream setup failed %s\n",LMS_GetLastErrorMessage()); From 2d963f533032e222cb5d8857804a8e1a8a92a555 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Mon, 31 Oct 2016 10:17:54 -0700 Subject: [PATCH 015/128] prototype of trx_stop_func --- targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp index 7d273a9a5b..c1e3cb81c1 100644 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp @@ -258,7 +258,7 @@ int trx_lms_start(openair0_device *device){ * \param card Index of the RF card to use * \returns 0 on success */ -int trx_lms_stop(int card) { +int trx_lms_stop(openair0_device *device) { LMS_StopStream(&rx_stream); LMS_StopStream(&tx_stream); LMS_DestroyStream(lms_device,&rx_stream); From b018a3bbe96a0ad80ab1e197976083d4778f26ff Mon Sep 17 00:00:00 2001 From: "Raymond.Knopp" Date: Mon, 31 Oct 2016 20:47:10 +0100 Subject: [PATCH 016/128] configuration file for 10 MHz LMMSDR, 10 MHz, RF configuration file bugfix, first_rx > 1 for LMSSDR --- .../CONF/enb.band7.tm1.50PRB.lmssdr.conf | 233 +++++++++--------- targets/RT/USER/lte-enb.c | 12 +- targets/RT/USER/lte-softmodem.c | 2 +- 3 files changed, 125 insertions(+), 122 deletions(-) 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 dae0187f18..af9ed2c221 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 =;*/ + { + 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 = 2660000000L; + 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 = 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 = -27; + 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; + pusch_p0_Nominal = -96; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -100; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; - 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; + 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.4/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/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index d070b91083..539d8ab17a 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -677,7 +677,7 @@ 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) { @@ -881,7 +881,7 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) { proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; 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 <- RX TS %llu (sf %d, first_rx %d)\n", proc->timestamp_rx,proc->subframe_rx,proc->first_rx); if (proc->first_rx == 0) { if (proc->subframe_rx != *subframe){ @@ -894,7 +894,7 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) { exit_fun("Exiting"); } } else { - proc->first_rx = 0; + proc->first_rx--; *frame = proc->frame_rx; *subframe = proc->subframe_rx; } @@ -931,7 +931,7 @@ void rx_fh_if5(PHY_VARS_eNB *eNB,int *frame, int *subframe) { exit_fun("Exiting"); } } else { - proc->first_rx = 0; + proc->first_rx--; *frame = proc->frame_rx; *subframe = proc->subframe_rx; } @@ -983,7 +983,7 @@ void rx_fh_if4p5(PHY_VARS_eNB *eNB,int *frame,int *subframe) { exit_fun("Exiting"); } } else { - proc->first_rx = 0; + proc->first_rx--; *frame = proc->frame_rx; *subframe = proc->subframe_rx; } @@ -1327,7 +1327,7 @@ void init_eNB_proc(int inst) { proc->instance_cnt_asynch_rxtx = -1; proc->CC_id = CC_id; - proc->first_rx=1; + proc->first_rx=4; proc->first_tx=1; pthread_mutex_init( &proc_rxtx[0].mutex_rxtx, NULL); diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 6da474c4a0..6b258b5986 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -1354,7 +1354,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; } From 963ccb9badab05d0f18d8306c0e9ece420e99fbd Mon Sep 17 00:00:00 2001 From: "Raymond.Knopp" Date: Thu, 17 Nov 2016 11:57:14 +0100 Subject: [PATCH 017/128] some changes for tx-gain setting --- targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp | 21 ++++++------------- .../CONF/enb.band7.tm1.lmssdr.conf | 2 +- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp index c1e3cb81c1..3abcbbac5a 100644 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp @@ -131,18 +131,8 @@ void set_rx_gain_offset(openair0_config_t *openair0_cfg, int chain_index) { */ 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]; - - 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", (uint16_t)gv); - LMS_WriteParam(lms_device,LMS7param(G_PGA_RBB),(uint16_t)gv);*/ + LMS_SetNormalizedGain(lms_device, LMS_CH_TX, 0, openair0_cfg[0].tx_gain[0]/100.0); + LMS_SetNormalizedGain(lms_device, LMS_CH_RX, 0, openair0_cfg[0].rx_gain[0]/openair0_cfg[0].rx_gain_offset[0]); return(0); } @@ -209,10 +199,8 @@ int trx_lms_start(openair0_device *device){ LMS_SetAntenna(lms_device, LMS_CH_RX, 0, 3); LMS_SetAntenna(lms_device, LMS_CH_TX, 0, 2); - trx_lms_set_gains(device, device->openair0_cfg); - /*LMS_SetNormalizedGain(lms_device, LMS_CH_TX, 0, 0.175); - LMS_SetNormalizedGain(lms_device, LMS_CH_RX, 0, 0.65);*/ + 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) @@ -239,6 +227,9 @@ int trx_lms_start(openair0_device *device){ 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); + if (LMS_SetupStream(lms_device, &tx_stream)!=0) printf("TX stream setup failed %s\n",LMS_GetLastErrorMessage()); 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 b0ef9e0374..d912b1a102 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; From afbab21a54ddcc90be83297b6e29def2476f6f24 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Fri, 18 Nov 2016 13:40:14 -0800 Subject: [PATCH 018/128] put MAX_NUM_CCs back to 1 --- cmake_targets/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index c1507de61b..5e86d59378 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -664,7 +664,7 @@ add_boolean_option(ENABLE_NEW_MULTICAST False "specific to oaisim") add_boolean_option(EXMIMO_IOT True "????") add_boolean_option(LARGE_SCALE False "specific to oaisim: defines max eNB=2 and max UE=120") add_boolean_option(LOCALIZATION False "???") -add_integer_option(MAX_NUM_CCs 2 "????") +add_integer_option(MAX_NUM_CCs 1 "????") add_boolean_option(MU_RECEIVER False "????") add_boolean_option(NEW_FFT True "????") add_boolean_option(OPENAIR1 True "????") From f974ec264e8e1469d796c8d58161c5d09959686e Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Mon, 21 Nov 2016 10:37:01 +0800 Subject: [PATCH 019/128] debugging information in lte-enb, addition of external reference option in lte-softmodem and usrp_lib.cpp --- cmake_targets/CMakeLists.txt | 2 +- targets/ARCH/COMMON/common_lib.h | 10 ++++++++ targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 11 ++++++++- targets/RT/USER/lte-enb.c | 25 +++++++++++--------- targets/RT/USER/lte-softmodem.c | 13 ++++++++-- 5 files changed, 46 insertions(+), 15 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index c1507de61b..5e86d59378 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -664,7 +664,7 @@ add_boolean_option(ENABLE_NEW_MULTICAST False "specific to oaisim") add_boolean_option(EXMIMO_IOT True "????") add_boolean_option(LARGE_SCALE False "specific to oaisim: defines max eNB=2 and max UE=120") add_boolean_option(LOCALIZATION False "???") -add_integer_option(MAX_NUM_CCs 2 "????") +add_integer_option(MAX_NUM_CCs 1 "????") add_boolean_option(MU_RECEIVER False "????") add_boolean_option(NEW_FFT True "????") add_boolean_option(OPENAIR1 True "????") diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h index 99350a4c1e..0011842a03 100644 --- a/targets/ARCH/COMMON/common_lib.h +++ b/targets/ARCH/COMMON/common_lib.h @@ -134,6 +134,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 @@ -186,6 +194,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 diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index 1cbabf5dcc..106fb369db 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -587,7 +587,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; @@ -643,6 +646,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; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index fdad1e12c1..8999a717ce 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -654,11 +654,11 @@ void fh_if5_asynch_UL(PHY_VARS_eNB *eNB,int *frame,int *subframe) { } else { 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_if5_asynch_UL: subframe_rx %d is not what we expect %d\n",proc->subframe_rx,*subframe); 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); + LOG_E(PHY,"fh_if5_asynch_UL: subframe_rx %d is not what we expect %d\n",proc->frame_rx,*frame); exit_fun("Exiting"); } } @@ -688,11 +688,11 @@ void fh_if4p5_asynch_UL(PHY_VARS_eNB *eNB,int *frame,int *subframe) { } 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"); } } @@ -728,11 +728,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"); } } @@ -760,11 +760,11 @@ void fh_if4p5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) { } 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: subframe_tx %d is not what we expect %d\n",subframe_tx,*subframe); exit_fun("Exiting"); } } @@ -882,6 +882,9 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) { fp->samples_per_tti, fp->nb_antennas_rx); + if (rxs != fp->samples_per_tti) + printf("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) @@ -892,16 +895,16 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) { // 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, f %d, first_rx %d)\n", proc->timestamp_rx,proc->subframe_rx,proc->frame_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 (%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); + 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 (%llu) doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->timestamp_rx,proc->frame_rx,*frame); + LOG_E(PHY,"rx_rf: Received Timestamp (%llu) doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->timestamp_rx,proc->frame_rx,*frame); exit_fun("Exiting"); } } else { diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index d2ba49dcac..eeb06753f3 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -168,6 +168,7 @@ volatile int oai_exit = 0; +static clock_source_t clock_source = internal; static char UE_flag=0; unsigned int mmapped_dma=0; @@ -386,6 +387,7 @@ void help (void) { 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(" --single-thread runs lte-softmodem in only one thread\n"); + printf(" --external-clock tells hardware to use an external clock reference\n"); printf(" -C Set the downlink frequency for all component carriers\n"); printf(" -d Enable soft scope and L1 and L2 stats (Xforms)\n"); printf(" -F Calibrate the EXMIMO borad, available files: exmimo2_2arxg.lime exmimo2_2brxg.lime \n"); @@ -657,7 +659,7 @@ void *l2l1_task(void *arg) #endif - + static void get_options (int argc, char **argv) { @@ -693,6 +695,7 @@ static void get_options (int argc, char **argv) LONG_OPTION_PHYTEST, LONG_OPTION_MMAPPED_DMA, LONG_OPTION_SINGLE_THREAD, + LONG_OPTION_EXTERNAL_CLOCK, #if T_TRACER LONG_OPTION_T_PORT, LONG_OPTION_T_NOWAIT, @@ -718,6 +721,7 @@ static void get_options (int argc, char **argv) {"phy-test", no_argument, NULL, LONG_OPTION_PHYTEST}, {"mmapped-dma", no_argument, NULL, LONG_OPTION_MMAPPED_DMA}, {"single-thread", no_argument, NULL, LONG_OPTION_SINGLE_THREAD}, + {"external-clock", no_argument, NULL, LONG_OPTION_EXTERNAL_CLOCK}, #if T_TRACER {"T_port", required_argument, 0, LONG_OPTION_T_PORT}, {"T_nowait", no_argument, 0, LONG_OPTION_T_NOWAIT}, @@ -818,7 +822,11 @@ static void get_options (int argc, char **argv) case LONG_OPTION_SINGLE_THREAD: single_thread_flag = 1; break; - + + case LONG_OPTION_EXTERNAL_CLOCK: + clock_source = external; + break; + #if T_TRACER case LONG_OPTION_T_PORT: { extern int T_port; @@ -1325,6 +1333,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)); From 958c66c6db20a7087fdff1627f107afe63549974 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Mon, 21 Nov 2016 12:06:22 +0800 Subject: [PATCH 020/128] handling of timing drift in rfdevice --- targets/RT/USER/lte-enb.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 8999a717ce..74e75bdc4d 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -843,6 +843,8 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) { unsigned int rxs,txs; int i; int tx_sfoffset = 3;//(eNB->single_thread_flag == 1) ? 3 : 3; + openair0_timestamp old_ts; + if (proc->first_rx==0) { // Transmit TX buffer based on timestamp from RX @@ -876,6 +878,8 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) { 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), rxp, @@ -883,13 +887,18 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) { fp->nb_antennas_rx); if (rxs != fp->samples_per_tti) - printf("Asked for %d samples, got %d from USRP\n",fp->samples_per_tti,rxs); + 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; - + 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); + eNB->ts_offset += (proc->timestamp_rx - old_ts); + } + } proc->frame_rx = ((proc->timestamp_rx-eNB->ts_offset) / (fp->samples_per_tti*10))&1023; proc->subframe_rx = ((proc->timestamp_rx-eNB->ts_offset) / fp->samples_per_tti)%10; // synchronize first reception to frame 0 subframe 0 From e0314d8b755ce1fc8007db37efce9459ab336348 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Mon, 21 Nov 2016 12:19:21 +0800 Subject: [PATCH 021/128] update to timing drift compensation in rfdevice --- targets/RT/USER/lte-enb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 74e75bdc4d..58494caed4 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -895,8 +895,8 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) { eNB->ts_offset = proc->timestamp_rx; 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); - eNB->ts_offset += (proc->timestamp_rx - old_ts); + 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->frame_rx = ((proc->timestamp_rx-eNB->ts_offset) / (fp->samples_per_tti*10))&1023; From 20b0aae98ba0aaedfd035a287437b2079765b8c5 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Mon, 21 Nov 2016 18:00:36 +0800 Subject: [PATCH 022/128] integration of over-the-air synchronization mechanism for distributed RRU --- openair1/PHY/LTE_ESTIMATION/lte_sync_time.c | 21 +-- openair1/PHY/defs.h | 16 ++ targets/RT/USER/lte-enb.c | 193 +++++++++++++++++++- targets/RT/USER/lte-softmodem.c | 12 +- 4 files changed, 225 insertions(+), 17 deletions(-) diff --git a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c index dfb39a510f..5f0ba9b2d2 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c @@ -517,14 +517,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); } @@ -542,7 +543,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); } @@ -574,7 +575,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]; @@ -582,17 +583,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/defs.h b/openair1/PHY/defs.h index 703bdd2d6f..e42157769d 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -256,6 +256,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 @@ -280,6 +282,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 @@ -294,6 +298,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 @@ -304,6 +310,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 @@ -314,6 +322,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 @@ -326,6 +336,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 @@ -411,6 +423,10 @@ typedef struct PHY_VARS_eNB_s { openair0_rf_map rf_map; int abstraction_flag; openair0_timestamp ts_offset; + // indicator for synchronization state of eNB + int in_synch; + // indicator for master/slave (RRU) + int is_slave; void (*do_prach)(struct PHY_VARS_eNB_s *eNB); void (*fep)(struct PHY_VARS_eNB_s *eNB); int (*td)(struct PHY_VARS_eNB_s *eNB,int UE_id,int harq_pid,int llr8_flag); diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 58494caed4..66d60bf2cc 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -161,7 +161,7 @@ static struct { 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); @@ -1122,6 +1122,114 @@ 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 > 10000) && (sync_pos == -1)) { + // 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); + }*/ + } + } + + // 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(); + +} + +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 @@ -1242,6 +1350,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; @@ -1249,9 +1359,24 @@ 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; + + 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;inb_antennas_rx;i++) + rxp[i] = &eNB->common_vars.rxdata[0][i][0]; + // set default return value eNB_thread_single_status = 0; @@ -1280,6 +1405,57 @@ 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); + // 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; inb_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); + 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 + for (i=0;i<4;i++) { + eNB->rfdevice.openair0_cfg->rx_freq[i] = temp_freq1; + eNB->rfdevice.openair0_cfg->rx_freq[i] = temp_freq2; + } + eNB->rfdevice.trx_set_freq_func(&eNB->rfdevice,eNB->rfdevice.openair0_cfg,0); + } // 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) { @@ -1334,7 +1510,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_idinstance_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; @@ -1359,13 +1536,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); @@ -1378,6 +1558,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; @@ -1397,6 +1578,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)) @@ -1619,7 +1801,7 @@ 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); -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; @@ -1634,6 +1816,9 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst 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; + 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]]); switch (node_function[CC_id]) { diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index eeb06753f3..d2f2f9ccfb 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -120,7 +120,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); @@ -170,6 +170,8 @@ 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; int single_thread_flag=0; @@ -696,6 +698,7 @@ static void get_options (int argc, char **argv) LONG_OPTION_MMAPPED_DMA, LONG_OPTION_SINGLE_THREAD, LONG_OPTION_EXTERNAL_CLOCK, + LONG_OPTION_WAIT_FOR_SYNC, #if T_TRACER LONG_OPTION_T_PORT, LONG_OPTION_T_NOWAIT, @@ -722,6 +725,7 @@ static void get_options (int argc, char **argv) {"mmapped-dma", no_argument, NULL, LONG_OPTION_MMAPPED_DMA}, {"single-thread", no_argument, NULL, LONG_OPTION_SINGLE_THREAD}, {"external-clock", no_argument, NULL, LONG_OPTION_EXTERNAL_CLOCK}, + {"wait-for-sync", no_argument, NULL, LONG_OPTION_WAIT_FOR_SYNC}, #if T_TRACER {"T_port", required_argument, 0, LONG_OPTION_T_PORT}, {"T_nowait", no_argument, 0, LONG_OPTION_T_NOWAIT}, @@ -827,6 +831,10 @@ static void get_options (int argc, char **argv) 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; @@ -1808,7 +1816,7 @@ int main( int argc, char **argv ) // start the main thread if (UE_flag == 1) init_UE(1); else { - init_eNB(node_function,node_timing,1,eth_params,single_thread_flag); + init_eNB(node_function,node_timing,1,eth_params,single_thread_flag,wait_for_sync); // Sleep to allow all threads to setup number_of_cards = 1; From 1fcc78375cadbe7a302178bcfee86bc327388d6f Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Mon, 21 Nov 2016 18:02:10 +0800 Subject: [PATCH 023/128] debugging traces in lte-enb --- cmake_targets/CMakeLists.txt | 2 +- targets/RT/USER/lte-enb.c | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 5e86d59378..c1507de61b 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -664,7 +664,7 @@ add_boolean_option(ENABLE_NEW_MULTICAST False "specific to oaisim") add_boolean_option(EXMIMO_IOT True "????") add_boolean_option(LARGE_SCALE False "specific to oaisim: defines max eNB=2 and max UE=120") add_boolean_option(LOCALIZATION False "???") -add_integer_option(MAX_NUM_CCs 1 "????") +add_integer_option(MAX_NUM_CCs 2 "????") add_boolean_option(MU_RECEIVER False "????") add_boolean_option(NEW_FFT True "????") add_boolean_option(OPENAIR1 True "????") diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 8999a717ce..d3da134ee8 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -936,12 +936,12 @@ 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 { @@ -989,11 +989,11 @@ void rx_fh_if4p5(PHY_VARS_eNB *eNB,int *frame,int *subframe) { if (proc->first_rx == 0) { if (proc->subframe_rx != *subframe){ - LOG_E(PHY,"Received Timestamp (IF4p5) doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d,CCid %d)\n",proc->subframe_rx,*subframe,eNB->CC_id); + LOG_E(PHY,"rx_fh_if4p5: Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d,CCid %d)\n",proc->subframe_rx,*subframe,eNB->CC_id); exit_fun("Exiting"); } if (proc->frame_rx != *frame) { - LOG_E(PHY,"Received Timestamp (IF4p5) 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); + 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); exit_fun("Exiting"); } } else { From 09a2fa65e3e83802bbe332d89b010f73252f72a0 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Tue, 22 Nov 2016 16:09:43 +0800 Subject: [PATCH 024/128] further additions for multiple-RRU synchronizationwq --- targets/RT/USER/lte-enb.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 66d60bf2cc..5024154f40 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -761,11 +761,13 @@ void fh_if4p5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) { else { if (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"); + *frame = frame_tx; + // exit_fun("Exiting"); } if (subframe_tx != *subframe) { LOG_E(PHY,"fh_if4p5_asynch_DL: subframe_tx %d is not what we expect %d\n",subframe_tx,*subframe); - exit_fun("Exiting"); + *subframe = subframe_tx; + // exit_fun("Exiting"); } } if (packet_type == IF4p5_PDLFFT) { @@ -1181,13 +1183,15 @@ void *eNB_thread_synch(void *arg) { LOG_I(PHY,"Estimated sync_pos %d, peak_val %d => timing offset %d\n",sync_pos,peak_val,eNB->rx_offset); - - /* if ((peak_val > 10000) && (sync_pos == -1)) { + /* + 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; } } @@ -1448,9 +1452,16 @@ static void* eNB_thread_single( void* param ) { 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); for (i=0;i<4;i++) { eNB->rfdevice.openair0_cfg->rx_freq[i] = temp_freq1; - eNB->rfdevice.openair0_cfg->rx_freq[i] = temp_freq2; + eNB->rfdevice.openair0_cfg->tx_freq[i] = temp_freq2; } eNB->rfdevice.trx_set_freq_func(&eNB->rfdevice,eNB->rfdevice.openair0_cfg,0); } // if RRU and slave From 63c68100f30271d9e9180b8443d473557b9f58fe Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Wed, 23 Nov 2016 10:15:39 +0800 Subject: [PATCH 025/128] spawn a thread for frequency adjustments in USRP device driver --- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index 106fb369db..baa4ff1642 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -360,7 +360,15 @@ static bool is_equal(double a, double b) return std::fabs(a-b) < std::numeric_limits::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 @@ -369,10 +377,12 @@ static bool is_equal(double a, double b) int trx_usrp_set_freq(openair0_device* device, openair0_config_t *openair0_cfg, int dummy) { 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 + pthread_create(&f_thread,NULL,freq_thread,(void*)device); return(0); From f02c1f20e43ac6591c040a355a838ca9cefcacc0 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Wed, 23 Nov 2016 13:42:37 +0800 Subject: [PATCH 026/128] frame synchronization mechanism and robustification of if4p5 packet handling for out-of-order asynchronous reception (PDLFFT) --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 2 +- openair1/PHY/defs.h | 2 ++ targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 23 ++++++++++++++++---- targets/RT/USER/lte-enb.c | 22 +++++++++++-------- 4 files changed, 35 insertions(+), 14 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index e1fd166800..1aff7d876b 100755 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -229,7 +229,7 @@ void recv_IF4p5(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_t *packet_type = packet_header->sub_type; - // printf("CC_id %d : frame %d, subframe %d\n",eNB->CC_id,*frame,*subframe); + // LOG_I(PHY,"CC_id %d : frame %d, subframe %d\n",eNB->CC_id,*frame,*subframe); if (*packet_type == IF4p5_PDLFFT) { *symbol_number = ((packet_header->frame_status)>>26)&0x000f; diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index e42157769d..9ba1c53d64 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -238,6 +238,8 @@ 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 diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index 106fb369db..0fed5cc9de 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -360,19 +360,34 @@ static bool is_equal(double a, double b) return std::fabs(a-b) < std::numeric_limits::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); diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 5024154f40..49b9bd4d0c 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -744,11 +744,10 @@ 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<symbols_per_tti)-1; do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!! @@ -765,21 +764,24 @@ void fh_if4p5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) { // exit_fun("Exiting"); } if (subframe_tx != *subframe) { - LOG_E(PHY,"fh_if4p5_asynch_DL: subframe_tx %d is not what we expect %d\n",subframe_tx,*subframe); - *subframe = subframe_tx; - // exit_fun("Exiting"); + 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_mask[subframe_tx] =proc->symbol_mask[subframe_tx] | (1<symbol_mask[*subframe] != symbol_mask_full); + + // 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); } /*! @@ -1463,7 +1465,7 @@ static void* eNB_thread_single( void* param ) { 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,0); + eNB->rfdevice.trx_set_freq_func(&eNB->rfdevice,eNB->rfdevice.openair0_cfg,1); } // if RRU and slave @@ -1540,6 +1542,8 @@ void init_eNB_proc(int inst) { proc->first_rx=1; proc->first_tx=1; + 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); pthread_cond_init( &proc_rxtx[0].cond_rxtx, NULL); From 3e838ca675bb2789185b7fc568d9cc9203331800 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Wed, 23 Nov 2016 13:46:47 +0800 Subject: [PATCH 027/128] temporary commit for testing 2 RRU case as TM2 (distributed antennas) --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 16 +++++++------ openair1/PHY/defs.h | 2 ++ openair1/SCHED/phy_procedures_lte_eNb.c | 6 ++--- targets/RT/USER/lte-enb.c | 30 +++++++++++++++++++------ 4 files changed, 37 insertions(+), 17 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index e1fd166800..1e2e59056c 100755 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -40,6 +40,7 @@ #include "PHY/defs.h" #include "PHY/TOOLS/alaw_lut.h" +#include "PHY/extern.h" //#include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h" #include "targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h" @@ -47,7 +48,7 @@ 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 **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; @@ -61,7 +62,8 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type IF4p5_header_t *packet_header=NULL; eth_state_t *eth = (eth_state_t*) (eNB->ifdevice.priv); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); + + if (eNB->CC_id==0) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); if (packet_type == IF4p5_PDLFFT) { db_fulllength = 12*fp->N_RB_DL; @@ -81,10 +83,10 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type for (symbol_id=0; symbol_idsymbols_per_tti; symbol_id++) { for (element_id=0; element_idCC_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); } @@ -177,7 +179,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; } @@ -194,7 +196,7 @@ void recv_IF4p5(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_t 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); @@ -281,7 +283,7 @@ void recv_IF4p5(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_t 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; } diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index e42157769d..90c26431c9 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -242,6 +242,8 @@ typedef struct eNB_proc_t_s { int subframe_prach; /// frame to act upon for reception int frame_rx; + /// 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. diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 5603ac8421..0ee6c1ff11 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1103,7 +1103,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 @@ -2741,7 +2741,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB){ 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); + int offset = eNB->CC_id;//(eNB->single_thread_flag==1) ? 0 : (subframe&1); if ((fp->frame_type == TDD) && (subframe_select(fp,subframe)!=SF_UL)) return; @@ -2775,7 +2775,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/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index b2f286dfcf..823e1322ce 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -419,7 +419,7 @@ void tx_fh_if5_mobipass(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) { } 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); + send_IF4p5(eNB,proc->frame_tx,proc->subframe_tx, IF4p5_PDLFFT, 0); } void proc_tx_high0(PHY_VARS_eNB *eNB, @@ -427,7 +427,7 @@ void proc_tx_high0(PHY_VARS_eNB *eNB, relaying_type_t r_type, PHY_VARS_RN *rn) { - int offset = proc == &eNB->proc.proc_rxtx[0] ? 0 : 1; + int offset = eNB->CC_id;//proc == &eNB->proc.proc_rxtx[0] ? 0 : 1; VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB+offset, proc->frame_tx ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_ENB+offset, proc->subframe_tx ); @@ -604,7 +604,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 @@ -854,7 +855,7 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) { // prepare tx buffer pointers for (i=0; inb_antennas_tx; i++) - txp[i] = (void*)&eNB->common_vars.txdata[0][i][((proc->subframe_rx+tx_sfoffset)%10)*fp->samples_per_tti]; + 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, @@ -981,6 +982,7 @@ void rx_fh_if4p5(PHY_VARS_eNB *eNB,int *frame,int *subframe) { do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!! recv_IF4p5(eNB, &proc->frame_rx, &proc->subframe_rx, &packet_type, &symbol_number); + proc->frame_rx = (proc->frame_rx + proc->frame_offset)&1023; if (packet_type == IF4p5_PULFFT) { symbol_mask = symbol_mask | (1<first_rx == 0) { if (proc->subframe_rx != *subframe){ - LOG_E(PHY,"rx_fh_if4p5: Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d,CCid %d)\n",proc->subframe_rx,*subframe,eNB->CC_id); + 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->subframe_rx> *subframe) { + LOG_E(PHY,"rx_fh_if4p5, CC_id %d: this is ahead of time, so adjusting\n",eNB->CC_id); + *subframe = proc->subframe_rx; + } + else { + LOG_E(PHY,"rx_fh_ip4p5, CC_id %d: this is behind time, dropping\n"); + }*/ exit_fun("Exiting"); } if (proc->frame_rx != *frame) { @@ -1007,7 +1017,12 @@ void rx_fh_if4p5(PHY_VARS_eNB *eNB,int *frame,int *subframe) { } } 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_offset)&1023; *subframe = proc->subframe_rx; } @@ -1452,7 +1467,7 @@ static void* eNB_thread_single( void* param ) { eNB->rfdevice.openair0_cfg->rx_freq[i] = temp_freq1; eNB->rfdevice.openair0_cfg->rx_freq[i] = temp_freq2; } - eNB->rfdevice.trx_set_freq_func(&eNB->rfdevice,eNB->rfdevice.openair0_cfg,0); + eNB->rfdevice.trx_set_freq_func(&eNB->rfdevice,eNB->rfdevice.openair0_cfg,1); } // if RRU and slave @@ -1528,6 +1543,7 @@ void init_eNB_proc(int inst) { proc->first_rx=1; proc->first_tx=1; + proc->frame_offset = 0; pthread_mutex_init( &proc_rxtx[0].mutex_rxtx, NULL); pthread_mutex_init( &proc_rxtx[1].mutex_rxtx, NULL); From a4bdaddaaf18e98019880f3e0ce4a4958f5fb8da Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Wed, 23 Nov 2016 14:05:36 +0800 Subject: [PATCH 028/128] commit from other machine prior to merge --- targets/RT/USER/lte-enb.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 5024154f40..6af84b605d 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -761,13 +761,11 @@ void fh_if4p5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) { else { if (frame_tx != *frame) { LOG_E(PHY,"fh_if4p5_asynch_DL: frame_tx %d is not what we expect %d\n",frame_tx,*frame); - *frame = frame_tx; - // exit_fun("Exiting"); + exit_fun("Exiting"); } if (subframe_tx != *subframe) { LOG_E(PHY,"fh_if4p5_asynch_DL: subframe_tx %d is not what we expect %d\n",subframe_tx,*subframe); - *subframe = subframe_tx; - // exit_fun("Exiting"); + exit_fun("Exiting"); } } if (packet_type == IF4p5_PDLFFT) { From 8df3f84fc455917f99d2ae2c5ddbd1f77d28dfaa Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Wed, 23 Nov 2016 14:36:22 +0800 Subject: [PATCH 029/128] small change in if4p5_asynch_DL --- targets/RT/USER/lte-enb.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 49b9bd4d0c..693653c9c9 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -760,7 +760,6 @@ void fh_if4p5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) { else { if (frame_tx != *frame) { LOG_E(PHY,"fh_if4p5_asynch_DL: frame_tx %d is not what we expect %d\n",frame_tx,*frame); - *frame = frame_tx; // exit_fun("Exiting"); } if (subframe_tx != *subframe) { @@ -778,6 +777,8 @@ void fh_if4p5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) { } } while (proc->symbol_mask[*subframe] != symbol_mask_full); + *frame = frame_tx; + // intialize this to zero after we're done with the subframe proc->symbol_mask[*subframe] = 0; From 085718ae8b2fd360231d02f17d09737be44fac89 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Wed, 23 Nov 2016 19:12:02 +0800 Subject: [PATCH 030/128] RRU synchronization debugging --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 6 ++++-- openair1/PHY/defs.h | 4 ++++ targets/RT/USER/lte-enb.c | 11 ++++++++--- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 1aff7d876b..4ecdd6688d 100755 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -119,7 +119,7 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type gen_IF4p5_ul_header(packet_header, frame, subframe); for (symbol_id=0; symbol_idsymbols_per_tti; symbol_id++) { - + LOG_I(PHY,"IF4p5_PULFFT: frame %d, subframe %d, symbol %d\n",frame,subframe,symbol_id); for (element_id=0; element_idflags == ETH_RAW_IF4p5_MODE) { packet_header = (IF4p5_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); @@ -229,11 +230,12 @@ void recv_IF4p5(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_t *packet_type = packet_header->sub_type; - // LOG_I(PHY,"CC_id %d : frame %d, subframe %d\n",eNB->CC_id,*frame,*subframe); if (*packet_type == IF4p5_PDLFFT) { *symbol_number = ((packet_header->frame_status)>>26)&0x000f; + LOG_I(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; diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 9ba1c53d64..b1fdf544b7 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -244,6 +244,10 @@ typedef struct eNB_proc_t_s { 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. diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 693653c9c9..97c877c8ea 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -756,6 +756,7 @@ void fh_if4p5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) { *frame = frame_tx; *subframe = subframe_tx; proc->first_tx = 0; + proc->frame_offset = frame_tx - proc->frame_tx; } else { if (frame_tx != *frame) { @@ -779,6 +780,7 @@ void fh_if4p5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) { *frame = frame_tx; + // intialize this to zero after we're done with the subframe proc->symbol_mask[*subframe] = 0; @@ -906,6 +908,9 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) { } proc->frame_rx = ((proc->timestamp_rx-eNB->ts_offset) / (fp->samples_per_tti*10))&1023; proc->subframe_rx = ((proc->timestamp_rx-eNB->ts_offset) / 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); @@ -916,8 +921,8 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *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) { + int f2 = *frame+proc->frame_offset; + 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)\n",proc->timestamp_rx,proc->frame_rx,*frame); exit_fun("Exiting"); } @@ -1495,7 +1500,7 @@ 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->frame_tx; proc_rxtx->timestamp_tx = proc->timestamp_tx; // At this point, all information for subframe has been received on FH interface From 8bc94223b411e6b0a9426691cf4ced2581f79bc4 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Thu, 24 Nov 2016 15:55:00 +0800 Subject: [PATCH 031/128] remove debugging traces from lte-enb.c and if4_tools.c. modulo 1024 bug on frame counter in lte-enb.c --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 6 +++--- targets/RT/USER/lte-enb.c | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 4ecdd6688d..97f3cd9ae9 100755 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -119,7 +119,7 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type gen_IF4p5_ul_header(packet_header, frame, subframe); for (symbol_id=0; symbol_idsymbols_per_tti; symbol_id++) { - LOG_I(PHY,"IF4p5_PULFFT: frame %d, subframe %d, symbol %d\n",frame,subframe,symbol_id); + LOG_D(PHY,"IF4p5_PULFFT: frame %d, subframe %d, symbol %d\n",frame,subframe,symbol_id); for (element_id=0; element_idflags == ETH_RAW_IF4p5_MODE) { packet_header = (IF4p5_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); @@ -234,7 +234,7 @@ void recv_IF4p5(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_t if (*packet_type == IF4p5_PDLFFT) { *symbol_number = ((packet_header->frame_status)>>26)&0x000f; - LOG_I(PHY,"DL_IF4p5: CC_id %d : frame %d, subframe %d, symbol %d\n",eNB->CC_id,*frame,*subframe,*symbol_number); + 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; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 97c877c8ea..eadff1ffe3 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -908,9 +908,9 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) { } proc->frame_rx = ((proc->timestamp_rx-eNB->ts_offset) / (fp->samples_per_tti*10))&1023; proc->subframe_rx = ((proc->timestamp_rx-eNB->ts_offset) / fp->samples_per_tti)%10; - proc->frame_rx = (proc->frame_rx+proc->frame_offset)%1023; + 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; + 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); @@ -921,9 +921,9 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *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"); } - int f2 = *frame+proc->frame_offset; + 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)\n",proc->timestamp_rx,proc->frame_rx,*frame); + 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 { From eb854b8e6ace3efe65f95865a43b35f3f6870d33 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Thu, 24 Nov 2016 15:56:38 +0800 Subject: [PATCH 032/128] setting of frame_tx in lte-enb.c --- cmake_targets/CMakeLists.txt | 2 +- openair1/SCHED/phy_procedures_lte_eNb.c | 2 +- targets/RT/USER/lte-enb.c | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index c1507de61b..5e86d59378 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -664,7 +664,7 @@ add_boolean_option(ENABLE_NEW_MULTICAST False "specific to oaisim") add_boolean_option(EXMIMO_IOT True "????") add_boolean_option(LARGE_SCALE False "specific to oaisim: defines max eNB=2 and max UE=120") add_boolean_option(LOCALIZATION False "???") -add_integer_option(MAX_NUM_CCs 2 "????") +add_integer_option(MAX_NUM_CCs 1 "????") add_boolean_option(MU_RECEIVER False "????") add_boolean_option(NEW_FFT True "????") add_boolean_option(OPENAIR1 True "????") diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 0ee6c1ff11..359cb86776 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1925,7 +1925,7 @@ void prach_procedures(PHY_VARS_eNB *eNB) { eNB->UE_stats[(uint32_t)UE_id].UE_timing_offset = preamble_delay_list[preamble_max]&0x1FFF; //limit to 13 (=11+2) bits eNB->UE_stats[(uint32_t)UE_id].sector = 0; - LOG_I(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure (UE_id %d) with preamble %d, energy %d.%d dB, delay %d\n", + LOG_D(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure (UE_id %d) with preamble %d, energy %d.%d dB, delay %d\n", eNB->Mod_id, eNB->CC_id, frame, diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index e2f776187f..15e45fc3f6 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -1516,7 +1516,8 @@ 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->frame_tx; + 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; From f1bd8ba02af52082ad039bae4376e26ccef18db9 Mon Sep 17 00:00:00 2001 From: "S. Sandeep Kumar" Date: Thu, 24 Nov 2016 17:34:48 +0530 Subject: [PATCH 033/128] fix conflicting prach size in if4p5 --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 2 +- targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 56799ea894..2afb6ff019 100755 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -150,7 +150,7 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type } else if (packet_type == IF4p5_PRACH) { // FIX: hard coded prach samples length LOG_D(PHY,"IF4p5_PRACH: frame %d, subframe %d\n",frame,subframe); - db_fulllength = 840*2; + db_fulllength = PRACH_HARD_CODED_SIZE; 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); diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h index 855ff49704..c06656f2dc 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h @@ -60,7 +60,8 @@ // 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_SIZE (839*2) +#define PRACH_BLOCK_SIZE_BYTES (sizeof(int16_t)*PRACH_HARD_CODED_SIZE) // 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)) From fe10da264217ce77324d4f6d5aad7cad731ea4a6 Mon Sep 17 00:00:00 2001 From: "S. Sandeep Kumar" Date: Thu, 24 Nov 2016 19:14:50 +0530 Subject: [PATCH 034/128] fix conflicting prach size in if4p5 --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 2afb6ff019..9e5fc19d3b 100755 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -150,7 +150,8 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type } else if (packet_type == IF4p5_PRACH) { // FIX: hard coded prach samples length LOG_D(PHY,"IF4p5_PRACH: frame %d, subframe %d\n",frame,subframe); - db_fulllength = PRACH_HARD_CODED_SIZE; + db_fulllength = PRACH_HARD_CODED_NUM_SAMPLES; + 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); @@ -163,11 +164,11 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type if (eth->flags == ETH_RAW_IF4p5_MODE) { memcpy((int16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t), (&rxsigF[0][k]), - db_fulllength*sizeof(int16_t)); + PRACH_BLOCK_SIZE_BYTES); } else { memcpy((int16_t*)(tx_buffer + sizeof_IF4p5_header_t), (&rxsigF[0][k]), - db_fulllength*sizeof(int16_t)); + PRACH_BLOCK_SIZE_BYTES); } if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice, @@ -273,16 +274,16 @@ void recv_IF4p5(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_t } else if (*packet_type == IF4p5_PRACH) { // FIX: hard coded prach samples length - db_fulllength = 840*2; + 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), - db_fulllength*sizeof(int16_t)); + PRACH_BLOCK_SIZE_BYTES); } else { memcpy((&rxsigF[0][0]), (int16_t*) (rx_buffer+sizeof_IF4p5_header_t), - db_fulllength*sizeof(int16_t)); + PRACH_BLOCK_SIZE_BYTES); } } else { From 03eb2c498dd23bd45f0a02fce171403a2eca24b6 Mon Sep 17 00:00:00 2001 From: "S. Sandeep Kumar" Date: Thu, 24 Nov 2016 19:27:57 +0530 Subject: [PATCH 035/128] missed to commit changes for if_defs.h file --- targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h index c06656f2dc..af882660a6 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h @@ -60,8 +60,8 @@ // Packet sizes for IF4p5 interface format #define DATA_BLOCK_SIZE_BYTES(scaled_nblocks) (sizeof(uint16_t)*scaled_nblocks) -#define PRACH_HARD_CODED_SIZE (839*2) -#define PRACH_BLOCK_SIZE_BYTES (sizeof(int16_t)*PRACH_HARD_CODED_SIZE) // FIX hard coded prach size +#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)) From 2774702108039d24cb3ae2644a4f28ec56f28ef5 Mon Sep 17 00:00:00 2001 From: "Raymond.Knopp" Date: Thu, 1 Dec 2016 21:36:33 +0100 Subject: [PATCH 036/128] IF5 timing for RCC --- .../GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if4p5.conf | 8 ++++---- .../GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.25PRB.conf | 9 +++++---- targets/RT/USER/lte-enb.c | 5 ++++- 3 files changed, 13 insertions(+), 9 deletions(-) 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.50PRB.if4p5.conf index 7890736e5e..fe7719f852 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if4p5.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if4p5.conf @@ -157,13 +157,13 @@ eNBs = rrh_gw_config = ( { - local_if_name = "eth2"; - remote_address = "00:13:95:1f:a0:af"; - local_address = "90:e2:ba:c5:fc:04"; + 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 = "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 e8ffde20b6..1d1c51c137 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 @@ -36,6 +36,7 @@ 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; @@ -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/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index ee92a580c2..24f52a69db 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -969,6 +969,8 @@ void rx_fh_if5(PHY_VARS_eNB *eNB,int *frame, int *subframe) { *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 ); @@ -1504,7 +1506,8 @@ static void* eNB_thread_single( void* param ) { subframe++; } - if (eNB->CC_id==1) LOG_I(PHY,"eNB thread single %p (proc %p, CC_id %d), frame %d (%p), subframe %d (%p)\n", + if (eNB->CC_id==1) + LOG_I(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 From 8678be1692c64ec3f04fc9be62c3cb459b405cf4 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Fri, 2 Dec 2016 05:36:23 +0100 Subject: [PATCH 037/128] fixed IF5 timing --- openair2/ENB_APP/enb_config.c | 2 +- targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c | 1 + .../GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if4p5.conf | 8 ++++---- .../CONF/rru.band7.tm1.if4p5.25PRB.usrpb210.conf | 2 +- targets/RT/USER/lte-enb.c | 2 +- 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index d4c6a81c4f..7d90c194a6 100755 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -2369,7 +2369,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) enb_properties.properties[enb_properties_index]->rrh_gw_config[j].rawif5_mobipass = 1; } else {//if (strcmp(preference, "no") == 0) enb_properties.properties[enb_properties_index]->rrh_gw_config[j].udp = 1; - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].raw = 1; + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].raw = 1; } if (strcmp(rf_preference, "exmimo") == 0) { diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c index 67ad93f044..7991e6a240 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -101,6 +101,7 @@ int trx_eth_start(openair0_device *device) { printf("Setting ETHERNET to RAW_IF5_MODE\n"); if (eth_socket_init_raw(device)!=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) { 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.50PRB.if4p5.conf index 7890736e5e..fe7719f852 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if4p5.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if4p5.conf @@ -157,13 +157,13 @@ eNBs = rrh_gw_config = ( { - local_if_name = "eth2"; - remote_address = "00:13:95:1f:a0:af"; - local_address = "90:e2:ba:c5:fc:04"; + 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 = "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 index 7f92dff947..c97b215c77 100644 --- 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 @@ -160,7 +160,7 @@ eNBs = { local_if_name = "eth0"; remote_address = "10.10.10.155"; - local_address = "10.10.10.58"; + 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"; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index ee92a580c2..418c0d6a67 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -717,7 +717,7 @@ 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; From 8aa61a1d292323b0f236b0dec1b586d22383a61d Mon Sep 17 00:00:00 2001 From: "Raymond.Knopp" Date: Thu, 1 Dec 2016 23:32:07 +0100 Subject: [PATCH 038/128] new IF5 configuration file --- .../CONF/rcc.band7.tm1.if5.25PRB.conf | 191 ++++++++++++++++++ 1 file changed, 191 insertions(+) create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if5.25PRB.conf 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 0000000000..6987bebda9 --- /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 = 2660000000L; + 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 = -90; + 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 = -108; + 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 + }; + + 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"; + }; + } +); From cfc308dd4cb99524a52c03645096682ba09ba59c Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Fri, 2 Dec 2016 07:35:34 +0100 Subject: [PATCH 039/128] new IF5 configuration file for RRU --- .../rru.band7.tm1.if5.25PRB.usrpb210.conf | 193 ++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if5.25PRB.usrpb210.conf 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 0000000000..71e435e2f4 --- /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"; + }; + } +); From eb826088781db510e9864005dbfb541102393582 Mon Sep 17 00:00:00 2001 From: "Raymond.Knopp" Date: Fri, 2 Dec 2016 09:57:20 +0100 Subject: [PATCH 040/128] dos2unix on eth_udp.c --- targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c | 966 +++++++++--------- 1 file changed, 483 insertions(+), 483 deletions(-) diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c index d507385dd4..4163d99c34 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c @@ -1,483 +1,483 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ -/*! \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 - * \date 2015 - * \version 0.2 - * \company Eurecom - * \maintainer: navid.nikaein@eurecom.fr - * \note - * \warning - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "vcd_signal_dumper.h" - -#include "common_lib.h" -#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]; - - -uint16_t pck_seq_num = 1; -uint16_t pck_seq_num_cur=0; -uint16_t pck_seq_num_prev=0; - -int eth_socket_init_udp(openair0_device *device) { - - eth_state_t *eth = (eth_state_t*)device->priv; - char str_local[INET_ADDRSTRLEN]; - char str_remote[INET_ADDRSTRLEN]; - const char *local_ip, *remote_ip; - int local_port=0, remote_port=0; - int sock_dom=0; - int sock_type=0; - int sock_proto=0; - int enable=1; - - if (device->host_type == RRH_HOST ) { - local_ip = device->openair0_cfg->my_addr; - local_port = device->openair0_cfg->my_port; - remote_ip = "0.0.0.0"; - remote_port = 0; - printf("[%s] local ip addr %s port %d\n", "RRH", local_ip, local_port); - } else { - local_ip = device->openair0_cfg->my_addr; - local_port = device->openair0_cfg->my_port; - remote_ip = device->openair0_cfg->remote_addr; - remote_port = device->openair0_cfg->remote_port; - printf("[%s] local ip addr %s port %d\n","BBU", local_ip, local_port); - } - - /* Open socket to send on */ - sock_dom=AF_INET; - sock_type=SOCK_DGRAM; - sock_proto=IPPROTO_UDP; - - if ((eth->sockfd = socket(sock_dom, sock_type, sock_proto)) == -1) { - perror("ETHERNET: Error opening socket"); - exit(0); - } - - /* initialize addresses */ - bzero((void *)&(eth->dest_addr), sizeof(eth->dest_addr)); - bzero((void *)&(eth->local_addr), sizeof(eth->local_addr)); - - - eth->addr_len = sizeof(struct sockaddr_in); - - 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); - - - 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, 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,(struct sockaddr *)ð->local_addr,eth->addr_len)<0) { - perror("ETHERNET: Cannot bind to socket"); - exit(0); - } else { - printf("[%s] binding to %s:%d\n","RRH",str_local,ntohs(eth->local_addr.sin_port)); - } - - return 0; -} - -int trx_eth_read_udp_IF4p5(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc) { - - // Read nblocks info from packet itself - int nblocks = nsamps; - int bytes_received=-1; - eth_state_t *eth = (eth_state_t*)device->priv; - - ssize_t packet_size = sizeof_IF4p5_header_t; - IF4p5_header_t *test_header = (IF4p5_header_t*)(buff[0]); - - 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++; - 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 { - *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); -} - -int trx_eth_write_udp_IF4p5(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) { - - int nblocks = nsamps; - int bytes_sent = 0; - - eth_state_t *eth = (eth_state_t*)device->priv; - - ssize_t packet_size; - - if (flags == IF4p5_PDLFFT) { - 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_PRACH) { - packet_size = UDP_IF4p5_PRACH_SIZE_BYTES; - } else { - printf("trx_eth_write_udp_IF4p5: unknown flags %d\n",flags); - return(-1); - } - - eth->tx_nsamps = nblocks; - - bytes_sent = sendto(eth->sockfd, - buff[0], - packet_size, - 0, - (struct sockaddr*)ð->dest_addr, - eth->addr_len); - - if (bytes_sent == -1) { - eth->num_tx_errors++; - perror("ETHERNET WRITE: "); - exit(-1); - } else { - eth->tx_actual_nsamps = bytes_sent>>1; - eth->tx_count++; - } - - return (bytes_sent); -} - -int trx_eth_write_udp(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags) { - - int bytes_sent=0; - eth_state_t *eth = (eth_state_t*)device->priv; - int sendto_flag =0; - int i=0; - //sendto_flag|=flags; - eth->tx_nsamps=nsamps; - - for (i=0;ipck_header.seq_num = pck_seq_num; - //eth->pck_header.antenna_id = 1+(i<<1); - //eth->pck_header.timestamp = timestamp; - *(uint16_t *)buff2 = pck_seq_num; - *(uint16_t *)(buff2 + sizeof(uint16_t)) = 1+(i<<1); - *(openair0_timestamp *)(buff2 + sizeof(int32_t)) = timestamp; - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TX_SEQ_NUM, pck_seq_num); - - while(bytes_sent < UDP_PACKET_SIZE_BYTES(nsamps)) { -#if DEBUG - printf("------- TX ------: buff2 current position=%d remaining_bytes=%d bytes_sent=%d \n", - (void *)(buff2+bytes_sent), - UDP_PACKET_SIZE_BYTES(nsamps) - bytes_sent, - bytes_sent); -#endif - /* Send packet */ - bytes_sent += sendto(eth->sockfd, - buff2, - UDP_PACKET_SIZE_BYTES(nsamps), - sendto_flag, - (struct sockaddr*)ð->dest_addr, - eth->addr_len); - - if ( bytes_sent == -1) { - eth->num_tx_errors++; - perror("ETHERNET WRITE: "); - exit(-1); - } else { -#if DEBUG - printf("------- TX ------: nu=%d an_id=%d ts%d bytes_send=%d\n", - *(int16_t *)buff2, - *(int16_t *)(buff2 + sizeof(int16_t)), - *(openair0_timestamp *)(buff2 + sizeof(int32_t)), - bytes_sent); - dump_packet((device->host_type == BBU_HOST)? "BBU":"RRH", buff2, UDP_PACKET_SIZE_BYTES(nsamps), TX_FLAG); -#endif - eth->tx_actual_nsamps=bytes_sent>>2; - eth->tx_count++; - pck_seq_num++; - if ( pck_seq_num > MAX_PACKET_SEQ_NUM(nsamps,device->openair0_cfg->samples_per_frame) ) pck_seq_num = 1; - } - } - /* tx buffer values restored */ - *(int32_t *)buff2 = temp0; - *(openair0_timestamp *)(buff2 + sizeof(int32_t)) = temp1; - } - - return (bytes_sent-APP_HEADER_SIZE_BYTES)>>2; -} - - - -int trx_eth_read_udp(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc) { - - int bytes_received=0; - eth_state_t *eth = (eth_state_t*)device->priv; - // openair0_timestamp prev_timestamp = -1; - int rcvfrom_flag =0; - int block_cnt=0; - int again_cnt=0; - int i=0; - - eth->rx_nsamps=nsamps; - - for (i=0;isockfd, - buff2, - UDP_PACKET_SIZE_BYTES(nsamps), - rcvfrom_flag, - (struct sockaddr *)ð->dest_addr, - (socklen_t *)ð->addr_len); - - if (bytes_received ==-1) { - eth->num_rx_errors++; - if (errno == EAGAIN) { - again_cnt++; - usleep(10); - if (again_cnt == 1000) { - perror("ETHERNET READ: "); - exit(-1); - } else { - printf("AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN \n"); - goto again; - } - } else if (errno == EWOULDBLOCK) { - block_cnt++; - usleep(10); - if (block_cnt == 1000) { - perror("ETHERNET READ: "); - exit(-1); - } else { - printf("BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK \n"); - goto again; - } - } - } else { -#if DEBUG - printf("------- RX------: nu=%d an_id=%d ts%d bytes_recv=%d\n", - *(int16_t *)buff2, - *(int16_t *)(buff2 + sizeof(int16_t)), - *(openair0_timestamp *)(buff2 + sizeof(int32_t)), - bytes_received); - dump_packet((device->host_type == BBU_HOST)? "BBU":"RRH", buff2, UDP_PACKET_SIZE_BYTES(nsamps),RX_FLAG); -#endif - - /* store the timestamp value from packet's header */ - *timestamp = *(openair0_timestamp *)(buff2 + sizeof(int32_t)); - /* store the sequence number of the previous packet received */ - if (pck_seq_num_cur == 0) { - pck_seq_num_prev = *(uint16_t *)buff2; - } else { - pck_seq_num_prev = pck_seq_num_cur; - } - /* 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==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); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RX_SEQ_NUM_PRV,pck_seq_num_prev); - eth->rx_actual_nsamps=bytes_received>>2; - eth->rx_count++; - } - - } - /* tx buffer values restored */ - *(int32_t *)buff2 = temp0; - *(openair0_timestamp *)(buff2 + sizeof(int32_t)) = temp1; - - } - return (bytes_received-APP_HEADER_SIZE_BYTES)>>2; -} - - - - -int eth_set_dev_conf_udp(openair0_device *device) { - - eth_state_t *eth = (eth_state_t*)device->priv; - void *msg; - ssize_t msg_len; - - - /* a BBU client sents to RRH a set of configuration parameters (openair0_config_t) - so that RF front end is configured appropriately and - frame/packet size etc. can be set */ - - msg=malloc(sizeof(openair0_config_t)); - msg_len=sizeof(openair0_config_t); - memcpy(msg,(void*)device->openair0_cfg,msg_len); - - 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); - } - - return 0; -} - -int eth_get_dev_conf_udp(openair0_device *device) { - - eth_state_t *eth = (eth_state_t*)device->priv; - char str1[INET_ADDRSTRLEN],str[INET_ADDRSTRLEN]; - void *msg; - ssize_t msg_len; - - msg=malloc(sizeof(openair0_config_t)); - msg_len=sizeof(openair0_config_t); - - 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, - msg, - msg_len, - 0, - (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, &(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, &(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,str1, device->openair0_cfg->remote_port, str, device->openair0_cfg->my_port); */ - return 0; -} +/******************************************************************************* + OpenAirInterface + Copyright(c) 1999 - 2014 Eurecom + + OpenAirInterface is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + + OpenAirInterface is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OpenAirInterface.The full GNU General Public License is + included in this distribution in the file called "COPYING". If not, + see . + + Contact Information + OpenAirInterface Admin: openair_admin@eurecom.fr + OpenAirInterface Tech : openair_tech@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr + + Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE + + *******************************************************************************/ +/*! \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 + * \date 2015 + * \version 0.2 + * \company Eurecom + * \maintainer: navid.nikaein@eurecom.fr + * \note + * \warning + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "vcd_signal_dumper.h" + +#include "common_lib.h" +#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]; + + +uint16_t pck_seq_num = 1; +uint16_t pck_seq_num_cur=0; +uint16_t pck_seq_num_prev=0; + +int eth_socket_init_udp(openair0_device *device) { + + eth_state_t *eth = (eth_state_t*)device->priv; + char str_local[INET_ADDRSTRLEN]; + char str_remote[INET_ADDRSTRLEN]; + const char *local_ip, *remote_ip; + int local_port=0, remote_port=0; + int sock_dom=0; + int sock_type=0; + int sock_proto=0; + int enable=1; + + if (device->host_type == RRH_HOST ) { + local_ip = device->openair0_cfg->my_addr; + local_port = device->openair0_cfg->my_port; + remote_ip = "0.0.0.0"; + remote_port = 0; + printf("[%s] local ip addr %s port %d\n", "RRH", local_ip, local_port); + } else { + local_ip = device->openair0_cfg->my_addr; + local_port = device->openair0_cfg->my_port; + remote_ip = device->openair0_cfg->remote_addr; + remote_port = device->openair0_cfg->remote_port; + printf("[%s] local ip addr %s port %d\n","BBU", local_ip, local_port); + } + + /* Open socket to send on */ + sock_dom=AF_INET; + sock_type=SOCK_DGRAM; + sock_proto=IPPROTO_UDP; + + if ((eth->sockfd = socket(sock_dom, sock_type, sock_proto)) == -1) { + perror("ETHERNET: Error opening socket"); + exit(0); + } + + /* initialize addresses */ + bzero((void *)&(eth->dest_addr), sizeof(eth->dest_addr)); + bzero((void *)&(eth->local_addr), sizeof(eth->local_addr)); + + + eth->addr_len = sizeof(struct sockaddr_in); + + 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); + + + 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, 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,(struct sockaddr *)ð->local_addr,eth->addr_len)<0) { + perror("ETHERNET: Cannot bind to socket"); + exit(0); + } else { + printf("[%s] binding to %s:%d\n","RRH",str_local,ntohs(eth->local_addr.sin_port)); + } + + return 0; +} + +int trx_eth_read_udp_IF4p5(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc) { + + // Read nblocks info from packet itself + int nblocks = nsamps; + int bytes_received=-1; + eth_state_t *eth = (eth_state_t*)device->priv; + + ssize_t packet_size = sizeof_IF4p5_header_t; + IF4p5_header_t *test_header = (IF4p5_header_t*)(buff[0]); + + 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++; + 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 { + *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); +} + +int trx_eth_write_udp_IF4p5(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) { + + int nblocks = nsamps; + int bytes_sent = 0; + + eth_state_t *eth = (eth_state_t*)device->priv; + + ssize_t packet_size; + + if (flags == IF4p5_PDLFFT) { + 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_PRACH) { + packet_size = UDP_IF4p5_PRACH_SIZE_BYTES; + } else { + printf("trx_eth_write_udp_IF4p5: unknown flags %d\n",flags); + return(-1); + } + + eth->tx_nsamps = nblocks; + + bytes_sent = sendto(eth->sockfd, + buff[0], + packet_size, + 0, + (struct sockaddr*)ð->dest_addr, + eth->addr_len); + + if (bytes_sent == -1) { + eth->num_tx_errors++; + perror("ETHERNET WRITE: "); + exit(-1); + } else { + eth->tx_actual_nsamps = bytes_sent>>1; + eth->tx_count++; + } + + return (bytes_sent); +} + +int trx_eth_write_udp(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags) { + + int bytes_sent=0; + eth_state_t *eth = (eth_state_t*)device->priv; + int sendto_flag =0; + int i=0; + //sendto_flag|=flags; + eth->tx_nsamps=nsamps; + + for (i=0;ipck_header.seq_num = pck_seq_num; + //eth->pck_header.antenna_id = 1+(i<<1); + //eth->pck_header.timestamp = timestamp; + *(uint16_t *)buff2 = pck_seq_num; + *(uint16_t *)(buff2 + sizeof(uint16_t)) = 1+(i<<1); + *(openair0_timestamp *)(buff2 + sizeof(int32_t)) = timestamp; + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TX_SEQ_NUM, pck_seq_num); + + while(bytes_sent < UDP_PACKET_SIZE_BYTES(nsamps)) { +#if DEBUG + printf("------- TX ------: buff2 current position=%d remaining_bytes=%d bytes_sent=%d \n", + (void *)(buff2+bytes_sent), + UDP_PACKET_SIZE_BYTES(nsamps) - bytes_sent, + bytes_sent); +#endif + /* Send packet */ + bytes_sent += sendto(eth->sockfd, + buff2, + UDP_PACKET_SIZE_BYTES(nsamps), + sendto_flag, + (struct sockaddr*)ð->dest_addr, + eth->addr_len); + + if ( bytes_sent == -1) { + eth->num_tx_errors++; + perror("ETHERNET WRITE: "); + exit(-1); + } else { +#if DEBUG + printf("------- TX ------: nu=%d an_id=%d ts%d bytes_send=%d\n", + *(int16_t *)buff2, + *(int16_t *)(buff2 + sizeof(int16_t)), + *(openair0_timestamp *)(buff2 + sizeof(int32_t)), + bytes_sent); + dump_packet((device->host_type == BBU_HOST)? "BBU":"RRH", buff2, UDP_PACKET_SIZE_BYTES(nsamps), TX_FLAG); +#endif + eth->tx_actual_nsamps=bytes_sent>>2; + eth->tx_count++; + pck_seq_num++; + if ( pck_seq_num > MAX_PACKET_SEQ_NUM(nsamps,device->openair0_cfg->samples_per_frame) ) pck_seq_num = 1; + } + } + /* tx buffer values restored */ + *(int32_t *)buff2 = temp0; + *(openair0_timestamp *)(buff2 + sizeof(int32_t)) = temp1; + } + + return (bytes_sent-APP_HEADER_SIZE_BYTES)>>2; +} + + + +int trx_eth_read_udp(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc) { + + int bytes_received=0; + eth_state_t *eth = (eth_state_t*)device->priv; + // openair0_timestamp prev_timestamp = -1; + int rcvfrom_flag =0; + int block_cnt=0; + int again_cnt=0; + int i=0; + + eth->rx_nsamps=nsamps; + + for (i=0;isockfd, + buff2, + UDP_PACKET_SIZE_BYTES(nsamps), + rcvfrom_flag, + (struct sockaddr *)ð->dest_addr, + (socklen_t *)ð->addr_len); + + if (bytes_received ==-1) { + eth->num_rx_errors++; + if (errno == EAGAIN) { + again_cnt++; + usleep(10); + if (again_cnt == 1000) { + perror("ETHERNET READ: "); + exit(-1); + } else { + printf("AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN \n"); + goto again; + } + } else if (errno == EWOULDBLOCK) { + block_cnt++; + usleep(10); + if (block_cnt == 1000) { + perror("ETHERNET READ: "); + exit(-1); + } else { + printf("BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK \n"); + goto again; + } + } + } else { +#if DEBUG + printf("------- RX------: nu=%d an_id=%d ts%d bytes_recv=%d\n", + *(int16_t *)buff2, + *(int16_t *)(buff2 + sizeof(int16_t)), + *(openair0_timestamp *)(buff2 + sizeof(int32_t)), + bytes_received); + dump_packet((device->host_type == BBU_HOST)? "BBU":"RRH", buff2, UDP_PACKET_SIZE_BYTES(nsamps),RX_FLAG); +#endif + + /* store the timestamp value from packet's header */ + *timestamp = *(openair0_timestamp *)(buff2 + sizeof(int32_t)); + /* store the sequence number of the previous packet received */ + if (pck_seq_num_cur == 0) { + pck_seq_num_prev = *(uint16_t *)buff2; + } else { + pck_seq_num_prev = pck_seq_num_cur; + } + /* 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==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); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RX_SEQ_NUM_PRV,pck_seq_num_prev); + eth->rx_actual_nsamps=bytes_received>>2; + eth->rx_count++; + } + + } + /* tx buffer values restored */ + *(int32_t *)buff2 = temp0; + *(openair0_timestamp *)(buff2 + sizeof(int32_t)) = temp1; + + } + return (bytes_received-APP_HEADER_SIZE_BYTES)>>2; +} + + + + +int eth_set_dev_conf_udp(openair0_device *device) { + + eth_state_t *eth = (eth_state_t*)device->priv; + void *msg; + ssize_t msg_len; + + + /* a BBU client sents to RRH a set of configuration parameters (openair0_config_t) + so that RF front end is configured appropriately and + frame/packet size etc. can be set */ + + msg=malloc(sizeof(openair0_config_t)); + msg_len=sizeof(openair0_config_t); + memcpy(msg,(void*)device->openair0_cfg,msg_len); + + 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); + } + + return 0; +} + +int eth_get_dev_conf_udp(openair0_device *device) { + + eth_state_t *eth = (eth_state_t*)device->priv; + char str1[INET_ADDRSTRLEN],str[INET_ADDRSTRLEN]; + void *msg; + ssize_t msg_len; + + msg=malloc(sizeof(openair0_config_t)); + msg_len=sizeof(openair0_config_t); + + 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, + msg, + msg_len, + 0, + (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, &(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, &(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,str1, device->openair0_cfg->remote_port, str, device->openair0_cfg->my_port); */ + return 0; +} From 0717c18ccbe69ddc1d31bfaf511747c515348d8d Mon Sep 17 00:00:00 2001 From: "Raymond.Knopp" Date: Sun, 4 Dec 2016 12:11:03 +0100 Subject: [PATCH 041/128] modifications for PRACH on IF4p5 --- openair1/SCHED/phy_procedures_lte_eNb.c | 2 +- ...RB.if4p5.conf => rcc.band7.tm1.if4p5.50PRB.conf} | 0 targets/RT/USER/lte-enb.c | 13 ++++++------- 3 files changed, 7 insertions(+), 8 deletions(-) rename targets/PROJECTS/GENERIC-LTE-EPC/CONF/{rcc.band7.tm1.50PRB.if4p5.conf => rcc.band7.tm1.if4p5.50PRB.conf} (100%) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 5725713e42..fe9fc68abe 100644 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1916,7 +1916,7 @@ void prach_procedures(PHY_VARS_eNB *eNB) { eNB->UE_stats[(uint32_t)UE_id].UE_timing_offset = preamble_delay_list[preamble_max]&0x1FFF; //limit to 13 (=11+2) bits eNB->UE_stats[(uint32_t)UE_id].sector = 0; - LOG_I(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure (UE_id %d) with preamble %d, energy %d.%d dB, delay %d\n", + LOG_D(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure (UE_id %d) with preamble %d, energy %d.%d dB, delay %d\n", eNB->Mod_id, eNB->CC_id, frame, 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 100% 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 diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 958a5069a1..020e5b944f 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -543,7 +543,8 @@ static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_nam // **************************************** // Common RX procedures subframe n - if (eNB->do_prach) eNB->do_prach(eNB,proc->frame_rx,proc->subframe_rx); + 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); // UE-specific RX processing for subframe n @@ -980,34 +981,32 @@ void rx_fh_if4p5(PHY_VARS_eNB *eNB,int *frame,int *subframe) { eNB_proc_t *proc = &eNB->proc; int f,sf; - int prach_rx; - uint16_t packet_type; uint32_t symbol_number=0; uint32_t symbol_mask, symbol_mask_full; symbol_mask_full = (1<symbols_per_tti)-1; - prach_rx = (is_prach_subframe(fp, *frame, *subframe)>0) ? 1 : 0; 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, &f, &sf, &packet_type, &symbol_number); //proc->frame_rx = (proc->frame_rx + proc->frame_offset)&1023; if (packet_type == IF4p5_PULFFT) { + LOG_D(PHY,"rx_fh:if4p5: frame %d, subframe %d, PULFFT symbol %d\n",f,sf,symbol_number); proc->subframe_rx = sf; proc->frame_rx = f; proc->symbol_mask[proc->subframe_rx] = proc->symbol_mask[proc->subframe_rx] | (1<do_prach) eNB->do_prach(eNB,f,sf); } - if (eNB->CC_id==1) LOG_I(PHY,"rx_fh_if4p5: symbol_mask[%d] %x, prach %d\n",*subframe,proc->symbol_mask[*subframe],prach_rx); + 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) || (prach_rx == 1)); + } while(proc->symbol_mask[*subframe] != symbol_mask_full); proc->symbol_mask[*subframe] = 0; proc->symbol_mask[(9+*subframe)%10]= 0; // to handle a resynchronization event From 76ee52a635bc1c15aab1474b466e1e087cd215d2 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 4 Dec 2016 17:49:25 +0100 Subject: [PATCH 042/128] small changes for rru debugging --- .../rru.band7.tm1.if4p5.100PRB.usrpb210.conf | 21 +++++++++++-------- .../rru.band7.tm1.if4p5.50PRB.usrpb210.conf | 8 +++---- targets/RT/USER/lte-enb.c | 10 +++++++-- 3 files changed, 24 insertions(+), 15 deletions(-) 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 b1c4298104..664bbec846 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.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 = "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.50PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.50PRB.usrpb210.conf index c8c5b73974..ecbe2f049f 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,7 +31,7 @@ eNBs = tdd_config_s = 0; prefix_type = "NORMAL"; eutra_band = 7; - downlink_frequency = 2685000000L; + downlink_frequency = 2660000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; N_RB_DL = 50; @@ -159,12 +159,12 @@ eNBs = rrh_gw_config = ( { local_if_name = "eth0"; - remote_address = "90:e2:ba:c5:fc:04"; - local_address = "00:13:95:1f:a0:af"; + 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/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 5df143b67a..01f549645f 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -722,6 +722,9 @@ void fh_if5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) { 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; @@ -762,12 +765,12 @@ void fh_if4p5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) { else { if (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"); + exit_fun("Exiting"); } if (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"); + exit_fun("Exiting"); } } if (packet_type == IF4p5_PDLFFT) { @@ -782,6 +785,9 @@ void fh_if4p5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) { *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; From b0766d70746940439bf3ee8c176a2b4bc02279da Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 4 Dec 2016 20:17:33 +0100 Subject: [PATCH 043/128] added prach buffer for if4p5 processing in RRU. This fixed a critical bug which was seen for bandwidths greater than 5 MHz. RRU tested with 5/10 MHz on 1.5 GHz Atom. --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 31 ++++++++++++++------------ targets/ARCH/COMMON/common_lib.h | 2 ++ 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index d17f49ff34..04982a19e6 100755 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -40,10 +40,11 @@ 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->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; + 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; + void *tx_buffer_prach = eNB->ifbuffer.tx_prach; uint16_t symbol_id=0, element_id=0; uint16_t db_fulllength, db_halflength; @@ -145,27 +146,27 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type db_fulllength = PRACH_HARD_CODED_NUM_SAMPLES; if (eth->flags == ETH_RAW_IF4p5_MODE) { - packet_header = (IF4p5_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); + 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); - data_block = (uint16_t*)(tx_buffer + sizeof_IF4p5_header_t); + 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 + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t), + 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 + sizeof_IF4p5_header_t), + memcpy((int16_t*)(tx_buffer_prach + sizeof_IF4p5_header_t), (&rxsigF[0][k]), PRACH_BLOCK_SIZE_BYTES); } if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice, symbol_id, - &tx_buffer, + &tx_buffer_prach, db_fulllength, 1, IF4p5_PRACH)) < 0) { @@ -331,10 +332,12 @@ void malloc_IF4p5_buffer(PHY_VARS_eNB *eNB) { // Keep the size large enough eth_state_t *eth = (eth_state_t*) (eNB->ifdevice.priv); if (eth->flags == ETH_RAW_IF4p5_MODE) { - eNB->ifbuffer.tx = malloc(RAW_IF4p5_PRACH_SIZE_BYTES); - eNB->ifbuffer.rx = malloc(RAW_IF4p5_PRACH_SIZE_BYTES); + eNB->ifbuffer.tx = 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 { - eNB->ifbuffer.tx = malloc(UDP_IF4p5_PRACH_SIZE_BYTES); - eNB->ifbuffer.rx = malloc(UDP_IF4p5_PRACH_SIZE_BYTES); + eNB->ifbuffer.tx = 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/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h index 7eaa1e0afb..79993dc52c 100644 --- a/targets/ARCH/COMMON/common_lib.h +++ b/targets/ARCH/COMMON/common_lib.h @@ -249,6 +249,8 @@ typedef struct { typedef struct { //! Tx buffer for if device void *tx; + //! Tx buffer (PRACH) for if device + void *tx_prach; //! Rx buffer for if device void *rx; } if_buffer_t; From 108cf6bff0d5f40433f80690fce86c8b7d094352 Mon Sep 17 00:00:00 2001 From: "Raymond.Knopp" Date: Sun, 4 Dec 2016 12:20:12 +0100 Subject: [PATCH 044/128] renaming of RCC configuration files --- ...and7.tm1.100PRB.if4p5.conf => rcc.band7.tm1.if4p5.100PRB.conf} | 0 ...7.tm1.50PRB.if5.usrpb210.conf => rcc.band7.tm1.if5.50PRB.conf} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename targets/PROJECTS/GENERIC-LTE-EPC/CONF/{rcc.band7.tm1.100PRB.if4p5.conf => rcc.band7.tm1.if4p5.100PRB.conf} (100%) rename targets/PROJECTS/GENERIC-LTE-EPC/CONF/{rcc.band7.tm1.50PRB.if5.usrpb210.conf => rcc.band7.tm1.if5.50PRB.conf} (100%) 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 100% 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 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 100% 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 From 12ed6c21f1506d923df4dd0e275821585156a90a Mon Sep 17 00:00:00 2001 From: "Raymond.Knopp" Date: Thu, 22 Dec 2016 23:16:31 +0100 Subject: [PATCH 045/128] minor changes in lte-enb.c and rcc configuration files --- .../GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.25PRB.conf | 2 +- .../GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if5.25PRB.conf | 8 ++++---- targets/RT/USER/lte-enb.c | 8 +++++--- 3 files changed, 10 insertions(+), 8 deletions(-) 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 3e404e5dc6..5bdfcc7a12 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,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 = 25; 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 index 6987bebda9..e8e0e6dadb 100644 --- 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 @@ -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 = 25; @@ -68,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"; @@ -86,7 +86,7 @@ eNBs = rach_messagePowerOffsetGroupB = ; */ rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -108; + rach_preambleInitialReceivedTargetPower = -104; rach_preambleTransMax = 10; rach_raResponseWindowSize = 10; rach_macContentionResolutionTimer = 48; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index eccb09758c..d118056abd 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -643,7 +643,7 @@ 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; @@ -964,8 +964,8 @@ void rx_fh_if5(PHY_VARS_eNB *eNB,int *frame, int *subframe) { recv_IF5(eNB, &proc->timestamp_rx, *subframe, IF5_RRH_GW_UL); - 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->timestamp_rx-eNB / (fp->samples_per_tti*10))&1023; + proc->subframe_rx = (proc->timestamp_rx-eNB / fp->samples_per_tti)%10; if (proc->first_rx == 0) { if (proc->subframe_rx != *subframe){ @@ -983,6 +983,8 @@ void rx_fh_if5(PHY_VARS_eNB *eNB,int *frame, int *subframe) { *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 ); From 975342399d85775b9a8e48295de51aa505cc6bbd Mon Sep 17 00:00:00 2001 From: "Raymond.Knopp" Date: Tue, 27 Dec 2016 21:31:11 +0100 Subject: [PATCH 046/128] bugfix for DCCH2/SRB2 in eNB_scheduler_dlsch.c, demultiplexing SIMD alignment issue in ulsch_decoding.c, IF5 fronthaul modification in lte-enb.c --- openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c | 21 ++++++++++++++--- openair2/LAYER2/MAC/eNB_scheduler_dlsch.c | 25 +++++++++++---------- targets/RT/USER/lte-enb.c | 4 ++-- 3 files changed, 33 insertions(+), 17 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c index 68f3abc094..8edb1eaf94 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c @@ -1440,7 +1440,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, j2+=Q_m; } - + /* To be improved according to alignment of j2 #if defined(__x86_64__)||defined(__i386__) #ifndef __AVX2__ for (iprime=0; iprimee[iprime]) = *((int16x8_t *)&y[j2]); -#endif +#endif + */ + int16_t *yp,*ep; + for (iprime=0,yp=&y[j2],ep=&ulsch_harq->e[0]; + iprimeulsch_demultiplexing_stats); // printf("after ACKNAK2 c[%d] = %p (iprime %d, G %d)\n",0,ulsch_harq->c[0],iprime,G); diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c index 399fd701ce..573a3401b0 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c @@ -814,15 +814,15 @@ schedule_ue_spec( if (rlc_status.bytes_in_buffer > 0) { // There is DCCH to transmit LOG_D(MAC,"[eNB %d] Frame %d, DL-DCCH->DLSCH CC_id %d, Requesting %d bytes from RLC (RRC message)\n", module_idP,frameP,CC_id,TBS-header_len_dcch); - sdu_lengths[0] += mac_rlc_data_req( - module_idP, - rnti, - module_idP, - frameP, - ENB_FLAG_YES, - MBMS_FLAG_NO, - DCCH, - (char *)&dlsch_buffer[sdu_lengths[0]]); + sdu_lengths[0] = mac_rlc_data_req( + module_idP, + rnti, + module_idP, + frameP, + ENB_FLAG_YES, + MBMS_FLAG_NO, + DCCH, + (char *)&dlsch_buffer[0]); T(T_ENB_MAC_UE_DL_SDU, T_INT(module_idP), T_INT(CC_id), T_INT(rnti), T_INT(frameP), T_INT(subframeP), T_INT(harq_pid), T_INT(DCCH), T_INT(sdu_lengths[0])); @@ -847,7 +847,7 @@ schedule_ue_spec( sdu_length_total = 0; } } - + // check for DCCH1 and update header information (assume 2 byte sub-header) if (TBS-ta_len-header_len_dcch-sdu_length_total > 0 ) { rlc_status = mac_rlc_status_ind( @@ -860,9 +860,10 @@ schedule_ue_spec( DCCH+1, (TBS-ta_len-header_len_dcch-sdu_length_total)); // transport block set size less allocations for timing advance and // DCCH SDU + sdu_lengths[num_sdus] = 0; if (rlc_status.bytes_in_buffer > 0) { - LOG_D(MAC,"[eNB %d], Frame %d, DCCH1->DLSCH, CC_id %d, Requesting %d bytes from RLC (RRC message)\n", + LOG_I(MAC,"[eNB %d], Frame %d, DCCH1->DLSCH, CC_id %d, Requesting %d bytes from RLC (RRC message)\n", module_idP,frameP,CC_id,TBS-header_len_dcch-sdu_length_total); sdu_lengths[num_sdus] += mac_rlc_data_req( module_idP, @@ -872,7 +873,7 @@ schedule_ue_spec( ENB_FLAG_YES, MBMS_FLAG_NO, DCCH+1, - (char *)&dlsch_buffer[sdu_lengths[num_sdus]]); + (char *)&dlsch_buffer[sdu_length_total]); T(T_ENB_MAC_UE_DL_SDU, T_INT(module_idP), T_INT(CC_id), T_INT(rnti), T_INT(frameP), T_INT(subframeP), T_INT(harq_pid), T_INT(DCCH+1), T_INT(sdu_lengths[num_sdus])); diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 911f265b63..c30e726609 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -966,8 +966,8 @@ void rx_fh_if5(PHY_VARS_eNB *eNB,int *frame, int *subframe) { recv_IF5(eNB, &proc->timestamp_rx, *subframe, IF5_RRH_GW_UL); - proc->frame_rx = (proc->timestamp_rx-eNB / (fp->samples_per_tti*10))&1023; - proc->subframe_rx = (proc->timestamp_rx-eNB / fp->samples_per_tti)%10; + proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; + proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; if (proc->first_rx == 0) { if (proc->subframe_rx != *subframe){ From 2507933c824fc54d59051335add92eb16e633cb6 Mon Sep 17 00:00:00 2001 From: "Raymond.Knopp" Date: Wed, 28 Dec 2016 11:43:33 +0100 Subject: [PATCH 047/128] bugfix in rrc_eNB_s1AP.c. ue_context_p is used before checking if pointer is non-null. --- openair2/RRC/LITE/rrc_eNB_S1AP.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/openair2/RRC/LITE/rrc_eNB_S1AP.c b/openair2/RRC/LITE/rrc_eNB_S1AP.c index a3dc9f47a1..8899c7d743 100644 --- a/openair2/RRC/LITE/rrc_eNB_S1AP.c +++ b/openair2/RRC/LITE/rrc_eNB_S1AP.c @@ -774,8 +774,8 @@ rrc_eNB_process_S1AP_DOWNLINK_NAS( ue_initial_id = S1AP_DOWNLINK_NAS (msg_p).ue_initial_id; eNB_ue_s1ap_id = S1AP_DOWNLINK_NAS (msg_p).eNB_ue_s1ap_id; ue_context_p = rrc_eNB_get_ue_context_from_s1ap_ids(instance, ue_initial_id, eNB_ue_s1ap_id); - srb_id = ue_context_p->ue_context.Srb2.Srb_info.Srb_id; - + + LOG_I(RRC, "[eNB %d] Received %s: ue_initial_id %d, eNB_ue_s1ap_id %d\n", instance, msg_name, @@ -822,6 +822,9 @@ rrc_eNB_process_S1AP_DOWNLINK_NAS( } else { PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, ENB_FLAG_YES, ue_context_p->ue_context.rnti, 0, 0); + srb_id = ue_context_p->ue_context.Srb2.Srb_info.Srb_id; + + /* Is it the first income from S1AP ? */ if (ue_context_p->ue_context.eNB_ue_s1ap_id == 0) { ue_context_p->ue_context.eNB_ue_s1ap_id = S1AP_DOWNLINK_NAS (msg_p).eNB_ue_s1ap_id; From 93a244cfaf970bcca06321bc0986cc73db3bf68c Mon Sep 17 00:00:00 2001 From: "Raymond.Knopp" Date: Mon, 2 Jan 2017 23:39:35 +0100 Subject: [PATCH 048/128] debugging for 20 MHz RRU --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 2 ++ openair1/SCHED/phy_procedures_lte_eNb.c | 2 +- .../GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.100PRB.conf | 2 +- targets/RT/USER/lte-enb.c | 9 +++++---- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 04982a19e6..4d3456b2ae 100755 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -266,6 +266,8 @@ 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 = PRACH_HARD_CODED_NUM_SAMPLES; diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 319ee8f48a..7252584756 100644 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2813,7 +2813,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB){ LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; const int subframe = proc->subframe_rx; const int frame = proc->frame_rx; - int offset = eNB->CC_id;//(eNB->single_thread_flag==1) ? 0 : (subframe&1); + int offset = (eNB->single_thread_flag==0) ? 0 : (subframe&1); if ((fp->frame_type == TDD) && (subframe_select(fp,subframe)!=SF_UL)) return; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.100PRB.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.100PRB.conf index 54c34520dd..e52a36542f 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.100PRB.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.100PRB.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; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index c30e726609..30239c6608 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -421,7 +421,7 @@ void proc_tx_high0(PHY_VARS_eNB *eNB, relaying_type_t r_type, PHY_VARS_RN *rn) { - int offset = eNB->CC_id;//proc == &eNB->proc.proc_rxtx[0] ? 0 : 1; + int offset = proc == &eNB->proc.proc_rxtx[0] ? 0 : 1; VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB+offset, proc->frame_tx ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_ENB+offset, proc->subframe_tx ); @@ -1013,10 +1013,8 @@ void rx_fh_if4p5(PHY_VARS_eNB *eNB,int *frame,int *subframe) { //proc->frame_rx = (proc->frame_rx + proc->frame_offset)&1023; if (packet_type == IF4p5_PULFFT) { LOG_D(PHY,"rx_fh:if4p5: frame %d, subframe %d, PULFFT symbol %d\n",f,sf,symbol_number); - proc->subframe_rx = sf; - proc->frame_rx = f; - proc->symbol_mask[proc->subframe_rx] = proc->symbol_mask[proc->subframe_rx] | (1<symbol_mask[sf] = proc->symbol_mask[sf] | (1<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 = *subframe; + proc->frame_rx = *frame; + proc->symbol_mask[*subframe] = 0; proc->symbol_mask[(9+*subframe)%10]= 0; // to handle a resynchronization event From 1d331c0bf8e9f7c0162d130d44ffb747f816fce2 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Tue, 3 Jan 2017 07:46:36 +0100 Subject: [PATCH 049/128] Changes for 20 MHz RRU (dual-thread mode) --- openair1/PHY/INIT/lte_init.c | 44 ++++--- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 14 +- openair1/PHY/LTE_TRANSPORT/pcfich.c | 2 +- openair1/PHY/MODULATION/slot_fep_ul.c | 14 +- openair1/PHY/defs.h | 2 +- openair1/SCHED/defs.h | 2 +- openair1/SCHED/phy_procedures_lte_eNb.c | 25 ++-- targets/ARCH/COMMON/common_lib.h | 4 +- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 5 +- .../rru.band7.tm1.if4p5.100PRB.usrpb210.conf | 2 +- targets/RT/USER/lte-enb.c | 28 ++-- targets/RT/USER/lte-softmodem.c | 36 ++--- targets/RT/USER/rru_if4p5_usrp.gtkw | 124 +----------------- targets/SIMU/USER/init_lte.c | 54 ++++---- targets/SIMU/USER/init_lte.h | 1 + 15 files changed, 142 insertions(+), 215 deletions(-) diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index 3fb1d0c26b..2f023f8235 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 @@ -1219,13 +1219,22 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, for (i=0; inb_antennas_tx; i++) { if (eNB->node_function != NGFI_RCC_IF4p5) + // 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) ); - 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_IF4p5) + // Allocate 2 subframes of I/Q signal data (frequency) + common_vars->txdataF[eNB_id][i] = (int32_t*)malloc16_clear( fp->ofdm_symbol_size*fp->symbols_per_tti*2*sizeof(int32_t) ); + else if (eNB->node_function != NGFI_RRU_IF5) + // Allocate 10 subframes of I/Q signal data (frequency) + 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 - printf("[openair][LTE_PHY][INIT] common_vars->txdata[%d][%d] = %p\n",eNB_id,i,common_vars->txdata[eNB_id][i]); - printf("[openair][LTE_PHY][INIT] 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->txdata[%d][%d] = %p (%lu bytes)\n",eNB_id,i,common_vars->txdata[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->txdataF[%d][%d] = %p (%lu bytes)\n", + eNB_id,i,common_vars->txdataF[eNB_id][i], + fp->ofdm_symbol_size*fp->symbols_per_tti*(eNB->node_function==NGFI_RRU_IF4p5?2:10)*sizeof(int32_t)); #endif } @@ -1238,18 +1247,23 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, for (i=0; inb_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) ); } - - 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_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*2*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 } - 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_idnode_function != NGFI_RRU_IF4p5) { + if ((eNB->node_function != NGFI_RRU_IF4p5)&&(eNB->node_function != NGFI_RRU_IF5)) { generate_ul_ref_sigs_rx(); // SRS @@ -1286,7 +1300,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]) */ @@ -1299,7 +1313,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; inb_antennas_rx; i++) { diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 04982a19e6..93f6e121cb 100755 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -43,7 +43,7 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type 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; + void *tx_buffer = eNB->ifbuffer.tx[subframe&1]; void *tx_buffer_prach = eNB->ifbuffer.tx_prach; uint16_t symbol_id=0, element_id=0; @@ -234,7 +234,7 @@ void recv_IF4p5(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_t 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; + slotoffsetF = (*symbol_number)*(fp->ofdm_symbol_size) + ((*subframe)&1)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength - 1; for (element_id=0; element_idifdevice.priv); + int i; + if (eth->flags == ETH_RAW_IF4p5_MODE) { - eNB->ifbuffer.tx = malloc(RAW_IF4p5_PRACH_SIZE_BYTES); + 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 { - eNB->ifbuffer.tx = malloc(UDP_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/pcfich.c b/openair1/PHY/LTE_TRANSPORT/pcfich.c index 8af540eea1..f7e4fe58b5 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/MODULATION/slot_fep_ul.c b/openair1/PHY/MODULATION/slot_fep_ul.c index b079896580..e05f5361de 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/defs.h b/openair1/PHY/defs.h index 66ff465708..7922fb131e 100644 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -437,7 +437,7 @@ typedef struct PHY_VARS_eNB_s { // indicator for master/slave (RRU) int is_slave; void (*do_prach)(struct PHY_VARS_eNB_s *eNB,int frame,int subframe); - void (*fep)(struct PHY_VARS_eNB_s *eNB); + 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); diff --git a/openair1/SCHED/defs.h b/openair1/SCHED/defs.h index ba5f4cc8b5..2a502f923a 100644 --- a/openair1/SCHED/defs.h +++ b/openair1/SCHED/defs.h @@ -177,7 +177,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 diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 5e0c750b10..89ae2304e3 100644 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2623,7 +2623,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; @@ -2669,28 +2669,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; lsymbols_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 ); @@ -2701,11 +2700,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; @@ -2759,14 +2758,14 @@ void do_prach(PHY_VARS_eNB *eNB,int frame,int subframe) { } -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->CC_id;//(eNB->single_thread_flag==1) ? 0 : (subframe&1); + int offset = (eNB->single_thread_flag==1) ? 0 : (subframe&1); if ((fp->frame_type == TDD) && (subframe_select(fp,subframe)!=SF_UL)) return; @@ -2778,7 +2777,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB){ 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->fep) eNB->fep(eNB,proc); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON+offset, 0 ); } diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h index 79993dc52c..98f383cb61 100644 --- a/targets/ARCH/COMMON/common_lib.h +++ b/targets/ARCH/COMMON/common_lib.h @@ -247,8 +247,8 @@ 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 diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index a12e374e8a..3d0674c73e 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -759,7 +759,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; irx_stream = s->usrp->get_rx_stream(stream_args_rx); 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 664bbec846..aa731c8d8a 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 @@ -159,7 +159,7 @@ eNBs = rrh_gw_config = ( { local_if_name = "eth0"; - remote_address = "10.10.10.155"; + 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; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index eccb09758c..49f820a8b4 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -286,7 +286,8 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 1 ); - slot_offset_F = (subframe<<1)*slot_sizeF; + // compute subframe modulo-2 + slot_offset_F = ((subframe&1)<<1)*slot_sizeF; slot_offset = subframe*phy_vars_eNB->frame_parms.samples_per_tti; @@ -554,7 +555,7 @@ static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_nam 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); + 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 ); @@ -864,7 +865,7 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) { unsigned int rxs,txs; int i; int tx_sfoffset = 3;//(eNB->single_thread_flag == 1) ? 3 : 3; - openair0_timestamp old_ts; + openair0_timestamp ts,old_ts; if (proc->first_rx==0) { @@ -878,7 +879,7 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) { 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, + proc->timestamp_rx+eNB->ts_offset+(tx_sfoffset*fp->samples_per_tti)-openair0_cfg[0].tx_sample_advance, txp, fp->samples_per_tti, fp->nb_antennas_tx, @@ -902,26 +903,32 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) { 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) + 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-eNB->ts_offset) / (fp->samples_per_tti*10))&1023; - proc->subframe_rx = ((proc->timestamp_rx-eNB->ts_offset) / fp->samples_per_tti)%10; + 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; @@ -1860,8 +1867,8 @@ int start_rf(PHY_VARS_eNB *eNB) { } 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 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,int wait_for_sync) { @@ -1933,6 +1940,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) { diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index d7a4407904..453b5934d6 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -1622,35 +1622,34 @@ int main( int argc, char **argv ) PHY_vars_eNB_g[0] = malloc(sizeof(PHY_VARS_eNB*)); for (CC_id=0; CC_idNid_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; - + 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; ipusch_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]; - + if (frame_parms[CC_id]->frame_type==FDD) { PHY_vars_eNB_g[0][CC_id]->N_TA_offset = 0; } @@ -1663,7 +1662,7 @@ int main( int argc, char **argv ) PHY_vars_eNB_g[0][CC_id]->N_TA_offset = 624/4; } } - + NB_eNB_INST=1; NB_INST=1; @@ -1843,6 +1842,7 @@ int main( int argc, char **argv ) } } else { + printf("Initializing eNB threads\n"); init_eNB(node_function,node_timing,1,eth_params,single_thread_flag,wait_for_sync); number_of_cards = 1; diff --git a/targets/RT/USER/rru_if4p5_usrp.gtkw b/targets/RT/USER/rru_if4p5_usrp.gtkw index df8de754db..62744addfe 100644 --- a/targets/RT/USER/rru_if4p5_usrp.gtkw +++ b/targets/RT/USER/rru_if4p5_usrp.gtkw @@ -1,12 +1,12 @@ [*] [*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI -[*] Mon Aug 1 18:43:22 2016 +[*] Tue Jan 3 00:00:25 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] "Mon Jan 2 23:59:11 2017" +[dumpfile_size] 93728 +[savefile] "/home/uprru1/oai/openairinterface5g/targets/RT/USER/rru_if4p5_usrp.gtkw" +[timestart] 23491157000 [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 @@ -20,7 +20,6 @@ functions.trx_write functions.trx_write_if functions.send_if4 functions.trx_read_if -@29 functions.recv_if4 @24 variables.trx_ts[63:0] @@ -43,118 +42,5 @@ variables.subframe_number_TX1_eNB[63:0] functions.phy_enb_sfgen 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/init_lte.c b/targets/SIMU/USER/init_lte.c index 5a742e9e61..7071702c28 100644 --- a/targets/SIMU/USER/init_lte.c +++ b/targets/SIMU/USER/init_lte.c @@ -41,6 +41,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) { @@ -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,33 @@ 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; idlsch[i][j] = new_eNB_dlsch(1,8,NSOFT,frame_parms->N_RB_DL,abstraction_flag); - + 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_antennas_tx_eNB==1 ? 1 : 2; @@ -91,7 +99,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 +107,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 +115,37 @@ 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); 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); 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); 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; imu_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 +279,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_idMod_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 bcb2570565..e49c24a15b 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, From e466b2c1bcd5baa4b32961e79674f1227eed96cd Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Wed, 4 Jan 2017 14:26:58 -0500 Subject: [PATCH 050/128] patch for lte-ue.c on trx_read which allows oaisim to work. rxdata -> UE->common_vars.rxdata --- targets/RT/USER/lte-ue.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 5ab6b7cddf..a8453e5d6f 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -958,7 +958,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; iframe_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, @@ -1022,7 +1022,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) { @@ -1038,7 +1038,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)) { @@ -1067,7 +1067,7 @@ void *UE_thread(void *arg) { for (int sf=0;sf<10;sf++) { for (i=0; iframe_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) { @@ -1147,7 +1147,7 @@ void *UE_thread(void *arg) { // read in first symbol of next frame and adjust for timing drift rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, ×tamp1, - (void**)rxdata, + (void**)UE->common_vars.rxdata, UE->frame_parms.ofdm_symbol_size + UE->frame_parms.nb_prefix_samples0 - rx_off_diff, UE->frame_parms.nb_antennas_rx); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_SF9, 0 ); From e66338669e04a3b54d3b786bcd0b0bdfd4e4b7dd Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Thu, 5 Jan 2017 09:47:14 +0100 Subject: [PATCH 051/128] changes for RRU (merge with develop). single-thread-disable flag is functional for RRU. --- openair1/PHY/INIT/lte_init.c | 25 ++++++++----------------- openair1/PHY/MODULATION/ofdm_mod.c | 20 ++++++++++---------- openair1/SIMULATION/LTE_PHY/dlsim.c | 11 +++++++++-- targets/RT/USER/lte-enb.c | 2 +- targets/RT/USER/rru_if4p5_usrp.gtkw | 8 ++++---- 5 files changed, 32 insertions(+), 34 deletions(-) diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index db3c8d6b72..5176f9ee6c 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -1304,35 +1304,26 @@ 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<((eNB->do_precoding==0)?fp->nb_antennas_tx:14); i++) { + 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; inb_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) // 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) ); - if (eNB->node_function == NGFI_RRU_IF4p5) - // Allocate 2 subframes of I/Q signal data (frequency) - common_vars->txdataF[eNB_id][i] = (int32_t*)malloc16_clear( fp->ofdm_symbol_size*fp->symbols_per_tti*2*sizeof(int32_t) ); - else if (eNB->node_function != NGFI_RRU_IF5) - // Allocate 10 subframes of I/Q signal data (frequency) - 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 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)); - if (eNB->node_function != NGFI_RRU_IF5) - 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*(eNB->node_function==NGFI_RRU_IF4p5?2:10)*sizeof(int32_t)); #endif } @@ -1379,7 +1370,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, // 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 (%lu bytes)\n",eNB_id,i,common_vars->rxdata[eNB_id][i],fp->samples_per_tti*2*sizeof(int32_t)); + 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 diff --git a/openair1/PHY/MODULATION/ofdm_mod.c b/openair1/PHY/MODULATION/ofdm_mod.c index 953e130115..8e09cea1ec 100644 --- a/openair1/PHY/MODULATION/ofdm_mod.c +++ b/openair1/PHY/MODULATION/ofdm_mod.c @@ -288,13 +288,13 @@ void do_OFDM_mod(int32_t **txdataF, int32_t **txdata, uint32_t frame,uint16_t ne 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]; - int32_t **txdataF_BF = (do_precoding==1)?eNB_common_vars->txdataF_BF[eNB_id]:txdataF; - int32_t **txdata = eNB_common_vars->txdata[eNB_id]; - - slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1); + 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); + 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; lsymbols_per_tti>>1; l++) { @@ -307,8 +307,8 @@ void do_OFDM_mod_symbol(LTE_eNB_COMMON *eNB_common_vars, int eNB_id, uint16_t ne //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 +316,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 +324,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/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index f9a8acfa85..879573525a 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); diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 9f330a1be6..2b8eecc505 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -867,7 +867,7 @@ 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) { diff --git a/targets/RT/USER/rru_if4p5_usrp.gtkw b/targets/RT/USER/rru_if4p5_usrp.gtkw index 62744addfe..d2a435202f 100644 --- a/targets/RT/USER/rru_if4p5_usrp.gtkw +++ b/targets/RT/USER/rru_if4p5_usrp.gtkw @@ -1,10 +1,10 @@ [*] [*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI -[*] Tue Jan 3 00:00:25 2017 +[*] Thu Jan 5 06:19:58 2017 [*] [dumpfile] "/tmp/openair_dump_eNB.vcd" -[dumpfile_mtime] "Mon Jan 2 23:59:11 2017" -[dumpfile_size] 93728 +[dumpfile_mtime] "Thu Jan 5 06:09:13 2017" +[dumpfile_size] 24570356 [savefile] "/home/uprru1/oai/openairinterface5g/targets/RT/USER/rru_if4p5_usrp.gtkw" [timestart] 23491157000 [size] 1301 716 @@ -39,7 +39,7 @@ 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 [pattern_trace] 1 From 328731af18a15304f6b2c9552eb08308f194895e Mon Sep 17 00:00:00 2001 From: "Raymond.Knopp" Date: Fri, 6 Jan 2017 20:26:42 +0100 Subject: [PATCH 052/128] band7 rcc configuration --- .../GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.conf index 4b62f83320..886d88eab1 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.conf @@ -31,7 +31,7 @@ eNBs = tdd_config_s = 0; prefix_type = "NORMAL"; eutra_band = 7; - downlink_frequency = 2680000000L; + downlink_frequency = 2685000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; N_RB_DL = 50; From 0e919b9913ddc228c0596d8955125b01686d982d Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sat, 7 Jan 2017 04:28:06 +0100 Subject: [PATCH 053/128] configuration file band7 rru --- .../CONF/rru.band7.tm1.if4p5.50PRB.usrpb210.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 ecbe2f049f..d40b901785 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,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; From 14d28e2dbd25cd8a1614fe97d8bebe788cea56ec Mon Sep 17 00:00:00 2001 From: "Raymond.Knopp" Date: Sat, 7 Jan 2017 12:41:36 +0100 Subject: [PATCH 054/128] fixes for precoding (turning off if nb_antennas_tx=1), configuration files, timing advance with 3/4 sampling on 20 MHz, logging in MAC --- openair1/PHY/LTE_TRANSPORT/prach.c | 9 ++++-- openair1/PHY/MODULATION/beamforming.c | 27 ++++++++-------- openair1/SCHED/phy_procedures_lte_eNb.c | 11 ++++--- openair2/LAYER2/MAC/eNB_scheduler.c | 5 +-- openair2/LAYER2/MAC/pre_processor.c | 5 ++- .../CONF/enb.band7.tm1.100PRB.usrpb210.conf | 6 ++-- .../CONF/enb.band7.tm1.50PRB.usrpb210.conf | 4 +-- .../CONF/rcc.band7.tm1.if4p5.25PRB.conf | 2 +- .../CONF/rcc.band7.tm1.if4p5.50PRB.conf | 2 +- targets/RT/USER/lte-enb.c | 32 +++++++++---------- 10 files changed, 57 insertions(+), 46 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index 33780a7def..489fdb0f71 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/MODULATION/beamforming.c b/openair1/PHY/MODULATION/beamforming.c index 6557a47ee7..4f2f7535e9 100644 --- a/openair1/PHY/MODULATION/beamforming.c +++ b/openair1/PHY/MODULATION/beamforming.c @@ -66,24 +66,25 @@ int beam_precoding(int32_t **txdataF, 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;reofdm_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) { + if (txdataF[p]) {//[slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re]!=0) { + + for (re=0;reofdm_symbol_size;re++) { ((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]); - */ + 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]); + */ } } } diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 85c822e273..50fd920262 100644 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -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); } diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c index c5dc8c88b0..9a3a8f637e 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler.c +++ b/openair2/LAYER2/MAC/eNB_scheduler.c @@ -128,8 +128,9 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, 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"); + 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); next_i= UE_list->next[i]; diff --git a/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c index ed12d322c1..5024aa605d 100644 --- a/openair2/LAYER2/MAC/pre_processor.c +++ b/openair2/LAYER2/MAC/pre_processor.c @@ -791,7 +791,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 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 f4ed76a21e..c974345888 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.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf index bcf1c15a4a..3cf1e7d15b 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; @@ -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/rcc.band7.tm1.if4p5.25PRB.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.25PRB.conf index 5bdfcc7a12..f9ebec3ab5 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 @@ -150,7 +150,7 @@ 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 }; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.conf index 886d88eab1..4ad5767ce9 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.conf @@ -151,7 +151,7 @@ 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 }; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 99e05a39bf..8a01179567 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -1964,7 +1964,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst break; case eNodeB_3GPP: - eNB->do_precoding = 1; + eNB->do_precoding = (eNB->frame_parms.nb_antenna_ports_eNB==1) ? 0 : 1; 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; @@ -1985,27 +1985,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_precoding = 1; - 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_antenna_ports_eNB==1) ? 0 : 1; + 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; From 5575fed27bf89352a47d9e16f0098011393b3f94 Mon Sep 17 00:00:00 2001 From: "Raymond.Knopp" Date: Sat, 7 Jan 2017 12:55:48 +0100 Subject: [PATCH 055/128] some warning removal. --- targets/RT/USER/lte-enb.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 8a01179567..fb2271fa72 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; @@ -1010,7 +1010,7 @@ void rx_fh_if4p5(PHY_VARS_eNB *eNB,int *frame,int *subframe) { uint16_t packet_type; uint32_t symbol_number=0; - uint32_t symbol_mask, symbol_mask_full; + uint32_t symbol_mask_full; symbol_mask_full = (1<symbols_per_tti)-1; @@ -1258,6 +1258,7 @@ void *eNB_thread_synch(void *arg) { lte_sync_time_free(); + return NULL; } int wakeup_synch(PHY_VARS_eNB *eNB){ @@ -1486,6 +1487,10 @@ static void* eNB_thread_single( void* param ) { 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; @@ -1502,6 +1507,9 @@ static void* eNB_thread_single( void* param ) { 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); @@ -1514,6 +1522,9 @@ static void* eNB_thread_single( void* param ) { 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; @@ -1876,7 +1887,7 @@ 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_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); @@ -1964,7 +1975,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_antenna_ports_eNB==1) ? 0 : 1; + eNB->do_precoding = (eNB->frame_parms.nb_antennas_tx==1) ? 0 : 1; 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; @@ -1985,7 +1996,7 @@ 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_precoding = (eNB->frame_parms.nb_antenna_ports_eNB==1) ? 0 : 1; + eNB->do_precoding = (eNB->frame_parms.nb_antennas_tx==1) ? 0 : 1; 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; From c1360397ed37cc6e6c05f0ff9cbcf8e18fdd543e Mon Sep 17 00:00:00 2001 From: "Raymond.Knopp" Date: Sat, 7 Jan 2017 14:55:04 +0100 Subject: [PATCH 056/128] CMakeList.txt changes for LMSSDR, lmssdr config file 50 PRB, rx gain setting in lms_lib.cpp --- cmake_targets/CMakeLists.txt | 1 + targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp | 9 ++++++--- .../GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.lmssdr.conf | 4 ++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 714a732132..26d297f46f 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -554,6 +554,7 @@ elseif (${RF_BOARD} STREQUAL "OAI_BLADERF") elseif (${RF_BOARD} STREQUAL "OAI_LMSSDR") include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB") + include_directories("/usr/local/include/lime") LINK_DIRECTORIES("/usr/lib/x86_64-linux-gnu") LINK_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/lmsSDR") LINK_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/lms7002m") diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp index c2063527d0..bd58bb7484 100644 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp @@ -37,6 +37,8 @@ * @{ */ #include +#include +#include #include "common_lib.h" lms_device_t* lms_device; @@ -46,8 +48,7 @@ lms_stream_t tx_stream; #define RXDCLENGTH 4096 #define NUMBUFF 32 -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}; +using namespace lime; extern "C" { @@ -145,7 +146,9 @@ int trx_lms_set_gains(openair0_device* device, openair0_config_t *openair0_cfg) 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); + LMS7002M lms7; + lms7.SetConnection(lms7.GetConnection()); + lms7.Modify_SPI_Reg_bits(LMS7param(G_PGA_RBB),(int16_t)gv); return(0); 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 af9ed2c221..b01537d78d 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 @@ -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 = 50; @@ -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 }; From 637e2f0793ab236da405c5de3950ccb5ab943bd9 Mon Sep 17 00:00:00 2001 From: calvin wang Date: Mon, 9 Jan 2017 11:20:13 +0800 Subject: [PATCH 057/128] fix TDD config file parse error and add TDD band40 config file --- .../CONF/enb.band39.tm1.usrpb210.conf | 49 +++-- .../CONF/enb.band40.tm1.usrpb210.conf | 175 ++++++++++++++++++ 2 files changed, 198 insertions(+), 26 deletions(-) create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band40.tm1.usrpb210.conf 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 8caeca0edb..dba8eb7ddd 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.band40.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band40.tm1.usrpb210.conf new file mode 100644 index 0000000000..6549df8975 --- /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"; + }; + } +); From cb67d586a451fd77f862b1462e8b778c43169a23 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Tue, 10 Jan 2017 14:21:02 +0100 Subject: [PATCH 058/128] add format indicator to get LOG_X warnings The LOG_X macros emit a lot of warnings when compiling with the T because they call the function logRecord (or logRecord_mt) which has not been "marked" as calling printf, so gcc won't emit typical printf warnings. With the T, they directly translate to sprintf, so those warnings pop up, much more verbose due to several macro expansions. Let's make them pop up all the time so it's easier to fix them. --- openair2/UTIL/LOG/log_if.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openair2/UTIL/LOG/log_if.h b/openair2/UTIL/LOG/log_if.h index 1b447a7f60..3dd25ff365 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);) From f3b84e74952397f323b00dda2de904ba652718c8 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Tue, 10 Jan 2017 16:52:52 +0100 Subject: [PATCH 059/128] include init_nas_s1 in the repository init_nas_s1 may not work properly, but many people complain about this file, so let's put it in the repository. We'll fix it at some point if it's not properly usable. --- cmake_targets/tools/init_nas_s1 | 71 +++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 cmake_targets/tools/init_nas_s1 diff --git a/cmake_targets/tools/init_nas_s1 b/cmake_targets/tools/init_nas_s1 new file mode 100644 index 0000000000..5f27c52837 --- /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 From 3ec3d2a6b13d044722b61fa20e10c8a64617d2aa Mon Sep 17 00:00:00 2001 From: calvin wang Date: Wed, 11 Jan 2017 14:56:56 +0800 Subject: [PATCH 060/128] fix mistake logical and bitwise operators --- openair3/NAS/COMMON/API/NETWORK/nas_message.c | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/openair3/NAS/COMMON/API/NETWORK/nas_message.c b/openair3/NAS/COMMON/API/NETWORK/nas_message.c index 8f326904ef..f714af66f7 100644 --- a/openair3/NAS/COMMON/API/NETWORK/nas_message.c +++ b/openair3/NAS/COMMON/API/NETWORK/nas_message.c @@ -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); } @@ -1299,12 +1299,12 @@ static uint32_t _nas_message_get_mac( int i,bytes = 0; 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 +1367,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); } From f2f32f5340559059f3b2ce66fa72d3b24175932c Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Wed, 11 Jan 2017 15:48:00 +0100 Subject: [PATCH 061/128] fix LOG_X macros Some of them might not be correctly handled. I put /* TODO: XXX */ where I didn't know if the fix was correct. --- openair1/PHY/INIT/lte_init.c | 22 ++-- openair1/PHY/LTE_TRANSPORT/dci_tools.c | 76 ++++++------- .../PHY/LTE_TRANSPORT/dlsch_demodulation.c | 2 +- openair1/PHY/LTE_TRANSPORT/phich.c | 2 +- openair1/PHY/LTE_TRANSPORT/ulsch_coding.c | 2 +- openair1/SCHED/phy_procedures_lte_eNb.c | 6 +- openair1/SCHED/phy_procedures_lte_ue.c | 21 ++-- openair2/ENB_APP/enb_app.c | 2 +- openair2/LAYER2/MAC/config.c | 4 +- openair2/LAYER2/MAC/eNB_scheduler.c | 2 +- openair2/LAYER2/MAC/eNB_scheduler_dlsch.c | 5 +- .../LAYER2/MAC/eNB_scheduler_primitives.c | 3 +- openair2/LAYER2/MAC/eNB_scheduler_ulsch.c | 8 +- openair2/LAYER2/MAC/main.c | 8 +- openair2/LAYER2/MAC/ue_procedures.c | 27 +++-- openair2/LAYER2/PDCP_v10.1.0/pdcp.c | 12 +- openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c | 2 +- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c | 6 +- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c | 4 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c | 6 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c | 1 - .../RLC/UM_v9.3.0/rlc_um_control_primitives.c | 6 +- openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c | 4 +- .../LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.c | 2 +- openair2/LAYER2/RLC/rlc.c | 2 +- openair2/LAYER2/RLC/rlc_rrc.c | 6 +- openair2/RRC/LITE/rrc_UE.c | 104 ++++++++++-------- openair2/RRC/LITE/rrc_common.c | 3 +- openair2/RRC/LITE/rrc_eNB.c | 46 ++++---- openair2/RRC/LITE/rrc_eNB_S1AP.c | 6 +- openair2/UTIL/OMG/common.c | 6 +- openair2/UTIL/OPT/probe.c | 8 +- openair2/UTIL/OTG/otg_kpi.c | 2 +- openair2/UTIL/OTG/otg_rx.c | 8 +- openair2/UTIL/OTG/otg_tx.c | 18 +-- openair3/GTPV1-U/nw-gtpv1u/src/NwGtpv1u.c | 4 +- openair3/NAS/COMMON/API/NETWORK/nas_message.c | 2 +- openair3/NAS/COMMON/UTIL/nas_log.h | 4 +- openair3/NAS/UE/EMM/IdleMode.c | 6 +- openair3/S1AP/s1ap_eNB_handlers.c | 16 +-- openair3/UDP/udp_eNB_task.c | 2 +- targets/RT/USER/lte-enb.c | 8 +- 42 files changed, 257 insertions(+), 227 deletions(-) diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index 17338d85b5..12bd06bb81 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -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; } @@ -725,13 +725,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) { diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c index 328479e746..fb348c13fa 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, diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c index 11d7fcacda..6dfd02c490 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c @@ -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; } diff --git a/openair1/PHY/LTE_TRANSPORT/phich.c b/openair1/PHY/LTE_TRANSPORT/phich.c index 64daa949d1..f8330c9fc5 100644 --- a/openair1/PHY/LTE_TRANSPORT/phich.c +++ b/openair1/PHY/LTE_TRANSPORT/phich.c @@ -1393,7 +1393,7 @@ 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, subframe, diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c index 6cb732573b..862c3c0ec0 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); diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 12827d9734..4b9f48e1bb 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, @@ -2784,7 +2784,7 @@ 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; } diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index cbea2e4c3e..07d008b268 100644 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -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] 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 %d, amp %d\n", Mod_id, ue->dlsch[eNB_id][0]->rnti, frame_tx % 1024, subframe_tx, @@ -2571,7 +2573,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, @@ -3123,7 +3125,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 +3188,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) && @@ -3574,7 +3577,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 diff --git a/openair2/ENB_APP/enb_app.c b/openair2/ENB_APP/enb_app.c index 3734bc4a2b..60415aad86 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/LAYER2/MAC/config.c b/openair2/LAYER2/MAC/config.c index e4252ed500..2e76735fa7 100644 --- a/openair2/LAYER2/MAC/config.c +++ b/openair2/LAYER2/MAC/config.c @@ -183,14 +183,14 @@ 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"); } } diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c index c5dc8c88b0..e8ed8b8f5e 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler.c +++ b/openair2/LAYER2/MAC/eNB_scheduler.c @@ -253,7 +253,7 @@ 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; diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c index 573a3401b0..93dc993711 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c @@ -1651,7 +1651,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 ffd9630648..ce08bc5408 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c @@ -791,7 +791,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; } diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c index c37224fbfb..831b00a2f9 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; diff --git a/openair2/LAYER2/MAC/main.c b/openair2/LAYER2/MAC/main.c index 203bd3f36f..d812ec0087 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/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c index 85100d14af..6d304051d4 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 792c9de70a..4c67f80e20 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 fd339b6277..eac42cb129 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 1dea4ced9f..1d93055487 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); } } 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 74a1cd5390..cb03e28c4b 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 f7f900fa65..7fb801b33d 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 3c983805c7..a9f0bdbf7e 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 d0e9e28ef0..bda2b88458 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_Reorderingt_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 a0e7b6b8c7..4255464e3a 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 585ceacb9b..3f083a77a8 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 1073d3ded3..96057231a6 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 0b0073d807..8304752e8e 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/rrc_UE.c b/openair2/RRC/LITE/rrc_UE.c index 1b22ae5d0b..a6290f1f3c 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;idl_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;jinterFreqNeighCellList->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;jinterFreqBlackCellList->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 67ee4053d0..b039ecd8de 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 d279764528..1ed4da9b27 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -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); } } @@ -4219,7 +4221,7 @@ rrc_eNB_decode_ccch( // 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__); @@ -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( diff --git a/openair2/RRC/LITE/rrc_eNB_S1AP.c b/openair2/RRC/LITE/rrc_eNB_S1AP.c index 8899c7d743..8984eb933c 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/OMG/common.c b/openair2/UTIL/OMG/common.c index fc41e5dd3a..f1c850e689 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 1c6b8e814b..711436d2cd 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 a056fe2456..3f24d01ce6 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 95cf19c1bd..824439e873 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 bdf8137cfa..d1ad2b2ed3 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/GTPV1-U/nw-gtpv1u/src/NwGtpv1u.c b/openair3/GTPV1-U/nw-gtpv1u/src/NwGtpv1u.c index a64694c0de..cd59028ce3 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/NAS/COMMON/API/NETWORK/nas_message.c b/openair3/NAS/COMMON/API/NETWORK/nas_message.c index 8f326904ef..680bcb6d97 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, diff --git a/openair3/NAS/COMMON/UTIL/nas_log.h b/openair3/NAS/COMMON/UTIL/nas_log.h index 1889bd801d..c6e0fbcd80 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/UE/EMM/IdleMode.c b/openair3/NAS/UE/EMM/IdleMode.c index 74c09a8a3d..d3c387f587 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; diff --git a/openair3/S1AP/s1ap_eNB_handlers.c b/openair3/S1AP/s1ap_eNB_handlers.c index c6deccebcd..3896cf37ae 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/UDP/udp_eNB_task.c b/openair3/UDP/udp_eNB_task.c index b11f51e5fd..b8b6b897a7 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/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index eebfb2da09..659905dd0b 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -934,12 +934,12 @@ 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,"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,"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 { @@ -1083,7 +1083,9 @@ 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; } From f45256c66baf15a925a7161e9b4be8b349d85ebb Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Wed, 11 Jan 2017 15:50:58 +0100 Subject: [PATCH 062/128] fix LOG_X macros - addendum I forgot one file in the previous commit --- openair3/S1AP/s1ap_eNB_nas_procedures.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/openair3/S1AP/s1ap_eNB_nas_procedures.c b/openair3/S1AP/s1ap_eNB_nas_procedures.c index def09a6cb3..426f38004a 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], From 22942608fab800264e2ae0b1e5f3699e89a56e2e Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Wed, 11 Jan 2017 15:53:41 +0100 Subject: [PATCH 063/128] fix 'unused variables' warning --- openair1/PHY/LTE_TRANSPORT/dlsch_coding.c | 1 - openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c | 2 +- openair1/SCHED/phy_procedures_lte_ue.c | 2 +- openair3/NAS/COMMON/API/NETWORK/nas_message.c | 2 ++ targets/SIMU/USER/init_lte.c | 2 +- 5 files changed, 5 insertions(+), 4 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c index 0827918863..8ec2a40d8d 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_modulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c index d6e680344b..1875ada878 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/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index 07d008b268..bfe4c82bdc 100644 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -2058,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; diff --git a/openair3/NAS/COMMON/API/NETWORK/nas_message.c b/openair3/NAS/COMMON/API/NETWORK/nas_message.c index 680bcb6d97..61d4bf5ec2 100644 --- a/openair3/NAS/COMMON/API/NETWORK/nas_message.c +++ b/openair3/NAS/COMMON/API/NETWORK/nas_message.c @@ -1296,7 +1296,9 @@ 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 || diff --git a/targets/SIMU/USER/init_lte.c b/targets/SIMU/USER/init_lte.c index 7da3c3dcd1..3e0936451f 100644 --- a/targets/SIMU/USER/init_lte.c +++ b/targets/SIMU/USER/init_lte.c @@ -44,7 +44,7 @@ PHY_VARS_eNB* init_lte_eNB(LTE_DL_FRAME_PARMS *frame_parms, 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; From a36ccb97a22e47a8b7c6a109713e1822c980ae8b Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Wed, 11 Jan 2017 15:54:54 +0100 Subject: [PATCH 064/128] remove 'variable may be used uninitialized' warning This is not absolutely necessary (the processing is ok), but the warning is annoying. --- openair1/PHY/LTE_TRANSPORT/pucch.c | 1 + openair1/PHY/LTE_TRANSPORT/ulsch_coding.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/openair1/PHY/LTE_TRANSPORT/pucch.c b/openair1/PHY/LTE_TRANSPORT/pucch.c index 34e64dfd5f..db671f048c 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/ulsch_coding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c index 862c3c0ec0..9571ea6cd5 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c @@ -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); From d36e4e4c85b35e9aa8d180bb022e1c395ca610b3 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Wed, 11 Jan 2017 15:55:55 +0100 Subject: [PATCH 065/128] fix minor warning --- targets/RT/USER/lte-enb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 659905dd0b..97cb82ce71 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; From 9df4a4910d9dac548245b64d9478532e9af7d439 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Wed, 11 Jan 2017 15:56:20 +0100 Subject: [PATCH 066/128] fix warnings in openair1/PHY/MODULATION/compute_bf_weights.c Several various fixes are included. Not sure what component of the system uses this file. There is one 'abort' added in case a fscanf fails. It may be a bit too brutal. --- openair1/PHY/MODULATION/compute_bf_weights.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/openair1/PHY/MODULATION/compute_bf_weights.c b/openair1/PHY/MODULATION/compute_bf_weights.c index 32a91c11f5..4ef8e88ca6 100644 --- a/openair1/PHY/MODULATION/compute_bf_weights.c +++ b/openair1/PHY/MODULATION/compute_bf_weights.c @@ -1,11 +1,12 @@ #include #include +#include #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 Date: Wed, 11 Jan 2017 15:57:52 +0100 Subject: [PATCH 067/128] warning fix: remove duplicate typedef for 'instance_t' I chose to remove it from common/utils/itti/itti_types.h, maybe it's not the correct solution. --- common/utils/itti/itti_types.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/common/utils/itti/itti_types.h b/common/utils/itti/itti_types.h index 8cf0d7a581..e5bbf44830 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 From 89cff547303ac6cc8f157c44a247b41c42e34774 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Wed, 11 Jan 2017 16:00:36 +0100 Subject: [PATCH 068/128] remove '#define OPENAIR_LTE' from openair1/PHY/defs.h --- openair1/PHY/defs.h | 1 - 1 file changed, 1 deletion(-) diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index d1ac2d5f61..d462fe58cb 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" From c70e705aa43e426b0b2c44ee3bb1e18c32d92895 Mon Sep 17 00:00:00 2001 From: "Raymond.Knopp" Date: Wed, 11 Jan 2017 16:10:27 +0100 Subject: [PATCH 069/128] lmssdr configuration file --- .../GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.lmssdr.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 b01537d78d..1e4482364d 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 @@ -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"; From 237da5884692c5a69c62b2dc65f66f575b673205 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Thu, 12 Jan 2017 09:26:51 +0100 Subject: [PATCH 070/128] fix a warning in openair3/NAS/UE/EMM/IdleMode.c I'm not sure this is the right fix, so I put a LOG_TRACE that is displayed when the code comes here. --- openair3/NAS/UE/EMM/IdleMode.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/openair3/NAS/UE/EMM/IdleMode.c b/openair3/NAS/UE/EMM/IdleMode.c index d3c387f587..a5a2c30708 100644 --- a/openair3/NAS/UE/EMM/IdleMode.c +++ b/openair3/NAS/UE/EMM/IdleMode.c @@ -903,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 From 669aa1fbcfe35b917b3810b9ef5520bd869d590e Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Thu, 12 Jan 2017 09:27:22 +0100 Subject: [PATCH 071/128] fix duplicated definition of boolean_t It is defined both in openair2/COMMON/commonDef.h and openair2/COMMON/platform_types.h. Removing one or the other definition creates many problems when compiling this or that part of the system (ue_ip.ko, at_nas_ue). Let's keep both and protect the definitions inside #ifdefs. --- openair2/COMMON/commonDef.h | 9 +++++++++ openair2/COMMON/platform_types.h | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/openair2/COMMON/commonDef.h b/openair2/COMMON/commonDef.h index cfd5d68e40..b1ec47449a 100644 --- a/openair2/COMMON/commonDef.h +++ b/openair2/COMMON/commonDef.h @@ -43,6 +43,13 @@ Description Contains global common definitions #include #include +/* 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 327523f1d0..b17e7d7724 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 //----------------------------------------------------------------------------- From 801a2e5de72b9b8e499b1d43d1f6d6b419745203 Mon Sep 17 00:00:00 2001 From: calvin wang Date: Thu, 12 Jan 2017 16:47:57 +0800 Subject: [PATCH 072/128] fix mistake bitwise operators --- openair3/NAS/COMMON/API/NETWORK/nas_message.c | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/openair3/NAS/COMMON/API/NETWORK/nas_message.c b/openair3/NAS/COMMON/API/NETWORK/nas_message.c index f714af66f7..55adce8ea3 100644 --- a/openair3/NAS/COMMON/API/NETWORK/nas_message.c +++ b/openair3/NAS/COMMON/API/NETWORK/nas_message.c @@ -993,11 +993,11 @@ 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) | + ((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) | + ((emm_security_context->dl_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->dl_count.seq_num & 0x000000FF); } @@ -1027,11 +1027,11 @@ 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) | + ((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) | + ((emm_security_context->dl_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->dl_count.seq_num & 0x000000FF); } @@ -1155,11 +1155,11 @@ 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) | + ((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) | + ((emm_security_context->dl_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->dl_count.seq_num & 0x000000FF); } @@ -1186,11 +1186,11 @@ 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) | + ((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) | + ((emm_security_context->dl_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->dl_count.seq_num & 0x000000FF); } @@ -1300,11 +1300,11 @@ static uint32_t _nas_message_get_mac( if (direction == SECU_DIRECTION_UPLINK) { count = 0x00000000 | - ((emm_security_context->ul_count.overflow && 0x0000FFFF) << 8) | + ((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) | + ((emm_security_context->dl_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->dl_count.seq_num & 0x000000FF); } @@ -1368,11 +1368,11 @@ static uint32_t _nas_message_get_mac( if (direction == SECU_DIRECTION_UPLINK) { count = 0x00000000 | - ((emm_security_context->ul_count.overflow && 0x0000FFFF) << 8) | + ((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) | + ((emm_security_context->dl_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->dl_count.seq_num & 0x000000FF); } From ccdb80efbc9caf80890b0200aaf84b1c11ab5b17 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Thu, 12 Jan 2017 10:57:35 +0100 Subject: [PATCH 073/128] initializing N_TA_offset for TDD eNB. Fixes issue 184. --- targets/RT/USER/lte-softmodem.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 012eb44e45..1880527130 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -1657,7 +1657,17 @@ int main( int argc, char **argv ) 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; + } } From d5a6817887e720935d9dcc0a6f7d632e85c7d8e5 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Thu, 12 Jan 2017 17:32:54 +0100 Subject: [PATCH 074/128] fixing mbmssim and pdcchsim compilation "frame" is not defined, we pass 0 instead. Maybe not the right solution. --- openair1/SIMULATION/LTE_PHY/mbmssim.c | 2 +- openair1/SIMULATION/LTE_PHY/pdcchsim.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openair1/SIMULATION/LTE_PHY/mbmssim.c b/openair1/SIMULATION/LTE_PHY/mbmssim.c index 2f8fda7707..ce3ad1839a 100644 --- a/openair1/SIMULATION/LTE_PHY/mbmssim.c +++ b/openair1/SIMULATION/LTE_PHY/mbmssim.c @@ -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, + 0 /*frame*/, subframe, 0,0,0); diff --git a/openair1/SIMULATION/LTE_PHY/pdcchsim.c b/openair1/SIMULATION/LTE_PHY/pdcchsim.c index 909468366b..e9a0f174a3 100644 --- a/openair1/SIMULATION/LTE_PHY/pdcchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pdcchsim.c @@ -1091,7 +1091,7 @@ int main(int argc, char **argv) rx_pdcch(&UE->common_vars, UE->pdcch_vars, &UE->frame_parms, - frame, + 0 /*frame*/, subframe, 0, (UE->frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI, From ab7a3e8e9cca68298c0e956f84a633fc51c12099 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Thu, 12 Jan 2017 17:58:28 +0100 Subject: [PATCH 075/128] fix compilation of RRH GW I am not sure this is the correct solution. The problem seems to be that the RRH GW does not use ITTI and thus the type 'as_nas_info_t' is not defined, and then the compilation fails. The simple fix is to include 'as_message.h' in 'openair2/RRC/LITE/defs.h' if ENABLE_ITTI is not defined. Maybe it's not good. RRH GW compiles with this fix. --- openair2/RRC/LITE/defs.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/openair2/RRC/LITE/defs.h b/openair2/RRC/LITE/defs.h index 0b0fd6b73f..47f8a0080a 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 From 5715de89f2fb7a3f626f8e945d453e89e43fe64b Mon Sep 17 00:00:00 2001 From: "Raymond.Knopp" Date: Fri, 13 Jan 2017 14:17:26 +0100 Subject: [PATCH 076/128] changes for TDD fronthaul --- targets/RT/USER/lte-enb.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index fb2271fa72..f22e7a9ffa 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -406,16 +406,22 @@ 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==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==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==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, From 848f78465beb7eab74bb54450065edcb48bd711e Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Fri, 13 Jan 2017 19:49:22 +0100 Subject: [PATCH 077/128] addition of IF4p5 ULTICK packet for TDD fronthaul --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 65 +++++++++++-------- openair1/PHY/LTE_TRANSPORT/if4_tools.h | 3 +- targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c | 2 + targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c | 2 + targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h | 2 + targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 12 +++- targets/RT/USER/lte-enb.c | 44 +++++++------ 7 files changed, 82 insertions(+), 48 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 3ffc50efb9..6878ae2684 100755 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -100,7 +100,8 @@ 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; @@ -113,33 +114,45 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type packet_header = (IF4p5_header_t *)(tx_buffer); data_block = (uint16_t*)(tx_buffer + sizeof_IF4p5_header_t); } - gen_IF4p5_ul_header(packet_header, frame, subframe); + gen_IF4p5_ul_header(packet_header, packet_type, frame, subframe); - for (symbol_id=0; symbol_idsymbols_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_idframe_status &= ~(0x000f<<26); - packet_header->frame_status |= (symbol_id&0x000f)<<26; - + if (packet_type == IF4p5_PULFFT) { + for (symbol_id=0; symbol_idsymbols_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_idframe_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, + 0, + &tx_buffer, + 0, 1, - IF4p5_PULFFT)) < 0) { - perror("ETHERNET write for IF4p5_PULFFT\n"); + 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 LOG_D(PHY,"IF4p5_PRACH: frame %d, subframe %d\n",frame,subframe); @@ -303,10 +316,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; diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.h b/openair1/PHY/LTE_TRANSPORT/if4_tools.h index 1f78e7f77a..e2d4f1f7de 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/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c index ec09550323..3ed1945add 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c @@ -198,6 +198,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 { diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c index ae7c0c9d7b..898382cf6a 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c @@ -206,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 { diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h index 421c2639c6..68b153392b 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h @@ -61,9 +61,11 @@ #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 diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index 3d0674c73e..00d4f220b9 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -181,6 +181,16 @@ static int trx_usrp_write(openair0_device *device, openair0_timestamp timestamp, s->tx_md.has_time_spec = true; else s->tx_md.has_time_spec = false; + + if (device->openair0_cfg[0].tx_freq[0] == device->openair0_cfg[0].rx_freq[0]) { + // for TDD each write should be considered as a burst to trigger the switch on GPIO + s->tx_md.start_of_burst = true; + s->tx_md.end_of_burst = true; + } + else { + s->tx_md.start_of_burst = false; + s->tx_md.end_of_burst = false; + } if (cc>1) { std::vector buff_ptrs; @@ -190,7 +200,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); diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 99e05a39bf..0ababcc7aa 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -875,29 +875,33 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) { // 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; inb_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+eNB->ts_offset+(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" ); - } + if ((subframe_select(fp,proc->subframe_rx+tx_sfoffset) == SF_DL) || + (subframe_select(fp,proc->subframe_rx+tx_sfoffset) == SF_S)) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); + + for (i=0; inb_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+eNB->ts_offset+(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" ); + } + } } - + for (i=0; inb_antennas_rx; i++) rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][*subframe*fp->samples_per_tti]; From 9ee29fb0b2295a92448f28b47838253a2fe25e41 Mon Sep 17 00:00:00 2001 From: "Raymond.Knopp" Date: Sat, 14 Jan 2017 14:35:19 +0100 Subject: [PATCH 078/128] changes for S-subframe support in fronthaul --- openair1/PHY/INIT/lte_parms.c | 23 ++++++++++++++++++++++- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 17 ++++++++++++++--- openair1/PHY/impl_defs_lte.h | 6 ++++++ openair1/SCHED/phy_procedures_lte_eNb.c | 9 ++++++--- targets/RT/USER/lte-enb.c | 14 +++++++++++++- 5 files changed, 61 insertions(+), 8 deletions(-) diff --git a/openair1/PHY/INIT/lte_parms.c b/openair1/PHY/INIT/lte_parms.c index cd879b1a90..f0c63df9e6 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_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 6878ae2684..924eef11b9 100755 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -33,6 +33,7 @@ #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/ethernet_lib.h" @@ -54,11 +55,14 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type 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; @@ -74,7 +78,7 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type } gen_IF4p5_dl_header(packet_header, frame, subframe); - for (symbol_id=0; symbol_idsymbols_per_tti; symbol_id++) { + for (symbol_id=0; symbol_idCC_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_idofdm_symbol_size - db_halflength - 1; + 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)); + } + 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); @@ -117,7 +127,7 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type gen_IF4p5_ul_header(packet_header, packet_type, frame, subframe); if (packet_type == IF4p5_PULFFT) { - for (symbol_id=0; symbol_idsymbols_per_tti; symbol_id++) { + for (symbol_id=fp->symbols_per_tti-nsym; symbol_idsymbols_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_idframe_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)) 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); diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 219d9c5d48..5959c1953d 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -768,8 +768,18 @@ void fh_if4p5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) { int subframe_tx,frame_tx; symbol_number = 0; - symbol_mask_full = (1<symbols_per_tti)-1; + symbol_mask_full = (subframe_select(fp,*subframe) == SF_S) ? (1<dl_symbols_in_S_subframe) : (1<symbols_per_tti)-1; + // 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; + } + } + } do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!! recv_IF4p5(eNB, &frame_tx, &subframe_tx, &packet_type, &symbol_number); if (proc->first_tx != 0) { @@ -1033,6 +1043,8 @@ void rx_fh_if4p5(PHY_VARS_eNB *eNB,int *frame,int *subframe) { 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< Date: Sat, 14 Jan 2017 22:40:36 +0100 Subject: [PATCH 079/128] RRU changes for S-Subframe --- openair1/SCHED/phy_procedures_lte_eNb.c | 9 ++++++++- targets/RT/USER/lte-enb.c | 12 ++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 50fd920262..52e4090f81 100644 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2817,7 +2817,14 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc){ 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; + 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_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 ); diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 5d0cfaee82..0b0324a176 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -1024,10 +1024,18 @@ void rx_fh_if4p5(PHY_VARS_eNB *eNB,int *frame,int *subframe) { //proc->frame_rx = (proc->frame_rx + proc->frame_offset)&1023; if (packet_type == IF4p5_PULFFT) { - LOG_D(PHY,"rx_fh:if4p5: frame %d, subframe %d, PULFFT symbol %d\n",f,sf,symbol_number); + 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<do_prach) eNB->do_prach(eNB,f,sf); From 84c61990b75cc08b195492091f37d82a65c89cf4 Mon Sep 17 00:00:00 2001 From: "Raymond.Knopp" Date: Sat, 14 Jan 2017 16:23:13 +0100 Subject: [PATCH 080/128] fix for S-subframe handling (if4p5_asynch_DL) --- targets/RT/USER/lte-enb.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 8a4891cfe0..eed18fdc8d 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -768,7 +768,7 @@ void fh_if4p5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) { int subframe_tx,frame_tx; symbol_number = 0; - symbol_mask_full = (subframe_select(fp,*subframe) == SF_S) ? (1<dl_symbols_in_S_subframe) : (1<symbols_per_tti)-1; + // correct for TDD if (fp->frame_type == TDD) { @@ -780,6 +780,7 @@ void fh_if4p5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) { } } } + symbol_mask_full = ((subframe_select(fp,*subframe) == SF_S) ? (1<dl_symbols_in_S_subframe) : (1<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) { @@ -1047,10 +1048,11 @@ void rx_fh_if4p5(PHY_VARS_eNB *eNB,int *frame,int *subframe) { proc->symbol_mask[sf] = proc->symbol_mask[sf] | (1<first_rx==0) && (f!=*frame)) LOG_E(PHY,"rx_fh_if4p5: PULTICK received frame %d != expected %d\n",f,*frame); - if (sf!=*subframe) - LOG_E(PHY,"rx_fh_if4p5: PULTICK received subframe %d != expected %d\n",sf,*subframe); + 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) { LOG_D(PHY,"rx_fh:if4p5: frame %d, subframe %d, PRACH\n",f,sf); @@ -1061,8 +1063,9 @@ void rx_fh_if4p5(PHY_VARS_eNB *eNB,int *frame,int *subframe) { 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 = *subframe; - proc->frame_rx = *frame; + + 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 From 2da964bb2d078165d93bd7cc329a4341a889fa16 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 15 Jan 2017 01:07:30 +0100 Subject: [PATCH 081/128] changes for RRU TDD if4p5 --- targets/RT/USER/lte-enb.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index eed18fdc8d..43f7f76f98 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -769,6 +769,7 @@ void fh_if4p5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) { symbol_number = 0; + LOG_D(PHY,"fh_asynch_DL_IF4p5: in, frame %d, subframe %d\n",*frame,*subframe); // correct for TDD if (fp->frame_type == TDD) { @@ -780,6 +781,9 @@ void fh_if4p5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) { } } } + + 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<dl_symbols_in_S_subframe) : (1<symbols_per_tti))-1; do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!! recv_IF4p5(eNB, &frame_tx, &subframe_tx, &packet_type, &symbol_number); @@ -788,6 +792,8 @@ void fh_if4p5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) { *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<dl_symbols_in_S_subframe) : (1<symbols_per_tti))-1; + } else { if (frame_tx != *frame) { From 8be18c360b2817a9a7101586f7b23fd8551f9422 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 15 Jan 2017 08:58:26 +0100 Subject: [PATCH 082/128] debugging for RRU if4p5 TDD --- openair2/UTIL/LOG/vcd_signal_dumper.c | 1 + openair2/UTIL/LOG/vcd_signal_dumper.h | 1 + targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 15 +++++--- targets/RT/USER/lte-enb.c | 38 +++++++++++++++----- targets/RT/USER/rru_if4p5_usrp.gtkw | 13 ++++--- 5 files changed, 51 insertions(+), 17 deletions(-) diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.c b/openair2/UTIL/LOG/vcd_signal_dumper.c index 34fc8e97b8..38a304acb1 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 0d1c507b74..5e3345e005 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/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index 00d4f220b9..2a2e09f40c 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -177,17 +177,24 @@ 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 (device->openair0_cfg[0].tx_freq[0] == device->openair0_cfg[0].rx_freq[0]) { - // for TDD each write should be considered as a burst to trigger the switch on GPIO + 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 { + else if (flags==1) { // middle of burst s->tx_md.start_of_burst = false; s->tx_md.end_of_burst = false; } diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 43f7f76f98..c15e104354 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -899,26 +899,48 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) { // 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 ); // prepare tx buffer pointers - - if ((subframe_select(fp,proc->subframe_rx+tx_sfoffset) == SF_DL) || - (subframe_select(fp,proc->subframe_rx+tx_sfoffset) == SF_S)) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); + + 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; inb_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, - fp->samples_per_tti, + siglen, fp->nb_antennas_tx, - 1); + flags); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); - if (txs != fp->samples_per_tti) { + if (txs != siglen) { LOG_E(PHY,"TX : Timeout (sent %d/%d)\n",txs, fp->samples_per_tti); exit_fun( "problem transmitting samples" ); } diff --git a/targets/RT/USER/rru_if4p5_usrp.gtkw b/targets/RT/USER/rru_if4p5_usrp.gtkw index d2a435202f..1a13e6d15f 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 -[*] Thu Jan 5 06:19:58 2017 +[*] Sun Jan 15 07:26:50 2017 [*] [dumpfile] "/tmp/openair_dump_eNB.vcd" -[dumpfile_mtime] "Thu Jan 5 06:09:13 2017" -[dumpfile_size] 24570356 +[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] 23491157000 +[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,6 +17,9 @@ @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 From 0af4c17000d1bbfcf1dcdc312358671325423f4a Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Mon, 16 Jan 2017 09:52:14 +0100 Subject: [PATCH 083/128] fix phy simulators compilation - for real This is the real fix, d5a6817887e720935d9dcc0a6f7d632e85c7d8e5 was not the right solution. --- openair1/SIMULATION/LTE_PHY/mbmssim.c | 2 +- openair1/SIMULATION/LTE_PHY/pdcchsim.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openair1/SIMULATION/LTE_PHY/mbmssim.c b/openair1/SIMULATION/LTE_PHY/mbmssim.c index ce3ad1839a..7f2f8502e3 100644 --- a/openair1/SIMULATION/LTE_PHY/mbmssim.c +++ b/openair1/SIMULATION/LTE_PHY/mbmssim.c @@ -492,7 +492,7 @@ int main(int argc, char **argv) &UE->frame_parms, UE->dlsch_MCH[0], UE->dlsch_MCH[0]->harq_processes[0], - 0 /*frame*/, + trials, subframe, 0,0,0); diff --git a/openair1/SIMULATION/LTE_PHY/pdcchsim.c b/openair1/SIMULATION/LTE_PHY/pdcchsim.c index e9a0f174a3..86d542c019 100644 --- a/openair1/SIMULATION/LTE_PHY/pdcchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pdcchsim.c @@ -1091,7 +1091,7 @@ int main(int argc, char **argv) rx_pdcch(&UE->common_vars, UE->pdcch_vars, &UE->frame_parms, - 0 /*frame*/, + trial, subframe, 0, (UE->frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI, From 73920f3f6e30c3b64a06bf4723f1f658c2f7812e Mon Sep 17 00:00:00 2001 From: Tien-Thinh Nguyen Date: Mon, 16 Jan 2017 16:08:40 +0100 Subject: [PATCH 084/128] [minor modification] fixed the issue related to TX with FDD --- targets/RT/USER/lte-enb.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index c15e104354..814a4cf619 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -406,21 +406,24 @@ 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 ); - if ((eNB->frame_parms.frame_type==TDD) && - (subframe_select(&eNB->frame_parms,proc->subframe_tx) != SF_UL)) + 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 ); - if ((eNB->frame_parms.frame_type==TDD) && - (subframe_select(&eNB->frame_parms,proc->subframe_tx) != SF_UL)) + 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) { - if ((eNB->frame_parms.frame_type==TDD) && - (subframe_select(&eNB->frame_parms,proc->subframe_tx) != SF_UL)) + 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); } From dc8190dc6adffd61ce62edcf7d22a71735847ae6 Mon Sep 17 00:00:00 2001 From: Xenofon Foukas Date: Mon, 16 Jan 2017 17:44:43 +0200 Subject: [PATCH 085/128] Fixed issue with #pragma warnings in liblfds --- .../UTIL/LFDS/liblfds7.0.0/liblfds700/inc/liblfds700.h | 6 +++--- .../liblfds7.0.0/liblfds700/inc/liblfds700/lfds700_misc.h | 2 +- .../src/lfds700_ringbuffer/lfds700_ringbuffer_cleanup.c | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) 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 fdda50cefb..4f83d8d9a0 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 014f72dac5..79eb3e7e5a 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 447c93041e..8ab44e46b5 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 ) From 9fc584d1739e7ac9449564403d24e4f37e84b7f7 Mon Sep 17 00:00:00 2001 From: Xenofon Foukas Date: Mon, 16 Jan 2017 17:45:58 +0200 Subject: [PATCH 086/128] Fixed FlexRAN-related warnings --- .../CONTROL_MODULES/MAC/flexran_agent_mac.c | 64 +- .../MAC/flexran_agent_mac_defs.h | 4 +- .../MAC/flexran_agent_mac_internal.c | 64 +- openair2/ENB_APP/enb_config.c | 8 +- openair2/ENB_APP/flexran_agent.c | 15 +- openair2/ENB_APP/flexran_agent_common.c | 351 ++-- openair2/ENB_APP/flexran_agent_common.h | 4 +- .../ENB_APP/flexran_agent_common_internal.c | 49 +- openair2/ENB_APP/flexran_agent_handler.c | 16 +- openair2/LAYER2/MAC/eNB_scheduler_dlsch.c | 2 +- openair2/LAYER2/MAC/flexran_agent_mac_proto.h | 6 +- .../MAC/flexran_agent_scheduler_dataplane.c | 33 +- .../MAC/flexran_agent_scheduler_dlsch_ue.c | 1624 ++++++++--------- openair2/UTIL/ASYNC_IF/link_manager.c | 7 +- 14 files changed, 1128 insertions(+), 1119 deletions(-) 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 b9cad28278..e353f5fde7 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 bb6aed1d8e..9ec8594f88 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 a63225e657..1fa9852487 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 #include +#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 0) { - cell_report = malloc(sizeof(Protocol__FlexCellStatsReport *)); - for (i = 0; i 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; iue_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; icell_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_config.c b/openair2/ENB_APP/enb_config.c index fb4c6266ca..1841d8e9a9 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 beca1062bd..0dcacd4b81 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 + //#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 2ccca6602b..22793f16b4 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); + // TODO: This needs fixing + return -1; - 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; + /* 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 56a52cd0b6..a4ee53067c 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 3026190863..e735b2748b 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 4967e46923..4326ab6be0 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/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c index 573a3401b0..93928dbb97 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]; diff --git a/openair2/LAYER2/MAC/flexran_agent_mac_proto.h b/openair2/LAYER2/MAC/flexran_agent_mac_proto.h index 060e8ab6ca..d661b90a20 100644 --- a/openair2/LAYER2/MAC/flexran_agent_mac_proto.h +++ b/openair2/LAYER2/MAC/flexran_agent_mac_proto.h @@ -46,17 +46,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 ff3ef32bd6..c9956bd9ce 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 8975465e77..7f34cbb28f 100644 --- a/openair2/LAYER2/MAC/flexran_agent_scheduler_dlsch_ue.c +++ b/openair2/LAYER2/MAC/flexran_agent_scheduler_dlsch_ue.c @@ -65,698 +65,6 @@ #define ENABLE_MAC_PAYLOAD_DEBUG - -//------------------------------------------------------------------------------ -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; - - 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; - - 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; // set to the maximum aggregation level - - for (CC_id=0; CC_idcommon_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, - 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_id0) - 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); - 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; - } - - 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; - } - - 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)]; - -#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; - aggregation = process_ue_cqi(mod_id, UE_id); - - 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 - header_len_tmp = header_len; - - 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; - - aggregation = process_ue_cqi(mod_id,UE_id); - 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 - } - - for(i=0; iframe_parms.N_RBG; i++) { - rballoc_sub[i] = UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][i]; - } - - // 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, @@ -1024,6 +332,136 @@ void _sort_UEs (module_id_t Mod_idP, } } +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]; + + for(i=0; irballoc_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], + 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; + +#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; irballoc_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;jUE_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); - 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) +//------------------------------------------------------------------------------ +{ + 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; -#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; irballoc_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) + Protocol__FlexDlData *dl_data[NUM_MAX_UE]; + int num_ues_added = 0; + int channels_added = 0; - 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;jUE_sched_ctrl[UE_id]; - - for(i=0; irballoc_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 - } + 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; // set to the maximum aggregation level + + for (CC_id=0; CC_idcommon_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, + 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_id0) + 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); + 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; + } + + 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; + } + + 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)]; + +#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; + aggregation = process_ue_cqi(mod_id, UE_id); + + 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; + + aggregation = process_ue_cqi(mod_id,UE_id); + 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 + } + + for(i=0; iframe_parms.N_RBG; i++) { + rballoc_sub[i] = UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][i]; + } + + // 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[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); } diff --git a/openair2/UTIL/ASYNC_IF/link_manager.c b/openair2/UTIL/ASYNC_IF/link_manager.c index 1c9fb72bfe..235acef247 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); From 67e53e72abafff9a122bf6e90aa728d0b6132a90 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Mon, 16 Jan 2017 17:07:47 +0100 Subject: [PATCH 087/128] fix the use of get_eNB_UE_stats The function may return NULL if the UE has been dropped in the PHY layer but is still present in the MAC layer. Deal with the NULL case everywhere it's needed. --- openair2/LAYER2/MAC/eNB_scheduler_ulsch.c | 23 ++++++++++------- openair2/LAYER2/MAC/pre_processor.c | 30 ++++++++++++++++++++--- 2 files changed, 40 insertions(+), 13 deletions(-) diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c index 831b00a2f9..ec43c2434b 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c @@ -751,6 +751,20 @@ 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; nnumactiveULCCs[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) + continue; + // loop over all active UL CC_ids for this UE for (n=0; nnumactiveULCCs[UE_id]; n++) { // This is the actual CC_id in the list @@ -758,15 +772,6 @@ 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; - 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; diff --git a/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c index ed12d322c1..150f2c15de 100644 --- a/openair2/LAYER2/MAC/pre_processor.c +++ b/openair2/LAYER2/MAC/pre_processor.c @@ -153,12 +153,25 @@ void assign_rbs_required (module_id_t Mod_id, UE_list_t *UE_list = &eNB_mac_inst[Mod_id].UE_list; // UE_TEMPLATE *UE_template; LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]; + int skip_ue; // 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; + /* skip UE not present in PHY (for any of its active CCs) */ + skip_ue = 0; + for (n=0; nnumactiveCCs[UE_id]; n++) { + CC_id = UE_list->ordered_CCids[n][UE_id]; + if (mac_xface->get_eNB_UE_stats(Mod_id,CC_id,rnti) == NULL) { + skip_ue = 1; + break; + } + } + if (skip_ue == 1) + continue; + //update CQI information across component carriers for (n=0; nnumactiveCCs[UE_id]; n++) { @@ -262,7 +275,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 +289,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) { @@ -329,7 +343,13 @@ void sort_UEs (module_id_t Mod_idP, 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); - if(round2 > round1) { // Check first if one of the UEs has an active HARQ process which needs service and swap order + /* if 2nd UE is not in PHY, do nothing */ + if (cqi2 == -1) + continue; + /* if 1st UE is not in PHY, swap with 2nd UE */ + if (cqi1 == -1) { + swap_UEs(UE_list,UE_id1,UE_id2,0); + } else 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. @@ -758,6 +778,8 @@ 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 mac_xface->get_ue_active_harq_pid(module_idP,CC_id,rnti, frameP,subframeP, From 8a9ef14e4f04f4dd2032cacecc925be219a5444e Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Sun, 8 Jan 2017 14:52:29 +0100 Subject: [PATCH 088/128] reduced the max number of antenna ports to 6 to save memory (we are not using antenna port >5 anyway) mult_cpx_conj_vector can now also do multiply add beam_precoding now uses mult_cpx_conj_vector Conflicts: openair1/PHY/MODULATION/beamforming.c --- openair1/PHY/INIT/lte_init.c | 4 +- .../lte_ul_channel_estimation.c | 9 ++-- openair1/PHY/MODULATION/beamforming.c | 43 ++++++++++--------- openair1/PHY/TOOLS/cmult_vv.c | 16 +++++-- openair1/PHY/TOOLS/defs.h | 4 +- openair1/PHY/impl_defs_lte.h | 2 +- openair1/PHY/impl_defs_top.h | 2 +- 7 files changed, 48 insertions(+), 32 deletions(-) diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index 12bd06bb81..accc54af54 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -1304,7 +1304,7 @@ 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++) { + for (i=0; itxdataF[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", @@ -1326,7 +1326,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, #endif } - for (i=0; i<14; i++) { // 14 is the total number of antenna ports + for (i=0; ibeam_weights[eNB_id][i] = (int32_t **)malloc16_clear(fp->nb_antennas_tx*sizeof(int32_t*)); for (j=0; jnb_antennas_tx; j++) { common_vars->beam_weights[eNB_id][i][j] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*sizeof(int32_t)); diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c index d2bc2e27c0..4fef74dd1c 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/MODULATION/beamforming.c b/openair1/PHY/MODULATION/beamforming.c index 6557a47ee7..331c4e2421 100644 --- a/openair1/PHY/MODULATION/beamforming.c +++ b/openair1/PHY/MODULATION/beamforming.c @@ -64,27 +64,30 @@ int beam_precoding(int32_t **txdataF, 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;reofdm_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); + if (p==0 || p==1 || p==5) { + 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); + //multadd_cpx_vector((int16_t*)txdataF[p],(int16_t*)beam_weights[p][aa], (int16_t*)txdataF_BF[aa], 0, frame_parms->ofdm_symbol_size, 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]); - */ - } + /* + for (re=0;reofdm_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/TOOLS/cmult_vv.c b/openair1/PHY/TOOLS/cmult_vv.c index cefa972061..39bfe547e7 100644 --- a/openair1/PHY/TOOLS/cmult_vv.c +++ b/openair1/PHY/TOOLS/cmult_vv.c @@ -41,7 +41,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 +56,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 +91,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 +117,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++; diff --git a/openair1/PHY/TOOLS/defs.h b/openair1/PHY/TOOLS/defs.h index 453efc028a..273822c598 100644 --- a/openair1/PHY/TOOLS/defs.h +++ b/openair1/PHY/TOOLS/defs.h @@ -116,13 +116,15 @@ 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); // lte_dfts.c void init_fft(uint16_t size, diff --git a/openair1/PHY/impl_defs_lte.h b/openair1/PHY/impl_defs_lte.h index 6635573779..98d6e06f76 100644 --- a/openair1/PHY/impl_defs_lte.h +++ b/openair1/PHY/impl_defs_lte.h @@ -546,7 +546,7 @@ typedef struct { 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; diff --git a/openair1/PHY/impl_defs_top.h b/openair1/PHY/impl_defs_top.h index 79e684215c..dd09749fbf 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 From ab57b0ddd3c687ecbc0e7c95e26c1cc4cddfd47b Mon Sep 17 00:00:00 2001 From: Xiwen JIANG Date: Mon, 9 Jan 2017 17:19:15 +0100 Subject: [PATCH 089/128] replace the conjugate vector multiplexing with direct vector multiplexing --- openair1/PHY/MODULATION/beamforming.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/openair1/PHY/MODULATION/beamforming.c b/openair1/PHY/MODULATION/beamforming.c index 331c4e2421..acf792b519 100644 --- a/openair1/PHY/MODULATION/beamforming.c +++ b/openair1/PHY/MODULATION/beamforming.c @@ -65,11 +65,11 @@ int beam_precoding(int32_t **txdataF, for (p=0; p<14; p++) { if (p==0 || p==1 || p==5) { - 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); - //multadd_cpx_vector((int16_t*)txdataF[p],(int16_t*)beam_weights[p][aa], (int16_t*)txdataF_BF[aa], 0, frame_parms->ofdm_symbol_size, 15); + 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); - /* - for (re=0;reofdm_symbol_size;re++) { + // if check version + /*for (re=0;reofdm_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); @@ -86,8 +86,7 @@ int beam_precoding(int32_t **txdataF, ((int16_t*)&txdataF_BF[aa][re])[0], ((int16_t*)&txdataF_BF[aa][re])[1]); } - } - */ + }*/ } } return 0; From a5e6690dedac1222164afa7c2afad654431edcf4 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Wed, 18 Jan 2017 09:33:39 +0100 Subject: [PATCH 090/128] adding multadd_cpx_vector --- openair1/PHY/TOOLS/cmult_vv.c | 79 +++++++++++++++++++++++++++++++++++ openair1/PHY/TOOLS/defs.h | 19 +++++++++ 2 files changed, 98 insertions(+) diff --git a/openair1/PHY/TOOLS/cmult_vv.c b/openair1/PHY/TOOLS/cmult_vv.c index 39bfe547e7..9d5079f52b 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__) @@ -134,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 273822c598..8f0ae402bf 100644 --- a/openair1/PHY/TOOLS/defs.h +++ b/openair1/PHY/TOOLS/defs.h @@ -126,6 +126,25 @@ int mult_cpx_conj_vector(int16_t *x1, 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, uint8_t logsize, From 550759231df6b7401a802a1077230928cc599710 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Wed, 18 Jan 2017 09:38:14 +0100 Subject: [PATCH 091/128] change loop limit to NB_ANTENNA_PORTS_ENB --- openair1/PHY/MODULATION/beamforming.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/PHY/MODULATION/beamforming.c b/openair1/PHY/MODULATION/beamforming.c index acf792b519..6864ca110e 100644 --- a/openair1/PHY/MODULATION/beamforming.c +++ b/openair1/PHY/MODULATION/beamforming.c @@ -63,7 +63,7 @@ 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++) { + for (p=0; pofdm_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); From adbc609bbf08a9c83bb4f6520351f9bb8a792070 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Wed, 18 Jan 2017 10:33:52 +0100 Subject: [PATCH 092/128] bugfix: reset DCI count before adding one The management of uplink failure generates a DCI to send a RA PDCCH order. It calls add_ue_spec_dci which increases DCI_pdu[CC_id]->Num_ue_spec_dci, but this was reset to 0 *after* the DCI generation. Let's reset *before*. Bug reported by Liang Yong on openair5g-user mailing list. --- openair2/LAYER2/MAC/eNB_scheduler.c | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c index e8ed8b8f5e..d00167160f 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler.c +++ b/openair2/LAYER2/MAC/eNB_scheduler.c @@ -121,6 +121,17 @@ 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_idNum_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; @@ -318,22 +329,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_idNum_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]) { */ From 773afc1490bf9c2b5bb7ecbb08052c16d997ecae Mon Sep 17 00:00:00 2001 From: "Raymond.Knopp" Date: Wed, 18 Jan 2017 13:21:07 +0100 Subject: [PATCH 093/128] TX power calibration, RX_W by default --- targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp | 2 +- .../GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.lmssdr.conf | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp index bd58bb7484..1482115e10 100644 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp @@ -213,7 +213,7 @@ int trx_lms_start(openair0_device *device){ printf("Set TX frequency %f MHz\n",device->openair0_cfg[0].tx_freq[0]/1e6); printf("Override antenna settings to: RX1_W, TXA_2"); - LMS_SetAntenna(lms_device, LMS_CH_RX, 0, 3); + LMS_SetAntenna(lms_device, LMS_CH_RX, 0, 2); LMS_SetAntenna(lms_device, LMS_CH_TX, 0, 2); 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 1e4482364d..e12acef703 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 @@ -39,7 +39,7 @@ eNBs = nb_antenna_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; @@ -50,7 +50,7 @@ eNBs = pucch_nRB_CQI = 1; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -27; + pdsch_referenceSignalPower = -30; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; From dce5191542309cf3e36e5196efe6eefe37302021 Mon Sep 17 00:00:00 2001 From: Tien-Thinh Nguyen Date: Wed, 18 Jan 2017 13:53:05 +0100 Subject: [PATCH 094/128] update to make harmony work with Mobipass[Ercom] --- openair1/PHY/LTE_TRANSPORT/if5_tools.c | 178 ++++++++++++++++-- openair2/LAYER2/MAC/pre_processor.c | 4 + targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c | 82 +++++++- .../ETHERNET/USERSPACE/LIB/ethernet_lib.c | 4 +- .../ETHERNET/USERSPACE/LIB/ethernet_lib.h | 1 + targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h | 1 + .../CONF/rcc.band7.tm1.50PRB.if4p5-ercom.conf | 6 +- targets/RT/USER/lte-enb.c | 56 ++++-- 8 files changed, 293 insertions(+), 39 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if5_tools.c b/openair1/PHY/LTE_TRANSPORT/if5_tools.c index 7be4c8d1df..5b1c834705 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_idsamples_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>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_idsamples_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>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_idsamples_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>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/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c index 5024aa605d..f0679098da 100644 --- a/openair2/LAYER2/MAC/pre_processor.c +++ b/openair2/LAYER2/MAC/pre_processor.c @@ -759,6 +759,10 @@ void dlsch_scheduler_pre_processor_reset (int module_idP, #endif LTE_eNB_UE_stats *eNB_UE_stats = mac_xface->get_eNB_UE_stats(module_idP,CC_id,rnti); // 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], diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c index 3ed1945add..5815f2b1a6 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,7 +45,7 @@ #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]; @@ -93,7 +93,11 @@ int eth_socket_init_raw(openair0_device *device) { eth->local_addr_ll.sll_family = AF_PACKET; eth->local_addr_ll.sll_ifindex = eth->if_index.ifr_ifindex; /* hear traffic from specific protocol*/ - eth->local_addr_ll.sll_protocol = htons((short)device->openair0_cfg->my_port); + 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); @@ -350,6 +354,78 @@ 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) { diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c index 732d4d31c9..6f93ba4853 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -87,6 +87,8 @@ int trx_eth_start(openair0_device *device) { } 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; @@ -363,7 +365,7 @@ int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth 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; + 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; diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h index fabb9f89fd..9f555beaa9 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h @@ -230,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 68b153392b..5fdb962b09 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h @@ -71,3 +71,4 @@ // 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/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 9ce8fac59f..1afa860c16 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/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 814a4cf619..686a690b2f 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -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; @@ -370,9 +371,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]<common_vars.txdata[0][aa][tx_offset])[0] = ((short*)&phy_vars_eNB->common_vars.txdata[0][aa][tx_offset])[0]<common_vars.txdata[0][aa][tx_offset])[0] = ((short*)&phy_vars_eNB->common_vars.txdata[0][aa][tx_offset])[0]<common_vars.txdata[0][aa][tx_offset])[1] = ((short*)&phy_vars_eNB->common_vars.txdata[0][aa][tx_offset])[1]<common_vars.txdata[0][aa][tx_offset])[1] = ((short*)&phy_vars_eNB->common_vars.txdata[0][aa][tx_offset])[1]<frame_parms,subframe) == SF_S) { @@ -662,26 +663,37 @@ 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); + recv_IF5(eNB, &proc->timestamp_rx, *subframe, IF5_MOBIPASS); - proc->subframe_rx = (proc->timestamp_rx/fp->samples_per_tti)%10; - proc->frame_rx = (proc->timestamp_rx/(10*fp->samples_per_tti))&1023; - - 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,"fh_if5_asynch_UL: 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,"fh_if5_asynch_UL: 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) @@ -1218,11 +1230,16 @@ void wakeup_slaves(eNB_proc_t *proc) { 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 ); @@ -1483,6 +1500,7 @@ static void* eNB_thread_single( void* 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]; @@ -1610,7 +1628,7 @@ static void* eNB_thread_single( void* param ) { } if (eNB->CC_id==1) - LOG_I(PHY,"eNB thread single %p (proc %p, CC_id %d), frame %d (%p), subframe %d (%p)\n", + 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 @@ -1751,7 +1769,7 @@ void init_eNB_proc(int inst) { } //for multiple CCs: setup master and slaves - /* + /* for (CC_id=0; CC_id= 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); @@ -2144,7 +2162,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); } From 1224cf44ae9c1951614a4df3db5a9153fb96fd5c Mon Sep 17 00:00:00 2001 From: "Raymond.Knopp" Date: Wed, 18 Jan 2017 14:14:07 +0100 Subject: [PATCH 095/128] switch RX to HIGH band input by default --- targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp index 1482115e10..3a9878e82b 100644 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp @@ -212,8 +212,8 @@ int trx_lms_start(openair0_device *device){ } printf("Set TX frequency %f MHz\n",device->openair0_cfg[0].tx_freq[0]/1e6); - printf("Override antenna settings to: RX1_W, TXA_2"); - LMS_SetAntenna(lms_device, LMS_CH_RX, 0, 2); + 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); From b0b5cb21e53fade58af575ac2cd0794af191803e Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Wed, 18 Jan 2017 15:31:04 +0100 Subject: [PATCH 096/128] Beamforming is now only done when necessary. This patch is based on one from enhancement-10-harmony. --- openair1/PHY/INIT/lte_init.c | 1 + openair1/PHY/MODULATION/defs.h | 2 +- openair1/PHY/MODULATION/ofdm_mod.c | 22 +++++++++++----------- openair1/PHY/defs.h | 2 ++ openair1/SIMULATION/LTE_PHY/dlsim.c | 6 ++++-- targets/RT/USER/lte-enb.c | 20 ++++++++++++++------ 6 files changed, 33 insertions(+), 20 deletions(-) diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index accc54af54..4d927dc5d3 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -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: diff --git a/openair1/PHY/MODULATION/defs.h b/openair1/PHY/MODULATION/defs.h index 6937db6d9b..da599114a9 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 74037b4a6e..8e09cea1ec 100644 --- a/openair1/PHY/MODULATION/ofdm_mod.c +++ b/openair1/PHY/MODULATION/ofdm_mod.c @@ -285,16 +285,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; lsymbols_per_tti>>1; l++) { @@ -302,13 +302,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 +316,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 +324,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/defs.h b/openair1/PHY/defs.h index d462fe58cb..0bc7c6e1c1 100644 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -415,6 +415,8 @@ typedef struct PHY_VARS_eNB_s { int single_thread_flag; openair0_rf_map rf_map; int abstraction_flag; + // indicator for precoding function (eNB,3GPP_eNB_BBU) + int do_precoding; void (*do_prach)(struct PHY_VARS_eNB_s *eNB); void (*fep)(struct PHY_VARS_eNB_s *eNB); int (*td)(struct PHY_VARS_eNB_s *eNB,int UE_id,int harq_pid,int llr8_flag); diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index f9a8acfa85..0682308ab7 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -2409,12 +2409,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); diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index a3d6d96e03..331a2b5fe1 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -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); @@ -1637,6 +1639,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst case NGFI_RRU_IF5: eNB->do_prach = NULL; eNB->fep = eNB_fep_rru_if5; + eNB->do_precoding = 0; eNB->td = NULL; eNB->te = NULL; eNB->proc_uespec_rx = NULL; @@ -1661,6 +1664,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; @@ -1690,6 +1694,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; @@ -1710,6 +1715,7 @@ 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_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; @@ -1742,6 +1748,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; @@ -1765,6 +1772,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; From 0695828e4c67707fa8ded86f0d2cde37a6ce388e Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Wed, 18 Jan 2017 16:43:02 +0100 Subject: [PATCH 097/128] some fixes --- .../CONF/enb.band4.tm1.usrpb210.conf | 14 ++++++++++---- targets/RT/USER/lte-enb.c | 4 ++-- 2 files changed, 12 insertions(+), 6 deletions(-) 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 853db14393..4004b5faec 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/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 331a2b5fe1..52688ced49 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -1694,7 +1694,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_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; @@ -1715,7 +1715,7 @@ 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_precoding = eNB->frame_parms.nb_antennas_tx==eNB->frame_parms.nb_antenna_ports_eNB; + 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; From e0c74791226f8074219099fde184371f3d10fe26 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Thu, 19 Jan 2017 09:32:29 +0100 Subject: [PATCH 098/128] and one more fix --- targets/RT/USER/lte-enb.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 52688ced49..5889b908c2 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -288,7 +288,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); @@ -299,7 +298,7 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) 0, subframe<<1, &phy_vars_eNB->frame_parms, - &phy_vars_eNB->do_precoding); + phy_vars_eNB->do_precoding); // if S-subframe generate first slot only if (subframe_select(&phy_vars_eNB->frame_parms,subframe) == SF_DL) { @@ -307,7 +306,7 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) 0, 1+(subframe<<1), &phy_vars_eNB->frame_parms, - &phy_vars_eNB->do_precoding); + phy_vars_eNB->do_precoding); } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_OFDM_MODULATION,0); From 05d02c43eced4d5ee8392b1d5692403916a026c8 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Thu, 19 Jan 2017 09:49:39 +0100 Subject: [PATCH 099/128] remove annoying logging (dump_CCE_table) --- openair2/LAYER2/MAC/eNB_scheduler_primitives.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c index ce08bc5408..7f81fa906e 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c @@ -1096,7 +1096,7 @@ try_again: 1<dci_alloc[j].L, nCCE,nCCE_max,DCI_pdu->num_pdcch_symbols); } - dump_CCE_table(CCE_table,nCCE_max,subframeP,dci_alloc->rnti,dci_alloc->L); + //dump_CCE_table(CCE_table,nCCE_max,subframeP,dci_alloc->rnti,dci_alloc->L); goto failed; } From 38b387794e43ae8af46bc32cf792400328511be9 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Thu, 19 Jan 2017 09:57:43 +0100 Subject: [PATCH 100/128] hack in RLC AM to avoid a race Here is the problem: 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. The "solution" is to test if rlc->input_sdus is NULL. This is a very dirty hack. I would say the solution is to use proper locking mechanism because RLC is used by two threads: PHY/MAC on one hand and RRC on another hand (I think). --- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c | 9 +++++++++ 1 file changed, 9 insertions(+) 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 1d93055487..4051a88ef2 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c @@ -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); From 5933f21882d95ccfe5ea1420df05937615d8c2cd Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Thu, 19 Jan 2017 10:00:19 +0100 Subject: [PATCH 101/128] hack to avoid zombie UEs in the MAC layer Here is the problem: 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... This has to be redone at some point. --- openair2/LAYER2/MAC/eNB_scheduler_ulsch.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c index ec43c2434b..6e744a5228 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c @@ -762,8 +762,25 @@ void schedule_ulsch_rnti(module_id_t module_idP, break; } } - if (drop_ue == 1) + if (drop_ue == 1) { + /* 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; nnumactiveULCCs[UE_id]; n++) { From 27a1101a5822aa63828409d33af55be7bac0a6ae Mon Sep 17 00:00:00 2001 From: Navid Nikaein Date: Thu, 19 Jan 2017 12:44:20 +0100 Subject: [PATCH 102/128] add support for RAN/radio resource slicing through flexran --- openair2/LAYER2/MAC/defs.h | 3 + openair2/LAYER2/MAC/flexran_agent_mac_proto.h | 141 +++++- .../MAC/flexran_agent_scheduler_dlsch_ue.c | 408 ++++++++++++++++-- 3 files changed, 511 insertions(+), 41 deletions(-) diff --git a/openair2/LAYER2/MAC/defs.h b/openair2/LAYER2/MAC/defs.h index 15c0f3fb0e..63501128ef 100644 --- a/openair2/LAYER2/MAC/defs.h +++ b/openair2/LAYER2/MAC/defs.h @@ -145,6 +145,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/flexran_agent_mac_proto.h b/openair2/LAYER2/MAC/flexran_agent_mac_proto.h index d661b90a20..6757500dc2 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 */ diff --git a/openair2/LAYER2/MAC/flexran_agent_scheduler_dlsch_ue.c b/openair2/LAYER2/MAC/flexran_agent_scheduler_dlsch_ue.c index 7f34cbb28f..3af246a5d5 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 #include "SIMULATION/TOOLS/defs.h" // for taus @@ -65,8 +66,67 @@ #define ENABLE_MAC_PAYLOAD_DEBUG +/** + * Local variables to support slicing + * + */ + + +/*!\brief UE ULSCH scheduling states*/ +typedef enum { + MIN_SLICE_STRATEGY = 0, + SLICE_MASK, + UEID_TO_SLICEID, + MAX_SLICE_STRATEGY +} SLICING_STRATEGY; + +// 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 + + +// number of active slices for past and current time +int n_active_slices = 1; +int n_active_slices_current = 1; + +// ue to slice mapping +int slicing_strategy = UEID_TO_SLICEID; +int slicing_strategy_current = UEID_TO_SLICEID; + +// 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; + +// 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}; + +int update_dl_scheduler[MAX_NUM_SLICES] = {1, 0, 0, 0}; +int update_dl_scheduler_current[MAX_NUM_SLICES] = {1, 0, 0, 0}; + +// 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 +}; + +// pointer to the slice specific scheduler +slice_scheduler slice_sched[MAX_NUM_SLICES] = {0}; + + +/** + * preprocessor functions for scheduling + * + */ + + // 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) { @@ -78,7 +138,10 @@ void _store_dlsch_buffer (module_id_t Mod_id, UE_TEMPLATE *UE_template; 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]; // clear logical channel interface variables @@ -114,8 +177,8 @@ void _store_dlsch_buffer (module_id_t Mod_id, */ 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, + "[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], @@ -141,10 +204,12 @@ void _store_dlsch_buffer (module_id_t Mod_id, // 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]) + 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]) { @@ -157,6 +222,10 @@ void _assign_rbs_required (module_id_t Mod_id, // 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; @@ -198,7 +267,8 @@ void _assign_rbs_required (module_id_t Mod_id, } 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); @@ -207,17 +277,17 @@ void _assign_rbs_required (module_id_t Mod_id, 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); + 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; } 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); + 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); } } } @@ -391,6 +461,7 @@ void _dlsch_scheduler_pre_processor_reset (int module_idP, 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; @@ -413,7 +484,8 @@ void _dlsch_scheduler_pre_processor_reset (int module_idP, 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; i0) // If this CC is allocated for MBSFN skip it here @@ -503,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, @@ -512,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); @@ -519,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); @@ -537,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; @@ -545,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; @@ -575,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 } @@ -587,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; iiordered_CCids[ii][i]; @@ -607,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; iiordered_CCids[ii][i]; @@ -632,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; iiordered_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); @@ -672,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; iiordered_CCids[ii][UE_id]; @@ -688,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]); } } } @@ -696,8 +791,11 @@ void _dlsch_scheduler_pre_processor (module_id_t Mod_id, #define SF05_LIMIT 1 +/* + * Main scheduling functions to support slicing + * + */ -//------------------------------------------------------------------------------ void flexran_schedule_ue_spec_default(mid_t mod_id, uint32_t frame, @@ -705,6 +803,224 @@ flexran_schedule_ue_spec_default(mid_t mod_id, 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]; + + } + } 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]; + + } + } + + // 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); +} + +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; @@ -776,10 +1092,11 @@ flexran_schedule_ue_spec_default(mid_t mod_id, start_meas(&eNB->schedule_dlsch_preprocessor); _dlsch_scheduler_pre_processor(mod_id, - frame, - subframe, - N_RBG, - mbsfn_flag); + 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); @@ -793,6 +1110,9 @@ flexran_schedule_ue_spec_default(mid_t mod_id, rnti = flexran_get_ue_crnti(mod_id, UE_id); ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; + 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"); @@ -840,7 +1160,7 @@ flexran_schedule_ue_spec_default(mid_t mod_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) { @@ -1372,12 +1692,20 @@ flexran_schedule_ue_spec_default(mid_t mod_id, } // 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]; + 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); } From 390085c377d286db47f0262204d93c1ea4cefb94 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Thu, 19 Jan 2017 12:47:50 +0100 Subject: [PATCH 103/128] remove printing of UE capabilities on stdout Modern UEs have very long UE capabilities. It disrupts realtime behaviour of the modem. Let's put a simple log message indicating we got the UE capabilities. --- openair2/RRC/LITE/rrc_eNB.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index 1ed4da9b27..d37741b40f 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; @@ -4786,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, @@ -4796,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) From 2c578f350aad32e36d39f736bec2424fc419f3e4 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Thu, 19 Jan 2017 17:23:15 +0100 Subject: [PATCH 104/128] remove XER printing in asn1_msg.c, too verbose --- openair2/RRC/LITE/MESSAGES/asn1_msg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair2/RRC/LITE/MESSAGES/asn1_msg.c b/openair2/RRC/LITE/MESSAGES/asn1_msg.c index 5f9a8e0e2a..b4290e8b9d 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 { From 56241235cf1b1c5c51d8963700a74393d35ae051 Mon Sep 17 00:00:00 2001 From: "Raymond.Knopp" Date: Fri, 20 Jan 2017 08:44:41 +0100 Subject: [PATCH 105/128] rcc configuration file band 7 if5. --- .../PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if5.25PRB.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index e8e0e6dadb..7541fa1ee1 100644 --- 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 @@ -150,7 +150,7 @@ 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 }; From 2a1d1134e91bccd9de37cf89f5461dcba7755aa6 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Fri, 20 Jan 2017 14:54:19 +0100 Subject: [PATCH 106/128] log an error if UE is -1 in rrc_mac_config_req --- openair2/LAYER2/MAC/config.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/openair2/LAYER2/MAC/config.c b/openair2/LAYER2/MAC/config.c index 2e76735fa7..b5d613e4ae 100644 --- a/openair2/LAYER2/MAC/config.c +++ b/openair2/LAYER2/MAC/config.c @@ -195,10 +195,14 @@ rrc_mac_config_req( } } 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" From c33afccb1be0f0a5ca96433bb6d77cf356d47095 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Fri, 20 Jan 2017 14:57:28 +0100 Subject: [PATCH 107/128] bugfix: logging was done after modification of values It resulted in wrong log message, leading to complicated debugging. --- openair2/LAYER2/MAC/eNB_scheduler_ulsch.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c index 6e744a5228..d09111290d 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c @@ -904,6 +904,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]; @@ -913,12 +919,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) From 89445da9ebb3f136e4b730ec339616e3cc308a1f Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Fri, 20 Jan 2017 14:59:24 +0100 Subject: [PATCH 108/128] attempting at fixing RRC RRC does not work very well when one UE goes away and comes back in some situations. This commit is an attempt at making things work better. It is probably not the end of the story. --- openair2/RRC/LITE/rrc_eNB.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index d37741b40f..8b5b012ff1 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -4191,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); } @@ -4204,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 */ @@ -4218,8 +4219,6 @@ 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 %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); @@ -4230,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; } } From a5d5a21ddb5b467886954c99648a7cf77b1727b0 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Fri, 20 Jan 2017 15:01:51 +0100 Subject: [PATCH 109/128] "fix" handling of UE_id in RA. What if it's -1? Is it possible? We catch the case and abort. We may do a proper fix if the case happen. I don't think it will, but who knows... --- openair2/LAYER2/MAC/eNB_scheduler_RA.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openair2/LAYER2/MAC/eNB_scheduler_RA.c b/openair2/LAYER2/MAC/eNB_scheduler_RA.c index e24281b89a..195c78c538 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) { From c1fee62473084fe6b75d56172c4954d20622992d Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Fri, 20 Jan 2017 15:05:28 +0100 Subject: [PATCH 110/128] RA: fix allocation of RA process A RA process is not available if and RA_template[i].wait_ack_Msg4 != 0 We can have RA_active==FALSE and wait_ack_Msg4==1, in which case the RA process is in use and cannot be reassigned. --- openair2/LAYER2/MAC/eNB_scheduler_RA.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openair2/LAYER2/MAC/eNB_scheduler_RA.c b/openair2/LAYER2/MAC/eNB_scheduler_RA.c index 195c78c538..8ff409978e 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_RA.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_RA.c @@ -747,7 +747,8 @@ 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 Date: Fri, 20 Jan 2017 15:09:05 +0100 Subject: [PATCH 111/128] fix: better creation of RNTI The previous version was calling taus(), which may return any value in [0..65535]. The new version restricts it to [1024..59999] (arbitrary values, big enough, and in the valid range). It also checks that the new RNTI is not already present in the MAC. I think we should also check that it's not used by a RA process. The "loop" thing may not be the best solution either. To be refined. --- openair2/LAYER2/MAC/eNB_scheduler_RA.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/openair2/LAYER2/MAC/eNB_scheduler_RA.c b/openair2/LAYER2/MAC/eNB_scheduler_RA.c index 8ff409978e..63109a4c0f 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_RA.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_RA.c @@ -749,13 +749,24 @@ void initiate_ra_proc(module_id_t module_idP, int CC_id,frame_t frameP, uint16_t for (i=0; i= 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", From 0d3fa211878f67198c6760ba37830702f03a3d64 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Fri, 20 Jan 2017 15:11:40 +0100 Subject: [PATCH 112/128] add a LOG in RA --- openair2/LAYER2/MAC/eNB_scheduler_RA.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openair2/LAYER2/MAC/eNB_scheduler_RA.c b/openair2/LAYER2/MAC/eNB_scheduler_RA.c index 63109a4c0f..e046c085e1 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_RA.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_RA.c @@ -776,6 +776,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) From c3c2b774d631fe3cba4898bb8ef860b1021d968d Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Fri, 20 Jan 2017 15:15:58 +0100 Subject: [PATCH 113/128] bugfix: do not get pCC_id if UE_id is invalid --- openair2/LAYER2/MAC/eNB_scheduler_primitives.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c index 7f81fa906e..71cbb36ce9 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c @@ -288,7 +288,7 @@ int rrc_mac_remove_ue(module_id_t mod_idP,rnti_t rntiP) 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) { LOG_W(MAC,"rrc_mac_remove_ue: UE %x not found\n", rntiP); @@ -296,6 +296,8 @@ int rrc_mac_remove_ue(module_id_t mod_idP,rnti_t rntiP) return 0; } + pCC_id = UE_PCCID(mod_idP,UE_id); + 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); From c824eea0745e19b0f0a2604e67aaa4cb47ff3707 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Fri, 20 Jan 2017 15:21:37 +0100 Subject: [PATCH 114/128] better (maybe) freeing of RA process when an UE is removed from MAC The RA process may be in the state: RA_active == FALSE and wait_ack_Msg4 == 1 Testing only the rnti should be enough, if everything else works properly. Also, don't break, just in case. (Not sure it makes a difference.) --- openair2/LAYER2/MAC/eNB_scheduler_primitives.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c index 71cbb36ce9..3cf36eaa8d 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c @@ -365,8 +365,7 @@ int rrc_mac_remove_ue(module_id_t mod_idP,rnti_t rntiP) RA_TEMPLATE *RA_template; for (i=0;iRA_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; @@ -374,7 +373,7 @@ 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) { From da75a078709f1952554759110c07d824b7e32fbf Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Fri, 20 Jan 2017 15:36:58 +0100 Subject: [PATCH 115/128] rewrite sort_UE for UL and DL and adapt the rest to the change The previous version did not seem to work properly with several UEs. I too often ended up with a list 'next' where next[i] = i, leading to an infinite loop, crashing the processing. The sorting functions were hard to understand and too slow anyway (O(n*n)). We now use qsort_r and comparison functions, that should define the same order as the previous version. One important point is that the "next" lists and the "head" variable are now considered invalid before calling sort_UE. So all the code (coming before sort_UE) that looped using those variables has been rewritten to loop over all possible UEs and the first instruction of the loop is to exit the loop if the UE is not 'active'. There is room for improvement here. We will reintroduce a list of some kind at some point. Let's first have something that works and then optimize. Today NUMBER_OF_UE_MAX is 16, that's not a big deal. Consequently, the add_new_ue and rrc_mac_remove_ue have also been rewritten, hopefully for the better. This commit is not a basic work and may introduce some problems. --- openair2/LAYER2/MAC/eNB_scheduler.c | 10 +- openair2/LAYER2/MAC/eNB_scheduler_dlsch.c | 2 + .../LAYER2/MAC/eNB_scheduler_primitives.c | 81 +---- openair2/LAYER2/MAC/pre_processor.c | 291 ++++++++++++++++-- 4 files changed, 283 insertions(+), 101 deletions(-) diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c index d00167160f..023d01d656 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; @@ -133,17 +133,15 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, } // 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]; - PHY_vars_eNB_g[module_idP][CC_id]->pusch_stats_bsr[i][(frameP*10)+subframeP]=-63; if (i==UE_list->head) VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_BSR,PHY_vars_eNB_g[module_idP][CC_id]->pusch_stats_bsr[i][(frameP*10)+subframeP]); @@ -271,8 +269,6 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, } } } // ul_failure_timer>0 - - i = next_i; } #if defined(ENABLE_ITTI) diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c index 93dc993711..770264074f 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c @@ -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); diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c index 3cf36eaa8d..db204c7762 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); - } //------------------------------------------------------------------------------ @@ -235,21 +234,16 @@ 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; + 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; @@ -282,17 +276,14 @@ 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; if (UE_id == -1) { 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; } @@ -301,6 +292,9 @@ int rrc_mac_remove_ue(module_id_t mod_idP,rnti_t 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; @@ -315,50 +309,6 @@ 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 @@ -376,15 +326,8 @@ int rrc_mac_remove_ue(module_id_t mod_idP,rnti_t rntiP) //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; } diff --git a/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c index 150f2c15de..f2f8c643e8 100644 --- a/openair2/LAYER2/MAC/pre_processor.c +++ b/openair2/LAYER2/MAC/pre_processor.c @@ -29,6 +29,9 @@ */ +#define _GNU_SOURCE +#include + #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]; @@ -153,23 +168,16 @@ void assign_rbs_required (module_id_t Mod_id, UE_list_t *UE_list = &eNB_mac_inst[Mod_id].UE_list; // UE_TEMPLATE *UE_template; LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]; - int skip_ue; // 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) */ - skip_ue = 0; - for (n=0; nnumactiveCCs[UE_id]; n++) { - CC_id = UE_list->ordered_CCids[n][UE_id]; - if (mac_xface->get_eNB_UE_stats(Mod_id,CC_id,rnti) == NULL) { - skip_ue = 1; - break; - } - } - if (skip_ue == 1) + if (!phy_stats_exist(Mod_id, rnti)) continue; //update CQI information across component carriers @@ -302,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;jUE_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; @@ -329,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); @@ -339,17 +460,13 @@ 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); - /* if 2nd UE is not in PHY, do nothing */ - if (cqi2 == -1) - continue; - /* if 1st UE is not in PHY, swap with 2nd UE */ - if (cqi1 == -1) { - swap_UEs(UE_list,UE_id1,UE_id2,0); - } else if(round2 > round1) { // Check first if one of the UEs has an active HARQ process which needs service and swap order + 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. @@ -374,6 +491,7 @@ void sort_UEs (module_id_t Mod_idP, } } } +#endif } @@ -427,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 @@ -473,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; iiordered_CCids[ii][UE_id]; @@ -485,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); @@ -526,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; iiordered_CCids[ii][i]; @@ -584,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); @@ -630,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); @@ -993,6 +1126,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; nnumactiveULCCs[UE_id]; n++) { @@ -1043,6 +1179,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; @@ -1073,6 +1211,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; @@ -1130,7 +1270,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); @@ -1138,6 +1279,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 @@ -1221,10 +1364,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; @@ -1246,6 +1482,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); @@ -1257,6 +1495,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); @@ -1276,4 +1516,5 @@ void sort_ue_ul (module_id_t module_idP,int frameP, sub_frame_t subframeP) } } } +#endif } From a6219153d979c5f9e449e968ad478216fec99195 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Fri, 20 Jan 2017 15:47:08 +0100 Subject: [PATCH 116/128] check (to be reworked at some point) We put an abort() at this point in the code, because if the previous commit is correct, the program will never comme here. --- openair2/LAYER2/MAC/eNB_scheduler_ulsch.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c index d09111290d..3fd1ba6508 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c @@ -763,6 +763,8 @@ void schedule_ulsch_rnti(module_id_t module_idP, } } 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 From a0f19a726554794a87697f0114496f66e13319df Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Fri, 20 Jan 2017 15:48:49 +0100 Subject: [PATCH 117/128] add some printf for debug purpose (to be remove at some point) this commit is here to help debug the previous ones. It has to be reverted at some point. --- openair2/LAYER2/MAC/eNB_scheduler_RA.c | 4 ++++ openair2/LAYER2/MAC/eNB_scheduler_primitives.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/openair2/LAYER2/MAC/eNB_scheduler_RA.c b/openair2/LAYER2/MAC/eNB_scheduler_RA.c index e046c085e1..991f8bfbfa 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_RA.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_RA.c @@ -710,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 { @@ -719,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; diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c index db204c7762..9dfd2f095b 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c @@ -243,6 +243,7 @@ int add_new_ue(module_id_t mod_idP, int cc_idP, rnti_t rntiP,int harq_pidP) 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; @@ -267,6 +268,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); @@ -282,6 +284,7 @@ int rrc_mac_remove_ue(module_id_t mod_idP,rnti_t rntiP) 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); return 0; @@ -289,6 +292,7 @@ int rrc_mac_remove_ue(module_id_t mod_idP,rnti_t rntiP) 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); From da0cbaf86c46eb4c9785125f8a599ea4ee87d882 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Fri, 20 Jan 2017 16:38:26 +0100 Subject: [PATCH 118/128] fix: add /usr/include/lime to include directories when testing on haswell, using apt-get to install LimeSDR libraries and includes, it put it in /usr/include, not /usr/local/include --- cmake_targets/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 658ac84e65..94ff4b239a 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -555,6 +555,7 @@ elseif (${RF_BOARD} STREQUAL "OAI_BLADERF") elseif (${RF_BOARD} STREQUAL "OAI_LMSSDR") include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB") 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") From 37a18b25305082549b02cef5b32e6063bcd8bc5b Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Fri, 20 Jan 2017 17:22:43 +0100 Subject: [PATCH 119/128] integration fix: bad #if #endif position --- openair1/PHY/MODULATION/beamforming.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/PHY/MODULATION/beamforming.c b/openair1/PHY/MODULATION/beamforming.c index 0e53f7e062..038517f692 100644 --- a/openair1/PHY/MODULATION/beamforming.c +++ b/openair1/PHY/MODULATION/beamforming.c @@ -115,9 +115,9 @@ int beam_precoding(int32_t **txdataF, } }*/ >>>>>>> enhancement-192-beamforming -#endif } } +#endif return 0; } From e84a00174babe2095b9e6491373befb7f1718d1c Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Sat, 21 Jan 2017 16:20:10 +0100 Subject: [PATCH 120/128] choosing the right version of the unresolved merge conflict in beamforming.c changed the memory allocation of txdataF and beam_weigths --- openair1/PHY/INIT/lte_init.c | 52 ++++++++++++++------------- openair1/PHY/MODULATION/beamforming.c | 32 +---------------- targets/RT/USER/lte-enb.c | 1 - 3 files changed, 29 insertions(+), 56 deletions(-) diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index bc74c3610e..710527ab3f 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -1306,13 +1306,15 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, common_vars->txdataF_BF[eNB_id] = (int32_t **)malloc16(fp->nb_antennas_tx*sizeof(int32_t*)); if (eNB->node_function != NGFI_RRU_IF5) { - for (i=0; i<((eNB->do_precoding==0)?fp->nb_antennas_tx:14); i++) { - common_vars->txdataF[eNB_id][i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*fp->symbols_per_tti*10*sizeof(int32_t) ); + for (i=0; inb_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 - 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)); + 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; inb_antennas_tx; i++) { @@ -1328,27 +1330,29 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, #endif } - for (i=0; ibeam_weights[eNB_id][i] = (int32_t **)malloc16_clear(fp->nb_antennas_tx*sizeof(int32_t*)); - for (j=0; jnb_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; reofdm_symbol_size; re++) - common_vars->beam_weights[eNB_id][i][j][re] = 0x00007fff; - } - else if (i>4) { - for (re=0; reofdm_symbol_size; re++) - common_vars->beam_weights[eNB_id][i][j][re] = 0x00007fff/fp->nb_antennas_tx; - } + for (i=0; inb_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; jnb_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; reofdm_symbol_size; re++) + common_vars->beam_weights[eNB_id][i][j][re] = 0x00007fff; + } + else if (i>4) { + for (re=0; reofdm_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 diff --git a/openair1/PHY/MODULATION/beamforming.c b/openair1/PHY/MODULATION/beamforming.c index 038517f692..88ac12b0a7 100644 --- a/openair1/PHY/MODULATION/beamforming.c +++ b/openair1/PHY/MODULATION/beamforming.c @@ -63,35 +63,8 @@ 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)); -#if 0 -/* TODO: to be resolved */ -<<<<<<< HEAD - 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); - if (txdataF[p]) {//[slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re]!=0) { - - for (re=0;reofdm_symbol_size;re++) { - ((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]); - */ - } -======= for (p=0; pnb_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); @@ -114,10 +87,7 @@ int beam_precoding(int32_t **txdataF, ((int16_t*)&txdataF_BF[aa][re])[1]); } }*/ ->>>>>>> enhancement-192-beamforming - } } -#endif return 0; } diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 02a64172e3..0605dff2ab 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -2002,7 +2002,6 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst eNB->do_prach = NULL; eNB->do_precoding = 0; eNB->fep = eNB_fep_rru_if5; - eNB->do_precoding = 0; eNB->td = NULL; eNB->te = NULL; eNB->proc_uespec_rx = NULL; From 101d28e9da4df0417120a1b7f9c106e46bee7eec Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Mon, 23 Jan 2017 10:32:39 +0100 Subject: [PATCH 121/128] integration fix: fix compilation of ulsim Hopefully the right argument is passed to this function. --- openair1/SIMULATION/LTE_PHY/ulsim.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c index cf9e5aaa30..55c6b8387e 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); From 7aa57b4d8434738c64cd92be2f1ab7da8004eedb Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Mon, 23 Jan 2017 13:56:10 +0100 Subject: [PATCH 122/128] remove compilation of oai_nw_drv The compilation of this module does not seem to be necessary, as far as I have checked. Plus it fails when you run "build_oai --oaisim --noS1", so let's not compile it. --- cmake_targets/build_oai | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai index 0a64c0a672..b6f2d2c6c5 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 From 68ff688b7105283eb289dbb714e17ea348efc980 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Tue, 24 Jan 2017 10:03:50 +0100 Subject: [PATCH 123/128] autotest v2: source oaienv in execution.bash --- cmake_targets/autotests/v2/actions/execution.bash | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmake_targets/autotests/v2/actions/execution.bash b/cmake_targets/autotests/v2/actions/execution.bash index 503b6b963d..0e05014888 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 From 7a2984e8aee8b985c668eac5706dac0f326cd77f Mon Sep 17 00:00:00 2001 From: gabrielC Date: Wed, 25 Jan 2017 10:57:20 +0100 Subject: [PATCH 124/128] [OAI-UE] TimingOffset tracking faster loop --- openair1/PHY/LTE_ESTIMATION/defs.h | 2 +- openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c | 9 ++-- .../lte_dl_channel_estimation.c | 40 +++++++++++++++++ openair1/PHY/LTE_TRANSPORT/dci.c | 4 +- openair1/PHY/LTE_TRANSPORT/dci_tools.c | 4 +- openair1/PHY/LTE_TRANSPORT/phich.c | 4 +- openair1/PHY/defs.h | 2 + openair1/SCHED/phy_procedures_lte_ue.c | 41 +++++++++++++---- targets/RT/USER/lte-ue.c | 44 ++++++++++++++----- 9 files changed, 121 insertions(+), 29 deletions(-) diff --git a/openair1/PHY/LTE_ESTIMATION/defs.h b/openair1/PHY/LTE_ESTIMATION/defs.h index 3af9c2471f..6c579332b1 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 diff --git a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c index 8f9b9cc047..c3e8ebcb98 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c @@ -74,13 +74,14 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms, else max_pos_fil = ((max_pos_fil * coef) + (max_pos * ncoef)) >> 15; + max_pos_fil = max_pos; diff = max_pos_fil - frame_parms->nb_prefix_samples/8; - 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; diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c index 760486933a..438051f4b3 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c @@ -693,6 +693,46 @@ 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 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: 4/5*ofdms11 + 1/5*ofdms7 4/5 q1.15 26214 1/5 q1.15 6554 + 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++) + { + int32_t tmp_mult = 0; + tmp_mult = ((int32_t)dlChEst_ofdm11[i] * 26214 + (int32_t)dlChEst_ofdm7[i] * 6554); + + tmp_mult = tmp_mult >> 15; + dlChEst_ofdm12[i] = tmp_mult; + /* + if((i==0)) + { + LOG_I(PHY,"interpolate dlchest11_0 using: dlchest11 %d+%di dlchest7 %d+%di\n",dlChEst_ofdm11[0],dlChEst_ofdm11[1],dlChEst_ofdm7[0],dlChEst_ofdm7[1]); + LOG_I(PHY,"interpolate dlchest11_1 using: dlchest11 %d+%di dlchest7 %d+%di\n",dlChEst_ofdm11[2],dlChEst_ofdm11[3],dlChEst_ofdm7[2],dlChEst_ofdm7[3]); + LOG_I(PHY,"interpolate dlchest11_2 using: dlchest11 %d+%di dlchest7 %d+%di\n",dlChEst_ofdm11[4],dlChEst_ofdm11[5],dlChEst_ofdm7[4],dlChEst_ofdm7[5]); + }*/ + } + + // interpolate ofdm s13: 2/3*ofdms11 + 1/3*ofdms7 2/3 q1.15 21845 1/3 q1.15 10923 + 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++) + { + int32_t tmp_mult = 0; + tmp_mult = ((int32_t)dlChEst_ofdm11[i] * 21845 + (int32_t)dlChEst_ofdm7[i] * 10923); + + tmp_mult = tmp_mult >> 15; + dlChEst_ofdm13[i] = tmp_mult; + /*if((i==0)) + { + LOG_I(PHY,"interpolate dlchest11_0 using: dlchest11 %d+%di dlchest7 %d+%di\n",dlChEst_ofdm11[0],dlChEst_ofdm11[1],dlChEst_ofdm7[0],dlChEst_ofdm7[1]); + LOG_I(PHY,"interpolate dlchest11_1 using: dlchest11 %d+%di dlchest7 %d+%di\n",dlChEst_ofdm11[2],dlChEst_ofdm11[3],dlChEst_ofdm7[2],dlChEst_ofdm7[3]); + LOG_I(PHY,"interpolate dlchest11_2 using: dlchest11 %d+%di dlchest7 %d+%di\n",dlChEst_ofdm11[4],dlChEst_ofdm11[5],dlChEst_ofdm7[4],dlChEst_ofdm7[5]); + }*/ + } +#endif } } diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c index 55a12a253a..421b86e95f 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci.c +++ b/openair1/PHY/LTE_TRANSPORT/dci.c @@ -1752,9 +1752,9 @@ int32_t rx_pdcch(LTE_UE_COMMON *common_vars, avgs = cmax(avgs,avgP[(aarx<<1)+aatx]); log2_maxh = (log2_approx(avgs)/2) + 5; //+frame_parms->nb_antennas_rx; -#ifdef DEBUG_PHY +//#ifdef DEBUG_PHY LOG_I(PHY,"subframe %d: pdcch log2_maxh = %d (%d,%d)\n",subframe,log2_maxh,avgP[0],avgs); -#endif +//#endif #if T_TRACER T(T_UE_PHY_PDCCH_ENERGY, T_INT(eNB_id), T_INT(0), T_INT(frame%1024), T_INT(subframe), diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c index fb348c13fa..f2452c34aa 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c @@ -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); diff --git a/openair1/PHY/LTE_TRANSPORT/phich.c b/openair1/PHY/LTE_TRANSPORT/phich.c index f8330c9fc5..3db702f9e4 100644 --- a/openair1/PHY/LTE_TRANSPORT/phich.c +++ b/openair1/PHY/LTE_TRANSPORT/phich.c @@ -1395,7 +1395,7 @@ void rx_phich(PHY_VARS_UE *ue, //#ifdef DEBUG_PHICH 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, @@ -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/defs.h b/openair1/PHY/defs.h index a679644b8b..47180453fd 100644 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -124,6 +124,7 @@ 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" @@ -798,6 +799,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/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index bfe4c82bdc..763eb79c21 100644 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -1359,7 +1359,7 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB } if (isBad) { - LOG_D(PHY,"Skip PUSCH generation!\n"); + LOG_I(PHY,"Skip PUSCH generation!\n"); ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0; } } @@ -1369,7 +1369,7 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB // deactivate service request // ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0; - 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); + LOG_I(PHY,"Generating PUSCH (Abssubframe: %d.%d): harq-Id: %d, round: %d, MaxReTrans: %d \n",frame_tx%1024,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 achieved ==> send last pusch\n"); @@ -1689,7 +1689,7 @@ int16_t get_pucch2_ri(PHY_VARS_UE *ue,int eNB_id) { return(1); } - +int count0=0; void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag) { @@ -1815,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 %d, amp %d\n", + LOG_I(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, @@ -1828,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_I(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, @@ -1855,7 +1855,32 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin T_INT(ue->dlsch[eNB_id][0]->current_harq_pid)); } #endif - + +#if 1 + if ((pucch_ack_payload[0] == 0) && (proc->subframe_tx==4) && (ue->rx_offset_diff != 0)) + count0++; + if(count0 > 5) + { + LOG_E(PHY,"Signal drop !!! ==> dump received signal AbsSubframe %d.%d rx_offset %d \n",proc->frame_rx,proc->subframe_rx, ue->rx_offset); + + write_output("rxData.m","rxData",&ue->common_vars.rxdata[0][0],(10*frame_parms->samples_per_tti)+2048,1,1); + + //write_output("rxDataF.m","rxDataF",&ue->common_vars.rxdataF[0][0],frame_parms->ofdm_symbol_size * 14,1,1); + if(proc->subframe_rx & 0x1) + { + write_output("dlChEstOdd.m","dlChEst",&ue->common_vars.dl_ch_estimates[0][0][0],frame_parms->symbols_per_tti * (frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH),1,1); + } + else + { + write_output("dlChEstEven.m","dlChEst",&ue->common_vars.dl_ch_estimates[0][0][0],frame_parms->symbols_per_tti * (frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH),1,1); + } + //write_output("rxdataF_ext.m","rxdataF_ext",&ue->pdsch_vars[eNB_id]->rxdataF_ext[0][0],frame_parms->N_RB_DL*12*14,1,1); + //write_output("dlChEst_ext.m","dlChEst_ext",&ue->pdsch_vars[eNB_id]->dl_ch_estimates_ext[0][0],frame_parms->N_RB_DL*12*14,1,1); + + + AssertFatal(0," "); + } +#endif if (abstraction_flag == 0) { generate_pucch1x(ue->common_vars.txdataF, @@ -2278,7 +2303,7 @@ void ue_measurement_procedures( } - if ((subframe_rx==0) && (l==(4-frame_parms->Ncp))) { + if ((subframe_rx==0) && (slot == 0) && (l==(4-frame_parms->Ncp))) { // AGC diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 10883921e7..9d574a6e2e 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -1152,18 +1152,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; iframe_parms.nb_antennas_rx; i++) + { + rxp[i] = (void*)&UE->common_vars.rxdata[i][0]; + } + rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, ×tamp1, - (void**)UE->common_vars.rxdata, - UE->frame_parms.ofdm_symbol_size + UE->frame_parms.nb_prefix_samples0 - rx_off_diff, + rxp, + UE->frame_parms.nb_prefix_samples0 - rx_off_diff, UE->frame_parms.nb_antennas_rx); + + for (i=0; iframe_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, + 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_E(PHY,"SET rx_off_diff to %d\n",UE->rx_offset_diff); rx_off_diff = 0; } } @@ -1232,21 +1251,26 @@ 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_I(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_I(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; } - + //rx_off_diff = 0; + if (rx_correction_timer>0) rx_correction_timer--; } // start_rx_stream==1 From 0dd076a37a5051d8e6ab556e95a9813f446a4247 Mon Sep 17 00:00:00 2001 From: gabrielC Date: Fri, 6 Jan 2017 14:37:31 +0100 Subject: [PATCH 125/128] [OAI-UE] fix time tracking and channel interpolation --- openair1/PHY/INIT/lte_init.c | 73 +++++++++----- openair1/PHY/LTE_ESTIMATION/defs.h | 4 +- openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c | 14 +-- .../lte_dl_bf_channel_estimation.c | 4 +- .../lte_dl_channel_estimation.c | 94 +++++++++---------- .../lte_dl_mbsfn_channel_estimation.c | 26 ++--- .../PHY/LTE_ESTIMATION/lte_ue_measurements.c | 32 +++---- openair1/PHY/LTE_TRANSPORT/dci.c | 20 ++-- openair1/PHY/LTE_TRANSPORT/dci_tools.c | 18 ++-- .../PHY/LTE_TRANSPORT/dlsch_demodulation.c | 60 ++++++------ openair1/PHY/LTE_TRANSPORT/initial_sync.c | 2 +- openair1/PHY/LTE_TRANSPORT/pbch.c | 4 +- openair1/PHY/LTE_TRANSPORT/phich.c | 2 +- openair1/PHY/LTE_TRANSPORT/pmch.c | 6 +- openair1/PHY/LTE_TRANSPORT/proto.h | 3 +- openair1/PHY/LTE_TRANSPORT/sss.c | 2 +- openair1/PHY/MODULATION/ofdm_mod.c | 4 +- openair1/PHY/MODULATION/slot_fep.c | 26 +++-- openair1/PHY/MODULATION/slot_fep_mbsfn.c | 6 +- openair1/PHY/TOOLS/lte_phy_scope.c | 8 +- openair1/PHY/defs.h | 3 +- openair1/PHY/impl_defs_lte.h | 42 +++++---- openair1/SCHED/defs.h | 2 +- openair1/SCHED/phy_procedures_lte_ue.c | 83 +++++----------- targets/RT/USER/lte-ue.c | 19 ++-- 25 files changed, 282 insertions(+), 275 deletions(-) diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index 710527ab3f..f6f8d8f858 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -1063,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; @@ -1116,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; inb_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; inb_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_idn_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)); @@ -1150,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; inb_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 ); @@ -1225,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) ); } diff --git a/openair1/PHY/LTE_ESTIMATION/defs.h b/openair1/PHY/LTE_ESTIMATION/defs.h index 6c579332b1..08615119ef 100644 --- a/openair1/PHY/LTE_ESTIMATION/defs.h +++ b/openair1/PHY/LTE_ESTIMATION/defs.h @@ -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 c3e8ebcb98..cefa6fd99f 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; aanb_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,9 +75,10 @@ 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 ( abs(diff) < SYNCH_HYST ) ue->rx_offset = 0; @@ -92,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 0b220c2c39..df6a55eaf3 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 438051f4b3..b34331eb8d 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,46 +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 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: 4/5*ofdms11 + 1/5*ofdms7 4/5 q1.15 26214 1/5 q1.15 6554 - 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++) - { - int32_t tmp_mult = 0; - tmp_mult = ((int32_t)dlChEst_ofdm11[i] * 26214 + (int32_t)dlChEst_ofdm7[i] * 6554); + 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)]; - tmp_mult = tmp_mult >> 15; - dlChEst_ofdm12[i] = tmp_mult; - /* - if((i==0)) - { - LOG_I(PHY,"interpolate dlchest11_0 using: dlchest11 %d+%di dlchest7 %d+%di\n",dlChEst_ofdm11[0],dlChEst_ofdm11[1],dlChEst_ofdm7[0],dlChEst_ofdm7[1]); - LOG_I(PHY,"interpolate dlchest11_1 using: dlchest11 %d+%di dlchest7 %d+%di\n",dlChEst_ofdm11[2],dlChEst_ofdm11[3],dlChEst_ofdm7[2],dlChEst_ofdm7[3]); - LOG_I(PHY,"interpolate dlchest11_2 using: dlchest11 %d+%di dlchest7 %d+%di\n",dlChEst_ofdm11[4],dlChEst_ofdm11[5],dlChEst_ofdm7[4],dlChEst_ofdm7[5]); - }*/ - } + // 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); - // interpolate ofdm s13: 2/3*ofdms11 + 1/3*ofdms7 2/3 q1.15 21845 1/3 q1.15 10923 - 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++) - { - int32_t tmp_mult = 0; - tmp_mult = ((int32_t)dlChEst_ofdm11[i] * 21845 + (int32_t)dlChEst_ofdm7[i] * 10923); + 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; + } + } - tmp_mult = tmp_mult >> 15; - dlChEst_ofdm13[i] = tmp_mult; - /*if((i==0)) - { - LOG_I(PHY,"interpolate dlchest11_0 using: dlchest11 %d+%di dlchest7 %d+%di\n",dlChEst_ofdm11[0],dlChEst_ofdm11[1],dlChEst_ofdm7[0],dlChEst_ofdm7[1]); - LOG_I(PHY,"interpolate dlchest11_1 using: dlchest11 %d+%di dlchest7 %d+%di\n",dlChEst_ofdm11[2],dlChEst_ofdm11[3],dlChEst_ofdm7[2],dlChEst_ofdm7[3]); - LOG_I(PHY,"interpolate dlchest11_2 using: dlchest11 %d+%di dlchest7 %d+%di\n",dlChEst_ofdm11[4],dlChEst_ofdm11[5],dlChEst_ofdm7[4],dlChEst_ofdm7[5]); - }*/ - } -#endif } } @@ -774,15 +774,15 @@ int lte_dl_channel_estimation(PHY_VARS_UE *ue, // do ifft of channel estimate for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) for (p=0; pframe_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 271187b447..2ce0e45b14 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; aaframe_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_ue_measurements.c b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c index 51dc933db3..db8fe548a2 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; aarxframe_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; aarxframe_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; aarxframe_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; aarxnb_antennas_rx; aarx++) { for (aatx=0; aatxnb_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; aarxnb_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; subbandcommon_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; subbandnb_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_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c index 421b86e95f..49fe90bf15 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; srxdataF, - 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, @@ -1752,9 +1752,9 @@ int32_t rx_pdcch(LTE_UE_COMMON *common_vars, avgs = cmax(avgs,avgP[(aarx<<1)+aatx]); log2_maxh = (log2_approx(avgs)/2) + 5; //+frame_parms->nb_antennas_rx; -//#ifdef DEBUG_PHY +#ifdef DEBUG_PHY LOG_I(PHY,"subframe %d: pdcch log2_maxh = %d (%d,%d)\n",subframe,log2_maxh,avgP[0],avgs); -//#endif +#endif #if T_TRACER T(T_UE_PHY_PDCCH_ENERGY, T_INT(eNB_id), T_INT(0), T_INT(frame%1024), T_INT(subframe), diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c index f2452c34aa..b262dbccf9 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c @@ -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_demodulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c index 6dfd02c490..7d14e8aca7 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]; @@ -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_in_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_in_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/initial_sync.c b/openair1/PHY/LTE_TRANSPORT/initial_sync.c index 9ba6f2e2ac..c29562b6cd 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 8f6489861b..e28e179b07 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/phich.c b/openair1/PHY/LTE_TRANSPORT/phich.c index 3db702f9e4..b46c416706 100644 --- a/openair1/PHY/LTE_TRANSPORT/phich.c +++ b/openair1/PHY/LTE_TRANSPORT/phich.c @@ -1399,7 +1399,7 @@ void rx_phich(PHY_VARS_UE *ue, subframe, HI16, nseq_PHICH, - ngroup_PHICH, + ngroup_PHICH,ulsch->harq_processes[harq_pid]->round+1, ulsch->Mlimit); //#endif diff --git a/openair1/PHY/LTE_TRANSPORT/pmch.c b/openair1/PHY/LTE_TRANSPORT/pmch.c index 1a2838e5cf..3bd3275883 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/proto.h b/openair1/PHY/LTE_TRANSPORT/proto.h index 94fa78a14b..a9674ca21e 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/sss.c b/openair1/PHY/LTE_TRANSPORT/sss.c index b3970a4429..85398edddb 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/MODULATION/ofdm_mod.c b/openair1/PHY/MODULATION/ofdm_mod.c index 8e09cea1ec..f6f0c1f618 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; jnb_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 850ea47916..bead242dd8 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; aanb_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/TOOLS/lte_phy_scope.c b/openair1/PHY/TOOLS/lte_phy_scope.c index 768dedddf5..bc67b2095c 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 47180453fd..d21312fe34 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" @@ -702,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]; diff --git a/openair1/PHY/impl_defs_lte.h b/openair1/PHY/impl_defs_lte.h index b25eea4c59..f6daccfbe0 100644 --- a/openair1/PHY/impl_defs_lte.h +++ b/openair1/PHY/impl_defs_lte.h @@ -784,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. @@ -795,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/SCHED/defs.h b/openair1/SCHED/defs.h index 3fcd25ad73..5fd5009f1f 100644 --- a/openair1/SCHED/defs.h +++ b/openair1/SCHED/defs.h @@ -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_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index 763eb79c21..7d061f60bf 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); /* @@ -1359,7 +1359,7 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB } if (isBad) { - LOG_I(PHY,"Skip PUSCH generation!\n"); + LOG_D(PHY,"Skip PUSCH generation!\n"); ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0; } } @@ -1369,7 +1369,7 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB // deactivate service request // ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0; - LOG_I(PHY,"Generating PUSCH (Abssubframe: %d.%d): harq-Id: %d, round: %d, MaxReTrans: %d \n",frame_tx%1024,subframe_tx,harq_pid,ue->ulsch[eNB_id]->harq_processes[harq_pid]->round,ue->ulsch[eNB_id]->Mlimit); + 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 achieved ==> send last pusch\n"); @@ -1689,7 +1689,7 @@ int16_t get_pucch2_ri(PHY_VARS_UE *ue,int eNB_id) { return(1); } -int count0=0; + void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag) { @@ -1815,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_I(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", + 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, @@ -1828,7 +1828,7 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin Po_PUCCH, tx_amp); } else { - LOG_I(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", + 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,ue->rx_offset_diff, @@ -1855,32 +1855,7 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin T_INT(ue->dlsch[eNB_id][0]->current_harq_pid)); } #endif - -#if 1 - if ((pucch_ack_payload[0] == 0) && (proc->subframe_tx==4) && (ue->rx_offset_diff != 0)) - count0++; - if(count0 > 5) - { - LOG_E(PHY,"Signal drop !!! ==> dump received signal AbsSubframe %d.%d rx_offset %d \n",proc->frame_rx,proc->subframe_rx, ue->rx_offset); - - write_output("rxData.m","rxData",&ue->common_vars.rxdata[0][0],(10*frame_parms->samples_per_tti)+2048,1,1); - - //write_output("rxDataF.m","rxDataF",&ue->common_vars.rxdataF[0][0],frame_parms->ofdm_symbol_size * 14,1,1); - if(proc->subframe_rx & 0x1) - { - write_output("dlChEstOdd.m","dlChEst",&ue->common_vars.dl_ch_estimates[0][0][0],frame_parms->symbols_per_tti * (frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH),1,1); - } - else - { - write_output("dlChEstEven.m","dlChEst",&ue->common_vars.dl_ch_estimates[0][0][0],frame_parms->symbols_per_tti * (frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH),1,1); - } - //write_output("rxdataF_ext.m","rxdataF_ext",&ue->pdsch_vars[eNB_id]->rxdataF_ext[0][0],frame_parms->N_RB_DL*12*14,1,1); - //write_output("dlChEst_ext.m","dlChEst_ext",&ue->pdsch_vars[eNB_id]->dl_ch_estimates_ext[0][0],frame_parms->N_RB_DL*12*14,1,1); - - - AssertFatal(0," "); - } -#endif + if (abstraction_flag == 0) { generate_pucch1x(ue->common_vars.txdataF, @@ -2268,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) @@ -2299,7 +2275,7 @@ 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); } @@ -2326,6 +2302,7 @@ void ue_measurement_procedures( lte_adjust_synch(&ue->frame_parms, ue, eNB_id, + subframe_rx, 0, 16384); } @@ -2777,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; @@ -2832,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]++; @@ -3377,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: @@ -3641,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); @@ -3672,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); @@ -3745,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); @@ -3763,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/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 9d574a6e2e..5555444dba 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) /*! @@ -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++; @@ -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); @@ -1182,7 +1188,7 @@ void *UE_thread(void *arg) { return &UE_thread_retval; } UE->rx_offset_diff = rx_off_diff; - LOG_E(PHY,"SET rx_off_diff to %d\n",UE->rx_offset_diff); + LOG_D(PHY,"SET rx_off_diff to %d\n",UE->rx_offset_diff); rx_off_diff = 0; } } @@ -1259,18 +1265,17 @@ void *UE_thread(void *arg) { (UE->rx_offset > 0) && (rx_correction_timer == 0)) { rx_off_diff = -1 ; - LOG_I(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); + 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_correction_timer == 0)) { // moving to the left so drop rx_off_diff samples rx_off_diff = 1; - LOG_I(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); + 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; } - //rx_off_diff = 0; - + if (rx_correction_timer>0) rx_correction_timer--; } // start_rx_stream==1 From d34a8019b27eae32ddc70388a845d05be12642a9 Mon Sep 17 00:00:00 2001 From: hbilel Date: Fri, 27 Jan 2017 08:18:02 +0100 Subject: [PATCH 126/128] [OAI UE] Fix: use double buffer for rxDataF, dlChannelEst and pdsch context since two rx threads (even/odd) are used by OAI-UE --- openair1/SIMULATION/LTE_PHY/dlsim.c | 24 +++++----- openair1/SIMULATION/LTE_PHY/dlsim_tm7.c | 58 ++++++++++++------------- openair1/SIMULATION/LTE_PHY/mbmssim.c | 4 +- openair1/SIMULATION/LTE_PHY/pbchsim.c | 8 ++-- openair1/SIMULATION/LTE_PHY/pdcchsim.c | 16 +++---- openair1/SIMULATION/LTE_PHY/pucchsim.c | 2 +- openair1/SIMULATION/LTE_PHY/syncsim.c | 12 ++--- targets/SIMU/USER/channel_sim.c | 2 +- targets/SIMU/USER/oaisim.c | 6 +-- targets/SIMU/USER/oaisim_pad.c | 6 +-- 10 files changed, 69 insertions(+), 69 deletions(-) diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index 879573525a..4c44f8adee 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -2509,30 +2509,30 @@ 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 @@ -2594,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); @@ -2602,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); } @@ -2623,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); } @@ -2631,7 +2631,7 @@ 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); } diff --git a/openair1/SIMULATION/LTE_PHY/dlsim_tm7.c b/openair1/SIMULATION/LTE_PHY/dlsim_tm7.c index 641efd2ed9..7f35730712 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; aanb_antenna_ports_eNB; aa++) { for (aarx=0; aarxnb_antennas_rx; aarx++) { for (i=0; iN_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; aanb_antenna_ports_eNB; aa++) { for (aarx=0; aarxnb_antennas_rx; aarx++) { for (i=0; iN_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,30 +3485,30 @@ 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 @@ -3535,8 +3535,8 @@ PMI_FEEDBACK: if (trials==0 && round==0 && transmission_mode>=5 && transmission_mode<7) { for (iii=0; iiipdsch_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;idlsch[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,7 +3724,7 @@ 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); } diff --git a/openair1/SIMULATION/LTE_PHY/mbmssim.c b/openair1/SIMULATION/LTE_PHY/mbmssim.c index 7f2f8502e3..fb2fa506ac 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; aanb_antennas_tx; aa++) { for (aarx=0; aarxnb_antennas_rx; aarx++) { for (i=0; iN_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); } } } diff --git a/openair1/SIMULATION/LTE_PHY/pbchsim.c b/openair1/SIMULATION/LTE_PHY/pbchsim.c index 83906d7322..1e32518e92 100644 --- a/openair1/SIMULATION/LTE_PHY/pbchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pbchsim.c @@ -963,7 +963,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&0x1].dl_ch_estimates[0], &UE->frame_parms, l, &freq_offset, @@ -1051,13 +1051,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&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("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&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 86d542c019..1ba79bdb0a 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; aanb_antennas_tx; aa++) { for (aarx=0; aarxnb_antennas_rx; aarx++) { for (i=0; iN_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; aanb_antenna_ports_eNB; aa++) { for (aarx=0; aarxnb_antennas_rx; aarx++) { for (i=0; iN_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; } } } @@ -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/pucchsim.c b/openair1/SIMULATION/LTE_PHY/pucchsim.c index 77bfcb18cf..4428aa85c3 100644 --- a/openair1/SIMULATION/LTE_PHY/pucchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pucchsim.c @@ -581,7 +581,7 @@ int main(int argc, char **argv) //write_output("txsig0.m","txs0", &txdata[0][subframe*frame_parms->samples_per_tti],frame_parms->samples_per_tti,1,1); write_output("txsig0pucch.m", "txs0", &txdata[0][0], FRAME_LENGTH_COMPLEX_SAMPLES,1,1); write_output("rxsig0.m","rxs0", &eNB->common_vars.rxdata[0][0][subframe*frame_parms->samples_per_tti],frame_parms->samples_per_tti,1,1); - write_output("rxsigF0.m","rxsF0", &eNB->common_vars.rxdataF[0][0][0],512*nsymb*2,2,1); + write_output("rxsigF0.m","rxsF0", &eNB->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[0][0][0],512*nsymb*2,2,1); } diff --git a/openair1/SIMULATION/LTE_PHY/syncsim.c b/openair1/SIMULATION/LTE_PHY/syncsim.c index d8d8dac214..c353111c7a 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); diff --git a/targets/SIMU/USER/channel_sim.c b/targets/SIMU/USER/channel_sim.c index a884fd5624..514f876939 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/oaisim.c b/targets/SIMU/USER/oaisim.c index 3a06a62780..23665f6763 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 153a522cd4..58589ef8f7 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); From dc5f420d886c532f28f458ca20020cb095349c86 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Fri, 27 Jan 2017 18:11:52 +0100 Subject: [PATCH 127/128] fix compilation of unitary simulators I'm not sure the fixes are correct. --- openair1/SIMULATION/LTE_PHY/dlsim.c | 4 ++-- openair1/SIMULATION/LTE_PHY/dlsim_tm7.c | 4 ++-- openair1/SIMULATION/LTE_PHY/pbchsim.c | 9 +++++---- openair1/SIMULATION/LTE_PHY/pucchsim.c | 2 +- openair1/SIMULATION/LTE_PHY/syncsim.c | 2 +- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index 4c44f8adee..62b4063d29 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -2536,7 +2536,7 @@ int main(int argc, char **argv) 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); @@ -2636,7 +2636,7 @@ int main(int argc, char **argv) } //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 7f35730712..874af41f45 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim_tm7.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim_tm7.c @@ -3512,7 +3512,7 @@ PMI_FEEDBACK: 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); @@ -3729,7 +3729,7 @@ PMI_FEEDBACK: } //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/pbchsim.c b/openair1/SIMULATION/LTE_PHY/pbchsim.c index 1e32518e92..806a206a2b 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.common_vars_rx_data_per_thread[subframe&0x1].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.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); + 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.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("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.common_vars_rx_data_per_thread[subframe&0x1].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/pucchsim.c b/openair1/SIMULATION/LTE_PHY/pucchsim.c index 4428aa85c3..77bfcb18cf 100644 --- a/openair1/SIMULATION/LTE_PHY/pucchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pucchsim.c @@ -581,7 +581,7 @@ int main(int argc, char **argv) //write_output("txsig0.m","txs0", &txdata[0][subframe*frame_parms->samples_per_tti],frame_parms->samples_per_tti,1,1); write_output("txsig0pucch.m", "txs0", &txdata[0][0], FRAME_LENGTH_COMPLEX_SAMPLES,1,1); write_output("rxsig0.m","rxs0", &eNB->common_vars.rxdata[0][0][subframe*frame_parms->samples_per_tti],frame_parms->samples_per_tti,1,1); - write_output("rxsigF0.m","rxsF0", &eNB->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[0][0][0],512*nsymb*2,2,1); + write_output("rxsigF0.m","rxsF0", &eNB->common_vars.rxdataF[0][0][0],512*nsymb*2,2,1); } diff --git a/openair1/SIMULATION/LTE_PHY/syncsim.c b/openair1/SIMULATION/LTE_PHY/syncsim.c index c353111c7a..6e74f7bc01 100644 --- a/openair1/SIMULATION/LTE_PHY/syncsim.c +++ b/openair1/SIMULATION/LTE_PHY/syncsim.c @@ -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 { From 61b3de99cb338d6821aff4db39c8a0e4d17bffdb Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Mon, 30 Jan 2017 09:28:35 +0100 Subject: [PATCH 128/128] fix autotest v2 --- cmake_targets/autotests/v2/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake_targets/autotests/v2/main.py b/cmake_targets/autotests/v2/main.py index a006a63d14..6cf3b97c36 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') + '"')