diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9d3a487c00..5da2cb12d5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -713,6 +713,32 @@ file(GLOB F1AP_C_FILES ${F1AP_DIR}/*.c)
add_library(F1AP ${F1AP_C_FILES} )
+# LPP
+##############
+set(LPP_DIR ${OPENAIR3_DIR}/LPP)
+set(LPP_ASN_DIR ${LPP_DIR}/MESSAGES)
+set(LPP_ASN_FILES
+ ${LPP_ASN_DIR}/37355-g60.asn
+ )
+
+set(LPP_ASN_GENERATED_C_DIR ${asn1_generated_dir}/LPP)
+
+set(lpp_cmd ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "LPP_" "-findirect-choice -fno-include-deps" "${LPP_ASN_GENERATED_C_DIR}")
+
+compile_asn1("${LPP_ASN_FILES}" "${lpp_cmd}" lpp_flag)
+
+file(GLOB LPP_ASN_GENERATED_C_FILES ${LPP_ASN_GENERATED_C_DIR}/*.c)
+add_library(LPP_LIB
+ ${LPP_ASN_GENERATED_C_FILES}
+ )
+add_dependencies (LPP_LIB lpp_flag)
+
+include_directories ("${LPP_ASN_GENERATED_C_DIR}")
+include_directories ("${LPP_DIR}")
+
+#file(GLOB LPP_C_FILES ${LPP_DIR}/*.c)
+#add_library(LPP ${LPP_C_FILES} )
+
# Hardware dependant options
###################################
add_list1_option(NB_ANTENNAS_RX "4" "Number of antennas in reception" "1" "2" "4")
@@ -1610,6 +1636,7 @@ set(PHY_SRC_UE
${OPENAIR1_DIR}/PHY/INIT/nr_init.c
${OPENAIR1_DIR}/PHY/INIT/nr_parms.c
${OPENAIR1_DIR}/PHY/MODULATION/nr_modulation.c
+ ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_prs.c
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_pss.c
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_sss.c
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_pbch.c
diff --git a/common/utils/T/T_messages.txt b/common/utils/T/T_messages.txt
index 716c77823d..4d18bea384 100644
--- a/common/utils/T/T_messages.txt
+++ b/common/utils/T/T_messages.txt
@@ -105,6 +105,10 @@ ID = GNB_PHY_PRACH_INPUT_SIGNAL
DESC = gNodeB input data in the time domain for slots with PRACH detection
GROUP = ALL:PHY:GRAPHIC:HEAVY:GNB
FORMAT = int,frame : int,slot : int,antenna : buffer,rxdata
+ID = GNB_PHY_DL_OUTPUT_SIGNAL
+ DESC = gNodeB output data in the freq domain for slots
+ GROUP = ALL:PHY:GRAPHIC:HEAVY:GNB
+ FORMAT = int,gNB_ID : int,frame : int,slot : int,antenna : buffer,txdata
#MAC logs
ID = ENB_MAC_UE_DL_SDU
@@ -1305,7 +1309,11 @@ ID = UE_PHY_INPUT_SIGNAL
ID = UE_PHY_DL_CHANNEL_ESTIMATE
DESC = UE channel estimation in the time domain
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
- FORMAT = int,eNB_ID : int,frame : int,subframe : int,antenna : buffer,chest_t
+ FORMAT = int,eNB_ID : int,rsc_id : int,frame : int,subframe : int,antenna : buffer,chest_t
+ID = UE_PHY_DL_CHANNEL_ESTIMATE_FREQ
+ DESC = UE channel estimation in the frequency domain
+ GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
+ FORMAT = int,eNB_ID : int,rsc_id : int,frame : int,subframe : int,antenna : buffer,chestF_t
ID = UE_PHY_PDCCH_IQ
DESC = UE PDCCH received IQ data
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
diff --git a/common/utils/T/tracer/extract_prs_dumps.sh b/common/utils/T/tracer/extract_prs_dumps.sh
new file mode 100755
index 0000000000..dd56940e41
--- /dev/null
+++ b/common/utils/T/tracer/extract_prs_dumps.sh
@@ -0,0 +1,54 @@
+#!/bin/bash
+: ${1?"Usage: $0 [-g num_gnb] [-n num_rsc] [-f filename] [-c count]"}
+
+# Usage info
+show_help()
+{
+echo "
+ Usage of script with arguments: [-g num_gnb] [-n num_rsc] [-f filename] [-c count]
+
+ -g num_gnb Number of active gNBs
+ -n num_rsc Number of PRS resources
+ -f filename T tracer recorded .raw filename
+ -c count Number of dump instances to be extacted
+
+ For Example: ./extract_prs_dumps.sh -g 1 -n 8 -f fr2_64_prbs.raw -c 100
+
+ -h Help
+"
+exit 0
+}
+
+while getopts g:n:f:c:h flag
+do
+ case "${flag}" in
+ g) num_gnb=${OPTARG};;
+ n) num_rsc=${OPTARG};;
+ f) file=${OPTARG};;
+ c) count=${OPTARG};;
+ h) show_help;;
+ *) exit -1;;
+ esac
+done
+echo "num_gnb: $num_gnb";
+echo "num_rsc: $num_rsc";
+echo "filename: $file";
+echo "count: $count";
+
+for (( i = 0; i < $num_gnb; i++ ))
+do
+ for (( j = 0; j < $num_rsc; j++ ))
+ do
+ name=chF_gnb${i}_${j}.raw
+ echo "Extracting $name"
+ ./extract -d ../T_messages.txt $file UE_PHY_DL_CHANNEL_ESTIMATE_FREQ chestF_t -f eNB_ID $i -f rsc_id $j -o $name -count $count
+ name=chT_gnb${i}_${j}.raw
+ echo "Extracting $name"
+ ./extract -d ../T_messages.txt $file UE_PHY_DL_CHANNEL_ESTIMATE chest_t -f eNB_ID $i -f rsc_id $j -o $name -count $count
+ done
+done
+
+# zip the extracted dumps
+name=prs_dumps.tgz
+tar cvzf $name chF_gnb* chT_gnb*
+echo "created a zip file $name"
diff --git a/common/utils/nr/nr_common.c b/common/utils/nr/nr_common.c
index 465679d002..b1d20bb444 100644
--- a/common/utils/nr/nr_common.c
+++ b/common/utils/nr/nr_common.c
@@ -664,10 +664,26 @@ void get_samplerate_and_bw(int mu,
}
} else if (mu == 3) {
switch(n_rb) {
- case 66:
+ case 132:
+ case 128:
if (threequarter_fs) {
*sample_rate=184.32e6;
*samples_per_frame = 1843200;
+ *tx_bw = 200e6;
+ *rx_bw = 200e6;
+ } else {
+ *sample_rate = 245.76e6;
+ *samples_per_frame = 2457600;
+ *tx_bw = 200e6;
+ *rx_bw = 200e6;
+ }
+ break;
+
+ case 66:
+ case 64:
+ if (threequarter_fs) {
+ *sample_rate=92.16e6;
+ *samples_per_frame = 921600;
*tx_bw = 100e6;
*rx_bw = 100e6;
} else {
@@ -676,7 +692,6 @@ void get_samplerate_and_bw(int mu,
*tx_bw = 100e6;
*rx_bw = 100e6;
}
-
break;
case 32:
@@ -691,7 +706,6 @@ void get_samplerate_and_bw(int mu,
*tx_bw = 50e6;
*rx_bw = 50e6;
}
-
break;
default:
diff --git a/doc/FEATURE_SET.md b/doc/FEATURE_SET.md
index fdd7435e9b..d660a875a7 100644
--- a/doc/FEATURE_SET.md
+++ b/doc/FEATURE_SET.md
@@ -298,6 +298,10 @@ The following features are valid for the gNB and the 5G-NR UE.
- SRS signal reception
- Channel estimation (with T tracer real time monitoring)
- Power noise estimation
+* NR-PRS
+ - Rel16 Positioning reference signal(PRS) generation and modulation
+ - Multiple PRS resources, one per beam is supported in FR2 TDD mode
+ - FR1 and FR2 support with config file
* NR-PRACH
- Formats 0,1,2,3, A1-A3, B1-B3
* Highly efficient 3GPP compliant LDPC encoder and decoder (BG1 and BG2 are supported)
@@ -459,6 +463,11 @@ The following features are valid for the gNB and the 5G-NR UE.
* NR-SRS
- Generation of sequence at PHY
- SRS signal transmission
+* NR-PRS
+ - PRS based Channel estimation with T tracer dumps
+ - Time of arrival(ToA) estimation based on channel impulse response(CIR)
+ - Finer ToA estimation by 16x oversampled IDFT for CIR
+ - Support for multiple gNB reception with gNBs synced via GPSDO
* NR-PRACH
- Formats 0,1,2,3, A1-A3, B1-B3
* SS-RSRP
diff --git a/doc/RUN_NR_PRS.md b/doc/RUN_NR_PRS.md
new file mode 100644
index 0000000000..919796742e
--- /dev/null
+++ b/doc/RUN_NR_PRS.md
@@ -0,0 +1,190 @@
+
+
+
+
+
+
+
+ |
+
+ Running NR PRS with OAI gNB and nrUE
+ |
+
+
+
+This page is valid on tags starting from **`2022.w37`**.
+
+
+After you have [built the softmodem executables](BUILD.md), go to the build directory `openairinterface5g/cmake_targets/ran_build/build/` and start testing the Rel16 PRS usecases.
+
+# PRS parameters and config files
+
+| **Mode** | **gNB config** | **nrUE config** |
+|----------------------------- |------------------------------------------------------------------------------------------- |--------------------------- |
+| **FR1 40MHz
30kHz SCS** | gnb0.sa.band78.fr1.106PRB.prs.usrpx310.conf
gnb1.sa.band78.fr1.106PRB.prs.usrpx310.conf | ue.nr.prs.fr1.106prb.conf |
+| **FR2 100MHz
120kHz SCS** | gnb0.sa.band261.fr2.64PRB.prs.usrpx310.conf
gnb1.sa.band261.fr2.64PRB.prs.usrpx310.conf | ue.nr.prs.fr2.64prb.conf |
+
+Under gNB and nrUE config files, parameters are configured under `prs_config` section. nrUE is capable to receive downlink PRS signal from multiple gNB simultaneously and therefore nrUE config file contains multiple `prs_config` sections, corresponding to each gNB. These parameters can be changed as per the test scenario.
+
+As of now, PRS **Comb size of 2 and 4** is supported and validated with R&S Spectrum analyzer. Also Muting is NOT supported yet. Sample configuration as below:
+
+```
+prs_config = (
+{
+ NumPRSResources = 1;
+ PRSResourceSetPeriod = [20, 2];
+ SymbolStart = [7];
+ NumPRSSymbols = [6];
+ NumRB = 106;
+ RBOffset = 0;
+ CombSize = 4;
+ REOffset = [0];
+ PRSResourceOffset = [0];
+ PRSResourceRepetition = 1;
+ PRSResourceTimeGap = 1;
+ NPRS_ID = [0];
+ MutingPattern1 = [];
+ MutingPattern2 = [];
+ MutingBitRepetition = 1;
+}
+);
+```
+To TURN OFF PRS, set `NumPRSResources=0` in gNB `prs_config` section. nrUE config has `Active_gNBs` to specify number of active gNBs transmitting PRS signal simultaneously. Find the help string for PRS parameters in `openair2/COMMON/prs_nr_paramdef.h`
+
+# gNB in `phy-test` mode
+Note that `numactl` is only needed if you run on a NUMA architecture with more than 1 CPU. In this case it should be installed on Linux using command `sudo apt-get install -y numactl`
+
+Also check the numa nodes USRP’s are connected to, using the following command:
+
+```cat /sys/class/net/eth_if/device/numa_node```
+
+Where `eth_if` has to be replaced with the name of the network interface the USRP is connected to.
+In our case the output is 0 and hence we use `numactl --cpunodebind=0 --membind=0`
+
+## FR1 test
+Open a terminal on the host machine, and execute below command to launch gNB with **X310 USRPs**
+
+```sudo numactl --cpunodebind=0 --membind=0 ./nr-softmodem -E -O../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb0.sa.band78.fr1.106PRB.prs.usrpx310.conf --phy-test```
+
+If **N310 USRPs** are used, then run above command `without -E option` i.e without 3/4 sampling rate.
+
+
+To run using **rfsimulator**, execute following command:
+
+```sudo RFSIMULATOR=server ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb0.sa.band78.fr1.106PRB.prs.usrpx310.conf --parallel-config PARALLEL_SINGLE_THREAD --noS1 --nokrnmod 1 --rfsim --phy-test --lowmem```
+
+## FR2 test
+In FR2 mode, we need RF beamforming module to transmit signal in mmWave frequency range. **X310 USRPs** can be used with BasicTx daughtercard to transmit baseband signal at **Intermediate Frequncy(IF)** and then RF beamforming module would perform beamforming and the upconversion to FR2 frequencies. IF can be specified using `if_freq` in the RU section of gNB config.
+
+If RF beamforming module is NOT present, gNB can still be launched with USRP alone; to transmit at supported `if_freq`.
+
+```sudo numactl --cpunodebind=0 --membind=0 ./nr-softmodem -E -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb0.sa.band261.fr2.64PRB.prs.usrpx310.conf --phy-test```
+
+
+To run using **rfsimulator**, execute following command:
+
+```sudo RFSIMULATOR=server ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb0.sa.band261.fr2.64PRB.prs.usrpx310.conf --parallel-config PARALLEL_SINGLE_THREAD --noS1 --nokrnmod 1 --rfsim --phy-test --lowmem```
+
+## Multiple gNB scenario
+PRS is primarily used for positioning and localization of the UE with multiple gNBs transmitting simultaneously. OAI PRS implementation supports multiple gNB transmission provided all the gNBs are tightely synchronized using GPSDO clock. Therefore before running this scenario, make sure the USRPs has built-in GPSDO and the GPS antennas are connected with good satellite visibility. Also every time a gNB is launched, wait until `GPS LOCKED` is printed on the terminal during gNB startup. If USRP fails to lock with GPSDO, try again until its locked.
+
+To use GPSDO, make sure to change `clock_source` and `time_source` to `gpsdo` in RU section of gNB config.
+
+```sudo numactl --cpunodebind=0 --membind=0 ./nr-softmodem -E -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb0.band78.fr1.106PRB.prs.usrpx310.conf --phy-test```
+
+```sudo numactl --cpunodebind=1 --membind=1 ./nr-softmodem -E -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb1.band78.fr1.106PRB.prs.usrpx310.conf --phy-test```
+
+
+# nrUE in `phy-test` mode
+While running gNB and nrUE on the same host machine, `reconfig.raw` and `rbconfig.raw` files would be generated with the launch of gNB and and then nrUE would automatically source it from build directory. However, if gNB and nrUE are running on two different host machines, then run gNB first with the corresponding config and exit after few seconds. This would generate `reconfig.raw` and `rbconfig.raw` files.
+
+After this, nrUE can be launched using one of the below commands depending on the test scenario. If UE is NOT able to connect to the gNB, then check the USRP connections or try increasing `--ue-rxgain` in steps of 10dB.
+
+Also check the instructions on `numactl` in gNB test section as it applies for nrUE execution as well.
+
+## FR1 test
+Once gNB is up and running, open another terminal and execute below command to launch nrUE with **X310 USRPs**. Make sure to specify `IP_ADDR1` and `IP_ADDR2`(optional) correctly as per USRPs IP address
+
+```sudo numactl --cpunodebind=0 --membind=0 ./nr-uesoftmodem -E --phy-test --usrp-args "addr=IP_ADDR1,second_addr=IP_ADDR2,time_source=internal,clock_source=internal" -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.106prb.conf --ue-rxgain 80 --ue-fo-compensation --non-stop```
+
+If **N310 USRPs** are used, then run above command `without -E option` i.e without 3/4 sampling rate.
+
+
+To run using **rfsimulator** with local ETH IF `127.0.0.1`, execute following command:
+
+```sudo RFSIMULATOR=127.0.0.1 ./nr-uesoftmodem --nokrnmod 1 --rfsim --phy-test --noS1 -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.106prb.conf```
+
+## FR2 test
+Like gNB, RF beamforming module is receiving at mmWave frequencies and then **X310 USRPs** with BasicRx daughtercard to receive the signal at intermediate frequncy(IF) from RF beamforming module. IF can be specified using `--if_freq` option in nrUE command line.
+
+If RF beamforming module is NOT present, nrUE can still be launched with USRP alone; to receive at `if_freq` and validation can be done. Make sure to specify `if_freq` in the range supported by USRP nrUE is running with.
+
+```sudo numactl --cpunodebind=0 --membind=0 ./nr-uesoftmodem -E --phy-test -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.64prb.conf --usrp-args "addr=IP_ADDR1,second_addr=IP_ADDR2,time_source=internal,clock_source=internal" --ue-rxgain 80 --ue-fo-compensation --if_freq 50000000 --non-stop```
+
+
+To run using **rfsimulator** with local ETH IF `127.0.0.1`, execute following command:
+
+```sudo RFSIMULATOR=127.0.0.1 ./nr-uesoftmodem --nokrnmod 1 --rfsim --phy-test --noS1 -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.64prb.conf```
+
+## Multiple gNB scenario
+In nrUE prs config file, change `Active_gNBs` to the actual number of gNBs launched. Also verify the parameter in `prs_config` sections of nrUE config is matching with that of gNB config used. And launch nrUE using one of the above commands depending on FR1/FR2 test scenario.
+
+After successful connection, UE starts estimating channel based on the downlink PRS pilots using Least-Squares(LS) method. In the frequency domain, linear interpolation is used to reconstruct the channel over entire PRS bandwidth using LS estimates at pilot locations. UE also measures Time of Arrival(ToA) based on the time domain impulse response. On the console, ToA measurement is printed for each PRS resource.
+
+```
+[PHY] [gNB 0][rsc 0][Rx 0][sfn 314][slot 2] DL PRS ToA ==> 1 / 1024 samples, peak channel power 15.6 dBm, SNR +4 dB
+[PHY] [gNB 0][rsc 1][Rx 0][sfn 314][slot 12] DL PRS ToA ==> 1 / 1024 samples, peak channel power 15.6 dBm, SNR +4 dB
+[PHY] [gNB 0][rsc 2][Rx 0][sfn 314][slot 22] DL PRS ToA ==> 1 / 1024 samples, peak channel power 15.6 dBm, SNR +4 dB
+[PHY] [gNB 0][rsc 3][Rx 0][sfn 314][slot 32] DL PRS ToA ==> 1 / 1024 samples, peak channel power 15.6 dBm, SNR +4 dB
+```
+
+At UE side, T tracer is used to dump PRS channel estimates, both in time and frequency domain using `UE_PHY_DL_CHANNEL_ESTIMATE` and `UE_PHY_DL_CHANNEL_ESTIMATE_FREQ` respectively. These dumps can be enabled using options `--T_stdout 0` without console prints or `--T_stdout 2` with console prints; in above nrUE launch command.
+
+# Recording T tracer dumps
+Once nrUE is launched with `--T_stdout 0 or 2` option, open another terminal. Navigate to T tracer directory ```common/utils/T/tracer/``` and build the T tracer binary using ```make```
+
+Once the build is successful, execute following command to start recording the PRS channel estimates dumps
+
+```./record -d ../T_messages.txt -on LEGACY_PHY_INFO -on UE_PHY_DL_CHANNEL_ESTIMATE -on UE_PHY_DL_CHANNEL_ESTIMATE_FREQ -o prs_dumps.raw```
+
+Exit using `Ctrl+C` to stop recording, else it will keep running and take lot of disk space. Generally running it for 1-2 minutes should collect sufficient dumps.
+
+
+To check the contents of recorded .raw file, replay it by executing:
+
+```./replay -i prs_dumps.raw```
+
+and textlog it on another terminal with following command:
+
+```./textlog -d ../T_messages.txt -ON -no-gui```
+
+# Extracting PRS channel estimates
+Once T tracer dumps are recorded, PRS channel estimates can be extracted from .raw file using bash script `extract_prs_dumps.sh` in T tracer directory ```common/utils/T/tracer/```
+
+```./extract_prs_dumps.sh -g -n -f -c ```
+
+In the end, the script will zip all the extracted dumps to `prs_dumps.tgz`. Make sure to check help in running script using -h option:
+```./extract_prs_dumps.sh -h```
+
+# Using Matlab/Octave script to visualize PRS channel estimates
+We have developed `plot_prs_Ttracer_dumps.m` script to visualize the extracted PRS dumps offline in Matlab/Octave. Location of the script is `openair1/PHY/NR_UE_ESTIMATION/plot_prs_Ttracer_dumps.m`
+
+Make sure to enter the parameters script asks as input like below:
+
+```
+Enter the directory path to T tracer dumps: '/openairinterface5g/common/utils/T/tracer'
+Enter the OFDM FFT size used for file parsing: ofdm_symbol_size>
+Enter number of PRS respurces:
+Enter number of active gNBs:
+```
+This script will read the IQ data from extracted PRS dumps(chF_gnbX_Y.raw and chT_gnbX_Y.raw) and plot them like below
+
+
+
+
+
+
+ Fig.1 - FR2 100MHz test
+ |
+
+
\ No newline at end of file
diff --git a/doc/images/PRS_CFR_FR2_64PRB_8rsc.PNG b/doc/images/PRS_CFR_FR2_64PRB_8rsc.PNG
new file mode 100644
index 0000000000..4df6443696
Binary files /dev/null and b/doc/images/PRS_CFR_FR2_64PRB_8rsc.PNG differ
diff --git a/doc/images/PRS_CIR_FR2_64PRB_8rsc.PNG b/doc/images/PRS_CIR_FR2_64PRB_8rsc.PNG
new file mode 100644
index 0000000000..fca786e0ab
Binary files /dev/null and b/doc/images/PRS_CIR_FR2_64PRB_8rsc.PNG differ
diff --git a/executables/nr-softmodem-common.h b/executables/nr-softmodem-common.h
index a83f13449f..36eedd2d3b 100644
--- a/executables/nr-softmodem-common.h
+++ b/executables/nr-softmodem-common.h
@@ -99,6 +99,8 @@
#define CONFIG_HLP_DISABLNBIOT "disable nb-iot, even if defined in config\n"
#define CONFIG_HLP_LDPC_OFFLOAD "enable LDPC offload\n"
#define CONFIG_HLP_USRP_ARGS "set the arguments to identify USRP (same syntax as in UHD)\n"
+#define CONFIG_HLP_TX_SUBDEV "set the arguments to select tx_subdev (same syntax as in UHD)\n"
+#define CONFIG_HLP_RX_SUBDEV "set the arguments to select rx_subdev (same syntax as in UHD)\n"
#define CONFIG_HLP_FLOG "Enable online log \n"
#define CONFIG_HLP_LOGL "Set the global log level, valid options: (4:trace, 3:debug, 2:info, 1:warn, (0:error))\n"
diff --git a/executables/nr-ue.c b/executables/nr-ue.c
index 08cb7de7e5..0792c6c312 100644
--- a/executables/nr-ue.c
+++ b/executables/nr-ue.c
@@ -34,6 +34,7 @@
#include "LAYER2/nr_pdcp/nr_pdcp_entity.h"
#include "SCHED_NR_UE/pucch_uci_ue_nr.h"
#include "openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h"
+#include "PHY/NR_REFSIG/refsig_defs_ue.h"
/*
* NR SLOT PROCESSING SEQUENCE
@@ -595,13 +596,13 @@ static void UE_synch(void *arg) {
UE->rfdevice.trx_set_freq_func(&UE->rfdevice,&openair0_cfg[0],0);
}
-
- break;
-
- case si:
- default:
- break;
}
+ break;
+
+ case si:
+ default:
+ break;
+
}
}
diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c
index d7703d80d4..a3a3fac12b 100644
--- a/executables/nr-uesoftmodem.c
+++ b/executables/nr-uesoftmodem.c
@@ -117,6 +117,8 @@ int vcdflag = 0;
double rx_gain_off = 0.0;
char *usrp_args = NULL;
+char *tx_subdev = NULL;
+char *rx_subdev = NULL;
char *rrc_config_path = NULL;
char *uecap_file = NULL;
int dumpframe = 0;
@@ -359,6 +361,8 @@ void init_openair0(void) {
openair0_cfg[card].configFilename = get_softmodem_params()->rf_config_file;
if (usrp_args) openair0_cfg[card].sdr_addrs = usrp_args;
+ if (tx_subdev) openair0_cfg[card].tx_subdev = tx_subdev;
+ if (rx_subdev) openair0_cfg[card].rx_subdev = rx_subdev;
}
}
diff --git a/executables/nr-uesoftmodem.h b/executables/nr-uesoftmodem.h
index e4bbae562c..f8ce6c1f27 100644
--- a/executables/nr-uesoftmodem.h
+++ b/executables/nr-uesoftmodem.h
@@ -30,6 +30,8 @@
/*------------------------------------------------------------------------------------------------------------------------------------------*/
#define CMDLINE_NRUEPARAMS_DESC { \
{"usrp-args", CONFIG_HLP_USRP_ARGS, 0, strptr:&usrp_args, defstrval:"type=b200", TYPE_STRING, 0}, \
+ {"tx_subdev", CONFIG_HLP_TX_SUBDEV, 0, strptr:&tx_subdev, defstrval:NULL, TYPE_STRING, 0}, \
+ {"rx_subdev", CONFIG_HLP_RX_SUBDEV, 0, strptr:&rx_subdev, defstrval:NULL, TYPE_STRING, 0}, \
{"single-thread-disable", CONFIG_HLP_NOSNGLT, PARAMFLAG_BOOL, iptr:&single_thread_flag, defintval:1, TYPE_INT, 0}, \
{"dlsch-parallel", CONFIG_HLP_DLSCH_PARA, 0, u8ptr:NULL, defintval:0, TYPE_UINT8, 0}, \
{"offset-divisor", CONFIG_HLP_OFFSET_DIV, 0, uptr:&nrUE_params.ofdm_offset_divisor, defuintval:8, TYPE_UINT32, 0}, \
@@ -97,5 +99,4 @@ extern void start_oai_nrue_threads(void);
void *UE_thread(void *arg);
void init_nr_ue_vars(PHY_VARS_NR_UE *ue, uint8_t UE_id, uint8_t abstraction_flag);
void init_nrUE_standalone_thread(int ue_idx);
-
#endif
diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c
index 55599b7cc3..dd06bc4704 100644
--- a/openair1/PHY/INIT/nr_init.c
+++ b/openair1/PHY/INIT/nr_init.c
@@ -615,6 +615,9 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
gNB->nr_csi_info->csi_gold_init = cfg->cell_config.phy_cell_id.value;
nr_init_csi_rs(&gNB->frame_parms, gNB->nr_csi_info->nr_gold_csi_rs, cfg->cell_config.phy_cell_id.value);
+ //PRS init
+ nr_init_prs(gNB);
+
for (int id=0; idnr_srs_info[id] = (nr_srs_info_t *)malloc16_clear(sizeof(nr_srs_info_t));
gNB->nr_srs_info[id]->srs_generated_signal = (int32_t**)malloc16_clear(MAX_NUM_NR_SRS_AP*sizeof(int32_t*));
@@ -793,6 +796,17 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
free_and_zero(common_vars->beam_id[i]);
}
+ for (int rsc=0; rsc < gNB->prs_vars.NumPRSResources; rsc++) {
+ for (int slot=0; slotslots_per_frame; slot++) {
+ for (int symb=0; symbsymbols_per_slot; symb++) {
+ free_and_zero(gNB->nr_gold_prs[rsc][slot][symb]);
+ }
+ free_and_zero(gNB->nr_gold_prs[rsc][slot]);
+ }
+ free_and_zero(gNB->nr_gold_prs[rsc]);
+ }
+ free_and_zero(gNB->nr_gold_prs);
+
/* Do NOT free per-antenna txdataF/rxdataF: the gNB gets a pointer to the
* RU's txdataF/rxdataF, and the RU will free that */
free_and_zero(common_vars->txdataF);
diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c
index 64bbed571c..2f1c665e0b 100644
--- a/openair1/PHY/INIT/nr_init_ue.c
+++ b/openair1/PHY/INIT/nr_init_ue.c
@@ -33,6 +33,7 @@
#include "PHY/NR_REFSIG/refsig_defs_ue.h"
#include "PHY/NR_REFSIG/nr_refsig.h"
#include "PHY/MODULATION/nr_modulation.h"
+#include "openair2/COMMON/prs_nr_paramdef.h"
extern uint16_t beta_cqi[16];
@@ -135,6 +136,164 @@ void phy_term_nr_ue__PDSCH(NR_UE_PDSCH* pdsch, const NR_DL_FRAME_PARMS *const fp
free_and_zero(pdsch->ptrs_re_per_slot);
}
+void RCconfig_nrUE_prs(void *cfg)
+{
+ int j = 0, k = 0, gNB_id = 0;
+ char aprefix[MAX_OPTNAME_SIZE*2 + 8];
+ char str[7][100] = {'\0'}; int16_t n[7] = {0};
+ PHY_VARS_NR_UE *ue = (PHY_VARS_NR_UE *)cfg;
+ prs_config_t *prs_config = NULL;
+
+ paramlist_def_t gParamList = {CONFIG_STRING_PRS_LIST,NULL,0};
+ paramdef_t gParams[] = PRS_GLOBAL_PARAMS_DESC;
+ config_getlist( &gParamList,gParams,sizeof(gParams)/sizeof(paramdef_t), NULL);
+ if (gParamList.numelt > 0)
+ {
+ ue->prs_active_gNBs = *(gParamList.paramarray[j][PRS_ACTIVE_GNBS_IDX].uptr);
+ }
+ else
+ {
+ LOG_E(PHY,"%s configuration NOT found..!! Skipped configuring UE for the PRS reception\n", CONFIG_STRING_PRS_CONFIG);
+ }
+
+ paramlist_def_t PRS_ParamList = {{0},NULL,0};
+ for(int i = 0; i < ue->prs_active_gNBs; i++)
+ {
+ paramdef_t PRS_Params[] = PRS_PARAMS_DESC;
+ sprintf(PRS_ParamList.listname, "%s%i", CONFIG_STRING_PRS_CONFIG, i);
+
+ sprintf(aprefix, "%s.[%i]", CONFIG_STRING_PRS_LIST, 0);
+ config_getlist( &PRS_ParamList,PRS_Params,sizeof(PRS_Params)/sizeof(paramdef_t), aprefix);
+
+ if (PRS_ParamList.numelt > 0) {
+ for (j = 0; j < PRS_ParamList.numelt; j++) {
+ gNB_id = *(PRS_ParamList.paramarray[j][PRS_GNB_ID].uptr);
+ if(gNB_id != i) gNB_id = i; // force gNB_id to avoid mismatch
+
+ memset(n,0,sizeof(n));
+ ue->prs_vars[gNB_id]->NumPRSResources = *(PRS_ParamList.paramarray[j][NUM_PRS_RESOURCES].uptr);
+ for (k = 0; k < ue->prs_vars[gNB_id]->NumPRSResources; k++)
+ {
+ prs_config = &ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg;
+ prs_config->PRSResourceSetPeriod[0] = PRS_ParamList.paramarray[j][PRS_RESOURCE_SET_PERIOD_LIST].uptr[0];
+ prs_config->PRSResourceSetPeriod[1] = PRS_ParamList.paramarray[j][PRS_RESOURCE_SET_PERIOD_LIST].uptr[1];
+ // per PRS resources parameters
+ prs_config->SymbolStart = PRS_ParamList.paramarray[j][PRS_SYMBOL_START_LIST].uptr[k];
+ prs_config->NumPRSSymbols = PRS_ParamList.paramarray[j][PRS_NUM_SYMBOLS_LIST].uptr[k];
+ prs_config->REOffset = PRS_ParamList.paramarray[j][PRS_RE_OFFSET_LIST].uptr[k];
+ prs_config->NPRSID = PRS_ParamList.paramarray[j][PRS_ID_LIST].uptr[k];
+ prs_config->PRSResourceOffset = PRS_ParamList.paramarray[j][PRS_RESOURCE_OFFSET_LIST].uptr[k];
+ // Common parameters to all PRS resources
+ prs_config->NumRB = *(PRS_ParamList.paramarray[j][PRS_NUM_RB].uptr);
+ prs_config->RBOffset = *(PRS_ParamList.paramarray[j][PRS_RB_OFFSET].uptr);
+ prs_config->CombSize = *(PRS_ParamList.paramarray[j][PRS_COMB_SIZE].uptr);
+ prs_config->PRSResourceRepetition = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_REPETITION].uptr);
+ prs_config->PRSResourceTimeGap = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_TIME_GAP].uptr);
+
+ prs_config->MutingBitRepetition = *(PRS_ParamList.paramarray[j][PRS_MUTING_BIT_REPETITION].uptr);
+ for (int l = 0; l < PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN1_LIST].numelt; l++)
+ {
+ prs_config->MutingPattern1[l] = PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN1_LIST].uptr[l];
+ if (k == 0) // print only for 0th resource
+ n[5] += snprintf(str[5]+n[5],sizeof(str[5]),"%d, ",prs_config->MutingPattern1[l]);
+ }
+ for (int l = 0; l < PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN2_LIST].numelt; l++)
+ {
+ prs_config->MutingPattern2[l] = PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN2_LIST].uptr[l];
+ if (k == 0) // print only for 0th resource
+ n[6] += snprintf(str[6]+n[6],sizeof(str[6]),"%d, ",prs_config->MutingPattern2[l]);
+ }
+
+ // print to buffer
+ n[0] += snprintf(str[0]+n[0],sizeof(str[0]),"%d, ",prs_config->SymbolStart);
+ n[1] += snprintf(str[1]+n[1],sizeof(str[1]),"%d, ",prs_config->NumPRSSymbols);
+ n[2] += snprintf(str[2]+n[2],sizeof(str[2]),"%d, ",prs_config->REOffset);
+ n[3] += snprintf(str[3]+n[3],sizeof(str[3]),"%d, ",prs_config->PRSResourceOffset);
+ n[4] += snprintf(str[4]+n[4],sizeof(str[4]),"%d, ",prs_config->NPRSID);
+ } // for k
+
+ prs_config = &ue->prs_vars[gNB_id]->prs_resource[0].prs_cfg;
+ LOG_I(PHY, "-----------------------------------------\n");
+ LOG_I(PHY, "PRS Config for gNB_id %d @ %p\n", gNB_id, prs_config);
+ LOG_I(PHY, "-----------------------------------------\n");
+ LOG_I(PHY, "NumPRSResources \t%d\n", ue->prs_vars[gNB_id]->NumPRSResources);
+ LOG_I(PHY, "PRSResourceSetPeriod \t[%d, %d]\n", prs_config->PRSResourceSetPeriod[0], prs_config->PRSResourceSetPeriod[1]);
+ LOG_I(PHY, "NumRB \t\t\t%d\n", prs_config->NumRB);
+ LOG_I(PHY, "RBOffset \t\t%d\n", prs_config->RBOffset);
+ LOG_I(PHY, "CombSize \t\t%d\n", prs_config->CombSize);
+ LOG_I(PHY, "PRSResourceRepetition \t%d\n", prs_config->PRSResourceRepetition);
+ LOG_I(PHY, "PRSResourceTimeGap \t%d\n", prs_config->PRSResourceTimeGap);
+ LOG_I(PHY, "MutingBitRepetition \t%d\n", prs_config->MutingBitRepetition);
+ LOG_I(PHY, "SymbolStart \t\t[%s\b\b]\n", str[0]);
+ LOG_I(PHY, "NumPRSSymbols \t\t[%s\b\b]\n", str[1]);
+ LOG_I(PHY, "REOffset \t\t[%s\b\b]\n", str[2]);
+ LOG_I(PHY, "PRSResourceOffset \t[%s\b\b]\n", str[3]);
+ LOG_I(PHY, "NPRS_ID \t\t[%s\b\b]\n", str[4]);
+ LOG_I(PHY, "MutingPattern1 \t\t[%s\b\b]\n", str[5]);
+ LOG_I(PHY, "MutingPattern2 \t\t[%s\b\b]\n", str[6]);
+ LOG_I(PHY, "-----------------------------------------\n");
+ }
+ }
+ else
+ {
+ LOG_E(PHY,"No %s configuration found..!!\n", PRS_ParamList.listname);
+ }
+ }
+}
+
+void init_nr_prs_ue_vars(PHY_VARS_NR_UE *ue)
+{
+ NR_UE_PRS **const prs_vars = ue->prs_vars;
+ NR_DL_FRAME_PARMS *const fp = &ue->frame_parms;
+
+ // PRS vars init
+ for(int idx = 0; idx < NR_MAX_PRS_COMB_SIZE; idx++)
+ {
+ prs_vars[idx] = (NR_UE_PRS *)malloc16_clear(sizeof(NR_UE_PRS));
+ // PRS channel estimates
+
+ for(int k = 0; k < NR_MAX_PRS_RESOURCES_PER_SET; k++)
+ {
+ prs_vars[idx]->prs_resource[k].prs_meas = (prs_meas_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(prs_meas_t *) );
+ AssertFatal((prs_vars[idx]->prs_resource[k].prs_meas!=NULL), "%s: PRS measurements malloc failed for gNB_id %d\n", __FUNCTION__, idx);
+
+ for (int j=0; jnb_antennas_rx; j++) {
+ prs_vars[idx]->prs_resource[k].prs_meas[j] = (prs_meas_t *)malloc16_clear(sizeof(prs_meas_t) );
+ AssertFatal((prs_vars[idx]->prs_resource[k].prs_meas[j]!=NULL), "%s: PRS measurements malloc failed for gNB_id %d, rx_ant %d\n", __FUNCTION__, idx, j);
+ }
+ }
+ }
+
+ // load the config file params
+ RCconfig_nrUE_prs(ue);
+
+ //PRS sequence init
+ ue->nr_gold_prs = (uint32_t *****)malloc16(ue->prs_active_gNBs*sizeof(uint32_t ****));
+ uint32_t *****prs = ue->nr_gold_prs;
+ AssertFatal(prs!=NULL, "%s: positioning reference signal malloc failed\n", __FUNCTION__);
+ for (int gnb = 0; gnb < ue->prs_active_gNBs; gnb++) {
+ prs[gnb] = (uint32_t ****)malloc16(ue->prs_vars[gnb]->NumPRSResources*sizeof(uint32_t ***));
+ AssertFatal(prs[gnb]!=NULL, "%s: positioning reference signal for gnb %d - malloc failed\n", __FUNCTION__, gnb);
+
+ for (int rsc = 0; rsc < ue->prs_vars[gnb]->NumPRSResources; rsc++) {
+ prs[gnb][rsc] = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t **));
+ AssertFatal(prs[gnb][rsc]!=NULL, "%s: positioning reference signal for gnb %d rsc %d- malloc failed\n", __FUNCTION__, gnb, rsc);
+
+ for (int slot=0; slotslots_per_frame; slot++) {
+ prs[gnb][rsc][slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *));
+ AssertFatal(prs[gnb][rsc][slot]!=NULL, "%s: positioning reference signal for gnb %d rsc %d slot %d - malloc failed\n", __FUNCTION__, gnb, rsc, slot);
+
+ for (int symb=0; symbsymbols_per_slot; symb++) {
+ prs[gnb][rsc][slot][symb] = (uint32_t *)malloc16(NR_MAX_PRS_INIT_LENGTH_DWORD*sizeof(uint32_t));
+ AssertFatal(prs[gnb][rsc][slot][symb]!=NULL, "%s: positioning reference signal for gnb %d rsc %d slot %d symbol %d - malloc failed\n", __FUNCTION__, gnb, rsc, slot, symb);
+ } // for symb
+ } // for slot
+ } // for rsc
+ } // for gnb
+
+ init_nr_gold_prs(ue);
+}
+
int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
{
// create shortcuts
@@ -193,6 +352,14 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
///////////
////////////////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////// PRS init /////////////////////////
+ ///////////
+
+ init_nr_prs_ue_vars(ue);
+
+ ///////////
+ ////////////////////////////////////////////////////////////////////////////////////////////
+
/////////////////////////PUSCH DMRS init/////////////////////////
///////////
@@ -482,6 +649,37 @@ void term_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
free_and_zero(ue->prach_vars[gNB_id]);
}
+ for (int gnb = 0; gnb < ue->prs_active_gNBs; gnb++)
+ {
+ for (int rsc = 0; rsc < ue->prs_vars[gnb]->NumPRSResources; rsc++)
+ {
+ for (int slot=0; slotslots_per_frame; slot++)
+ {
+ for (int symb=0; symbsymbols_per_slot; symb++)
+ {
+ free_and_zero(ue->nr_gold_prs[gnb][rsc][slot][symb]);
+ }
+ free_and_zero(ue->nr_gold_prs[gnb][rsc][slot]);
+ }
+ free_and_zero(ue->nr_gold_prs[gnb][rsc]);
+ }
+ free_and_zero(ue->nr_gold_prs[gnb]);
+ }
+ free_and_zero(ue->nr_gold_prs);
+
+ for(int idx = 0; idx < NR_MAX_PRS_COMB_SIZE; idx++)
+ {
+ for(int k = 0; k < NR_MAX_PRS_RESOURCES_PER_SET; k++)
+ {
+ for (int j=0; jnb_antennas_rx; j++)
+ {
+ free_and_zero(ue->prs_vars[idx]->prs_resource[k].prs_meas[j]);
+ }
+ free_and_zero(ue->prs_vars[idx]->prs_resource[k].prs_meas);
+ }
+
+ free_and_zero(ue->prs_vars[idx]);
+ }
free_and_zero(ue->sinr_CQI_dB);
}
diff --git a/openair1/PHY/INIT/nr_parms.c b/openair1/PHY/INIT/nr_parms.c
index 458c8b3403..aef01413ee 100644
--- a/openair1/PHY/INIT/nr_parms.c
+++ b/openair1/PHY/INIT/nr_parms.c
@@ -212,12 +212,12 @@ uint32_t get_samples_per_slot(int slot, NR_DL_FRAME_PARMS* fp)
uint32_t get_slot_from_timestamp(openair0_timestamp timestamp_rx, NR_DL_FRAME_PARMS* fp)
{
uint32_t slot_idx = 0;
- int samples_till_the_slot = 0;
+ int samples_till_the_slot = fp->get_samples_per_slot(slot_idx,fp)-1;
timestamp_rx = timestamp_rx%fp->samples_per_frame;
while (timestamp_rx > samples_till_the_slot) {
- samples_till_the_slot += fp->get_samples_per_slot(slot_idx,fp);
slot_idx++;
+ samples_till_the_slot += fp->get_samples_per_slot(slot_idx,fp);
}
return slot_idx;
}
diff --git a/openair1/PHY/INIT/phy_init.h b/openair1/PHY/INIT/phy_init.h
index 29940a4fbe..2b11371de8 100644
--- a/openair1/PHY/INIT/phy_init.h
+++ b/openair1/PHY/INIT/phy_init.h
@@ -416,6 +416,9 @@ void fill_subframe_mask(PHY_VARS_eNB *eNB);
void init_DLSCH_struct(PHY_VARS_gNB *gNB, processingData_L1tx_t *msg);
void reset_DLSCH_struct(const PHY_VARS_gNB *gNB, processingData_L1tx_t *msg);
+void RCconfig_nrUE_prs(void *cfg);
+void init_nr_prs_ue_vars(PHY_VARS_NR_UE *ue);
+
/** @} */
#endif
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c
index d221348b44..fc77d4ae18 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c
@@ -701,7 +701,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *ue,
}
}
- T(T_UE_PHY_DL_CHANNEL_ESTIMATE, T_INT(eNB_id),
+ T(T_UE_PHY_DL_CHANNEL_ESTIMATE, T_INT(eNB_id), T_INT(0),
T_INT(ue->proc.proc_rxtx[ue->current_thread_id[Ns>>1]].frame_rx%1024), T_INT(ue->proc.proc_rxtx[ue->current_thread_id[Ns>>1]].subframe_rx),
T_INT(0), T_BUFFER(&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates_time[eNB_offset][0][0], 512 * 4));
return(0);
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c
index b21f526fcc..80238a58ff 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c
@@ -131,14 +131,6 @@ void lte_sync_time_free(void) {
}
-static inline int abs32(int x) {
- return (((int)((short*)&x)[0])*((int)((short*)&x)[0]) + ((int)((short*)&x)[1])*((int)((short*)&x)[1]));
-}
-
-static inline double absF(struct complexd x) {
- return x.r*x.r+x.i*x.i;
-}
-
#define complexNull(c) bzero((void*) &(c), sizeof(c))
#define SHIFT 17
@@ -196,16 +188,12 @@ int lte_sync_time(int **rxdata, ///rx data in time domain
// calculate the absolute value of sync_corr[n]
for (s=0; s<3; s++) {
- double tmp = absF(sync_out[s]) + absF(sync_out2[s]);
+ double tmp = squaredMod(sync_out[s]) + squaredMod(sync_out2[s]);
if (tmp>peak_val) {
peak_val = tmp;
peak_pos = n;
sync_source = s;
- /*
- printf("s %d: n %d sync_out %d, sync_out2 %d (sync_corr %d,%d), (%d,%d) (%d,%d)\n",s,n,abs32(sync_out[s]),abs32(sync_out2[s]),sync_corr_ue0[n],
- sync_corr_ue0[n+length],((int16_t*)&sync_out[s])[0],((int16_t*)&sync_out[s])[1],((int16_t*)&sync_out2[s])[0],((int16_t*)&sync_out2[s])[1]);
- */
}
}
}
@@ -337,7 +325,7 @@ int lte_sync_time_eNB(int32_t **rxdata, ///rx data in time domain
result = dot_product((short *)primary_synch_time, (short *) &(rxdata[ar][n]), frame_parms->ofdm_symbol_size, SHIFT);
//((short*)sync_corr)[2*n] += ((short*) &result)[0];
//((short*)sync_corr)[2*n+1] += ((short*) &result)[1];
- sync_corr_eNB[n] += abs32(result);
+ sync_corr_eNB[n] += squaredMod(*(c16_t*)&result);
}
}
@@ -368,12 +356,6 @@ int lte_sync_time_eNB(int32_t **rxdata, ///rx data in time domain
}
-static inline int64_t abs64(int64_t x) {
- return (((int64_t)((int32_t *)&x)[0])*((int64_t)((int32_t *)&x)[0]) + ((int64_t)
- ((int32_t *)&x)[1])*((int64_t)((int32_t *)&x)[1]));
-}
-
-
int ru_sync_time(RU_t *ru,
int64_t *lev,
int64_t *avg) {
@@ -426,7 +408,7 @@ int ru_sync_time(RU_t *ru,
shift);
}
- dmrs_corr += abs64(result);
+ dmrs_corr += squaredMod(*(c32_t*)&result);
}
if (ru->dmrs_corr != NULL)
diff --git a/openair1/PHY/MODULATION/ofdm_mod.c b/openair1/PHY/MODULATION/ofdm_mod.c
index 0f79c4532b..00be2bc59b 100644
--- a/openair1/PHY/MODULATION/ofdm_mod.c
+++ b/openair1/PHY/MODULATION/ofdm_mod.c
@@ -153,6 +153,10 @@ void PHY_ofdm_mod(int *input, /// pointer to complex input
idftsize = IDFT_512;
break;
+ case 768:
+ idftsize = IDFT_768;
+ break;
+
case 1024:
idftsize = IDFT_1024;
break;
diff --git a/openair1/PHY/NR_REFSIG/nr_gold.c b/openair1/PHY/NR_REFSIG/nr_gold.c
index 9b4cc50953..134b44fc41 100644
--- a/openair1/PHY/NR_REFSIG/nr_gold.c
+++ b/openair1/PHY/NR_REFSIG/nr_gold.c
@@ -123,3 +123,56 @@ void nr_gold_pusch(PHY_VARS_gNB* gNB, int nscid, uint32_t nid) {
}
}
}
+
+
+void nr_init_prs(PHY_VARS_gNB* gNB)
+{
+ unsigned int x1, x2;
+ uint16_t Nid;
+
+ NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
+ gNB->nr_gold_prs = (uint32_t ****)malloc16(gNB->prs_vars.NumPRSResources*sizeof(uint32_t ***));
+ uint32_t ****prs = gNB->nr_gold_prs;
+ AssertFatal(prs!=NULL, "NR init: positioning reference signal malloc failed\n");
+ for (int rsc=0; rsc < gNB->prs_vars.NumPRSResources; rsc++) {
+ prs[rsc] = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t **));
+ AssertFatal(prs[rsc]!=NULL, "NR init: positioning reference signal for rsc %d - malloc failed\n", rsc);
+
+ for (int slot=0; slotslots_per_frame; slot++) {
+ prs[rsc][slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *));
+ AssertFatal(prs[rsc][slot]!=NULL, "NR init: positioning reference signal for slot %d - malloc failed\n", slot);
+
+ for (int symb=0; symbsymbols_per_slot; symb++) {
+ prs[rsc][slot][symb] = (uint32_t *)malloc16(NR_MAX_PRS_INIT_LENGTH_DWORD*sizeof(uint32_t));
+ AssertFatal(prs[rsc][slot][symb]!=NULL, "NR init: positioning reference signal for rsc %d slot %d symbol %d - malloc failed\n", rsc, slot, symb);
+ }
+ }
+ }
+
+ uint8_t reset;
+ uint8_t slotNum, symNum, rsc_id;
+
+ for (rsc_id = 0; rsc_id < gNB->prs_vars.NumPRSResources; rsc_id++) {
+ Nid = gNB->prs_vars.prs_cfg[rsc_id].NPRSID; // seed value
+ LOG_I(PHY, "Initiaized NR-PRS sequence with PRS_ID %3d for resource %d\n", Nid, rsc_id);
+ for (slotNum = 0; slotNum < fp->slots_per_frame; slotNum++) {
+ for (symNum = 0; symNum < fp->symbols_per_slot ; symNum++) {
+ reset = 1;
+ // initial x2 for prs as ts138.211
+ uint32_t c_init1, c_init2, c_init3;
+ uint32_t pow22=1<<22;
+ uint32_t pow10=1<<10;
+ c_init1 = pow22*ceil(Nid/1024);
+ c_init2 = pow10*(slotNum+symNum+1)*(2*(Nid%1024)+1);
+ c_init3 = Nid%1024;
+ x2 = c_init1 + c_init2 + c_init3;
+
+ for (uint8_t n=0; nnr_gold_prs[rsc_id][slotNum][symNum][n] = lte_gold_generic(&x1, &x2, reset);
+ reset = 0;
+ //printf("%d \n",gNB->nr_gold_prs[slotNum][symNum][n]);
+ }
+ }
+ }
+ }
+}
diff --git a/openair1/PHY/NR_REFSIG/nr_gold_ue.c b/openair1/PHY/NR_REFSIG/nr_gold_ue.c
index 203d6c8625..4f3a7d76f0 100644
--- a/openair1/PHY/NR_REFSIG/nr_gold_ue.c
+++ b/openair1/PHY/NR_REFSIG/nr_gold_ue.c
@@ -124,3 +124,40 @@ void nr_init_pusch_dmrs(PHY_VARS_NR_UE* ue,
}
}
}
+
+void init_nr_gold_prs(PHY_VARS_NR_UE* ue)
+{
+ unsigned int x1, x2;
+ uint16_t Nid;
+
+ NR_DL_FRAME_PARMS *fp = &ue->frame_parms;
+ uint8_t reset;
+ uint8_t slotNum, symNum, gnb, rsc;
+
+ for(gnb = 0; gnb < ue->prs_active_gNBs; gnb++) {
+ for(rsc = 0; rsc < ue->prs_vars[gnb]->NumPRSResources; rsc++) {
+ Nid = ue->prs_vars[gnb]->prs_resource[rsc].prs_cfg.NPRSID; // seed value
+ LOG_I(PHY,"Initialised NR-PRS sequence with PRS_ID %3d for resource %d\n",Nid, rsc);
+ for (slotNum = 0; slotNum < fp->slots_per_frame; slotNum++) {
+ for (symNum = 0; symNum < fp->symbols_per_slot ; symNum++) {
+ reset = 1;
+ // initial x2 for prs as ts138.211
+ uint32_t c_init1, c_init2, c_init3;
+ uint32_t pow22=1<<22;
+ uint32_t pow10=1<<10;
+ c_init1 = pow22*ceil(Nid/1024);
+ c_init2 = pow10*(slotNum+symNum+1)*(2*(Nid%1024)+1);
+ c_init3 = Nid%1024;
+ x2 = c_init1 + c_init2 + c_init3;
+
+ for (uint8_t n=0; nnr_gold_prs[gnb][rsc][slotNum][symNum][n] = lte_gold_generic(&x1, &x2, reset);
+ reset = 0;
+ //printf("%d \n",gNB->nr_gold_prs[slotNum][symNum][n]);
+
+ }
+ }
+ }
+ } // for rsc
+ } // for gnb
+}
diff --git a/openair1/PHY/NR_REFSIG/nr_refsig.h b/openair1/PHY/NR_REFSIG/nr_refsig.h
index 110ff321bd..fd89f122ce 100644
--- a/openair1/PHY/NR_REFSIG/nr_refsig.h
+++ b/openair1/PHY/NR_REFSIG/nr_refsig.h
@@ -32,6 +32,13 @@
@param PHY_VARS_gNB* gNB structure provides configuration, frame parameters and the pointers to the 32 bits sequence storage tables
*/
void nr_init_pbch_dmrs(PHY_VARS_gNB* gNB);
+
+/*
+This function generates NR Gold Sequence(ts 138.211) for the PRS.
+@param PHY_VARS_gNB* gNB structure provides configuration, frame parameters and the pointers to the 32 bits sequence storage tables
+*/
+void nr_init_prs(PHY_VARS_gNB* gNB);
+
/*!\brief This function generates the NR Gold sequence (38-211, Sec 5.2.1) for the PDCCH DMRS.
@param PHY_VARS_gNB* gNB structure provides configuration, frame parameters and the pointers to the 32 bits sequence storage tables
@param Nid is used for the initialization of x2, Physical cell Id by default or upper layer configured pdcch_scrambling_ID
diff --git a/openair1/PHY/NR_REFSIG/refsig_defs_ue.h b/openair1/PHY/NR_REFSIG/refsig_defs_ue.h
index 5145b113c1..bdd1f50069 100644
--- a/openair1/PHY/NR_REFSIG/refsig_defs_ue.h
+++ b/openair1/PHY/NR_REFSIG/refsig_defs_ue.h
@@ -68,5 +68,6 @@ void nr_init_pusch_dmrs(PHY_VARS_NR_UE* ue,
uint8_t n_scid);
void nr_init_csi_rs(const NR_DL_FRAME_PARMS *fp, uint32_t ***csi_rs, uint32_t Nid);
+void init_nr_gold_prs(PHY_VARS_NR_UE* ue);
#endif
diff --git a/openair1/PHY/NR_TRANSPORT/nr_prs.c b/openair1/PHY/NR_TRANSPORT/nr_prs.c
new file mode 100644
index 0000000000..2167990abf
--- /dev/null
+++ b/openair1/PHY/NR_TRANSPORT/nr_prs.c
@@ -0,0 +1,77 @@
+#include "PHY/defs_gNB.h"
+#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
+#include "PHY/LTE_REFSIG/lte_refsig.h"
+#include "PHY/NR_REFSIG/nr_refsig.h"
+#include "PHY/sse_intrin.h"
+
+//#define DEBUG_PRS_MOD
+//#define DEBUG_PRS_MAP
+
+extern short nr_qpsk_mod_table[8];
+
+int nr_generate_prs(uint32_t **nr_gold_prs,
+ int32_t *txdataF,
+ int16_t amp,
+ prs_config_t *prs_cfg,
+ nfapi_nr_config_request_scf_t *config,
+ NR_DL_FRAME_PARMS *frame_parms)
+{
+
+ int k_prime = 0, k = 0, idx;
+ int16_t mod_prs[NR_MAX_PRS_LENGTH<<1];
+ int16_t k_prime_table[K_PRIME_TABLE_ROW_SIZE][K_PRIME_TABLE_COL_SIZE] = PRS_K_PRIME_TABLE;
+
+ // PRS resource mapping with combsize=k which means PRS symbols exist in every k-th subcarrier in frequency domain
+ // According to ts138.211 sec.7.4.1.7.2
+ for (int l = prs_cfg->SymbolStart; l < prs_cfg->SymbolStart + prs_cfg->NumPRSSymbols; l++) {
+
+ int symInd = l-prs_cfg->SymbolStart;
+ if (prs_cfg->CombSize == 2) {
+ k_prime = k_prime_table[0][symInd];
+ }
+ else if (prs_cfg->CombSize == 4){
+ k_prime = k_prime_table[1][symInd];
+ }
+ else if (prs_cfg->CombSize == 6){
+ k_prime = k_prime_table[2][symInd];
+ }
+ else if (prs_cfg->CombSize == 12){
+ k_prime = k_prime_table[3][symInd];
+ }
+
+ k = (prs_cfg->REOffset+k_prime) % prs_cfg->CombSize + prs_cfg->RBOffset*12 + frame_parms->first_carrier_offset;
+
+ // QPSK modulation
+ for (int m = 0; m < (12/prs_cfg->CombSize) * prs_cfg->NumRB; m++) {
+ idx = (((nr_gold_prs[l][(m<<1)>>5])>>((m<<1)&0x1f))&3);
+ mod_prs[m<<1] = nr_qpsk_mod_table[idx<<1];
+ mod_prs[(m<<1)+1] = nr_qpsk_mod_table[(idx<<1) + 1];
+
+#ifdef DEBUG_PRS_MOD
+ LOG_D("m %d idx %d gold seq %d mod_prs %d %d\n", m, idx, nr_gold_prs[l][(m<<1)>>5], mod_prs[m<<1], mod_prs[(m<<1)+1]);
+#endif
+
+#ifdef DEBUG_PRS_MAP
+ LOG_D("m %d at k %d of l %d reIdx %d\n", m, k, l, (l*frame_parms->ofdm_symbol_size + k)<<1);
+#endif
+
+ ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_prs[m<<1]) >> 15;
+ ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_prs[(m<<1) + 1]) >> 15;
+
+#ifdef DEBUG_PRS_MAP
+ LOG_D("(%d,%d)\n",
+ ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1],
+ ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1)+1]);
+#endif
+
+ k = k + prs_cfg->CombSize;
+
+ if (k >= frame_parms->ofdm_symbol_size)
+ k-=frame_parms->ofdm_symbol_size;
+ }
+ }
+#ifdef DEBUG_PRS_MAP
+ LOG_M("nr_prs.m", "prs",(int16_t *)&txdataF[prs_cfg->SymbolStart*frame_parms->ofdm_symbol_size],prs_cfg->NumPRSSymbols*frame_parms->ofdm_symbol_size, 1, 1);
+#endif
+ return 0;
+}
diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h
index e5b043c395..ec65ee4a00 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h
@@ -38,6 +38,14 @@
#define NR_PBCH_PDU_BITS 24
+
+int nr_generate_prs(uint32_t **nr_gold_prs,
+ int32_t *txdataF,
+ int16_t amp,
+ prs_config_t *prs_cfg,
+ nfapi_nr_config_request_scf_t *config,
+ NR_DL_FRAME_PARMS *frame_parms);
+
/*!
\fn int nr_generate_pss
\brief Generation of the NR PSS
diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
index 809cc4dd3b..0fde06b0cb 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
@@ -23,6 +23,9 @@
short filt16a_l0[16] = {
16384,12288,8192,4096,0,0,0,0,0,0,0,0,0,0,0,0};
+short filt16a_mm0[16] = {
+0,4096,8192,12288,16384,12288,8192,4096,0,0,0,0,0,0,0,0};
+
short filt16a_r0[16] = {
0,0,0,0,0,4096,8192,12288,16384,20480,24576,28672,0,0,0,0};
@@ -32,6 +35,15 @@ short filt16a_m0[16] = {
short filt16a_l1[16] = {
20480,16384,12288,8192,4096,0,0,0,0,0,0,0,0,0,0,0};
+short filt16a_mm1[16] = {
+0,0,4096,8192,12288,16384,12288,8192,4096,0,0,0,0,0,0,0};
+
+short filt16a_ml1[16] = {
+-4096,0,4096,8192,12288,16384,12288,8192,4096,0,0,0,0,0,0,0};
+
+short filt16a_mr1[16] = {
+0,0,4096,8192,12288,16384,12288,8192,4096,0,-4096,-8192,0,0,0,0};
+
short filt16a_r1[16] = {
0,0,0,0,0,0,4096,8192,12288,16384,20480,24576,0,0,0,0};
@@ -41,6 +53,15 @@ short filt16a_m1[16] = {
short filt16a_l2[16] = {
24576,20480,16384,12288,8192,4096,0,0,0,0,0,0,0,0,0,0};
+short filt16a_mm2[16] = {
+0,0,0,4096,8192,12288,16384,12288,8192,4096,0,0,0,0,0,0};
+
+short filt16a_ml2[16] = {
+-8192,-4096,0,4096,8192,12288,16384,12288,8192,4096,0,0,0,0,0,0};
+
+short filt16a_mr2[16] = {
+0,0,0,4096,8192,12288,16384,12288,8192,4096,0,-4096,0,0,0,0};
+
short filt16a_r2[16] = {
0,0,0,0,0,0,0,4096,8192,12288,16384,20480,0,0,0,0};
@@ -50,6 +71,12 @@ short filt16a_m2[16] = {
short filt16a_l3[16] = {
28672,24576,20480,16384,12288,8192,4096,0,0,0,0,0,0,0,0,0};
+short filt16a_mm3[16] = {
+0,0,0,0,4096,8192,12288,16384,12288,8192,4096,0,0,0,0,0};
+
+short filt16a_ml3[16] = {
+-12288,-8192,-4096,0,4096,8192,12288,16384,12288,8192,4096,0,0,0,0,0};
+
short filt16a_r3[16] = {
0,0,0,0,0,0,0,0,4096,8192,12288,16384,0,0,0,0};
diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
index 4e987e5ae4..d8c3342af9 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
+++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
@@ -28,24 +28,42 @@ extern short filt16a_r0[16];
extern short filt16a_m0[16];
+extern short filt16a_mm0[16];
+
extern short filt16a_l1[16];
extern short filt16a_r1[16];
extern short filt16a_m1[16];
+extern short filt16a_mm1[16];
+
+extern short filt16a_mr1[16];
+
+extern short filt16a_ml1[16];
+
extern short filt16a_l2[16];
extern short filt16a_r2[16];
extern short filt16a_m2[16];
+extern short filt16a_mm2[16];
+
+extern short filt16a_mr2[16];
+
+extern short filt16a_ml2[16];
+
extern short filt16a_l3[16];
extern short filt16a_r3[16];
extern short filt16a_m3[16];
+extern short filt16a_mm3[16];
+
+extern short filt16a_ml3[16];
+
extern short filt16a_l0_dc[16];
extern short filt16a_r0_dc[16];
diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
index afa91d7d00..a84b2122f7 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
@@ -28,12 +28,542 @@
#include "PHY/NR_REFSIG/dmrs_nr.h"
#include "PHY/NR_REFSIG/ptrs_nr.h"
#include "PHY/NR_TRANSPORT/nr_sch_dmrs.h"
+#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
#include "common/utils/nr/nr_common.h"
#include "filt16a_32.h"
+#include "T.h"
#include
//#define DEBUG_PDSCH
//#define DEBUG_PDCCH
+//#define DEBUG_PBCH
+//#define DEBUG_PRS_CHEST // To enable PRS Matlab dumps
+//#define DEBUG_PRS_PRINTS // To enable PRS channel estimation debug logs
+extern short nr_qpsk_mod_table[8];
+
+int nr_prs_channel_estimation(uint8_t gNB_id,
+ uint8_t rsc_id,
+ uint8_t rep_num,
+ PHY_VARS_NR_UE *ue,
+ UE_nr_rxtx_proc_t *proc,
+ NR_DL_FRAME_PARMS *frame_params)
+{
+ uint8_t rxAnt = 0, idx = 0;
+ int32_t **rxdataF = ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF;
+ prs_config_t *prs_cfg = &ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg;
+ prs_meas_t **prs_meas = ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_meas;
+ c16_t ch_tmp_buf[ ue->frame_parms.ofdm_symbol_size] __attribute__((aligned(32)));
+ int32_t chF_interpol[frame_params->nb_antennas_rx][NR_PRS_IDFT_OVERSAMP_FACTOR*ue->frame_parms.ofdm_symbol_size] __attribute__((aligned(32)));
+ int32_t chT_interpol[frame_params->nb_antennas_rx][NR_PRS_IDFT_OVERSAMP_FACTOR*ue->frame_parms.ofdm_symbol_size] __attribute__((aligned(32)));
+ memset(ch_tmp_buf,0,sizeof(ch_tmp_buf));
+ memset(chF_interpol,0,sizeof(chF_interpol));
+ memset(chT_interpol,0,sizeof(chF_interpol));
+
+ int slot_prs = (proc->nr_slot_rx - rep_num*prs_cfg->PRSResourceTimeGap + frame_params->slots_per_frame)%frame_params->slots_per_frame;
+ uint32_t **nr_gold_prs = ue->nr_gold_prs[gNB_id][rsc_id][slot_prs];
+
+ int16_t *rxF, *pil, *fl, *fm, *fmm, *fml, *fmr, *fr, mod_prs[NR_MAX_PRS_LENGTH<<1];
+ int16_t ch[2] = {0}, noiseFig[2] = {0};
+ int16_t k_prime = 0, k = 0, re_offset = 0, first_half = 0, second_half = 0;
+ int32_t ch_pwr = 0, snr = 0;
+#ifdef DEBUG_PRS_CHEST
+ char filename[64] = {0}, varname[64] = {0};
+#endif
+ int16_t *ch_tmp = (int16_t *)ch_tmp_buf;
+ int16_t scale_factor = (1.0f/(float)(prs_cfg->NumPRSSymbols))*(1<<15);
+ int16_t num_pilots = (12/prs_cfg->CombSize)*prs_cfg->NumRB;
+ int16_t start_offset = (NR_PRS_IDFT_OVERSAMP_FACTOR-1)*frame_params->ofdm_symbol_size>>1;
+
+ int16_t k_prime_table[K_PRIME_TABLE_ROW_SIZE][K_PRIME_TABLE_COL_SIZE] = PRS_K_PRIME_TABLE;
+ for(int l = prs_cfg->SymbolStart; l < prs_cfg->SymbolStart+prs_cfg->NumPRSSymbols; l++)
+ {
+ int symInd = l-prs_cfg->SymbolStart;
+ if (prs_cfg->CombSize == 2) {
+ k_prime = k_prime_table[0][symInd];
+ }
+ else if (prs_cfg->CombSize == 4){
+ k_prime = k_prime_table[1][symInd];
+ }
+ else if (prs_cfg->CombSize == 6){
+ k_prime = k_prime_table[2][symInd];
+ }
+ else if (prs_cfg->CombSize == 12){
+ k_prime = k_prime_table[3][symInd];
+ }
+
+#ifdef DEBUG_PRS_PRINTS
+ printf("[gNB %d][rsc %d] PRS config l %d k_prime %d:\nprs_cfg->SymbolStart %d\nprs_cfg->NumPRSSymbols %d\nprs_cfg->NumRB %d\nprs_cfg->CombSize %d\n", gNB_id, rsc_id, l, k_prime, prs_cfg->SymbolStart, prs_cfg->NumPRSSymbols, prs_cfg->NumRB, prs_cfg->CombSize);
+#endif
+ // Pilots generation and modulation
+ for (int m = 0; m < num_pilots; m++)
+ {
+ idx = (((nr_gold_prs[l][(m<<1)>>5])>>((m<<1)&0x1f))&3);
+ mod_prs[m<<1] = nr_qpsk_mod_table[idx<<1];
+ mod_prs[(m<<1)+1] = nr_qpsk_mod_table[(idx<<1) + 1];
+ }
+
+ for (rxAnt=0; rxAnt < frame_params->nb_antennas_rx; rxAnt++)
+ {
+ snr = 0;
+
+ // calculate RE offset
+ k = re_offset = (prs_cfg->REOffset+k_prime) % prs_cfg->CombSize + prs_cfg->RBOffset*12 + frame_params->first_carrier_offset;
+
+ // Channel estimation and interpolation
+ pil = (int16_t *)&mod_prs[0];
+ rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k];
+
+ if(prs_cfg->CombSize == 2)
+ {
+ // Choose the interpolation filters
+ switch (k_prime) {
+ case 0:
+ fl = filt8_l0;
+ fml = filt8_m0;
+ fmm = filt8_mm0;
+ fmr = filt8_mr0;
+ fm = filt8_m0;
+ fr = filt8_r0;
+ break;
+
+ case 1:
+ fl = filt8_l1;
+ fmm = filt8_mm1;
+ fml = filt8_ml1;
+ fmr = fmm;
+ fm = filt8_m1;
+ fr = filt8_r1;
+ break;
+
+ default:
+ LOG_I(PHY, "%s: ERROR!! Invalid k_prime=%d for PRS comb_size %d, symbol %d\n",__FUNCTION__, k_prime, prs_cfg->CombSize, l);
+ return(-1);
+ break;
+ }
+
+ //Start pilot
+ ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15);
+ ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15);
+ multadd_real_vector_complex_scalar(fl,
+ ch,
+ ch_tmp,
+ 8);
+
+ //SNR estimation
+ noiseFig[0] = rxF[0] - (int16_t)(((int32_t)ch[0]*pil[0] - (int32_t)ch[1]*pil[1])>>15);
+ noiseFig[1] = rxF[1] - (int16_t)(((int32_t)ch[1]*pil[0] + (int32_t)ch[0]*pil[1])>>15);
+ snr += 10*log10(squaredMod(*(c16_t*)rxF) - squaredMod(*(c16_t*)noiseFig)) - 10*log10(squaredMod(*(c16_t*)noiseFig));
+#ifdef DEBUG_PRS_PRINTS
+ printf("[Rx %d] pilot %3d, SNR %+2d dB: rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, 0, snr, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]);
+#endif
+ pil +=2;
+ k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size;
+ rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k];
+
+ //Middle pilots
+ for(int pIdx = 1; pIdx < num_pilots-1; pIdx+=2)
+ {
+ ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15);
+ ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15);
+ if(pIdx == 1) // 2nd pilot
+ {
+ multadd_real_vector_complex_scalar(fml,
+ ch,
+ ch_tmp,
+ 8);
+ }
+ else
+ {
+ multadd_real_vector_complex_scalar(fm,
+ ch,
+ ch_tmp,
+ 8);
+ }
+
+ //SNR estimation
+ noiseFig[0] = rxF[0] - (int16_t)(((int32_t)ch[0]*pil[0] - (int32_t)ch[1]*pil[1])>>15);
+ noiseFig[1] = rxF[1] - (int16_t)(((int32_t)ch[1]*pil[0] + (int32_t)ch[0]*pil[1])>>15);
+ snr += 10*log10(squaredMod(*(c16_t*)rxF) - squaredMod(*(c16_t*)noiseFig)) - 10*log10(squaredMod(*(c16_t*)noiseFig));
+#ifdef DEBUG_PRS_PRINTS
+ printf("[Rx %d] pilot %3d, SNR %+2d dB: rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, pIdx, snr/(pIdx+1), rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]);
+#endif
+ pil +=2;
+ k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size;
+ rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k];
+
+ ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15);
+ ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15);
+ if(pIdx == (num_pilots-3)) // 2nd last pilot
+ {
+ multadd_real_vector_complex_scalar(fmr,
+ ch,
+ ch_tmp,
+ 8);
+ }
+ else
+ {
+ multadd_real_vector_complex_scalar(fmm,
+ ch,
+ ch_tmp,
+ 8);
+ }
+
+ //SNR estimation
+ noiseFig[0] = rxF[0] - (int16_t)(((int32_t)ch[0]*pil[0] - (int32_t)ch[1]*pil[1])>>15);
+ noiseFig[1] = rxF[1] - (int16_t)(((int32_t)ch[1]*pil[0] + (int32_t)ch[0]*pil[1])>>15);
+ snr += 10*log10(squaredMod(*((c16_t*)rxF)) - squaredMod(*((c16_t*)noiseFig))) - 10*log10(squaredMod(*((c16_t*)noiseFig)));
+#ifdef DEBUG_PRS_PRINTS
+ printf("[Rx %d] pilot %3d, SNR %+2d dB: rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, pIdx+1, snr/(pIdx+2), rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]);
+#endif
+ pil +=2;
+ k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size;
+ rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k];
+ ch_tmp +=8;
+ }
+
+ //End pilot
+ ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15);
+ ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15);
+ multadd_real_vector_complex_scalar(fr,
+ ch,
+ ch_tmp,
+ 8);
+
+ //SNR estimation
+ noiseFig[0] = rxF[0] - (int16_t)(((int32_t)ch[0]*pil[0] - (int32_t)ch[1]*pil[1])>>15);
+ noiseFig[1] = rxF[1] - (int16_t)(((int32_t)ch[1]*pil[0] + (int32_t)ch[0]*pil[1])>>15);
+ snr += 10*log10(squaredMod(*((c16_t*)rxF)) - squaredMod(*((c16_t*)noiseFig))) - 10*log10(squaredMod(*((c16_t*)noiseFig)));
+#ifdef DEBUG_PRS_PRINTS
+ printf("[Rx %d] pilot %3d, SNR %+2d dB: rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, num_pilots-1, snr/num_pilots, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]);
+#endif
+ // average out the SNR computed
+ snr = snr/num_pilots;
+ prs_meas[rxAnt]->snr = snr;
+ }
+ else if(prs_cfg->CombSize == 4)
+ {
+ // Choose the interpolation filters
+ switch (k_prime) {
+ case 0:
+ fl = filt16a_l0;
+ fml = filt16a_mm0;
+ fmm = filt16a_mm0;
+ fmr = filt16a_m0;
+ fm = filt16a_m0;
+ fr = filt16a_r0;
+ break;
+
+ case 1:
+ fl = filt16a_l1;
+ fml = filt16a_ml1;
+ fmm = filt16a_mm1;
+ fmr = filt16a_mr1;
+ fm = filt16a_m1;
+ fr = filt16a_r1;
+ break;
+
+ case 2:
+ fl = filt16a_l2;
+ fml = filt16a_ml2;
+ fmm = filt16a_mm2;
+ fmr = filt16a_mr2;
+ fm = filt16a_m2;
+ fr = filt16a_r2;
+ break;
+
+ case 3:
+ fl = filt16a_l3;
+ fml = filt16a_ml3;
+ fmm = filt16a_mm3;
+ fmr = filt16a_mm3;
+ fm = filt16a_m3;
+ fr = filt16a_r3;
+ break;
+
+ default:
+ LOG_I(PHY, "%s: ERROR!! Invalid k_prime=%d for PRS comb_size %d, symbol %d\n",__FUNCTION__, k_prime, prs_cfg->CombSize, l);
+ return(-1);
+ break;
+ }
+
+ //Start pilot
+ ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15);
+ ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15);
+ multadd_real_vector_complex_scalar(fl,
+ ch,
+ ch_tmp,
+ 16);
+
+ //SNR estimation
+ noiseFig[0] = rxF[0] - (int16_t)(((int32_t)ch[0]*pil[0] - (int32_t)ch[1]*pil[1])>>15);
+ noiseFig[1] = rxF[1] - (int16_t)(((int32_t)ch[1]*pil[0] + (int32_t)ch[0]*pil[1])>>15);
+ snr += 10*log10(squaredMod(*((c16_t*)rxF)) - squaredMod(*((c16_t*)noiseFig))) - 10*log10(squaredMod(*((c16_t*)noiseFig)));
+#ifdef DEBUG_PRS_PRINTS
+ printf("[Rx %d] pilot %3d, SNR %+2d dB: rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, 0, snr, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]);
+#endif
+ pil +=2;
+ k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size;
+ rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k];
+
+ ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15);
+ ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15);
+ multadd_real_vector_complex_scalar(fml,
+ ch,
+ ch_tmp,
+ 16);
+
+ //SNR estimation
+ noiseFig[0] = rxF[0] - (int16_t)(((int32_t)ch[0]*pil[0] - (int32_t)ch[1]*pil[1])>>15);
+ noiseFig[1] = rxF[1] - (int16_t)(((int32_t)ch[1]*pil[0] + (int32_t)ch[0]*pil[1])>>15);
+ snr += 10*log10(squaredMod(*((c16_t*)rxF)) - squaredMod(*((c16_t*)noiseFig))) - 10*log10(squaredMod(*((c16_t*)noiseFig)));
+#ifdef DEBUG_PRS_PRINTS
+ printf("[Rx %d] pilot %3d, SNR %+2d dB: rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, 1, snr/2, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]);
+#endif
+ pil +=2;
+ k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size;
+ rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k];
+ ch_tmp +=8;
+
+ //Middle pilots
+ for(int pIdx = 2; pIdx < num_pilots-2; pIdx++)
+ {
+ ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15);
+ ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15);
+ multadd_real_vector_complex_scalar(fmm,
+ ch,
+ ch_tmp,
+ 16);
+
+ //SNR estimation
+ noiseFig[0] = rxF[0] - (int16_t)(((int32_t)ch[0]*pil[0] - (int32_t)ch[1]*pil[1])>>15);
+ noiseFig[1] = rxF[1] - (int16_t)(((int32_t)ch[1]*pil[0] + (int32_t)ch[0]*pil[1])>>15);
+ snr += 10*log10(squaredMod(*((c16_t*)rxF)) - squaredMod(*((c16_t*)noiseFig))) - 10*log10(squaredMod(*((c16_t*)noiseFig)));
+#ifdef DEBUG_PRS_PRINTS
+ printf("[Rx %d] pilot %3d, SNR %+2d dB: rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, pIdx, snr/(pIdx+1), rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]);
+#endif
+ pil +=2;
+ k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size;
+ rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k];
+ ch_tmp +=8;
+ }
+
+ //End pilot
+ ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15);
+ ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15);
+ multadd_real_vector_complex_scalar(fmr,
+ ch,
+ ch_tmp,
+ 16);
+
+ //SNR estimation
+ noiseFig[0] = rxF[0] - (int16_t)(((int32_t)ch[0]*pil[0] - (int32_t)ch[1]*pil[1])>>15);
+ noiseFig[1] = rxF[1] - (int16_t)(((int32_t)ch[1]*pil[0] + (int32_t)ch[0]*pil[1])>>15);
+ snr += 10*log10(squaredMod(*((c16_t*)rxF)) - squaredMod(*((c16_t*)noiseFig))) - 10*log10(squaredMod(*((c16_t*)noiseFig)));
+#ifdef DEBUG_PRS_PRINTS
+ printf("[Rx %d] pilot %3d, SNR %+2d dB: rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, num_pilots-2, snr/(num_pilots-1), rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]);
+#endif
+ pil +=2;
+ k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size;
+ rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k];
+
+ ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15);
+ ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15);
+ multadd_real_vector_complex_scalar(fr,
+ ch,
+ ch_tmp,
+ 16);
+
+ //SNR estimation
+ noiseFig[0] = rxF[0] - (int16_t)(((int32_t)ch[0]*pil[0] - (int32_t)ch[1]*pil[1])>>15);
+ noiseFig[1] = rxF[1] - (int16_t)(((int32_t)ch[1]*pil[0] + (int32_t)ch[0]*pil[1])>>15);
+ snr += 10*log10(squaredMod(*((c16_t*)rxF)) - squaredMod(*((c16_t*)noiseFig))) - 10*log10(squaredMod(*((c16_t*)noiseFig)));
+#ifdef DEBUG_PRS_PRINTS
+ printf("[Rx %d] pilot %3d, SNR %+2d dB: rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, +%d) \n", rxAnt, num_pilots-1, snr/num_pilots, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]);
+#endif
+ // average out the SNR computed
+ snr = snr/num_pilots;
+ prs_meas[rxAnt]->snr = snr;
+ }
+ else
+ {
+ AssertFatal((prs_cfg->CombSize == 2)||(prs_cfg->CombSize == 4), "[%s] DL PRS CombSize other than 2 and 4 are NOT supported currently. Exiting!!!", __FUNCTION__);
+ }
+
+ //reset channel pointer
+ ch_tmp = (int16_t*)ch_tmp_buf;
+ } // for rxAnt
+ } //for l
+
+ for (rxAnt=0; rxAnt < frame_params->nb_antennas_rx; rxAnt++)
+ {
+ // scale by averaging factor 1/NumPrsSymbols
+ multadd_complex_vector_real_scalar(ch_tmp,
+ scale_factor,
+ ch_tmp,
+ 1,
+ frame_params->ofdm_symbol_size);
+
+#ifdef DEBUG_PRS_PRINTS
+ for (int rb = 0; rb < prs_cfg->NumRB; rb++)
+ {
+ printf("================================================================\n");
+ printf("\t\t\t[gNB %d][Rx %d][RB %d]\n", gNB_id, rxAnt, rb);
+ printf("================================================================\n");
+ idx = (12*rb)<<1;
+ printf("%4d %4d %4d %4d %4d %4d %4d %4d %4d %4d %4d %4d\n", ch_tmp[idx], ch_tmp[idx+1], ch_tmp[idx+2], ch_tmp[idx+3], ch_tmp[idx+4], ch_tmp[idx+5], ch_tmp[idx+6], ch_tmp[idx+7], ch_tmp[idx+8], ch_tmp[idx+9], ch_tmp[idx+10], ch_tmp[idx+11]);
+ printf("%4d %4d %4d %4d %4d %4d %4d %4d %4d %4d %4d %4d\n", ch_tmp[idx+12], ch_tmp[idx+13], ch_tmp[idx+14], ch_tmp[idx+15], ch_tmp[idx+16], ch_tmp[idx+17], ch_tmp[idx+18], ch_tmp[idx+19], ch_tmp[idx+20], ch_tmp[idx+21], ch_tmp[idx+22], ch_tmp[idx+23]);
+ printf("\n");
+ }
+#endif
+
+ // Place PRS channel estimates in FFT shifted format
+ first_half = frame_params->ofdm_symbol_size - re_offset;
+ second_half = (prs_cfg->NumRB*12) - first_half;
+ if(first_half > 0)
+ memcpy((int16_t *)&chF_interpol[rxAnt][start_offset+re_offset], &ch_tmp[0], first_half*sizeof(int32_t));
+ if(second_half > 0)
+ memcpy((int16_t *)&chF_interpol[rxAnt][start_offset], &ch_tmp[(first_half<<1)], second_half*sizeof(int32_t));
+
+ // Time domain IMPULSE response
+ idft_size_idx_t idftsizeidx;
+ switch (NR_PRS_IDFT_OVERSAMP_FACTOR*frame_params->ofdm_symbol_size) {
+ case 128:
+ idftsizeidx = IDFT_128;
+ break;
+
+ case 256:
+ idftsizeidx = IDFT_256;
+ break;
+
+ case 512:
+ idftsizeidx = IDFT_512;
+ break;
+
+ case 768:
+ idftsizeidx = IDFT_768;
+ break;
+
+ case 1024:
+ idftsizeidx = IDFT_1024;
+ break;
+
+ case 1536:
+ idftsizeidx = IDFT_1536;
+ break;
+
+ case 2048:
+ idftsizeidx = IDFT_2048;
+ break;
+
+ case 3072:
+ idftsizeidx = IDFT_3072;
+ break;
+
+ case 4096:
+ idftsizeidx = IDFT_4096;
+ break;
+ // 16x IDFT oversampling
+ case 8192:
+ idftsizeidx = IDFT_8192;
+ break;
+
+ case 12288:
+ idftsizeidx = IDFT_12288;
+ break;
+
+ case 16384:
+ idftsizeidx = IDFT_16384;
+ break;
+
+ case 24576:
+ idftsizeidx = IDFT_24576;
+ break;
+
+ case 32768:
+ idftsizeidx = IDFT_32768;
+ break;
+
+ case 49152:
+ idftsizeidx = IDFT_49152;
+ break;
+
+ case 65536:
+ idftsizeidx = IDFT_65536;
+ break;
+
+ default:
+ LOG_I(PHY, "%s: unsupported ofdm symbol size \n", __FUNCTION__);
+ assert(0);
+ }
+
+ idft(idftsizeidx,
+ (int16_t *)&chF_interpol[rxAnt][0],
+ (int16_t *)&chT_interpol[rxAnt][0],1);
+
+ // peak estimator
+ peak_estimator(&chT_interpol[rxAnt][start_offset],
+ frame_params->ofdm_symbol_size,
+ &prs_meas[rxAnt]->dl_toa,
+ &ch_pwr);
+
+ //prs measurements
+ prs_meas[rxAnt]->gNB_id = gNB_id;
+ prs_meas[rxAnt]->sfn = proc->frame_rx;
+ prs_meas[rxAnt]->slot = proc->nr_slot_rx;
+ prs_meas[rxAnt]->rxAnt_idx = rxAnt;
+ prs_meas[rxAnt]->dl_aoa = rsc_id;
+ LOG_I(PHY, "[gNB %d][rsc %d][Rx %d][sfn %d][slot %d] DL PRS ToA ==> %d / %d samples, peak channel power %.1f dBm, SNR %+2d dB\n", gNB_id, rsc_id, rxAnt, proc->frame_rx, proc->nr_slot_rx, prs_meas[rxAnt]->dl_toa, frame_params->ofdm_symbol_size, 10*log10(ch_pwr/frame_params->ofdm_symbol_size)-30, prs_meas[rxAnt]->snr);
+
+#ifdef DEBUG_PRS_CHEST
+ sprintf(filename, "%s%i%s", "PRSpilot_", rxAnt, ".m");
+ LOG_M(filename, "prs_loc", &mod_prs[0], num_pilots,1,1);
+ sprintf(filename, "%s%i%s", "rxSigF_", rxAnt, ".m");
+ sprintf(varname, "%s%i", "rxF_", rxAnt);
+ LOG_M(filename, varname, &rxdataF[rxAnt][0], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1);
+ sprintf(filename, "%s%i%s", "prsChestF_", rxAnt, ".m");
+ sprintf(varname, "%s%i", "prsChF_", rxAnt);
+ LOG_M(filename, varname, &chF_interpol[rxAnt][start_offset], frame_params->ofdm_symbol_size,1,1);
+ sprintf(filename, "%s%i%s", "prsChestT_", rxAnt, ".m");
+ sprintf(varname, "%s%i", "prsChT_", rxAnt);
+ LOG_M(filename, varname, &chT_interpol[rxAnt][start_offset], frame_params->ofdm_symbol_size,1,1);
+#endif
+
+ // T tracer dump
+ T(T_UE_PHY_INPUT_SIGNAL, T_INT(gNB_id),
+ T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx),
+ T_INT(rxAnt), T_BUFFER(&rxdataF[rxAnt][0], frame_params->samples_per_slot_wCP*sizeof(int32_t)));
+
+ T(T_UE_PHY_DL_CHANNEL_ESTIMATE_FREQ, T_INT(gNB_id), T_INT(rsc_id),
+ T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx),
+ T_INT(rxAnt), T_BUFFER(&chF_interpol[rxAnt][start_offset], frame_params->ofdm_symbol_size*sizeof(int32_t)));
+
+ T(T_UE_PHY_DL_CHANNEL_ESTIMATE, T_INT(gNB_id), T_INT(rsc_id),
+ T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx),
+ T_INT(rxAnt), T_BUFFER(&chT_interpol[rxAnt][start_offset], frame_params->ofdm_symbol_size*sizeof(int32_t)));
+ }
+
+ return(0);
+}
+
+#define CH_INTERP 0
+#define NO_INTERP 1
+
+/* Generic function to find the peak of channel estimation buffer */
+void peak_estimator(int32_t *buffer, int32_t buf_len, int32_t *peak_idx, int32_t *peak_val)
+{
+ int32_t max_val = 0, max_idx = 0, abs_val = 0;
+ for(int k = 0; k < buf_len; k++)
+ {
+ abs_val = squaredMod(((c16_t*)buffer)[k]);
+ if(abs_val > max_val)
+ {
+ max_val = abs_val;
+ max_idx = k;
+ }
+ }
+ *peak_val = max_val;
+ *peak_idx = max_idx;
+}
#define CH_INTERP 0
#define NO_INTERP 1
@@ -72,7 +602,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
k = nushift;
-#ifdef DEBUG_CH
+#ifdef DEBUG_PBCH
printf("PBCH DMRS Correlation : ThreadId %d, gNB_id %d , OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",proc->thread_id, gNB_id,ue->frame_parms.ofdm_symbol_size,
ue->frame_parms.Ncp,Ns,k, symbol);
#endif
@@ -86,7 +616,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
pil = (int16_t *)&pilot[0];
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
-#ifdef DEBUG_CH
+#ifdef DEBUG_PBCH
printf("pbch ch est pilot addr %p RB_DL %d\n",&pilot[0], ue->frame_parms.N_RB_DL);
printf("k %d, first_carrier %d\n",k,ue->frame_parms.first_carrier_offset);
printf("rxF addr %p\n", rxF);
@@ -100,7 +630,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
current_ssb->c_re += ch[0];
current_ssb->c_im += ch[1];
-#ifdef DEBUG_CH
+#ifdef DEBUG_PBCH
printf("ch 0 %d\n",((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1]));
printf("pilot 0 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]);
#endif
@@ -116,7 +646,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
current_ssb->c_re += ch[0];
current_ssb->c_im += ch[1];
-#ifdef DEBUG_CH
+#ifdef DEBUG_PBCH
printf("pilot 1 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
#endif
@@ -127,7 +657,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
current_ssb->c_re += ch[0];
current_ssb->c_im += ch[1];
-#ifdef DEBUG_CH
+#ifdef DEBUG_PBCH
printf("pilot 2 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
#endif
@@ -152,7 +682,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
current_ssb->c_re += ch[0];
current_ssb->c_im += ch[1];
-#ifdef DEBUG_CH
+#ifdef DEBUG_PBCH
printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
#endif
@@ -167,7 +697,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
current_ssb->c_re += ch[0];
current_ssb->c_im += ch[1];
-#ifdef DEBUG_CH
+#ifdef DEBUG_PBCH
printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
#endif
pil += 2;
@@ -181,7 +711,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
current_ssb->c_re += ch[0];
current_ssb->c_im += ch[1];
-#ifdef DEBUG_CH
+#ifdef DEBUG_PBCH
printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+2,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
#endif
@@ -237,7 +767,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
k = nushift;
-#ifdef DEBUG_CH
+#ifdef DEBUG_PBCH
printf("PBCH Channel Estimation : ThreadId %d, gNB_id %d ch_offset %d, OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",proc->thread_id, gNB_id,ch_offset,ue->frame_parms.ofdm_symbol_size,
ue->frame_parms.Ncp,Ns,k, symbol);
#endif
@@ -288,6 +818,10 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
idftsizeidx = IDFT_512;
break;
+ case 768:
+ idftsizeidx = IDFT_768;
+ break;
+
case 1024:
idftsizeidx = IDFT_1024;
break;
@@ -325,7 +859,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
memset(dl_ch,0,sizeof(struct complex16)*(ue->frame_parms.ofdm_symbol_size));
-#ifdef DEBUG_CH
+#ifdef DEBUG_PBCH
printf("pbch ch est pilot addr %p RB_DL %d\n",&pilot[0], ue->frame_parms.N_RB_DL);
printf("k %d, first_carrier %d\n",k,ue->frame_parms.first_carrier_offset);
printf("rxF addr %p\n", rxF);
@@ -337,7 +871,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
-#ifdef DEBUG_CH
+#ifdef DEBUG_PBCH
printf("ch 0 %d\n",((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1]));
printf("pilot 0 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]);
#endif
@@ -356,7 +890,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
-#ifdef DEBUG_CH
+#ifdef DEBUG_PBCH
printf("pilot 1 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
#endif
multadd_real_vector_complex_scalar(fm,
@@ -370,7 +904,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
-#ifdef DEBUG_CH
+#ifdef DEBUG_PBCH
printf("pilot 2 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
#endif
@@ -398,7 +932,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
-#ifdef DEBUG_CH
+#ifdef DEBUG_PBCH
printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
#endif
multadd_real_vector_complex_scalar(fl,
@@ -417,7 +951,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
-#ifdef DEBUG_CH
+#ifdef DEBUG_PBCH
printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
#endif
multadd_real_vector_complex_scalar(fm,
@@ -427,12 +961,11 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
pil += 2;
re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
-
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
-#ifdef DEBUG_CH
+#ifdef DEBUG_PBCH
printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+2,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
#endif
diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h
index 74dfe63075..f01a2af606 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h
@@ -32,6 +32,17 @@
/*!\brief Timing drift hysterisis in samples*/
#define SYNCH_HYST 2
+/* A function to perform the channel estimation of DL PRS signal */
+int nr_prs_channel_estimation(uint8_t gNB_id,
+ uint8_t rsc_id,
+ uint8_t rep_num,
+ PHY_VARS_NR_UE *ue,
+ UE_nr_rxtx_proc_t *proc,
+ NR_DL_FRAME_PARMS *frame_params);
+
+/* Generic function to find the peak of channel estimation buffer */
+void peak_estimator(int32_t *buffer, int32_t buf_len, int32_t *peak_idx, int32_t *peak_val);
+
/*!
\brief This function performs channel estimation including frequency and temporal interpolation
\param ue Pointer to UE PHY variables
diff --git a/openair1/PHY/NR_UE_ESTIMATION/plot_prs_Ttracer_dumps.m b/openair1/PHY/NR_UE_ESTIMATION/plot_prs_Ttracer_dumps.m
new file mode 100644
index 0000000000..e552a81338
--- /dev/null
+++ b/openair1/PHY/NR_UE_ESTIMATION/plot_prs_Ttracer_dumps.m
@@ -0,0 +1,52 @@
+clc; clear all;
+dir = input('Enter the directory path to T tracer dumps: ');
+fft_size = input('Enter the OFDM FFT size used for file parsing: ');
+num_resources = input('Enter number of PRS respurces: ');
+num_gnb = input('Enter number of active gNBs: ');
+num_prs_symb = 1;
+start_resource = 0;
+buff_offset = start_resource*2*fft_size;
+
+%% Channel Impulse Response(CIR)
+figure, hold on;
+for i=0:num_gnb-1
+ for j=0:num_resources-1
+ file = [dir '/chT_gnb', num2str(i), '_', num2str(j), '.raw'];
+ fid = fopen(file, 'r');
+ if (fid > 0)
+ x = fread(fid, Inf, 'int16');
+ else
+ disp(['Failed to open the file ', file, '..!!'])
+ return;
+ end
+ fclose(fid);
+
+ y = x(buff_offset+1:2:num_prs_symb*2*fft_size) + 1j*x(buff_offset+2:2:num_prs_symb*2*fft_size);
+ plot(abs(fftshift(y)));
+ end
+end
+xlabel('FFT Index'); ylabel('ABS');
+title('CHANNEL IMPULSE RESPONSE');
+hold off;
+
+%% Channel Frequncy Response(CFR)
+figure, hold on;
+for i=0:num_gnb-1
+ for j=0:num_resources-1
+ file = [dir '/chF_gnb', num2str(i), '_', num2str(j), '.raw'];
+ fid = fopen(file, 'r');
+ if (fid > 0)
+ x = fread(fid, Inf, 'int16');
+ else
+ disp(['Failed to open the file ', file, '..!!'])
+ return;
+ end
+ fclose(fid);
+
+ y = x(buff_offset+1:2:num_prs_symb*2*fft_size) + 1j*x(buff_offset+2:2:num_prs_symb*2*fft_size);
+ plot(abs(y));
+ end
+end
+xlabel('FFT Index'); ylabel('ABS');
+title('CHANNEL FREQUENCY RESPONSE');
+hold off;
\ No newline at end of file
diff --git a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c
index d2034f3abf..e736718237 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c
@@ -600,24 +600,6 @@ int pss_synchro_nr(PHY_VARS_NR_UE *PHY_vars_UE, int is, int rate_change)
}
-static inline int abs32(int x)
-{
- return (((int)((short*)&x)[0])*((int)((short*)&x)[0]) + ((int)((short*)&x)[1])*((int)((short*)&x)[1]));
-}
-
-static inline int64_t abs64(int64_t x)
-{
- return (((int64_t)((int32_t*)&x)[0])*((int64_t)((int32_t*)&x)[0]) + ((int64_t)((int32_t*)&x)[1])*((int64_t)((int32_t*)&x)[1]));
-}
-
-static inline double angle64(int64_t x)
-{
-
- double re=((int32_t*)&x)[0];
- double im=((int32_t*)&x)[1];
- return (atan2(im,re));
-}
-
/*******************************************************************
*
@@ -726,7 +708,7 @@ int pss_search_time_nr(int **rxdata, ///rx data in time domain
(short*)&(rxdata[ar][n+is*frame_parms->samples_per_frame]),
frame_parms->ofdm_symbol_size,
shift);
- pss_corr_ue += abs64(result);
+ pss_corr_ue += squaredMod(*(c32_t*)&result);
//((short*)pss_corr_ue[pss_index])[2*n] += ((short*) &result)[0]; /* real part */
//((short*)pss_corr_ue[pss_index])[2*n+1] += ((short*) &result)[1]; /* imaginary part */
//((short*)&synchro_out)[0] += ((int*) &result)[0]; /* real part */
diff --git a/openair1/PHY/TOOLS/Makefile b/openair1/PHY/TOOLS/Makefile
index 457edf83b6..d7b14d5010 100644
--- a/openair1/PHY/TOOLS/Makefile
+++ b/openair1/PHY/TOOLS/Makefile
@@ -1,5 +1,5 @@
oai_dfts_sse4: oai_dfts.c
- gcc-7 -O3 -std=gnu99 -msse4.1 -o oai_dfts_sse4 oai_dfts.c time_meas.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR_HOME -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR_TARGETS/COMMON -I$$OPENAIR_HOME/sdr/COMMON -I$$OPENAIR2_DIR -I$$OPENAIR2_DIR/COMMON -I$$OPENAIR_HOME/common/utils -I$$OPENAIR_HOME/common/utils/T -I$$OPENAIR_HOME/common/utils/msc -I$$OPENAIR_HOME/nfapi/open-nFAPI/nfapi/public_inc -DMR_MAIN -DNB_ANTENNAS_RX=1 -lm -lpthread # -DD256STATS #-DD64STATS
+ gcc -O3 -std=gnu99 -msse4.1 -o oai_dfts_sse4 oai_dfts.c time_meas.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR_HOME -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR_TARGETS/COMMON -I$$OPENAIR_HOME/sdr/COMMON -I$$OPENAIR2_DIR -I$$OPENAIR2_DIR/COMMON -I$$OPENAIR_HOME/common/utils -I$$OPENAIR_HOME/common/utils/T -I$$OPENAIR_HOME/common/utils/msc -I$$OPENAIR_HOME/nfapi/open-nFAPI/nfapi/public_inc -DMR_MAIN -DNB_ANTENNAS_RX=1 -lm -lpthread # -DD256STATS #-DD64STATS
oai_dfts_avx2: oai_dfts.c
gcc -O2 -std=gnu99 -mavx2 -g -ggdb -o oai_dfts_avx2 oai_dfts.c time_meas.c ../../SIMULATION/TOOLS/taus.c $$OPENAIR_HOME/common/utils/backtrace.c -I$$OPENAIR_HOME -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR_TARGETS/COMMON -I$$OPENAIR_HOME/sdr/COMMON -I$$OPENAIR2_DIR -I$$OPENAIR2_DIR/COMMON -I$$OPENAIR_HOME/common/utils -I$$OPENAIR_HOME/common/utils/T -I$$OPENAIR_HOME/common/utils/msc -I$$OPENAIR_HOME/nfapi/open-nFAPI/nfapi/public_inc -DMR_MAIN -DNB_ANTENNAS_RX=1 -lm -lpthread # -DD256STATS #-DD64STATS
diff --git a/openair1/PHY/TOOLS/oai_dfts.c b/openair1/PHY/TOOLS/oai_dfts.c
index cbedfd815a..d6874e27fc 100644
--- a/openair1/PHY/TOOLS/oai_dfts.c
+++ b/openair1/PHY/TOOLS/oai_dfts.c
@@ -5362,7 +5362,7 @@ void idft8192(int16_t *x,int16_t *y,unsigned char scale)
#endif
-int16_t tw16384[3*2*4096];
+int16_t tw16384[3*2*4096] __attribute__((aligned(32)));
#ifndef __AVX2__
void dft16384(int16_t *x,int16_t *y,unsigned char scale)
@@ -5961,6 +5961,124 @@ void idft32768(int16_t *x,int16_t *y,unsigned char scale)
#endif
+int16_t twa768[512],twb768[512];
+
+// 256 x 3
+void idft768(int16_t *input, int16_t *output, unsigned char scale)
+{
+ int i,i2,j;
+ uint32_t tmp[3][256]__attribute__((aligned(32)));
+ uint32_t tmpo[3][256] __attribute__((aligned(32)));
+ simd_q15_t *y128p=(simd_q15_t*)output;
+ simd_q15_t ONE_OVER_SQRT3_Q15_128 = set1_int16(ONE_OVER_SQRT3_Q15);
+
+ for (i=0,j=0; i<256; i++) {
+ tmp[0][i] = ((uint32_t *)input)[j++];
+ tmp[1][i] = ((uint32_t *)input)[j++];
+ tmp[2][i] = ((uint32_t *)input)[j++];
+ }
+
+ idft256((int16_t*)(tmp[0]),(int16_t*)(tmpo[0]),1);
+ idft256((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),1);
+ idft256((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),1);
+
+ for (i=0,i2=0; i<512; i+=8,i2+=4) {
+ ibfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),((simd_q15_t*)&tmpo[2][i2]),
+ (simd_q15_t*)(output+i),(simd_q15_t*)(output+512+i),(simd_q15_t*)(output+1024+i),
+ (simd_q15_t*)(twa768+i),(simd_q15_t*)(twb768+i));
+ }
+
+
+ if (scale==1) {
+ for (i=0; i<12; i++) {
+ y128p[0] = mulhi_int16(y128p[0],ONE_OVER_SQRT3_Q15_128);
+ y128p[1] = mulhi_int16(y128p[1],ONE_OVER_SQRT3_Q15_128);
+ y128p[2] = mulhi_int16(y128p[2],ONE_OVER_SQRT3_Q15_128);
+ y128p[3] = mulhi_int16(y128p[3],ONE_OVER_SQRT3_Q15_128);
+ y128p[4] = mulhi_int16(y128p[4],ONE_OVER_SQRT3_Q15_128);
+ y128p[5] = mulhi_int16(y128p[5],ONE_OVER_SQRT3_Q15_128);
+ y128p[6] = mulhi_int16(y128p[6],ONE_OVER_SQRT3_Q15_128);
+ y128p[7] = mulhi_int16(y128p[7],ONE_OVER_SQRT3_Q15_128);
+ y128p[8] = mulhi_int16(y128p[8],ONE_OVER_SQRT3_Q15_128);
+ y128p[9] = mulhi_int16(y128p[9],ONE_OVER_SQRT3_Q15_128);
+ y128p[10] = mulhi_int16(y128p[10],ONE_OVER_SQRT3_Q15_128);
+ y128p[11] = mulhi_int16(y128p[11],ONE_OVER_SQRT3_Q15_128);
+ y128p[12] = mulhi_int16(y128p[12],ONE_OVER_SQRT3_Q15_128);
+ y128p[13] = mulhi_int16(y128p[13],ONE_OVER_SQRT3_Q15_128);
+ y128p[14] = mulhi_int16(y128p[14],ONE_OVER_SQRT3_Q15_128);
+ y128p[15] = mulhi_int16(y128p[15],ONE_OVER_SQRT3_Q15_128);
+ y128p+=16;
+ }
+ }
+
+ _mm_empty();
+ _m_empty();
+
+}
+
+void dft768(int16_t *input, int16_t *output, unsigned char scale)
+{
+ int i,i2,j;
+ uint32_t tmp[3][256] __attribute__((aligned(32)));
+ uint32_t tmpo[3][256] __attribute__((aligned(32)));
+ simd_q15_t *y128p=(simd_q15_t*)output;
+ simd_q15_t ONE_OVER_SQRT3_Q15_128 = set1_int16(ONE_OVER_SQRT3_Q15);
+
+ for (i=0,j=0; i<256; i++) {
+ tmp[0][i] = ((uint32_t *)input)[j++];
+ tmp[1][i] = ((uint32_t *)input)[j++];
+ tmp[2][i] = ((uint32_t *)input)[j++];
+ }
+
+ dft256((int16_t*)(tmp[0]),(int16_t*)(tmpo[0]),1);
+ dft256((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),1);
+ dft256((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),1);
+
+ /*
+ for (i=1; i<512; i++) {
+ tmpo[0][i] = tmpo[0][i<<1];
+ tmpo[1][i] = tmpo[1][i<<1];
+ tmpo[2][i] = tmpo[2][i<<1];
+ }*/
+#ifndef MR_MAIN
+ if (LOG_DUMPFLAG(DEBUG_DFT)) {
+ LOG_M("dft768out0.m","o0",tmpo[0],1024,1,1);
+ LOG_M("dft768out1.m","o1",tmpo[1],1024,1,1);
+ LOG_M("dft768out2.m","o2",tmpo[2],1024,1,1);
+ }
+#endif
+ for (i=0,i2=0; i<512; i+=8,i2+=4) {
+ bfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),(simd_q15_t*)(&tmpo[2][i2]),
+ (simd_q15_t*)(output+i),(simd_q15_t*)(output+512+i),(simd_q15_t*)(output+1024+i),
+ (simd_q15_t*)(twa768+i),(simd_q15_t*)(twb768+i));
+ }
+
+ if (scale==1) {
+ for (i=0; i<12; i++) {
+ y128p[0] = mulhi_int16(y128p[0],ONE_OVER_SQRT3_Q15_128);
+ y128p[1] = mulhi_int16(y128p[1],ONE_OVER_SQRT3_Q15_128);
+ y128p[2] = mulhi_int16(y128p[2],ONE_OVER_SQRT3_Q15_128);
+ y128p[3] = mulhi_int16(y128p[3],ONE_OVER_SQRT3_Q15_128);
+ y128p[4] = mulhi_int16(y128p[4],ONE_OVER_SQRT3_Q15_128);
+ y128p[5] = mulhi_int16(y128p[5],ONE_OVER_SQRT3_Q15_128);
+ y128p[6] = mulhi_int16(y128p[6],ONE_OVER_SQRT3_Q15_128);
+ y128p[7] = mulhi_int16(y128p[7],ONE_OVER_SQRT3_Q15_128);
+ y128p[8] = mulhi_int16(y128p[8],ONE_OVER_SQRT3_Q15_128);
+ y128p[9] = mulhi_int16(y128p[9],ONE_OVER_SQRT3_Q15_128);
+ y128p[10] = mulhi_int16(y128p[10],ONE_OVER_SQRT3_Q15_128);
+ y128p[11] = mulhi_int16(y128p[11],ONE_OVER_SQRT3_Q15_128);
+ y128p[12] = mulhi_int16(y128p[12],ONE_OVER_SQRT3_Q15_128);
+ y128p[13] = mulhi_int16(y128p[13],ONE_OVER_SQRT3_Q15_128);
+ y128p[14] = mulhi_int16(y128p[14],ONE_OVER_SQRT3_Q15_128);
+ y128p[15] = mulhi_int16(y128p[15],ONE_OVER_SQRT3_Q15_128);
+ y128p+=16;
+ }
+ }
+
+ _mm_empty();
+ _m_empty();
+
+}
int16_t twa1536[1024],twb1536[1024];
// 512 x 3
@@ -6894,6 +7012,122 @@ void idft49152(int16_t *input, int16_t *output,uint8_t scale) {
_m_empty();
}
+int16_t tw65536[3*2*16384] __attribute__((aligned(32)));
+
+#ifndef __AVX2__
+void idft65536(int16_t *x,int16_t *y,unsigned char scale)
+{
+
+ simd_q15_t xtmp[16384],ytmp[16384],*tw65536_128p=(simd_q15_t *)tw65536,*x128=(simd_q15_t *)x,*y128=(simd_q15_t *)y,*y128p=(simd_q15_t *)y;
+ simd_q15_t *ytmpp = &ytmp[0];
+ int i,j;
+
+ for (i=0,j=0; i<16384; i+=4,j++) {
+ transpose16_ooff(x128+i,xtmp+j,4096);
+ }
+
+
+ idft16384((int16_t*)(xtmp),(int16_t*)(ytmp),1);
+ idft16384((int16_t*)(xtmp+4096),(int16_t*)(ytmp+4096),1);
+ idft16384((int16_t*)(xtmp+8192),(int16_t*)(ytmp+8192),1);
+ idft16384((int16_t*)(xtmp+12288),(int16_t*)(ytmp+12288),1);
+
+ for (i=0; i<4096; i++) {
+ ibfly4(ytmpp,ytmpp+4096,ytmpp+8192,ytmpp+12288,
+ y128p,y128p+4096,y128p+8192,y128p+12288,
+ tw65536_128p,tw63536_128p+4096,tw65536_128p+8192);
+ tw65536_128p++;
+ y128p++;
+ ytmpp++;
+ }
+
+ if (scale>0) {
+
+ for (i=0; i<1024; i++) {
+ y128[0] = shiftright_int16(y128[0],scale);
+ y128[1] = shiftright_int16(y128[1],scale);
+ y128[2] = shiftright_int16(y128[2],scale);
+ y128[3] = shiftright_int16(y128[3],scale);
+ y128[4] = shiftright_int16(y128[4],scale);
+ y128[5] = shiftright_int16(y128[5],scale);
+ y128[6] = shiftright_int16(y128[6],scale);
+ y128[7] = shiftright_int16(y128[7],scale);
+ y128[8] = shiftright_int16(y128[8],scale);
+ y128[9] = shiftright_int16(y128[9],scale);
+ y128[10] = shiftright_int16(y128[10],scale);
+ y128[11] = shiftright_int16(y128[11],scale);
+ y128[12] = shiftright_int16(y128[12],scale);
+ y128[13] = shiftright_int16(y128[13],scale);
+ y128[14] = shiftright_int16(y128[14],scale);
+ y128[15] = shiftright_int16(y128[15],scale);
+
+ y128+=16;
+ }
+
+ }
+
+ _mm_empty();
+ _m_empty();
+}
+
+#else // __AVX2__
+void idft65536(int16_t *x,int16_t *y,unsigned char scale)
+{
+
+ simd256_q15_t xtmp[8192],ytmp[8192],*tw65536_256p=(simd256_q15_t *)tw65536,*x256=(simd256_q15_t *)x,*y256=(simd256_q15_t *)y,*y256p=(simd256_q15_t *)y;
+ simd256_q15_t *ytmpp = &ytmp[0];
+ int i,j;
+
+ for (i=0,j=0; i<8192; i+=4,j++) {
+ transpose16_ooff_simd256(x256+i,xtmp+j,2048);
+ }
+
+
+ idft16384((int16_t*)(xtmp),(int16_t*)(ytmp),1);
+ idft16384((int16_t*)(xtmp+2048),(int16_t*)(ytmp+2048),1);
+ idft16384((int16_t*)(xtmp+4096),(int16_t*)(ytmp+4096),1);
+ idft16384((int16_t*)(xtmp+6144),(int16_t*)(ytmp+6144),1);
+
+ for (i=0; i<2048; i++) {
+ ibfly4_256(ytmpp,ytmpp+2048,ytmpp+4096,ytmpp+6144,
+ y256p,y256p+2048,y256p+4096,y256p+6144,
+ tw65536_256p,tw65536_256p+4096,tw65536_256p+8192);
+ tw65536_256p++;
+ y256p++;
+ ytmpp++;
+ }
+
+ if (scale>0) {
+
+ for (i=0; i<512; i++) {
+ y256[0] = shiftright_int16_simd256(y256[0],scale);
+ y256[1] = shiftright_int16_simd256(y256[1],scale);
+ y256[2] = shiftright_int16_simd256(y256[2],scale);
+ y256[3] = shiftright_int16_simd256(y256[3],scale);
+ y256[4] = shiftright_int16_simd256(y256[4],scale);
+ y256[5] = shiftright_int16_simd256(y256[5],scale);
+ y256[6] = shiftright_int16_simd256(y256[6],scale);
+ y256[7] = shiftright_int16_simd256(y256[7],scale);
+ y256[8] = shiftright_int16_simd256(y256[8],scale);
+ y256[9] = shiftright_int16_simd256(y256[9],scale);
+ y256[10] = shiftright_int16_simd256(y256[10],scale);
+ y256[11] = shiftright_int16_simd256(y256[11],scale);
+ y256[12] = shiftright_int16_simd256(y256[12],scale);
+ y256[13] = shiftright_int16_simd256(y256[13],scale);
+ y256[14] = shiftright_int16_simd256(y256[14],scale);
+ y256[15] = shiftright_int16_simd256(y256[15],scale);
+
+ y256+=16;
+ }
+
+ }
+
+ _mm_empty();
+ _m_empty();
+}
+
+#endif //__AVX2__
+
int16_t twa73728[49152] __attribute__((aligned(32)));
int16_t twb73728[49152] __attribute__((aligned(32)));
// 24576 x 3
@@ -8676,6 +8910,7 @@ void dft384(int16_t *x,int16_t *y,unsigned char scale_flag) // 96 x 4
};
+
static int16_t twa432[107*2*4];
static int16_t twb432[107*2*4];
static int16_t twc432[107*2*4];
@@ -9049,18 +9284,18 @@ void dft720(int16_t *x,int16_t *y,unsigned char scale_flag) // 180 x 4
};
-static int16_t twa768[191*2*4];
-static int16_t twb768[191*2*4];
-static int16_t twc768[191*2*4];
+static int16_t twa768p[191*2*4];
+static int16_t twb768p[191*2*4];
+static int16_t twc768p[191*2*4];
-void dft768(int16_t *x,int16_t *y,unsigned char scale_flag) { // 192x 4;
+void dft768p(int16_t *x,int16_t *y,unsigned char scale_flag) { // 192x 4;
int i,j;
simd_q15_t *x128=(simd_q15_t *)x;
simd_q15_t *y128=(simd_q15_t *)y;
- simd_q15_t *twa128=(simd_q15_t *)&twa768[0];
- simd_q15_t *twb128=(simd_q15_t *)&twb768[0];
- simd_q15_t *twc128=(simd_q15_t *)&twc768[0];
+ simd_q15_t *twa128=(simd_q15_t *)&twa768p[0];
+ simd_q15_t *twb128=(simd_q15_t *)&twb768p[0];
+ simd_q15_t *twc128=(simd_q15_t *)&twc768p[0];
simd_q15_t x2128[768];// = (simd_q15_t *)&x2128array[0];
simd_q15_t ytmp128[768];//=&ytmp128array2[0];
@@ -9105,10 +9340,66 @@ void dft768(int16_t *x,int16_t *y,unsigned char scale_flag) { // 192x 4;
_mm_empty();
_m_empty();
+}
+
+static int16_t twa384i[256];
+static int16_t twb384i[256];
+// 128 x 3
+void idft384(int16_t *input, int16_t *output, unsigned char scale)
+{
+ int i,i2,j;
+ uint32_t tmp[3][128]__attribute__((aligned(32)));
+ uint32_t tmpo[3][128] __attribute__((aligned(32)));
+ simd_q15_t *y128p=(simd_q15_t*)output;
+ simd_q15_t ONE_OVER_SQRT3_Q15_128 = set1_int16(ONE_OVER_SQRT3_Q15);
+
+ for (i=0,j=0; i<128; i++) {
+ tmp[0][i] = ((uint32_t *)input)[j++];
+ tmp[1][i] = ((uint32_t *)input)[j++];
+ tmp[2][i] = ((uint32_t *)input)[j++];
+ }
+
+ idft128((int16_t*)(tmp[0]),(int16_t*)(tmpo[0]),1);
+ idft128((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),1);
+ idft128((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),1);
+
+ for (i=0,i2=0; i<256; i+=8,i2+=4) {
+ ibfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),(simd_q15_t*)(&tmpo[2][i2]),
+ (simd_q15_t*)(output+i),(simd_q15_t*)(output+256+i),(simd_q15_t*)(output+512+i),
+ (simd_q15_t*)(twa384+i),(simd_q15_t*)(twb384+i));
+ }
+
+
+ if (scale==1) {
+ for (i=0; i<6; i++) {
+ y128p[0] = mulhi_int16(y128p[0],ONE_OVER_SQRT3_Q15_128);
+ y128p[1] = mulhi_int16(y128p[1],ONE_OVER_SQRT3_Q15_128);
+ y128p[2] = mulhi_int16(y128p[2],ONE_OVER_SQRT3_Q15_128);
+ y128p[3] = mulhi_int16(y128p[3],ONE_OVER_SQRT3_Q15_128);
+ y128p[4] = mulhi_int16(y128p[4],ONE_OVER_SQRT3_Q15_128);
+ y128p[5] = mulhi_int16(y128p[5],ONE_OVER_SQRT3_Q15_128);
+ y128p[6] = mulhi_int16(y128p[6],ONE_OVER_SQRT3_Q15_128);
+ y128p[7] = mulhi_int16(y128p[7],ONE_OVER_SQRT3_Q15_128);
+ y128p[8] = mulhi_int16(y128p[8],ONE_OVER_SQRT3_Q15_128);
+ y128p[9] = mulhi_int16(y128p[9],ONE_OVER_SQRT3_Q15_128);
+ y128p[10] = mulhi_int16(y128p[10],ONE_OVER_SQRT3_Q15_128);
+ y128p[11] = mulhi_int16(y128p[11],ONE_OVER_SQRT3_Q15_128);
+ y128p[12] = mulhi_int16(y128p[12],ONE_OVER_SQRT3_Q15_128);
+ y128p[13] = mulhi_int16(y128p[13],ONE_OVER_SQRT3_Q15_128);
+ y128p[14] = mulhi_int16(y128p[14],ONE_OVER_SQRT3_Q15_128);
+ y128p[15] = mulhi_int16(y128p[15],ONE_OVER_SQRT3_Q15_128);
+ y128p+=16;
+ }
+ }
+
+ _mm_empty();
+ _m_empty();
}
+
+
static int16_t twa864[287*2*4];
static int16_t twb864[287*2*4];
@@ -10532,7 +10823,10 @@ int dfts_autoinit(void)
init_rad2(8192,tw8192);
init_rad4(16384,tw16384);
init_rad2(32768,tw32768);
+ init_rad4(65536,tw65536);
+ init_rad3(384,twa384i,twb384i);
+ init_rad3(768,twa768,twb768);
init_rad3(1536,twa1536,twb1536);
init_rad3(3072,twa3072,twb3072);
init_rad3(6144,twa6144,twb6144);
@@ -10569,7 +10863,7 @@ int dfts_autoinit(void)
init_rad2_rep(600,twa600);
init_rad3_rep(648,twa648,twb648);
init_rad4_rep(720,twa720,twb720,twc720);
- init_rad4_rep(768,twa768,twb768,twc768);
+ init_rad4_rep(768,twa768p,twb768p,twc768p);
init_rad3_rep(864,twa864,twb864);
init_rad3_rep(900,twa900,twb900);
init_rad4_rep(960,twa960,twb960,twc960);
diff --git a/openair1/PHY/TOOLS/tools_defs.h b/openair1/PHY/TOOLS/tools_defs.h
index 0c2bdd69be..4122c5963d 100644
--- a/openair1/PHY/TOOLS/tools_defs.h
+++ b/openair1/PHY/TOOLS/tools_defs.h
@@ -436,6 +436,7 @@ This function performs optimized fixed-point radix-2 FFT/IFFT.
SZ_DEF(128) \
SZ_DEF(256) \
SZ_DEF(512) \
+ SZ_DEF(768) \
SZ_DEF(1024) \
SZ_DEF(1536) \
SZ_DEF(2048) \
@@ -445,10 +446,13 @@ This function performs optimized fixed-point radix-2 FFT/IFFT.
SZ_DEF(8192) \
SZ_DEF(9216) \
SZ_DEF(12288) \
+ SZ_DEF(16384) \
SZ_DEF(18432) \
SZ_DEF(24576) \
+ SZ_DEF(32768) \
SZ_DEF(36864) \
SZ_DEF(49152) \
+ SZ_DEF(65536) \
SZ_DEF(73728) \
SZ_DEF(98304)
@@ -507,6 +511,8 @@ dft_size_idx_t get_dft(int ofdm_symbol_size)
return DFT_256;
case 512:
return DFT_512;
+ case 768:
+ return DFT_768;
case 1024:
return DFT_1024;
case 1536:
@@ -591,6 +597,8 @@ idft_size_idx_t get_idft(int ofdm_symbol_size)
return IDFT_256;
case 512:
return IDFT_512;
+ case 768:
+ return IDFT_768;
case 1024:
return IDFT_1024;
case 1536:
diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h
index 675c41c6be..0048cf5f75 100644
--- a/openair1/PHY/defs_gNB.h
+++ b/openair1/PHY/defs_gNB.h
@@ -225,6 +225,11 @@ typedef struct {
gNB_PRACH_list_t list[NUMBER_OF_NR_PRACH_MAX];
} NR_gNB_PRACH;
+typedef struct {
+ uint8_t NumPRSResources;
+ prs_config_t prs_cfg[NR_MAX_PRS_RESOURCES_PER_SET];
+} NR_gNB_PRS;
+
typedef struct {
/// Nfapi ULSCH PDU
nfapi_nr_pusch_pdu_t ulsch_pdu;
@@ -737,6 +742,7 @@ typedef struct PHY_VARS_gNB_s {
NR_gNB_PBCH pbch;
NR_gNB_COMMON common_vars;
NR_gNB_PRACH prach_vars;
+ NR_gNB_PRS prs_vars;
NR_gNB_PUSCH *pusch_vars[NUMBER_OF_NR_ULSCH_MAX];
NR_gNB_PUCCH_t *pucch[NUMBER_OF_NR_PUCCH_MAX];
NR_gNB_SRS_t *srs[NUMBER_OF_NR_SRS_MAX];
@@ -790,6 +796,9 @@ typedef struct PHY_VARS_gNB_s {
// Mask of occupied RBs, per symbol and PRB
uint32_t rb_mask_ul[14][9];
+ /// PRS sequence
+ uint32_t ****nr_gold_prs;
+
/// Indicator set to 0 after first SR
uint8_t first_sr[NUMBER_OF_NR_SR_MAX];
diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h
index d43c222a24..b5d1814077 100644
--- a/openair1/PHY/defs_nr_UE.h
+++ b/openair1/PHY/defs_nr_UE.h
@@ -347,6 +347,18 @@ typedef struct {
int32_t **ptrs_re_per_slot;
} NR_UE_PDSCH;
+#define NR_PRS_IDFT_OVERSAMP_FACTOR 1 // IDFT oversampling factor for NR PRS channel estimates in time domain, ALLOWED value 16x, and 1x is default(ie. IDFT size is frame_params->ofdm_symbol_size)
+typedef struct {
+ prs_config_t prs_cfg;
+ int32_t reserved;
+ prs_meas_t **prs_meas;
+} NR_PRS_RESOURCE_t;
+
+typedef struct {
+ uint8_t NumPRSResources;
+ NR_PRS_RESOURCE_t prs_resource[NR_MAX_PRS_RESOURCES_PER_SET];
+} NR_UE_PRS;
+
#define NR_PDCCH_DEFS_NR_UE
#define NR_NBR_CORESET_ACT_BWP 3 // The number of CoreSets per BWP is limited to 3 (including initial CORESET: ControlResourceId 0)
#define NR_NBR_SEARCHSPACE_ACT_BWP 10 // The number of SearchSpaces per BWP is limited to 10 (including initial SEARCHSPACE: SearchSpaceId 0)
@@ -723,7 +735,9 @@ typedef struct {
NR_UE_DLSCH_t *dlsch_ra[NUMBER_OF_CONNECTED_gNB_MAX];
NR_UE_DLSCH_t *dlsch_p[NUMBER_OF_CONNECTED_gNB_MAX];
NR_UE_DLSCH_t *dlsch_MCH[NUMBER_OF_CONNECTED_gNB_MAX];
-
+ NR_UE_PRS *prs_vars[NR_MAX_PRS_COMB_SIZE];
+ uint8_t prs_active_gNBs;
+
//Paging parameters
uint32_t IMSImod1024;
uint32_t PF;
@@ -767,6 +781,9 @@ typedef struct {
/// PUSCH DMRS sequence
uint32_t ****nr_gold_pusch_dmrs;
+ // PRS sequence per gNB, per resource
+ uint32_t *****nr_gold_prs;
+
uint32_t X_u[64][839];
// flag to activate PRB based averaging of channel estimates
diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h
index c8a063fe19..c7ff4dc198 100644
--- a/openair1/PHY/defs_nr_common.h
+++ b/openair1/PHY/defs_nr_common.h
@@ -63,13 +63,19 @@
#define NR_PSS_LENGTH 127
#define NR_SSS_LENGTH 127
+#define NR_MAX_PRS_LENGTH 3264 //272*6(max allocation per RB)*2(QPSK)
+#define NR_MAX_PRS_INIT_LENGTH_DWORD 102 // ceil(NR_MAX_CSI_RS_LENGTH/32)
+#define NR_MAX_NUM_PRS_SYMB 12
+#define NR_MAX_PRS_COMB_SIZE 12
+#define NR_MAX_PRS_RESOURCES_PER_SET 64
+#define NR_MAX_PRS_MUTING_PATTERN_LENGTH 32
+
#define NR_PBCH_DMRS_LENGTH 144 // in mod symbols
#define NR_PBCH_DMRS_LENGTH_DWORD 10 // ceil(2(QPSK)*NR_PBCH_DMRS_LENGTH/32)
/*used for the resource mapping*/
#define NR_MAX_PDCCH_DMRS_LENGTH 576 // 16(L)*2(QPSK)*3(3 DMRS symbs per REG)*6(REG per CCE)
-#define NR_MAX_PDCCH_SIZE 8192 // It seems it is the max polar coded block size
-
+#define NR_MAX_PDCCH_SIZE 8192 // It seems it is the max polar coded block size
#define NR_MAX_DCI_PAYLOAD_SIZE 64
#define NR_MAX_DCI_SIZE 1728 //16(L)*2(QPSK)*9(12 RE per REG - 3(DMRS))*6(REG per CCE)
#define NR_MAX_DCI_SIZE_DWORD 54 // ceil(NR_MAX_DCI_SIZE/32)
@@ -383,7 +389,42 @@ struct NR_DL_FRAME_PARMS {
uint32_t ofdm_offset_divisor;
};
+// PRS config structures
+typedef struct {
+ uint16_t PRSResourceSetPeriod[2]; // [slot period, slot offset] of a PRS resource set
+ uint16_t PRSResourceOffset; // Slot offset of each PRS resource defined relative to the slot offset of the PRS resource set (0...511)
+ uint8_t PRSResourceRepetition; // Repetition factor for all PRS resources in resource set (1 /*default*/, 2, 4, 6, 8, 16, 32)
+ uint8_t PRSResourceTimeGap; // Slot offset between two consecutive repetition indices of all PRS resources in a PRS resource set (1 /*default*/, 2, 4, 6, 8, 16, 32)
+ uint16_t NumRB; // Number of PRBs allocated to all PRS resources in a PRS resource set (<= 272 and multiples of 4)
+ uint8_t NumPRSSymbols; // Number of OFDM symbols in a slot allocated to each PRS resource in a PRS resource set
+ uint8_t SymbolStart; // Starting OFDM symbol of each PRS resource in a PRS resource set
+ uint16_t RBOffset; // Starting PRB index of all PRS resources in a PRS resource set
+ uint8_t CombSize; // RE density of all PRS resources in a PRS resource set (2, 4, 6, 12)
+ uint8_t REOffset; // Starting RE offset in the first OFDM symbol of each PRS resource in a PRS resource set
+ uint32_t MutingPattern1[32]; // Muting bit pattern option-1, specified as [] or a binary-valued vector of length 2, 4, 6, 8, 16, or 32
+ uint32_t MutingPattern2[32]; // Muting bit pattern option-2, specified as [] or a binary-valued vector of length 2, 4, 6, 8, 16, or 32
+ uint8_t MutingBitRepetition; // Muting bit repetition factor, specified as 1, 2, 4, or 8
+ uint16_t NPRSID; // Sequence identity of each PRS resource in a PRS resource set, specified in the range [0, 4095]
+} prs_config_t;
+typedef struct {
+ int8_t gNB_id;
+ int32_t sfn;
+ int8_t slot;
+ int8_t rxAnt_idx;
+ int32_t dl_toa;
+ int32_t dl_aoa;
+ int32_t snr;
+ int32_t reserved;
+} prs_meas_t;
+
+// rel16 prs k_prime table as per ts138.211 sec.7.4.1.7.2
+#define K_PRIME_TABLE_ROW_SIZE 4
+#define K_PRIME_TABLE_COL_SIZE 12
+#define PRS_K_PRIME_TABLE { {0,1,0,1,0,1,0,1,0,1,0,1}, \
+ {0,2,1,3,0,2,1,3,0,2,1,3}, \
+ {0,3,1,4,2,5,0,3,1,4,2,5}, \
+ {0,6,3,9,1,7,4,10,2,8,5,11} };
#define KHz (1000UL)
#define MHz (1000*KHz)
diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
index 2ef231f5f5..179a9a7b0a 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
@@ -121,8 +121,9 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx,
PHY_VARS_gNB *gNB = msgTx->gNB;
NR_DL_FRAME_PARMS *fp=&gNB->frame_parms;
nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config;
- int offset = gNB->CC_id;
+ int offset = gNB->CC_id, slot_prs;
int txdataF_offset = slot*fp->samples_per_slot_wCP;
+ prs_config_t *prs_config = NULL;
if ((cfg->cell_config.frame_duplex_type.value == TDD) &&
(nr_slot_select(cfg,frame,slot) == NR_UPLINK_SLOT)) return;
@@ -135,6 +136,21 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx,
memset(&gNB->common_vars.beam_id[aa][slot*fp->symbols_per_slot],255,fp->symbols_per_slot*sizeof(uint8_t));
}
+ // Check for PRS slot - section 7.4.1.7.4 in 3GPP rel16 38.211
+ for(int rsc_id = 0; rsc_id < gNB->prs_vars.NumPRSResources; rsc_id++)
+ {
+ prs_config = &gNB->prs_vars.prs_cfg[rsc_id];
+ for (int i = 0; i < prs_config->PRSResourceRepetition; i++)
+ {
+ if( (((frame*fp->slots_per_frame + slot) - (prs_config->PRSResourceSetPeriod[1] + prs_config->PRSResourceOffset)+prs_config->PRSResourceSetPeriod[0])%prs_config->PRSResourceSetPeriod[0]) == i*prs_config->PRSResourceTimeGap )
+ {
+ slot_prs = (slot - i*prs_config->PRSResourceTimeGap + fp->slots_per_frame)%fp->slots_per_frame;
+ LOG_D(PHY,"gNB_TX: frame %d, slot %d, slot_prs %d, PRS Resource ID %d\n",frame, slot, slot_prs, rsc_id);
+ nr_generate_prs(gNB->nr_gold_prs[rsc_id][slot_prs],&gNB->common_vars.txdataF[0][txdataF_offset], AMP, prs_config, cfg, fp);
+ }
+ }
+ }
+
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_COMMON_TX,1);
for (int i=0; iLmax; i++) {
if (msgTx->ssb[i].active) {
@@ -182,6 +198,10 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx,
//apply the OFDM symbol rotation here
for (aa=0; aacarrier_config.num_tx_ant.value; aa++) {
apply_nr_rotation(fp,(int16_t*) &gNB->common_vars.txdataF[aa][txdataF_offset],slot,0,fp->Ncp==EXTENDED?12:14);
+
+ T(T_GNB_PHY_DL_OUTPUT_SIGNAL, T_INT(0),
+ T_INT(frame), T_INT(slot),
+ T_INT(aa), T_BUFFER(&gNB->common_vars.txdataF[aa][txdataF_offset], fp->samples_per_slot_wCP*sizeof(int32_t)));
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_TX+offset,0);
diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
index 363506c988..366ab0ee77 100644
--- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
@@ -1331,7 +1331,6 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
int frame_rx = proc->frame_rx;
int nr_slot_rx = proc->nr_slot_rx;
fapi_nr_config_request_t *cfg = &ue->nrUE_config;
-
NR_DL_FRAME_PARMS *fp = &ue->frame_parms;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_IN);
@@ -1410,6 +1409,29 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
}
}
+ // Check for PRS slot - section 7.4.1.7.4 in 3GPP rel16 38.211
+ for(int gNB_id = 0; gNB_id < ue->prs_active_gNBs; gNB_id++)
+ {
+ for(int rsc_id = 0; rsc_id < ue->prs_vars[gNB_id]->NumPRSResources; rsc_id++)
+ {
+ prs_config_t *prs_config = &ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg;
+ for (int i = 0; i < prs_config->PRSResourceRepetition; i++)
+ {
+ if( (((frame_rx*fp->slots_per_frame + nr_slot_rx) - (prs_config->PRSResourceSetPeriod[1] + prs_config->PRSResourceOffset) + prs_config->PRSResourceSetPeriod[0])%prs_config->PRSResourceSetPeriod[0]) == i*prs_config->PRSResourceTimeGap)
+ {
+ for(int j = prs_config->SymbolStart; j < (prs_config->SymbolStart+prs_config->NumPRSSymbols); j++)
+ {
+ nr_slot_fep(ue,
+ proc,
+ (j%fp->symbols_per_slot),
+ nr_slot_rx);
+ }
+ nr_prs_channel_estimation(gNB_id,rsc_id,i,ue,proc,fp);
+ }
+ } // for i
+ } // for rsc_id
+ } // for gNB_id
+
if ((frame_rx%64 == 0) && (nr_slot_rx==0)) {
LOG_I(NR_PHY,"============================================\n");
// fixed text + 8 HARQs rounds Ă 10 ("999999999/") + NULL
diff --git a/openair2/COMMON/prs_nr_paramdef.h b/openair2/COMMON/prs_nr_paramdef.h
new file mode 100644
index 0000000000..fe16b01fb2
--- /dev/null
+++ b/openair2/COMMON/prs_nr_paramdef.h
@@ -0,0 +1,136 @@
+/*
+ * 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.1 (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 openair2/COMMON/prs_nr_paramdef.f
+ * \brief definition of configuration parameters for PRS
+ * \author
+ * \date 2022
+ * \version 0.1
+ * \company EURECOM
+ * \email:
+ * \note
+ * \warning
+ */
+
+#ifndef __PRS_NR_PARAMDEF__H__
+#define __PRS_NR_PARAMDEF__H__
+
+/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+/* PRS configuration section names */
+#define CONFIG_STRING_PRS_LIST "PRSs"
+#define CONFIG_STRING_PRS_CONFIG "prs_config"
+
+
+/* Global parameters */
+#define CONFIG_STRING_ACTIVE_GNBs "Active_gNBs"
+#define HELP_STRING_ACTIVE_GNBs "Number of active gNBs simultaneously transmitting PRS signal to a UE\n"
+/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
+/* PRS configuration parameters */
+/* optname helpstr paramflags XXXptr defXXXval type numelt */
+/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
+#define PRS_GLOBAL_PARAMS_DESC { \
+{CONFIG_STRING_ACTIVE_GNBs, HELP_STRING_ACTIVE_GNBs, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0} \
+}
+
+#define PRS_ACTIVE_GNBS_IDX 0
+/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+/* PRS configuration parameters names */
+#define CONFIG_STRING_GNB_ID "gNB_id"
+#define CONFIG_STRING_NUM_PRS_RESOURCES "NumPRSResources"
+#define CONFIG_STRING_PRS_RESOURCE_SET_PERIOD_LIST "PRSResourceSetPeriod"
+#define CONFIG_STRING_PRS_SYMBOL_START_LIST "SymbolStart"
+#define CONFIG_STRING_PRS_NUM_SYMBOLS_LIST "NumPRSSymbols"
+#define CONFIG_STRING_PRS_NUM_RB "NumRB"
+#define CONFIG_STRING_PRS_RB_OFFSET "RBOffset"
+#define CONFIG_STRING_PRS_COMB_SIZE "CombSize"
+#define CONFIG_STRING_PRS_RE_OFFSET_LIST "REOffset"
+#define CONFIG_STRING_PRS_RESOURCE_OFFSET_LIST "PRSResourceOffset"
+#define CONFIG_STRING_PRS_RESOURCE_REPETITION "PRSResourceRepetition"
+#define CONFIG_STRING_PRS_RESOURCE_TIME_GAP "PRSResourceTimeGap"
+#define CONFIG_STRING_PRS_ID_LIST "NPRS_ID"
+#define CONFIG_STRING_PRS_MUTING_PATTERN1_LIST "MutingPattern1"
+#define CONFIG_STRING_PRS_MUTING_PATTERN2_LIST "MutingPattern2"
+#define CONFIG_STRING_PRS_MUTING_BIT_REPETITION "MutingBitRepetition"
+
+/* Help string for PRS parameters */
+#define HELP_STRING_GNB_ID "gNB index for UE (<= CombSize)\n"
+#define HELP_STRING_NUM_PRS_RESOURCES "Number of PRS resources in a PRS resource set\n"
+#define HELP_STRING_PRS_RESOURCE_SET_PERIOD_LIST "[slot period, slot offset] of a PRS resource set\n"
+#define HELP_STRING_PRS_SYMBOL_START_LIST "Starting OFDM symbol of each PRS resource in a PRS resource set\n"
+#define HELP_STRING_PRS_NUM_SYMBOLS_LIST "Number of OFDM symbols in a slot for each PRS resource in a PRS resource set\n"
+#define HELP_STRING_PRS_NUM_RB "Number of PRBs allocated to all PRS resources in a PRS resource set (<= 272 and multiples of 4)\n"
+#define HELP_STRING_PRS_RB_OFFSET "Starting PRB index of all PRS resources in a PRS resource set\n"
+#define HELP_STRING_PRS_COMB_SIZE "RE density of all PRS resources in a PRS resource set (2, 4, 6, 12)\n"
+#define HELP_STRING_PRS_RE_OFFSET_LIST "Starting RE offset in the first OFDM symbol of each PRS resource in a PRS resource set\n"
+#define HELP_STRING_PRS_RESOURCE_OFFSET_LIST "Slot offset of each PRS resource defined relative to the slot offset of the PRS resource set (0...511)\n"
+#define HELP_STRING_PRS_RESOURCE_REPETITION "Repetition factor for all PRS resources in resource set (1 /*default*/, 2, 4, 6, 8, 16, 32)\n"
+#define HELP_STRING_PRS_RESOURCE_TIME_GAP "Slot offset between two consecutive repetition indices of all PRS resources in a PRS resource set (1 /*default*/, 2, 4, 6, 8, 16, 32)\n"
+#define HELP_STRING_PRS_ID_LIST "Sequence identity of each PRS resource in a PRS resource set, specified in the range [0, 4095]\n"
+#define HELP_STRING_PRS_MUTING_PATTERN1_LIST "Muting bit pattern option-1, specified as [] or a binary-valued vector of length 2, 4, 6, 8, 16, or 32\n"
+#define HELP_STRING_PRS_MUTING_PATTERN2_LIST "Muting bit pattern option-2, specified as [] or a binary-valued vector of length 2, 4, 6, 8, 16, or 32\n"
+#define HELP_STRING_PRS_MUTING_BIT_REPETITION "Muting bit repetition factor, specified as 1, 2, 4, or 8\n"
+
+
+/*----------------------------------------------------------------------------------------------------------------------------------------------------------------*/
+/* PRS configuration parameters */
+/* optname helpstr paramflags XXXptr defXXXval type numelt */
+/*----------------------------------------------------------------------------------------------------------------------------------------------------------------*/
+#define PRS_PARAMS_DESC { \
+{CONFIG_STRING_GNB_ID, HELP_STRING_GNB_ID, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \
+{CONFIG_STRING_NUM_PRS_RESOURCES, HELP_STRING_NUM_PRS_RESOURCES, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \
+{CONFIG_STRING_PRS_RESOURCE_SET_PERIOD_LIST, HELP_STRING_PRS_RESOURCE_SET_PERIOD_LIST, 0, uptr:NULL, defintarrayval:0, TYPE_UINTARRAY, 0}, \
+{CONFIG_STRING_PRS_SYMBOL_START_LIST, HELP_STRING_PRS_SYMBOL_START_LIST, 0, uptr:NULL, defintarrayval:0, TYPE_UINTARRAY, 0}, \
+{CONFIG_STRING_PRS_NUM_SYMBOLS_LIST, HELP_STRING_PRS_NUM_SYMBOLS_LIST, 0, uptr:NULL, defintarrayval:0, TYPE_UINTARRAY, 0}, \
+{CONFIG_STRING_PRS_NUM_RB, HELP_STRING_PRS_NUM_RB, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \
+{CONFIG_STRING_PRS_RB_OFFSET, HELP_STRING_PRS_RB_OFFSET, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \
+{CONFIG_STRING_PRS_COMB_SIZE, HELP_STRING_PRS_COMB_SIZE, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \
+{CONFIG_STRING_PRS_RE_OFFSET_LIST, HELP_STRING_PRS_RE_OFFSET_LIST, 0, uptr:NULL, defintarrayval:0, TYPE_UINTARRAY, 0}, \
+{CONFIG_STRING_PRS_RESOURCE_OFFSET_LIST, HELP_STRING_PRS_RESOURCE_OFFSET_LIST, 0, uptr:NULL, defintarrayval:0, TYPE_UINTARRAY, 0}, \
+{CONFIG_STRING_PRS_RESOURCE_REPETITION, HELP_STRING_PRS_RESOURCE_REPETITION, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \
+{CONFIG_STRING_PRS_RESOURCE_TIME_GAP, HELP_STRING_PRS_RESOURCE_TIME_GAP, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \
+{CONFIG_STRING_PRS_ID_LIST, HELP_STRING_PRS_ID_LIST, 0, uptr:NULL, defintarrayval:0, TYPE_UINTARRAY, 0}, \
+{CONFIG_STRING_PRS_MUTING_PATTERN1_LIST, HELP_STRING_PRS_MUTING_PATTERN1_LIST, 0, uptr:NULL, defintarrayval:0, TYPE_UINTARRAY, 0}, \
+{CONFIG_STRING_PRS_MUTING_PATTERN2_LIST, HELP_STRING_PRS_MUTING_PATTERN2_LIST, 0, uptr:NULL, defintarrayval:0, TYPE_UINTARRAY, 0}, \
+{CONFIG_STRING_PRS_MUTING_BIT_REPETITION, HELP_STRING_PRS_MUTING_BIT_REPETITION, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0} \
+}
+
+#define PRS_GNB_ID 0
+#define NUM_PRS_RESOURCES 1
+#define PRS_RESOURCE_SET_PERIOD_LIST 2
+#define PRS_SYMBOL_START_LIST 3
+#define PRS_NUM_SYMBOLS_LIST 4
+#define PRS_NUM_RB 5
+#define PRS_RB_OFFSET 6
+#define PRS_COMB_SIZE 7
+#define PRS_RE_OFFSET_LIST 8
+#define PRS_RESOURCE_OFFSET_LIST 9
+#define PRS_RESOURCE_REPETITION 10
+#define PRS_RESOURCE_TIME_GAP 11
+#define PRS_ID_LIST 12
+#define PRS_MUTING_PATTERN1_LIST 13
+#define PRS_MUTING_PATTERN2_LIST 14
+#define PRS_MUTING_BIT_REPETITION 15
+
+/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+#endif
diff --git a/openair2/ENB_APP/enb_paramdef.h b/openair2/ENB_APP/enb_paramdef.h
index 0f7e762810..20a5807616 100644
--- a/openair2/ENB_APP/enb_paramdef.h
+++ b/openair2/ENB_APP/enb_paramdef.h
@@ -103,6 +103,8 @@ typedef enum {
#define CONFIG_STRING_RU_SL_AHEAD "sl_ahead"
#define CONFIG_STRING_RU_NR_FLAG "nr_flag"
#define CONFIG_STRING_RU_NR_SCS_FOR_RASTER "nr_scs_for_raster"
+#define CONFIG_STRING_RU_TX_SUBDEV "tx_subdev"
+#define CONFIG_STRING_RU_RX_SUBDEV "rx_subdev"
#define CONFIG_STRING_RU_RXFH_CORE_ID "rxfh_core_id"
#define CONFIG_STRING_RU_TXFH_CORE_ID "txfh_core_id"
#define CONFIG_STRING_RU_TP_CORES "tp_cores"
@@ -154,12 +156,14 @@ typedef enum {
#define RU_SL_AHEAD 30
#define RU_NR_FLAG 31
#define RU_NR_SCS_FOR_RASTER 32
-#define RU_RXFH_CORE_ID 33
-#define RU_TXFH_CORE_ID 34
-#define RU_TP_CORES 35
-#define RU_NUM_TP_CORES 36
-#define RU_NUM_INTERFACES 37
-#define RU_HALF_SLOT_PARALLELIZATION 38
+#define RU_TX_SUBDEV 33
+#define RU_RX_SUBDEV 34
+#define RU_RXFH_CORE_ID 35
+#define RU_TXFH_CORE_ID 36
+#define RU_TP_CORES 37
+#define RU_NUM_TP_CORES 38
+#define RU_NUM_INTERFACES 39
+#define RU_HALF_SLOT_PARALLELIZATION 40
/*-----------------------------------------------------------------------------------------------------------------------------------------*/
/* RU configuration parameters */
/* optname helpstr paramflags XXXptr defXXXval type numelt */
@@ -198,6 +202,8 @@ typedef enum {
{CONFIG_STRING_RU_SL_AHEAD, HLP_RU_SL_AHEAD, 0, iptr:NULL, defintval:6, TYPE_INT, 0}, \
{CONFIG_STRING_RU_NR_FLAG, HLP_RU_NR_FLAG, 0, iptr:NULL, defintval:0, TYPE_INT, 0}, \
{CONFIG_STRING_RU_NR_SCS_FOR_RASTER, HLP_RU_NR_SCS_FOR_RASTER, 0, iptr:NULL, defintval:1, TYPE_INT, 0}, \
+ {CONFIG_STRING_RU_TX_SUBDEV, NULL, 0, strptr:NULL, defstrval:"", TYPE_STRING, 0}, \
+ {CONFIG_STRING_RU_RX_SUBDEV, NULL, 0, strptr:NULL, defstrval:"", TYPE_STRING, 0}, \
{CONFIG_STRING_RU_RXFH_CORE_ID, HLP_RU_RXFH_CORE_ID, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \
{CONFIG_STRING_RU_TXFH_CORE_ID, HLP_RU_TXFH_CORE_ID, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \
{CONFIG_STRING_RU_TP_CORES, HLP_RU_TP_CORES, 0, uptr:NULL, defintarrayval:DEFRUTPCORES, TYPE_INTARRAY, 8}, \
diff --git a/openair2/GNB_APP/gnb_app.c b/openair2/GNB_APP/gnb_app.c
index b2fa3be46f..9263525b31 100644
--- a/openair2/GNB_APP/gnb_app.c
+++ b/openair2/GNB_APP/gnb_app.c
@@ -155,6 +155,7 @@ void *gNB_app_task(void *args_p)
LOG_I(PHY, "%s() Task ready initialize structures\n", __FUNCTION__);
RCconfig_NR_L1();
+ RCconfig_nr_prs();
if (RC.nb_nr_macrlc_inst>0) RCconfig_nr_macrlc();
diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c
index 10613d6f0f..bbd1098887 100644
--- a/openair2/GNB_APP/gnb_config.c
+++ b/openair2/GNB_APP/gnb_config.c
@@ -55,6 +55,7 @@
#include "nfapi_pnf.h"
//#include "L1_paramdef.h"
+#include "prs_nr_paramdef.h"
#include "L1_nr_paramdef.h"
#include "MACRLC_nr_paramdef.h"
#include "common/config/config_userapi.h"
@@ -671,6 +672,100 @@ void RCconfig_nr_flexran()
}
}
+void RCconfig_nr_prs(void)
+{
+ uint16_t j = 0, k = 0;
+ prs_config_t *prs_config = NULL;
+ char str[7][100] = {0};
+
+ paramdef_t PRS_Params[] = PRS_PARAMS_DESC;
+ paramlist_def_t PRS_ParamList = {CONFIG_STRING_PRS_CONFIG,NULL,0};
+ if (RC.gNB == NULL) {
+ RC.gNB = (PHY_VARS_gNB **)malloc((1+NUMBER_OF_gNB_MAX)*sizeof(PHY_VARS_gNB*));
+ LOG_I(NR_PHY,"RC.gNB = %p\n",RC.gNB);
+ memset(RC.gNB,0,(1+NUMBER_OF_gNB_MAX)*sizeof(PHY_VARS_gNB*));
+ }
+
+ config_getlist( &PRS_ParamList,PRS_Params,sizeof(PRS_Params)/sizeof(paramdef_t), NULL);
+
+ if (PRS_ParamList.numelt > 0) {
+ for (j = 0; j < RC.nb_nr_L1_inst; j++) {
+
+ if (RC.gNB[j] == NULL) {
+ RC.gNB[j] = (PHY_VARS_gNB *)malloc(sizeof(PHY_VARS_gNB));
+ LOG_I(NR_PHY,"RC.gNB[%d] = %p\n",j,RC.gNB[j]);
+ memset(RC.gNB[j],0,sizeof(PHY_VARS_gNB));
+ RC.gNB[j]->Mod_id = j;
+ }
+
+ RC.gNB[j]->prs_vars.NumPRSResources = *(PRS_ParamList.paramarray[j][NUM_PRS_RESOURCES].uptr);
+ for (k = 0; k < RC.gNB[j]->prs_vars.NumPRSResources; k++)
+ {
+ prs_config = &RC.gNB[j]->prs_vars.prs_cfg[k];
+ prs_config->PRSResourceSetPeriod[0] = PRS_ParamList.paramarray[j][PRS_RESOURCE_SET_PERIOD_LIST].uptr[0];
+ prs_config->PRSResourceSetPeriod[1] = PRS_ParamList.paramarray[j][PRS_RESOURCE_SET_PERIOD_LIST].uptr[1];
+ // per PRS resources parameters
+ prs_config->SymbolStart = PRS_ParamList.paramarray[j][PRS_SYMBOL_START_LIST].uptr[k];
+ prs_config->NumPRSSymbols = PRS_ParamList.paramarray[j][PRS_NUM_SYMBOLS_LIST].uptr[k];
+ prs_config->REOffset = PRS_ParamList.paramarray[j][PRS_RE_OFFSET_LIST].uptr[k];
+ prs_config->PRSResourceOffset = PRS_ParamList.paramarray[j][PRS_RESOURCE_OFFSET_LIST].uptr[k];
+ prs_config->NPRSID = PRS_ParamList.paramarray[j][PRS_ID_LIST].uptr[k];
+ // Common parameters to all PRS resources
+ prs_config->NumRB = *(PRS_ParamList.paramarray[j][PRS_NUM_RB].uptr);
+ prs_config->RBOffset = *(PRS_ParamList.paramarray[j][PRS_RB_OFFSET].uptr);
+ prs_config->CombSize = *(PRS_ParamList.paramarray[j][PRS_COMB_SIZE].uptr);
+ prs_config->PRSResourceRepetition = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_REPETITION].uptr);
+ prs_config->PRSResourceTimeGap = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_TIME_GAP].uptr);
+ prs_config->MutingBitRepetition = *(PRS_ParamList.paramarray[j][PRS_MUTING_BIT_REPETITION].uptr);
+ for (int l = 0; l < PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN1_LIST].numelt; l++)
+ {
+ prs_config->MutingPattern1[l] = PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN1_LIST].uptr[l];
+ if (k == 0) // print only for 0th resource
+ snprintf(str[5]+strlen(str[5]),sizeof(str[5])-strlen(str[5]),"%d, ",prs_config->MutingPattern1[l]);
+ }
+ for (int l = 0; l < PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN2_LIST].numelt; l++)
+ {
+ prs_config->MutingPattern2[l] = PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN2_LIST].uptr[l];
+ if (k == 0) // print only for 0th resource
+ snprintf(str[6]+strlen(str[6]),sizeof(str[6])-strlen(str[6]),"%d, ",prs_config->MutingPattern2[l]);
+ }
+
+ // print to buffer
+ snprintf(str[0]+strlen(str[0]),sizeof(str[0])-strlen(str[0]),"%d, ",prs_config->SymbolStart);
+ snprintf(str[1]+strlen(str[1]),sizeof(str[1])-strlen(str[1]),"%d, ",prs_config->NumPRSSymbols);
+ snprintf(str[2]+strlen(str[2]),sizeof(str[2])-strlen(str[2]),"%d, ",prs_config->REOffset);
+ snprintf(str[3]+strlen(str[3]),sizeof(str[3])-strlen(str[3]),"%d, ",prs_config->PRSResourceOffset);
+ snprintf(str[4]+strlen(str[4]),sizeof(str[4])-strlen(str[4]),"%d, ",prs_config->NPRSID);
+ } // for k
+
+ prs_config = &RC.gNB[j]->prs_vars.prs_cfg[0];
+ LOG_I(PHY, "-----------------------------------------\n");
+ LOG_I(PHY, "PRS Config for gNB_id %d @ %p\n", j, prs_config);
+ LOG_I(PHY, "-----------------------------------------\n");
+ LOG_I(PHY, "NumPRSResources \t%d\n", RC.gNB[j]->prs_vars.NumPRSResources);
+ LOG_I(PHY, "PRSResourceSetPeriod \t[%d, %d]\n", prs_config->PRSResourceSetPeriod[0], prs_config->PRSResourceSetPeriod[1]);
+ LOG_I(PHY, "NumRB \t\t\t%d\n", prs_config->NumRB);
+ LOG_I(PHY, "RBOffset \t\t%d\n", prs_config->RBOffset);
+ LOG_I(PHY, "CombSize \t\t%d\n", prs_config->CombSize);
+ LOG_I(PHY, "PRSResourceRepetition \t%d\n", prs_config->PRSResourceRepetition);
+ LOG_I(PHY, "PRSResourceTimeGap \t%d\n", prs_config->PRSResourceTimeGap);
+ LOG_I(PHY, "MutingBitRepetition \t%d\n", prs_config->MutingBitRepetition);
+ LOG_I(PHY, "SymbolStart \t\t[%s\b\b]\n", str[0]);
+ LOG_I(PHY, "NumPRSSymbols \t\t[%s\b\b]\n", str[1]);
+ LOG_I(PHY, "REOffset \t\t[%s\b\b]\n", str[2]);
+ LOG_I(PHY, "PRSResourceOffset \t[%s\b\b]\n", str[3]);
+ LOG_I(PHY, "NPRS_ID \t\t[%s\b\b]\n", str[4]);
+ LOG_I(PHY, "MutingPattern1 \t\t[%s\b\b]\n", str[5]);
+ LOG_I(PHY, "MutingPattern2 \t\t[%s\b\b]\n", str[6]);
+ LOG_I(PHY, "-----------------------------------------\n");
+ } // for j
+ }
+ else
+ {
+ LOG_E(PHY,"No " CONFIG_STRING_PRS_CONFIG " configuration found..!!\n");
+ }
+}
+
void RCconfig_NR_L1(void) {
int j;
paramdef_t GNBSParams[] = GNBSPARAMS_DESC;
@@ -2264,6 +2359,7 @@ void nr_read_config_and_init(void) {
uint32_t gnb_nb = RC.nb_nr_inst;
RCconfig_NR_L1();
+ RCconfig_nr_prs();
RCconfig_nr_macrlc();
LOG_I(PHY, "%s() RC.nb_nr_L1_inst:%d\n", __FUNCTION__, RC.nb_nr_L1_inst);
diff --git a/openair2/GNB_APP/gnb_config.h b/openair2/GNB_APP/gnb_config.h
index 013997f439..b75277545c 100644
--- a/openair2/GNB_APP/gnb_config.h
+++ b/openair2/GNB_APP/gnb_config.h
@@ -92,6 +92,7 @@ typedef struct ru_config_s {
*/
extern void NRRCconfig_RU(void);
extern void RCconfig_nr_flexran(void);
+extern void RCconfig_nr_prs(void);
extern void RCconfig_NR_L1(void);
extern void RCconfig_nr_macrlc(void);
extern int RCconfig_nr_gtpu(void );
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
index b51e16d0a8..5cf4bc295c 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
@@ -73,7 +73,7 @@ void clear_nr_nfapi_information(gNB_MAC_INST * gNB,
nfapi_nr_dl_tti_request_t *DL_req = &gNB->DL_req[0];
nfapi_nr_dl_tti_pdcch_pdu_rel15_t **pdcch = (nfapi_nr_dl_tti_pdcch_pdu_rel15_t **)gNB->pdcch_pdu_idx[CC_idP];
nfapi_nr_ul_tti_request_t *future_ul_tti_req =
- &gNB->UL_tti_req_ahead[CC_idP][(slotP + num_slots - 1) % num_slots];
+ &gNB->UL_tti_req_ahead[CC_idP][(slotP + num_slots - 1) % num_slots];
nfapi_nr_ul_dci_request_t *UL_dci_req = &gNB->UL_dci_req[0];
nfapi_nr_tx_data_request_t *TX_req = &gNB->TX_req[0];
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
index 136ca52b23..c347ea5bea 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
@@ -47,14 +47,14 @@ static void nr_fill_nfapi_pucch(gNB_MAC_INST *nrmac,
{
nfapi_nr_ul_tti_request_t *future_ul_tti_req =
&nrmac->UL_tti_req_ahead[0][pucch->ul_slot];
- AssertFatal(future_ul_tti_req->SFN == pucch->frame
- && future_ul_tti_req->Slot == pucch->ul_slot,
- "Current %4d.%2d : future UL_tti_req's frame.slot %4d.%2d does not match PUCCH %4d.%2d\n",
- frame,slot,
- future_ul_tti_req->SFN,
- future_ul_tti_req->Slot,
- pucch->frame,
- pucch->ul_slot);
+ if (future_ul_tti_req->SFN != pucch->frame || future_ul_tti_req->Slot != pucch->ul_slot)
+ LOG_W(MAC,
+ "Current %d.%d : future UL_tti_req's frame.slot %4d.%2d does not match PUCCH %4d.%2d\n",
+ frame,slot,
+ future_ul_tti_req->SFN,
+ future_ul_tti_req->Slot,
+ pucch->frame,
+ pucch->ul_slot);
// n_pdus is number of pdus, so, in the array, it is the index of the next free element
if (future_ul_tti_req->n_pdus >= sizeofArray(future_ul_tti_req->pdus_list) ) {
LOG_E(NR_MAC,"future_ul_tti_req->n_pdus %d is full, slot: %d, sr flag %d dropping request\n",
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
index 7f15adca94..87c37d9cfb 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
@@ -2062,17 +2062,18 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
/* PUSCH in a later slot, but corresponding DCI now! */
nfapi_nr_ul_tti_request_t *future_ul_tti_req = &RC.nrmac[module_id]->UL_tti_req_ahead[0][sched_pusch->slot];
- AssertFatal(future_ul_tti_req->SFN == sched_pusch->frame
- && future_ul_tti_req->Slot == sched_pusch->slot,
- "%d.%d future UL_tti_req's frame.slot %d.%d does not match PUSCH %d.%d\n",
- frame, slot,
- future_ul_tti_req->SFN,
- future_ul_tti_req->Slot,
- sched_pusch->frame,
- sched_pusch->slot);
+ if (future_ul_tti_req->SFN != sched_pusch->frame || future_ul_tti_req->Slot != sched_pusch->slot)
+ LOG_W(MAC,
+ "%d.%d future UL_tti_req's frame.slot %d.%d does not match PUSCH %d.%d\n",
+ frame, slot,
+ future_ul_tti_req->SFN,
+ future_ul_tti_req->Slot,
+ sched_pusch->frame,
+ sched_pusch->slot);
AssertFatal(future_ul_tti_req->n_pdus <
sizeof(future_ul_tti_req->pdus_list) / sizeof(future_ul_tti_req->pdus_list[0]),
"Invalid future_ul_tti_req->n_pdus %d\n", future_ul_tti_req->n_pdus);
+
future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE;
future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_pusch_pdu_t);
nfapi_nr_pusch_pdu_t *pusch_pdu = &future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pusch_pdu;
diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h
index f663c17d10..65bbf9a5a0 100755
--- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h
+++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h
@@ -284,5 +284,6 @@ int handle_bcch_dlsch(module_id_t module_id, int cc_id, unsigned int gNB_index,
int handle_dci(module_id_t module_id, int cc_id, unsigned int gNB_index, frame_t frame, int slot, fapi_nr_dci_indication_pdu_t *dci);
+
#endif
diff --git a/openair3/LPP/MESSAGES/37355-g60.asn b/openair3/LPP/MESSAGES/37355-g60.asn
new file mode 100644
index 0000000000..af7e51bd4c
--- /dev/null
+++ b/openair3/LPP/MESSAGES/37355-g60.asn
@@ -0,0 +1,6532 @@
+-- ASN1START
+
+LPP-PDU-Definitions {
+itu-t (0) identified-organization (4) etsi (0) mobileDomain (0)
+eps-Access (21) modules (3) lpp (7) version1 (1) lpp-PDU-Definitions (1) }
+
+DEFINITIONS AUTOMATIC TAGS ::=
+
+BEGIN
+
+-- ASN1STOP
+-- ASN1START
+
+LPP-Message ::= SEQUENCE {
+ transactionID LPP-TransactionID OPTIONAL, -- Need ON
+ endTransaction BOOLEAN,
+ sequenceNumber SequenceNumber OPTIONAL, -- Need ON
+ acknowledgement Acknowledgement OPTIONAL, -- Need ON
+ lpp-MessageBody LPP-MessageBody OPTIONAL -- Need ON
+}
+
+SequenceNumber ::= INTEGER (0..255)
+
+Acknowledgement ::= SEQUENCE {
+ ackRequested BOOLEAN,
+ ackIndicator SequenceNumber OPTIONAL
+}
+
+-- ASN1STOP
+-- ASN1START
+
+LPP-MessageBody ::= CHOICE {
+ c1 CHOICE {
+ requestCapabilities RequestCapabilities,
+ provideCapabilities ProvideCapabilities,
+ requestAssistanceData RequestAssistanceData,
+ provideAssistanceData ProvideAssistanceData,
+ requestLocationInformation RequestLocationInformation,
+ provideLocationInformation ProvideLocationInformation,
+ abort Abort,
+ error Error,
+ spare7 NULL, spare6 NULL, spare5 NULL, spare4 NULL,
+ spare3 NULL, spare2 NULL, spare1 NULL, spare0 NULL
+ },
+ messageClassExtension SEQUENCE {}
+}
+
+-- ASN1STOP
+-- ASN1START
+
+LPP-TransactionID ::= SEQUENCE {
+ initiator Initiator,
+ transactionNumber TransactionNumber,
+ ...
+}
+
+Initiator ::= ENUMERATED {
+ locationServer,
+ targetDevice,
+ ...
+}
+
+TransactionNumber ::= INTEGER (0..255)
+
+-- ASN1STOP
+-- ASN1START
+
+RequestCapabilities ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ c1 CHOICE {
+ requestCapabilities-r9 RequestCapabilities-r9-IEs,
+ spare3 NULL, spare2 NULL, spare1 NULL
+ },
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+RequestCapabilities-r9-IEs ::= SEQUENCE {
+ commonIEsRequestCapabilities CommonIEsRequestCapabilities OPTIONAL, -- Need ON
+ a-gnss-RequestCapabilities A-GNSS-RequestCapabilities OPTIONAL, -- Need ON
+ otdoa-RequestCapabilities OTDOA-RequestCapabilities OPTIONAL, -- Need ON
+ ecid-RequestCapabilities ECID-RequestCapabilities OPTIONAL, -- Need ON
+ epdu-RequestCapabilities EPDU-Sequence OPTIONAL, -- Need ON
+ ...,
+ [[ sensor-RequestCapabilities-r13 Sensor-RequestCapabilities-r13 OPTIONAL, -- Need ON
+ tbs-RequestCapabilities-r13 TBS-RequestCapabilities-r13 OPTIONAL, -- Need ON
+ wlan-RequestCapabilities-r13 WLAN-RequestCapabilities-r13 OPTIONAL, -- Need ON
+ bt-RequestCapabilities-r13 BT-RequestCapabilities-r13 OPTIONAL -- Need ON
+ ]],
+ [[ nr-ECID-RequestCapabilities-r16 NR-ECID-RequestCapabilities-r16 OPTIONAL, -- Need ON
+ nr-Multi-RTT-RequestCapabilities-r16
+ NR-Multi-RTT-RequestCapabilities-r16
+ OPTIONAL, -- Need ON
+ nr-DL-AoD-RequestCapabilities-r16
+ NR-DL-AoD-RequestCapabilities-r16 OPTIONAL, -- Need ON
+ nr-DL-TDOA-RequestCapabilities-r16
+ NR-DL-TDOA-RequestCapabilities-r16 OPTIONAL, -- Need ON
+ nr-UL-RequestCapabilities-r16 NR-UL-RequestCapabilities-r16 OPTIONAL -- Need ON
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+ProvideCapabilities ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ c1 CHOICE {
+ provideCapabilities-r9 ProvideCapabilities-r9-IEs,
+ spare3 NULL, spare2 NULL, spare1 NULL
+ },
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+ProvideCapabilities-r9-IEs ::= SEQUENCE {
+ commonIEsProvideCapabilities CommonIEsProvideCapabilities OPTIONAL,
+ a-gnss-ProvideCapabilities A-GNSS-ProvideCapabilities OPTIONAL,
+ otdoa-ProvideCapabilities OTDOA-ProvideCapabilities OPTIONAL,
+ ecid-ProvideCapabilities ECID-ProvideCapabilities OPTIONAL,
+ epdu-ProvideCapabilities EPDU-Sequence OPTIONAL,
+ ...,
+ [[ sensor-ProvideCapabilities-r13 Sensor-ProvideCapabilities-r13 OPTIONAL,
+ tbs-ProvideCapabilities-r13 TBS-ProvideCapabilities-r13 OPTIONAL,
+ wlan-ProvideCapabilities-r13 WLAN-ProvideCapabilities-r13 OPTIONAL,
+ bt-ProvideCapabilities-r13 BT-ProvideCapabilities-r13 OPTIONAL
+ ]],
+ [[ nr-ECID-ProvideCapabilities-r16 NR-ECID-ProvideCapabilities-r16 OPTIONAL,
+ nr-Multi-RTT-ProvideCapabilities-r16
+ NR-Multi-RTT-ProvideCapabilities-r16 OPTIONAL,
+ nr-DL-AoD-ProvideCapabilities-r16
+ NR-DL-AoD-ProvideCapabilities-r16 OPTIONAL,
+ nr-DL-TDOA-ProvideCapabilities-r16
+ NR-DL-TDOA-ProvideCapabilities-r16 OPTIONAL,
+ nr-UL-ProvideCapabilities-r16 NR-UL-ProvideCapabilities-r16 OPTIONAL
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+RequestAssistanceData ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ c1 CHOICE {
+ requestAssistanceData-r9 RequestAssistanceData-r9-IEs,
+ spare3 NULL, spare2 NULL, spare1 NULL
+ },
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+RequestAssistanceData-r9-IEs ::= SEQUENCE {
+ commonIEsRequestAssistanceData CommonIEsRequestAssistanceData OPTIONAL,
+ a-gnss-RequestAssistanceData A-GNSS-RequestAssistanceData OPTIONAL,
+ otdoa-RequestAssistanceData OTDOA-RequestAssistanceData OPTIONAL,
+ epdu-RequestAssistanceData EPDU-Sequence OPTIONAL,
+ ...,
+ [[ sensor-RequestAssistanceData-r14
+ Sensor-RequestAssistanceData-r14 OPTIONAL,
+ tbs-RequestAssistanceData-r14 TBS-RequestAssistanceData-r14 OPTIONAL,
+ wlan-RequestAssistanceData-r14 WLAN-RequestAssistanceData-r14 OPTIONAL
+ ]],
+ [[ nr-Multi-RTT-RequestAssistanceData-r16 NR-Multi-RTT-RequestAssistanceData-r16 OPTIONAL,
+ nr-DL-AoD-RequestAssistanceData-r16 NR-DL-AoD-RequestAssistanceData-r16 OPTIONAL,
+ nr-DL-TDOA-RequestAssistanceData-r16 NR-DL-TDOA-RequestAssistanceData-r16 OPTIONAL
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+ProvideAssistanceData ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ c1 CHOICE {
+ provideAssistanceData-r9 ProvideAssistanceData-r9-IEs,
+ spare3 NULL, spare2 NULL, spare1 NULL
+ },
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+ProvideAssistanceData-r9-IEs ::= SEQUENCE {
+ commonIEsProvideAssistanceData CommonIEsProvideAssistanceData OPTIONAL, -- Need ON
+ a-gnss-ProvideAssistanceData A-GNSS-ProvideAssistanceData OPTIONAL, -- Need ON
+ otdoa-ProvideAssistanceData OTDOA-ProvideAssistanceData OPTIONAL, -- Need ON
+ epdu-Provide-Assistance-Data EPDU-Sequence OPTIONAL, -- Need ON
+ ...,
+ [[
+ sensor-ProvideAssistanceData-r14 Sensor-ProvideAssistanceData-r14 OPTIONAL, -- Need ON
+ tbs-ProvideAssistanceData-r14 TBS-ProvideAssistanceData-r14 OPTIONAL, -- Need ON
+ wlan-ProvideAssistanceData-r14 WLAN-ProvideAssistanceData-r14 OPTIONAL -- Need ON
+ ]],
+ [[ nr-Multi-RTT-ProvideAssistanceData-r16
+ NR-Multi-RTT-ProvideAssistanceData-r16
+ OPTIONAL, -- Need ON
+ nr-DL-AoD-ProvideAssistanceData-r16
+ NR-DL-AoD-ProvideAssistanceData-r16 OPTIONAL, -- Need ON
+ nr-DL-TDOA-ProvideAssistanceData-r16
+ NR-DL-TDOA-ProvideAssistanceData-r16
+ OPTIONAL -- Need ON
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+RequestLocationInformation ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ c1 CHOICE {
+ requestLocationInformation-r9 RequestLocationInformation-r9-IEs,
+ spare3 NULL, spare2 NULL, spare1 NULL
+ },
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+RequestLocationInformation-r9-IEs ::= SEQUENCE {
+ commonIEsRequestLocationInformation
+ CommonIEsRequestLocationInformation OPTIONAL, -- Need ON
+ a-gnss-RequestLocationInformation A-GNSS-RequestLocationInformation OPTIONAL, -- Need ON
+ otdoa-RequestLocationInformation OTDOA-RequestLocationInformation OPTIONAL, -- Need ON
+ ecid-RequestLocationInformation ECID-RequestLocationInformation OPTIONAL, -- Need ON
+ epdu-RequestLocationInformation EPDU-Sequence OPTIONAL, -- Need ON
+ ...,
+ [[
+ sensor-RequestLocationInformation-r13
+ Sensor-RequestLocationInformation-r13
+ OPTIONAL, -- Need ON
+ tbs-RequestLocationInformation-r13 TBS-RequestLocationInformation-r13 OPTIONAL, -- Need ON
+ wlan-RequestLocationInformation-r13 WLAN-RequestLocationInformation-r13 OPTIONAL, -- Need ON
+ bt-RequestLocationInformation-r13 BT-RequestLocationInformation-r13 OPTIONAL -- Need ON
+ ]],
+ [[ nr-ECID-RequestLocationInformation-r16
+ NR-ECID-RequestLocationInformation-r16
+ OPTIONAL, -- Need ON
+ nr-Multi-RTT-RequestLocationInformation-r16
+ NR-Multi-RTT-RequestLocationInformation-r16
+ OPTIONAL, -- Need ON
+ nr-DL-AoD-RequestLocationInformation-r16
+ NR-DL-AoD-RequestLocationInformation-r16
+ OPTIONAL, -- Need ON
+ nr-DL-TDOA-RequestLocationInformation-r16
+ NR-DL-TDOA-RequestLocationInformation-r16
+ OPTIONAL -- Need ON
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+ProvideLocationInformation ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ c1 CHOICE {
+ provideLocationInformation-r9 ProvideLocationInformation-r9-IEs,
+ spare3 NULL, spare2 NULL, spare1 NULL
+ },
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+ProvideLocationInformation-r9-IEs ::= SEQUENCE {
+ commonIEsProvideLocationInformation
+ CommonIEsProvideLocationInformation OPTIONAL,
+ a-gnss-ProvideLocationInformation A-GNSS-ProvideLocationInformation OPTIONAL,
+ otdoa-ProvideLocationInformation OTDOA-ProvideLocationInformation OPTIONAL,
+ ecid-ProvideLocationInformation ECID-ProvideLocationInformation OPTIONAL,
+ epdu-ProvideLocationInformation EPDU-Sequence OPTIONAL,
+ ...,
+ [[
+ sensor-ProvideLocationInformation-r13
+ Sensor-ProvideLocationInformation-r13
+ OPTIONAL,
+ tbs-ProvideLocationInformation-r13 TBS-ProvideLocationInformation-r13 OPTIONAL,
+ wlan-ProvideLocationInformation-r13 WLAN-ProvideLocationInformation-r13 OPTIONAL,
+ bt-ProvideLocationInformation-r13 BT-ProvideLocationInformation-r13 OPTIONAL
+ ]],
+ [[ nr-ECID-ProvideLocationInformation-r16
+ NR-ECID-ProvideLocationInformation-r16 OPTIONAL,
+ nr-Multi-RTT-ProvideLocationInformation-r16
+ NR-Multi-RTT-ProvideLocationInformation-r16 OPTIONAL,
+ nr-DL-AoD-ProvideLocationInformation-r16
+ NR-DL-AoD-ProvideLocationInformation-r16 OPTIONAL,
+ nr-DL-TDOA-ProvideLocationInformation-r16
+ NR-DL-TDOA-ProvideLocationInformation-r16 OPTIONAL
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+Abort ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ c1 CHOICE {
+ abort-r9 Abort-r9-IEs,
+ spare3 NULL, spare2 NULL, spare1 NULL
+ },
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+Abort-r9-IEs ::= SEQUENCE {
+ commonIEsAbort CommonIEsAbort OPTIONAL, -- Need ON
+ ...,
+ epdu-Abort EPDU-Sequence OPTIONAL -- Need ON
+}
+
+-- ASN1STOP
+-- ASN1START
+
+Error ::= CHOICE {
+ error-r9 Error-r9-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+}
+
+Error-r9-IEs ::= SEQUENCE {
+ commonIEsError CommonIEsError OPTIONAL, -- Need ON
+ ...,
+ epdu-Error EPDU-Sequence OPTIONAL -- Need ON
+}
+-- ASN1STOP
+-- ASN1START
+
+AccessTypes ::= SEQUENCE {
+ accessTypes BIT STRING { eutra (0),
+ utra (1),
+ gsm (2),
+ nb-iot (3),
+ nr-v1510 (4) } (SIZE (1..8)),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+ARFCN-ValueEUTRA ::= INTEGER (0..maxEARFCN)
+
+ARFCN-ValueEUTRA-v9a0 ::= INTEGER (maxEARFCN-Plus1..maxEARFCN2)
+
+ARFCN-ValueEUTRA-r14 ::= INTEGER (0..maxEARFCN2)
+
+-- ASN1STOP
+-- ASN1START
+
+ARFCN-ValueNR-r15 ::= INTEGER (0..3279165)
+
+-- ASN1STOP
+-- ASN1START
+
+ARFCN-ValueUTRA ::= INTEGER (0..16383)
+
+-- ASN1STOP
+-- ASN1START
+
+CarrierFreq-NB-r14 ::= SEQUENCE {
+ carrierFreq-r14 ARFCN-ValueEUTRA-r14,
+ carrierFreqOffset-r14 CarrierFreqOffsetNB-r14 OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+CarrierFreqOffsetNB-r14 ::= ENUMERATED {
+ v-10, v-9, v-8, v-7, v-6, v-5, v-4, v-3, v-2, v-1, v-0dot5,
+ v0, v1, v2, v3, v4, v5, v6, v7, v8, v9
+ }
+
+-- ASN1STOP
+-- ASN1START
+
+CellGlobalIdEUTRA-AndUTRA ::= SEQUENCE {
+ plmn-Identity SEQUENCE {
+ mcc SEQUENCE (SIZE (3)) OF INTEGER (0..9),
+ mnc SEQUENCE (SIZE (2..3)) OF INTEGER (0..9)
+ },
+ cellIdentity CHOICE {
+ eutra BIT STRING (SIZE (28)),
+ utra BIT STRING (SIZE (32))
+ },
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+CellGlobalIdGERAN ::= SEQUENCE {
+ plmn-Identity SEQUENCE {
+ mcc SEQUENCE (SIZE (3)) OF INTEGER (0..9),
+ mnc SEQUENCE (SIZE (2..3)) OF INTEGER (0..9)
+ },
+ locationAreaCode BIT STRING (SIZE (16)),
+ cellIdentity BIT STRING (SIZE (16)),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+ECGI ::= SEQUENCE {
+ mcc SEQUENCE (SIZE (3)) OF INTEGER (0..9),
+ mnc SEQUENCE (SIZE (2..3)) OF INTEGER (0..9),
+ cellidentity BIT STRING (SIZE (28))
+}
+
+-- ASN1STOP
+-- ASN1START
+
+Ellipsoid-Point ::= SEQUENCE {
+ latitudeSign ENUMERATED {north, south},
+ degreesLatitude INTEGER (0..8388607), -- 23 bit field
+ degreesLongitude INTEGER (-8388608..8388607) -- 24 bit field
+}
+
+-- ASN1STOP
+-- ASN1START
+
+Ellipsoid-PointWithUncertaintyCircle ::= SEQUENCE {
+ latitudeSign ENUMERATED {north, south},
+ degreesLatitude INTEGER (0..8388607), -- 23 bit field
+ degreesLongitude INTEGER (-8388608..8388607), -- 24 bit field
+ uncertainty INTEGER (0..127)
+}
+
+-- ASN1STOP
+-- ASN1START
+
+EllipsoidPointWithUncertaintyEllipse ::= SEQUENCE {
+ latitudeSign ENUMERATED {north, south},
+ degreesLatitude INTEGER (0..8388607), -- 23 bit field
+ degreesLongitude INTEGER (-8388608..8388607), -- 24 bit field
+ uncertaintySemiMajor INTEGER (0..127),
+ uncertaintySemiMinor INTEGER (0..127),
+ orientationMajorAxis INTEGER (0..179),
+ confidence INTEGER (0..100)
+}
+
+-- ASN1STOP
+-- ASN1START
+
+EllipsoidPointWithAltitude ::= SEQUENCE {
+ latitudeSign ENUMERATED {north, south},
+ degreesLatitude INTEGER (0..8388607), -- 23 bit field
+ degreesLongitude INTEGER (-8388608..8388607), -- 24 bit field
+ altitudeDirection ENUMERATED {height, depth},
+ altitude INTEGER (0..32767) -- 15 bit field
+}
+
+-- ASN1STOP
+-- ASN1START
+
+EllipsoidPointWithAltitudeAndUncertaintyEllipsoid ::= SEQUENCE {
+ latitudeSign ENUMERATED {north, south},
+ degreesLatitude INTEGER (0..8388607), -- 23 bit field
+ degreesLongitude INTEGER (-8388608..8388607), -- 24 bit field
+ altitudeDirection ENUMERATED {height, depth},
+ altitude INTEGER (0..32767), -- 15 bit field
+ uncertaintySemiMajor INTEGER (0..127),
+ uncertaintySemiMinor INTEGER (0..127),
+ orientationMajorAxis INTEGER (0..179),
+ uncertaintyAltitude INTEGER (0..127),
+ confidence INTEGER (0..100)
+}
+
+-- ASN1STOP
+-- ASN1START
+
+EllipsoidArc ::= SEQUENCE {
+ latitudeSign ENUMERATED {north, south},
+ degreesLatitude INTEGER (0..8388607), -- 23 bit field
+ degreesLongitude INTEGER (-8388608..8388607), -- 24 bit field
+ innerRadius INTEGER (0..65535), -- 16 bit field,
+ uncertaintyRadius INTEGER (0..127),
+ offsetAngle INTEGER (0..179),
+ includedAngle INTEGER (0..179),
+ confidence INTEGER (0..100)
+}
+
+-- ASN1STOP
+-- ASN1START
+
+EPDU-Sequence ::= SEQUENCE (SIZE (1..maxEPDU)) OF EPDU
+
+maxEPDU INTEGER ::= 16
+
+EPDU ::= SEQUENCE {
+ ePDU-Identifier EPDU-Identifier,
+ ePDU-Body EPDU-Body
+}
+
+EPDU-Identifier ::= SEQUENCE {
+ ePDU-ID EPDU-ID,
+ ePDU-Name EPDU-Name OPTIONAL,
+ ...
+}
+
+EPDU-ID ::= INTEGER (1..256)
+
+EPDU-Name ::= VisibleString (SIZE (1..32))
+
+EPDU-Body ::= OCTET STRING
+
+-- ASN1STOP
+-- ASN1START
+
+FreqBandIndicatorNR-r16 ::= INTEGER (1..1024)
+
+-- ASN1STOP
+-- ASN1START
+
+HighAccuracyEllipsoidPointWithUncertaintyEllipse-r15 ::= SEQUENCE {
+ degreesLatitude-r15 INTEGER(-2147483648..2147483647),
+ degreesLongitude-r15 INTEGER(-2147483648..2147483647),
+ uncertaintySemiMajor-r15 INTEGER (0..255),
+ uncertaintySemiMinor-r15 INTEGER (0..255),
+ orientationMajorAxis-r15 INTEGER (0..179),
+ confidence-r15 INTEGER (0..100)
+}
+
+-- ASN1STOP
+-- ASN1START
+
+HighAccuracyEllipsoidPointWithAltitudeAndUncertaintyEllipsoid-r15 ::= SEQUENCE {
+ degreesLatitude-r15 INTEGER(-2147483648..2147483647),
+ degreesLongitude-r15 INTEGER(-2147483648..2147483647),
+ altitude-r15 INTEGER(-64000..1280000),
+ uncertaintySemiMajor-r15 INTEGER (0..255),
+ uncertaintySemiMinor-r15 INTEGER (0..255),
+ orientationMajorAxis-r15 INTEGER (0..179),
+ horizontalConfidence-r15 INTEGER (0..100),
+ uncertaintyAltitude-r15 INTEGER (0..255),
+ verticalConfidence-r15 INTEGER (0..100)
+}
+
+-- ASN1STOP
+-- ASN1START
+
+HorizontalVelocity ::= SEQUENCE {
+ bearing INTEGER(0..359),
+ horizontalSpeed INTEGER(0..2047)
+}
+
+-- ASN1STOP
+-- ASN1START
+
+HorizontalWithVerticalVelocity ::= SEQUENCE {
+ bearing INTEGER(0..359),
+ horizontalSpeed INTEGER(0..2047),
+ verticalDirection ENUMERATED{upward, downward},
+ verticalSpeed INTEGER(0..255)
+}
+
+-- ASN1STOP
+-- ASN1START
+
+HorizontalVelocityWithUncertainty ::= SEQUENCE {
+ bearing INTEGER(0..359),
+ horizontalSpeed INTEGER(0..2047),
+ uncertaintySpeed INTEGER(0..255)
+}
+
+-- ASN1STOP
+-- ASN1START
+
+HorizontalWithVerticalVelocityAndUncertainty ::= SEQUENCE {
+ bearing INTEGER(0..359),
+ horizontalSpeed INTEGER(0..2047),
+ verticalDirection ENUMERATED{upward, downward},
+ verticalSpeed INTEGER(0..255),
+ horizontalUncertaintySpeed INTEGER(0..255),
+ verticalUncertaintySpeed INTEGER(0..255)
+}
+
+-- ASN1STOP
+-- ASN1START
+
+LocationCoordinateTypes ::= SEQUENCE {
+ ellipsoidPoint BOOLEAN,
+ ellipsoidPointWithUncertaintyCircle BOOLEAN,
+ ellipsoidPointWithUncertaintyEllipse BOOLEAN,
+ polygon BOOLEAN,
+ ellipsoidPointWithAltitude BOOLEAN,
+ ellipsoidPointWithAltitudeAndUncertaintyEllipsoid BOOLEAN,
+ ellipsoidArc BOOLEAN,
+ ...,
+ [[
+ highAccuracyEllipsoidPointWithUncertaintyEllipse-r15
+ BOOLEAN OPTIONAL, -- Need ON
+ highAccuracyEllipsoidPointWithAltitudeAndUncertaintyEllipsoid-r15
+ BOOLEAN OPTIONAL -- Need ON
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NCGI-r15 ::= SEQUENCE {
+ mcc-r15 SEQUENCE (SIZE (3)) OF INTEGER (0..9),
+ mnc-r15 SEQUENCE (SIZE (2..3)) OF INTEGER (0..9),
+ nr-cellidentity-r15 BIT STRING (SIZE (36))
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-PhysCellID-r16 ::= INTEGER (0..1007)
+
+-- ASN1STOP
+-- ASN1START
+
+PeriodicAssistanceDataControlParameters-r15 ::= SEQUENCE {
+ periodicSessionID-r15 PeriodicSessionID-r15,
+ ...,
+ [[
+ updateCapabilities-r15 UpdateCapabilities-r15 OPTIONAL -- Need ON
+ ]]
+}
+
+PeriodicSessionID-r15 ::= SEQUENCE {
+ periodicSessionInitiator-r15 ENUMERATED { locationServer, targetDevice, ... },
+ periodicSessionNumber-r15 INTEGER (0..255),
+ ...
+}
+
+UpdateCapabilities-r15 ::= BIT STRING {primaryCellID-r15 (0)} (SIZE(1..8))
+
+-- ASN1STOP
+-- ASN1START
+
+Polygon ::= SEQUENCE (SIZE (3..15)) OF PolygonPoints
+
+PolygonPoints ::= SEQUENCE {
+ latitudeSign ENUMERATED {north, south},
+ degreesLatitude INTEGER (0..8388607), -- 23 bit field
+ degreesLongitude INTEGER (-8388608..8388607) -- 24 bit field
+}
+
+-- ASN1STOP
+-- ASN1START
+
+PositioningModes ::= SEQUENCE {
+ posModes BIT STRING { standalone (0),
+ ue-based (1),
+ ue-assisted (2)
+ } (SIZE (1..8)),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+SegmentationInfo-r14 ::= ENUMERATED { noMoreMessages, moreMessagesOnTheWay }
+
+-- ASN1STOP
+-- ASN1START
+
+VelocityTypes ::= SEQUENCE {
+ horizontalVelocity BOOLEAN,
+ horizontalWithVerticalVelocity BOOLEAN,
+ horizontalVelocityWithUncertainty BOOLEAN,
+ horizontalWithVerticalVelocityAndUncertainty BOOLEAN,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+CommonIEsRequestCapabilities ::= SEQUENCE {
+ ...,
+ [[
+ lpp-message-segmentation-req-r14 BIT STRING { serverToTarget (0),
+ targetToServer (1) } OPTIONAL -- Need ON
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+CommonIEsProvideCapabilities ::= SEQUENCE {
+ ...,
+ [[
+ segmentationInfo-r14 SegmentationInfo-r14 OPTIONAL, -- Cond Segmentation
+ lpp-message-segmentation-r14 BIT STRING { serverToTarget (0),
+ targetToServer (1) } OPTIONAL
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+CommonIEsRequestAssistanceData ::= SEQUENCE {
+ primaryCellID ECGI OPTIONAL, -- Cond EUTRA
+ ...,
+ [[
+ segmentationInfo-r14 SegmentationInfo-r14 OPTIONAL -- Cond Segmentation
+ ]],
+ [[
+ periodicAssistanceDataReq-r15
+ PeriodicAssistanceDataControlParameters-r15
+ OPTIONAL, -- Cond PerADreq
+ primaryCellID-r15 NCGI-r15 OPTIONAL -- Cond NR
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+CommonIEsProvideAssistanceData ::= SEQUENCE {
+ ...,
+ [[
+ segmentationInfo-r14 SegmentationInfo-r14 OPTIONAL -- Need ON
+ ]],
+ [[
+ periodicAssistanceData-r15 PeriodicAssistanceDataControlParameters-r15
+ OPTIONAL -- Cond PerAD
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+CommonIEsRequestLocationInformation ::= SEQUENCE {
+ locationInformationType LocationInformationType,
+ triggeredReporting TriggeredReportingCriteria OPTIONAL, -- Cond ECID
+ periodicalReporting PeriodicalReportingCriteria OPTIONAL, -- Need ON
+ additionalInformation AdditionalInformation OPTIONAL, -- Need ON
+ qos QoS OPTIONAL, -- Need ON
+ environment Environment OPTIONAL, -- Need ON
+ locationCoordinateTypes LocationCoordinateTypes OPTIONAL, -- Need ON
+ velocityTypes VelocityTypes OPTIONAL, -- Need ON
+ ...,
+ [[
+ messageSizeLimitNB-r14 MessageSizeLimitNB-r14 OPTIONAL -- Need ON
+ ]],
+ [[
+ segmentationInfo-r14 SegmentationInfo-r14 OPTIONAL -- Need ON
+ ]]
+}
+
+LocationInformationType ::= ENUMERATED {
+ locationEstimateRequired,
+ locationMeasurementsRequired,
+ locationEstimatePreferred,
+ locationMeasurementsPreferred,
+ ...
+}
+
+PeriodicalReportingCriteria ::= SEQUENCE {
+ reportingAmount ENUMERATED {
+ ra1, ra2, ra4, ra8, ra16, ra32,
+ ra64, ra-Infinity
+ } DEFAULT ra-Infinity,
+ reportingInterval ENUMERATED {
+ noPeriodicalReporting, ri0-25,
+ ri0-5, ri1, ri2, ri4, ri8, ri16, ri32, ri64
+ }
+}
+
+TriggeredReportingCriteria ::= SEQUENCE {
+ cellChange BOOLEAN,
+ reportingDuration ReportingDuration,
+ ...
+}
+
+ReportingDuration ::= INTEGER (0..255)
+
+AdditionalInformation ::= ENUMERATED {
+ onlyReturnInformationRequested,
+ mayReturnAditionalInformation,
+ ...
+}
+
+QoS ::= SEQUENCE {
+ horizontalAccuracy HorizontalAccuracy OPTIONAL, -- Need ON
+ verticalCoordinateRequest BOOLEAN,
+ verticalAccuracy VerticalAccuracy OPTIONAL, -- Need ON
+ responseTime ResponseTime OPTIONAL, -- Need ON
+ velocityRequest BOOLEAN,
+ ...,
+ [[ responseTimeNB-r14 ResponseTimeNB-r14 OPTIONAL -- Need ON
+ ]],
+ [[ horizontalAccuracyExt-r15 HorizontalAccuracyExt-r15 OPTIONAL, -- Need ON
+ verticalAccuracyExt-r15 VerticalAccuracyExt-r15 OPTIONAL -- Need ON
+ ]]
+}
+
+HorizontalAccuracy ::= SEQUENCE {
+ accuracy INTEGER(0..127),
+ confidence INTEGER(0..100),
+ ...
+}
+
+VerticalAccuracy ::= SEQUENCE {
+ accuracy INTEGER(0..127),
+ confidence INTEGER(0..100),
+ ...
+}
+
+HorizontalAccuracyExt-r15 ::= SEQUENCE {
+ accuracyExt-r15 INTEGER(0..255),
+ confidence-r15 INTEGER(0..100),
+ ...
+}
+
+VerticalAccuracyExt-r15 ::= SEQUENCE {
+ accuracyExt-r15 INTEGER(0..255),
+ confidence-r15 INTEGER(0..100),
+ ...
+}
+
+ResponseTime ::= SEQUENCE {
+ time INTEGER (1..128),
+ ...,
+ [[ responseTimeEarlyFix-r12 INTEGER (1..128) OPTIONAL -- Need ON
+ ]],
+ [[ unit-r15 ENUMERATED { ten-seconds, ... } OPTIONAL -- Need ON
+ ]]
+}
+
+ResponseTimeNB-r14 ::= SEQUENCE {
+ timeNB-r14 INTEGER (1..512),
+ responseTimeEarlyFixNB-r14 INTEGER (1..512) OPTIONAL, -- Need ON
+ ...,
+ [[ unitNB-r15 ENUMERATED { ten-seconds, ... } OPTIONAL -- Need ON
+ ]]
+}
+
+Environment ::= ENUMERATED {
+ badArea,
+ notBadArea,
+ mixedArea,
+ ...
+}
+
+MessageSizeLimitNB-r14 ::= SEQUENCE {
+ measurementLimit-r14 INTEGER (1..512) OPTIONAL, -- Need ON
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+CommonIEsProvideLocationInformation ::= SEQUENCE {
+ locationEstimate LocationCoordinates OPTIONAL,
+ velocityEstimate Velocity OPTIONAL,
+ locationError LocationError OPTIONAL,
+ ...,
+ [[ earlyFixReport-r12 EarlyFixReport-r12 OPTIONAL
+ ]],
+ [[ locationSource-r13 LocationSource-r13 OPTIONAL,
+ locationTimestamp-r13 UTCTime OPTIONAL
+ ]],
+ [[
+ segmentationInfo-r14 SegmentationInfo-r14 OPTIONAL -- Cond Segmentation
+ ]]
+}
+
+LocationCoordinates ::= CHOICE {
+ ellipsoidPoint Ellipsoid-Point,
+ ellipsoidPointWithUncertaintyCircle Ellipsoid-PointWithUncertaintyCircle,
+ ellipsoidPointWithUncertaintyEllipse EllipsoidPointWithUncertaintyEllipse,
+ polygon Polygon,
+ ellipsoidPointWithAltitude EllipsoidPointWithAltitude,
+ ellipsoidPointWithAltitudeAndUncertaintyEllipsoid
+ EllipsoidPointWithAltitudeAndUncertaintyEllipsoid,
+ ellipsoidArc EllipsoidArc,
+ ...,
+ highAccuracyEllipsoidPointWithUncertaintyEllipse-v1510
+ HighAccuracyEllipsoidPointWithUncertaintyEllipse-r15,
+ highAccuracyEllipsoidPointWithAltitudeAndUncertaintyEllipsoid-v1510
+ HighAccuracyEllipsoidPointWithAltitudeAndUncertaintyEllipsoid-r15
+}
+
+Velocity ::= CHOICE {
+ horizontalVelocity HorizontalVelocity,
+ horizontalWithVerticalVelocity HorizontalWithVerticalVelocity,
+ horizontalVelocityWithUncertainty HorizontalVelocityWithUncertainty,
+ horizontalWithVerticalVelocityAndUncertainty
+ HorizontalWithVerticalVelocityAndUncertainty,
+ ...
+}
+
+LocationError ::= SEQUENCE {
+ locationfailurecause LocationFailureCause,
+ ...
+}
+
+LocationFailureCause ::= ENUMERATED {
+ undefined,
+ requestedMethodNotSupported,
+ positionMethodFailure,
+ periodicLocationMeasurementsNotAvailable,
+ ...
+}
+
+EarlyFixReport-r12 ::= ENUMERATED {
+ noMoreMessages,
+ moreMessagesOnTheWay
+}
+
+LocationSource-r13 ::= BIT STRING { a-gnss (0),
+ wlan (1),
+ bt (2),
+ tbs (3),
+ sensor (4),
+ ha-gnss-v1510 (5),
+ motion-sensor-v1550 (6),
+ dl-tdoa-r16 (7),
+ dl-aod-r16 (8) } (SIZE(1..16))
+
+-- ASN1STOP
+-- ASN1START
+
+CommonIEsAbort ::= SEQUENCE {
+ abortCause ENUMERATED {
+ undefined,
+ stopPeriodicReporting,
+ targetDeviceAbort,
+ networkAbort,
+ ...,
+ stopPeriodicAssistanceDataDelivery-v1510
+ }
+}
+
+-- ASN1STOP
+-- ASN1START
+
+CommonIEsError ::= SEQUENCE {
+ errorCause ENUMERATED {
+ undefined,
+ lppMessageHeaderError,
+ lppMessageBodyError,
+ epduError,
+ incorrectDataValue,
+ ...,
+ lppSegmentationError-v1450
+ }
+}
+
+-- ASN1STOP
+-- ASN1START
+
+DL-PRS-ID-Info-r16 ::= SEQUENCE {
+ dl-PRS-ID-r16 INTEGER (0..255),
+ nr-DL-PRS-ResourceID-List-r16 SEQUENCE (SIZE (1..nrMaxResourceIDs-r16)) OF
+ NR-DL-PRS-ResourceID-r16
+ OPTIONAL, -- Need ON
+ nr-DL-PRS-ResourceSetID-r16 NR-DL-PRS-ResourceSetID-r16
+ OPTIONAL -- Need ON
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-AdditionalPathList-r16 ::= SEQUENCE (SIZE(1..2)) OF NR-AdditionalPath-r16
+
+NR-AdditionalPath-r16 ::= SEQUENCE {
+ nr-RelativeTimeDifference-r16 CHOICE {
+ k0-r16 INTEGER(0..16351),
+ k1-r16 INTEGER(0..8176),
+ k2-r16 INTEGER(0..4088),
+ k3-r16 INTEGER(0..2044),
+ k4-r16 INTEGER(0..1022),
+ k5-r16 INTEGER(0..511),
+ ...
+ },
+ nr-PathQuality-r16 NR-TimingQuality-r16 OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-PRS-AssistanceData-r16 ::= SEQUENCE {
+ nr-DL-PRS-ReferenceInfo-r16 DL-PRS-ID-Info-r16,
+ nr-DL-PRS-AssistanceDataList-r16 SEQUENCE (SIZE (1..nrMaxFreqLayers-r16)) OF
+ NR-DL-PRS-AssistanceDataPerFreq-r16,
+ nr-SSB-Config-r16 SEQUENCE (SIZE (1..nrMaxTRPs-r16)) OF
+ NR-SSB-Config-r16 OPTIONAL, -- Need ON
+ ...
+}
+
+NR-DL-PRS-AssistanceDataPerFreq-r16 ::= SEQUENCE {
+ nr-DL-PRS-PositioningFrequencyLayer-r16
+ NR-DL-PRS-PositioningFrequencyLayer-r16,
+ nr-DL-PRS-AssistanceDataPerFreq-r16 SEQUENCE (SIZE (1..nrMaxTRPsPerFreq-r16)) OF
+ NR-DL-PRS-AssistanceDataPerTRP-r16,
+ ...
+}
+
+NR-DL-PRS-AssistanceDataPerTRP-r16 ::= SEQUENCE {
+ dl-PRS-ID-r16 INTEGER (0..255),
+ nr-PhysCellID-r16 NR-PhysCellID-r16 OPTIONAL, -- Need ON
+ nr-CellGlobalID-r16 NCGI-r15 OPTIONAL, -- Need ON
+ nr-ARFCN-r16 ARFCN-ValueNR-r15 OPTIONAL, -- Need ON
+ nr-DL-PRS-SFN0-Offset-r16 NR-DL-PRS-SFN0-Offset-r16,
+ nr-DL-PRS-ExpectedRSTD-r16 INTEGER (-3841..3841),
+ nr-DL-PRS-ExpectedRSTD-Uncertainty-r16
+ INTEGER (0..246),
+ nr-DL-PRS-Info-r16 NR-DL-PRS-Info-r16,
+ ...,
+ [[
+ prs-OnlyTP-r16 ENUMERATED { true } OPTIONAL -- Need ON
+ ]]
+}
+
+NR-DL-PRS-PositioningFrequencyLayer-r16 ::= SEQUENCE {
+ dl-PRS-SubcarrierSpacing-r16 ENUMERATED {kHz15, kHz30, kHz60, kHz120, ...},
+ dl-PRS-ResourceBandwidth-r16 INTEGER (1..63),
+ dl-PRS-StartPRB-r16 INTEGER (0..2176),
+ dl-PRS-PointA-r16 ARFCN-ValueNR-r15,
+ dl-PRS-CombSizeN-r16 ENUMERATED {n2, n4, n6, n12, ...},
+ dl-PRS-CyclicPrefix-r16 ENUMERATED {normal, extended, ...},
+ ...
+}
+
+NR-DL-PRS-SFN0-Offset-r16 ::= SEQUENCE {
+ sfn-Offset-r16 INTEGER (0..1023),
+ integerSubframeOffset-r16 INTEGER (0..9),
+ ...}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-PRS-BeamInfo-r16 ::= SEQUENCE (SIZE (1..nrMaxFreqLayers-r16)) OF
+ NR-DL-PRS-BeamInfoPerFreqLayer-r16
+
+NR-DL-PRS-BeamInfoPerFreqLayer-r16 ::= SEQUENCE (SIZE (1..nrMaxTRPsPerFreq-r16)) OF
+ NR-DL-PRS-BeamInfoPerTRP-r16
+
+NR-DL-PRS-BeamInfoPerTRP-r16 ::= SEQUENCE {
+ dl-PRS-ID-r16 INTEGER (0..255),
+ nr-PhysCellID-r16 NR-PhysCellID-r16 OPTIONAL, -- Need ON
+ nr-CellGlobalID-r16 NCGI-r15 OPTIONAL, -- Need ON
+ nr-ARFCN-r16 ARFCN-ValueNR-r15 OPTIONAL, -- Need ON
+ associated-DL-PRS-ID-r16 INTEGER (0..255) OPTIONAL, -- Need OP
+ lcs-GCS-TranslationParameter-r16 LCS-GCS-TranslationParameter-r16
+ OPTIONAL, -- Need OP
+ dl-PRS-BeamInfoSet-r16 DL-PRS-BeamInfoSet-r16 OPTIONAL, -- Need OP
+ ...
+}
+
+DL-PRS-BeamInfoSet-r16 ::= SEQUENCE (SIZE(1..nrMaxSetsPerTrpPerFreqLayer-r16)) OF
+ DL-PRS-BeamInfoResourceSet-r16
+
+DL-PRS-BeamInfoResourceSet-r16 ::= SEQUENCE (SIZE(1..nrMaxResourcesPerSet-r16)) OF
+ DL-PRS-BeamInfoElement-r16
+
+DL-PRS-BeamInfoElement-r16 ::= SEQUENCE {
+ dl-PRS-Azimuth-r16 INTEGER (0..359),
+ dl-PRS-Azimuth-fine-r16 INTEGER (0..9) OPTIONAL, -- Need ON
+ dl-PRS-Elevation-r16 INTEGER (0..180) OPTIONAL, -- Need ON
+ dl-PRS-Elevation-fine-r16 INTEGER (0..9) OPTIONAL, -- Need ON
+ ...
+}
+
+LCS-GCS-TranslationParameter-r16 ::= SEQUENCE {
+ alpha-r16 INTEGER (0..359),
+ alpha-fine-r16 INTEGER (0..9) OPTIONAL, -- Cond AzElFine
+ beta-r16 INTEGER (0..359),
+ beta-fine-r16 INTEGER (0..9) OPTIONAL, -- Cond AzElFine
+ gamma-r16 INTEGER (0..359),
+ gamma-fine-r16 INTEGER (0..9) OPTIONAL, -- Cond AzElFine
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-PRS-Info-r16 ::= SEQUENCE {
+ nr-DL-PRS-ResourceSetList-r16 SEQUENCE (SIZE (1..nrMaxSetsPerTrpPerFreqLayer-r16)) OF
+ NR-DL-PRS-ResourceSet-r16,
+ ...
+}
+
+NR-DL-PRS-ResourceSet-r16 ::= SEQUENCE {
+ nr-DL-PRS-ResourceSetID-r16 NR-DL-PRS-ResourceSetID-r16,
+ dl-PRS-Periodicity-and-ResourceSetSlotOffset-r16
+ NR-DL-PRS-Periodicity-and-ResourceSetSlotOffset-r16,
+ dl-PRS-ResourceRepetitionFactor-r16 ENUMERATED {n2, n4, n6, n8, n16, n32, ...}
+ OPTIONAL, -- Need OP
+ dl-PRS-ResourceTimeGap-r16 ENUMERATED {s1, s2, s4, s8, s16, s32, ...}
+ OPTIONAL, -- Cond Rep
+ dl-PRS-NumSymbols-r16 ENUMERATED {n2, n4, n6, n12, ...},
+ dl-PRS-MutingOption1-r16 DL-PRS-MutingOption1-r16 OPTIONAL, -- Need OP
+ dl-PRS-MutingOption2-r16 DL-PRS-MutingOption2-r16 OPTIONAL, -- Need OP
+ dl-PRS-ResourcePower-r16 INTEGER (-60..50),
+ dl-PRS-ResourceList-r16 SEQUENCE (SIZE (1..nrMaxResourcesPerSet-r16)) OF
+ NR-DL-PRS-Resource-r16,
+ ...
+}
+
+DL-PRS-MutingOption1-r16 ::= SEQUENCE {
+ dl-prs-MutingBitRepetitionFactor-r16
+ ENUMERATED { n1, n2, n4, n8, ... } OPTIONAL, -- Need OP
+ nr-option1-muting-r16 NR-MutingPattern-r16,
+ ...
+}
+
+DL-PRS-MutingOption2-r16 ::= SEQUENCE {
+ nr-option2-muting-r16 NR-MutingPattern-r16,
+ ...
+}
+
+NR-MutingPattern-r16 ::= CHOICE {
+ po2-r16 BIT STRING (SIZE(2)),
+ po4-r16 BIT STRING (SIZE(4)),
+ po6-r16 BIT STRING (SIZE(6)),
+ po8-r16 BIT STRING (SIZE(8)),
+ po16-r16 BIT STRING (SIZE(16)),
+ po32-r16 BIT STRING (SIZE(32)),
+ ...
+}
+
+NR-DL-PRS-Resource-r16 ::= SEQUENCE {
+ nr-DL-PRS-ResourceID-r16 NR-DL-PRS-ResourceID-r16,
+ dl-PRS-SequenceID-r16 INTEGER (0.. 4095),
+ dl-PRS-CombSizeN-AndReOffset-r16 CHOICE {
+ n2-r16 INTEGER (0..1),
+ n4-r16 INTEGER (0..3),
+ n6-r16 INTEGER (0..5),
+ n12-r16 INTEGER (0..11),
+ ...
+ },
+ dl-PRS-ResourceSlotOffset-r16 INTEGER (0..nrMaxResourceOffsetValue-1-r16),
+ dl-PRS-ResourceSymbolOffset-r16 INTEGER (0..12),
+ dl-PRS-QCL-Info-r16 DL-PRS-QCL-Info-r16 OPTIONAL, --Need ON
+ ...
+}
+
+DL-PRS-QCL-Info-r16 ::= CHOICE {
+ ssb-r16 SEQUENCE {
+ pci-r16 NR-PhysCellID-r16,
+ ssb-Index-r16 INTEGER (0..63),
+ rs-Type-r16 ENUMERATED {typeC, typeD, typeC-plus-typeD}
+ },
+ dl-PRS-r16 SEQUENCE {
+ qcl-DL-PRS-ResourceID-r16 NR-DL-PRS-ResourceID-r16,
+ qcl-DL-PRS-ResourceSetID-r16 NR-DL-PRS-ResourceSetID-r16
+ }
+}
+
+NR-DL-PRS-Periodicity-and-ResourceSetSlotOffset-r16 ::= CHOICE {
+ scs15-r16 CHOICE {
+ n4-r16 INTEGER (0..3),
+ n5-r16 INTEGER (0..4),
+ n8-r16 INTEGER (0..7),
+ n10-r16 INTEGER (0..9),
+ n16-r16 INTEGER (0..15),
+ n20-r16 INTEGER (0..19),
+ n32-r16 INTEGER (0..31),
+ n40-r16 INTEGER (0..39),
+ n64-r16 INTEGER (0..63),
+ n80-r16 INTEGER (0..79),
+ n160-r16 INTEGER (0..159),
+ n320-r16 INTEGER (0..319),
+ n640-r16 INTEGER (0..639),
+ n1280-r16 INTEGER (0..1279),
+ n2560-r16 INTEGER (0..2559),
+ n5120-r16 INTEGER (0..5119),
+ n10240-r16 INTEGER (0..10239),
+ ...
+ },
+ scs30-r16 CHOICE {
+ n8-r16 INTEGER (0..7),
+ n10-r16 INTEGER (0..9),
+ n16-r16 INTEGER (0..15),
+ n20-r16 INTEGER (0..19),
+ n32-r16 INTEGER (0..31),
+ n40-r16 INTEGER (0..39),
+ n64-r16 INTEGER (0..63),
+ n80-r16 INTEGER (0..79),
+ n128-r16 INTEGER (0..127),
+ n160-r16 INTEGER (0..159),
+ n320-r16 INTEGER (0..319),
+ n640-r16 INTEGER (0..639),
+ n1280-r16 INTEGER (0..1279),
+ n2560-r16 INTEGER (0..2559),
+ n5120-r16 INTEGER (0..5119),
+ n10240-r16 INTEGER (0..10239),
+ n20480-r16 INTEGER (0..20479),
+ ...
+ },
+ scs60-r16 CHOICE {
+ n16-r16 INTEGER (0..15),
+ n20-r16 INTEGER (0..19),
+ n32-r16 INTEGER (0..31),
+ n40-r16 INTEGER (0..39),
+ n64-r16 INTEGER (0..63),
+ n80-r16 INTEGER (0..79),
+ n128-r16 INTEGER (0..127),
+ n160-r16 INTEGER (0..159),
+ n256-r16 INTEGER (0..255),
+ n320-r16 INTEGER (0..319),
+ n640-r16 INTEGER (0..639),
+ n1280-r16 INTEGER (0..1279),
+ n2560-r16 INTEGER (0..2559),
+ n5120-r16 INTEGER (0..5119),
+ n10240-r16 INTEGER (0..10239),
+ n20480-r16 INTEGER (0..20479),
+ n40960-r16 INTEGER (0..40959),
+ ...
+ },
+ scs120-r16 CHOICE {
+ n32-r16 INTEGER (0..31),
+ n40-r16 INTEGER (0..39),
+ n64-r16 INTEGER (0..63),
+ n80-r16 INTEGER (0..79),
+ n128-r16 INTEGER (0..127),
+ n160-r16 INTEGER (0..159),
+ n256-r16 INTEGER (0..255),
+ n320-r16 INTEGER (0..319),
+ n512-r16 INTEGER (0..511),
+ n640-r16 INTEGER (0..639),
+ n1280-r16 INTEGER (0..1279),
+ n2560-r16 INTEGER (0..2559),
+ n5120-r16 INTEGER (0..5119),
+ n10240-r16 INTEGER (0..10239),
+ n20480-r16 INTEGER (0..20479),
+ n40960-r16 INTEGER (0..40959),
+ n81920-r16 INTEGER (0..81919),
+ ...
+ },
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-PRS-ProcessingCapability-r16 ::= SEQUENCE {
+ prs-ProcessingCapabilityBandList-r16 SEQUENCE (SIZE (1..nrMaxBands-r16)) OF
+ PRS-ProcessingCapabilityPerBand-r16,
+ maxSupportedFreqLayers-r16 INTEGER (1..4),
+ simulLTE-NR-PRS-r16 ENUMERATED { supported} OPTIONAL,
+ ...
+}
+
+PRS-ProcessingCapabilityPerBand-r16 ::= SEQUENCE {
+ freqBandIndicatorNR-r16 FreqBandIndicatorNR-r16,
+ supportedBandwidthPRS-r16 CHOICE {
+ fr1 ENUMERATED {mhz5, mhz10, mhz20, mhz40,
+ mhz50, mhz80, mhz100},
+ fr2 ENUMERATED {mhz50, mhz100, mhz200, mhz400},
+ ...
+ },
+ dl-PRS-BufferType-r16 ENUMERATED {type1, type2, ...},
+ durationOfPRS-Processing-r16 SEQUENCE {
+ durationOfPRS-ProcessingSymbols-r16 ENUMERATED {nDot125, nDot25, nDot5, n1,
+ n2, n4, n6, n8, n12, n16, n20, n25,
+ n30, n32, n35, n40, n45, n50},
+ durationOfPRS-ProcessingSymbolsInEveryTms-r16
+ ENUMERATED {n8, n16, n20, n30, n40, n80,
+ n160,n320, n640, n1280},
+ ...
+ },
+ maxNumOfDL-PRS-ResProcessedPerSlot-r16 SEQUENCE {
+ scs15-r16 ENUMERATED {n1, n2, n4, n8, n16, n24, n32,
+ n48, n64} OPTIONAL,
+ scs30-r16 ENUMERATED {n1, n2, n4, n8, n16, n24, n32,
+ n48, n64} OPTIONAL,
+ scs60-r16 ENUMERATED {n1, n2, n4, n8, n16, n24, n32,
+ n48, n64} OPTIONAL,
+ scs120-r16 ENUMERATED {n1, n2, n4, n8, n16, n24, n32,
+ n48, n64} OPTIONAL,
+ ...
+ },
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-PRS-QCL-ProcessingCapability-r16 ::= SEQUENCE {
+ dl-PRS-QCL-ProcessingCapabilityBandList-r16 SEQUENCE (SIZE (1..nrMaxBands-r16)) OF
+ DL-PRS-QCL-ProcessingCapabilityPerBand-r16,
+ ...
+}
+
+DL-PRS-QCL-ProcessingCapabilityPerBand-r16 ::= SEQUENCE {
+ freqBandIndicatorNR-r16 FreqBandIndicatorNR-r16,
+ ssb-FromNeighCellAsQCL-r16 ENUMERATED { supported} OPTIONAL,
+ prs-FromServNeighCellAsQCL-r16 ENUMERATED { supported} OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-PRS-ResourceID-r16 ::= INTEGER (0..nrMaxNumDL-PRS-ResourcesPerSet-1-r16)
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-PRS-ResourcesCapability-r16 ::= SEQUENCE {
+ maxNrOfDL-PRS-ResourceSetPerTrpPerFrequencyLayer-r16
+ INTEGER (1..2),
+ maxNrOfTRP-AcrossFreqs-r16 ENUMERATED { n4, n6, n12, n16, n32,
+ n64, n128, n256, ...},
+ maxNrOfPosLayer-r16 INTEGER (1..4),
+ dl-PRS-ResourcesCapabilityBandList-r16 SEQUENCE (SIZE (1..nrMaxBands-r16)) OF
+ DL-PRS-ResourcesCapabilityPerBand-r16,
+ dl-PRS-ResourcesBandCombinationList-r16 DL-PRS-ResourcesBandCombinationList-r16,
+ ...
+}
+
+DL-PRS-ResourcesCapabilityPerBand-r16 ::= SEQUENCE {
+ freqBandIndicatorNR-r16 FreqBandIndicatorNR-r16,
+ maxNrOfDL-PRS-ResourcesPerResourceSet-r16 ENUMERATED { n1, n2, n4, n8, n16, n32, n64, ...},
+ maxNrOfDL-PRS-ResourcesPerPositioningFrequencylayer-r16
+ ENUMERATED { n6, n24, n32, n64, n96, n128,
+ n256, n512, n1024, ...},
+ ...
+}
+
+DL-PRS-ResourcesBandCombinationList-r16 ::= SEQUENCE (SIZE (1..maxBandComb-r16)) OF
+ DL-PRS-ResourcesBandCombination-r16
+
+DL-PRS-ResourcesBandCombination-r16 ::= SEQUENCE {
+ bandList-r16 SEQUENCE (SIZE (1..maxSimultaneousBands-r16)) OF
+ FreqBandIndicatorNR-r16,
+ maxNrOfDL-PRS-ResourcesAcrossAllFL-TRP-ResourceSet-r16
+ CHOICE {
+ fr1-Only-r16 ENUMERATED {n6, n24, n64, n128, n192,
+ n256, n512, n1024, n2048},
+ fr2-Only-r16 ENUMERATED {n24, n64, n96, n128, n192,
+ n256, n512, n1024, n2048},
+ fr1-FR2Mix-r16 SEQUENCE {
+ fr1-r16 ENUMERATED {n6, n24, n64, n96, n128,
+ n192, n256, n512, n1024, n2048},
+ fr2-r16 ENUMERATED {n24, n64, n96, n128, n192,
+ n256, n512, n1024, n2048},
+ ...
+ },
+ ...
+ },
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-PRS-ResourceSetID-r16 ::= INTEGER (0..nrMaxNumDL-PRS-ResourceSetsPerTRP-1-r16)
+
+-- ASN1STOP
+-- ASN1START
+
+NR-PositionCalculationAssistance-r16 ::= SEQUENCE {
+ nr-TRP-LocationInfo-r16 NR-TRP-LocationInfo-r16 OPTIONAL, -- Need ON
+ nr-DL-PRS-BeamInfo-r16 NR-DL-PRS-BeamInfo-r16 OPTIONAL, -- Need ON
+ nr-RTD-Info-r16 NR-RTD-Info-r16 OPTIONAL, -- Need ON
+ ...
+}
+-- ASN1STOP
+-- ASN1START
+
+NR-RTD-Info-r16 ::= SEQUENCE {
+ referenceTRP-RTD-Info-r16 ReferenceTRP-RTD-Info-r16,
+ rtd-InfoList-r16 RTD-InfoList-r16,
+ ...
+}
+
+ReferenceTRP-RTD-Info-r16 ::= SEQUENCE {
+ dl-PRS-ID-Ref-r16 INTEGER (0..255),
+ nr-PhysCellID-Ref-r16 NR-PhysCellID-r16 OPTIONAL, -- Need ON
+ nr-CellGlobalID-Ref-r16 NCGI-r15 OPTIONAL, -- Need ON
+ nr-ARFCN-Ref-r16 ARFCN-ValueNR-r15 OPTIONAL, -- Need ON
+ refTime-r16 CHOICE {
+ systemFrameNumber-r16 BIT STRING (SIZE (10)),
+ utc-r16 UTCTime,
+ ...
+ },
+ rtd-RefQuality-r16 NR-TimingQuality-r16 OPTIONAL, -- Need ON
+ ...
+}
+
+RTD-InfoList-r16 ::= SEQUENCE (SIZE (1..nrMaxFreqLayers-r16)) OF RTD-InfoListPerFreqLayer-r16
+
+RTD-InfoListPerFreqLayer-r16 ::= SEQUENCE (SIZE(1..nrMaxTRPsPerFreq-r16)) OF RTD-InfoElement-r16
+
+RTD-InfoElement-r16 ::= SEQUENCE {
+ dl-PRS-ID-r16 INTEGER (0..255),
+ nr-PhysCellID-r16 NR-PhysCellID-r16 OPTIONAL, -- Need ON
+ nr-CellGlobalID-r16 NCGI-r15 OPTIONAL, -- Need ON
+ nr-ARFCN-r16 ARFCN-ValueNR-r15 OPTIONAL, -- Need ON
+ subframeOffset-r16 INTEGER (0..1966079),
+ rtd-Quality-r16 NR-TimingQuality-r16,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-SelectedDL-PRS-IndexList-r16 ::= SEQUENCE (SIZE (1..nrMaxFreqLayers-r16)) OF
+ NR-SelectedDL-PRS-PerFreq-r16
+
+NR-SelectedDL-PRS-PerFreq-r16 ::= SEQUENCE {
+ nr-SelectedDL-PRS-FrequencyLayerIndex-r16 INTEGER (0..nrMaxFreqLayers-1-r16),
+ nr-SelectedDL-PRS-IndexListPerFreq-r16 SEQUENCE (SIZE (1..nrMaxTRPsPerFreq-r16)) OF
+ NR-SelectedDL-PRS-IndexPerTRP-r16
+ OPTIONAL, --Need OP
+ ...
+}
+
+NR-SelectedDL-PRS-IndexPerTRP-r16 ::= SEQUENCE {
+ nr-SelectedTRP-Index-r16 INTEGER (0..nrMaxTRPsPerFreq-1-r16),
+ dl-SelectedPRS-ResourceSetIndexList-r16 SEQUENCE (SIZE (1..nrMaxSetsPerTrpPerFreqLayer-r16))
+ OF DL-SelectedPRS-ResourceSetIndex-r16
+ OPTIONAL, --Need OP
+ ...
+}
+
+DL-SelectedPRS-ResourceSetIndex-r16 ::= SEQUENCE {
+ nr-DL-SelectedPRS-ResourceSetIndex-r16 INTEGER (0..nrMaxSetsPerTrpPerFreqLayer-1-r16),
+ dl-SelectedPRS-ResourceIndexList-r16 SEQUENCE (SIZE (1..nrMaxResourcesPerSet-r16)) OF
+ DL-SelectedPRS-ResourceIndex-r16
+ OPTIONAL --Need OP
+}
+
+DL-SelectedPRS-ResourceIndex-r16 ::= SEQUENCE {
+ nr-DL-SelectedPRS-ResourceIdIndex-r16 INTEGER (0..nrMaxNumDL-PRS-ResourcesPerSet-1-r16),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-SSB-Config-r16 ::= SEQUENCE {
+ nr-PhysCellID-r16 NR-PhysCellID-r16,
+ nr-ARFCN-r16 ARFCN-ValueNR-r15,
+ ss-PBCH-BlockPower-r16 INTEGER (-60..50),
+ halfFrameIndex-r16 INTEGER (0..1),
+ ssb-periodicity-r16 ENUMERATED { ms5, ms10, ms20, ms40, ms80, ms160, ...},
+ ssb-PositionsInBurst-r16 CHOICE {
+ shortBitmap-r16 BIT STRING (SIZE (4)),
+ mediumBitmap-r16 BIT STRING (SIZE (8)),
+ longBitmap-r16 BIT STRING (SIZE (64))
+ } OPTIONAL, --Need OR
+ ssb-SubcarrierSpacing-r16 ENUMERATED {kHz15, kHz30, kHz60, kHz120, kHz240, ...},
+ sfn-SSB-Offset-r16 INTEGER (0..15),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-TimeStamp-r16 ::= SEQUENCE {
+ dl-PRS-ID-r16 INTEGER (0..255),
+ nr-PhysCellID-r16 NR-PhysCellID-r16 OPTIONAL, -- Need ON
+ nr-CellGlobalID-r16 NCGI-r15 OPTIONAL, -- Need ON
+ nr-ARFCN-r16 ARFCN-ValueNR-r15 OPTIONAL, -- Need ON
+ nr-SFN-r16 INTEGER (0..1023),
+ nr-Slot-r16 CHOICE {
+ scs15-r16 INTEGER (0..9),
+ scs30-r16 INTEGER (0..19),
+ scs60-r16 INTEGER (0..39),
+ scs120-r16 INTEGER (0..79)
+ },
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-TimingQuality-r16 ::= SEQUENCE {
+ timingQualityValue-r16 INTEGER (0..31),
+ timingQualityResolution-r16 ENUMERATED {mdot1, m1, m10, m30, ...},
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-TRP-LocationInfo-r16 ::= SEQUENCE (SIZE (1..nrMaxFreqLayers-r16)) OF
+ NR-TRP-LocationInfoPerFreqLayer-r16
+
+NR-TRP-LocationInfoPerFreqLayer-r16 ::= SEQUENCE {
+ referencePoint-r16 ReferencePoint-r16 OPTIONAL, -- Cond NotSameAsPrev
+ trp-LocationInfoList-r16 SEQUENCE (SIZE (1..nrMaxTRPsPerFreq-r16)) OF
+ TRP-LocationInfoElement-r16,
+ ...
+}
+
+TRP-LocationInfoElement-r16 ::= SEQUENCE {
+ dl-PRS-ID-r16 INTEGER (0..255),
+ nr-PhysCellID-r16 NR-PhysCellID-r16 OPTIONAL, -- Need ON
+ nr-CellGlobalID-r16 NCGI-r15 OPTIONAL, -- Need ON
+ nr-ARFCN-r16 ARFCN-ValueNR-r15 OPTIONAL, -- Need ON
+ associated-DL-PRS-ID-r16 INTEGER (0..255) OPTIONAL, -- Need OP
+ trp-Location-r16 RelativeLocation-r16 OPTIONAL, -- Need OP
+ trp-DL-PRS-ResourceSets-r16 SEQUENCE (SIZE(1..nrMaxSetsPerTrpPerFreqLayer-r16)) OF
+ DL-PRS-ResourceSets-TRP-Element-r16 OPTIONAL, -- Need OP
+ ...
+}
+
+DL-PRS-ResourceSets-TRP-Element-r16 ::= SEQUENCE {
+ dl-PRS-ResourceSetARP-r16 RelativeLocation-r16 OPTIONAL, -- Need OP
+ dl-PRS-Resource-ARP-List-r16 SEQUENCE (SIZE(1..nrMaxResourcesPerSet-r16)) OF
+ DL-PRS-Resource-ARP-Element-r16 OPTIONAL, -- Need OP
+ ...
+}
+
+DL-PRS-Resource-ARP-Element-r16 ::= SEQUENCE {
+ dl-PRS-Resource-ARP-location-r16 RelativeLocation-r16 OPTIONAL, -- Need OP
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-UL-SRS-Capability-r16 ::= SEQUENCE {
+ srs-CapabilityBandList-r16 SEQUENCE (SIZE (1..nrMaxBands-r16)) OF
+ SRS-CapabilityPerBand-r16,
+ srs-PosResourceConfigCA-BandList-r16 SEQUENCE (SIZE (1..nrMaxConfiguredBands-r16)) OF
+ SRS-PosResourcesPerBand-r16 OPTIONAL,
+ maxNumberSRS-PosPathLossEstimateAllServingCells-r16
+ ENUMERATED {n1, n4, n8, n16} OPTIONAL,
+ maxNumberSRS-PosSpatialRelationsAllServingCells-r16
+ ENUMERATED {n0, n1, n2, n4, n8, n16} OPTIONAL,
+ ...
+}
+
+SRS-CapabilityPerBand-r16 ::= SEQUENCE {
+ freqBandIndicatorNR-r16 FreqBandIndicatorNR-r16,
+ olpc-SRS-Pos-r16 OLPC-SRS-Pos-r16 OPTIONAL,
+ spatialRelationsSRS-Pos-r16 SpatialRelationsSRS-Pos-r16 OPTIONAL,
+ ...
+}
+
+OLPC-SRS-Pos-r16 ::= SEQUENCE {
+ olpc-SRS-PosBasedOnPRS-Serving-r16 ENUMERATED {supported} OPTIONAL,
+ olpc-SRS-PosBasedOnSSB-Neigh-r16 ENUMERATED {supported} OPTIONAL,
+ olpc-SRS-PosBasedOnPRS-Neigh-r16 ENUMERATED {supported} OPTIONAL,
+ maxNumberPathLossEstimatePerServing-r16 ENUMERATED {n1, n4, n8, n16} OPTIONAL,
+ ...
+}
+
+SpatialRelationsSRS-Pos-r16 ::= SEQUENCE {
+ spatialRelation-SRS-PosBasedOnSSB-Serving-r16 ENUMERATED {supported} OPTIONAL,
+ spatialRelation-SRS-PosBasedOnCSI-RS-Serving-r16 ENUMERATED {supported} OPTIONAL,
+ spatialRelation-SRS-PosBasedOnPRS-Serving-r16 ENUMERATED {supported} OPTIONAL,
+ spatialRelation-SRS-PosBasedOnSRS-r16 ENUMERATED {supported} OPTIONAL,
+ spatialRelation-SRS-PosBasedOnSSB-Neigh-r16 ENUMERATED {supported} OPTIONAL,
+ spatialRelation-SRS-PosBasedOnPRS-Neigh-r16 ENUMERATED {supported} OPTIONAL,
+ ...
+}
+
+SRS-PosResourcesPerBand-r16 ::= SEQUENCE {
+ freqBandIndicatorNR-r16 FreqBandIndicatorNR-r16,
+ maxNumberSRS-PosResourceSetsPerBWP-r16 ENUMERATED {n1, n2, n4, n8, n12, n16},
+ maxNumberSRS-PosResourcesPerBWP-r16 ENUMERATED {n1, n2, n4, n8, n16, n32, n64},
+ maxNumberPeriodicSRS-PosResourcesPerBWP-r16 ENUMERATED {n1, n2, n4, n8, n16, n32, n64},
+ maxNumberAP-SRS-PosResourcesPerBWP-r16 ENUMERATED {n1, n2, n4, n8, n16, n32, n64}
+ OPTIONAL,
+ maxNumberSP-SRS-PosResourcesPerBWP-r16 ENUMERATED {n1, n2, n4, n8, n16, n32, n64}
+ OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+ReferencePoint-r16 ::= SEQUENCE {
+ referencePointGeographicLocation-r16 CHOICE {
+ location3D-r16 EllipsoidPointWithAltitudeAndUncertaintyEllipsoid,
+ ha-location3D-r16 HighAccuracyEllipsoidPointWithAltitudeAndUncertaintyEllipsoid-r15,
+ ...
+ },
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+RelativeLocation-r16 ::= SEQUENCE {
+ milli-arc-second-units-r16 ENUMERATED { mas0-03, mas0-3, mas3, mas30, ...},
+ height-units-r16 ENUMERATED {mm, cm, m, ...},
+ delta-latitude-r16 Delta-Latitude-r16,
+ delta-longitude-r16 Delta-Longitude-r16,
+ delta-height-r16 Delta-Height-r16,
+ locationUNC-r16 LocationUncertainty-r16 OPTIONAL, -- Need OP
+ ...
+}
+
+Delta-Latitude-r16 ::= SEQUENCE {
+ delta-Latitude-r16 INTEGER (-1024..1023),
+ coarse-delta-Latitude-r16 INTEGER (0..4095) OPTIONAL, -- Need OP
+ ...
+}
+
+Delta-Longitude-r16 ::= SEQUENCE {
+ delta-Longitude-r16 INTEGER (-1024..1023),
+ coarse-delta-Longitude-r16 INTEGER (0..4095) OPTIONAL, -- Need OP
+ ...
+}
+
+Delta-Height-r16 ::= SEQUENCE {
+ delta-Height-r16 INTEGER (-1024..1023),
+ coarse-delta-Height-r16 INTEGER (0..4095) OPTIONAL, -- Need OP
+ ...
+}
+
+LocationUncertainty-r16 ::= SEQUENCE {
+ horizontalUncertainty-r16 INTEGER (0..255),
+ horizontalConfidence-r16 INTEGER (0..100),
+ verticalUncertainty-r16 INTEGER (0..255),
+ verticalConfidence-r16 INTEGER (0..100)
+}
+
+-- ASN1STOP
+-- ASN1START
+
+OTDOA-ProvideAssistanceData ::= SEQUENCE {
+ otdoa-ReferenceCellInfo OTDOA-ReferenceCellInfo OPTIONAL, -- Need ON
+ otdoa-NeighbourCellInfo OTDOA-NeighbourCellInfoList OPTIONAL, -- Need ON
+ otdoa-Error OTDOA-Error OPTIONAL, -- Need ON
+ ...,
+ [[
+ otdoa-ReferenceCellInfoNB-r14 OTDOA-ReferenceCellInfoNB-r14 OPTIONAL, -- Need ON
+ otdoa-NeighbourCellInfoNB-r14 OTDOA-NeighbourCellInfoListNB-r14 OPTIONAL -- Need ON
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+OTDOA-ReferenceCellInfo ::= SEQUENCE {
+ physCellId INTEGER (0..503),
+ cellGlobalId ECGI OPTIONAL, -- Need ON
+ earfcnRef ARFCN-ValueEUTRA OPTIONAL, -- Cond NotSameAsServ0
+ antennaPortConfig ENUMERATED {ports1-or-2, ports4, ... }
+ OPTIONAL, -- Cond NotSameAsServ1
+ cpLength ENUMERATED { normal, extended, ... },
+ prsInfo PRS-Info OPTIONAL, -- Cond PRS
+ ...,
+ [[ earfcnRef-v9a0 ARFCN-ValueEUTRA-v9a0 OPTIONAL -- Cond NotSameAsServ2
+ ]],
+ [[ tpId-r14 INTEGER (0..4095) OPTIONAL, -- Need ON
+ cpLengthCRS-r14 ENUMERATED { normal, extended, ... }
+ OPTIONAL, -- Cond CRS
+ sameMBSFNconfigRef-r14 BOOLEAN OPTIONAL, -- Need ON
+ dlBandwidth-r14 ENUMERATED {n6, n15, n25, n50, n75, n100}
+ OPTIONAL, -- Cond NotSameAsServ3
+ addPRSconfigRef-r14 SEQUENCE (SIZE (1..maxAddPRSconfig-r14)) OF PRS-Info
+ OPTIONAL -- Need ON
+ ]],
+ [[
+ nr-LTE-SFN-Offset-r15 INTEGER (0..1023) OPTIONAL -- Cond NR
+ ]],
+ [[
+ tdd-config-v1520 TDD-Config-v1520 OPTIONAL, -- Need ON
+ nr-LTE-fineTiming-Offset-r15 INTEGER (0..19) OPTIONAL -- Cond FineOffset
+ ]]
+}
+
+maxAddPRSconfig-r14 INTEGER ::= 2
+
+-- ASN1STOP
+-- ASN1START
+
+PRS-Info ::= SEQUENCE {
+ prs-Bandwidth ENUMERATED { n6, n15, n25, n50, n75, n100, ... },
+ prs-ConfigurationIndex INTEGER (0..4095),
+ numDL-Frames ENUMERATED {sf-1, sf-2, sf-4, sf-6, ..., sf-add-v1420},
+ ...,
+ prs-MutingInfo-r9 CHOICE {
+ po2-r9 BIT STRING (SIZE(2)),
+ po4-r9 BIT STRING (SIZE(4)),
+ po8-r9 BIT STRING (SIZE(8)),
+ po16-r9 BIT STRING (SIZE(16)),
+ ...,
+ po32-v1420 BIT STRING (SIZE(32)),
+ po64-v1420 BIT STRING (SIZE(64)),
+ po128-v1420 BIT STRING (SIZE(128)),
+ po256-v1420 BIT STRING (SIZE(256)),
+ po512-v1420 BIT STRING (SIZE(512)),
+ po1024-v1420 BIT STRING (SIZE(1024))
+ } OPTIONAL, -- Need OP
+ [[ prsID-r14 INTEGER (0..4095) OPTIONAL, -- Need ON
+ add-numDL-Frames-r14 INTEGER (1..160) OPTIONAL, -- Cond sf-add
+ prsOccGroupLen-r14 ENUMERATED {g2, g4, g8, g16, g32, g64, g128,... }
+ OPTIONAL, -- Cond Occ-Grp
+ prsHoppingInfo-r14 CHOICE {
+ nb2-r14 INTEGER (0.. maxAvailNarrowBands-Minus1-r14),
+ nb4-r14 SEQUENCE (SIZE (3))
+ OF INTEGER (0.. maxAvailNarrowBands-Minus1-r14)
+ } OPTIONAL -- Cond PRS-FH
+ ]]
+}
+
+maxAvailNarrowBands-Minus1-r14 INTEGER ::= 15 -- Maximum number of narrowbands minus 1
+
+-- ASN1STOP
+-- ASN1START
+
+TDD-Config-v1520 ::= SEQUENCE {
+ subframeAssignment-v1520 ENUMERATED { sa0, sa1, sa2, sa3, sa4, sa5, sa6 },
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+OTDOA-NeighbourCellInfoList ::= SEQUENCE (SIZE (1..maxFreqLayers)) OF OTDOA-NeighbourFreqInfo
+OTDOA-NeighbourFreqInfo ::= SEQUENCE (SIZE (1..24)) OF OTDOA-NeighbourCellInfoElement
+
+OTDOA-NeighbourCellInfoElement ::= SEQUENCE {
+ physCellId INTEGER (0..503),
+ cellGlobalId ECGI OPTIONAL, -- Need ON
+ earfcn ARFCN-ValueEUTRA OPTIONAL, -- Cond NotSameAsRef0
+ cpLength ENUMERATED {normal, extended, ...}
+ OPTIONAL, -- Cond NotSameAsRef1
+ prsInfo PRS-Info OPTIONAL, -- Cond NotSameAsRef2
+ antennaPortConfig ENUMERATED {ports-1-or-2, ports-4, ...}
+ OPTIONAL, -- Cond NotsameAsRef3
+ slotNumberOffset INTEGER (0..19) OPTIONAL, -- Cond NotSameAsRef4
+ prs-SubframeOffset INTEGER (0..1279) OPTIONAL, -- Cond InterFreq
+ expectedRSTD INTEGER (0..16383),
+ expectedRSTD-Uncertainty INTEGER (0..1023),
+ ...,
+ [[ earfcn-v9a0 ARFCN-ValueEUTRA-v9a0 OPTIONAL -- Cond NotSameAsRef5
+ ]],
+ [[ tpId-r14 INTEGER (0..4095) OPTIONAL, -- Need ON
+ prs-only-tp-r14 ENUMERATED { true } OPTIONAL, -- Cond TBS
+ cpLengthCRS-r14 ENUMERATED { normal, extended, ... }
+ OPTIONAL, -- Cond CRS
+ sameMBSFNconfigNeighbour-r14 BOOLEAN OPTIONAL, -- Need ON
+ dlBandwidth-r14 ENUMERATED {n6, n15, n25, n50, n75, n100}
+ OPTIONAL, -- Cond NotSameAsRef6
+ addPRSconfigNeighbour-r14 SEQUENCE (SIZE (1..maxAddPRSconfig-r14)) OF
+ Add-PRSconfigNeighbourElement-r14
+ OPTIONAL -- Need ON
+ ]],
+ [[
+ tdd-config-v1520 TDD-Config-v1520 OPTIONAL -- Need ON
+ ]]
+}
+
+Add-PRSconfigNeighbourElement-r14 ::= SEQUENCE {
+ add-prsInfo-r14 PRS-Info OPTIONAL, -- Cond NotSameAsRef7
+ ...
+}
+
+maxFreqLayers INTEGER ::= 3
+
+-- ASN1STOP
+-- ASN1START
+
+OTDOA-ReferenceCellInfoNB-r14 ::= SEQUENCE {
+ physCellIdNB-r14 INTEGER (0..503) OPTIONAL, -- Cond NoPRS-AD1
+ cellGlobalIdNB-r14 ECGI OPTIONAL, -- Cond NoPRS-AD2
+ carrierFreqRef-r14 CarrierFreq-NB-r14 OPTIONAL, -- Cond NotSameAsServ1
+ earfcn-r14 ARFCN-ValueEUTRA-r14 OPTIONAL, -- Cond Inband
+ eutra-NumCRS-Ports-r14 ENUMERATED {ports1-or-2, ports4}
+ OPTIONAL, -- Cond NoPRS-AD3
+ otdoa-SIB1-NB-repetitions-r14 ENUMERATED { r4, r8, r16 } OPTIONAL, -- Cond NotSameAsServ2
+ nprsInfo-r14 PRS-Info-NB-r14 OPTIONAL, -- Cond NPRS-Type1
+ ...,
+ [[
+ nprsInfo-Type2-v1470 PRS-Info-NB-r14 OPTIONAL -- Cond NPRS-Type2
+ ]],
+ [[ tdd-config-r15 TDD-Config-v1520 OPTIONAL -- Need ON
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+PRS-Info-NB-r14 ::= SEQUENCE (SIZE (1..maxCarrier-r14)) OF NPRS-Info-r14
+
+NPRS-Info-r14 ::= SEQUENCE {
+ operationModeInfoNPRS-r14 ENUMERATED { inband, standalone },
+ nprs-carrier-r14 CarrierFreq-NB-r14 OPTIONAL, -- Cond Standalone/Guardband
+ nprsSequenceInfo-r14 INTEGER (0..174) OPTIONAL, -- Cond Inband
+ nprsID-r14 INTEGER (0..4095) OPTIONAL, -- Cond NPRS-ID
+ partA-r14 SEQUENCE {
+ nprsBitmap-r14 CHOICE {
+ subframePattern10-r14 BIT STRING (SIZE (10)),
+ subframePattern40-r14 BIT STRING (SIZE (40))
+ },
+ nprs-MutingInfoA-r14 CHOICE {
+ po2-r14 BIT STRING (SIZE(2)),
+ po4-r14 BIT STRING (SIZE(4)),
+ po8-r14 BIT STRING (SIZE(8)),
+ po16-r14 BIT STRING (SIZE(16)),
+ ...
+ } OPTIONAL, -- Cond MutingA
+ ...
+ } OPTIONAL, -- Cond PartA
+ partB-r14 SEQUENCE {
+ nprs-Period-r14 ENUMERATED { ms160, ms320, ms640, ms1280, ... , ms2560-v1510},
+ nprs-startSF-r14 ENUMERATED { zero, one-eighth, two-eighths, three-eighths,
+ four-eighths, five-eighths, six-eighths,
+ seven-eighths, ...},
+ nprs-NumSF-r14 ENUMERATED { sf10, sf20, sf40, sf80, sf160, sf320,
+ sf640, sf1280, ... , sf2560-v1510},
+ nprs-MutingInfoB-r14 CHOICE {
+ po2-r14 BIT STRING (SIZE(2)),
+ po4-r14 BIT STRING (SIZE(4)),
+ po8-r14 BIT STRING (SIZE(8)),
+ po16-r14 BIT STRING (SIZE(16)),
+ ...
+ } OPTIONAL, -- Cond MutingB
+ ...,
+ [[ sib1-SF-TDD-r15 ENUMERATED {sf0, sf4, sf0and5} OPTIONAL -- Cond SIB1-TDD
+ ]]
+ } OPTIONAL, -- Cond PartB
+ ...,
+ [[
+ partA-TDD-r15 SEQUENCE {
+ nprsBitmap-r15 CHOICE {
+ subframePattern10-TDD-r15 BIT STRING (SIZE (8)),
+ subframePattern40-TDD-r15 BIT STRING (SIZE (32)),
+ ...
+ },
+ nprs-MutingInfoA-r15 CHOICE {
+ po2-r15 BIT STRING (SIZE(2)),
+ po4-r15 BIT STRING (SIZE(4)),
+ po8-r15 BIT STRING (SIZE(8)),
+ po16-r15 BIT STRING (SIZE(16)),
+ ...
+ } OPTIONAL, -- Cond MutingA
+ ...
+ } OPTIONAL -- Cond PartA-TDD
+ ]]
+}
+
+maxCarrier-r14 INTEGER ::= 5
+
+-- ASN1STOP
+-- ASN1START
+
+OTDOA-NeighbourCellInfoListNB-r14 ::= SEQUENCE (SIZE (1..maxCells-r14)) OF
+ OTDOA-NeighbourCellInfoNB-r14
+
+OTDOA-NeighbourCellInfoNB-r14 ::= SEQUENCE {
+ physCellIdNB-r14 INTEGER (0..503) OPTIONAL, -- Cond NoPRS-AD1
+ cellGlobalIdNB-r14 ECGI OPTIONAL, -- Cond NoPRS-AD2
+ carrierFreq-r14 CarrierFreq-NB-r14 OPTIONAL, -- Cond NotSameAsRef1
+ earfcn-r14 ARFCN-ValueEUTRA-r14 OPTIONAL, -- Cond Inband
+ eutra-NumCRS-Ports-r14 ENUMERATED {ports-1-or-2, ports-4, ...}
+ OPTIONAL, -- Cond NotsameAsRef2
+ otdoa-SIB1-NB-repetitions-r14 ENUMERATED { r4, r8, r16 }
+ OPTIONAL, -- Cond NotSameAsRef3
+ nprsInfo-r14 PRS-Info-NB-r14 OPTIONAL, -- Cond NotsameAsRef4
+ nprs-slotNumberOffset-r14 INTEGER (0..19) OPTIONAL, -- Cond NotsameAsRef5
+ nprs-SFN-Offset-r14 INTEGER (0..63) OPTIONAL, -- Cond NotsameAsRef6
+ nprs-SubframeOffset-r14 INTEGER (0..1279) OPTIONAL, -- Need OP
+ expectedRSTD-r14 INTEGER (0..16383) OPTIONAL, -- Cond NoPRS-AD3
+ expectedRSTD-Uncertainty-r14 INTEGER (0..1023) OPTIONAL, -- Cond NoPRS-AD3
+ prsNeighbourCellIndex-r14 INTEGER (1..72) OPTIONAL, -- Cond PRS-AD
+ ...,
+ [[
+ nprsInfo-Type2-v1470 PRS-Info-NB-r14 OPTIONAL -- Cond NotSameAsRef4
+ ]],
+ [[ tdd-config-r15 TDD-Config-v1520 OPTIONAL -- Need ON
+ ]]
+}
+
+maxCells-r14 INTEGER ::= 72
+
+-- ASN1STOP
+-- ASN1START
+
+OTDOA-RequestAssistanceData ::= SEQUENCE {
+ physCellId INTEGER (0..503),
+ ...,
+ [[
+ adType-r14 BIT STRING { prs (0), nprs (1) } (SIZE (1..8)) OPTIONAL
+ ]],
+ [[
+ nrPhysCellId-r15 INTEGER (0..1007) OPTIONAL
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+OTDOA-ProvideLocationInformation ::= SEQUENCE {
+ otdoaSignalMeasurementInformation OTDOA-SignalMeasurementInformation OPTIONAL,
+ otdoa-Error OTDOA-Error OPTIONAL,
+ ...,
+ [[
+ otdoaSignalMeasurementInformation-NB-r14 OTDOA-SignalMeasurementInformation-NB-r14
+ OPTIONAL
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+OTDOA-SignalMeasurementInformation ::= SEQUENCE {
+ systemFrameNumber BIT STRING (SIZE (10)),
+ physCellIdRef INTEGER (0..503),
+ cellGlobalIdRef ECGI OPTIONAL,
+ earfcnRef ARFCN-ValueEUTRA OPTIONAL, -- Cond NotSameAsRef0
+ referenceQuality OTDOA-MeasQuality OPTIONAL,
+ neighbourMeasurementList NeighbourMeasurementList,
+ ...,
+ [[ earfcnRef-v9a0 ARFCN-ValueEUTRA-v9a0 OPTIONAL -- Cond NotSameAsRef1
+ ]],
+ [[ tpIdRef-r14 INTEGER (0..4095) OPTIONAL, -- Cond ProvidedByServer0
+ prsIdRef-r14 INTEGER (0..4095) OPTIONAL, -- Cond ProvidedByServer1
+ additionalPathsRef-r14
+ AdditionalPathList-r14 OPTIONAL,
+ nprsIdRef-r14 INTEGER (0..4095) OPTIONAL, -- Cond ProvidedByServer2
+ carrierFreqOffsetNB-Ref-r14
+ CarrierFreqOffsetNB-r14 OPTIONAL, -- Cond NB-IoT
+ hyperSFN-r14 BIT STRING (SIZE (10)) OPTIONAL -- Cond H-SFN
+ ]],
+ [[
+ motionTimeSource-r15 MotionTimeSource-r15 OPTIONAL
+ ]]
+}
+
+NeighbourMeasurementList ::= SEQUENCE (SIZE(1..24)) OF NeighbourMeasurementElement
+
+NeighbourMeasurementElement ::= SEQUENCE {
+ physCellIdNeighbour INTEGER (0..503),
+ cellGlobalIdNeighbour ECGI OPTIONAL,
+ earfcnNeighbour ARFCN-ValueEUTRA OPTIONAL, -- Cond NotSameAsRef2
+ rstd INTEGER (0..12711),
+ rstd-Quality OTDOA-MeasQuality,
+ ...,
+ [[ earfcnNeighbour-v9a0 ARFCN-ValueEUTRA-v9a0 OPTIONAL -- Cond NotSameAsRef3
+ ]],
+ [[ tpIdNeighbour-r14 INTEGER (0..4095) OPTIONAL, -- Cond ProvidedByServer0
+ prsIdNeighbour-r14 INTEGER (0..4095) OPTIONAL, -- Cond ProvidedByServer1
+ delta-rstd-r14 INTEGER (0..5) OPTIONAL,
+ additionalPathsNeighbour-r14
+ AdditionalPathList-r14 OPTIONAL,
+ nprsIdNeighbour-r14 INTEGER (0..4095) OPTIONAL, -- Cond ProvidedByServer2
+ carrierFreqOffsetNB-Neighbour-r14
+ CarrierFreqOffsetNB-r14 OPTIONAL -- Cond NB-IoT
+ ]],
+ [[
+ delta-SFN-r15 INTEGER (-8192..8191) OPTIONAL
+ ]]
+}
+
+AdditionalPathList-r14 ::= SEQUENCE (SIZE(1..maxPaths-r14)) OF AdditionalPath-r14
+
+maxPaths-r14 INTEGER ::= 2
+
+MotionTimeSource-r15 ::= SEQUENCE {
+ timeSource-r15 ENUMERATED {servingCell, referenceCell, gnss, mixed,
+ other, none, ...}
+}
+
+-- ASN1STOP
+-- ASN1START
+
+OTDOA-SignalMeasurementInformation-NB-r14 ::= SEQUENCE {
+ systemFrameNumber-r14 BIT STRING (SIZE (10)),
+ physCellIdRef-r14 INTEGER (0..503),
+ cellGlobalIdRef-r14 ECGI OPTIONAL,
+ earfcnRef-r14 ARFCN-ValueEUTRA-r14 OPTIONAL, -- Cond NotSameAsRef0
+ referenceQuality-r14 OTDOA-MeasQuality OPTIONAL,
+ neighbourMeasurementList-r14 NeighbourMeasurementList-NB-r14,
+ tpIdRef-r14 INTEGER (0..4095) OPTIONAL, -- Cond ProvidedByServer0
+ prsIdRef-r14 INTEGER (0..4095) OPTIONAL, -- Cond ProvidedByServer1
+ additionalPathsRef-r14 AdditionalPathList-r14 OPTIONAL,
+ nprsIdRef-r14 INTEGER (0..4095) OPTIONAL, -- Cond ProvidedByServer2
+ carrierFreqOffsetNB-Ref-r14 CarrierFreqOffsetNB-r14 OPTIONAL, -- Cond NB-IoT
+ hyperSFN-r14 BIT STRING (SIZE (10)) OPTIONAL, -- Cond H-SFN
+ ...
+}
+
+NeighbourMeasurementList-NB-r14 ::= SEQUENCE (SIZE(1..24)) OF NeighbourMeasurementElement-NB-r14
+
+NeighbourMeasurementElement-NB-r14 ::= SEQUENCE {
+ physCellIdNeighbour-r14 INTEGER (0..503),
+ cellGlobalIdNeighbour-r14 ECGI OPTIONAL,
+ earfcnNeighbour-r14 ARFCN-ValueEUTRA-r14 OPTIONAL, -- Cond NotSameAsRef2
+ rstd-r14 INTEGER (0..12711),
+ rstd-Quality-r14 OTDOA-MeasQuality,
+ tpIdNeighbour-r14 INTEGER (0..4095) OPTIONAL, -- Cond ProvidedByServer0
+ prsIdNeighbour-r14 INTEGER (0..4095) OPTIONAL, -- Cond ProvidedByServer1
+ delta-rstd-r14 INTEGER (0..5) OPTIONAL,
+ additionalPathsNeighbour-r14
+ AdditionalPathList-r14 OPTIONAL,
+ nprsIdNeighbour-r14 INTEGER (0..4095) OPTIONAL, -- Cond ProvidedByServer2
+ carrierFreqOffsetNB-Neighbour-r14
+ CarrierFreqOffsetNB-r14 OPTIONAL, -- Cond NB-IoT
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+OTDOA-MeasQuality ::= SEQUENCE {
+ error-Resolution BIT STRING (SIZE (2)),
+ error-Value BIT STRING (SIZE (5)),
+ error-NumSamples BIT STRING (SIZE (3)) OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+AdditionalPath-r14 ::= SEQUENCE {
+ relativeTimeDifference-r14 INTEGER (-256..255),
+ path-Quality-r14 OTDOA-MeasQuality OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+OTDOA-RequestLocationInformation ::= SEQUENCE {
+ assistanceAvailability BOOLEAN,
+ ...,
+ [[
+ multipathRSTD-r14 ENUMERATED { requested } OPTIONAL, -- Need ON
+ maxNoOfRSTDmeas-r14 INTEGER (1..32) OPTIONAL -- Need ON
+ ]],
+ [[
+ motionMeasurements-r15 ENUMERATED { requested } OPTIONAL -- Need ON
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+OTDOA-ProvideCapabilities ::= SEQUENCE {
+ otdoa-Mode BIT STRING { ue-assisted (0),
+ ue-assisted-NB-r14 (1),
+ ue-assisted-NB-TDD-r15 (2) } (SIZE (1..8)),
+ ...,
+ supportedBandListEUTRA SEQUENCE (SIZE (1..maxBands)) OF SupportedBandEUTRA OPTIONAL,
+ supportedBandListEUTRA-v9a0 SEQUENCE (SIZE (1..maxBands)) OF SupportedBandEUTRA-v9a0
+ OPTIONAL,
+ interFreqRSTDmeasurement-r10 ENUMERATED { supported } OPTIONAL,
+ additionalNeighbourCellInfoList-r10 ENUMERATED { supported } OPTIONAL,
+ prs-id-r14 ENUMERATED { supported } OPTIONAL,
+ tp-separation-via-muting-r14 ENUMERATED { supported } OPTIONAL,
+ additional-prs-config-r14 ENUMERATED { supported } OPTIONAL,
+ prs-based-tbs-r14 ENUMERATED { supported } OPTIONAL,
+ additionalPathsReport-r14 ENUMERATED { supported } OPTIONAL,
+ densePrsConfig-r14 ENUMERATED { supported } OPTIONAL,
+ maxSupportedPrsBandwidth-r14 ENUMERATED { n6, n15, n25, n50, n75, n100, ...} OPTIONAL,
+ prsOccGroup-r14 ENUMERATED { supported } OPTIONAL,
+ prsFrequencyHopping-r14 ENUMERATED { supported } OPTIONAL,
+ maxSupportedPrsConfigs-r14 ENUMERATED { c2, c3 } OPTIONAL,
+ periodicalReporting-r14 ENUMERATED { supported } OPTIONAL,
+ multiPrbNprs-r14 ENUMERATED { supported } OPTIONAL,
+ idleStateForMeasurements-r14 ENUMERATED { required } OPTIONAL,
+ numberOfRXantennas-r14 ENUMERATED { rx1, ... } OPTIONAL,
+ motionMeasurements-r15 ENUMERATED { supported } OPTIONAL,
+ interRAT-RSTDmeasurement-r15 ENUMERATED { supported } OPTIONAL
+}
+
+maxBands INTEGER ::= 64
+
+SupportedBandEUTRA ::= SEQUENCE {
+ bandEUTRA INTEGER (1..maxFBI)
+}
+
+SupportedBandEUTRA-v9a0 ::= SEQUENCE {
+ bandEUTRA-v9a0 INTEGER (maxFBI-Plus1..maxFBI2) OPTIONAL
+}
+
+maxFBI INTEGER ::= 64 -- Maximum value of frequency band indicator
+maxFBI-Plus1 INTEGER ::= 65 -- lowest value extended FBI range
+maxFBI2 INTEGER ::= 256 -- highest value extended FBI range
+
+-- ASN1STOP
+-- ASN1START
+
+OTDOA-RequestCapabilities ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+OTDOA-Error ::= CHOICE {
+ locationServerErrorCauses OTDOA-LocationServerErrorCauses,
+ targetDeviceErrorCauses OTDOA-TargetDeviceErrorCauses,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+OTDOA-LocationServerErrorCauses ::= SEQUENCE {
+ cause ENUMERATED { undefined,
+ assistanceDataNotSupportedByServer,
+ assistanceDataSupportedButCurrentlyNotAvailableByServer,
+ ...
+ },
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+OTDOA-TargetDeviceErrorCauses ::= SEQUENCE {
+ cause ENUMERATED { undefined,
+ assistance-data-missing,
+ unableToMeasureReferenceCell,
+ unableToMeasureAnyNeighbourCell,
+ attemptedButUnableToMeasureSomeNeighbourCells,
+ ...
+ },
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+A-GNSS-ProvideAssistanceData ::= SEQUENCE {
+ gnss-CommonAssistData GNSS-CommonAssistData OPTIONAL, -- Need ON
+ gnss-GenericAssistData GNSS-GenericAssistData OPTIONAL, -- Need ON
+ gnss-Error A-GNSS-Error OPTIONAL, -- Need ON
+ ...,
+ [[
+ gnss-PeriodicAssistData-r15 GNSS-PeriodicAssistData-r15 OPTIONAL -- Cond CtrTrans
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-CommonAssistData ::= SEQUENCE {
+ gnss-ReferenceTime GNSS-ReferenceTime OPTIONAL, -- Need ON
+ gnss-ReferenceLocation GNSS-ReferenceLocation OPTIONAL, -- Need ON
+ gnss-IonosphericModel GNSS-IonosphericModel OPTIONAL, -- Need ON
+ gnss-EarthOrientationParameters GNSS-EarthOrientationParameters OPTIONAL, -- Need ON
+ ...,
+ [[
+ gnss-RTK-ReferenceStationInfo-r15
+ GNSS-RTK-ReferenceStationInfo-r15 OPTIONAL, -- Need ON
+ gnss-RTK-CommonObservationInfo-r15
+ GNSS-RTK-CommonObservationInfo-r15 OPTIONAL, -- Cond RTK
+ gnss-RTK-AuxiliaryStationData-r15
+ GNSS-RTK-AuxiliaryStationData-r15 OPTIONAL -- Need ON
+ ]],
+ [[
+ gnss-SSR-CorrectionPoints-r16
+ GNSS-SSR-CorrectionPoints-r16 OPTIONAL -- Need ON
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-GenericAssistData ::= SEQUENCE (SIZE (1..16)) OF GNSS-GenericAssistDataElement
+
+GNSS-GenericAssistDataElement ::= SEQUENCE {
+ gnss-ID GNSS-ID,
+ sbas-ID SBAS-ID OPTIONAL, -- Cond GNSS-ID-SBAS
+ gnss-TimeModels GNSS-TimeModelList OPTIONAL, -- Need ON
+ gnss-DifferentialCorrections GNSS-DifferentialCorrections OPTIONAL, -- Need ON
+ gnss-NavigationModel GNSS-NavigationModel OPTIONAL, -- Need ON
+ gnss-RealTimeIntegrity GNSS-RealTimeIntegrity OPTIONAL, -- Need ON
+ gnss-DataBitAssistance GNSS-DataBitAssistance OPTIONAL, -- Need ON
+ gnss-AcquisitionAssistance GNSS-AcquisitionAssistance OPTIONAL, -- Need ON
+ gnss-Almanac GNSS-Almanac OPTIONAL, -- Need ON
+ gnss-UTC-Model GNSS-UTC-Model OPTIONAL, -- Need ON
+ gnss-AuxiliaryInformation GNSS-AuxiliaryInformation OPTIONAL, -- Need ON
+ ...,
+ [[
+ bds-DifferentialCorrections-r12
+ BDS-DifferentialCorrections-r12 OPTIONAL, -- Cond GNSS-ID-BDS
+ bds-GridModel-r12 BDS-GridModelParameter-r12 OPTIONAL -- Cond GNSS-ID-BDS
+ ]],
+ [[
+ gnss-RTK-Observations-r15 GNSS-RTK-Observations-r15 OPTIONAL, -- Need ON
+ glo-RTK-BiasInformation-r15 GLO-RTK-BiasInformation-r15 OPTIONAL, -- Cond GNSS-ID-GLO
+ gnss-RTK-MAC-CorrectionDifferences-r15
+ GNSS-RTK-MAC-CorrectionDifferences-r15
+ OPTIONAL, -- Need ON
+ gnss-RTK-Residuals-r15 GNSS-RTK-Residuals-r15 OPTIONAL, -- Need ON
+ gnss-RTK-FKP-Gradients-r15 GNSS-RTK-FKP-Gradients-r15 OPTIONAL, -- Need ON
+ gnss-SSR-OrbitCorrections-r15
+ GNSS-SSR-OrbitCorrections-r15 OPTIONAL, -- Need ON
+ gnss-SSR-ClockCorrections-r15
+ GNSS-SSR-ClockCorrections-r15 OPTIONAL, -- Need ON
+ gnss-SSR-CodeBias-r15 GNSS-SSR-CodeBias-r15 OPTIONAL -- Need ON
+ ]],
+ [[
+ gnss-SSR-URA-r16 GNSS-SSR-URA-r16 OPTIONAL, -- Need ON
+ gnss-SSR-PhaseBias-r16 GNSS-SSR-PhaseBias-r16 OPTIONAL, -- Need ON
+ gnss-SSR-STEC-Correction-r16 GNSS-SSR-STEC-Correction-r16
+ OPTIONAL, -- Need ON
+ gnss-SSR-GriddedCorrection-r16 GNSS-SSR-GriddedCorrection-r16
+ OPTIONAL, -- Need ON
+ navic-DifferentialCorrections-r16 NavIC-DifferentialCorrections-r16
+ OPTIONAL, -- Cond GNSS-ID-NavIC
+ navic-GridModel-r16 NavIC-GridModelParameter-r16
+ OPTIONAL -- Cond GNSS-ID-NavIC
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-PeriodicAssistData-r15 ::= SEQUENCE {
+ gnss-RTK-PeriodicObservations-r15 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Need ON
+ glo-RTK-PeriodicBiasInformation-r15 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Need ON
+ gnss-RTK-MAC-PeriodicCorrectionDifferences-r15
+ GNSS-PeriodicControlParam-r15 OPTIONAL, -- Need ON
+ gnss-RTK-PeriodicResiduals-r15 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Need ON
+ gnss-RTK-FKP-PeriodicGradients-r15 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Need ON
+ gnss-SSR-PeriodicOrbitCorrections-r15
+ GNSS-PeriodicControlParam-r15 OPTIONAL, -- Need ON
+ gnss-SSR-PeriodicClockCorrections-r15
+ GNSS-PeriodicControlParam-r15 OPTIONAL, -- Need ON
+ gnss-SSR-PeriodicCodeBias-r15 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Need ON
+ ...,
+ [[
+ gnss-SSR-PeriodicURA-r16 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Need ON
+ gnss-SSR-PeriodicPhaseBias-r16 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Need ON
+ gnss-SSR-PeriodicSTEC-Correction-r16 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Need ON
+ gnss-SSR-PeriodicGriddedCorrection-r16 GNSS-PeriodicControlParam-r15 OPTIONAL -- Need ON
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-ReferenceTime ::= SEQUENCE {
+ gnss-SystemTime GNSS-SystemTime,
+ referenceTimeUnc INTEGER (0..127) OPTIONAL, -- Cond noFTA
+ gnss-ReferenceTimeForCells SEQUENCE (SIZE (1..16)) OF
+ GNSS-ReferenceTimeForOneCell OPTIONAL, -- Need ON
+ ...
+}
+
+GNSS-ReferenceTimeForOneCell ::= SEQUENCE {
+ networkTime NetworkTime,
+ referenceTimeUnc INTEGER (0..127),
+ bsAlign ENUMERATED {true} OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-SystemTime ::= SEQUENCE {
+ gnss-TimeID GNSS-ID,
+ gnss-DayNumber INTEGER (0..32767),
+ gnss-TimeOfDay INTEGER (0..86399),
+ gnss-TimeOfDayFrac-msec INTEGER (0..999) OPTIONAL, -- Need ON
+ notificationOfLeapSecond BIT STRING (SIZE(2)) OPTIONAL, -- Cond gnss-TimeID-glonass
+ gps-TOW-Assist GPS-TOW-Assist OPTIONAL, -- Cond gnss-TimeID-gps
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GPS-TOW-Assist ::= SEQUENCE (SIZE(1..64)) OF GPS-TOW-AssistElement
+
+GPS-TOW-AssistElement ::= SEQUENCE {
+ satelliteID INTEGER (1..64),
+ tlmWord INTEGER (0..16383),
+ antiSpoof INTEGER (0..1),
+ alert INTEGER (0..1),
+ tlmRsvdBits INTEGER (0..3),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NetworkTime ::= SEQUENCE {
+ secondsFromFrameStructureStart INTEGER(0..12533),
+ fractionalSecondsFromFrameStructureStart INTEGER(0..3999999),
+ frameDrift INTEGER (-64..63) OPTIONAL, -- Cond GNSSsynch
+ cellID CHOICE {
+ eUTRA SEQUENCE {
+ physCellId INTEGER (0..503),
+ cellGlobalIdEUTRA CellGlobalIdEUTRA-AndUTRA OPTIONAL, -- Need ON
+ earfcn ARFCN-ValueEUTRA,
+ ...,
+ [[ earfcn-v9a0 ARFCN-ValueEUTRA-v9a0 OPTIONAL -- Cond EARFCN-max
+ ]]
+ },
+ uTRA SEQUENCE {
+ mode CHOICE {
+ fdd SEQUENCE {
+ primary-CPICH-Info INTEGER (0..511),
+ ...
+ },
+ tdd SEQUENCE {
+ cellParameters INTEGER (0..127),
+ ...
+ }
+ },
+ cellGlobalIdUTRA CellGlobalIdEUTRA-AndUTRA OPTIONAL, -- Need ON
+ uarfcn ARFCN-ValueUTRA,
+ ...
+ },
+ gSM SEQUENCE {
+ bcchCarrier INTEGER (0..1023),
+ bsic INTEGER (0..63),
+ cellGlobalIdGERAN CellGlobalIdGERAN OPTIONAL, -- Need ON
+ ...
+ },
+ ...,
+ nBIoT-r14 SEQUENCE {
+ nbPhysCellId-r14 INTEGER (0..503),
+ nbCellGlobalId-r14 ECGI OPTIONAL, -- Need ON
+ nbCarrierFreq-r14 CarrierFreq-NB-r14,
+ ...
+ },
+ nr-r15 SEQUENCE {
+ nrPhysCellId-r15 INTEGER (0..1007),
+ nrCellGlobalID-r15 NCGI-r15 OPTIONAL, -- Need ON
+ nrARFCN-r15 ARFCN-ValueNR-r15,
+ ...
+ }
+ },
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-ReferenceLocation ::= SEQUENCE {
+ threeDlocation EllipsoidPointWithAltitudeAndUncertaintyEllipsoid,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-IonosphericModel ::= SEQUENCE {
+ klobucharModel KlobucharModelParameter OPTIONAL, -- Need ON
+ neQuickModel NeQuickModelParameter OPTIONAL, -- Need ON
+ ...,
+ [[ klobucharModel2-r16 KlobucharModel2Parameter-r16 OPTIONAL -- Need ON
+ ]]
+
+}
+
+-- ASN1STOP
+-- ASN1START
+
+KlobucharModelParameter ::= SEQUENCE {
+ dataID BIT STRING (SIZE (2)),
+ alfa0 INTEGER (-128..127),
+ alfa1 INTEGER (-128..127),
+ alfa2 INTEGER (-128..127),
+ alfa3 INTEGER (-128..127),
+ beta0 INTEGER (-128..127),
+ beta1 INTEGER (-128..127),
+ beta2 INTEGER (-128..127),
+ beta3 INTEGER (-128..127),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+KlobucharModel2Parameter-r16 ::= SEQUENCE {
+ alfa1-r16 INTEGER (0..1023),
+ alfa2-r16 INTEGER (-128..127),
+ alfa3-r16 INTEGER (0..255),
+ alfa4-r16 INTEGER (0..255),
+ alfa5-r16 INTEGER (0..255),
+ alfa6-r16 INTEGER (-128..127),
+ alfa7-r16 INTEGER (-128..127),
+ alfa8-r16 INTEGER (-128..127),
+ alfa9-r16 INTEGER (-128..127),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NeQuickModelParameter ::= SEQUENCE {
+ ai0 INTEGER (0..2047),
+ ai1 INTEGER (-1024..1023),
+ ai2 INTEGER (-8192..8191),
+ ionoStormFlag1 INTEGER (0..1) OPTIONAL, -- Need OP
+ ionoStormFlag2 INTEGER (0..1) OPTIONAL, -- Need OP
+ ionoStormFlag3 INTEGER (0..1) OPTIONAL, -- Need OP
+ ionoStormFlag4 INTEGER (0..1) OPTIONAL, -- Need OP
+ ionoStormFlag5 INTEGER (0..1) OPTIONAL, -- Need OP
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-EarthOrientationParameters ::= SEQUENCE {
+ teop INTEGER (0..65535),
+ pmX INTEGER (-1048576..1048575),
+ pmXdot INTEGER (-16384..16383),
+ pmY INTEGER (-1048576..1048575),
+ pmYdot INTEGER (-16384..16383),
+ deltaUT1 INTEGER (-1073741824..1073741823),
+ deltaUT1dot INTEGER (-262144..262143),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-RTK-ReferenceStationInfo-r15 ::= SEQUENCE {
+ referenceStationID-r15 GNSS-ReferenceStationID-r15,
+ referenceStationIndicator-r15 ENUMERATED {physical, non-physical},
+ antenna-reference-point-ECEF-X-r15 INTEGER (-137438953472..137438953471),
+ antenna-reference-point-ECEF-Y-r15 INTEGER (-137438953472..137438953471),
+ antenna-reference-point-ECEF-Z-r15 INTEGER (-137438953472..137438953471),
+ antennaHeight-r15 INTEGER (0..65535) OPTIONAL, -- Need ON
+ antennaDescription-r15 AntennaDescription-r15 OPTIONAL, -- Need ON
+ antenna-reference-point-unc-r15 AntennaReferencePointUnc-r15 OPTIONAL, -- Need ON
+ physical-reference-station-info-r15 PhysicalReferenceStationInfo-r15 OPTIONAL, -- Cond NP
+ ...,
+ [[
+ equalIntegerAmbiguityLevel-r16 EqualIntegerAmbiguityLevel-r16 OPTIONAL -- Need ON
+ ]]
+}
+
+AntennaDescription-r15 ::= SEQUENCE {
+ antennaDescriptor-r15 VisibleString (SIZE (1..256)),
+ antennaSetUpID-r15 ENUMERATED { non-zero } OPTIONAL, -- Need OP
+ ...
+}
+
+AntennaReferencePointUnc-r15 ::= SEQUENCE {
+ uncertainty-X-r15 INTEGER (0..255),
+ confidence-X-r15 INTEGER (0..100),
+ uncertainty-Y-r15 INTEGER (0..255),
+ confidence-Y-r15 INTEGER (0..100),
+ uncertainty-Z-r15 INTEGER (0..255),
+ confidence-Z-r15 INTEGER (0..100),
+ ...
+}
+
+PhysicalReferenceStationInfo-r15 ::= SEQUENCE {
+ physicalReferenceStationID-r15 GNSS-ReferenceStationID-r15,
+ physical-ARP-ECEF-X-r15 INTEGER (-137438953472..137438953471),
+ physical-ARP-ECEF-Y-r15 INTEGER (-137438953472..137438953471),
+ physical-ARP-ECEF-Z-r15 INTEGER (-137438953472..137438953471),
+ physical-ARP-unc-r15 AntennaReferencePointUnc-r15 OPTIONAL, -- Need ON
+ ...
+}
+
+EqualIntegerAmbiguityLevel-r16 ::= CHOICE {
+ allReferenceStations-r16 NULL,
+ referenceStationList-r16 ReferenceStationList-r16
+}
+
+ReferenceStationList-r16 ::= SEQUENCE (SIZE(1..16)) OF GNSS-ReferenceStationID-r15
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-RTK-CommonObservationInfo-r15 ::= SEQUENCE {
+ referenceStationID-r15 GNSS-ReferenceStationID-r15,
+ clockSteeringIndicator-r15 INTEGER (0..3),
+ externalClockIndicator-r15 INTEGER (0..3),
+ smoothingIndicator-r15 BIT STRING (SIZE(1)),
+ smoothingInterval-r15 BIT STRING (SIZE(3)),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-RTK-AuxiliaryStationData-r15 ::= SEQUENCE {
+ networkID-r15 GNSS-NetworkID-r15,
+ subNetworkID-r15 GNSS-SubNetworkID-r15 OPTIONAL, -- Need ON
+ master-referenceStationID-r15 GNSS-ReferenceStationID-r15,
+ auxiliaryStationList-r15 AuxiliaryStationList-r15,
+ ...
+}
+
+AuxiliaryStationList-r15 ::= SEQUENCE (SIZE (1..32)) OF AuxiliaryStationElement-r15
+
+AuxiliaryStationElement-r15 ::= SEQUENCE {
+ aux-referenceStationID-r15 GNSS-ReferenceStationID-r15,
+ aux-master-delta-latitude-r15 INTEGER (-524288..524287),
+ aux-master-delta-longitude-r15 INTEGER (-1048576..1048575),
+ aux-master-delta-height-r15 INTEGER (-4194304..4194303),
+ aux-ARP-unc-r15 Aux-ARP-Unc-r15 OPTIONAL, -- Need ON
+ ...
+}
+
+Aux-ARP-Unc-r15 ::= SEQUENCE {
+ horizontalUncertainty-r15 INTEGER (0..255),
+ horizontalConfidence-r15 INTEGER (0..100),
+ verticalUncertainty-r15 INTEGER (0..255) OPTIONAL, -- Need ON
+ verticalConfidence-r15 INTEGER (0..100) OPTIONAL, -- Need ON
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-SSR-CorrectionPoints-r16 ::= SEQUENCE {
+ correctionPointSetID-r16 INTEGER (0..16383),
+ correctionPoints-r16 CHOICE {
+ listOfCorrectionPoints-r16 GNSS-SSR-ListOfCorrectionPoints-r16,
+ arrayOfCorrectionPoints-r16 GNSS-SSR-ArrayOfCorrectionPoints-r16
+ },
+ ...
+}
+
+GNSS-SSR-ListOfCorrectionPoints-r16 ::= SEQUENCE {
+ referencePointLatitude-r16 INTEGER (-16384..16383),
+ referencePointLongitude-r16 INTEGER (-32768..32767),
+ relativeLocationsList-r16 SEQUENCE (SIZE (0..63)) OF RelativeLocationElement-r16,
+ ...
+}
+
+RelativeLocationElement-r16 ::= SEQUENCE {
+ deltaLatitude-r16 INTEGER (-512..511),
+ deltaLongitude-r16 INTEGER (-1024..1023),
+ ...
+}
+
+GNSS-SSR-ArrayOfCorrectionPoints-r16 ::=SEQUENCE {
+ referencePointLatitude-r16 INTEGER (-16384..16383),
+ referencePointLongitude-r16 INTEGER (-32768..32767),
+ numberOfStepsLatitude-r16 INTEGER (0..63),
+ numberOfStepsLongitude-r16 INTEGER (0..63),
+ stepOfLatitude-r16 INTEGER (1..511),
+ stepOfLongitude-r16 INTEGER (1..1023),
+ bitmaskOfGrids-r16 BIT STRING (SIZE(64)) OPTIONAL, -- Need OP
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-TimeModelList ::= SEQUENCE (SIZE (1..15)) OF GNSS-TimeModelElement
+
+GNSS-TimeModelElement ::= SEQUENCE {
+ gnss-TimeModelRefTime INTEGER (0..65535),
+ tA0 INTEGER (-67108864..67108863),
+ tA1 INTEGER (-4096..4095) OPTIONAL, -- Need ON
+ tA2 INTEGER (-64..63) OPTIONAL, -- Need ON
+ gnss-TO-ID INTEGER (1..15),
+ weekNumber INTEGER (0..8191) OPTIONAL, -- Need ON
+ deltaT INTEGER (-128..127) OPTIONAL, -- Need ON
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-DifferentialCorrections ::= SEQUENCE {
+ dgnss-RefTime INTEGER (0..3599),
+ dgnss-SgnTypeList DGNSS-SgnTypeList,
+ ...
+}
+
+DGNSS-SgnTypeList ::= SEQUENCE (SIZE (1..3)) OF DGNSS-SgnTypeElement
+
+DGNSS-SgnTypeElement ::= SEQUENCE {
+ gnss-SignalID GNSS-SignalID,
+ gnss-StatusHealth INTEGER (0..7),
+ dgnss-SatList DGNSS-SatList,
+ ...
+}
+
+DGNSS-SatList ::= SEQUENCE (SIZE (1..64)) OF DGNSS-CorrectionsElement
+
+DGNSS-CorrectionsElement ::= SEQUENCE {
+ svID SV-ID,
+ iod BIT STRING (SIZE(11)),
+ udre INTEGER (0..3),
+ pseudoRangeCor INTEGER (-2047..2047),
+ rangeRateCor INTEGER (-127..127),
+ udreGrowthRate INTEGER (0..7) OPTIONAL, -- Need ON
+ udreValidityTime INTEGER (0..7) OPTIONAL, -- Need ON
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-NavigationModel ::= SEQUENCE {
+ nonBroadcastIndFlag INTEGER (0..1),
+ gnss-SatelliteList GNSS-NavModelSatelliteList,
+ ...
+}
+
+GNSS-NavModelSatelliteList ::= SEQUENCE (SIZE(1..64)) OF GNSS-NavModelSatelliteElement
+
+GNSS-NavModelSatelliteElement ::= SEQUENCE {
+ svID SV-ID,
+ svHealth BIT STRING (SIZE(8)),
+ iod BIT STRING (SIZE(11)),
+ gnss-ClockModel GNSS-ClockModel,
+ gnss-OrbitModel GNSS-OrbitModel,
+ ...,
+ [[ svHealthExt-v1240 BIT STRING (SIZE(4)) OPTIONAL -- Need ON
+ ]]
+}
+
+GNSS-ClockModel ::= CHOICE {
+ standardClockModelList StandardClockModelList, -- Model-1
+ nav-ClockModel NAV-ClockModel, -- Model-2
+ cnav-ClockModel CNAV-ClockModel, -- Model-3
+ glonass-ClockModel GLONASS-ClockModel, -- Model-4
+ sbas-ClockModel SBAS-ClockModel, -- Model-5
+ ...,
+ bds-ClockModel-r12 BDS-ClockModel-r12, -- Model-6
+ bds-ClockModel2-r16 BDS-ClockModel2-r16, -- Model-7
+ navic-ClockModel-r16 NavIC-ClockModel-r16 -- Model-8
+}
+
+GNSS-OrbitModel ::= CHOICE {
+ keplerianSet NavModelKeplerianSet, -- Model-1
+ nav-KeplerianSet NavModelNAV-KeplerianSet, -- Model-2
+ cnav-KeplerianSet NavModelCNAV-KeplerianSet, -- Model-3
+ glonass-ECEF NavModel-GLONASS-ECEF, -- Model-4
+ sbas-ECEF NavModel-SBAS-ECEF, -- Model-5
+ ...,
+ bds-KeplerianSet-r12 NavModel-BDS-KeplerianSet-r12, -- Model-6
+ bds-KeplerianSet2-r16 NavModel-BDS-KeplerianSet2-r16, -- Model-7
+ navic-KeplerianSet-r16 NavModel-NavIC-KeplerianSet-r16 -- Model-8
+}
+
+-- ASN1STOP
+-- ASN1START
+
+StandardClockModelList ::= SEQUENCE (SIZE(1..2)) OF StandardClockModelElement
+
+StandardClockModelElement ::= SEQUENCE {
+ stanClockToc INTEGER (0..16383),
+ stanClockAF2 INTEGER (-32..31),
+ stanClockAF1 INTEGER (-1048576..1048575),
+ stanClockAF0 INTEGER (-1073741824..1073741823),
+ stanClockTgd INTEGER (-512..511) OPTIONAL, -- Need ON
+ sisa INTEGER (0..255),
+ stanModelID INTEGER (0..1) OPTIONAL, -- Need ON
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NAV-ClockModel ::= SEQUENCE {
+ navToc INTEGER (0..37799),
+ navaf2 INTEGER (-128..127),
+ navaf1 INTEGER (-32768..32767),
+ navaf0 INTEGER (-2097152..2097151),
+ navTgd INTEGER (-128..127),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+CNAV-ClockModel ::= SEQUENCE {
+ cnavToc INTEGER (0..2015),
+ cnavTop INTEGER (0..2015),
+ cnavURA0 INTEGER (-16..15),
+ cnavURA1 INTEGER (0..7),
+ cnavURA2 INTEGER (0..7),
+ cnavAf2 INTEGER (-512..511),
+ cnavAf1 INTEGER (-524288..524287),
+ cnavAf0 INTEGER (-33554432..33554431),
+ cnavTgd INTEGER (-4096..4095),
+ cnavISCl1cp INTEGER (-4096..4095) OPTIONAL, -- Need ON
+ cnavISCl1cd INTEGER (-4096..4095) OPTIONAL, -- Need ON
+ cnavISCl1ca INTEGER (-4096..4095) OPTIONAL, -- Need ON
+ cnavISCl2c INTEGER (-4096..4095) OPTIONAL, -- Need ON
+ cnavISCl5i5 INTEGER (-4096..4095) OPTIONAL, -- Need ON
+ cnavISCl5q5 INTEGER (-4096..4095) OPTIONAL, -- Need ON
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GLONASS-ClockModel ::= SEQUENCE {
+ gloTau INTEGER (-2097152..2097151),
+ gloGamma INTEGER (-1024..1023),
+ gloDeltaTau INTEGER (-16..15) OPTIONAL, -- Need ON
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+SBAS-ClockModel ::= SEQUENCE {
+ sbasTo INTEGER (0..5399),
+ sbasAgfo INTEGER (-2048..2047),
+ sbasAgf1 INTEGER (-128..127),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+BDS-ClockModel-r12 ::= SEQUENCE {
+ bdsAODC-r12 INTEGER (0..31),
+ bdsToc-r12 INTEGER (0..131071),
+ bdsA0-r12 INTEGER (-8388608..8388607),
+ bdsA1-r12 INTEGER (-2097152..2097151),
+ bdsA2-r12 INTEGER (-1024..1023),
+ bdsTgd1-r12 INTEGER (-512..511),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+BDS-ClockModel2-r16 ::= SEQUENCE {
+ bdsToc-r16 INTEGER (0..2047),
+ bdsA0-r16 INTEGER (-16777216..16777215),
+ bdsA1-r16 INTEGER (-2097152..2097151),
+ bdsA2-r16 INTEGER (-1024..1023),
+ bdsTgdB1Cp-r16 INTEGER (-2048..2047),
+ bdsIscB1Cd-r16 INTEGER (-2048..2047),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NavIC-ClockModel-r16 ::= SEQUENCE {
+ navic-Toc-r16 INTEGER (0..65535),
+ navic-af2-r16 INTEGER (-128..127),
+ navic-af1-r16 INTEGER (-32768..32767),
+ navic-af0-r16 INTEGER (-2097152..2097151),
+ navic-Tgd-r16 INTEGER (-128..127),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NavModelKeplerianSet ::= SEQUENCE {
+ keplerToe INTEGER (0 .. 16383),
+ keplerW INTEGER (-2147483648..2147483647),
+ keplerDeltaN INTEGER (-32768..32767),
+ keplerM0 INTEGER (-2147483648..2147483647),
+ keplerOmegaDot INTEGER (-8388608.. 8388607),
+ keplerE INTEGER (0..4294967295),
+ keplerIDot INTEGER (-8192..8191),
+ keplerAPowerHalf INTEGER (0.. 4294967295),
+ keplerI0 INTEGER (-2147483648..2147483647),
+ keplerOmega0 INTEGER (-2147483648..2147483647),
+ keplerCrs INTEGER (-32768..32767),
+ keplerCis INTEGER (-32768..32767),
+ keplerCus INTEGER (-32768..32767),
+ keplerCrc INTEGER (-32768..32767),
+ keplerCic INTEGER (-32768..32767),
+ keplerCuc INTEGER (-32768..32767),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NavModelNAV-KeplerianSet ::= SEQUENCE {
+ navURA INTEGER (0..15),
+ navFitFlag INTEGER (0..1),
+ navToe INTEGER (0..37799),
+ navOmega INTEGER (-2147483648..2147483647),
+ navDeltaN INTEGER (-32768..32767),
+ navM0 INTEGER (-2147483648..2147483647),
+ navOmegaADot INTEGER (-8388608..8388607),
+ navE INTEGER (0..4294967295),
+ navIDot INTEGER (-8192..8191),
+ navAPowerHalf INTEGER (0..4294967295),
+ navI0 INTEGER (-2147483648..2147483647),
+ navOmegaA0 INTEGER (-2147483648..2147483647),
+ navCrs INTEGER (-32768..32767),
+ navCis INTEGER (-32768..32767),
+ navCus INTEGER (-32768..32767),
+ navCrc INTEGER (-32768..32767),
+ navCic INTEGER (-32768..32767),
+ navCuc INTEGER (-32768..32767),
+ addNAVparam SEQUENCE {
+ ephemCodeOnL2 INTEGER (0..3),
+ ephemL2Pflag INTEGER (0..1),
+ ephemSF1Rsvd SEQUENCE {
+ reserved1 INTEGER (0..8388607), -- 23-bit field
+ reserved2 INTEGER (0..16777215), -- 24-bit field
+ reserved3 INTEGER (0..16777215), -- 24-bit field
+ reserved4 INTEGER (0..65535) -- 16-bit field
+ },
+ ephemAODA INTEGER (0..31)
+ } OPTIONAL, -- Need ON
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NavModelCNAV-KeplerianSet ::= SEQUENCE {
+ cnavTop INTEGER (0..2015),
+ cnavURAindex INTEGER (-16..15),
+ cnavDeltaA INTEGER (-33554432..33554431),
+ cnavAdot INTEGER (-16777216..16777215),
+ cnavDeltaNo INTEGER (-65536..65535),
+ cnavDeltaNoDot INTEGER (-4194304..4194303),
+ cnavMo INTEGER (-4294967296..4294967295),
+ cnavE INTEGER (0..8589934591),
+ cnavOmega INTEGER (-4294967296..4294967295),
+ cnavOMEGA0 INTEGER (-4294967296..4294967295),
+ cnavDeltaOmegaDot INTEGER (-65536..65535),
+ cnavIo INTEGER (-4294967296..4294967295),
+ cnavIoDot INTEGER (-16384..16383),
+ cnavCis INTEGER (-32768..32767),
+ cnavCic INTEGER (-32768..32767),
+ cnavCrs INTEGER (-8388608..8388607),
+ cnavCrc INTEGER (-8388608..8388607),
+ cnavCus INTEGER (-1048576..1048575),
+ cnavCuc INTEGER (-1048576..1048575),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NavModel-GLONASS-ECEF ::= SEQUENCE {
+ gloEn INTEGER (0..31),
+ gloP1 BIT STRING (SIZE(2)),
+ gloP2 BOOLEAN,
+ gloM INTEGER (0..3),
+ gloX INTEGER (-67108864..67108863),
+ gloXdot INTEGER (-8388608..8388607),
+ gloXdotdot INTEGER (-16..15),
+ gloY INTEGER (-67108864..67108863),
+ gloYdot INTEGER (-8388608..8388607),
+ gloYdotdot INTEGER (-16..15),
+ gloZ INTEGER (-67108864..67108863),
+ gloZdot INTEGER (-8388608..8388607),
+ gloZdotdot INTEGER (-16..15),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NavModel-SBAS-ECEF ::= SEQUENCE {
+ sbasTo INTEGER (0..5399) OPTIONAL, -- Cond ClockModel
+ sbasAccuracy BIT STRING (SIZE(4)),
+ sbasXg INTEGER (-536870912..536870911),
+ sbasYg INTEGER (-536870912..536870911),
+ sbasZg INTEGER (-16777216..16777215),
+ sbasXgDot INTEGER (-65536..65535),
+ sbasYgDot INTEGER (-65536..65535),
+ sbasZgDot INTEGER (-131072..131071),
+ sbasXgDotDot INTEGER (-512..511),
+ sbagYgDotDot INTEGER (-512..511),
+ sbasZgDotDot INTEGER (-512..511),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NavModel-BDS-KeplerianSet-r12 ::= SEQUENCE {
+ bdsAODE-r12 INTEGER (0..31),
+ bdsURAI-r12 INTEGER (0..15),
+ bdsToe-r12 INTEGER (0..131071),
+ bdsAPowerHalf-r12 INTEGER (0..4294967295),
+ bdsE-r12 INTEGER (0..4294967295),
+ bdsW-r12 INTEGER (-2147483648..2147483647),
+ bdsDeltaN-r12 INTEGER (-32768..32767),
+ bdsM0-r12 INTEGER (-2147483648..2147483647),
+ bdsOmega0-r12 INTEGER (-2147483648..2147483647),
+ bdsOmegaDot-r12 INTEGER (-8388608..8388607),
+ bdsI0-r12 INTEGER (-2147483648..2147483647),
+ bdsIDot-r12 INTEGER (-8192..8191),
+ bdsCuc-r12 INTEGER (-131072..131071),
+ bdsCus-r12 INTEGER (-131072..131071),
+ bdsCrc-r12 INTEGER (-131072..131071),
+ bdsCrs-r12 INTEGER (-131072..131071),
+ bdsCic-r12 INTEGER (-131072..131071),
+ bdsCis-r12 INTEGER (-131072..131071),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NavModel-BDS-KeplerianSet2-r16 ::= SEQUENCE {
+ bdsIODE-r16 INTEGER (0..255),
+ bdsToe-r16 INTEGER (0..2047),
+ bdsDeltaA-r16 INTEGER (-33554432..33554431),
+ bdsAdot-r16 INTEGER (-16777216..16777216),
+ bdsDeltaN0-r16 INTEGER (-65536..65535),
+ bdsDeltaN0dot-r16 INTEGER (-4194304..4194303),
+ bdsM0-r16 INTEGER (-4294967296..4294967295),
+ bdsE-r16 INTEGER (0..8589934591),
+ bdsOmega-r16 INTEGER (-4294967296..4294967295),
+ bdsOmega0-r16 INTEGER (-4294967296..4294967295),
+ bdsI0-r16 INTEGER (-4294967296..4294967295),
+ bdsOmegaDot-r16 INTEGER (-262144..262143),
+ bdsI0Dot-r16 INTEGER (-16384..16383),
+ bdsCuc-r16 INTEGER (-1048576..1048575),
+ bdsCus-r16 INTEGER (-1048576..1048575),
+ bdsCrc-r16 INTEGER (-8388608..8388607),
+ bdsCrs-r16 INTEGER (-8388608..8388607),
+ bdsCic-r16 INTEGER (-32768..32767),
+ bdsCis-r16 INTEGER (-32768..32767),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NavModel-NavIC-KeplerianSet-r16 ::= SEQUENCE {
+ navic-Toe-r16 INTEGER (0..65536),
+ navic-URAI-r16 INTEGER (0..15),
+ navic-W-r16 INTEGER (-2147483648..2147483647),
+ navic-DeltaN-r16 INTEGER (-2097152..2097151),
+ navic-M0-r16 INTEGER (-2147483648..2147483647),
+ navic-OmegaDot-r16 INTEGER (-2147483648..2147483647),
+ navic-E-r16 INTEGER (0..4294967295),
+ navic-IDot-r16 INTEGER (-8192..8191),
+ navic-APowerHalf-r16 INTEGER (0.. 4294967295),
+ navic-I0-r16 INTEGER (-2147483648..2147483647),
+ navic-Omega0-r16 INTEGER (-2147483648..2147483647),
+ navic-Crs-r16 INTEGER (-32768..32767),
+ navic-Cis-r16 INTEGER (-32768..32767),
+ navic-Cus-r16 INTEGER (-32768..32767),
+ navic-Crc-r16 INTEGER (-32768..32767),
+ navic-Cic-r16 INTEGER (-32768..32767),
+ navic-Cuc-r16 INTEGER (-32768..32767),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-RealTimeIntegrity ::= SEQUENCE {
+ gnss-BadSignalList GNSS-BadSignalList,
+ ...
+}
+
+GNSS-BadSignalList ::= SEQUENCE (SIZE(1..64)) OF BadSignalElement
+
+BadSignalElement ::= SEQUENCE {
+ badSVID SV-ID,
+ badSignalID GNSS-SignalIDs OPTIONAL, -- Need OP
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-DataBitAssistance ::= SEQUENCE {
+ gnss-TOD INTEGER (0..3599),
+ gnss-TODfrac INTEGER (0..999) OPTIONAL, -- Need ON
+ gnss-DataBitsSatList GNSS-DataBitsSatList,
+ ...
+}
+
+GNSS-DataBitsSatList ::= SEQUENCE (SIZE(1..64))OF GNSS-DataBitsSatElement
+
+GNSS-DataBitsSatElement ::= SEQUENCE {
+ svID SV-ID,
+ gnss-DataBitsSgnList GNSS-DataBitsSgnList,
+ ...
+}
+
+GNSS-DataBitsSgnList ::= SEQUENCE (SIZE(1..8)) OF GNSS-DataBitsSgnElement
+
+GNSS-DataBitsSgnElement ::= SEQUENCE {
+ gnss-SignalType GNSS-SignalID,
+ gnss-DataBits BIT STRING (SIZE (1..1024)),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-AcquisitionAssistance ::= SEQUENCE {
+ gnss-SignalID GNSS-SignalID,
+ gnss-AcquisitionAssistList GNSS-AcquisitionAssistList,
+ ...,
+ confidence-r10 INTEGER (0..100) OPTIONAL -- Need ON
+}
+
+GNSS-AcquisitionAssistList ::= SEQUENCE (SIZE(1..64)) OF GNSS-AcquisitionAssistElement
+
+GNSS-AcquisitionAssistElement ::= SEQUENCE {
+ svID SV-ID,
+ doppler0 INTEGER (-2048..2047),
+ doppler1 INTEGER (0..63),
+ dopplerUncertainty INTEGER (0..4),
+ codePhase INTEGER (0..1022),
+ intCodePhase INTEGER (0..127),
+ codePhaseSearchWindow INTEGER (0..31),
+ azimuth INTEGER (0..511),
+ elevation INTEGER (0..127),
+ ...,
+ codePhase1023 BOOLEAN OPTIONAL, -- Need OP
+ dopplerUncertaintyExt-r10 ENUMERATED { d60,
+ d80,
+ d100,
+ d120,
+ noInformation, ... } OPTIONAL -- Need ON
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-Almanac ::= SEQUENCE {
+ weekNumber INTEGER (0..255) OPTIONAL, -- Need ON
+ toa INTEGER (0..255) OPTIONAL, -- Need ON
+ ioda INTEGER (0..3) OPTIONAL, -- Need ON
+ completeAlmanacProvided BOOLEAN,
+ gnss-AlmanacList GNSS-AlmanacList,
+ ...,
+ [[ toa-ext-v1240 INTEGER (256..1023) OPTIONAL, -- Need ON
+ ioda-ext-v1240 INTEGER (4..15) OPTIONAL -- Need ON
+ ]],
+ [[
+ weekNumber-ext-r16 INTEGER (256..8191) OPTIONAL, -- Need ON
+ toa-ext2-r16 INTEGER (256..65535) OPTIONAL -- Need ON
+ ]]
+}
+
+GNSS-AlmanacList ::= SEQUENCE (SIZE(1..64)) OF GNSS-AlmanacElement
+
+GNSS-AlmanacElement ::= CHOICE {
+ keplerianAlmanacSet AlmanacKeplerianSet, -- Model-1
+ keplerianNAV-Almanac AlmanacNAV-KeplerianSet, -- Model-2
+ keplerianReducedAlmanac AlmanacReducedKeplerianSet, -- Model-3
+ keplerianMidiAlmanac AlmanacMidiAlmanacSet, -- Model-4
+ keplerianGLONASS AlmanacGLONASS-AlmanacSet, -- Model-5
+ ecef-SBAS-Almanac AlmanacECEF-SBAS-AlmanacSet,-- Model-6
+ ...,
+ keplerianBDS-Almanac-r12 AlmanacBDS-AlmanacSet-r12, -- Model-7
+ keplerianNavIC-Almanac-r16 AlmanacNavIC-AlmanacSet-r16 -- Model-8
+}
+
+-- ASN1STOP
+-- ASN1START
+
+AlmanacKeplerianSet ::= SEQUENCE {
+ svID SV-ID,
+ kepAlmanacE INTEGER (0..2047),
+ kepAlmanacDeltaI INTEGER (-1024..1023),
+ kepAlmanacOmegaDot INTEGER (-1024..1023),
+ kepSV-StatusINAV BIT STRING (SIZE (4)),
+ kepSV-StatusFNAV BIT STRING (SIZE (2)) OPTIONAL, -- Need ON
+ kepAlmanacAPowerHalf INTEGER (-4096..4095),
+ kepAlmanacOmega0 INTEGER (-32768..32767),
+ kepAlmanacW INTEGER (-32768..32767),
+ kepAlmanacM0 INTEGER (-32768..32767),
+ kepAlmanacAF0 INTEGER (-32768..32767),
+ kepAlmanacAF1 INTEGER (-4096..4095),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+AlmanacNAV-KeplerianSet ::= SEQUENCE {
+ svID SV-ID,
+ navAlmE INTEGER (0..65535),
+ navAlmDeltaI INTEGER (-32768..32767),
+ navAlmOMEGADOT INTEGER (-32768..32767),
+ navAlmSVHealth INTEGER (0..255),
+ navAlmSqrtA INTEGER (0..16777215),
+ navAlmOMEGAo INTEGER (-8388608..8388607),
+ navAlmOmega INTEGER (-8388608..8388607),
+ navAlmMo INTEGER (-8388608..8388607),
+ navAlmaf0 INTEGER (-1024..1023),
+ navAlmaf1 INTEGER (-1024..1023),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+AlmanacReducedKeplerianSet ::= SEQUENCE {
+ svID SV-ID,
+ redAlmDeltaA INTEGER (-128..127),
+ redAlmOmega0 INTEGER (-64..63),
+ redAlmPhi0 INTEGER (-64..63),
+ redAlmL1Health BOOLEAN,
+ redAlmL2Health BOOLEAN,
+ redAlmL5Health BOOLEAN,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+AlmanacMidiAlmanacSet ::= SEQUENCE {
+ svID SV-ID,
+ midiAlmE INTEGER (0..2047),
+ midiAlmDeltaI INTEGER (-1024..1023),
+ midiAlmOmegaDot INTEGER (-1024..1023),
+ midiAlmSqrtA INTEGER (0..131071),
+ midiAlmOmega0 INTEGER (-32768..32767),
+ midiAlmOmega INTEGER (-32768..32767),
+ midiAlmMo INTEGER (-32768..32767),
+ midiAlmaf0 INTEGER (-1024..1023),
+ midiAlmaf1 INTEGER (-512..511),
+ midiAlmL1Health BOOLEAN,
+ midiAlmL2Health BOOLEAN,
+ midiAlmL5Health BOOLEAN,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+AlmanacGLONASS-AlmanacSet ::= SEQUENCE {
+ gloAlm-NA INTEGER (1..1461),
+ gloAlmnA INTEGER (1..24),
+ gloAlmHA INTEGER (0..31),
+ gloAlmLambdaA INTEGER (-1048576..1048575),
+ gloAlmtlambdaA INTEGER (0..2097151),
+ gloAlmDeltaIa INTEGER (-131072..131071),
+ gloAlmDeltaTA INTEGER (-2097152..2097151),
+ gloAlmDeltaTdotA INTEGER (-64..63),
+ gloAlmEpsilonA INTEGER (0..32767),
+ gloAlmOmegaA INTEGER (-32768..32767),
+ gloAlmTauA INTEGER (-512..511),
+ gloAlmCA INTEGER (0..1),
+ gloAlmMA BIT STRING (SIZE(2)) OPTIONAL, -- Need ON
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+AlmanacECEF-SBAS-AlmanacSet ::= SEQUENCE {
+ sbasAlmDataID INTEGER (0..3),
+ svID SV-ID,
+ sbasAlmHealth BIT STRING (SIZE(8)),
+ sbasAlmXg INTEGER (-16384..16383),
+ sbasAlmYg INTEGER (-16384..16383),
+ sbasAlmZg INTEGER (-256..255),
+ sbasAlmXgdot INTEGER (-4..3),
+ sbasAlmYgDot INTEGER (-4..3),
+ sbasAlmZgDot INTEGER (-8..7),
+ sbasAlmTo INTEGER (0..2047),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+AlmanacBDS-AlmanacSet-r12 ::= SEQUENCE {
+ svID SV-ID,
+ bdsAlmToa-r12 INTEGER (0..255) OPTIONAL, -- Cond NotSameForAllSV
+ bdsAlmSqrtA-r12 INTEGER (0..16777215),
+ bdsAlmE-r12 INTEGER (0..131071),
+ bdsAlmW-r12 INTEGER (-8388608..8388607),
+ bdsAlmM0-r12 INTEGER (-8388608..8388607),
+ bdsAlmOmega0-r12 INTEGER (-8388608..8388607),
+ bdsAlmOmegaDot-r12 INTEGER (-65536..65535),
+ bdsAlmDeltaI-r12 INTEGER (-32768..32767),
+ bdsAlmA0-r12 INTEGER (-1024..1023),
+ bdsAlmA1-r12 INTEGER (-1024..1023),
+ bdsSvHealth-r12 BIT STRING (SIZE(9)) OPTIONAL, -- Cond SV-ID
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+AlmanacNavIC-AlmanacSet-r16 ::= SEQUENCE {
+ svID-r16 SV-ID,
+ navic-AlmToa-r16 INTEGER (0..65535) OPTIONAL, -- Cond NotSameForAllSV
+ navic-AlmE-r16 INTEGER (0..65535),
+ navic-AlmOMEGADOT-r16 INTEGER (-32768..32767),
+ navic-AlmSqrtA-r16 INTEGER (0..16777215),
+ navic-AlmOMEGAo-r16 INTEGER (-8388608..8388607),
+ navic-AlmOmega-r16 INTEGER (-8388608..8388607),
+ navic-AlmMo-r16 INTEGER (-8388608..8388607),
+ navic-Almaf0-r16 INTEGER (-1024..1023),
+ navic-Almaf1-r16 INTEGER (-1024..1023),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-UTC-Model ::= CHOICE {
+ utcModel1 UTC-ModelSet1, -- Model-1
+ utcModel2 UTC-ModelSet2, -- Model-2
+ utcModel3 UTC-ModelSet3, -- Model-3
+ utcModel4 UTC-ModelSet4, -- Model-4
+ ...,
+ utcModel5-r12 UTC-ModelSet5-r12 -- Model-5
+}
+
+-- ASN1STOP
+-- ASN1START
+
+UTC-ModelSet1 ::= SEQUENCE {
+ gnss-Utc-A1 INTEGER (-8388608..8388607),
+ gnss-Utc-A0 INTEGER (-2147483648..2147483647),
+ gnss-Utc-Tot INTEGER (0..255),
+ gnss-Utc-WNt INTEGER (0..255),
+ gnss-Utc-DeltaTls INTEGER (-128..127),
+ gnss-Utc-WNlsf INTEGER (0..255),
+ gnss-Utc-DN INTEGER (-128..127),
+ gnss-Utc-DeltaTlsf INTEGER (-128..127),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+UTC-ModelSet2 ::= SEQUENCE {
+ utcA0 INTEGER (-32768..32767),
+ utcA1 INTEGER (-4096..4095),
+ utcA2 INTEGER (-64..63),
+ utcDeltaTls INTEGER (-128..127),
+ utcTot INTEGER (0..65535),
+ utcWNot INTEGER (0..8191),
+ utcWNlsf INTEGER (0..255),
+ utcDN BIT STRING (SIZE(4)),
+ utcDeltaTlsf INTEGER (-128..127),
+ ...,
+ [[
+ utcWNlsf-ext-r16 INTEGER (256..8191) OPTIONAL -- Need ON
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+UTC-ModelSet3 ::= SEQUENCE {
+ nA INTEGER (1..1461),
+ tauC INTEGER (-2147483648..2147483647),
+ b1 INTEGER (-1024..1023) OPTIONAL, -- Cond GLONASS-M
+ b2 INTEGER (-512..511) OPTIONAL, -- Cond GLONASS-M
+ kp BIT STRING (SIZE(2)) OPTIONAL, -- Cond GLONASS-M
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+UTC-ModelSet4 ::= SEQUENCE {
+ utcA1wnt INTEGER (-8388608..8388607),
+ utcA0wnt INTEGER (-2147483648..2147483647),
+ utcTot INTEGER (0..255),
+ utcWNt INTEGER (0..255),
+ utcDeltaTls INTEGER (-128..127),
+ utcWNlsf INTEGER (0..255),
+ utcDN INTEGER (-128..127),
+ utcDeltaTlsf INTEGER (-128..127),
+ utcStandardID INTEGER (0..7),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+UTC-ModelSet5-r12 ::= SEQUENCE {
+ utcA0-r12 INTEGER (-2147483648..2147483647),
+ utcA1-r12 INTEGER (-8388608..8388607),
+ utcDeltaTls-r12 INTEGER (-128..127),
+ utcWNlsf-r12 INTEGER (0..255),
+ utcDN-r12 INTEGER (0..255),
+ utcDeltaTlsf-r12 INTEGER (-128..127),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-AuxiliaryInformation ::= CHOICE {
+ gnss-ID-GPS GNSS-ID-GPS,
+ gnss-ID-GLONASS GNSS-ID-GLONASS,
+ ...,
+ [[ gnss-ID-BDS-r16 GNSS-ID-BDS-r16
+ ]]
+}
+
+GNSS-ID-GPS ::= SEQUENCE (SIZE(1..64)) OF GNSS-ID-GPS-SatElement
+
+GNSS-ID-GPS-SatElement ::= SEQUENCE {
+ svID SV-ID,
+ signalsAvailable GNSS-SignalIDs,
+ ...
+}
+
+GNSS-ID-GLONASS ::= SEQUENCE (SIZE(1..64)) OF GNSS-ID-GLONASS-SatElement
+
+GNSS-ID-GLONASS-SatElement ::= SEQUENCE {
+ svID SV-ID,
+ signalsAvailable GNSS-SignalIDs,
+ channelNumber INTEGER (-7..13) OPTIONAL, -- Cond FDMA
+ ...
+}
+
+GNSS-ID-BDS-r16 ::= SEQUENCE (SIZE(1..64)) OF GNSS-ID-BDS-SatElement-r16
+
+GNSS-ID-BDS-SatElement-r16 ::= SEQUENCE {
+ svID-r16 SV-ID,
+ satType-r16 INTEGER (0..3),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+BDS-DifferentialCorrections-r12 ::= SEQUENCE {
+ dbds-RefTime-r12 INTEGER (0..3599),
+ bds-SgnTypeList-r12 BDS-SgnTypeList-r12,
+ ...
+}
+
+BDS-SgnTypeList-r12 ::= SEQUENCE (SIZE (1..3)) OF BDS-SgnTypeElement-r12
+
+BDS-SgnTypeElement-r12 ::= SEQUENCE {
+ gnss-SignalID GNSS-SignalID OPTIONAL, -- Need ON
+ dbds-CorrectionList-r12 DBDS-CorrectionList-r12,
+ ...
+}
+
+DBDS-CorrectionList-r12 ::= SEQUENCE (SIZE (1..64)) OF DBDS-CorrectionElement-r12
+
+DBDS-CorrectionElement-r12 ::= SEQUENCE {
+ svID SV-ID,
+ bds-UDREI-r12 INTEGER (0..15),
+ bds-RURAI-r12 INTEGER (0..15),
+ bds-ECC-DeltaT-r12 INTEGER (-4096..4095),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+BDS-GridModelParameter-r12 ::= SEQUENCE {
+ bds-RefTime-r12 INTEGER (0..3599),
+ gridIonList-r12 GridIonList-r12,
+ ...
+}
+
+GridIonList-r12 ::= SEQUENCE (SIZE (1..320)) OF GridIonElement-r12
+
+GridIonElement-r12 ::= SEQUENCE {
+ igp-ID-r12 INTEGER (1..320),
+ dt-r12 INTEGER (0..511),
+ givei-r12 INTEGER (0..15) ,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-RTK-Observations-r15 ::= SEQUENCE {
+ epochTime-r15 GNSS-SystemTime,
+ gnss-ObservationList-r15 GNSS-ObservationList-r15,
+ ...
+}
+
+GNSS-ObservationList-r15 ::= SEQUENCE (SIZE(1..64)) OF GNSS-RTK-SatelliteDataElement-r15
+
+GNSS-RTK-SatelliteDataElement-r15 ::= SEQUENCE{
+ svID-r15 SV-ID,
+ integer-ms-r15 INTEGER (0..254) OPTIONAL, -- Need ON
+ rough-range-r15 INTEGER (0..1023),
+ rough-phase-range-rate-r15 INTEGER (-8192..8191) OPTIONAL, -- Need ON
+ gnss-rtk-SatelliteSignalDataList-r15 GNSS-RTK-SatelliteSignalDataList-r15,
+ ...
+}
+
+GNSS-RTK-SatelliteSignalDataList-r15 ::= SEQUENCE (SIZE(1..24)) OF
+ GNSS-RTK-SatelliteSignalDataElement-r15
+
+
+GNSS-RTK-SatelliteSignalDataElement-r15 ::= SEQUENCE {
+ gnss-SignalID-r15 GNSS-SignalID,
+ fine-PseudoRange-r15 INTEGER (-524288..524287),
+ fine-PhaseRange-r15 INTEGER (-8388608..8388607),
+ lockTimeIndicator-r15 INTEGER (0..1023),
+ halfCycleAmbiguityIndicator-r15 BIT STRING (SIZE (1)),
+ carrier-to-noise-ratio-r15 INTEGER (0..1023) OPTIONAL, -- Need ON
+ fine-PhaseRangeRate-r15 INTEGER (-16384..16383) OPTIONAL, -- Need ON
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GLO-RTK-BiasInformation-r15 ::= SEQUENCE{
+ referenceStationID-r15 GNSS-ReferenceStationID-r15,
+ cpbIndicator-r15 BIT STRING (SIZE(1)),
+ l1-ca-cpBias-r15 INTEGER (-32768..32767) OPTIONAL, -- Need ON
+ l1-p-cpBias-r15 INTEGER (-32768..32767) OPTIONAL, -- Need ON
+ l2-ca-cpBias-r15 INTEGER (-32768..32767) OPTIONAL, -- Need ON
+ l2-p-cpBias-r15 INTEGER (-32768..32767) OPTIONAL, -- Need ON
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-RTK-MAC-CorrectionDifferences-r15 ::= SEQUENCE {
+ networkID-r15 GNSS-NetworkID-r15,
+ subNetworkID-r15 GNSS-SubNetworkID-r15 OPTIONAL, -- Need ON
+ master-ReferenceStationID-r15 GNSS-ReferenceStationID-r15,
+ l1-r15 GNSS-FrequencyID-r15 OPTIONAL, -- Need OP
+ l2-r15 GNSS-FrequencyID-r15 OPTIONAL, -- Need OP
+ rtkCorrectionDifferencesList-r15 RTK-CorrectionDifferencesList-r15,
+ ...
+}
+
+RTK-CorrectionDifferencesList-r15 ::= SEQUENCE (SIZE (1..32)) OF
+ RTK-CorrectionDifferencesElement-r15
+
+RTK-CorrectionDifferencesElement-r15 ::= SEQUENCE {
+ epochTime-r15 GNSS-SystemTime,
+ auxiliary-referenceStationID-r15 GNSS-ReferenceStationID-r15,
+ geometric-ionospheric-corrections-differences-r15
+ Geometric-Ionospheric-Corrections-Differences-r15,
+ ...
+}
+
+Geometric-Ionospheric-Corrections-Differences-r15 ::= SEQUENCE (SIZE(1..64)) OF
+ Geometric-Ionospheric-Corrections-Differences-Element-r15
+
+Geometric-Ionospheric-Corrections-Differences-Element-r15 ::= SEQUENCE {
+ svID-r15 SV-ID,
+ ambiguityStatusFlag-r15 INTEGER (0..3),
+ non-synch-count-r15 INTEGER (0..7),
+ geometricCarrierPhaseCorrectionDifference-r15 INTEGER (-65536..65535),
+ iod-r15 BIT STRING (SIZE(11)),
+ ionosphericCarrierPhaseCorrectionDifference-r15 INTEGER (-65536..65535),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-RTK-Residuals-r15 ::= SEQUENCE {
+ epochTime-r15 GNSS-SystemTime,
+ referenceStationID-r15 GNSS-ReferenceStationID-r15,
+ n-Refs-r15 INTEGER (0..127),
+ l1-r15 GNSS-FrequencyID-r15 OPTIONAL, -- Need OP
+ l2-r15 GNSS-FrequencyID-r15 OPTIONAL, -- Need OP
+ rtk-residuals-list-r15 RTK-Residuals-List-r15,
+ ...
+}
+
+RTK-Residuals-List-r15 ::= SEQUENCE (SIZE(1..64)) OF RTK-Residuals-Element-r15
+
+RTK-Residuals-Element-r15 ::= SEQUENCE {
+ svID-r15 SV-ID,
+ s-oc-r15 INTEGER (0..255),
+ s-od-r15 INTEGER (0..511),
+ s-oh-r15 INTEGER (0..63),
+ s-lc-r15 INTEGER (0..1023),
+ s-ld-r15 INTEGER (0..1023),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-RTK-FKP-Gradients-r15 ::= SEQUENCE {
+ referenceStationID-r15 GNSS-ReferenceStationID-r15,
+ epochTime-r15 GNSS-SystemTime,
+ l1-r15 GNSS-FrequencyID-r15 OPTIONAL, -- Need OP
+ l2-r15 GNSS-FrequencyID-r15 OPTIONAL, -- Need OP
+ fkp-gradients-list-r15 FKP-Gradients-List-r15,
+ ...
+}
+
+FKP-Gradients-List-r15 ::= SEQUENCE (SIZE(1..64)) OF FKP-Gradients-Element-r15
+
+FKP-Gradients-Element-r15 ::= SEQUENCE {
+ svID-r15 SV-ID,
+ iod-r15 BIT STRING (SIZE(11)),
+ north-geometric-gradient-r15 INTEGER (-2048..2047),
+ east-geometric-gradient-r15 INTEGER (-2048..2047),
+ north-ionospheric-gradient-r15 INTEGER (-8192..8191),
+ east-ionospheric-gradient-r15 INTEGER (-8192..8191),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-SSR-OrbitCorrections-r15 ::= SEQUENCE {
+ epochTime-r15 GNSS-SystemTime,
+ ssrUpdateInterval-r15 INTEGER (0..15),
+ satelliteReferenceDatum-r15 ENUMERATED { itrf, regional, ... },
+ iod-ssr-r15 INTEGER (0..15),
+ ssr-OrbitCorrectionList-r15 SSR-OrbitCorrectionList-r15,
+ ...
+}
+
+SSR-OrbitCorrectionList-r15 ::= SEQUENCE (SIZE(1..64)) OF SSR-OrbitCorrectionSatelliteElement-r15
+
+SSR-OrbitCorrectionSatelliteElement-r15 ::= SEQUENCE {
+ svID-r15 SV-ID,
+ iod-r15 BIT STRING (SIZE(11)),
+ delta-radial-r15 INTEGER (-2097152..2097151),
+ delta-AlongTrack-r15 INTEGER (-524288..524287),
+ delta-CrossTrack-r15 INTEGER (-524288..524287),
+ dot-delta-radial-r15 INTEGER (-1048576..1048575) OPTIONAL, -- Need ON
+ dot-delta-AlongTrack-r15 INTEGER (-262144..262143) OPTIONAL, -- Need ON
+ dot-delta-CrossTrack-r15 INTEGER (-262144..262143) OPTIONAL, -- Need ON
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-SSR-ClockCorrections-r15 ::= SEQUENCE {
+ epochTime-r15 GNSS-SystemTime,
+ ssrUpdateInterval-r15 INTEGER (0..15),
+ iod-ssr-r15 INTEGER (0..15),
+ ssr-ClockCorrectionList-r15 SSR-ClockCorrectionList-r15,
+ ...
+}
+
+SSR-ClockCorrectionList-r15 ::= SEQUENCE (SIZE(1..64)) OF SSR-ClockCorrectionSatelliteElement-r15
+
+SSR-ClockCorrectionSatelliteElement-r15 ::= SEQUENCE {
+ svID-r15 SV-ID,
+ delta-Clock-C0-r15 INTEGER (-2097152..2097151),
+ delta-Clock-C1-r15 INTEGER (-1048576..1048575) OPTIONAL, -- Need ON
+ delta-Clock-C2-r15 INTEGER (-67108864..67108863) OPTIONAL, -- Need ON
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-SSR-CodeBias-r15 ::= SEQUENCE {
+ epochTime-r15 GNSS-SystemTime,
+ ssrUpdateInterval-r15 INTEGER (0..15),
+ iod-ssr-r15 INTEGER (0..15),
+ ssr-CodeBiasSatList-r15 SSR-CodeBiasSatList-r15,
+ ...
+}
+
+SSR-CodeBiasSatList-r15 ::= SEQUENCE (SIZE(1..64)) OF SSR-CodeBiasSatElement-r15
+
+SSR-CodeBiasSatElement-r15 ::= SEQUENCE {
+ svID-r15 SV-ID,
+ ssr-CodeBiasSignalList-r15 SSR-CodeBiasSignalList-r15,
+ ...
+}
+
+SSR-CodeBiasSignalList-r15 ::= SEQUENCE (SIZE(1..16)) OF SSR-CodeBiasSignalElement-r15
+
+SSR-CodeBiasSignalElement-r15 ::= SEQUENCE {
+ signal-and-tracking-mode-ID-r15 GNSS-SignalID,
+ codeBias-r15 INTEGER (-8192..8191),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-SSR-URA-r16 ::= SEQUENCE {
+ epochTime-r16 GNSS-SystemTime,
+ ssrUpdateInterval-r16 INTEGER (0..15),
+ iod-ssr-r16 INTEGER (0..15),
+ ssr-URA-SatList-r16 SSR-URA-SatList-r16,
+ ...
+}
+
+SSR-URA-SatList-r16 ::= SEQUENCE (SIZE(1..64)) OF SSR-URA-SatElement-r16
+
+SSR-URA-SatElement-r16 ::= SEQUENCE {
+ svID-r16 SV-ID,
+ ssr-URA-r16 BIT STRING (SIZE (6)),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-SSR-PhaseBias-r16 ::= SEQUENCE {
+ epochTime-r16 GNSS-SystemTime,
+ ssrUpdateInterval-r16 INTEGER (0..15),
+ iod-ssr-r16 INTEGER (0..15),
+ ssr-PhaseBiasSatList-r16 SSR-PhaseBiasSatList-r16,
+ ...
+}
+
+SSR-PhaseBiasSatList-r16 ::= SEQUENCE (SIZE(1..64)) OF SSR-PhaseBiasSatElement-r16
+
+SSR-PhaseBiasSatElement-r16 ::= SEQUENCE {
+ svID-r16 SV-ID,
+ ssr-PhaseBiasSignalList-r16 SSR-PhaseBiasSignalList-r16,
+ ...
+}
+
+SSR-PhaseBiasSignalList-r16 ::= SEQUENCE (SIZE(1..16)) OF SSR-PhaseBiasSignalElement-r16
+
+SSR-PhaseBiasSignalElement-r16 ::= SEQUENCE {
+ signal-and-tracking-mode-ID-r16 GNSS-SignalID,
+ phaseBias-r16 INTEGER (-16384..16383),
+ phaseDiscontinuityIndicator-r16 INTEGER (0..3),
+ phaseBiasIntegerIndicator-r16 INTEGER (0..3) OPTIONAL, -- Need OP
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-SSR-STEC-Correction-r16 ::= SEQUENCE {
+ epochTime-r16 GNSS-SystemTime,
+ ssrUpdateInterval-r16 INTEGER (0..15),
+ iod-ssr-r16 INTEGER (0..15),
+ correctionPointSetID-r16 INTEGER (0..16383),
+ stec-SatList-r16 STEC-SatList-r16,
+ ...
+}
+
+STEC-SatList-r16 ::= SEQUENCE (SIZE(1..64)) OF STEC-SatElement-r16
+
+STEC-SatElement-r16 ::= SEQUENCE {
+ svID-r16 SV-ID,
+ stecQualityIndicator-r16 BIT STRING (SIZE(6)),
+ stec-C00-r16 INTEGER (-8192..8191),
+ stec-C01-r16 INTEGER (-2048..2047) OPTIONAL, -- Need ON
+ stec-C10-r16 INTEGER (-2048..2047) OPTIONAL, -- Need ON
+ stec-C11-r16 INTEGER (-512..511) OPTIONAL, -- Need ON
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-SSR-GriddedCorrection-r16 ::= SEQUENCE {
+ epochTime-r16 GNSS-SystemTime,
+ ssrUpdateInterval-r16 INTEGER (0..15),
+ iod-ssr-r16 INTEGER (0..15),
+ troposphericDelayQualityIndicator-r16 BIT STRING (SIZE(6)) OPTIONAL, -- Cond Tropo
+ correctionPointSetID-r16 INTEGER (0..16383),
+ gridList-r16 GridList-r16,
+ ...
+}
+
+GridList-r16 ::= SEQUENCE (SIZE(1..64)) OF GridElement-r16
+
+GridElement-r16 ::= SEQUENCE {
+ tropospericDelayCorrection-r16 TropospericDelayCorrection-r16 OPTIONAL, -- Need ON
+ stec-ResidualSatList-r16 STEC-ResidualSatList-r16 OPTIONAL, -- Need ON
+ ...
+}
+
+TropospericDelayCorrection-r16 ::= SEQUENCE {
+ tropoHydroStaticVerticalDelay-r16 INTEGER (-256..255),
+ tropoWetVerticalDelay-r16 INTEGER (-128..127),
+ ...
+}
+
+STEC-ResidualSatList-r16 ::= SEQUENCE (SIZE(1..64)) OF STEC-ResidualSatElement-r16
+
+STEC-ResidualSatElement-r16 ::= SEQUENCE {
+ svID-r16 SV-ID,
+ stecResidualCorrection-r16 CHOICE {
+ b7-r16 INTEGER (-64..63),
+ b16-r16 INTEGER (-32768..32767)
+ },
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NavIC-DifferentialCorrections-r16 ::= SEQUENCE {
+ navic-RefTOWC-r16 INTEGER (0..50400),
+ navic-CorrectionListAutoNav-r16 NavIC-CorrectionListAutoNav-r16,
+ ...
+}
+
+NavIC-CorrectionListAutoNav-r16 ::= SEQUENCE (SIZE (1..64)) OF NavIC-CorrectionElementAutoNav-r16
+
+NavIC-CorrectionElementAutoNav-r16 ::= SEQUENCE {
+ svID SV-ID,
+ navic-Tod-r16 INTEGER (0..65535),
+ navic-iodec-r16 INTEGER (0..255),
+ navic-UDRAI-r16 INTEGER (-16..15),
+ navic-UDRArateI-r16 INTEGER (-16..15),
+ navic-EDC-r16 NavIC-EDC-r16,
+ navic-CDC-r16 NavIC-CDC-r16,
+ ...
+}
+
+NavIC-EDC-r16 ::= SEQUENCE {
+ navic-AlphaEDC-r16 INTEGER (-8192..8191),
+ navic-BetaEDC-r16 INTEGER (-8192..8191),
+ navic-GammaEDC-r16 INTEGER (-16384..16383),
+ navic-AoIcorrection-r16 INTEGER (-2048..2047),
+ navic-AoRAcorrection-r16 INTEGER (-2048..2047),
+ navic-SemiMajorcorrection-r16 INTEGER (-2048..2047),
+ ...
+}
+
+NavIC-CDC-r16 ::= SEQUENCE {
+ navic-ClockBiasCorrection-r16 INTEGER (-4096..4095),
+ navic-ClockDriftCorrection-r16 INTEGER (-128..127),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NavIC-GridModelParameter-r16 ::= SEQUENCE {
+ navic-RefTOWC-r16 INTEGER (0..50400),
+ regionMasked-r16 INTEGER (0..1023),
+ regionIgpList-r16 RegionIgpList-r16,
+ ...
+}
+
+RegionIgpList-r16 ::= SEQUENCE (SIZE (1..16)) OF RegionIgpElement-r16
+
+RegionIgpElement-r16 ::= SEQUENCE {
+ regionID-r16 INTEGER (0..15),
+ givei1-r16 INTEGER (0..15),
+ givd1-r16 INTEGER (0..511),
+ givei2-r16 INTEGER (0..15),
+ givd2-r16 INTEGER (0..511),
+ givei3-r16 INTEGER (0..15),
+ givd3-r16 INTEGER (0..511),
+ givei4-r16 INTEGER (0..15),
+ givd4-r16 INTEGER (0..511),
+ givei5-r16 INTEGER (0..15),
+ givd5-r16 INTEGER (0..511),
+ givei6-r16 INTEGER (0..15),
+ givd6-r16 INTEGER (0..511),
+ givei7-r16 INTEGER (0..15),
+ givd7-r16 INTEGER (0..511),
+ givei8-r16 INTEGER (0..15),
+ givd8-r16 INTEGER (0..511),
+ givei9-r16 INTEGER (0..15),
+ givd9-r16 INTEGER (0..511),
+ givei10-r16 INTEGER (0..15),
+ givd10-r16 INTEGER (0..511),
+ givei11-r16 INTEGER (0..15),
+ givd11-r16 INTEGER (0..511),
+ givei12-r16 INTEGER (0..15),
+ givd12-r16 INTEGER (0..511),
+ givei13-r16 INTEGER (0..15),
+ givd13-r16 INTEGER (0..511),
+ givei14-r16 INTEGER (0..15),
+ givd14-r16 INTEGER (0..511),
+ givei15-r16 INTEGER (0..15),
+ givd15-r16 INTEGER (0..511),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+A-GNSS-RequestAssistanceData ::= SEQUENCE {
+ gnss-CommonAssistDataReq GNSS-CommonAssistDataReq OPTIONAL, -- Cond CommonADReq
+ gnss-GenericAssistDataReq GNSS-GenericAssistDataReq OPTIONAL, -- Cond GenADReq
+ ...,
+ [[
+ gnss-PeriodicAssistDataReq-r15
+ GNSS-PeriodicAssistDataReq-r15 OPTIONAL -- Cond PerADReq
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-CommonAssistDataReq ::= SEQUENCE {
+ gnss-ReferenceTimeReq GNSS-ReferenceTimeReq
+ OPTIONAL, -- Cond RefTimeReq
+ gnss-ReferenceLocationReq GNSS-ReferenceLocationReq
+ OPTIONAL, -- Cond RefLocReq
+ gnss-IonosphericModelReq GNSS-IonosphericModelReq
+ OPTIONAL, -- Cond IonoModReq
+ gnss-EarthOrientationParametersReq GNSS-EarthOrientationParametersReq
+ OPTIONAL, -- Cond EOPReq
+ ...,
+ [[
+ gnss-RTK-ReferenceStationInfoReq-r15
+ GNSS-RTK-ReferenceStationInfoReq-r15
+ OPTIONAL, -- Cond ARPReq
+ gnss-RTK-AuxiliaryStationDataReq-r15
+ GNSS-RTK-AuxiliaryStationDataReq-r15
+ OPTIONAL -- Cond AuxARPReq
+ ]],
+ [[
+ gnss-SSR-CorrectionPointsReq-r16
+ GNSS-SSR-CorrectionPointsReq-r16
+ OPTIONAL -- Cond PointsReq
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-GenericAssistDataReq ::= SEQUENCE (SIZE (1..16)) OF GNSS-GenericAssistDataReqElement
+
+GNSS-GenericAssistDataReqElement ::= SEQUENCE {
+ gnss-ID GNSS-ID,
+ sbas-ID SBAS-ID OPTIONAL, -- Cond GNSS-ID-SBAS
+ gnss-TimeModelsReq GNSS-TimeModelListReq OPTIONAL, -- Cond TimeModReq
+ gnss-DifferentialCorrectionsReq GNSS-DifferentialCorrectionsReq OPTIONAL, -- Cond DGNSS-Req
+ gnss-NavigationModelReq GNSS-NavigationModelReq OPTIONAL, -- Cond NavModReq
+ gnss-RealTimeIntegrityReq GNSS-RealTimeIntegrityReq OPTIONAL, -- Cond RTIReq
+ gnss-DataBitAssistanceReq GNSS-DataBitAssistanceReq OPTIONAL, -- Cond DataBitsReq
+ gnss-AcquisitionAssistanceReq GNSS-AcquisitionAssistanceReq OPTIONAL, -- Cond AcquAssistReq
+ gnss-AlmanacReq GNSS-AlmanacReq OPTIONAL, -- Cond AlmanacReq
+ gnss-UTCModelReq GNSS-UTC-ModelReq OPTIONAL, -- Cond UTCModReq
+ gnss-AuxiliaryInformationReq GNSS-AuxiliaryInformationReq OPTIONAL, -- Cond AuxInfoReq
+ ...,
+ [[
+ bds-DifferentialCorrectionsReq-r12
+ BDS-DifferentialCorrectionsReq-r12
+ OPTIONAL, -- Cond DBDS-Req
+ bds-GridModelReq-r12 BDS-GridModelReq-r12 OPTIONAL -- Cond BDS-GridModReq
+ ]],
+ [[
+ gnss-RTK-ObservationsReq-r15
+ GNSS-RTK-ObservationsReq-r15 OPTIONAL, -- Cond RTK-OSR-Req
+ glo-RTK-BiasInformationReq-r15
+ GLO-RTK-BiasInformationReq-r15 OPTIONAL, -- Cond GLO-CPB-Req
+ gnss-RTK-MAC-CorrectionDifferencesReq-r15
+ GNSS-RTK-MAC-CorrectionDifferencesReq-r15
+ OPTIONAL, -- Cond MAC-Req
+ gnss-RTK-ResidualsReq-r15 GNSS-RTK-ResidualsReq-r15 OPTIONAL, -- Cond Res-Req
+ gnss-RTK-FKP-GradientsReq-r15
+ GNSS-RTK-FKP-GradientsReq-r15 OPTIONAL, -- Cond FKP-Req
+ gnss-SSR-OrbitCorrectionsReq-r15
+ GNSS-SSR-OrbitCorrectionsReq-r15
+ OPTIONAL, -- Cond OC-Req
+ gnss-SSR-ClockCorrectionsReq-r15
+ GNSS-SSR-ClockCorrectionsReq-r15
+ OPTIONAL, -- Cond CC-Req
+ gnss-SSR-CodeBiasReq-r15 GNSS-SSR-CodeBiasReq-r15 OPTIONAL -- Cond CB-Req
+ ]],
+ [[
+ gnss-SSR-URA-Req-r16 GNSS-SSR-URA-Req-r16 OPTIONAL, -- Cond URA-Req
+ gnss-SSR-PhaseBiasReq-r16 GNSS-SSR-PhaseBiasReq-r16 OPTIONAL, -- Cond PB-Req
+ gnss-SSR-STEC-CorrectionReq-r16
+ GNSS-SSR-STEC-CorrectionReq-r16 OPTIONAL, -- Cond STEC-Req
+ gnss-SSR-GriddedCorrectionReq-r16 GNSS-SSR-GriddedCorrectionReq-r16
+ OPTIONAL, -- Cond Grid-Req
+ navic-DifferentialCorrectionsReq-r16
+ NavIC-DifferentialCorrectionsReq-r16
+ OPTIONAL, -- Cond DNavIC-Req
+ navic-GridModelReq-r16 NavIC-GridModelReq-r16 OPTIONAL -- Cond NavIC-GridModReq
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-PeriodicAssistDataReq-r15 ::= SEQUENCE {
+ gnss-RTK-PeriodicObservationsReq-r15 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Cond pOSR
+ glo-RTK-PeriodicBiasInformationReq-r15 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Cond pCPB
+ gnss-RTK-MAC-PeriodicCorrectionDifferencesReq-r15
+ GNSS-PeriodicControlParam-r15 OPTIONAL, -- Cond pMAC
+ gnss-RTK-PeriodicResidualsReq-r15 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Cond pRes
+ gnss-RTK-FKP-PeriodicGradientsReq-r15 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Cond pFKP
+ gnss-SSR-PeriodicOrbitCorrectionsReq-r15
+ GNSS-PeriodicControlParam-r15 OPTIONAL, -- Cond pOC
+ gnss-SSR-PeriodicClockCorrectionsReq-r15
+ GNSS-PeriodicControlParam-r15 OPTIONAL, -- Cond pCC
+ gnss-SSR-PeriodicCodeBiasReq-r15 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Cond pCB
+ ...,
+ [[
+ gnss-SSR-PeriodicURA-Req-r16 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Cond pURA
+ gnss-SSR-PeriodicPhaseBiasReq-r16 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Cond pPB
+ gnss-SSR-PeriodicSTEC-CorrectionReq-r16 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Cond pSTEC
+ gnss-SSR-PeriodicGriddedCorrectionReq-r16
+ GNSS-PeriodicControlParam-r15 OPTIONAL -- Cond pGrid
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-ReferenceTimeReq ::= SEQUENCE {
+ gnss-TimeReqPrefList SEQUENCE (SIZE (1..8)) OF GNSS-ID,
+ gps-TOW-assistReq BOOLEAN OPTIONAL, -- Cond gps
+ notOfLeapSecReq BOOLEAN OPTIONAL, -- Cond glonass
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-ReferenceLocationReq ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-IonosphericModelReq ::= SEQUENCE {
+ klobucharModelReq BIT STRING (SIZE(2)) OPTIONAL, -- Cond klobuchar
+ neQuickModelReq NULL OPTIONAL, -- Cond nequick
+ ...,
+ [[ klobucharModel2Req-r16 NULL OPTIONAL -- Cond klobuchar2
+ ]]
+
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-EarthOrientationParametersReq ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-RTK-ReferenceStationInfoReq-r15 ::= SEQUENCE {
+ antennaDescriptionReq-r15 BOOLEAN,
+ antennaHeightReq-r15 BOOLEAN,
+ physicalReferenceStationReq-r15 BOOLEAN,
+ stationID-r15 GNSS-ReferenceStationID-r15 OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-RTK-AuxiliaryStationDataReq-r15 ::= SEQUENCE {
+ master-referenceStationID-r15 GNSS-ReferenceStationID-r15 OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-SSR-CorrectionPointsReq-r16 ::= SEQUENCE {
+ correctionPointSetID-Req-r16 INTEGER (0..16383) OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-TimeModelListReq ::= SEQUENCE (SIZE(1..15)) OF GNSS-TimeModelElementReq
+
+GNSS-TimeModelElementReq ::= SEQUENCE {
+ gnss-TO-IDsReq INTEGER (1..15),
+ deltaTreq BOOLEAN,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-DifferentialCorrectionsReq ::= SEQUENCE {
+ dgnss-SignalsReq GNSS-SignalIDs,
+ dgnss-ValidityTimeReq BOOLEAN,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-NavigationModelReq ::= CHOICE {
+ storedNavList StoredNavListInfo,
+ reqNavList ReqNavListInfo,
+ ...
+}
+
+
+StoredNavListInfo ::= SEQUENCE {
+ gnss-WeekOrDay INTEGER (0..4095),
+ gnss-Toe INTEGER (0..255),
+ t-toeLimit INTEGER (0..15),
+ satListRelatedDataList SatListRelatedDataList OPTIONAL,
+ ...
+}
+
+SatListRelatedDataList ::= SEQUENCE (SIZE (1..64)) OF SatListRelatedDataElement
+
+SatListRelatedDataElement ::= SEQUENCE {
+ svID SV-ID,
+ iod BIT STRING (SIZE(11)),
+ clockModelID INTEGER (1..8) OPTIONAL,
+ orbitModelID INTEGER (1..8) OPTIONAL,
+ ...
+}
+
+ReqNavListInfo ::= SEQUENCE {
+ svReqList BIT STRING (SIZE (64)),
+ clockModelID-PrefList SEQUENCE (SIZE (1..8)) OF INTEGER (1..8) OPTIONAL,
+ orbitModelID-PrefList SEQUENCE (SIZE (1..8)) OF INTEGER (1..8) OPTIONAL,
+ addNavparamReq BOOLEAN OPTIONAL, -- Cond orbitModelID-2
+ ...
+}
+
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-RealTimeIntegrityReq ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-DataBitAssistanceReq ::= SEQUENCE {
+ gnss-TOD-Req INTEGER (0..3599),
+ gnss-TOD-FracReq INTEGER (0..999) OPTIONAL,
+ dataBitInterval INTEGER (0..15),
+ gnss-SignalType GNSS-SignalIDs,
+ gnss-DataBitsReq GNSS-DataBitsReqSatList OPTIONAL,
+ ...
+}
+
+GNSS-DataBitsReqSatList ::= SEQUENCE (SIZE(1..64)) OF GNSS-DataBitsReqSatElement
+
+GNSS-DataBitsReqSatElement ::= SEQUENCE {
+ svID SV-ID,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-AcquisitionAssistanceReq ::= SEQUENCE {
+ gnss-SignalID-Req GNSS-SignalID,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-AlmanacReq ::= SEQUENCE {
+ modelID INTEGER(1..8) OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-UTC-ModelReq ::= SEQUENCE {
+ modelID INTEGER(1..8) OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-AuxiliaryInformationReq ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+BDS-DifferentialCorrectionsReq-r12 ::= SEQUENCE {
+ dgnss-SignalsReq GNSS-SignalIDs,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+BDS-GridModelReq-r12 ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-RTK-ObservationsReq-r15::= SEQUENCE {
+ gnss-RTK-SignalsReq-r15 GNSS-SignalIDs,
+ gnss-RTK-Integer-ms-Req-r15 BOOLEAN,
+ gnss-RTK-PhaseRangeRateReq-r15 BOOLEAN,
+ gnss-RTK-CNR-Req-r15 BOOLEAN,
+ stationID-r15 GNSS-ReferenceStationID-r15 OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GLO-RTK-BiasInformationReq-r15 ::= SEQUENCE {
+ stationID-r15 GNSS-ReferenceStationID-r15 OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-RTK-MAC-CorrectionDifferencesReq-r15 ::= SEQUENCE {
+ master-ReferenceStationID-r15 GNSS-ReferenceStationID-r15 OPTIONAL,
+ aux-ReferenceStationList-r15 AUX-ReferenceStationList-r15 OPTIONAL,
+ linkCombinations-PrefList-r15 GNSS-Link-CombinationsList-r15 OPTIONAL,
+ ...
+}
+
+AUX-ReferenceStationList-r15 ::= SEQUENCE (SIZE (1..32)) OF AUX-ReferenceStationID-Element-r15
+
+AUX-ReferenceStationID-Element-r15 ::= SEQUENCE {
+ aux-stationID-r15 GNSS-ReferenceStationID-r15,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-RTK-ResidualsReq-r15 ::= SEQUENCE {
+ stationID-r15 GNSS-ReferenceStationID-r15 OPTIONAL,
+ linkCombinations-PrefList-r15 GNSS-Link-CombinationsList-r15 OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-RTK-FKP-GradientsReq-r15 ::= SEQUENCE {
+ stationID-r15 GNSS-ReferenceStationID-r15 OPTIONAL,
+ linkCombinations-PrefList-r15 GNSS-Link-CombinationsList-r15 OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-SSR-OrbitCorrectionsReq-r15 ::= SEQUENCE {
+ storedNavList-r15 GNSS-NavListInfo-r15 OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-SSR-ClockCorrectionsReq-r15 ::= SEQUENCE {
+ storedNavList-r15 GNSS-NavListInfo-r15 OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-SSR-CodeBiasReq-r15 ::= SEQUENCE {
+ signal-and-tracking-mode-ID-Map-r15 GNSS-SignalIDs,
+ storedNavList-r15 GNSS-NavListInfo-r15 OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-SSR-URA-Req-r16 ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-SSR-PhaseBiasReq-r16 ::= SEQUENCE {
+ signal-and-tracking-mode-ID-Map-r16 GNSS-SignalIDs,
+ storedNavList-r16 GNSS-NavListInfo-r15 OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-SSR-STEC-CorrectionReq-r16 ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-SSR-GriddedCorrectionReq-r16 ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NavIC-DifferentialCorrectionsReq-r16 ::= SEQUENCE {
+ dgnss-SignalsReq-r16 GNSS-SignalIDs,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NavIC-GridModelReq-r16 ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+A-GNSS-ProvideLocationInformation ::= SEQUENCE {
+ gnss-SignalMeasurementInformation GNSS-SignalMeasurementInformation OPTIONAL,
+ gnss-LocationInformation GNSS-LocationInformation OPTIONAL,
+ gnss-Error A-GNSS-Error OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-SignalMeasurementInformation ::= SEQUENCE {
+ measurementReferenceTime MeasurementReferenceTime,
+ gnss-MeasurementList GNSS-MeasurementList,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+MeasurementReferenceTime ::= SEQUENCE {
+ gnss-TOD-msec INTEGER (0..3599999),
+ gnss-TOD-frac INTEGER (0..3999) OPTIONAL,
+ gnss-TOD-unc INTEGER (0..127) OPTIONAL,
+ gnss-TimeID GNSS-ID,
+ networkTime CHOICE {
+ eUTRA SEQUENCE {
+ physCellId INTEGER (0..503),
+ cellGlobalId CellGlobalIdEUTRA-AndUTRA OPTIONAL,
+ systemFrameNumber BIT STRING (SIZE (10)),
+ ...
+ },
+ uTRA SEQUENCE {
+ mode CHOICE {
+ fdd SEQUENCE {
+ primary-CPICH-Info INTEGER (0..511),
+ ...
+ },
+ tdd SEQUENCE {
+ cellParameters INTEGER (0..127),
+ ...
+ }
+ },
+ cellGlobalId CellGlobalIdEUTRA-AndUTRA OPTIONAL,
+ referenceSystemFrameNumber
+ INTEGER (0..4095),
+ ...
+ },
+ gSM SEQUENCE {
+ bcchCarrier INTEGER (0..1023),
+ bsic INTEGER (0..63),
+ cellGlobalId CellGlobalIdGERAN OPTIONAL,
+ referenceFrame SEQUENCE {
+ referenceFN INTEGER (0..65535),
+ referenceFNMSB INTEGER (0..63) OPTIONAL,
+ ...
+ },
+ deltaGNSS-TOD INTEGER (0 .. 127) OPTIONAL,
+ ...
+ },
+ ...,
+ nbIoT-r14
+ SEQUENCE {
+ nbPhysCellId-r14 INTEGER (0..503),
+ nbCellGlobalId-r14 ECGI OPTIONAL,
+ sfn-r14 BIT STRING (SIZE (10)),
+ hyperSFN-r14 BIT STRING (SIZE (10)) OPTIONAL,
+ ...
+ },
+ nr-r15 SEQUENCE {
+ nrPhysCellId-r15 INTEGER (0..1007),
+ nrCellGlobalID-r15 NCGI-r15 OPTIONAL,
+ nr-sfn-r15 BIT STRING (SIZE (10)),
+ ...
+ }
+ } OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-MeasurementList ::= SEQUENCE (SIZE(1..16)) OF GNSS-MeasurementForOneGNSS
+
+GNSS-MeasurementForOneGNSS ::= SEQUENCE {
+ gnss-ID GNSS-ID,
+ gnss-SgnMeasList GNSS-SgnMeasList,
+ ...
+}
+
+GNSS-SgnMeasList ::= SEQUENCE (SIZE(1..8)) OF GNSS-SgnMeasElement
+
+GNSS-SgnMeasElement ::= SEQUENCE {
+ gnss-SignalID GNSS-SignalID,
+ gnss-CodePhaseAmbiguity INTEGER (0..127) OPTIONAL,
+ gnss-SatMeasList GNSS-SatMeasList,
+ ...
+}
+
+GNSS-SatMeasList ::= SEQUENCE (SIZE(1..64)) OF GNSS-SatMeasElement
+
+GNSS-SatMeasElement ::= SEQUENCE {
+ svID SV-ID,
+ cNo INTEGER (0..63),
+ mpathDet ENUMERATED {notMeasured (0), low (1), medium (2), high (3), ...},
+ carrierQualityInd INTEGER (0..3) OPTIONAL,
+ codePhase INTEGER (0..2097151),
+ integerCodePhase INTEGER (0..127) OPTIONAL,
+ codePhaseRMSError INTEGER (0..63),
+ doppler INTEGER (-32768..32767) OPTIONAL,
+ adr INTEGER (0..33554431) OPTIONAL,
+ ...,
+ [[
+ adrMSB-r15 INTEGER (0..15) OPTIONAL,
+ adrSign-r15 ENUMERATED {positive, negative} OPTIONAL,
+ adrRMSerror-r15 INTEGER (0..127) OPTIONAL,
+ delta-codePhase-r15 INTEGER (0..7) OPTIONAL
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-LocationInformation ::= SEQUENCE {
+ measurementReferenceTime MeasurementReferenceTime,
+ agnss-List GNSS-ID-Bitmap,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+A-GNSS-RequestLocationInformation ::= SEQUENCE {
+ gnss-PositioningInstructions GNSS-PositioningInstructions,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-PositioningInstructions ::= SEQUENCE {
+ gnss-Methods GNSS-ID-Bitmap,
+ fineTimeAssistanceMeasReq BOOLEAN,
+ adrMeasReq BOOLEAN,
+ multiFreqMeasReq BOOLEAN,
+ assistanceAvailability BOOLEAN,
+ ...,
+ [[
+ ha-GNSS-Req-r15 ENUMERATED { true } OPTIONAL -- Cond UEB
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+A-GNSS-ProvideCapabilities ::= SEQUENCE {
+ gnss-SupportList GNSS-SupportList OPTIONAL,
+ assistanceDataSupportList AssistanceDataSupportList OPTIONAL,
+ locationCoordinateTypes LocationCoordinateTypes OPTIONAL,
+ velocityTypes VelocityTypes OPTIONAL,
+ ...,
+ [[ periodicalReportingNotSupported-r14
+ PositioningModes OPTIONAL,
+ idleStateForMeasurements-r14
+ ENUMERATED { required } OPTIONAL
+ ]],
+ [[ periodicAssistanceData-r15
+ BIT STRING { solicited (0),
+ unsolicited (1) } (SIZE (1..8)) OPTIONAL
+ ]]
+}
+
+GNSS-SupportList ::= SEQUENCE (SIZE(1..16)) OF GNSS-SupportElement
+
+GNSS-SupportElement ::= SEQUENCE {
+ gnss-ID GNSS-ID,
+ sbas-IDs SBAS-IDs OPTIONAL, -- Cond GNSS-ID-SBAS
+ agnss-Modes PositioningModes,
+ gnss-Signals GNSS-SignalIDs,
+ fta-MeasSupport SEQUENCE {
+ cellTime AccessTypes,
+ mode PositioningModes,
+ ...
+ } OPTIONAL, -- Cond fta
+ adr-Support BOOLEAN,
+ velocityMeasurementSupport BOOLEAN,
+ ...,
+ [[
+ adrEnhancementsSupport-r15 ENUMERATED { true } OPTIONAL,
+ ha-gnss-Modes-r15 PositioningModes OPTIONAL
+ ]]
+}
+
+AssistanceDataSupportList ::= SEQUENCE {
+ gnss-CommonAssistanceDataSupport GNSS-CommonAssistanceDataSupport,
+ gnss-GenericAssistanceDataSupport GNSS-GenericAssistanceDataSupport,
+ ...
+}
+
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-CommonAssistanceDataSupport ::= SEQUENCE {
+ gnss-ReferenceTimeSupport GNSS-ReferenceTimeSupport
+ OPTIONAL, -- Cond RefTimeSup
+ gnss-ReferenceLocationSupport GNSS-ReferenceLocationSupport
+ OPTIONAL, -- Cond RefLocSup
+ gnss-IonosphericModelSupport GNSS-IonosphericModelSupport
+ OPTIONAL, -- Cond IonoModSup
+ gnss-EarthOrientationParametersSupport GNSS-EarthOrientationParametersSupport
+ OPTIONAL, -- Cond EOPSup
+ ...,
+ [[
+ gnss-RTK-ReferenceStationInfoSupport-r15
+ GNSS-RTK-ReferenceStationInfoSupport-r15
+ OPTIONAL, -- Cond ARPSup
+ gnss-RTK-AuxiliaryStationDataSupport-r15
+ GNSS-RTK-AuxiliaryStationDataSupport-r15
+ OPTIONAL -- Cond AuxARPSup
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-ReferenceTimeSupport ::= SEQUENCE {
+ gnss-SystemTime GNSS-ID-Bitmap,
+ fta-Support AccessTypes OPTIONAL, -- Cond fta
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-ReferenceLocationSupport ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-IonosphericModelSupport ::= SEQUENCE {
+ ionoModel BIT STRING { klobuchar (0),
+ neQuick (1),
+ klobuchar2-r16 (2) } (SIZE (1..8)),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-EarthOrientationParametersSupport ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-RTK-ReferenceStationInfoSupport-r15 ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-RTK-AuxiliaryStationDataSupport-r15 ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-GenericAssistanceDataSupport ::=
+ SEQUENCE (SIZE (1..16)) OF GNSS-GenericAssistDataSupportElement
+
+GNSS-GenericAssistDataSupportElement ::= SEQUENCE {
+ gnss-ID GNSS-ID,
+ sbas-ID SBAS-ID OPTIONAL, -- Cond GNSSIDSBAS
+ gnss-TimeModelsSupport GNSS-TimeModelListSupport
+ OPTIONAL, -- Cond TimeModSup
+ gnss-DifferentialCorrectionsSupport GNSS-DifferentialCorrectionsSupport
+ OPTIONAL, -- Cond DGNSS-Sup
+ gnss-NavigationModelSupport GNSS-NavigationModelSupport
+ OPTIONAL, -- Cond NavModSup
+ gnss-RealTimeIntegritySupport GNSS-RealTimeIntegritySupport
+ OPTIONAL, -- Cond RTISup
+ gnss-DataBitAssistanceSupport GNSS-DataBitAssistanceSupport
+ OPTIONAL, -- Cond DataBitsSup
+ gnss-AcquisitionAssistanceSupport GNSS-AcquisitionAssistanceSupport
+ OPTIONAL, -- Cond AcquAssistSup
+ gnss-AlmanacSupport GNSS-AlmanacSupport
+ OPTIONAL, -- Cond AlmanacSup
+ gnss-UTC-ModelSupport GNSS-UTC-ModelSupport
+ OPTIONAL, -- Cond UTCModSup
+ gnss-AuxiliaryInformationSupport GNSS-AuxiliaryInformationSupport
+ OPTIONAL, -- Cond AuxInfoSup
+ ...,
+ [[
+ bds-DifferentialCorrectionsSupport-r12
+ BDS-DifferentialCorrectionsSupport-r12
+ OPTIONAL, -- Cond DBDS-Sup
+ bds-GridModelSupport-r12 BDS-GridModelSupport-r12
+ OPTIONAL -- Cond BDS-GridModSup
+ ]],
+ [[
+ gnss-RTK-ObservationsSupport-r15
+ GNSS-RTK-ObservationsSupport-r15
+ OPTIONAL, -- Cond RTK-OSR-Sup
+ glo-RTK-BiasInformationSupport-r15
+ GLO-RTK-BiasInformationSupport-r15
+ OPTIONAL, -- Cond GLO-CPB-Sup
+ gnss-RTK-MAC-CorrectionDifferencesSupport-r15
+ GNSS-RTK-MAC-CorrectionDifferencesSupport-r15
+ OPTIONAL, -- Cond MAC-Sup
+ gnss-RTK-ResidualsSupport-r15 GNSS-RTK-ResidualsSupport-r15
+ OPTIONAL, -- Cond Res-Sup
+ gnss-RTK-FKP-GradientsSupport-r15
+ GNSS-RTK-FKP-GradientsSupport-r15
+ OPTIONAL, -- Cond FKP-Sup
+ gnss-SSR-OrbitCorrectionsSupport-r15
+ GNSS-SSR-OrbitCorrectionsSupport-r15
+ OPTIONAL, -- Cond OC-Sup
+ gnss-SSR-ClockCorrectionsSupport-r15
+ GNSS-SSR-ClockCorrectionsSupport-r15
+ OPTIONAL, -- Cond CC-Sup
+ gnss-SSR-CodeBiasSupport-r15 GNSS-SSR-CodeBiasSupport-r15
+ OPTIONAL -- Cond CB-Sup
+ ]],
+ [[
+ gnss-SSR-URA-Support-r16 GNSS-SSR-URA-Support-r16 OPTIONAL, -- Cond URA-Sup
+ gnss-SSR-PhaseBiasSupport-r16 GNSS-SSR-PhaseBiasSupport-r16
+ OPTIONAL, -- Cond PB-Sup
+ gnss-SSR-STEC-CorrectionSupport-r16
+ GNSS-SSR-STEC-CorrectionSupport-r16
+ OPTIONAL, -- Cond STEC-Sup
+ gnss-SSR-GriddedCorrectionSupport-r16
+ GNSS-SSR-GriddedCorrectionSupport-r16
+ OPTIONAL, -- Cond Grid-Sup
+ navic-DifferentialCorrectionsSupport-r16
+ NavIC-DifferentialCorrectionsSupport-r16
+ OPTIONAL, -- Cond DNavIC-Sup
+ navic-GridModelSupport-r16 NavIC-GridModelSupport-r16
+ OPTIONAL -- Cond NavIC-GridModSup
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-TimeModelListSupport ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-DifferentialCorrectionsSupport ::= SEQUENCE {
+ gnssSignalIDs GNSS-SignalIDs,
+ dgnss-ValidityTimeSup BOOLEAN,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-NavigationModelSupport ::= SEQUENCE {
+ clockModel BIT STRING { model-1 (0),
+ model-2 (1),
+ model-3 (2),
+ model-4 (3),
+ model-5 (4),
+ model-6 (5),
+ model-7-r16 (6),
+ model-8-r16 (7) } (SIZE (1..8)) OPTIONAL,
+ orbitModel BIT STRING { model-1 (0),
+ model-2 (1),
+ model-3 (2),
+ model-4 (3),
+ model-5 (4),
+ model-6 (5),
+ model-7-r16 (6),
+ model-8-r16 (7) } (SIZE (1..8)) OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-RealTimeIntegritySupport ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-DataBitAssistanceSupport ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-AcquisitionAssistanceSupport ::= SEQUENCE {
+ ...,
+ confidenceSupport-r10 ENUMERATED { true } OPTIONAL,
+ dopplerUncertaintyExtSupport-r10 ENUMERATED { true } OPTIONAL
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-AlmanacSupport ::= SEQUENCE {
+ almanacModel BIT STRING { model-1 (0),
+ model-2 (1),
+ model-3 (2),
+ model-4 (3),
+ model-5 (4),
+ model-6 (5),
+ model-7 (6) } (SIZE (1..8)) OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-UTC-ModelSupport ::= SEQUENCE {
+ utc-Model BIT STRING { model-1 (0),
+ model-2 (1),
+ model-3 (2),
+ model-4 (3),
+ model-5 (4) } (SIZE (1..8)) OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-AuxiliaryInformationSupport ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+BDS-DifferentialCorrectionsSupport-r12 ::= SEQUENCE {
+ gnssSignalIDs GNSS-SignalIDs,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+BDS-GridModelSupport-r12 ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-RTK-ObservationsSupport-r15 ::= SEQUENCE {
+ gnssSignalIDs-r15 GNSS-SignalIDs,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GLO-RTK-BiasInformationSupport-r15 ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-RTK-MAC-CorrectionDifferencesSupport-r15 ::= SEQUENCE {
+ link-combinations-support-r15 GNSS-Link-CombinationsList-r15,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-RTK-ResidualsSupport-r15 ::= SEQUENCE {
+ link-combinations-support-r15 GNSS-Link-CombinationsList-r15,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-RTK-FKP-GradientsSupport-r15 ::= SEQUENCE {
+ link-combinations-support-r15 GNSS-Link-CombinationsList-r15,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-SSR-OrbitCorrectionsSupport-r15 ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-SSR-ClockCorrectionsSupport-r15 ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-SSR-CodeBiasSupport-r15 ::= SEQUENCE {
+ signal-and-tracking-mode-ID-Sup-r15 GNSS-SignalIDs,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-SSR-URA-Support-r16 ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-SSR-PhaseBiasSupport-r16 ::= SEQUENCE {
+ signal-and-tracking-mode-ID-Sup-r16 GNSS-SignalIDs,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-SSR-STEC-CorrectionSupport-r16 ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-SSR-GriddedCorrectionSupport-r16 ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NavIC-DifferentialCorrectionsSupport-r16 ::= SEQUENCE {
+ gnssSignalIDs-r16 GNSS-SignalIDs,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NavIC-GridModelSupport-r16 ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+A-GNSS-RequestCapabilities ::= SEQUENCE {
+ gnss-SupportListReq BOOLEAN,
+ assistanceDataSupportListReq BOOLEAN,
+ locationVelocityTypesReq BOOLEAN,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+A-GNSS-Error ::= CHOICE {
+ locationServerErrorCauses GNSS-LocationServerErrorCauses,
+ targetDeviceErrorCauses GNSS-TargetDeviceErrorCauses,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-LocationServerErrorCauses ::= SEQUENCE {
+ cause ENUMERATED {
+ undefined,
+ undeliveredAssistanceDataIsNotSupportedByServer,
+ undeliveredAssistanceDataIsSupportedButCurrentlyNotAvailableByServer, undeliveredAssistanceDataIsPartlyNotSupportedAndPartlyNotAvailableByServer,
+ ...,
+ unconfirmedPeriodicAssistanceDataIsNotSupported-v1510,
+ unconfirmedPeriodicAssistanceDataIsSupportedButCurrentlyNotAvailable-v1510,
+ unconfirmedPeriodicAssistanceDataIsPartlyNotSupportedAndPartlyNotAvailable-v1510,
+ undeliveredPeriodicAssistanceDataIsCurrentlyNotAvailable-v1510
+ },
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-TargetDeviceErrorCauses ::= SEQUENCE {
+ cause ENUMERATED { undefined,
+ thereWereNotEnoughSatellitesReceived,
+ assistanceDataMissing,
+ notAllRequestedMeasurementsPossible,
+ ...
+ },
+ fineTimeAssistanceMeasurementsNotPossible NULL OPTIONAL,
+ adrMeasurementsNotPossible NULL OPTIONAL,
+ multiFrequencyMeasurementsNotPossible NULL OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-FrequencyID-r15 ::= SEQUENCE {
+ gnss-FrequencyID-r15 INTEGER (0 .. 7),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-ID ::= SEQUENCE {
+ gnss-id ENUMERATED{ gps, sbas, qzss, galileo, glonass, ..., bds, navic-v1610 },
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-ID-Bitmap ::= SEQUENCE {
+ gnss-ids BIT STRING { gps (0),
+ sbas (1),
+ qzss (2),
+ galileo (3),
+ glonass (4),
+ bds (5),
+ navic-v1610 (6) } (SIZE (1..16)),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-Link-CombinationsList-r15 ::= SEQUENCE (SIZE(1..8)) OF GNSS-Link-Combinations-r15
+
+GNSS-Link-Combinations-r15 ::= SEQUENCE {
+ l1-r15 GNSS-FrequencyID-r15,
+ l2-r15 GNSS-FrequencyID-r15,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-NavListInfo-r15 ::= SEQUENCE (SIZE (1..64)) OF SatListElement-r15
+
+SatListElement-r15 ::= SEQUENCE {
+ svID-r15 SV-ID,
+ iod-r15 BIT STRING (SIZE(11)),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-NetworkID-r15 ::= SEQUENCE {
+ networkID-r15 INTEGER (0..255),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-PeriodicControlParam-r15 ::= SEQUENCE {
+ deliveryAmount-r15 INTEGER (1..32),
+ deliveryInterval-r15 INTEGER (1..64),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-ReferenceStationID-r15 ::= SEQUENCE {
+ referenceStationID-r15 INTEGER (0..65535),
+ providerName-r15 VisibleString (SIZE (1..32)) OPTIONAL, -- Need ON
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-SignalID ::= SEQUENCE {
+ gnss-SignalID INTEGER (0 .. 7),
+ ...,
+ [[
+ gnss-SignalID-Ext-r15 INTEGER (8..23) OPTIONAL -- Need ON
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-SignalIDs ::= SEQUENCE {
+ gnss-SignalIDs BIT STRING (SIZE(8)),
+ ...,
+ [[
+ gnss-SignalIDs-Ext-r15 BIT STRING (SIZE(16)) OPTIONAL -- Need ON
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+GNSS-SubNetworkID-r15 ::= SEQUENCE {
+ subNetworkID-r15 INTEGER (0..15),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+SBAS-ID ::= SEQUENCE {
+ sbas-id ENUMERATED { waas, egnos, msas, gagan, ...},
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+SBAS-IDs ::= SEQUENCE {
+ sbas-IDs BIT STRING { waas (0),
+ egnos (1),
+ msas (2),
+ gagan (3) } (SIZE (1..8)),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+SV-ID ::= SEQUENCE {
+ satellite-id INTEGER(0..63),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+ECID-ProvideLocationInformation ::= SEQUENCE {
+ ecid-SignalMeasurementInformation ECID-SignalMeasurementInformation OPTIONAL,
+ ecid-Error ECID-Error OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+ECID-SignalMeasurementInformation ::= SEQUENCE {
+ primaryCellMeasuredResults MeasuredResultsElement OPTIONAL,
+ measuredResultsList MeasuredResultsList,
+ ...
+}
+
+MeasuredResultsList ::= SEQUENCE (SIZE(1..32)) OF MeasuredResultsElement
+
+MeasuredResultsElement ::= SEQUENCE {
+ physCellId INTEGER (0..503),
+ cellGlobalId CellGlobalIdEUTRA-AndUTRA OPTIONAL,
+ arfcnEUTRA ARFCN-ValueEUTRA,
+ systemFrameNumber BIT STRING (SIZE (10)) OPTIONAL,
+ rsrp-Result INTEGER (0..97) OPTIONAL,
+ rsrq-Result INTEGER (0..34) OPTIONAL,
+ ue-RxTxTimeDiff INTEGER (0..4095) OPTIONAL,
+ ...,
+ [[ arfcnEUTRA-v9a0 ARFCN-ValueEUTRA-v9a0 OPTIONAL -- Cond EARFCN-max
+ ]],
+ [[ nrsrp-Result-r14 INTEGER (0..113) OPTIONAL,
+ nrsrq-Result-r14 INTEGER (0..74) OPTIONAL,
+ carrierFreqOffsetNB-r14 CarrierFreqOffsetNB-r14 OPTIONAL, -- Cond NB-IoT
+ hyperSFN-r14 BIT STRING (SIZE (10)) OPTIONAL
+ ]],
+ [[
+ rsrp-Result-v1470 INTEGER (-17..-1) OPTIONAL,
+ rsrq-Result-v1470 INTEGER (-30..46) OPTIONAL
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+ECID-RequestLocationInformation ::= SEQUENCE {
+ requestedMeasurements BIT STRING { rsrpReq (0),
+ rsrqReq (1),
+ ueRxTxReq (2),
+ nrsrpReq-r14 (3),
+ nrsrqReq-r14 (4)} (SIZE(1..8)),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+ECID-ProvideCapabilities ::= SEQUENCE {
+ ecid-MeasSupported BIT STRING { rsrpSup (0),
+ rsrqSup (1),
+ ueRxTxSup (2),
+ nrsrpSup-r14 (3),
+ nrsrqSup-r14 (4)} (SIZE(1..8)),
+ ...,
+ [[ ueRxTxSupTDD-r13 ENUMERATED { true } OPTIONAL
+ ]],
+ [[ periodicalReporting-r14 ENUMERATED { supported } OPTIONAL,
+ triggeredReporting-r14 ENUMERATED { supported } OPTIONAL,
+ idleStateForMeasurements-r14 ENUMERATED { required } OPTIONAL
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+ECID-RequestCapabilities ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+ECID-Error ::= CHOICE {
+ locationServerErrorCauses ECID-LocationServerErrorCauses,
+ targetDeviceErrorCauses ECID-TargetDeviceErrorCauses,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+ECID-LocationServerErrorCauses ::= SEQUENCE {
+ cause ENUMERATED { undefined,
+ ...
+ },
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+ECID-TargetDeviceErrorCauses ::= SEQUENCE {
+ cause ENUMERATED { undefined,
+ requestedMeasurementNotAvailable,
+ notAllrequestedMeasurementsPossible,
+ ...
+ },
+ rsrpMeasurementNotPossible NULL OPTIONAL,
+ rsrqMeasurementNotPossible NULL OPTIONAL,
+ ueRxTxMeasurementNotPossible NULL OPTIONAL,
+ ...,
+ [[
+ nrsrpMeasurementNotPossible-r14 NULL OPTIONAL,
+ nrsrqMeasurementNotPossible-r14 NULL OPTIONAL
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+TBS-ProvideLocationInformation-r13 ::= SEQUENCE {
+ tbs-MeasurementInformation-r13 TBS-MeasurementInformation-r13 OPTIONAL,
+ tbs-Error-r13 TBS-Error-r13 OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+TBS-MeasurementInformation-r13 ::= SEQUENCE {
+ measurementReferenceTime-r13 UTCTime OPTIONAL,
+ mbs-SgnMeasList-r13 MBS-BeaconMeasList-r13 OPTIONAL, -- Cond MBS
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+MBS-BeaconMeasList-r13 ::= SEQUENCE (SIZE(1..64)) OF MBS-BeaconMeasElement-r13
+
+MBS-BeaconMeasElement-r13 ::= SEQUENCE {
+ transmitterID-r13 INTEGER (0..32767),
+ codePhase-r13 INTEGER (0..2097151),
+ codePhaseRMSError-r13 INTEGER (0..63),
+ ...,
+ [[ rssi-r14 INTEGER (-130..-30) OPTIONAL
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+TBS-RequestLocationInformation-r13 ::= SEQUENCE {
+ mbsSgnMeasListReq-r13 BOOLEAN,
+ ...,
+ [[ mbsAssistanceAvailability-r14 BOOLEAN OPTIONAL, -- Need ON
+ mbsRequestedMeasurements-r14 BIT STRING {
+ rssi (0)} (SIZE(1..8)) OPTIONAL -- Need ON
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+TBS-ProvideCapabilities-r13 ::= SEQUENCE {
+ tbs-Modes-r13 BIT STRING { standalone (0),
+ ue-assisted (1),
+ ue-based (2)} (SIZE (1..8)),
+ ...,
+ [[ mbs-AssistanceDataSupportList-r14 MBS-AssistanceDataSupportList-r14 OPTIONAL,
+ periodicalReportingSupported-r14 PositioningModes OPTIONAL,
+ mbs-ConfigSupport-r14 BIT STRING { tb1 (0),
+ tb2 (1),
+ tb3 (2),
+ tb4 (3)} (SIZE (1..8)) OPTIONAL,
+ mbs-IdleStateForMeasurements-r14 ENUMERATED { required } OPTIONAL
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+MBS-AssistanceDataSupportList-r14 ::= SEQUENCE {
+ mbs-AcquisitionAssistanceDataSupport-r14 BOOLEAN,
+ mbs-AlmanacAssistanceDataSupport-r14 BOOLEAN,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+TBS-RequestCapabilities-r13 ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+TBS-Error-r13 ::= CHOICE {
+ locationServerErrorCauses-r13 TBS-LocationServerErrorCauses-r13,
+ targetDeviceErrorCauses-r13 TBS-TargetDeviceErrorCauses-r13,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+TBS-LocationServerErrorCauses-r13 ::= SEQUENCE {
+ cause-r13 ENUMERATED { undefined,
+ ...,
+ assistanceDataNotSupportedByServer-v1420,
+ assistanceDataSupportedButCurrentlyNotAvailableByServer-v1420
+ },
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+TBS-TargetDeviceErrorCauses-r13 ::= SEQUENCE {
+ cause-r13 ENUMERATED { undefined,
+ thereWereNotEnoughMBSBeaconsReceived,
+ ...,
+ assistanceDataMissing-v1420
+ },
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+TBS-ProvideAssistanceData-r14 ::= SEQUENCE {
+ tbs-AssistanceDataList-r14 TBS-AssistanceDataList-r14 OPTIONAL, -- Need ON
+ tbs-Error-r14 TBS-Error-r13 OPTIONAL, -- Need ON
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+TBS-AssistanceDataList-r14 ::= SEQUENCE {
+ mbs-AssistanceDataList-r14 MBS-AssistanceDataList-r14 OPTIONAL, -- Need ON
+ ...
+}
+
+MBS-AssistanceDataList-r14 ::= SEQUENCE (SIZE (1..maxMBS-r14)) OF MBS-AssistanceDataElement-r14
+
+MBS-AssistanceDataElement-r14 ::= SEQUENCE {
+ mbs-AlmanacAssistance-r14 MBS-AlmanacAssistance-r14 OPTIONAL, -- Need ON
+ mbs-AcquisitionAssistance-r14 MBS-AcquisitionAssistance-r14 OPTIONAL, -- Need ON
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+MBS-AlmanacAssistance-r14 ::= SEQUENCE {
+ transmitterID-r14 INTEGER (0..32767),
+ transmitterLatitude-r14 BIT STRING (SIZE (26)),
+ transmitterLongitude-r14 BIT STRING (SIZE (27)),
+ transmitterAltitude-r14 BIT STRING (SIZE (15)),
+ timeCorrection-r14 INTEGER (0..25) OPTIONAL, -- Need ON
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+MBS-AcquisitionAssistance-r14 ::= SEQUENCE {
+ transmitterID-r14 INTEGER (0..32767) OPTIONAL, -- Need ON
+ mbsConfiguration-r14 ENUMERATED {tb1, tb2, tb3, tb4, ...} OPTIONAL, -- Need ON
+ pnCodeIndex-r14 INTEGER (1..128) OPTIONAL, -- Need ON
+ freq-r14 INTEGER (919750000..927250000) OPTIONAL, -- Need ON
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+TBS-RequestAssistanceData-r14 ::= SEQUENCE {
+ mbs-AlmanacAssistanceDataReq-r14 BOOLEAN,
+ mbs-AcquisitionAssistanceDataReq-r14 BOOLEAN,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+Sensor-ProvideLocationInformation-r13 ::= SEQUENCE {
+ sensor-MeasurementInformation-r13 Sensor-MeasurementInformation-r13 OPTIONAL,
+ sensor-Error-r13 Sensor-Error-r13 OPTIONAL,
+ ...,
+ [[
+ sensor-MotionInformation-r15 Sensor-MotionInformation-r15 OPTIONAL
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+Sensor-MeasurementInformation-r13 ::= SEQUENCE {
+ measurementReferenceTime-r13 UTCTime OPTIONAL,
+ uncompensatedBarometricPressure-r13 INTEGER (30000..115000) OPTIONAL, -- Cond Barometer
+ ...,
+ [[
+ uncertainty-r14 SEQUENCE {
+ range-r14 INTEGER (0..1000),
+ confidence-r14 INTEGER (1..100)
+ } OPTIONAL
+ ]],
+ [[ adjustment-r16 INTEGER (-5000..5000) OPTIONAL
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+Sensor-MotionInformation-r15 ::= SEQUENCE {
+ refTime-r15 DisplacementTimeStamp-r15,
+ displacementInfoList-r15 DisplacementInfoList-r15,
+ ...
+}
+
+DisplacementInfoList-r15 ::= SEQUENCE (SIZE (1..128)) OF DisplacementInfoListElement-r15
+
+DisplacementInfoListElement-r15 ::= SEQUENCE {
+ deltaTimeStamp-r15 DeltaTime-r15,
+ displacement-r15 Displacement-r15 OPTIONAL,
+ ...
+}
+
+DisplacementTimeStamp-r15 ::= CHOICE {
+ utcTime-r15 UTC-Time-r15,
+ gnssTime-r15 MeasurementReferenceTime,
+ systemFrameNumber-r15 SFN-r15,
+ measurementSFN-r15 INTEGER(-8192..9214),
+ ...
+}
+
+DeltaTime-r15 ::= CHOICE {
+ deltaTimeSec-r15 INTEGER (1..16384),
+ deltaTimeSFN-r15 INTEGER (1..4096),
+ ...
+}
+
+SFN-r15 ::= SEQUENCE {
+ sfn-r15 BIT STRING (SIZE (10)),
+ hyperSFN-r15 BIT STRING (SIZE (10)) OPTIONAL,
+ ...
+}
+
+Displacement-r15 ::= SEQUENCE {
+ bearing-r15 INTEGER (0..3599),
+ bearingUncConfidence-r15 INTEGER (0..100) OPTIONAL,
+ bearingRef-r15 ENUMERATED { geographicNorth, magneticNorth, local },
+ horizontalDistance-r15 INTEGER (0..8191),
+ horizontalDistanceUnc-r15 INTEGER (0..255) OPTIONAL,
+ horizontalUncConfidence-r15 INTEGER (0..100) OPTIONAL,
+ verticalDirection-r15 ENUMERATED{upward, downward} OPTIONAL,
+ verticalDistance-r15 INTEGER(0..8191) OPTIONAL,
+ verticalDistanceUnc-r15 INTEGER (0..255) OPTIONAL,
+ verticalUncConfidence-r15 INTEGER (0..100) OPTIONAL,
+ ...
+}
+
+UTC-Time-r15 ::= SEQUENCE {
+ utcTime-r15 UTCTime,
+ utcTime-ms-r15 INTEGER (0..999),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+Sensor-RequestLocationInformation-r13 ::= SEQUENCE {
+ uncompensatedBarometricPressureReq-r13 BOOLEAN,
+ ...,
+ [[ assistanceAvailability-r14 BOOLEAN OPTIONAL -- Need ON
+ ]],
+ [[ sensor-MotionInformationReq-r15 BOOLEAN OPTIONAL -- Need ON
+ ]],
+ [[ adjustmentReq-r16 BOOLEAN OPTIONAL -- Need ON
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+Sensor-ProvideCapabilities-r13 ::= SEQUENCE {
+ sensor-Modes-r13 BIT STRING { standalone (0),
+ ue-assisted (1),
+ ue-based (2)} (SIZE (1..8)),
+ ...,
+ [[ sensor-AssistanceDataSupportList-r14 Sensor-AssistanceDataSupportList-r14 OPTIONAL,
+ periodicalReportingSupported-r14 PositioningModes OPTIONAL,
+ idleStateForMeasurements-r14 ENUMERATED { required } OPTIONAL
+ ]],
+ [[ sensor-MotionInformationSup-r15 ENUMERATED { true } OPTIONAL
+ ]],
+ [[ adjustmentSupported-r16 ENUMERATED { true } OPTIONAL
+ ]]
+}
+
+Sensor-AssistanceDataSupportList-r14 ::= SEQUENCE {
+ ...,
+ [[ validityPeriodSupported-v1520 ENUMERATED { true } OPTIONAL,
+ validityAreaSupported-v1520 ENUMERATED { true } OPTIONAL
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+Sensor-RequestCapabilities-r13 ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+Sensor-Error-r13 ::= CHOICE {
+ locationServerErrorCauses-r13 Sensor-LocationServerErrorCauses-r13,
+ targetDeviceErrorCauses-r13 Sensor-TargetDeviceErrorCauses-r13,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+Sensor-LocationServerErrorCauses-r13 ::= SEQUENCE {
+ cause-r13 ENUMERATED { undefined,
+ ...,
+ assistanceDataNotSupportedByServer-v1420,
+ assistanceDataSupportedButCurrentlyNotAvailableByServer-v1420
+ },
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+Sensor-TargetDeviceErrorCauses-r13 ::= SEQUENCE {
+ cause-r13 ENUMERATED { undefined,
+ ...,
+ assistanceDataMissing-v1420
+ },
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+Sensor-ProvideAssistanceData-r14 ::= SEQUENCE {
+ sensor-AssistanceDataList-r14 Sensor-AssistanceDataList-r14 OPTIONAL, -- Need ON
+ sensor-Error-r14 Sensor-Error-r13 OPTIONAL, -- Need ON
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+Sensor-AssistanceDataList-r14::= SEQUENCE {
+ refPressure-r14 INTEGER (-20000..10000),
+ refPosition-r14 EllipsoidPointWithAltitudeAndUncertaintyEllipsoid OPTIONAL, -- Need ON
+ refTemperature-r14 INTEGER (-64..63) OPTIONAL, -- Need ON
+ ...,
+ [[
+ period-v1520 SEQUENCE {
+ pressureValidityPeriod-v1520 PressureValidityPeriod-v1520,
+ referencePressureRate-v1520 INTEGER (-128..127) OPTIONAL, -- Need ON
+ ...
+ } OPTIONAL, -- Need ON
+ area-v1520 SEQUENCE {
+ pressureValidityArea-v1520 PressureValidityArea-v1520,
+ gN-pressure-v1520 INTEGER (-1024..1023) OPTIONAL, -- Need ON
+ gE-pressure-v1520 INTEGER (-1024..1023) OPTIONAL, -- Need ON
+ ...
+ } OPTIONAL -- Need ON
+ ]]
+}
+
+PressureValidityArea-v1520 ::= SEQUENCE {
+ centerPoint-v1520 Ellipsoid-Point,
+ validityAreaWidth-v1520 INTEGER (1..128),
+ validityAreaHeight-v1520 INTEGER (1..128),
+ ...
+}
+
+PressureValidityPeriod-v1520 ::= SEQUENCE {
+ beginTime-v1520 GNSS-SystemTime,
+ beginTimeAlt-v1520 INTEGER (0..2881) OPTIONAL, -- Need ON
+ duration-v1520 INTEGER (1..2881),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+Sensor-RequestAssistanceData-r14 ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+WLAN-ProvideLocationInformation-r13 ::= SEQUENCE {
+ wlan-MeasurementInformation-r13 WLAN-MeasurementInformation-r13 OPTIONAL,
+ wlan-Error-r13 WLAN-Error-r13 OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+WLAN-MeasurementInformation-r13 ::= SEQUENCE {
+ measurementReferenceTime-r13 UTCTime OPTIONAL,
+ wlan-MeasurementList-r13 WLAN-MeasurementList-r13 OPTIONAL,
+ ...
+}
+
+WLAN-MeasurementList-r13 ::= SEQUENCE (SIZE(1..maxWLAN-AP-r13)) OF WLAN-MeasurementElement-r13
+
+WLAN-MeasurementElement-r13 ::= SEQUENCE {
+ wlan-AP-Identifier-r13 WLAN-AP-Identifier-r13,
+ rssi-r13 INTEGER (-127..128) OPTIONAL,
+ rtt-r13 WLAN-RTT-r13 OPTIONAL,
+ apChannelFrequency-r13 INTEGER (0..256) OPTIONAL,
+ servingFlag-r13 BOOLEAN OPTIONAL,
+ ...
+}
+
+WLAN-AP-Identifier-r13 ::= SEQUENCE {
+ bssid-r13 OCTET STRING (SIZE (6)),
+ ssid-r13 OCTET STRING (SIZE (1..32)) OPTIONAL,
+ ...
+}
+
+WLAN-RTT-r13 ::= SEQUENCE {
+ rttValue-r13 INTEGER (0..16777215),
+ rttUnits-r13 ENUMERATED { microseconds,
+ hundredsofnanoseconds,
+ tensofnanoseconds,
+ nanoseconds,
+ tenthsofnanoseconds,
+ ... },
+ rttAccuracy-r13 INTEGER (0..255) OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+WLAN-RequestLocationInformation-r13 ::= SEQUENCE {
+ requestedMeasurements-r13 BIT STRING {
+ rssi (0),
+ rtt (1)} (SIZE(1..8)),
+ ...,
+ [[ assistanceAvailability-r14 BOOLEAN OPTIONAL -- Need ON
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+WLAN-ProvideCapabilities-r13 ::= SEQUENCE {
+ wlan-Modes-r13 BIT STRING { standalone (0),
+ ue-assisted (1),
+ ue-based (2)} (SIZE (1..8)),
+ wlan-MeasSupported-r13 BIT STRING {
+ rssi-r13 (0),
+ rtt-r13 (1)} (SIZE(1..8)),
+ ... ,
+ [[ wlan-AP-AD-Supported-r14
+ BIT STRING { ap-identifier (0),
+ ap-location (1)} (SIZE (1..8))
+ OPTIONAL,
+ periodicalReportingSupported-r14 PositioningModes OPTIONAL,
+ idleStateForMeasurements-r14
+ ENUMERATED { required } OPTIONAL
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+WLAN-RequestCapabilities-r13 ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+WLAN-Error-r13 ::= CHOICE {
+ locationServerErrorCauses-r13 WLAN-LocationServerErrorCauses-r13,
+ targetDeviceErrorCauses-r13 WLAN-TargetDeviceErrorCauses-r13,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+WLAN-LocationServerErrorCauses-r13 ::= SEQUENCE {
+ cause-r13 ENUMERATED {undefined,
+ ...,
+ requestedADNotAvailable-v1420,
+ notAllrequestedADAvailable-v1420
+ },
+ ...,
+ [[ apLocationDataUnavailable-r14 NULL OPTIONAL -- Need ON
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+WLAN-TargetDeviceErrorCauses-r13 ::= SEQUENCE {
+ cause-r13 ENUMERATED {undefined,
+ requestedMeasurementsNotAvailable,
+ notAllrequestedMeasurementsPossible,
+ ...
+ },
+ wlan-AP-RSSI-MeasurementNotPossible-r13 NULL OPTIONAL,
+ wlan-AP-RTT-MeasurementNotPossible-r13 NULL OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+WLAN-ProvideAssistanceData-r14 ::= SEQUENCE {
+ wlan-DataSet-r14 SEQUENCE (SIZE (1..maxWLAN-DataSets-r14)) OF WLAN-DataSet-r14
+ OPTIONAL, -- Need ON
+ wlan-Error-r14 WLAN-Error-r13 OPTIONAL, -- Need ON
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+WLAN-DataSet-r14 ::= SEQUENCE {
+ wlan-AP-List-r14 SEQUENCE (SIZE (1..maxWLAN-AP-r14)) OF WLAN-AP-Data-r14,
+ supportedChannels-11a-r14 SupportedChannels-11a-r14 OPTIONAL, -- Need ON
+ supportedChannels-11bg-r14 SupportedChannels-11bg-r14 OPTIONAL, -- Need ON
+ ...
+}
+
+SupportedChannels-11a-r14 ::= SEQUENCE {
+ ch34-r14 BOOLEAN,
+ ch36-r14 BOOLEAN,
+ ch38-r14 BOOLEAN,
+ ch40-r14 BOOLEAN,
+ ch42-r14 BOOLEAN,
+ ch44-r14 BOOLEAN,
+ ch46-r14 BOOLEAN,
+ ch48-r14 BOOLEAN,
+ ch52-r14 BOOLEAN,
+ ch56-r14 BOOLEAN,
+ ch60-r14 BOOLEAN,
+ ch64-r14 BOOLEAN,
+ ch149-r14 BOOLEAN,
+ ch153-r14 BOOLEAN,
+ ch157-r14 BOOLEAN,
+ ch161-r14 BOOLEAN
+}
+
+SupportedChannels-11bg-r14 ::= SEQUENCE {
+ ch1-r14 BOOLEAN,
+ ch2-r14 BOOLEAN,
+ ch3-r14 BOOLEAN,
+ ch4-r14 BOOLEAN,
+ ch5-r14 BOOLEAN,
+ ch6-r14 BOOLEAN,
+ ch7-r14 BOOLEAN,
+ ch8-r14 BOOLEAN,
+ ch9-r14 BOOLEAN,
+ ch10-r14 BOOLEAN,
+ ch11-r14 BOOLEAN,
+ ch12-r14 BOOLEAN,
+ ch13-r14 BOOLEAN,
+ ch14-r14 BOOLEAN
+}
+
+-- ASN1STOP
+-- ASN1START
+
+WLAN-AP-Data-r14 ::= SEQUENCE {
+ wlan-AP-Identifier-r14 WLAN-AP-Identifier-r13,
+ wlan-AP-Location-r14 WLAN-AP-Location-r14 OPTIONAL, -- Need ON
+ ...
+}
+
+WLAN-AP-Location-r14 ::= SEQUENCE {
+ locationDataLCI-r14 LocationDataLCI-r14,
+ ...
+}
+
+LocationDataLCI-r14 ::= SEQUENCE {
+ latitudeUncertainty-r14 BIT STRING (SIZE (6)),
+ latitude-r14 BIT STRING (SIZE (34)),
+ longitudeUncertainty-r14 BIT STRING (SIZE (6)),
+ longitude-r14 BIT STRING (SIZE (34)),
+ altitudeUncertainty-r14 BIT STRING (SIZE (6)) OPTIONAL, -- Need ON
+ altitude-r14 BIT STRING (SIZE (30)) OPTIONAL, -- Need ON
+ datum-r14 BIT STRING (SIZE (8)),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+WLAN-RequestAssistanceData-r14 ::= SEQUENCE {
+ requestedAD-r14 BIT STRING { ap-identifier (0),
+ ap-location (1)} (SIZE (1..8)),
+ visibleAPs-r14 SEQUENCE (SIZE (1..maxVisibleAPs-r14)) OF WLAN-AP-Identifier-r13 OPTIONAL,
+ wlan-AP-StoredData-r14 SEQUENCE (SIZE (1..maxKnownAPs-r14)) OF WLAN-AP-Identifier-r13 OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+BT-ProvideLocationInformation-r13 ::= SEQUENCE {
+ bt-MeasurementInformation-r13 BT-MeasurementInformation-r13 OPTIONAL,
+ bt-Error-r13 BT-Error-r13 OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+BT-MeasurementInformation-r13 ::= SEQUENCE {
+ measurementReferenceTime-r13 UTCTime OPTIONAL,
+ bt-MeasurementList-r13 BT-MeasurementList-r13 OPTIONAL,
+ ...
+}
+
+BT-MeasurementList-r13 ::= SEQUENCE (SIZE(1..maxBT-Beacon-r13)) OF BT-MeasurementElement-r13
+
+
+BT-MeasurementElement-r13 ::= SEQUENCE {
+ btAddr-r13 BIT STRING (SIZE (48)),
+ rssi-r13 INTEGER (-128..127) OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+BT-RequestLocationInformation-r13 ::= SEQUENCE {
+ requestedMeasurements-r13 BIT STRING {
+ rssi (0)} (SIZE(1..8)),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+BT-ProvideCapabilities-r13 ::= SEQUENCE {
+ bt-Modes-r13 BIT STRING { standalone (0),
+ ue-assisted (1)} (SIZE (1..8)),
+ bt-MeasSupported-r13 BIT STRING { rssi-r13 (0)} (SIZE (1..8)),
+ ...,
+ [[
+ idleStateForMeasurements-r14
+ ENUMERATED { required } OPTIONAL,
+ periodicalReportingSupported-r14
+ PositioningModes OPTIONAL
+ ]]
+}
+
+-- ASN1STOP
+-- ASN1START
+
+BT-RequestCapabilities-r13 ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+BT-Error-r13 ::= CHOICE {
+ locationServerErrorCauses-r13 BT-LocationServerErrorCauses-r13,
+ targetDeviceErrorCauses-r13 BT-TargetDeviceErrorCauses-r13,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+BT-LocationServerErrorCauses-r13 ::= SEQUENCE {
+ cause-r13 ENUMERATED {undefined, ...},
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+BT-TargetDeviceErrorCauses-r13 ::= SEQUENCE {
+ cause-r13 ENUMERATED {undefined,
+ requestedMeasurementsNotAvailable,
+ notAllrequestedMeasurementsPossible,
+ ...
+ },
+ bt-Beacon-rssiMeasurementNotPossible-r13 NULL OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-UL-ProvideCapabilities-r16 ::= SEQUENCE {
+ nr-UL-SRS-Capability-r16 NR-UL-SRS-Capability-r16,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-UL-RequestCapabilities-r16 ::= SEQUENCE {
+ ...
+}
+-- ASN1STOP
+-- ASN1START
+
+NR-ECID-ProvideLocationInformation-r16 ::= SEQUENCE {
+ nr-ECID-SignalMeasurementInformation-r16 NR-ECID-SignalMeasurementInformation-r16 OPTIONAL,
+ nr-ECID-Error-r16 NR-ECID-Error-r16 OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-ECID-SignalMeasurementInformation-r16 ::= SEQUENCE {
+ nr-PrimaryCellMeasuredResults-r16 NR-MeasuredResultsElement-r16,
+ nr-MeasuredResultsList-r16 NR-MeasuredResultsList-r16 OPTIONAL,
+ ...
+}
+
+NR-MeasuredResultsList-r16 ::= SEQUENCE (SIZE(1..32)) OF NR-MeasuredResultsElement-r16
+
+NR-MeasuredResultsElement-r16 ::= SEQUENCE {
+ nr-PhysCellID-r16 NR-PhysCellID-r16,
+ nr-ARFCN-r16 CHOICE {
+ ssb-ARFCN-r16 ARFCN-ValueNR-r15,
+ csi-RS-pointA-r16 ARFCN-ValueNR-r15
+ },
+ nr-CellGlobalID-r16 NCGI-r15 OPTIONAL,
+ systemFrameNumber-r16 BIT STRING (SIZE (10)) OPTIONAL, resultsSSB-Cell-r16 MeasQuantityResults-r16 OPTIONAL,
+ resultsCSI-RS-Cell-r16 MeasQuantityResults-r16 OPTIONAL,
+ resultsSSB-Indexes-r16 ResultsPerSSB-IndexList-r16 OPTIONAL,
+ resultsCSI-RS-Indexes-r16 ResultsPerCSI-RS-IndexList-r16 OPTIONAL,
+ ...
+}
+
+MeasQuantityResults-r16 ::= SEQUENCE {
+ nr-RSRP-r16 INTEGER (0..127) OPTIONAL,
+ nr-RSRQ-r16 INTEGER (0..127) OPTIONAL
+}
+
+ResultsPerSSB-IndexList-r16::= SEQUENCE (SIZE (1..64)) OF ResultsPerSSB-Index-r16
+
+ResultsPerSSB-Index-r16 ::= SEQUENCE {
+ ssb-Index-r16 INTEGER (0..63),
+ ssb-Results-r16 MeasQuantityResults-r16
+}
+
+ResultsPerCSI-RS-IndexList-r16::= SEQUENCE (SIZE (1..64)) OF ResultsPerCSI-RS-Index-r16
+
+ResultsPerCSI-RS-Index-r16 ::= SEQUENCE {
+ csi-RS-Index-r16 INTEGER (0..95),
+ csi-RS-Results-r16 MeasQuantityResults-r16
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-ECID-RequestLocationInformation-r16 ::= SEQUENCE {
+ requestedMeasurements-r16 BIT STRING { ssrsrpReq (0),
+ ssrsrqReq (1),
+ csirsrpReq (2),
+ csirsrqReq (3)} (SIZE(1..8)),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-ECID-ProvideCapabilities-r16 ::= SEQUENCE {
+ nr-ECID-MeasSupported-r16 BIT STRING { ssrsrpSup (0),
+ ssrsrqSup (1),
+ csirsrpSup (2),
+ csirsrqSup (3)} (SIZE(1..8)),
+ periodicalReporting-r16 ENUMERATED { supported } OPTIONAL,
+ triggeredReporting-r16 ENUMERATED { supported } OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-ECID-RequestCapabilities-r16 ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-ECID-Error-r16 ::= CHOICE {
+ locationServerErrorCauses-r16 NR-ECID-LocationServerErrorCauses-r16,
+ targetDeviceErrorCauses-r16 NR-ECID-TargetDeviceErrorCauses-r16,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-ECID-LocationServerErrorCauses-r16 ::= SEQUENCE {
+ cause-r16 ENUMERATED { undefined,
+ ...
+ },
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-ECID-TargetDeviceErrorCauses-r16 ::= SEQUENCE {
+ cause-r16 ENUMERATED { undefined,
+ requestedMeasurementNotAvailable,
+ notAllrequestedMeasurementsPossible,
+ ...
+ },
+ ss-RSRPMeasurementNotPossible-r16 NULL OPTIONAL,
+ ss-RSRQMeasurementNotPossible-r16 NULL OPTIONAL,
+ csi-RSRPMeasurementNotPossible-r16 NULL OPTIONAL,
+ csi-RSRQMeasurementNotPossible-r16 NULL OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-TDOA-ProvideAssistanceData-r16 ::= SEQUENCE {
+ nr-DL-PRS-AssistanceData-r16 NR-DL-PRS-AssistanceData-r16 OPTIONAL, -- Need ON
+ nr-SelectedDL-PRS-IndexList-r16 NR-SelectedDL-PRS-IndexList-r16 OPTIONAL, -- Need ON
+ nr-PositionCalculationAssistance-r16
+ NR-PositionCalculationAssistance-r16
+ OPTIONAL, -- Cond UEB
+ nr-DL-TDOA-Error-r16 NR-DL-TDOA-Error-r16 OPTIONAL, -- Need ON
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-TDOA-RequestAssistanceData-r16 ::= SEQUENCE {
+ nr-PhysCellID-r16 NR-PhysCellID-r16 OPTIONAL,
+ nr-AdType-r16 BIT STRING { dl-prs (0),
+ posCalc (1) } (SIZE (1..8)),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-TDOA-ProvideLocationInformation-r16 ::= SEQUENCE {
+ nr-DL-TDOA-SignalMeasurementInformation-r16
+ NR-DL-TDOA-SignalMeasurementInformation-r16
+ OPTIONAL,
+ nr-dl-tdoa-LocationInformation-r16 NR-DL-TDOA-LocationInformation-r16
+ OPTIONAL,
+ nr-DL-TDOA-Error-r16 NR-DL-TDOA-Error-r16 OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-TDOA-SignalMeasurementInformation-r16 ::= SEQUENCE {
+ dl-PRS-ReferenceInfo-r16 DL-PRS-ID-Info-r16,
+ nr-DL-TDOA-MeasList-r16 NR-DL-TDOA-MeasList-r16,
+ ...
+}
+
+NR-DL-TDOA-MeasList-r16 ::= SEQUENCE (SIZE(1..nrMaxTRPs-r16)) OF NR-DL-TDOA-MeasElement-r16
+
+NR-DL-TDOA-MeasElement-r16 ::= SEQUENCE {
+ dl-PRS-ID-r16 INTEGER (0..255),
+ nr-PhysCellID-r16 NR-PhysCellID-r16 OPTIONAL,
+ nr-CellGlobalID-r16 NCGI-r15 OPTIONAL,
+ nr-ARFCN-r16 ARFCN-ValueNR-r15 OPTIONAL,
+ nr-DL-PRS-ResourceID-r16 NR-DL-PRS-ResourceID-r16 OPTIONAL,
+ nr-DL-PRS-ResourceSetID-r16 NR-DL-PRS-ResourceSetID-r16 OPTIONAL,
+ nr-TimeStamp-r16 NR-TimeStamp-r16,
+ nr-RSTD-r16 CHOICE {
+ k0-r16 INTEGER (0..1970049),
+ k1-r16 INTEGER (0..985025),
+ k2-r16 INTEGER (0..492513),
+ k3-r16 INTEGER (0..246257),
+ k4-r16 INTEGER (0..123129),
+ k5-r16 INTEGER (0..61565),
+ ...
+ },
+ nr-AdditionalPathList-r16 NR-AdditionalPathList-r16 OPTIONAL,
+ nr-TimingQuality-r16 NR-TimingQuality-r16,
+ nr-DL-PRS-RSRP-Result-r16 INTEGER (0..126) OPTIONAL,
+ nr-DL-TDOA-AdditionalMeasurements-r16
+ NR-DL-TDOA-AdditionalMeasurements-r16 OPTIONAL,
+ ...
+}
+
+NR-DL-TDOA-AdditionalMeasurements-r16 ::= SEQUENCE (SIZE (1..3)) OF
+ NR-DL-TDOA-AdditionalMeasurementElement-r16
+
+NR-DL-TDOA-AdditionalMeasurementElement-r16 ::= SEQUENCE {
+ nr-DL-PRS-ResourceID-r16 NR-DL-PRS-ResourceID-r16 OPTIONAL,
+ nr-DL-PRS-ResourceSetID-r16 NR-DL-PRS-ResourceSetID-r16 OPTIONAL,
+ nr-TimeStamp-r16 NR-TimeStamp-r16,
+ nr-RSTD-ResultDiff-r16 CHOICE {
+ k0-r16 INTEGER (0..8191),
+ k1-r16 INTEGER (0..4095),
+ k2-r16 INTEGER (0..2047),
+ k3-r16 INTEGER (0..1023),
+ k4-r16 INTEGER (0..511),
+ k5-r16 INTEGER (0..255),
+ ...
+ },
+ nr-TimingQuality-r16 NR-TimingQuality-r16,
+ nr-DL-PRS-RSRP-ResultDiff-r16 INTEGER (0..61) OPTIONAL,
+ nr-AdditionalPathList-r16 NR-AdditionalPathList-r16 OPTIONAL,
+...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-TDOA-LocationInformation-r16 ::= SEQUENCE {
+ measurementReferenceTime-r16 CHOICE {
+ systemFrameNumber-r16 NR-TimeStamp-r16,
+ utc-time-r16 UTCTime,
+ ...
+ } OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-TDOA-RequestLocationInformation-r16 ::= SEQUENCE {
+ nr-DL-PRS-RstdMeasurementInfoRequest-r16 ENUMERATED { true } OPTIONAL,-- Need ON
+ nr-RequestedMeasurements-r16 BIT STRING { prsrsrpReq (0) } (SIZE(1..8)),
+ nr-AssistanceAvailability-r16 BOOLEAN,
+ nr-DL-TDOA-ReportConfig-r16 NR-DL-TDOA-ReportConfig-r16 OPTIONAL, -- Need ON
+ additionalPaths-r16 ENUMERATED { requested } OPTIONAL, -- Need ON
+ ...
+}
+
+NR-DL-TDOA-ReportConfig-r16 ::= SEQUENCE {
+ maxDL-PRS-RSTD-MeasurementsPerTRPPair-r16 INTEGER (1..4) OPTIONAL, -- Need ON
+ timingReportingGranularityFactor-r16 INTEGER (0..5) OPTIONAL, -- Need ON
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-TDOA-ProvideCapabilities-r16 ::= SEQUENCE {
+ nr-DL-TDOA-Mode-r16 PositioningModes,
+ nr-DL-TDOA-PRS-Capability-r16 NR-DL-PRS-ResourcesCapability-r16,
+ nr-DL-TDOA-MeasurementCapability-r16 NR-DL-TDOA-MeasurementCapability-r16,
+ nr-DL-PRS-QCL-ProcessingCapability-r16 NR-DL-PRS-QCL-ProcessingCapability-r16,
+ nr-DL-PRS-ProcessingCapability-r16 NR-DL-PRS-ProcessingCapability-r16,
+ additionalPathsReport-r16 ENUMERATED { supported } OPTIONAL,
+ periodicalReporting-r16 PositioningModes OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-TDOA-MeasurementCapability-r16 ::= SEQUENCE {
+ dl-RSTD-MeasurementPerPairOfTRP-FR1-r16 INTEGER (1..4),
+ dl-RSTD-MeasurementPerPairOfTRP-FR2-r16 INTEGER (1..4),
+ supportOfDL-PRS-RSRP-MeasFR1-r16 ENUMERATED { supported} OPTIONAL,
+ supportOfDL-PRS-RSRP-MeasFR2-r16 ENUMERATED { supported} OPTIONAL,
+ ...
+}
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-TDOA-RequestCapabilities-r16 ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-TDOA-Error-r16 ::= CHOICE {
+ locationServerErrorCauses-r16 NR-DL-TDOA-LocationServerErrorCauses-r16,
+ targetDeviceErrorCauses-r16 NR-DL-TDOA-TargetDeviceErrorCauses-r16,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-TDOA-LocationServerErrorCauses-r16 ::= SEQUENCE {
+ cause-r16 ENUMERATED { undefined,
+ assistanceDataNotSupportedByServer,
+ assistanceDataSupportedButCurrentlyNotAvailableByServer,
+ notProvidedAssistanceDataNotSupportedByServer,
+ ...
+ },
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-TDOA-TargetDeviceErrorCauses-r16 ::= SEQUENCE {
+ cause-r16 ENUMERATED { undefined,
+ assistance-data-missing,
+ unableToMeasureAnyTRP,
+ attemptedButUnableToMeasureSomeNeighbourTRPs,
+ thereWereNotEnoughSignalsReceivedForUeBasedDL-TDOA,
+ locationCalculationAssistanceDataMissing,
+ ...
+ },
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-AoD-ProvideAssistanceData-r16 ::= SEQUENCE {
+ nr-DL-PRS-AssistanceData-r16 NR-DL-PRS-AssistanceData-r16 OPTIONAL, -- Need ON
+ nr-SelectedDL-PRS-IndexList-r16 NR-SelectedDL-PRS-IndexList-r16 OPTIONAL, -- Need ON
+ nr-PositionCalculationAssistance-r16
+ NR-PositionCalculationAssistance-r16
+ OPTIONAL, -- Cond UEB
+ nr-DL-AoD-Error-r16 NR-DL-AoD-Error-r16 OPTIONAL, -- Need ON
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-AoD-RequestAssistanceData-r16 ::= SEQUENCE {
+ nr-PhysCellID-r16 NR-PhysCellID-r16 OPTIONAL,
+ nr-AdType-r16 BIT STRING { dl-prs (0),
+ posCalc (1) } (SIZE (1..8)),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-AoD-ProvideLocationInformation-r16 ::= SEQUENCE {
+ nr-DL-AoD-SignalMeasurementInformation-r16
+ NR-DL-AoD-SignalMeasurementInformation-r16
+ OPTIONAL,
+ nr-dl-AoD-LocationInformation-r16 NR-DL-AoD-LocationInformation-r16
+ OPTIONAL,
+ nr-DL-AoD-Error-r16 NR-DL-AoD-Error-r16 OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-AoD-SignalMeasurementInformation-r16 ::= SEQUENCE {
+ nr-DL-AoD-MeasList-r16 NR-DL-AoD-MeasList-r16,
+ ...
+}
+
+NR-DL-AoD-MeasList-r16 ::= SEQUENCE (SIZE(1..nrMaxTRPs-r16)) OF NR-DL-AoD-MeasElement-r16
+
+NR-DL-AoD-MeasElement-r16 ::= SEQUENCE {
+ dl-PRS-ID-r16 INTEGER (0..255),
+ nr-PhysCellID-r16 NR-PhysCellID-r16 OPTIONAL,
+ nr-CellGlobalID-r16 NCGI-r15 OPTIONAL,
+ nr-ARFCN-r16 ARFCN-ValueNR-r15 OPTIONAL,
+ nr-DL-PRS-ResourceID-r16 NR-DL-PRS-ResourceID-r16 OPTIONAL,
+ nr-DL-PRS-ResourceSetID-r16 NR-DL-PRS-ResourceSetID-r16 OPTIONAL,
+ nr-TimeStamp-r16 NR-TimeStamp-r16,
+ nr-DL-PRS-RSRP-Result-r16 INTEGER (0..126),
+ nr-DL-PRS-RxBeamIndex-r16 INTEGER (1..8) OPTIONAL,
+ nr-DL-AoD-AdditionalMeasurements-r16
+ NR-DL-AoD-AdditionalMeasurements-r16 OPTIONAL,
+ ...
+}
+
+NR-DL-AoD-AdditionalMeasurements-r16 ::= SEQUENCE (SIZE (1..7)) OF
+ NR-DL-AoD-AdditionalMeasurementElement-r16
+
+NR-DL-AoD-AdditionalMeasurementElement-r16 ::= SEQUENCE {
+ nr-DL-PRS-ResourceID-r16 NR-DL-PRS-ResourceID-r16 OPTIONAL,
+ nr-DL-PRS-ResourceSetID-r16 NR-DL-PRS-ResourceSetID-r16 OPTIONAL,
+ nr-TimeStamp-r16 NR-TimeStamp-r16,
+ nr-DL-PRS-RSRP-ResultDiff-r16 INTEGER (0..30),
+ nr-DL-PRS-RxBeamIndex-r16 INTEGER (1..8) OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-AoD-LocationInformation-r16 ::= SEQUENCE {
+ measurementReferenceTime-r16 CHOICE {
+ sfn-time-r16 NR-TimeStamp-r16,
+ utc-time-r16 UTCTime,
+ ...
+ } OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-AoD-RequestLocationInformation-r16 ::= SEQUENCE {
+ nr-AssistanceAvailability-r16 BOOLEAN,
+ nr-DL-AoD-ReportConfig-r16 NR-DL-AoD-ReportConfig-r16,
+ ...
+}
+
+NR-DL-AoD-ReportConfig-r16 ::= SEQUENCE {
+ maxDL-PRS-RSRP-MeasurementsPerTRP-r16 INTEGER (1..8) OPTIONAL, -- Need ON
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-AoD-ProvideCapabilities-r16 ::= SEQUENCE {
+ nr-DL-AoD-Mode-r16 PositioningModes,
+ nr-DL-AoD-PRS-Capability-r16 NR-DL-PRS-ResourcesCapability-r16,
+ nr-DL-AoD-MeasurementCapability-r16 NR-DL-AoD-MeasurementCapability-r16,
+ nr-DL-PRS-QCL-ProcessingCapability-r16 NR-DL-PRS-QCL-ProcessingCapability-r16,
+ nr-DL-PRS-ProcessingCapability-r16 NR-DL-PRS-ProcessingCapability-r16,
+ periodicalReporting-r16 PositioningModes OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-AoD-MeasurementCapability-r16 ::= SEQUENCE {
+ maxDL-PRS-RSRP-MeasurementFR1-r16 INTEGER (1..8),
+ maxDL-PRS-RSRP-MeasurementFR2-r16 INTEGER (1..8),
+ dl-AoD-MeasCapabilityBandList-r16 SEQUENCE (SIZE (1..nrMaxBands-r16)) OF
+ DL-AoD-MeasCapabilityPerBand-r16,
+ ...
+}
+
+DL-AoD-MeasCapabilityPerBand-r16 ::= SEQUENCE {
+ freqBandIndicatorNR-r16 FreqBandIndicatorNR-r16,
+ simul-NR-DL-AoD-DL-TDOA-r16 ENUMERATED { supported} OPTIONAL,
+ simul-NR-DL-AoD-Multi-RTT-r16 ENUMERATED { supported} OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-AoD-RequestCapabilities-r16 ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-AoD-Error-r16 ::= CHOICE {
+ locationServerErrorCauses-r16 NR-DL-AoD-LocationServerErrorCauses-r16,
+ targetDeviceErrorCauses-r16 NR-DL-AoD-TargetDeviceErrorCauses-r16,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-AoD-LocationServerErrorCauses-r16 ::= SEQUENCE {
+ cause-r16 ENUMERATED { undefined,
+ assistanceDataNotSupportedByServer,
+ assistanceDataSupportedButCurrentlyNotAvailableByServer,
+ notProvidedAssistanceDataNotSupportedByServer,
+ ...
+ },
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-DL-AoD-TargetDeviceErrorCauses-r16 ::= SEQUENCE {
+ cause-r16 ENUMERATED { undefined,
+ assistance-data-missing,
+ unableToMeasureAnyTRP,
+ attemptedButUnableToMeasureSomeNeighbourTRPs,
+ thereWereNotEnoughSignalsReceivedForUeBasedDL-AoD,
+ locationCalculationAssistanceDataMissing,
+ ...
+ },
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-Multi-RTT-ProvideAssistanceData-r16 ::= SEQUENCE {
+ nr-DL-PRS-AssistanceData-r16 NR-DL-PRS-AssistanceData-r16 OPTIONAL, -- Need ON
+ nr-SelectedDL-PRS-IndexList-r16 NR-SelectedDL-PRS-IndexList-r16 OPTIONAL, -- Need ON
+ nr-Multi-RTT-Error-r16 NR-Multi-RTT-Error-r16 OPTIONAL, -- Need ON
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-Multi-RTT-RequestAssistanceData-r16 ::= SEQUENCE {
+ nr-PhysCellID-r16 NR-PhysCellID-r16 OPTIONAL,
+ nr-AdType-r16 BIT STRING { dl-prs (0),
+ ul-srs (1) } (SIZE (1..8)),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-Multi-RTT-ProvideLocationInformation-r16 ::= SEQUENCE {
+ nr-Multi-RTT-SignalMeasurementInformation-r16
+ NR-Multi-RTT-SignalMeasurementInformation-r16
+ OPTIONAL,
+ nr-Multi-RTT-Error-r16 NR-Multi-RTT-Error-r16 OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-Multi-RTT-SignalMeasurementInformation-r16 ::= SEQUENCE {
+ nr-Multi-RTT-MeasList-r16 NR-Multi-RTT-MeasList-r16,
+ nr-NTA-Offset-r16 ENUMERATED { nTA1, nTA2, nTA3, nTA4, ... } OPTIONAL,
+ ...
+}
+
+NR-Multi-RTT-MeasList-r16 ::= SEQUENCE (SIZE(1..nrMaxTRPs-r16)) OF NR-Multi-RTT-MeasElement-r16
+
+NR-Multi-RTT-MeasElement-r16 ::= SEQUENCE {
+ dl-PRS-ID-r16 INTEGER (0..255),
+ nr-PhysCellID-r16 NR-PhysCellID-r16 OPTIONAL,
+ nr-CellGlobalID-r16 NCGI-r15 OPTIONAL,
+ nr-ARFCN-r16 ARFCN-ValueNR-r15 OPTIONAL,
+ nr-DL-PRS-ResourceID-r16 NR-DL-PRS-ResourceID-r16 OPTIONAL,
+ nr-DL-PRS-ResourceSetID-r16 NR-DL-PRS-ResourceSetID-r16 OPTIONAL,
+ nr-UE-RxTxTimeDiff-r16 CHOICE {
+ k0-r16 INTEGER (0..1970049),
+ k1-r16 INTEGER (0..985025),
+ k2-r16 INTEGER (0..492513),
+ k3-r16 INTEGER (0..246257),
+ k4-r16 INTEGER (0..123129),
+ k5-r16 INTEGER (0..61565),
+ ...
+ },
+ nr-AdditionalPathList-r16 NR-AdditionalPathList-r16 OPTIONAL,
+ nr-TimeStamp-r16 NR-TimeStamp-r16,
+ nr-TimingQuality-r16 NR-TimingQuality-r16,
+ nr-DL-PRS-RSRP-Result-r16 INTEGER (0..126) OPTIONAL,
+ nr-Multi-RTT-AdditionalMeasurements-r16
+ NR-Multi-RTT-AdditionalMeasurements-r16 OPTIONAL,
+ ...
+}
+
+NR-Multi-RTT-AdditionalMeasurements-r16 ::= SEQUENCE (SIZE (1..3)) OF
+ NR-Multi-RTT-AdditionalMeasurementElement-r16
+
+NR-Multi-RTT-AdditionalMeasurementElement-r16 ::= SEQUENCE {
+ nr-DL-PRS-ResourceID-r16 NR-DL-PRS-ResourceID-r16 OPTIONAL,
+ nr-DL-PRS-ResourceSetID-r16 NR-DL-PRS-ResourceSetID-r16 OPTIONAL,
+ nr-DL-PRS-RSRP-ResultDiff-r16 INTEGER (0..61) OPTIONAL,
+ nr-UE-RxTxTimeDiffAdditional-r16 CHOICE {
+ k0-r16 INTEGER (0..8191),
+ k1-r16 INTEGER (0..4095),
+ k2-r16 INTEGER (0..2047),
+ k3-r16 INTEGER (0..1023),
+ k4-r16 INTEGER (0..511),
+ k5-r16 INTEGER (0..255),
+ ...
+ },
+ nr-TimingQuality-r16 NR-TimingQuality-r16,
+ nr-AdditionalPathList-r16 NR-AdditionalPathList-r16 OPTIONAL,
+ nr-TimeStamp-r16 NR-TimeStamp-r16,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-Multi-RTT-RequestLocationInformation-r16 ::= SEQUENCE {
+ nr-UE-RxTxTimeDiffMeasurementInfoRequest-r16
+ ENUMERATED { true } OPTIONAL, -- Need ON
+ nr-RequestedMeasurements-r16 BIT STRING { prsrsrpReq(0)} (SIZE(1..8)),
+ nr-AssistanceAvailability-r16 BOOLEAN,
+ nr-Multi-RTT-ReportConfig-r16 NR-Multi-RTT-ReportConfig-r16,
+ additionalPaths-r16 ENUMERATED { requested } OPTIONAL, -- Need ON
+ ...
+}
+
+NR-Multi-RTT-ReportConfig-r16 ::= SEQUENCE {
+ maxDL-PRS-RxTxTimeDiffMeasPerTRP-r16 INTEGER (1..4) OPTIONAL, -- Need ON
+ timingReportingGranularityFactor-r16 INTEGER (0..5) OPTIONAL -- Need ON
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-Multi-RTT-ProvideCapabilities-r16 ::= SEQUENCE {
+ nr-Multi-RTT-PRS-Capability-r16 NR-DL-PRS-ResourcesCapability-r16,
+ nr-Multi-RTT-MeasurementCapability-r16 NR-Multi-RTT-MeasurementCapability-r16,
+ nr-DL-PRS-QCL-ProcessingCapability-r16 NR-DL-PRS-QCL-ProcessingCapability-r16,
+ nr-DL-PRS-ProcessingCapability-r16 NR-DL-PRS-ProcessingCapability-r16,
+ nr-UL-SRS-Capability-r16 NR-UL-SRS-Capability-r16,
+ additionalPathsReport-r16 ENUMERATED { supported } OPTIONAL,
+ periodicalReporting-r16 ENUMERATED { supported } OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-Multi-RTT-MeasurementCapability-r16 ::= SEQUENCE {
+ maxNrOfRx-TX-MeasFR1-r16 INTEGER (1..4) OPTIONAL,
+ maxNrOfRx-TX-MeasFR2-r16 INTEGER (1..4) OPTIONAL,
+ supportOfRSRP-MeasFR1-r16 ENUMERATED { supported} OPTIONAL,
+ supportOfRSRP-MeasFR2-r16 ENUMERATED { supported} OPTIONAL,
+ srs-AssocPRS-MultiLayersFR1-r16 ENUMERATED { supported} OPTIONAL,
+ srs-AssocPRS-MultiLayersFR2-r16 ENUMERATED { supported} OPTIONAL,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-Multi-RTT-RequestCapabilities-r16 ::= SEQUENCE {
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-Multi-RTT-Error-r16 ::= CHOICE {
+ locationServerErrorCauses-r16 NR-Multi-RTT-LocationServerErrorCauses-r16,
+ targetDeviceErrorCauses-r16 NR-Multi-RTT-TargetDeviceErrorCauses-r16,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-Multi-RTT-LocationServerErrorCauses-r16 ::= SEQUENCE {
+ cause-r16 ENUMERATED { undefined,
+ assistanceDataNotSupportedByServer,
+ assistanceDataSupportedButCurrentlyNotAvailableByServer,
+ ...
+ },
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-Multi-RTT-TargetDeviceErrorCauses-r16 ::= SEQUENCE {
+ cause-r16 ENUMERATED { undefined,
+ dl-assistance-data-missing,
+ unableToMeasureAnyTRP,
+ attemptedButUnableToMeasureSomeNeighbourTRPs,
+ ul-srs-configuration-missing,
+ unableToTransmit-ul-srs,
+ ...
+ },
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+maxEARFCN INTEGER ::= 65535 -- Maximum value of EUTRA carrier frequency
+maxEARFCN-Plus1 INTEGER ::= 65536 -- Lowest value extended EARFCN range
+maxEARFCN2 INTEGER ::= 262143 -- Highest value extended EARFCN range
+
+maxMBS-r14 INTEGER ::= 64
+maxWLAN-AP-r13 INTEGER ::= 64
+maxKnownAPs-r14 INTEGER ::= 2048
+maxVisibleAPs-r14 INTEGER ::= 32
+maxWLAN-AP-r14 INTEGER ::= 128
+maxWLAN-DataSets-r14 INTEGER ::= 8
+
+maxBT-Beacon-r13 INTEGER ::= 32
+
+nrMaxBands-r16 INTEGER ::= 1024 -- Maximum number of supported bands in
+ -- UE capability.
+nrMaxFreqLayers-r16 INTEGER ::= 4 -- Max freq layers
+nrMaxFreqLayers-1-r16 INTEGER ::= 3
+nrMaxNumDL-PRS-ResourcesPerSet-1-r16 INTEGER ::= 63
+nrMaxNumDL-PRS-ResourceSetsPerTRP-1-r16 INTEGER ::= 7
+nrMaxResourceIDs-r16 INTEGER ::= 64 -- Max Resource IDs
+nrMaxResourceOffsetValue-1-r16 INTEGER ::= 511
+nrMaxResourcesPerSet-r16 INTEGER ::= 64 -- Maximum resources for one set
+nrMaxSetsPerTrpPerFreqLayer-r16 INTEGER ::= 2 -- Maximum resource sets for one TRP
+nrMaxSetsPerTrpPerFreqLayer-1-r16 INTEGER ::= 1
+nrMaxTRPs-r16 INTEGER ::= 256 -- Max TRPs per UE
+nrMaxTRPsPerFreq-r16 INTEGER ::= 64 -- Max TRPs per freq layers
+nrMaxTRPsPerFreq-1-r16 INTEGER ::= 63
+maxSimultaneousBands-r16 INTEGER ::= 4 -- Maximum number of simultaneously
+ -- measured bands
+maxBandComb-r16 INTEGER ::= 1024
+nrMaxConfiguredBands-r16 INTEGER ::= 16
+
+-- ASN1STOP
+-- ASN1START
+
+END
+
+-- ASN1STOP
+-- ASN1START
+
+LPP-Broadcast-Definitions
+
+DEFINITIONS AUTOMATIC TAGS ::=
+
+BEGIN
+
+IMPORTS
+ OTDOA-ReferenceCellInfo,
+ OTDOA-NeighbourCellInfoList,
+ NR-TRP-LocationInfo-r16,
+ NR-DL-PRS-BeamInfo-r16,
+ NR-RTD-Info-r16
+FROM LPP-PDU-Definitions;
+
+-- ASN1STOP
+-- ASN1START
+
+AssistanceDataSIBelement-r15 ::= SEQUENCE {
+ valueTag-r15 INTEGER (0..63) OPTIONAL, -- Need OP
+ expirationTime-r15 UTCTime OPTIONAL, -- Need OP
+ cipheringKeyData-r15 CipheringKeyData-r15 OPTIONAL, -- Need OP
+ segmentationInfo-r15 SegmentationInfo-r15 OPTIONAL, -- Need OP
+ assistanceDataElement-r15 OCTET STRING,
+ ...
+}
+
+CipheringKeyData-r15 ::= SEQUENCE {
+ cipherSetID-r15 INTEGER (0..65535),
+ d0-r15 BIT STRING (SIZE (1..128)),
+ ...
+}
+
+SegmentationInfo-r15 ::= SEQUENCE {
+ segmentationOption-r15 ENUMERATED {pseudo-seg, octet-string-seg},
+ assistanceDataSegmentType-r15 ENUMERATED {notLastSegment, lastSegment},
+ assistanceDataSegmentNumber-r15 INTEGER (0..63),
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+OTDOA-UE-Assisted-r15 ::= SEQUENCE {
+ otdoa-ReferenceCellInfo-r15 OTDOA-ReferenceCellInfo,
+ otdoa-NeighbourCellInfo-r15 OTDOA-NeighbourCellInfoList,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-UEB-TRP-LocationData-r16 ::= SEQUENCE {
+ nr-trp-LocationInfo-r16 NR-TRP-LocationInfo-r16,
+ nr-dl-prs-BeamInfo-r16 NR-DL-PRS-BeamInfo-r16 OPTIONAL, -- Need ON
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+NR-UEB-TRP-RTD-Info-r16 ::= SEQUENCE {
+ nr-rtd-Info-r16 NR-RTD-Info-r16,
+ ...
+}
+
+-- ASN1STOP
+-- ASN1START
+
+END
+
+-- ASN1STOP
diff --git a/sdr/COMMON/common_lib.h b/sdr/COMMON/common_lib.h
index b07c5f319f..71607cb27f 100644
--- a/sdr/COMMON/common_lib.h
+++ b/sdr/COMMON/common_lib.h
@@ -187,7 +187,11 @@ typedef struct {
int rx_num_channels;
//! number of TX channels (=TX antennas)
int tx_num_channels;
- //! \brief RX base addresses for mmapped_dma or direct access
+ //! rx daughter card
+ char* rx_subdev;
+ //! tx daughter card
+ char* tx_subdev;
+ //! \brief RX base addresses for mmapped_dma
int32_t *rxbase[4];
//! \brief RX buffer size for direct access
int rxsize;
diff --git a/sdr/USRP/USERSPACE/LIB/usrp_lib.cpp b/sdr/USRP/USERSPACE/LIB/usrp_lib.cpp
index f9cc4a111a..07892b977d 100644
--- a/sdr/USRP/USERSPACE/LIB/usrp_lib.cpp
+++ b/sdr/USRP/USERSPACE/LIB/usrp_lib.cpp
@@ -203,8 +203,9 @@ static int sync_to_gps(openair0_device *device) {
//Set to GPS time
uhd::time_spec_t gps_time = uhd::time_spec_t(time_t(s->usrp->get_mboard_sensor("gps_time", mboard).to_int()));
- //s->usrp->set_time_next_pps(gps_time+1.0, mboard);
- s->usrp->set_time_next_pps(uhd::time_spec_t(0.0));
+ s->usrp->set_time_next_pps(gps_time+1.0, mboard);
+ //s->usrp->set_time_next_pps(uhd::time_spec_t(0.0));
+
//Wait for it to apply
//The wait is 2 seconds because N-Series has a known issue where
//the time at the last PPS does not properly update at the PPS edge
@@ -215,10 +216,10 @@ static int sync_to_gps(openair0_device *device) {
uhd::time_spec_t time_last_pps = s->usrp->get_time_last_pps(mboard);
std::cout << "USRP time: " << (boost::format("%0.9f") % time_last_pps.get_real_secs()) << std::endl;
std::cout << "GPSDO time: " << (boost::format("%0.9f") % gps_time.get_real_secs()) << std::endl;
- //if (gps_time.get_real_secs() == time_last_pps.get_real_secs())
- // std::cout << std::endl << "SUCCESS: USRP time synchronized to GPS time" << std::endl << std::endl;
- //else
- // std::cerr << std::endl << "ERROR: Failed to synchronize USRP time to GPS time" << std::endl << std::endl;
+ if (gps_time.get_real_secs() == time_last_pps.get_real_secs())
+ std::cout << std::endl << "SUCCESS: USRP time synchronized to GPS time" << std::endl << std::endl;
+ else
+ std::cerr << std::endl << "ERROR: Failed to synchronize USRP time to GPS time" << std::endl << std::endl;
}
if (num_gps_locked == num_mboards and num_mboards > 1) {
@@ -295,15 +296,18 @@ static int trx_usrp_start(openair0_device *device) {
//s->first_rx = 1;
s->rx_timestamp = 0;
- s->usrp->set_time_next_pps(uhd::time_spec_t(0.0));
- // wait for the pps to change
- uhd::time_spec_t time_last_pps = s->usrp->get_time_last_pps();
- while (time_last_pps == s->usrp->get_time_last_pps()) {
+ //wait for next pps
+ uhd::time_spec_t last_pps = s->usrp->get_time_last_pps();
+ uhd::time_spec_t current_pps = s->usrp->get_time_last_pps();
+ while(current_pps == last_pps) {
boost::this_thread::sleep(boost::posix_time::milliseconds(1));
+ current_pps = s->usrp->get_time_last_pps();
}
+ LOG_I(HW,"current pps at %f, starting streaming at %f\n",current_pps.get_real_secs(),current_pps.get_real_secs()+1.0);
+
uhd::stream_cmd_t cmd(uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS);
- cmd.time_spec = uhd::time_spec_t(1.0);
+ cmd.time_spec = uhd::time_spec_t(current_pps+1.0);
cmd.stream_now = false; // start at constant delay
s->rx_stream->issue_stream_cmd(cmd);
@@ -440,7 +444,14 @@ static int trx_usrp_write(openair0_device *device,
for (int j=0; jusrp->get_clock_source(0) == "external") {
- if (check_ref_locked(s,0)) {
- LOG_I(HW,"USRP locked to external reference!\n");
- } else {
- LOG_I(HW,"Failed to lock to external reference. Exiting.\n");
- exit(EXIT_FAILURE);
+ } else {
+ s->usrp->set_time_next_pps(uhd::time_spec_t(0.0));
+
+ if (s->usrp->get_clock_source(0) == "external") {
+ if (check_ref_locked(s,0)) {
+ LOG_I(HW,"USRP locked to external reference!\n");
+ } else {
+ LOG_I(HW,"Failed to lock to external reference. Exiting.\n");
+ exit(EXIT_FAILURE);
+ }
}
}
@@ -1198,6 +1221,12 @@ extern "C" {
LOG_I(HW,"%s() sample_rate:%u\n", __FUNCTION__, (int)openair0_cfg[0].sample_rate);
switch ((int)openair0_cfg[0].sample_rate) {
+ case 184320000:
+ // from usrp_time_offset
+ //openair0_cfg[0].samples_per_packet = 2048;
+ openair0_cfg[0].tx_sample_advance = 15; //to be checked
+ break;
+
case 122880000:
// from usrp_time_offset
//openair0_cfg[0].samples_per_packet = 2048;
@@ -1210,8 +1239,8 @@ extern "C" {
// from usrp_time_offset
//openair0_cfg[0].samples_per_packet = 2048;
openair0_cfg[0].tx_sample_advance = 15; //to be checked
- openair0_cfg[0].tx_bw = 80e6;
- openair0_cfg[0].rx_bw = 80e6;
+ //openair0_cfg[0].tx_bw = 80e6;
+ //openair0_cfg[0].rx_bw = 80e6;
break;
case 61440000:
@@ -1237,6 +1266,13 @@ extern "C" {
openair0_cfg[0].rx_bw = 20e6;
break;
+ case 23040000:
+ //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;
+ break;
+
case 15360000:
//openair0_cfg[0].samples_per_packet = 2048;
openair0_cfg[0].tx_sample_advance = 45;
@@ -1338,6 +1374,18 @@ extern "C" {
openair0_cfg[0].iq_txshift = 4;//shift
openair0_cfg[0].iq_rxrescale = 15;//rescale iqs
+ if(openair0_cfg[0].tx_subdev!=NULL){
+ LOG_I(HW, "openair0_cfg[0].tx_subdev == %s\n", openair0_cfg[0].tx_subdev);
+ tx_subdev = openair0_cfg[0].tx_subdev;
+ s->usrp->set_tx_subdev_spec(tx_subdev);
+ }
+
+ if(openair0_cfg[0].rx_subdev!=NULL){
+ LOG_I(HW, "openair0_cfg[0].rx_subdev == %s\n", openair0_cfg[0].rx_subdev);
+ rx_subdev = openair0_cfg[0].rx_subdev;
+ s->usrp->set_rx_subdev_spec(rx_subdev);
+ }
+
for(int i=0; i<((int) s->usrp->get_rx_num_channels()); i++) {
if (iusrp->set_rx_rate(openair0_cfg[0].sample_rate,i+choffset);
@@ -1383,7 +1431,7 @@ extern "C" {
LOG_I(HW,"Actual master clock: %fMHz...\n",s->usrp->get_master_clock_rate()/1e6);
LOG_I(HW,"Actual clock source %s...\n",s->usrp->get_clock_source(0).c_str());
LOG_I(HW,"Actual time source %s...\n",s->usrp->get_time_source(0).c_str());
- sleep(1);
+
// create tx & rx streamer
uhd::stream_args_t stream_args_rx("sc16", "sc16");
int samples=openair0_cfg[0].sample_rate;
@@ -1437,6 +1485,7 @@ extern "C" {
LOG_I(HW," Actual TX packet size: %lu\n",s->tx_stream->get_max_num_samps());
}
+ std::cout << boost::format("Using Device: %s") % s->usrp->get_pp_string() << std::endl;
LOG_I(HW,"Device timestamp: %f...\n", s->usrp->get_time_now().get_real_secs());
device->trx_write_func = trx_usrp_write;
device->trx_read_func = trx_usrp_read;
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb0.sa.band261.fr2.64PRB.prs.usrpx310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb0.sa.band261.fr2.64PRB.prs.usrpx310.conf
new file mode 100644
index 0000000000..4303f56270
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb0.sa.band261.fr2.64PRB.prs.usrpx310.conf
@@ -0,0 +1,290 @@
+Active_gNBs = ( "gNB-Eurecom-5GNRBox");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+gNBs =
+(
+ {
+ ////////// Identification parameters:
+ gNB_ID = 0xe00;
+
+ cell_type = "CELL_MACRO_GNB";
+
+ gNB_name = "gNB-Eurecom-5GNRBox";
+
+ // Tracking area code, 0x0000 and 0xfffe are reserved values
+ tracking_area_code = 1;
+
+ plmn_list = ({mcc = 311; mnc = 480; mnc_length = 3;});
+
+ tr_s_preference = "local_mac"
+
+ ////////// Physical parameters:
+
+ min_rxtxtime = 6;
+
+ servingCellConfigCommon = (
+ {
+# spCellConfigCommon
+
+ physCellId = 0;
+
+# downlinkConfigCommon
+ #frequencyInfoDL
+ # this is pointA + 23 PRBs@120kHz SCS (same as initial BWP)
+ absoluteFrequencySSB = 2071241;
+ dl_frequencyBand = 261;
+ # this is 27.900 GHz
+ dl_absoluteFrequencyPointA = 2070833;
+ #scs-SpecificCarrierList
+ dl_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_subcarrierSpacing = 3;
+ dl_carrierBandwidth = 64;
+ #initialDownlinkBWP
+ #genericParameters
+ # this is RBstart=0,L=32 (275*(L-1))+RBstart
+ initialDLBWPlocationAndBandwidth = 8525;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialDLBWPsubcarrierSpacing = 3;
+ #pdcch-ConfigCommon
+ initialDLBWPcontrolResourceSetZero = 12;
+ initialDLBWPsearchSpaceZero = 0;
+
+ #uplinkConfigCommon
+ #frequencyInfoUL
+ ul_frequencyBand = 261;
+ #scs-SpecificCarrierList
+ ul_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_subcarrierSpacing = 3;
+ ul_carrierBandwidth = 64;
+ pMax = 20;
+ #initialUplinkBWP
+ #genericParameters
+ initialULBWPlocationAndBandwidth = 8525;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialULBWPsubcarrierSpacing = 3;
+ #rach-ConfigCommon
+ #rach-ConfigGeneric
+ prach_ConfigurationIndex = 52;
+#prach_msg1_FDM
+#0 = one, 1=two, 2=four, 3=eight
+ prach_msg1_FDM = 0;
+ prach_msg1_FrequencyStart = 0;
+ zeroCorrelationZoneConfig = 13;
+ preambleReceivedTargetPower = -118;
+#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
+ preambleTransMax = 6;
+#powerRampingStep
+# 0=dB0,1=dB2,2=dB4,3=dB6
+ powerRampingStep = 1;
+#ra_ReponseWindow
+#1,2,4,8,10,20,40,80
+ ra_ResponseWindow = 7;
+#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
+#0=oneeighth,1=onefourth,2=half,3=one,4=two,5=four,6=eight,7=sixteen ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
+#oneHalf (0..15) 4,8,12,16,...60,64
+ ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 7;
+#ra_ContentionResolutionTimer
+#(0..7) 8,16,24,32,40,48,56,64
+ ra_ContentionResolutionTimer = 7;
+ rsrp_ThresholdSSB = 19;
+#prach-RootSequenceIndex_PR
+#1 = 839, 2 = 139
+ prach_RootSequenceIndex_PR = 2;
+ prach_RootSequenceIndex = 1;
+ # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
+ #
+ msg1_SubcarrierSpacing = 3,
+
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+ restrictedSetConfig = 0,
+
+ msg3_DeltaPreamble = 1;
+ p0_NominalWithGrant =-90;
+
+# pucch-ConfigCommon setup :
+# pucchGroupHopping
+# 0 = neither, 1= group hopping, 2=sequence hopping
+ pucchGroupHopping = 0;
+ hoppingId = 40;
+ p0_nominal = -90;
+# ssb_PositionsInBurs_BitmapPR
+# 1=short, 2=medium, 3=long
+ ssb_PositionsInBurst_PR = 3;
+ ssb_PositionsInBurst_Bitmap = 0x0001000100010001L;
+
+# ssb_periodicityServingCell
+# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
+ ssb_periodicityServingCell = 1;
+
+# dmrs_TypeA_position
+# 0 = pos2, 1 = pos3
+ dmrs_TypeA_Position = 0;
+
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ subcarrierSpacing = 3;
+
+
+ #tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ referenceSubcarrierSpacing = 3;
+ # pattern1
+ # dl_UL_TransmissionPeriodicity
+ # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
+ dl_UL_TransmissionPeriodicity = 3;
+ nrofDownlinkSlots = 7;
+ nrofDownlinkSymbols = 6;
+ nrofUplinkSlots = 2;
+ nrofUplinkSymbols = 4;
+
+ ssPBCH_BlockPower = 10;
+ }
+
+ );
+
+
+ # ------- 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.18.99";
+ ipv6 = "192:168:30::17";
+ active = "yes";
+ preference = "ipv4";
+ }
+ );
+
+ ///X2
+ enable_x2 = "no";
+ t_reloc_prep = 1000; /* unit: millisecond */
+ tx2_reloc_overall = 2000; /* unit: millisecond */
+ t_dc_prep = 1000; /* unit: millisecond */
+ t_dc_overall = 2000; /* unit: millisecond */
+ target_enb_x2_ip_address = (
+ { ipv4 = "192.168.18.199";
+ ipv6 = "192:168:30::17";
+ preference = "ipv4";
+ }
+ );
+
+ NETWORK_INTERFACES :
+ {
+
+ GNB_INTERFACE_NAME_FOR_S1_MME = "eth0";
+ GNB_IPV4_ADDRESS_FOR_S1_MME = "192.168.18.198/24";
+ GNB_INTERFACE_NAME_FOR_S1U = "eth0";
+ GNB_IPV4_ADDRESS_FOR_S1U = "192.168.18.198/24";
+ GNB_PORT_FOR_S1U = 2152; # Spec 2152
+ GNB_IPV4_ADDRESS_FOR_X2C = "192.168.18.198/24";
+ GNB_PORT_FOR_X2C = 36422; # Spec 36422
+ };
+ }
+);
+
+MACRLCs = (
+{
+ num_cc = 1;
+ tr_s_preference = "local_L1";
+ tr_n_preference = "local_RRC";
+ pusch_TargetSNRx10 = 200;
+ pucch_TargetSNRx10 = 200;
+}
+);
+
+prs_config = (
+{
+ NumPRSResources = 8;
+ PRSResourceSetPeriod = [80, 2];
+ SymbolStart = [8,8,8,8,8,8,8,8];
+ NumPRSSymbols = [6,6,6,6,6,6,6,6];
+ NumRB = 64;
+ RBOffset = 0;
+ CombSize = 4;
+ REOffset = [0,0,0,0,0,0,0,0];
+ PRSResourceOffset = [0,10,20,30,40,50,60,70];
+ PRSResourceRepetition = 1;
+ PRSResourceTimeGap = 1;
+ NPRS_ID = [0,1,2,3,4,5,6,7];
+ MutingPattern1 = [];
+ MutingPattern2 = [];
+ MutingBitRepetition = 1;
+}
+);
+
+L1s = (
+{
+ num_cc = 1;
+ tr_n_preference = "local_mac";
+ ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
+}
+);
+
+RUs = (
+{
+ local_rf = "yes"
+ nb_tx = 1;
+ nb_rx = 1;
+ att_tx = 0;
+ att_rx = 0;
+ bands = [7];
+ sl_ahead = 12;
+ max_pdschReferenceSignalPower = -27;
+ max_rxgain = 75;
+ eNB_instances = [0];
+ sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2,clock_source=gpsdo,time_source=gpsdo";
+ if_freq = 50000000L;
+}
+);
+
+THREAD_STRUCT = (
+{
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+}
+);
+
+security = {
+ # preferred ciphering algorithms
+ # the first one of the list that an UE supports in chosen
+ # valid values: nea0, nea1, nea2, nea3
+ ciphering_algorithms = ( "nea0" );
+
+ # preferred integrity algorithms
+ # the first one of the list that an UE supports in chosen
+ # valid values: nia0, nia1, nia2, nia3
+ integrity_algorithms = ( "nia2", "nia0" );
+
+ # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
+ # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
+ drb_ciphering = "yes";
+ drb_integrity = "no";
+};
+
+log_config :
+{
+ global_log_level ="info";
+ hw_log_level ="info";
+ phy_log_level ="info";
+ mac_log_level ="info";
+ rlc_log_level ="info";
+ pdcp_log_level ="info";
+ rrc_log_level ="info";
+};
+
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb0.sa.band78.fr1.106PRB.prs.usrpx310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb0.sa.band78.fr1.106PRB.prs.usrpx310.conf
new file mode 100644
index 0000000000..129056d191
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb0.sa.band78.fr1.106PRB.prs.usrpx310.conf
@@ -0,0 +1,334 @@
+Active_gNBs = ( "gNB-OAI");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+gNBs =
+(
+ {
+ ////////// Identification parameters:
+ gNB_CU_ID = 0xe00;
+
+# cell_type = "CELL_MACRO_GNB";
+
+ gNB_name = "gNB-OAI";
+
+ // Tracking area code, 0x0000 and 0xfffe are reserved values
+ tracking_area_code = 1;
+
+ plmn_list = ({
+ mcc = 208;
+ mnc = 97;
+ mnc_length = 2;
+ snssaiList = (
+ {
+ sst = 1;
+ sd = 0x010203; // 0 false, else true
+ },
+ {
+ sst = 1;
+ sd = 0x112233; // 0 false, else true
+ }
+ );
+ });
+
+ nr_cellid = 12345678L
+
+# tr_s_preference = "local_mac"
+
+ ////////// Physical parameters:
+
+ #pusch_TargetSNRx10 = 200;
+ #pucch_TargetSNRx10 = 200;
+ ul_prbblacklist = "51,52,53,54"
+ min_rxtxtime = 6;
+ do_SRS = 0;
+
+ pdcch_ConfigSIB1 = (
+ {
+ controlResourceSetZero = 11;
+ searchSpaceZero = 0;
+ }
+ );
+
+ servingCellConfigCommon = (
+ {
+ #spCellConfigCommon
+
+ physCellId = 0;
+
+# downlinkConfigCommon
+ #frequencyInfoDL
+ # this is 3301.68 MHz + 22*12*30e-3 MHz = 3309.6
+ #absoluteFrequencySSB = 620640;
+ # this is 3300.60 MHz + 53*12*30e-3 MHz = 3319.68
+ absoluteFrequencySSB = 621312;
+ # this is 3503.28 MHz + 22*12*30e-3 MHz = 3511.2
+ #absoluteFrequencySSB = 634080;
+ # this is 3600.48 MHz
+ #absoluteFrequencySSB = 640032;
+ #dl_frequencyBand = 78;
+ # this is 3301.68 MHz
+ #dl_absoluteFrequencyPointA = 620112;
+ # this is 3300.60 MHz
+ dl_absoluteFrequencyPointA = 620040;
+ # this is 3502.56 MHz
+ #dl_absoluteFrequencyPointA = 633552;
+ # this is 3600.48 MHz
+ #dl_absoluteFrequencyPointA = 640032;
+ #scs-SpecificCarrierList
+ dl_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_subcarrierSpacing = 1;
+ dl_carrierBandwidth = 106;
+ #initialDownlinkBWP
+ #genericParameters
+ # this is RBstart=0,L=106 (275*(L-1))+RBstart
+ initialDLBWPlocationAndBandwidth = 28875;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialDLBWPsubcarrierSpacing = 1;
+ #pdcch-ConfigCommon
+ initialDLBWPcontrolResourceSetZero = 11;
+ initialDLBWPsearchSpaceZero = 0;
+
+
+
+#uplinkConfigCommon
+ #frequencyInfoUL
+ ul_frequencyBand = 78;
+ #scs-SpecificCarrierList
+ ul_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_subcarrierSpacing = 1;
+ ul_carrierBandwidth = 106;
+ pMax = 20;
+ #initialUplinkBWP
+ #genericParameters
+ initialULBWPlocationAndBandwidth = 28875;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialULBWPsubcarrierSpacing = 1;
+ #rach-ConfigCommon
+ #rach-ConfigGeneric
+ prach_ConfigurationIndex = 98;
+#prach_msg1_FDM
+#0 = one, 1=two, 2=four, 3=eight
+ prach_msg1_FDM = 0;
+ prach_msg1_FrequencyStart = 0;
+ zeroCorrelationZoneConfig = 12;
+ preambleReceivedTargetPower = -104;
+#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
+ preambleTransMax = 6;
+#powerRampingStep
+# 0=dB0,1=dB2,2=dB4,3=dB6
+ powerRampingStep = 1;
+#ra_ReponseWindow
+#1,2,4,8,10,20,40,80
+ ra_ResponseWindow = 4;
+#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
+#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+ ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3;
+#oneHalf (0..15) 4,8,12,16,...60,64
+ ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
+#ra_ContentionResolutionTimer
+#(0..7) 8,16,24,32,40,48,56,64
+ ra_ContentionResolutionTimer = 7;
+ rsrp_ThresholdSSB = 19;
+#prach-RootSequenceIndex_PR
+#1 = 839, 2 = 139
+ prach_RootSequenceIndex_PR = 2;
+ prach_RootSequenceIndex = 1;
+ # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
+ #
+ msg1_SubcarrierSpacing = 1,
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+ restrictedSetConfig = 0,
+
+ msg3_DeltaPreamble = 1;
+ p0_NominalWithGrant =-90;
+
+# pucch-ConfigCommon setup :
+# pucchGroupHopping
+# 0 = neither, 1= group hopping, 2=sequence hopping
+ pucchGroupHopping = 0;
+ hoppingId = 40;
+ p0_nominal = -90;
+# ssb_PositionsInBurs_BitmapPR
+# 1=short, 2=medium, 3=long
+ ssb_PositionsInBurst_PR = 2;
+ ssb_PositionsInBurst_Bitmap = 1;
+
+# ssb_periodicityServingCell
+# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spar e1
+ ssb_periodicityServingCell = 2;
+
+# dmrs_TypeA_position
+# 0 = pos2, 1 = pos3
+ dmrs_TypeA_Position = 0;
+
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ subcarrierSpacing = 1;
+
+
+#tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ referenceSubcarrierSpacing = 1;
+ # pattern1
+ # dl_UL_TransmissionPeriodicity
+ # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
+ dl_UL_TransmissionPeriodicity = 6;
+ nrofDownlinkSlots = 7;
+ nrofDownlinkSymbols = 6;
+ nrofUplinkSlots = 2;
+ nrofUplinkSymbols = 4;
+
+ ssPBCH_BlockPower = -25;
+ }
+
+ );
+
+
+ # ------- SCTP definitions
+ SCTP :
+ {
+ # Number of streams to use in input/output
+ SCTP_INSTREAMS = 2;
+ SCTP_OUTSTREAMS = 2;
+ };
+
+ ////////// AMF parameters:
+ amf_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
+ ipv6 = "192:168:30::17";
+ active = "yes";
+ preference = "ipv4";
+ }
+ );
+
+ NETWORK_INTERFACES :
+ {
+
+ GNB_INTERFACE_NAME_FOR_NG_AMF = "em1";
+ GNB_IPV4_ADDRESS_FOR_NG_AMF = "CI_GNB_IP_ADDR";
+ GNB_INTERFACE_NAME_FOR_NGU = "em1";
+ GNB_IPV4_ADDRESS_FOR_NGU = "CI_GNB_IP_ADDR";
+ GNB_PORT_FOR_S1U = 2152; # Spec 2152
+ };
+
+ }
+);
+
+MACRLCs = (
+{
+ num_cc = 1;
+ tr_s_preference = "local_L1";
+ tr_n_preference = "local_RRC";
+ pusch_TargetSNRx10 = 200;
+ pucch_TargetSNRx10 = 200;
+ ulsch_max_frame_inactivity = 1;
+}
+);
+
+prs_config = (
+{
+ NumPRSResources = 1;
+ PRSResourceSetPeriod = [20, 2];
+ SymbolStart = [7];
+ NumPRSSymbols = [6];
+ NumRB = 106;
+ RBOffset = 0;
+ CombSize = 4;
+ REOffset = [0];
+ PRSResourceOffset = [0];
+ PRSResourceRepetition = 1;
+ PRSResourceTimeGap = 1;
+ NPRS_ID = [0];
+ MutingPattern1 = [];
+ MutingPattern2 = [];
+ MutingBitRepetition = 1;
+}
+);
+
+L1s = (
+{
+ num_cc = 1;
+ tr_n_preference = "local_mac";
+ prach_dtx_threshold = 120;
+ #pucch0_dtx_threshold = 150;
+}
+);
+
+RUs = (
+{
+ local_rf = "yes"
+ nb_tx = 1
+ nb_rx = 1
+ att_tx = 0
+ att_rx = 0;
+ bands = [78];
+ max_pdschReferenceSignalPower = -27;
+ max_rxgain = 75;
+ eNB_instances = [0];
+ ##beamforming 1x2 matrix: 1 layer x 2 antennas
+ bf_weights = [0x00007fff, 0x0000];
+ ##beamforming 1x4 matrix: 1 layer x 4 antennas
+ #bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
+ ## beamforming 2x2 matrix:
+ # bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
+ ## beamforming 4x4 matrix:
+ #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
+ sf_extension = 0
+ sdr_addrs = "mgmt_addr=172.21.19.14,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
+}
+);
+
+THREAD_STRUCT = (
+{
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_SINGLE_THREAD";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+}
+);
+
+rfsimulator :
+{
+ serveraddr = "server";
+ serverport = "4043";
+ options = (); #("saviq"); or/and "chanmod"
+ modelname = "AWGN";
+ IQfile = "/tmp/rfsimulator.iqs";
+};
+
+security = {
+ # preferred ciphering algorithms
+ # the first one of the list that an UE supports in chosen
+ # valid values: nea0, nea1, nea2, nea3
+ ciphering_algorithms = ( "nea0" );
+
+ # preferred integrity algorithms
+ # the first one of the list that an UE supports in chosen
+ # valid values: nia0, nia1, nia2, nia3
+ integrity_algorithms = ( "nia2", "nia0" );
+
+ # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
+ # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
+ drb_ciphering = "yes";
+ drb_integrity = "no";
+};
+
+log_config :
+{
+ global_log_level ="info";
+ hw_log_level ="info";
+ phy_log_level ="info";
+ mac_log_level ="info";
+ rlc_log_level ="info";
+ pdcp_log_level ="info";
+ rrc_log_level ="info";
+ f1ap_log_level ="debug";
+};
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb1.sa.band261.fr2.64PRB.prs.usrpx310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb1.sa.band261.fr2.64PRB.prs.usrpx310.conf
new file mode 100644
index 0000000000..e76367686b
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb1.sa.band261.fr2.64PRB.prs.usrpx310.conf
@@ -0,0 +1,290 @@
+Active_gNBs = ( "gNB-Eurecom-5GNRBox");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+gNBs =
+(
+ {
+ ////////// Identification parameters:
+ gNB_ID = 0xe00;
+
+ cell_type = "CELL_MACRO_GNB";
+
+ gNB_name = "gNB-Eurecom-5GNRBox";
+
+ // Tracking area code, 0x0000 and 0xfffe are reserved values
+ tracking_area_code = 1;
+
+ plmn_list = ({mcc = 311; mnc = 480; mnc_length = 3;});
+
+ tr_s_preference = "local_mac"
+
+ ////////// Physical parameters:
+
+ min_rxtxtime = 6;
+
+ servingCellConfigCommon = (
+ {
+# spCellConfigCommon
+
+ physCellId = 0;
+
+# downlinkConfigCommon
+ #frequencyInfoDL
+ # this is pointA + 23 PRBs@120kHz SCS (same as initial BWP)
+ absoluteFrequencySSB = 2071241;
+ dl_frequencyBand = 261;
+ # this is 27.900 GHz
+ dl_absoluteFrequencyPointA = 2070833;
+ #scs-SpecificCarrierList
+ dl_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_subcarrierSpacing = 3;
+ dl_carrierBandwidth = 64;
+ #initialDownlinkBWP
+ #genericParameters
+ # this is RBstart=0,L=32 (275*(L-1))+RBstart
+ initialDLBWPlocationAndBandwidth = 8525;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialDLBWPsubcarrierSpacing = 3;
+ #pdcch-ConfigCommon
+ initialDLBWPcontrolResourceSetZero = 12;
+ initialDLBWPsearchSpaceZero = 0;
+
+ #uplinkConfigCommon
+ #frequencyInfoUL
+ ul_frequencyBand = 261;
+ #scs-SpecificCarrierList
+ ul_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_subcarrierSpacing = 3;
+ ul_carrierBandwidth = 64;
+ pMax = 20;
+ #initialUplinkBWP
+ #genericParameters
+ initialULBWPlocationAndBandwidth = 8525;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialULBWPsubcarrierSpacing = 3;
+ #rach-ConfigCommon
+ #rach-ConfigGeneric
+ prach_ConfigurationIndex = 52;
+#prach_msg1_FDM
+#0 = one, 1=two, 2=four, 3=eight
+ prach_msg1_FDM = 0;
+ prach_msg1_FrequencyStart = 0;
+ zeroCorrelationZoneConfig = 13;
+ preambleReceivedTargetPower = -118;
+#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
+ preambleTransMax = 6;
+#powerRampingStep
+# 0=dB0,1=dB2,2=dB4,3=dB6
+ powerRampingStep = 1;
+#ra_ReponseWindow
+#1,2,4,8,10,20,40,80
+ ra_ResponseWindow = 7;
+#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
+#0=oneeighth,1=onefourth,2=half,3=one,4=two,5=four,6=eight,7=sixteen ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
+#oneHalf (0..15) 4,8,12,16,...60,64
+ ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 7;
+#ra_ContentionResolutionTimer
+#(0..7) 8,16,24,32,40,48,56,64
+ ra_ContentionResolutionTimer = 7;
+ rsrp_ThresholdSSB = 19;
+#prach-RootSequenceIndex_PR
+#1 = 839, 2 = 139
+ prach_RootSequenceIndex_PR = 2;
+ prach_RootSequenceIndex = 1;
+ # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
+ #
+ msg1_SubcarrierSpacing = 3,
+
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+ restrictedSetConfig = 0,
+
+ msg3_DeltaPreamble = 1;
+ p0_NominalWithGrant =-90;
+
+# pucch-ConfigCommon setup :
+# pucchGroupHopping
+# 0 = neither, 1= group hopping, 2=sequence hopping
+ pucchGroupHopping = 0;
+ hoppingId = 40;
+ p0_nominal = -90;
+# ssb_PositionsInBurs_BitmapPR
+# 1=short, 2=medium, 3=long
+ ssb_PositionsInBurst_PR = 3;
+ ssb_PositionsInBurst_Bitmap = 0x0002000200020002L;
+
+# ssb_periodicityServingCell
+# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
+ ssb_periodicityServingCell = 1;
+
+# dmrs_TypeA_position
+# 0 = pos2, 1 = pos3
+ dmrs_TypeA_Position = 0;
+
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ subcarrierSpacing = 3;
+
+
+ #tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ referenceSubcarrierSpacing = 3;
+ # pattern1
+ # dl_UL_TransmissionPeriodicity
+ # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
+ dl_UL_TransmissionPeriodicity = 3;
+ nrofDownlinkSlots = 7;
+ nrofDownlinkSymbols = 6;
+ nrofUplinkSlots = 2;
+ nrofUplinkSymbols = 4;
+
+ ssPBCH_BlockPower = 10;
+ }
+
+ );
+
+
+ # ------- 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.18.99";
+ ipv6 = "192:168:30::17";
+ active = "yes";
+ preference = "ipv4";
+ }
+ );
+
+ ///X2
+ enable_x2 = "no";
+ t_reloc_prep = 1000; /* unit: millisecond */
+ tx2_reloc_overall = 2000; /* unit: millisecond */
+ t_dc_prep = 1000; /* unit: millisecond */
+ t_dc_overall = 2000; /* unit: millisecond */
+ target_enb_x2_ip_address = (
+ { ipv4 = "192.168.18.199";
+ ipv6 = "192:168:30::17";
+ preference = "ipv4";
+ }
+ );
+
+ NETWORK_INTERFACES :
+ {
+
+ GNB_INTERFACE_NAME_FOR_S1_MME = "eth0";
+ GNB_IPV4_ADDRESS_FOR_S1_MME = "192.168.18.198/24";
+ GNB_INTERFACE_NAME_FOR_S1U = "eth0";
+ GNB_IPV4_ADDRESS_FOR_S1U = "192.168.18.198/24";
+ GNB_PORT_FOR_S1U = 2152; # Spec 2152
+ GNB_IPV4_ADDRESS_FOR_X2C = "192.168.18.198/24";
+ GNB_PORT_FOR_X2C = 36422; # Spec 36422
+ };
+ }
+);
+
+MACRLCs = (
+{
+ num_cc = 1;
+ tr_s_preference = "local_L1";
+ tr_n_preference = "local_RRC";
+ pusch_TargetSNRx10 = 200;
+ pucch_TargetSNRx10 = 200;
+}
+);
+
+prs_config = (
+{
+ NumPRSResources = 8;
+ PRSResourceSetPeriod = [80, 2];
+ SymbolStart = [8,8,8,8,8,8,8,8];
+ NumPRSSymbols = [6,6,6,6,6,6,6,6];
+ NumRB = 64;
+ RBOffset = 0;
+ CombSize = 4;
+ REOffset = [1,1,1,1,1,1,1,1];
+ PRSResourceOffset = [0,10,20,30,40,50,60,70];
+ PRSResourceRepetition = 1;
+ PRSResourceTimeGap = 1;
+ NPRS_ID = [10,11,12,13,14,15,16,17];
+ MutingPattern1 = [];
+ MutingPattern2 = [];
+ MutingBitRepetition = 1;
+}
+);
+
+L1s = (
+{
+ num_cc = 1;
+ tr_n_preference = "local_mac";
+ ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
+}
+);
+
+RUs = (
+{
+ local_rf = "yes"
+ nb_tx = 1;
+ nb_rx = 1;
+ att_tx = 0;
+ att_rx = 0;
+ bands = [7];
+ sl_ahead = 12;
+ max_pdschReferenceSignalPower = -27;
+ max_rxgain = 75;
+ eNB_instances = [0];
+ sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2,clock_source=gpsdo,time_source=gpsdo";
+ if_freq = 50000000L;
+}
+);
+
+THREAD_STRUCT = (
+{
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+}
+);
+
+security = {
+ # preferred ciphering algorithms
+ # the first one of the list that an UE supports in chosen
+ # valid values: nea0, nea1, nea2, nea3
+ ciphering_algorithms = ( "nea0" );
+
+ # preferred integrity algorithms
+ # the first one of the list that an UE supports in chosen
+ # valid values: nia0, nia1, nia2, nia3
+ integrity_algorithms = ( "nia2", "nia0" );
+
+ # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
+ # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
+ drb_ciphering = "yes";
+ drb_integrity = "no";
+};
+
+log_config :
+{
+ global_log_level ="info";
+ hw_log_level ="info";
+ phy_log_level ="info";
+ mac_log_level ="info";
+ rlc_log_level ="info";
+ pdcp_log_level ="info";
+ rrc_log_level ="info";
+};
+
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb1.sa.band78.fr1.106PRB.prs.usrpx310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb1.sa.band78.fr1.106PRB.prs.usrpx310.conf
new file mode 100644
index 0000000000..025a3bfe66
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb1.sa.band78.fr1.106PRB.prs.usrpx310.conf
@@ -0,0 +1,334 @@
+Active_gNBs = ( "gNB-OAI");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+gNBs =
+(
+ {
+ ////////// Identification parameters:
+ gNB_CU_ID = 0xe00;
+
+# cell_type = "CELL_MACRO_GNB";
+
+ gNB_name = "gNB-OAI";
+
+ // Tracking area code, 0x0000 and 0xfffe are reserved values
+ tracking_area_code = 1;
+
+ plmn_list = ({
+ mcc = 208;
+ mnc = 97;
+ mnc_length = 2;
+ snssaiList = (
+ {
+ sst = 1;
+ sd = 0x010203; // 0 false, else true
+ },
+ {
+ sst = 1;
+ sd = 0x112233; // 0 false, else true
+ }
+ );
+ });
+
+ nr_cellid = 12345678L
+
+# tr_s_preference = "local_mac"
+
+ ////////// Physical parameters:
+
+ #pusch_TargetSNRx10 = 200;
+ #pucch_TargetSNRx10 = 200;
+ ul_prbblacklist = "51,52,53,54"
+ min_rxtxtime = 6;
+ do_SRS = 0;
+
+ pdcch_ConfigSIB1 = (
+ {
+ controlResourceSetZero = 11;
+ searchSpaceZero = 0;
+ }
+ );
+
+ servingCellConfigCommon = (
+ {
+ #spCellConfigCommon
+
+ physCellId = 0;
+
+# downlinkConfigCommon
+ #frequencyInfoDL
+ # this is 3301.68 MHz + 22*12*30e-3 MHz = 3309.6
+ #absoluteFrequencySSB = 620640;
+ # this is 3300.60 MHz + 53*12*30e-3 MHz = 3319.68
+ absoluteFrequencySSB = 621312;
+ # this is 3503.28 MHz + 22*12*30e-3 MHz = 3511.2
+ #absoluteFrequencySSB = 634080;
+ # this is 3600.48 MHz
+ #absoluteFrequencySSB = 640032;
+ #dl_frequencyBand = 78;
+ # this is 3301.68 MHz
+ #dl_absoluteFrequencyPointA = 620112;
+ # this is 3300.60 MHz
+ dl_absoluteFrequencyPointA = 620040;
+ # this is 3502.56 MHz
+ #dl_absoluteFrequencyPointA = 633552;
+ # this is 3600.48 MHz
+ #dl_absoluteFrequencyPointA = 640032;
+ #scs-SpecificCarrierList
+ dl_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_subcarrierSpacing = 1;
+ dl_carrierBandwidth = 106;
+ #initialDownlinkBWP
+ #genericParameters
+ # this is RBstart=0,L=106 (275*(L-1))+RBstart
+ initialDLBWPlocationAndBandwidth = 28875;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialDLBWPsubcarrierSpacing = 1;
+ #pdcch-ConfigCommon
+ initialDLBWPcontrolResourceSetZero = 11;
+ initialDLBWPsearchSpaceZero = 0;
+
+
+
+#uplinkConfigCommon
+ #frequencyInfoUL
+ ul_frequencyBand = 78;
+ #scs-SpecificCarrierList
+ ul_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_subcarrierSpacing = 1;
+ ul_carrierBandwidth = 106;
+ pMax = 20;
+ #initialUplinkBWP
+ #genericParameters
+ initialULBWPlocationAndBandwidth = 28875;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialULBWPsubcarrierSpacing = 1;
+ #rach-ConfigCommon
+ #rach-ConfigGeneric
+ prach_ConfigurationIndex = 98;
+#prach_msg1_FDM
+#0 = one, 1=two, 2=four, 3=eight
+ prach_msg1_FDM = 0;
+ prach_msg1_FrequencyStart = 0;
+ zeroCorrelationZoneConfig = 12;
+ preambleReceivedTargetPower = -104;
+#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
+ preambleTransMax = 6;
+#powerRampingStep
+# 0=dB0,1=dB2,2=dB4,3=dB6
+ powerRampingStep = 1;
+#ra_ReponseWindow
+#1,2,4,8,10,20,40,80
+ ra_ResponseWindow = 4;
+#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
+#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+ ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3;
+#oneHalf (0..15) 4,8,12,16,...60,64
+ ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
+#ra_ContentionResolutionTimer
+#(0..7) 8,16,24,32,40,48,56,64
+ ra_ContentionResolutionTimer = 7;
+ rsrp_ThresholdSSB = 19;
+#prach-RootSequenceIndex_PR
+#1 = 839, 2 = 139
+ prach_RootSequenceIndex_PR = 2;
+ prach_RootSequenceIndex = 1;
+ # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
+ #
+ msg1_SubcarrierSpacing = 1,
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+ restrictedSetConfig = 0,
+
+ msg3_DeltaPreamble = 1;
+ p0_NominalWithGrant =-90;
+
+# pucch-ConfigCommon setup :
+# pucchGroupHopping
+# 0 = neither, 1= group hopping, 2=sequence hopping
+ pucchGroupHopping = 0;
+ hoppingId = 40;
+ p0_nominal = -90;
+# ssb_PositionsInBurs_BitmapPR
+# 1=short, 2=medium, 3=long
+ ssb_PositionsInBurst_PR = 2;
+ ssb_PositionsInBurst_Bitmap = 2;
+
+# ssb_periodicityServingCell
+# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spar e1
+ ssb_periodicityServingCell = 2;
+
+# dmrs_TypeA_position
+# 0 = pos2, 1 = pos3
+ dmrs_TypeA_Position = 0;
+
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ subcarrierSpacing = 1;
+
+
+#tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ referenceSubcarrierSpacing = 1;
+ # pattern1
+ # dl_UL_TransmissionPeriodicity
+ # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
+ dl_UL_TransmissionPeriodicity = 6;
+ nrofDownlinkSlots = 7;
+ nrofDownlinkSymbols = 6;
+ nrofUplinkSlots = 2;
+ nrofUplinkSymbols = 4;
+
+ ssPBCH_BlockPower = -25;
+ }
+
+ );
+
+
+ # ------- SCTP definitions
+ SCTP :
+ {
+ # Number of streams to use in input/output
+ SCTP_INSTREAMS = 2;
+ SCTP_OUTSTREAMS = 2;
+ };
+
+ ////////// AMF parameters:
+ amf_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
+ ipv6 = "192:168:30::17";
+ active = "yes";
+ preference = "ipv4";
+ }
+ );
+
+ NETWORK_INTERFACES :
+ {
+
+ GNB_INTERFACE_NAME_FOR_NG_AMF = "em1";
+ GNB_IPV4_ADDRESS_FOR_NG_AMF = "CI_GNB_IP_ADDR";
+ GNB_INTERFACE_NAME_FOR_NGU = "em1";
+ GNB_IPV4_ADDRESS_FOR_NGU = "CI_GNB_IP_ADDR";
+ GNB_PORT_FOR_S1U = 2152; # Spec 2152
+ };
+
+ }
+);
+
+MACRLCs = (
+{
+ num_cc = 1;
+ tr_s_preference = "local_L1";
+ tr_n_preference = "local_RRC";
+ pusch_TargetSNRx10 = 200;
+ pucch_TargetSNRx10 = 200;
+ ulsch_max_frame_inactivity = 1;
+}
+);
+
+prs_config = (
+{
+ NumPRSResources = 1;
+ PRSResourceSetPeriod = [20, 2];
+ SymbolStart = [7];
+ NumPRSSymbols = [6];
+ NumRB = 106;
+ RBOffset = 0;
+ CombSize = 4;
+ REOffset = [0];
+ PRSResourceOffset = [1];
+ PRSResourceRepetition = 1;
+ PRSResourceTimeGap = 1;
+ NPRS_ID = [1];
+ MutingPattern1 = [];
+ MutingPattern2 = [];
+ MutingBitRepetition = 1;
+}
+);
+
+L1s = (
+{
+ num_cc = 1;
+ tr_n_preference = "local_mac";
+ prach_dtx_threshold = 120;
+ #pucch0_dtx_threshold = 150;
+}
+);
+
+RUs = (
+{
+ local_rf = "yes"
+ nb_tx = 1
+ nb_rx = 1
+ att_tx = 0
+ att_rx = 0;
+ bands = [78];
+ max_pdschReferenceSignalPower = -27;
+ max_rxgain = 75;
+ eNB_instances = [0];
+ ##beamforming 1x2 matrix: 1 layer x 2 antennas
+ bf_weights = [0x00007fff, 0x0000];
+ ##beamforming 1x4 matrix: 1 layer x 4 antennas
+ #bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
+ ## beamforming 2x2 matrix:
+ # bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
+ ## beamforming 4x4 matrix:
+ #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
+ sf_extension = 0
+ sdr_addrs = "mgmt_addr=172.21.19.14,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
+}
+);
+
+THREAD_STRUCT = (
+{
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_SINGLE_THREAD";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+}
+);
+
+rfsimulator :
+{
+ serveraddr = "server";
+ serverport = "4043";
+ options = (); #("saviq"); or/and "chanmod"
+ modelname = "AWGN";
+ IQfile = "/tmp/rfsimulator.iqs";
+};
+
+security = {
+ # preferred ciphering algorithms
+ # the first one of the list that an UE supports in chosen
+ # valid values: nea0, nea1, nea2, nea3
+ ciphering_algorithms = ( "nea0" );
+
+ # preferred integrity algorithms
+ # the first one of the list that an UE supports in chosen
+ # valid values: nia0, nia1, nia2, nia3
+ integrity_algorithms = ( "nia2", "nia0" );
+
+ # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
+ # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
+ drb_ciphering = "yes";
+ drb_integrity = "no";
+};
+
+log_config :
+{
+ global_log_level ="info";
+ hw_log_level ="info";
+ phy_log_level ="info";
+ mac_log_level ="info";
+ rlc_log_level ="info";
+ pdcp_log_level ="info";
+ rrc_log_level ="info";
+ f1ap_log_level ="debug";
+};
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.106prb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.106prb.conf
new file mode 100644
index 0000000000..1bf92fd0d6
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.106prb.conf
@@ -0,0 +1,89 @@
+PRSs =
+(
+ {
+ Active_gNBs = 1;
+ prs_config0 = (
+ {
+ gNB_id = 0;
+ NumPRSResources = 1;
+ PRSResourceSetPeriod = [20, 2];
+ SymbolStart = [7];
+ NumPRSSymbols = [6];
+ NumRB = 106;
+ RBOffset = 0;
+ CombSize = 4;
+ REOffset = [0];
+ PRSResourceOffset = [0];
+ PRSResourceRepetition = 1;
+ PRSResourceTimeGap = 1;
+ NPRS_ID = [0];
+ MutingPattern1 = [];
+ MutingPattern2 = [];
+ MutingBitRepetition = 1;
+ }
+ );
+
+ prs_config1 = (
+ {
+ gNB_id = 1;
+ NumPRSResources = 1;
+ PRSResourceSetPeriod = [20, 2];
+ SymbolStart = [7];
+ NumPRSSymbols = [6];
+ NumRB = 106;
+ RBOffset = 0;
+ CombSize = 4;
+ REOffset = [0];
+ PRSResourceOffset = [1];
+ PRSResourceRepetition = 1;
+ PRSResourceTimeGap = 1;
+ NPRS_ID = [1];
+ MutingPattern1 = [];
+ MutingPattern2 = [];
+ MutingBitRepetition = 1;
+ }
+ );
+
+ prs_config2 = (
+ {
+ gNB_id = 2;
+ NumPRSResources = 1;
+ PRSResourceSetPeriod = [20, 2];
+ SymbolStart = [7];
+ NumPRSSymbols = [6];
+ NumRB = 106;
+ RBOffset = 0;
+ CombSize = 4;
+ REOffset = [0];
+ PRSResourceOffset = [2];
+ PRSResourceRepetition = 1;
+ PRSResourceTimeGap = 1;
+ NPRS_ID = [2];
+ MutingPattern1 = [];
+ MutingPattern2 = [];
+ MutingBitRepetition = 1;
+ }
+ );
+
+ prs_config3 = (
+ {
+ gNB_id = 3;
+ NumPRSResources = 1;
+ PRSResourceSetPeriod = [20, 2];
+ SymbolStart = [7];
+ NumPRSSymbols = [6];
+ NumRB = 106;
+ RBOffset = 0;
+ CombSize = 4;
+ REOffset = [0];
+ PRSResourceOffset = [3];
+ PRSResourceRepetition = 1;
+ PRSResourceTimeGap = 1;
+ NPRS_ID = [3];
+ MutingPattern1 = [];
+ MutingPattern2 = [];
+ MutingBitRepetition = 1;
+ }
+ );
+ }
+);
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.64prb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.64prb.conf
new file mode 100644
index 0000000000..cb66dfff37
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.64prb.conf
@@ -0,0 +1,47 @@
+PRSs =
+(
+ {
+ Active_gNBs = 1;
+ prs_config0 = (
+ {
+ gNB_id = 0;
+ NumPRSResources = 8;
+ PRSResourceSetPeriod = [80, 2];
+ SymbolStart = [8,8,8,8,8,8,8,8];
+ NumPRSSymbols = [6,6,6,6,6,6,6,6];
+ NumRB = 64;
+ RBOffset = 0;
+ CombSize = 4;
+ REOffset = [0,0,0,0,0,0,0,0];
+ PRSResourceOffset = [0,10,20,30,40,50,60,70];
+ PRSResourceRepetition = 1;
+ PRSResourceTimeGap = 1;
+ NPRS_ID = [0,1,2,3,4,5,6,7];
+ MutingPattern1 = [];
+ MutingPattern2 = [];
+ MutingBitRepetition = 1;
+ }
+ );
+
+ prs_config1 = (
+ {
+ gNB_id = 1;
+ NumPRSResources = 8;
+ PRSResourceSetPeriod = [80, 2];
+ SymbolStart = [8,8,8,8,8,8,8,8];
+ NumPRSSymbols = [6,6,6,6,6,6,6,6];
+ NumRB = 64;
+ RBOffset = 0;
+ CombSize = 4;
+ REOffset = [1,1,1,1,1,1,1,1];
+ PRSResourceOffset = [0,10,20,30,40,50,60,70];
+ PRSResourceRepetition = 1;
+ PRSResourceTimeGap = 1;
+ NPRS_ID = [10,11,12,13,14,15,16,17];
+ MutingPattern1 = [];
+ MutingPattern2 = [];
+ MutingBitRepetition = 1;
+ }
+ );
+ }
+);