diff --git a/ci-scripts/Jenkinsfile-tmp-multi-enb-nsa b/ci-scripts/Jenkinsfile-tmp-multi-enb-nsa
new file mode 100644
index 0000000000..f312f05e45
--- /dev/null
+++ b/ci-scripts/Jenkinsfile-tmp-multi-enb-nsa
@@ -0,0 +1,293 @@
+#!/bin/groovy
+/*
+ * 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
+ */
+
+// Template Jenkins Declarative Pipeline script to run Test w/ RF HW
+
+// Location of the python executor node shall be in the same subnet as the others servers
+def pythonExecutor = params.pythonExecutor
+
+// Location of the test XML file to be run
+def testXMLFile = params.pythonTestXmlFile
+def mainPythonAllXmlFiles = ""
+def buildStageStatus = true
+
+// Name of the test stage
+def testStageName = params.pipelineTestStageName
+
+// Name of the phone resource
+def ciSmartPhoneResource1 = params.smartphonesResource1
+def ciSmartPhoneResource2 = params.smartphonesResource2
+
+// Global Parameters. Normally they should be populated when the master job
+// triggers the slave job with parameters
+def eNB_Repository
+def eNB_Branch
+def eNB_CommitID
+def eNB_AllowMergeRequestProcess
+def eNB_TargetBranch
+
+pipeline {
+ agent {
+ label pythonExecutor
+ }
+ options {
+ disableConcurrentBuilds()
+ ansiColor('xterm')
+ lock(extra: [[resource: ciSmartPhoneResource2]], resource: ciSmartPhoneResource1)
+ }
+ stages {
+ stage("Build Init") {
+ steps {
+ // update the build name and description
+ buildName "${params.eNB_MR}"
+ buildDescription "Branch : ${params.eNB_Branch}"
+ }
+ }
+ stage ("Verify Parameters") {
+ steps {
+ script {
+ echo '\u2705 \u001B[32mVerify Parameters\u001B[0m'
+ def allParametersPresent = true
+
+ // It is already to late to check it
+ if (params.pythonExecutor != null) {
+ echo "eNB CI executor node : ${pythonExecutor}"
+ }
+ // If not present picking a default Stage Name
+ if (params.pipelineTestStageName == null) {
+ // picking default
+ testStageName = 'Template Test Stage'
+ }
+
+ if (params.smartphonesResource1 == null) {
+ allParametersPresent = false
+ }
+ if (params.smartphonesResource2 == null) {
+ allParametersPresent = false
+ }
+ // 1st eNB parameters
+ if (params.eNB_IPAddress == null) {
+ allParametersPresent = false
+ }
+ if (params.eNB_SourceCodePath == null) {
+ allParametersPresent = false
+ }
+ if (params.eNB_Credentials == null) {
+ allParametersPresent = false
+ }
+ // 2nd eNB parameters
+ if (params.eNB1_IPAddress == null) {
+ allParametersPresent = false
+ }
+ if (params.eNB1_SourceCodePath == null) {
+ allParametersPresent = false
+ }
+ if (params.eNB1_Credentials == null) {
+ allParametersPresent = false
+ }
+ // 3rd eNB parameters
+ if (params.eNB2_IPAddress == null) {
+ allParametersPresent = false
+ }
+ if (params.eNB2_SourceCodePath == null) {
+ allParametersPresent = false
+ }
+ if (params.eNB2_Credentials == null) {
+ allParametersPresent = false
+ }
+ // the following 4 parameters should be pushed by the master trigger
+ // if not present, take the job GIT variables (used for developing)
+ if (params.eNB_Repository == null) {
+ eNB_Repository = env.GIT_URL
+ } else {
+ eNB_Repository = params.eNB_Repository
+ }
+ echo "eNB_Repository : ${eNB_Repository}"
+ if (params.eNB_Branch == null) {
+ eNB_Branch = env.GIT_BRANCH
+ } else {
+ eNB_Branch = params.eNB_Branch
+ }
+ echo "eNB_Branch : ${eNB_Branch}"
+ if (params.eNB_CommitID == null) {
+ eNB_CommitID = env.GIT_COMMIT
+ } else {
+ eNB_CommitID = params.eNB_CommitID
+ }
+ echo "eNB_CommitID : ${eNB_CommitID}"
+ if (params.eNB_AllowMergeRequestProcess!= null) {
+ eNB_AllowMergeRequestProcess = params.eNB_AllowMergeRequestProcess
+ if (eNB_AllowMergeRequestProcess) {
+ if (params.eNB_TargetBranch != null) {
+ eNB_TargetBranch = params.eNB_TargetBranch
+ } else {
+ eNB_TargetBranch = 'develop'
+ }
+ echo "eNB_TargetBranch : ${eNB_TargetBranch}"
+ }
+ }
+
+ if (params.EPC_IPAddress == null) {
+ allParametersPresent = false
+ }
+ if (params.EPC_Type == null) {
+ allParametersPresent = false
+ }
+ if (params.EPC_SourceCodePath == null) {
+ allParametersPresent = false
+ }
+ if (params.EPC_Credentials == null) {
+ allParametersPresent = false
+ }
+
+ if (params.ADB_IPAddress == null) {
+ allParametersPresent = false
+ }
+ if (params.ADB_Credentials == null) {
+ allParametersPresent = false
+ }
+
+ if (allParametersPresent) {
+ echo "All parameters are present"
+ if (eNB_AllowMergeRequestProcess) {
+ sh "git fetch"
+ sh "./ci-scripts/doGitLabMerge.sh --src-branch ${eNB_Branch} --src-commit ${eNB_CommitID} --target-branch ${eNB_TargetBranch} --target-commit latest"
+ } else {
+ sh "git fetch"
+ sh "git checkout -f ${eNB_CommitID}"
+ }
+ } else {
+ echo "Some parameters are missing"
+ sh "./ci-scripts/fail.sh"
+ }
+ }
+ }
+ }
+ stage ("Build and Test") {
+ steps {
+ script {
+ dir ('ci-scripts') {
+ echo "\u2705 \u001B[32m${testStageName}\u001B[0m"
+ // If not present picking a default XML file
+ if (params.pythonTestXmlFile == null) {
+ // picking default
+ testXMLFile = 'xml_files/enb_usrpB210_band7_50PRB.xml'
+ echo "Test XML file(default): ${testXMLFile}"
+ mainPythonAllXmlFiles += "--XMLTestFile=" + testXMLFile + " "
+ } else {
+ String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
+ for (xmlFile in myXmlTestSuite) {
+ if (fileExists(xmlFile)) {
+ mainPythonAllXmlFiles += "--XMLTestFile=" + xmlFile + " "
+ echo "Test XML file : ${xmlFile}"
+ }
+ }
+ }
+ withCredentials([
+ [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password'],
+ [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB1_Credentials}", usernameVariable: 'eNB1_Username', passwordVariable: 'eNB1_Password'],
+ [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB2_Credentials}", usernameVariable: 'eNB2_Username', passwordVariable: 'eNB2_Password'],
+ [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'],
+ [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.ADB_Credentials}", usernameVariable: 'ADB_Username', passwordVariable: 'ADB_Password']
+ ]) {
+ sh "python3 main.py --mode=InitiateHtml --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} --ADBIPAddress=${params.ADB_IPAddress} --ADBUserName=${ADB_Username} --ADBPassword=${ADB_Password} ${mainPythonAllXmlFiles}"
+ String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
+ for (xmlFile in myXmlTestSuite) {
+ if (fileExists(xmlFile)) {
+ try {
+ sh "python3 main.py --mode=TesteNB --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath} --eNB1IPAddress=${params.eNB1_IPAddress} --eNB1UserName=${eNB1_Username} --eNB1Password=${eNB1_Password} --eNB1SourceCodePath=${params.eNB1_SourceCodePath} --eNB2IPAddress=${params.eNB2_IPAddress} --eNB2UserName=${eNB2_Username} --eNB2Password=${eNB2_Password} --eNB2SourceCodePath=${params.eNB2_SourceCodePath} --EPCIPAddress=${params.EPC_IPAddress} --EPCType=${params.EPC_Type} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --ADBIPAddress=${params.ADB_IPAddress} --ADBUserName=${ADB_Username} --ADBPassword=${ADB_Password} --XMLTestFile=${xmlFile}"
+ } catch (Exception e) {
+ currentBuild.result = 'FAILURE'
+ buildStageStatus = false
+ }
+ }
+ }
+ sh "python3 main.py --mode=FinalizeHtml --finalStatus=${buildStageStatus} --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password}"
+ }
+ }
+ }
+ }
+ }
+ stage('Log Collection') {
+ parallel {
+ stage('Log Collection (eNB - Build)') {
+ steps {
+ withCredentials([
+ [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password']
+ ]) {
+ echo '\u2705 \u001B[32mLog Collection (eNB - Build)\u001B[0m'
+ sh "python3 ci-scripts/main.py --mode=LogCollectBuild --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath}"
+
+ echo '\u2705 \u001B[32mLog Transfer (eNB - Build)\u001B[0m'
+ sh "sshpass -p \'${eNB_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${eNB_Username}@${params.eNB_IPAddress}:${eNB_SourceCodePath}/cmake_targets/build.log.zip ./build.log.${env.BUILD_ID}.zip || true"
+ }
+ script {
+ if(fileExists("build.log.${env.BUILD_ID}.zip")) {
+ archiveArtifacts "build.log.${env.BUILD_ID}.zip"
+ }
+ }
+ }
+ }
+ stage('Log Collection (eNB - Run)') {
+ steps {
+ withCredentials([
+ [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password']
+ ]) {
+ echo '\u2705 \u001B[32mLog Collection (eNB - Run)\u001B[0m'
+ sh "python3 ci-scripts/main.py --mode=LogCollecteNB --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath}"
+
+ echo '\u2705 \u001B[32mLog Transfer (eNB - Run)\u001B[0m'
+ sh "sshpass -p \'${eNB_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${eNB_Username}@${params.eNB_IPAddress}:${eNB_SourceCodePath}/cmake_targets/enb.log.zip ./enb.log.${env.BUILD_ID}.zip || true"
+ }
+ script {
+ if(fileExists("enb.log.${env.BUILD_ID}.zip")) {
+ archiveArtifacts "enb.log.${env.BUILD_ID}.zip"
+ }
+ if(fileExists("ci-scripts/test_results.html")) {
+ sh "mv ci-scripts/test_results.html test_results-${JOB_NAME}.html"
+ sh "sed -i -e 's#TEMPLATE_JOB_NAME#${JOB_NAME}#' -e 's@build #TEMPLATE_BUILD_ID@build #${BUILD_ID}@' -e 's#Build-ID: TEMPLATE_BUILD_ID#Build-ID: ${BUILD_ID}#' -e 's#TEMPLATE_STAGE_NAME#${testStageName}#' test_results-${JOB_NAME}.html"
+ archiveArtifacts "test_results-${JOB_NAME}.html"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ post {
+ always {
+ script {
+ if (params.pipelineZipsConsoleLog != null) {
+ if (params.pipelineZipsConsoleLog) {
+ echo "Archiving Jenkins console log"
+ sh "wget --no-check-certificate --no-proxy ${env.JENKINS_URL}/job/${env.JOB_NAME}/${env.BUILD_ID}/consoleText -O consoleText.log || true"
+ sh "zip -m consoleText.log.${env.BUILD_ID}.zip consoleText.log || true"
+ if(fileExists("consoleText.log.${env.BUILD_ID}.zip")) {
+ archiveArtifacts "consoleText.log.${env.BUILD_ID}.zip"
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/ci-scripts/Jenkinsfile-trig-nsa b/ci-scripts/Jenkinsfile-trig-nsa
new file mode 100644
index 0000000000..3bb5bfd359
--- /dev/null
+++ b/ci-scripts/Jenkinsfile-trig-nsa
@@ -0,0 +1,63 @@
+#!/bin/groovy
+/*
+ * 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
+ */
+
+// Template Jenkins Declarative Pipeline script to run Test w/ RF HW
+
+// Location of the python executor node shall be in the same subnet as the others servers
+def pythonExecutor = params.pythonExecutor
+
+def TARGET_BRANCH = "develop"
+def ALLOW_MERGE = true
+
+pipeline {
+ agent {
+ label pythonExecutor
+ }
+ stages {
+ stage ("NSA Test Loop") {
+ steps {
+ script {
+ MR_LIST= sh returnStdout: true, script: 'curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests?state=opened&per_page=100&labels=READY_TO_BE_MERGED" | jq ".[].iid" || true '
+ echo "List of selected MR:\n${MR_LIST}"
+ def MR_ARRAY = MR_LIST.split('\n')
+ for (MR in MR_ARRAY) {
+ SRC_BRANCH=sh returnStdout: true, script: """curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests/${MR}" | jq ".source_branch" || true """
+ SRC_BRANCH=SRC_BRANCH.trim()
+ COMMIT_ID=sh returnStdout: true, script: """curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests/${MR}" | jq ".sha" || true """
+ COMMIT_ID=COMMIT_ID.trim()
+ echo "Testing NSA on : ${MR} ${SRC_BRANCH} ${COMMIT_ID}"
+ //calling sub job
+ build job: "RAN-CI-NSA-B210", wait : false, propagate : false, parameters: [
+ string(name: 'eNB_MR', value: String.valueOf(MR)),
+ string(name: 'eNB_Branch', value: String.valueOf(SRC_BRANCH)),
+ string(name: 'eNB_CommitID', value: String.valueOf(COMMIT_ID)),
+ string(name: 'eNB_TargetBranch', value: String.valueOf(TARGET_BRANCH)),
+ booleanParam(name: 'eNB_AllowMergeRequestProcess', value: Boolean.valueOf(ALLOW_MERGE))
+ ]
+ }
+ }
+ }
+ }
+ }
+}
+
+
diff --git a/ci-scripts/xml_files/fr1_multi_node_test.xml b/ci-scripts/xml_files/fr1_multi_node_test.xml
deleted file mode 100644
index 8c56f0bcec..0000000000
--- a/ci-scripts/xml_files/fr1_multi_node_test.xml
+++ /dev/null
@@ -1,77 +0,0 @@
-
-
- test-fr1-tm1
- Test-FR1-TM1
- tasks
- 1
-
- 030000
- 040000
- 000001
- 070001
- 070000
-
-
-
-
-
- Initialize_eNB
- Initialize eNB
- -O ci-scripts/conf_files/enb.band7.tm1.fr1.25PRB.usrpb210.conf
- 0
- 0
- lte
-
-
-
- Initialize_eNB
- Initialize gNB (3/4 sampling rate)
- -O ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf -E
- 1
- 1
- nr
-
-
-
- IdleSleep
- Sleep
- 30
-
-
-
- Terminate_eNB
- Terminate eNB
- 0
- 0
-
-
-
- Terminate_eNB
- Terminate gNB
- 1
- 1
-
-
-
-
diff --git a/ci-scripts/xml_files/fr1_ran_ue_iperf.xml b/ci-scripts/xml_files/fr1_nsa_base.xml
similarity index 80%
rename from ci-scripts/xml_files/fr1_ran_ue_iperf.xml
rename to ci-scripts/xml_files/fr1_nsa_base.xml
index 8ead3afc62..96bdc79f0f 100644
--- a/ci-scripts/xml_files/fr1_ran_ue_iperf.xml
+++ b/ci-scripts/xml_files/fr1_nsa_base.xml
@@ -21,8 +21,8 @@
-->
- TEST-FR1-TM1
- FR1
+ TEST-NSA-FR1-TM1
+ NSA FULL
tasks
010000
@@ -31,14 +31,17 @@
010001
000001
050000
+ 050001
000001
060000
060001
000001
+ 070000
+ 070001
010002
000001
- 070001
- 070000
+ 080001
+ 080000
010003
@@ -96,6 +99,13 @@
50
+
+ Ping
+ Ping: 100pings in 20sec
+ -c 100 -i 0.2
+ 50
+
+
Iperf
@@ -113,7 +123,26 @@
single-ue
+
+ Iperf
+ iperf (DL/20Mbps/UDP)(20 sec)(single-ue profile)
+ -u -b 20M -t 20 -i 1
+ 50
+ single-ue
+
+
+
+ Iperf
+ iperf (UL/3Mbps/UDP)(20 sec)(single-ue profile)
+ -u -b 3M -t 20 -i 1 -R
+ 50
+ single-ue
+
+
+
+
+
Terminate_eNB
Terminate eNB
0
@@ -121,7 +150,7 @@
lte
-
+
Terminate_eNB
Terminate gNB
1
diff --git a/ci-scripts/xml_files/fr1_ran_ue_base.xml b/ci-scripts/xml_files/fr1_nsa_base_ref.xml
similarity index 80%
rename from ci-scripts/xml_files/fr1_ran_ue_base.xml
rename to ci-scripts/xml_files/fr1_nsa_base_ref.xml
index 847967f81e..fd47db10b2 100644
--- a/ci-scripts/xml_files/fr1_ran_ue_base.xml
+++ b/ci-scripts/xml_files/fr1_nsa_base_ref.xml
@@ -21,8 +21,8 @@
-->
- TEST-FR1-TM1
- FR1
+ TEST-NSA-FR1-TM1
+ NSA FULL
tasks
010000
@@ -32,16 +32,15 @@
000001
050000
050001
- 050002
- 050002
000001
060000
060001
000001
+ 070000
010002
000001
- 070001
- 070000
+ 080001
+ 080000
010003
@@ -100,13 +99,6 @@
- Ping
- Ping: 5pings in 1sec
- -c 5 -i 0.2
- 50
-
-
-
Ping
Ping: 100pings in 20sec
-c 100 -i 0.2
@@ -116,21 +108,40 @@
Iperf
- iperf (DL/1Mbps/UDP)(30 sec)(single-ue profile)
- -u -b 1M -t 30 -i 1
+ iperf (DL/3Mbps/UDP)(20 sec)(single-ue profile)
+ -u -b 3M -t 20 -i 1
50
single-ue
Iperf
- iperf (UL/1Mbps/UDP)(30 sec)(single-ue profile)
- -u -b 1M -t 30 -i 1 -R
+ iperf (UL/1Mbps/UDP)(20 sec)(single-ue profile)
+ -u -b 1M -t 20 -i 1 -R
50
single-ue
+
+ Iperf
+ iperf (DL/20Mbps/UDP)(20 sec)(single-ue profile)
+ -u -b 20M -t 20 -i 1
+ 50
+ single-ue
+
+
+
+ Iperf
+ iperf (UL/3Mbps/UDP)(20 sec)(single-ue profile)
+ -u -b 3M -t 20 -i 1 -R
+ 50
+ single-ue
+
+
+
+
+
Terminate_eNB
Terminate eNB
0
@@ -138,7 +149,7 @@
lte
-
+
Terminate_eNB
Terminate gNB
1
diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml
index 089d0503fd..016c76dc06 100644
--- a/cmake_targets/autotests/test_case_list.xml
+++ b/cmake_targets/autotests/test_case_list.xml
@@ -1294,7 +1294,8 @@
(Test10: SC-FDMA, 75 PRBs),
(Test11: SC-FDMA, 216 PRBs),
(Test12: SC-FDMA, 273 PRBs),
- (Test13: SC-FDMA, 3 DMRS)
+ (Test13: SC-FDMA, 3 DMRS),
+ (Test14: MCS 16 50 PRBs 2 RX_Antenna)
$OPENAIR_DIR/cmake_targets/build_oai
--phy_simulators -c
@@ -1313,9 +1314,10 @@
-n100 -s2 -Z -r75
-n100 -s2 -Z -r216 -R217
-n100 -s2 -Z -r270 -R273
- -n100 -s2 -Z -U 2 0 2
+ -n100 -s2 -Z -U 2 0 2
+ -n100 -m16 -s10 -z2
- nr_ulsim.test1 nr_ulsim.test2 nr_ulsim.test3 nr_ulsim.test4 nr_ulsim.test5 nr_ulsim.test6 nr_ulsim.test7 nr_ulsim.test8 nr_ulsim.test9 nr_ulsim.test10 nr_ulsim.test11 nr_ulsim.test12 nr_ulsim.test13
+ nr_ulsim.test1 nr_ulsim.test2 nr_ulsim.test3 nr_ulsim.test4 nr_ulsim.test5 nr_ulsim.test6 nr_ulsim.test7 nr_ulsim.test8 nr_ulsim.test9 nr_ulsim.test10 nr_ulsim.test11 nr_ulsim.test12 nr_ulsim.test13 nr_ulsim.test14
PUSCH test OK
segmentation fault|assertion|exiting|fatal
3
diff --git a/executables/nr-ru.c b/executables/nr-ru.c
index 9dbd025680..18aa36a78f 100644
--- a/executables/nr-ru.c
+++ b/executables/nr-ru.c
@@ -797,58 +797,21 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) {
int mu = config->ssb_config.scs_common.value;
int N_RB = config->carrier_config.dl_grid_size[config->ssb_config.scs_common.value].value;
- if (mu == NR_MU_0) { //or if LTE
- if(N_RB == 100) {
- if (fp->threequarter_fs) {
- cfg->sample_rate=23.04e6;
- cfg->samples_per_frame = 230400;
- cfg->tx_bw = 10e6;
- cfg->rx_bw = 10e6;
- } else {
- cfg->sample_rate=30.72e6;
- cfg->samples_per_frame = 307200;
- cfg->tx_bw = 10e6;
- cfg->rx_bw = 10e6;
- }
- } else if(N_RB == 50) {
- cfg->sample_rate=15.36e6;
- cfg->samples_per_frame = 153600;
- cfg->tx_bw = 5e6;
- cfg->rx_bw = 5e6;
- } else if (N_RB == 25) {
- cfg->sample_rate=7.68e6;
- cfg->samples_per_frame = 76800;
- cfg->tx_bw = 2.5e6;
- cfg->rx_bw = 2.5e6;
- } else if (N_RB == 6) {
- cfg->sample_rate=1.92e6;
- cfg->samples_per_frame = 19200;
- cfg->tx_bw = 1.5e6;
- cfg->rx_bw = 1.5e6;
- } else AssertFatal(1==0,"Unknown N_RB %d\n",N_RB);
- } else if (mu == NR_MU_1) {
- if(N_RB == 273) {
- if (fp->threequarter_fs) {
- AssertFatal(0 == 1,"three quarter sampling not supported for N_RB 273\n");
- } else {
- cfg->sample_rate=122.88e6;
- cfg->samples_per_frame = 1228800;
- cfg->tx_bw = 100e6;
- cfg->rx_bw = 100e6;
- }
- } else if(N_RB == 217) {
+ if (mu == NR_MU_0) {
+ switch(N_RB) {
+ case 270:
if (fp->threequarter_fs) {
cfg->sample_rate=92.16e6;
cfg->samples_per_frame = 921600;
- cfg->tx_bw = 80e6;
- cfg->rx_bw = 80e6;
+ cfg->tx_bw = 50e6;
+ cfg->rx_bw = 50e6;
} else {
- cfg->sample_rate=122.88e6;
- cfg->samples_per_frame = 1228800;
- cfg->tx_bw = 80e6;
- cfg->rx_bw = 80e6;
+ cfg->sample_rate=61.44e6;
+ cfg->samples_per_frame = 614400;
+ cfg->tx_bw = 50e6;
+ cfg->rx_bw = 50e6;
}
- } else if(N_RB == 106) {
+ case 216:
if (fp->threequarter_fs) {
cfg->sample_rate=46.08e6;
cfg->samples_per_frame = 460800;
@@ -861,20 +824,154 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) {
cfg->tx_bw = 40e6;
cfg->rx_bw = 40e6;
}
- } else {
+ break;
+ case 106:
+ if (fp->threequarter_fs) {
+ cfg->sample_rate=23.04e6;
+ cfg->samples_per_frame = 230400;
+ cfg->tx_bw = 20e6;
+ cfg->rx_bw = 20e6;
+ }
+ else {
+ cfg->sample_rate=30.72e6;
+ cfg->samples_per_frame = 307200;
+ cfg->tx_bw = 20e6;
+ cfg->rx_bw = 20e6;
+ }
+ break;
+ case 52:
+ if (fp->threequarter_fs) {
+ cfg->sample_rate=11.52e6;
+ cfg->samples_per_frame = 115200;
+ cfg->tx_bw = 10e6;
+ cfg->rx_bw = 10e6;
+ }
+ else {
+ cfg->sample_rate=15.36e6;
+ cfg->samples_per_frame = 153600;
+ cfg->tx_bw = 10e6;
+ cfg->rx_bw = 10e6;
+ }
+ case 25:
+ if (fp->threequarter_fs) {
+ cfg->sample_rate=5.76e6;
+ cfg->samples_per_frame = 57600;
+ cfg->tx_bw = 5e6;
+ cfg->rx_bw = 5e6;
+ }
+ else {
+ cfg->sample_rate=7.68e6;
+ cfg->samples_per_frame = 76800;
+ cfg->tx_bw = 5e6;
+ cfg->rx_bw = 5e6;
+ }
+ break;
+ default:
+ AssertFatal(0==1,"N_RB %d not yet supported for numerology %d\n",N_RB,mu);
+ }
+ } else if (mu == NR_MU_1) {
+ switch(N_RB) {
+ case 273:
+ if (fp->threequarter_fs) {
+ cfg->sample_rate=184.32e6;
+ cfg->samples_per_frame = 1843200;
+ cfg->tx_bw = 100e6;
+ cfg->rx_bw = 100e6;
+ } else {
+ cfg->sample_rate=122.88e6;
+ cfg->samples_per_frame = 1228800;
+ cfg->tx_bw = 100e6;
+ cfg->rx_bw = 100e6;
+ }
+ break;
+ case 217:
+ if (fp->threequarter_fs) {
+ cfg->sample_rate=92.16e6;
+ cfg->samples_per_frame = 921600;
+ cfg->tx_bw = 80e6;
+ cfg->rx_bw = 80e6;
+ } else {
+ cfg->sample_rate=122.88e6;
+ cfg->samples_per_frame = 1228800;
+ cfg->tx_bw = 80e6;
+ cfg->rx_bw = 80e6;
+ }
+ break;
+ case 106:
+ if (fp->threequarter_fs) {
+ cfg->sample_rate=46.08e6;
+ cfg->samples_per_frame = 460800;
+ cfg->tx_bw = 40e6;
+ cfg->rx_bw = 40e6;
+ }
+ else {
+ cfg->sample_rate=61.44e6;
+ cfg->samples_per_frame = 614400;
+ cfg->tx_bw = 40e6;
+ cfg->rx_bw = 40e6;
+ }
+ break;
+ case 51:
+ if (fp->threequarter_fs) {
+ cfg->sample_rate=23.04e6;
+ cfg->samples_per_frame = 230400;
+ cfg->tx_bw = 20e6;
+ cfg->rx_bw = 20e6;
+ }
+ else {
+ cfg->sample_rate=30.72e6;
+ cfg->samples_per_frame = 307200;
+ cfg->tx_bw = 20e6;
+ cfg->rx_bw = 20e6;
+ }
+ break;
+ case 24:
+ if (fp->threequarter_fs) {
+ cfg->sample_rate=11.52e6;
+ cfg->samples_per_frame = 115200;
+ cfg->tx_bw = 10e6;
+ cfg->rx_bw = 10e6;
+ }
+ else {
+ cfg->sample_rate=15.36e6;
+ cfg->samples_per_frame = 153600;
+ cfg->tx_bw = 10e6;
+ cfg->rx_bw = 10e6;
+ }
+ break;
+ default:
AssertFatal(0==1,"N_RB %d not yet supported for numerology %d\n",N_RB,mu);
}
} else if (mu == NR_MU_3) {
- if (N_RB == 66) {
- cfg->sample_rate = 122.88e6;
- cfg->samples_per_frame = 1228800;
- cfg->tx_bw = 100e6;
- cfg->rx_bw = 100e6;
- } else if(N_RB == 32) {
- cfg->sample_rate=61.44e6;
- cfg->samples_per_frame = 614400;
- cfg->tx_bw = 50e6;
- cfg->rx_bw = 50e6;
+ switch(N_RB) {
+ case 66:
+ if (fp->threequarter_fs) {
+ cfg->sample_rate=184.32e6;
+ cfg->samples_per_frame = 1843200;
+ cfg->tx_bw = 100e6;
+ cfg->rx_bw = 100e6;
+ } else {
+ cfg->sample_rate = 122.88e6;
+ cfg->samples_per_frame = 1228800;
+ cfg->tx_bw = 100e6;
+ cfg->rx_bw = 100e6;
+ }
+ break;
+ case 32:
+ if (fp->threequarter_fs) {
+ cfg->sample_rate=92.16e6;
+ cfg->samples_per_frame = 921600;
+ cfg->tx_bw = 50e6;
+ cfg->rx_bw = 50e6;
+ } else {
+ cfg->sample_rate=61.44e6;
+ cfg->samples_per_frame = 614400;
+ cfg->tx_bw = 50e6;
+ cfg->rx_bw = 50e6;
+ }
+ break;
+ default:
+ AssertFatal(0==1,"N_RB %d not yet supported for numerology %d\n",N_RB,mu);
}
} else {
AssertFatal(0 == 1,"Numerology %d not supported for the moment\n",mu);
@@ -921,60 +1018,52 @@ int setup_RU_buffers(RU_t *ru) {
int i,j;
int card,ant;
//uint16_t N_TA_offset = 0;
- NR_DL_FRAME_PARMS *frame_parms;
+ NR_DL_FRAME_PARMS *fp;
nfapi_nr_config_request_scf_t *config = &ru->config;
if (ru) {
- frame_parms = ru->nr_frame_parms;
- printf("setup_RU_buffers: frame_parms = %p\n",frame_parms);
+ fp = ru->nr_frame_parms;
+ printf("setup_RU_buffers: frame_parms = %p\n",fp);
} else {
printf("ru pointer is NULL\n");
return(-1);
}
+
int mu = config->ssb_config.scs_common.value;
int N_RB = config->carrier_config.dl_grid_size[config->ssb_config.scs_common.value].value;
-
if (config->cell_config.frame_duplex_type.value == TDD) {
int N_TA_offset = config->carrier_config.uplink_frequency.value < 6000000 ? 400 : 431; // reference samples for 25600Tc @ 30.72 Ms/s for FR1, same @ 61.44 Ms/s for FR2
double factor=1;
-
switch (mu) {
- case 0: //15 kHz scs
- AssertFatal(N_TA_offset == 400,"scs_common 15kHz only for FR1\n");
- if (N_RB <= 25) factor = .25; // 7.68 Ms/s
- else if (N_RB <=50) factor = .5; // 15.36 Ms/s
- else if (N_RB <=75) factor = 1.0; // 30.72 Ms/s
- else if (N_RB <=100) factor = 1.0; // 30.72 Ms/s
- else AssertFatal(1==0,"Too many PRBS for mu=0\n");
- break;
- case 1: //30 kHz sc
- AssertFatal(N_TA_offset == 400,"scs_common 30kHz only for FR1\n");
- if (N_RB <= 106) factor = 2.0; // 61.44 Ms/s
- else if (N_RB <= 275) factor = 4.0; // 122.88 Ms/s
- break;
- case 2: //60 kHz scs
- AssertFatal(1==0,"scs_common should not be 60 kHz\n");
- break;
- case 3: //120 kHz scs
- AssertFatal(N_TA_offset == 431,"scs_common 120kHz only for FR2\n");
- break;
- case 4: //240 kHz scs
- AssertFatal(1==0,"scs_common should not be 60 kHz\n");
- if (N_RB <= 32) factor = 1.0; // 61.44 Ms/s
- else if (N_RB <= 66) factor = 2.0; // 122.88 Ms/s
- else AssertFatal(1==0,"N_RB %d is too big for curretn FR2 implementation\n",N_RB);
- break;
-
- if (N_RB == 100) ru->N_TA_offset = 624;
- else if (N_RB == 50) ru->N_TA_offset = 624/2;
- else if (N_RB == 25) ru->N_TA_offset = 624/4;
+ case 0: //15 kHz scs
+ AssertFatal(N_TA_offset == 400, "scs_common 15kHz only for FR1\n");
+ factor = fp->samples_per_subframe / 30720.0;
+ break;
+ case 1: //30 kHz sc
+ AssertFatal(N_TA_offset == 400, "scs_common 30kHz only for FR1\n");
+ factor = fp->samples_per_subframe / 30720.0;
+ break;
+ case 2: //60 kHz scs
+ AssertFatal(1==0, "scs_common should not be 60 kHz\n");
+ break;
+ case 3: //120 kHz scs
+ AssertFatal(N_TA_offset == 431, "scs_common 120kHz only for FR2\n");
+ factor = fp->samples_per_subframe / 61440.0;
+ break;
+ case 4: //240 kHz scs
+ AssertFatal(N_TA_offset == 431, "scs_common 240kHz only for FR2\n");
+ factor = fp->samples_per_subframe / 61440.0;
+ break;
+ default:
+ AssertFatal(1==0, "Invalid scs_common!\n");
}
- if (frame_parms->threequarter_fs == 1) factor = factor*.75;
+
ru->N_TA_offset = (int)(N_TA_offset * factor);
- LOG_I(PHY,"RU %d Setting N_TA_offset to %d samples (factor %f, UL Freq %d, N_RB %d)\n",ru->idx,ru->N_TA_offset,factor,
- config->carrier_config.uplink_frequency.value, N_RB);
+
+ LOG_I(PHY,"RU %d Setting N_TA_offset to %d samples (factor %f, UL Freq %d, N_RB %d, mu %d)\n",ru->idx,ru->N_TA_offset,factor,
+ config->carrier_config.uplink_frequency.value, N_RB, mu);
}
else ru->N_TA_offset = 0;
diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c
index 924c32b8a7..69fc3c554d 100644
--- a/executables/nr-softmodem.c
+++ b/executables/nr-softmodem.c
@@ -136,9 +136,6 @@ double rx_gain[MAX_NUM_CCs][4] = {{110,0,0,0},{20,0,0,0}};
double rx_gain_off = 0.0;
-double sample_rate=30.72e6;
-double bw = 10.0e6;
-
static int tx_max_power[MAX_NUM_CCs]; /* = {0,0}*/;
@@ -476,93 +473,6 @@ void set_default_frame_parms(nfapi_nr_config_request_scf_t *config[MAX_NUM_CCs],
}
}
-/*
-void init_openair0(void) {
-
- int card;
- int i;
-
- for (card=0; cardrf_config.dl_carrier_bandwidth.value == 100) {
- if (frame_parms[0]->threequarter_fs) {
- openair0_cfg[card].sample_rate=23.04e6;
- openair0_cfg[card].samples_per_frame = 230400;
- openair0_cfg[card].tx_bw = 10e6;
- openair0_cfg[card].rx_bw = 10e6;
- } else {
- openair0_cfg[card].sample_rate=30.72e6;
- openair0_cfg[card].samples_per_frame = 307200;
- openair0_cfg[card].tx_bw = 10e6;
- openair0_cfg[card].rx_bw = 10e6;
- }
- } else if(config[0]->rf_config.dl_carrier_bandwidth.value == 50) {
- openair0_cfg[card].sample_rate=15.36e6;
- openair0_cfg[card].samples_per_frame = 153600;
- openair0_cfg[card].tx_bw = 5e6;
- openair0_cfg[card].rx_bw = 5e6;
- } else if (config[0]->rf_config.dl_carrier_bandwidth.value == 25) {
- openair0_cfg[card].sample_rate=7.68e6;
- openair0_cfg[card].samples_per_frame = 76800;
- openair0_cfg[card].tx_bw = 2.5e6;
- openair0_cfg[card].rx_bw = 2.5e6;
- } else if (config[0]->rf_config.dl_carrier_bandwidth.value == 6) {
- openair0_cfg[card].sample_rate=1.92e6;
- openair0_cfg[card].samples_per_frame = 19200;
- openair0_cfg[card].tx_bw = 1.5e6;
- openair0_cfg[card].rx_bw = 1.5e6;
- }
-
-
- if (config[0]->subframe_config.duplex_mode.value==TDD)
- openair0_cfg[card].duplex_mode = duplex_mode_TDD;
- else //FDD
- openair0_cfg[card].duplex_mode = duplex_mode_FDD;
-
- printf("HW: Configuring card %d, nb_antennas_tx/rx %d/%d\n",card,
- RC.gNB[0]->gNB_config.rf_config.tx_antenna_ports.value,
- RC.gNB[0]->gNB_config.rf_config.tx_antenna_ports.value );
- openair0_cfg[card].Mod_id = 0;
-
- openair0_cfg[card].num_rb_dl=config[0]->rf_config.dl_carrier_bandwidth.value;
-
- openair0_cfg[card].clock_source = clock_source;
-
-
- openair0_cfg[card].tx_num_channels=min(2,RC.gNB[0]->gNB_config.rf_config.tx_antenna_ports.value );
- openair0_cfg[card].rx_num_channels=min(2,RC.gNB[0]->gNB_config.rf_config.tx_antenna_ports.value );
-
- for (i=0; i<4; i++) {
-
- if (irx_total_gain_dB;
-
-
- openair0_cfg[card].configFilename = get_softmodem_params()->rf_config_file;
- printf("Card %d, channel %d, Setting tx_gain %f, rx_gain %f, tx_freq %f, rx_freq %f\n",
- card,i, openair0_cfg[card].tx_gain[i],
- openair0_cfg[card].rx_gain[i],
- openair0_cfg[card].tx_freq[i],
- openair0_cfg[card].rx_freq[i]);
- }
- } // for loop on cards
-}
-*/
-
void wait_RUs(void) {
LOG_I(PHY,"Waiting for RUs to be configured ... RC.ru_mask:%02lx\n", RC.ru_mask);
// wait for all RUs to be configured over fronthaul
diff --git a/executables/nr-ue.c b/executables/nr-ue.c
index 25e6d85695..1b766efe6c 100644
--- a/executables/nr-ue.c
+++ b/executables/nr-ue.c
@@ -237,43 +237,6 @@ static void UE_synch(void *arg) {
openair0_cfg[UE->rf_map.card].rx_freq[0],
openair0_cfg[UE->rf_map.card].tx_freq[0]);
- // reconfigure for potentially different bandwidth
- switch(UE->frame_parms.N_RB_DL) {
- case 6:
- openair0_cfg[UE->rf_map.card].sample_rate =1.92e6;
- openair0_cfg[UE->rf_map.card].rx_bw =.96e6;
- openair0_cfg[UE->rf_map.card].tx_bw =.96e6;
- // openair0_cfg[0].rx_gain[0] -= 12;
- break;
-
- case 25:
- openair0_cfg[UE->rf_map.card].sample_rate =7.68e6;
- openair0_cfg[UE->rf_map.card].rx_bw =2.5e6;
- openair0_cfg[UE->rf_map.card].tx_bw =2.5e6;
- // openair0_cfg[0].rx_gain[0] -= 6;
- break;
-
- case 50:
- openair0_cfg[UE->rf_map.card].sample_rate =15.36e6;
- openair0_cfg[UE->rf_map.card].rx_bw =5.0e6;
- openair0_cfg[UE->rf_map.card].tx_bw =5.0e6;
- // openair0_cfg[0].rx_gain[0] -= 3;
- break;
-
- case 100:
- openair0_cfg[UE->rf_map.card].sample_rate=30.72e6;
- openair0_cfg[UE->rf_map.card].rx_bw=10.0e6;
- openair0_cfg[UE->rf_map.card].tx_bw=10.0e6;
- // openair0_cfg[0].rx_gain[0] -= 0;
- break;
-
- case 66:
- openair0_cfg[UE->rf_map.card].sample_rate=122.88e6;
- openair0_cfg[UE->rf_map.card].rx_bw=100.e6;
- openair0_cfg[UE->rf_map.card].tx_bw=100.e6;
- break;
- }
-
if (UE->mode != loop_through_memory) {
UE->rfdevice.trx_set_freq_func(&UE->rfdevice,&openair0_cfg[0],0);
//UE->rfdevice.trx_set_gains_func(&openair0,&openair0_cfg[0]);
diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c
index 451dcd3d29..2854457eee 100644
--- a/executables/nr-uesoftmodem.c
+++ b/executables/nr-uesoftmodem.c
@@ -145,7 +145,6 @@ int chain_offset = 0;
int card_offset = 0;
uint64_t num_missed_slots = 0; // counter for the number of missed slots
int transmission_mode = 1;
-int numerology = 0;
int usrp_tx_thread = 0;
int oaisim_flag = 0;
int emulate_rf = 0;
@@ -316,92 +315,10 @@ void init_openair0(void) {
for (card=0; cardthreequarter_fs;
- numerology = frame_parms->numerology_index;
-
- if(frame_parms->N_RB_DL == 66) {
- if (numerology==3) {
- openair0_cfg[card].sample_rate=122.88e6;
- openair0_cfg[card].samples_per_frame = 1228800;
- } else {
- LOG_E(PHY,"Unsupported numerology! FR2 supports only 120KHz SCS for now.\n");
- exit(-1);
- }
- }else if(frame_parms->N_RB_DL == 32) {
- if (numerology==3) {
- openair0_cfg[card].sample_rate=61.44e6;
- openair0_cfg[card].samples_per_frame = 614400;
- } else {
- LOG_E(PHY,"Unsupported numerology! FR2 supports only 120KHz SCS for now.\n");
- exit(-1);
- }
- }else if(frame_parms->N_RB_DL == 217) {
- if (numerology==1) {
- if (frame_parms->threequarter_fs) {
- openair0_cfg[card].sample_rate=92.16e6;
- openair0_cfg[card].samples_per_frame = 921600;
- }
- else {
- openair0_cfg[card].sample_rate=122.88e6;
- openair0_cfg[card].samples_per_frame = 1228800;
- }
- } else {
- LOG_E(PHY,"Unsupported numerology!\n");
- exit(-1);
- }
- } else if(frame_parms->N_RB_DL == 273) {
- if (numerology==1) {
- if (frame_parms->threequarter_fs) {
- AssertFatal(0 == 1,"three quarter sampling not supported for N_RB 273\n");
- }
- else {
- openair0_cfg[card].sample_rate=122.88e6;
- openair0_cfg[card].samples_per_frame = 1228800;
- }
- } else {
- LOG_E(PHY,"Unsupported numerology!\n");
- exit(-1);
- }
- } else if(frame_parms->N_RB_DL == 106) {
- if (numerology==0) {
- if (frame_parms->threequarter_fs) {
- openair0_cfg[card].sample_rate=23.04e6;
- openair0_cfg[card].samples_per_frame = 230400;
- } else {
- openair0_cfg[card].sample_rate=30.72e6;
- openair0_cfg[card].samples_per_frame = 307200;
- }
- } else if (numerology==1) {
- if (frame_parms->threequarter_fs) {
- openair0_cfg[card].sample_rate=46.08e6;
- openair0_cfg[card].samples_per_frame = 460800;
- }
- else {
- openair0_cfg[card].sample_rate=61.44e6;
- openair0_cfg[card].samples_per_frame = 614400;
- }
- } else if (numerology==2) {
- openair0_cfg[card].sample_rate=122.88e6;
- openair0_cfg[card].samples_per_frame = 1228800;
- } else {
- LOG_E(PHY,"Unsupported numerology!\n");
- exit(-1);
- }
- } else if(frame_parms->N_RB_DL == 50) {
- openair0_cfg[card].sample_rate=15.36e6;
- openair0_cfg[card].samples_per_frame = 153600;
- } else if (frame_parms->N_RB_DL == 25) {
- openair0_cfg[card].sample_rate=7.68e6;
- openair0_cfg[card].samples_per_frame = 76800;
- } else if (frame_parms->N_RB_DL == 6) {
- openair0_cfg[card].sample_rate=1.92e6;
- openair0_cfg[card].samples_per_frame = 19200;
- }
- else {
- LOG_E(PHY,"Unknown NB_RB %d!\n",frame_parms->N_RB_DL);
- exit(-1);
- }
+ openair0_cfg[card].configFilename = NULL;
+ openair0_cfg[card].threequarter_fs = frame_parms->threequarter_fs;
+ openair0_cfg[card].sample_rate = frame_parms->samples_per_subframe * 1e3;
+ openair0_cfg[card].samples_per_frame = frame_parms->samples_per_frame;
if (frame_parms->frame_type==TDD)
openair0_cfg[card].duplex_mode = duplex_mode_TDD;
@@ -415,8 +332,9 @@ void init_openair0(void) {
openair0_cfg[card].tx_num_channels = min(2, frame_parms->nb_antennas_tx);
openair0_cfg[card].rx_num_channels = min(2, frame_parms->nb_antennas_rx);
- LOG_I(PHY, "HW: Configuring card %d, tx/rx num_channels %d/%d, duplex_mode %s\n",
+ LOG_I(PHY, "HW: Configuring card %d, sample_rate %f, tx/rx num_channels %d/%d, duplex_mode %s\n",
card,
+ openair0_cfg[card].sample_rate,
openair0_cfg[card].tx_num_channels,
openair0_cfg[card].rx_num_channels,
duplex_mode[openair0_cfg[card].duplex_mode]);
diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c
index ab363fcae4..0e6b253c2b 100644
--- a/openair1/PHY/INIT/nr_init.c
+++ b/openair1/PHY/INIT/nr_init.c
@@ -464,8 +464,8 @@ void nr_phy_config_request_sim(PHY_VARS_gNB *gNB,
gNB->mac_enabled = 1;
if (mu==1) {
- fp->dl_CarrierFreq = 3500000000;//from_nrarfcn(gNB_config->nfapi_config.rf_bands.rf_band[0],gNB_config->nfapi_config.nrarfcn.value);
- fp->ul_CarrierFreq = 3500000000;//fp->dl_CarrierFreq - (get_uldl_offset(gNB_config->nfapi_config.rf_bands.rf_band[0])*100000);
+ fp->dl_CarrierFreq = 3600000000;//from_nrarfcn(gNB_config->nfapi_config.rf_bands.rf_band[0],gNB_config->nfapi_config.nrarfcn.value);
+ fp->ul_CarrierFreq = 3600000000;//fp->dl_CarrierFreq - (get_uldl_offset(gNB_config->nfapi_config.rf_bands.rf_band[0])*100000);
fp->nr_band = 78;
// fp->threequarter_fs= 0;
} else if (mu==3) {
diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c
index e18a9e7f94..9bfc0d7a4b 100644
--- a/openair1/PHY/INIT/nr_init_ue.c
+++ b/openair1/PHY/INIT/nr_init_ue.c
@@ -502,50 +502,36 @@ void init_N_TA_offset(PHY_VARS_NR_UE *ue){
if (fp->frame_type == FDD) {
ue->N_TA_offset = 0;
} else {
- int N_RB = fp->N_RB_DL;
int N_TA_offset = fp->ul_CarrierFreq < 6e9 ? 400 : 431; // reference samples for 25600Tc @ 30.72 Ms/s for FR1, same @ 61.44 Ms/s for FR2
- double factor = 1;
+
+ double factor = 1.0;
switch (fp->numerology_index) {
case 0: //15 kHz scs
AssertFatal(N_TA_offset == 400, "scs_common 15kHz only for FR1\n");
- if (N_RB <= 25) factor = .25; // 7.68 Ms/s
- else if (N_RB <=50) factor = .5; // 15.36 Ms/s
- else if (N_RB <=75) factor = 1.0; // 30.72 Ms/s
- else if (N_RB <=100) factor = 1.0; // 30.72 Ms/s
- else AssertFatal(1==0, "Too many PRBS for mu=0\n");
+ factor = fp->samples_per_subframe / 30720.0;
break;
case 1: //30 kHz sc
AssertFatal(N_TA_offset == 400, "scs_common 30kHz only for FR1\n");
- if (N_RB <= 106) factor = 2.0; // 61.44 Ms/s
- else if (N_RB <= 275) factor = 4.0; // 122.88 Ms/s
+ factor = fp->samples_per_subframe / 30720.0;
break;
case 2: //60 kHz scs
AssertFatal(1==0, "scs_common should not be 60 kHz\n");
break;
case 3: //120 kHz scs
AssertFatal(N_TA_offset == 431, "scs_common 120kHz only for FR2\n");
+ factor = fp->samples_per_subframe / 61440.0;
break;
case 4: //240 kHz scs
- AssertFatal(1==0, "scs_common should not be 60 kHz\n");
- if (N_RB <= 32) factor = 1.0; // 61.44 Ms/s
- else if (N_RB <= 66) factor = 2.0; // 122.88 Ms/s
- else AssertFatal(1==0, "N_RB %d is too big for curretn FR2 implementation\n", N_RB);
+ AssertFatal(N_TA_offset == 431, "scs_common 240kHz only for FR2\n");
+ factor = fp->samples_per_subframe / 61440.0;
break;
-
- if (N_RB == 100)
- ue->N_TA_offset = 624;
- else if (N_RB == 50)
- ue->N_TA_offset = 624/2;
- else if (N_RB == 25)
- ue->N_TA_offset = 624/4;
+ default:
+ AssertFatal(1==0, "Invalid scs_common!\n");
}
- if (fp->threequarter_fs == 1)
- factor = factor*.75;
-
ue->N_TA_offset = (int)(N_TA_offset * factor);
- LOG_I(PHY,"UE %d Setting N_TA_offset to %d samples (factor %f, UL Freq %lu, N_RB %d)\n", ue->Mod_id, ue->N_TA_offset, factor, fp->ul_CarrierFreq, N_RB);
+ LOG_I(PHY,"UE %d Setting N_TA_offset to %d samples (factor %f, UL Freq %lu, N_RB %d, mu %d)\n", ue->Mod_id, ue->N_TA_offset, factor, fp->ul_CarrierFreq, fp->N_RB_DL, fp->numerology_index);
}
}
diff --git a/openair1/PHY/INIT/nr_parms.c b/openair1/PHY/INIT/nr_parms.c
index a61a476429..b11e342ab1 100644
--- a/openair1/PHY/INIT/nr_parms.c
+++ b/openair1/PHY/INIT/nr_parms.c
@@ -75,9 +75,8 @@ int nr_get_ssb_start_symbol(NR_DL_FRAME_PARMS *fp)
return symbol;
}
-void set_scs_parameters (NR_DL_FRAME_PARMS *fp, int mu, uint16_t bw)
+void set_scs_parameters (NR_DL_FRAME_PARMS *fp, int mu, int N_RB_DL)
{
-
switch(mu) {
case NR_MU_0: //15kHz scs
@@ -99,108 +98,17 @@ void set_scs_parameters (NR_DL_FRAME_PARMS *fp, int mu, uint16_t bw)
else
AssertFatal(1==0,"NR Operating Band n%d not available for SS block SCS with mu=%d\n", fp->nr_band, mu);
}
-
- switch(bw){
- case 5:
- case 15:
- case 20:
- case 25:
- case 30:
- case 40: //40 MHz
- if (fp->threequarter_fs) {
- fp->ofdm_symbol_size = 1536;
- fp->first_carrier_offset = 900; //1536 - ( (106*12) / 2 )
- fp->nb_prefix_samples0 = 132;
- fp->nb_prefix_samples = 108;
- }
- else {
- fp->ofdm_symbol_size = 2048;
- fp->first_carrier_offset = 1412; //2048 - ( (106*12) / 2 )
- fp->nb_prefix_samples0 = 176;
- fp->nb_prefix_samples = 144;
- }
- break;
-
- case 50:
- case 60:
- case 70:
-
- case 80: //80 MHz
- if (fp->threequarter_fs) {
- fp->ofdm_symbol_size = 3072;
- fp->first_carrier_offset = 1770; //3072 - ( (217*12) / 2 )
- fp->nb_prefix_samples0 = 264;
- fp->nb_prefix_samples = 216;
- }
- else {
- fp->ofdm_symbol_size = 4096;
- fp->first_carrier_offset = 2794; //4096 - ( (217*12) / 2 )
- fp->nb_prefix_samples0 = 352;
- fp->nb_prefix_samples = 288;
- }
- break;
-
- case 90:
- AssertFatal(fp->threequarter_fs==0,"3/4 sampling impossible for %d MHz band and MU %d\n",bw,mu);
- fp->ofdm_symbol_size = 4096;
- fp->first_carrier_offset = 2626; //4096 - ( (245*12) / 2 )
- fp->nb_prefix_samples0 = 352;
- fp->nb_prefix_samples = 288;
- break;
- case 100:
- AssertFatal(fp->threequarter_fs==0,"3/4 sampling impossible for %d MHz band and MU %d\n",bw,mu);
- fp->ofdm_symbol_size = 4096;
- fp->first_carrier_offset = 2458; //4096 - ( (273*12) / 2 )
- fp->nb_prefix_samples0 = 352;
- fp->nb_prefix_samples = 288;
- break;
- default:
- AssertFatal(1==0,"%d MHz band undefined for mu %d, frame parms = %p\n", bw, mu, fp);
- }
break;
case NR_MU_2: //60kHz scs
fp->subcarrier_spacing = nr_subcarrier_spacing[NR_MU_2];
fp->slots_per_subframe = nr_slots_per_subframe[NR_MU_2];
-
- switch(bw){ //FR1 bands only
- case 10:
- case 15:
- case 20:
- case 25:
- case 30:
- case 40:
- case 50:
- case 60:
- case 70:
- case 80:
- case 90:
- case 100:
- default:
- AssertFatal(1==0,"%d MHz band undefined for mu %d, frame parms = %p\n", bw, mu, fp);
- }
break;
case NR_MU_3:
fp->subcarrier_spacing = nr_subcarrier_spacing[NR_MU_3];
fp->slots_per_subframe = nr_slots_per_subframe[NR_MU_3];
fp->ssb_type = nr_ssb_type_D;
- switch(bw){
- case 100:
- fp->ofdm_symbol_size = 1024;
- fp->first_carrier_offset = 628; //1024 - ( (66*12) / 2 )
- fp->nb_prefix_samples0 = 136;
- fp->nb_prefix_samples = 72;
- break;
- case 50:
- fp->ofdm_symbol_size = 512;
- fp->first_carrier_offset = 320; //1024 - ( (66*12) / 2 )
- fp->nb_prefix_samples0 = 68;
- fp->nb_prefix_samples = 36;
- break;
- default:
- AssertFatal(1==0,"%d MHz band undefined for mu %d, frame parms = %p\n", bw, mu, fp);
- }
break;
case NR_MU_4:
@@ -209,9 +117,21 @@ void set_scs_parameters (NR_DL_FRAME_PARMS *fp, int mu, uint16_t bw)
fp->ssb_type = nr_ssb_type_E;
break;
- default:
- AssertFatal(1==0,"Invalid numerology index %d", mu);
+ default:
+ AssertFatal(1==0,"Invalid numerology index %d", mu);
}
+
+ if(fp->threequarter_fs)
+ fp->ofdm_symbol_size = 3 * 128;
+ else
+ fp->ofdm_symbol_size = 4 * 128;
+
+ while(fp->ofdm_symbol_size < N_RB_DL * 12)
+ fp->ofdm_symbol_size <<= 1;
+
+ fp->first_carrier_offset = fp->ofdm_symbol_size - (N_RB_DL * 12 / 2);
+ fp->nb_prefix_samples = fp->ofdm_symbol_size / 128 * 9;
+ fp->nb_prefix_samples0 = fp->ofdm_symbol_size / 128 * (9 + (1 << mu));
}
uint32_t get_samples_per_slot(int slot, NR_DL_FRAME_PARMS* fp)
@@ -280,7 +200,7 @@ int nr_init_frame_parms(nfapi_nr_config_request_scf_t* cfg,
fp->half_frame_bit = 0; // half frame bit initialized to 0 here
fp->numerology_index = mu;
- set_scs_parameters(fp, mu, cfg->carrier_config.dl_bandwidth.value);
+ set_scs_parameters(fp, mu, fp->N_RB_DL);
fp->slots_per_frame = 10* fp->slots_per_subframe;
@@ -378,7 +298,7 @@ int nr_init_frame_parms_ue(NR_DL_FRAME_PARMS *fp,
fp->Ncp = Ncp;
- set_scs_parameters(fp,fp->numerology_index,config->carrier_config.dl_bandwidth);
+ set_scs_parameters(fp, fp->numerology_index, fp->N_RB_DL);
fp->slots_per_frame = 10* fp->slots_per_subframe;
fp->symbols_per_slot = ((Ncp == NORMAL)? 14 : 12); // to redefine for different slot formats
diff --git a/openair1/PHY/MODULATION/modulation_UE.h b/openair1/PHY/MODULATION/modulation_UE.h
index 72a1334fe9..20fdaa7ad8 100644
--- a/openair1/PHY/MODULATION/modulation_UE.h
+++ b/openair1/PHY/MODULATION/modulation_UE.h
@@ -51,16 +51,13 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue,
int nr_slot_fep(PHY_VARS_NR_UE *phy_vars_ue,
UE_nr_rxtx_proc_t *proc,
unsigned char l,
- unsigned char Ns,
- int sample_offset,
- int no_prefix);
+ unsigned char Ns);
int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc,
unsigned char symbol,
unsigned char Ns,
- int sample_offset,
- int no_prefix);
+ int sample_offset);
int slot_fep_mbsfn(PHY_VARS_UE *phy_vars_ue,
unsigned char l,
diff --git a/openair1/PHY/MODULATION/nr_modulation.h b/openair1/PHY/MODULATION/nr_modulation.h
index 9c80b35718..547d20952f 100644
--- a/openair1/PHY/MODULATION/nr_modulation.h
+++ b/openair1/PHY/MODULATION/nr_modulation.h
@@ -80,7 +80,6 @@ void nr_ue_layer_mapping(NR_UE_ULSCH_t **ulsch_ue,
\param symbol symbol within slot (0..12/14)
\param Ns Slot number (0..19)
\param sample_offset offset within rxdata (points to beginning of subframe)
-\param no_prefix if 1 prefix is removed by HW
*/
int nr_slot_fep_ul(NR_DL_FRAME_PARMS *frame_parms,
@@ -88,8 +87,7 @@ int nr_slot_fep_ul(NR_DL_FRAME_PARMS *frame_parms,
int32_t *rxdataF,
unsigned char symbol,
unsigned char Ns,
- int sample_offset,
- int no_prefix);
+ int sample_offset);
/*!
\brief This function implements the dft transform precoding in PUSCH
diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c
index 7b5ddb230a..0be635ba0b 100644
--- a/openair1/PHY/MODULATION/slot_fep_nr.c
+++ b/openair1/PHY/MODULATION/slot_fep_nr.c
@@ -29,362 +29,227 @@
//#define DEBUG_FEP
-#define SOFFSET 0
-
/*#ifdef LOG_I
#undef LOG_I
#define LOG_I(A,B...) printf(A)
#endif*/
-int nr_slot_fep(PHY_VARS_NR_UE *ue,
- UE_nr_rxtx_proc_t *proc,
- unsigned char symbol,
- unsigned char Ns,
- int sample_offset,
- int no_prefix)
+dft_size_idx_t get_dft_size_idx(uint16_t ofdm_symbol_size)
{
- NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
- NR_UE_COMMON *common_vars = &ue->common_vars;
- unsigned char aa;
- unsigned int nb_prefix_samples;
- unsigned int nb_prefix_samples0;
- unsigned int abs_symbol;
- if (ue->is_synchronized) {
- nb_prefix_samples = (no_prefix ? 0 : frame_parms->nb_prefix_samples);
- nb_prefix_samples0 = (no_prefix ? 0 : frame_parms->nb_prefix_samples0);
- }
- else {
- nb_prefix_samples = (no_prefix ? 0 : frame_parms->nb_prefix_samples);
- nb_prefix_samples0 = (no_prefix ? 0 : frame_parms->nb_prefix_samples);
- }
- //unsigned int subframe_offset;//,subframe_offset_F;
- unsigned int slot_offset;
- //int i;
- unsigned int frame_length_samples = frame_parms->samples_per_subframe * 10;
- unsigned int rx_offset;
-
-
- dft_size_idx_t dftsize;
- int tmp_dft_in[8192] __attribute__ ((aligned (32))); // This is for misalignment issues for 6 and 15 PRBs
-
- switch (frame_parms->ofdm_symbol_size) {
+ switch (ofdm_symbol_size) {
case 128:
- dftsize = DFT_128;
- break;
+ return DFT_128;
case 256:
- dftsize = DFT_256;
- break;
+ return DFT_256;
case 512:
- dftsize = DFT_512;
- break;
+ return DFT_512;
case 1024:
- dftsize = DFT_1024;
- break;
+ return DFT_1024;
case 1536:
- dftsize = DFT_1536;
- break;
+ return DFT_1536;
case 2048:
- dftsize = DFT_2048;
- break;
+ return DFT_2048;
case 3072:
- dftsize = DFT_3072;
- break;
+ return DFT_3072;
case 4096:
- dftsize = DFT_4096;
- break;
+ return DFT_4096;
+
+ case 6144:
+ return DFT_6144;
case 8192:
- dftsize = DFT_8192;
- break;
+ return DFT_8192;
default:
printf("unsupported ofdm symbol size \n");
assert(0);
}
- if (no_prefix) {
- slot_offset = frame_parms->ofdm_symbol_size * (frame_parms->symbols_per_slot) * (Ns);
+ return DFT_SIZE_IDXTABLESIZE;
+}
+
+int nr_slot_fep(PHY_VARS_NR_UE *ue,
+ UE_nr_rxtx_proc_t *proc,
+ unsigned char symbol,
+ unsigned char Ns)
+{
+ NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
+ NR_UE_COMMON *common_vars = &ue->common_vars;
+
+ AssertFatal(symbol < frame_parms->symbols_per_slot, "slot_fep: symbol must be between 0 and %d\n", frame_parms->symbols_per_slot-1);
+ AssertFatal(Ns < frame_parms->slots_per_frame, "slot_fep: Ns must be between 0 and %d\n", frame_parms->slots_per_frame-1);
+
+ unsigned int nb_prefix_samples;
+ unsigned int nb_prefix_samples0;
+ if (ue->is_synchronized) {
+ nb_prefix_samples = frame_parms->nb_prefix_samples;
+ nb_prefix_samples0 = frame_parms->nb_prefix_samples0;
} else {
- slot_offset = frame_parms->get_samples_slot_timestamp(Ns,frame_parms,0);
+ nb_prefix_samples = frame_parms->nb_prefix_samples;
+ nb_prefix_samples0 = frame_parms->nb_prefix_samples;
}
- /*if (l<0 || l>=7-frame_parms->Ncp) {
- printf("slot_fep: l must be between 0 and %d\n",7-frame_parms->Ncp);
- return(-1);
- }*/
+ dft_size_idx_t dftsize = get_dft_size_idx(frame_parms->ofdm_symbol_size);
+ // This is for misalignment issues
+ int32_t tmp_dft_in[8192] __attribute__ ((aligned (32)));
- if (Ns<0 || Ns>(frame_parms->slots_per_frame-1)) {
- printf("slot_fep: Ns must be between 0 and %d\n",frame_parms->slots_per_frame-1);
- return(-1);
- }
+ unsigned int rx_offset = frame_parms->get_samples_slot_timestamp(Ns,frame_parms,0);
+ unsigned int abs_symbol = Ns * frame_parms->symbols_per_slot + symbol;
+ for (int idx_symb = Ns*frame_parms->symbols_per_slot; idx_symb <= abs_symbol; idx_symb++)
+ rx_offset += (idx_symb%(0x7<numerology_index)) ? nb_prefix_samples : nb_prefix_samples0;
+ rx_offset += frame_parms->ofdm_symbol_size * symbol;
- for (aa=0; aanb_antennas_rx; aa++) {
- memset(&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int));
-
- rx_offset = sample_offset + slot_offset - SOFFSET;
- // Align with 256 bit
- // rx_offset = rx_offset&0xfffffff8;
+ // use OFDM symbol from within 1/8th of the CP to avoid ISI
+ rx_offset -= nb_prefix_samples / 8;
#ifdef DEBUG_FEP
- // if (ue->frame <100)
- /*LOG_I(PHY,*/printf("slot_fep: slot %d, symbol %d, nb_prefix_samples %u, nb_prefix_samples0 %u, slot_offset %u, sample_offset %d,rx_offset %u, frame_length_samples %u\n",
- Ns, symbol, nb_prefix_samples, nb_prefix_samples0, slot_offset, sample_offset, rx_offset, frame_length_samples);
+ // if (ue->frame <100)
+ printf("slot_fep: slot %d, symbol %d, nb_prefix_samples %u, nb_prefix_samples0 %u, rx_offset %u\n",
+ Ns, symbol, nb_prefix_samples, nb_prefix_samples0, rx_offset);
#endif
- abs_symbol = Ns * frame_parms->symbols_per_slot + symbol;
-
- for (int idx_symb = Ns*frame_parms->symbols_per_slot; idx_symb < abs_symbol; idx_symb++)
- rx_offset += (idx_symb%(0x7<numerology_index)) ? nb_prefix_samples : nb_prefix_samples0;
+ for (unsigned char aa=0; aanb_antennas_rx; aa++) {
+ memset(&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int32_t));
- rx_offset += frame_parms->ofdm_symbol_size * symbol;
-
- if (abs_symbol%(0x7<numerology_index)) {
-
- rx_offset += nb_prefix_samples;
- if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size))
- memcpy((short*) &common_vars->rxdata[aa][frame_length_samples],
- (short*) &common_vars->rxdata[aa][0],
- frame_parms->ofdm_symbol_size*sizeof(int));
-
- if ((rx_offset&7)!=0) { // if input to dft is not 256-bit aligned, issue for size 6,15 and 25 PRBs
- memcpy((void *)tmp_dft_in,
- (void *) &common_vars->rxdata[aa][rx_offset % frame_length_samples],
- frame_parms->ofdm_symbol_size*sizeof(int));
- dft(dftsize,(int16_t *)tmp_dft_in,
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
- } else { // use dft input from RX buffer directly
-#if UE_TIMING_TRACE
- start_meas(&ue->rx_dft_stats);
-#endif
-
- dft(dftsize,(int16_t *) &common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
-#if UE_TIMING_TRACE
- stop_meas(&ue->rx_dft_stats);
-#endif
- }
- } else {
-
- rx_offset += nb_prefix_samples0;
- if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size))
- memcpy((void *) &common_vars->rxdata[aa][frame_length_samples],
- (void *) &common_vars->rxdata[aa][0],
- frame_parms->ofdm_symbol_size*sizeof(int));
-#if UE_TIMING_TRACE
- start_meas(&ue->rx_dft_stats);
-#endif
-
- if ((rx_offset&7)!=0) { // if input to dft is not 128-bit aligned, issue for size 6 and 15 PRBs
- memcpy((void *)tmp_dft_in,
- (void *) &common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
- frame_parms->ofdm_symbol_size*sizeof(int));
- dft(dftsize,(int16_t *)tmp_dft_in,
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
- } else { // use dft input from RX buffer directly
-
- dft(dftsize,(int16_t *) &common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
- }
-#if UE_TIMING_TRACE
- stop_meas(&ue->rx_dft_stats);
-#endif
+ int16_t *rxdata_ptr = (int16_t *)&common_vars->rxdata[aa][rx_offset];
+ // if input to dft is not 256-bit aligned
+ if ((rx_offset & 7) != 0) {
+ memcpy((void *)&tmp_dft_in[0],
+ (void *)&common_vars->rxdata[aa][rx_offset],
+ frame_parms->ofdm_symbol_size * sizeof(int32_t));
+ rxdata_ptr = (int16_t *)tmp_dft_in;
}
+#if UE_TIMING_TRACE
+ start_meas(&ue->rx_dft_stats);
+#endif
+
+ dft(dftsize,
+ rxdata_ptr,
+ (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
+ 1);
+
+#if UE_TIMING_TRACE
+ stop_meas(&ue->rx_dft_stats);
+#endif
+
+ int symb_offset = (Ns%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
+ int32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation[0])[symbol+symb_offset];
+ ((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1];
+
#ifdef DEBUG_FEP
// if (ue->frame <100)
- printf("slot_fep: symbol %d rx_offset %u\n", symbol, rx_offset);
+ printf("slot_fep: slot %d, symbol %d rx_offset %u, rotation symbol %d %d.%d\n", Ns,symbol, rx_offset,
+ symbol+symb_offset,((int16_t*)&rot2)[0],((int16_t*)&rot2)[1]);
#endif
-
- int symb_offset = (Ns%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
- int32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation[0])[symbol + symb_offset];
- ((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1];
+
rotate_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
(int16_t*)&rot2,
(int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
frame_parms->ofdm_symbol_size,
15);
-
}
-
#ifdef DEBUG_FEP
printf("slot_fep: done\n");
#endif
- return(0);
+
+ return 0;
}
int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc,
unsigned char symbol,
unsigned char Ns,
- int sample_offset,
- int no_prefix)
+ int sample_offset)
{
NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
NR_UE_COMMON *common_vars = &ue->common_vars;
- unsigned char aa;
+
+ AssertFatal(symbol < frame_parms->symbols_per_slot, "slot_fep: symbol must be between 0 and %d\n", frame_parms->symbols_per_slot-1);
+ AssertFatal(Ns < frame_parms->slots_per_frame, "slot_fep: Ns must be between 0 and %d\n", frame_parms->slots_per_frame-1);
+
unsigned int nb_prefix_samples;
unsigned int nb_prefix_samples0;
- unsigned int abs_symbol;
if (ue->is_synchronized) {
- nb_prefix_samples = (no_prefix ? 0 : frame_parms->nb_prefix_samples);
- nb_prefix_samples0 = (no_prefix ? 0 : frame_parms->nb_prefix_samples0);
+ nb_prefix_samples = frame_parms->nb_prefix_samples;
+ nb_prefix_samples0 = frame_parms->nb_prefix_samples0;
}
else {
- nb_prefix_samples = (no_prefix ? 0 : frame_parms->nb_prefix_samples);
- nb_prefix_samples0 = (no_prefix ? 0 : frame_parms->nb_prefix_samples);
+ nb_prefix_samples = frame_parms->nb_prefix_samples;
+ nb_prefix_samples0 = frame_parms->nb_prefix_samples;
}
- //unsigned int subframe_offset;//,subframe_offset_F;
- unsigned int slot_offset;
- //int i;
- unsigned int frame_length_samples = frame_parms->samples_per_subframe * 10;
- unsigned int rx_offset;
+ unsigned int frame_length_samples = frame_parms->samples_per_frame;
+ dft_size_idx_t dftsize = get_dft_size_idx(frame_parms->ofdm_symbol_size);
+ // This is for misalignment issues
+ int32_t tmp_dft_in[8192] __attribute__ ((aligned (32)));
- dft_size_idx_t dftsize;
- int tmp_dft_in[8192] __attribute__ ((aligned (32))); // This is for misalignment issues for 6 and 15 PRBs
-
- switch (frame_parms->ofdm_symbol_size) {
- case 128:
- dftsize = DFT_128;
- break;
-
- case 256:
- dftsize = DFT_256;
- break;
-
- case 512:
- dftsize = DFT_512;
- break;
-
- case 1024:
- dftsize = DFT_1024;
- break;
-
- case 1536:
- dftsize = DFT_1536;
- break;
-
- case 2048:
- dftsize = DFT_2048;
- break;
-
- case 3072:
- dftsize = DFT_3072;
- break;
-
- case 4096:
- dftsize = DFT_4096;
- break;
-
- case 8192:
- dftsize = DFT_8192;
- break;
-
- default:
- printf("unsupported ofdm symbol size \n");
- assert(0);
- }
-
- if (no_prefix) {
- slot_offset = frame_parms->ofdm_symbol_size * (frame_parms->symbols_per_slot) * (Ns);
- } else {
- slot_offset = frame_parms->get_samples_slot_timestamp(Ns,frame_parms,0);
- }
-
- /*if (l<0 || l>=7-frame_parms->Ncp) {
- printf("slot_fep: l must be between 0 and %d\n",7-frame_parms->Ncp);
- return(-1);
- }*/
-
- if (Ns<0 || Ns>(frame_parms->slots_per_frame-1)) {
- printf("slot_fep: Ns must be between 0 and %d\n",frame_parms->slots_per_frame-1);
- return(-1);
- }
-
- for (aa=0; aanb_antennas_rx; aa++) {
- memset(&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int));
-
- rx_offset = sample_offset + slot_offset - SOFFSET;
- // Align with 256 bit
- // rx_offset = rx_offset&0xfffffff8;
+ unsigned int slot_offset = frame_parms->get_samples_slot_timestamp(Ns,frame_parms,0);
+ unsigned int rx_offset = sample_offset + slot_offset;
+ unsigned int abs_symbol = Ns * frame_parms->symbols_per_slot + symbol;
+ for (int idx_symb = Ns*frame_parms->symbols_per_slot; idx_symb <= abs_symbol; idx_symb++)
+ rx_offset += (abs_symbol%(0x7<numerology_index)) ? nb_prefix_samples : nb_prefix_samples0;
+ rx_offset += frame_parms->ofdm_symbol_size * symbol;
#ifdef DEBUG_FEP
- // if (ue->frame <100)
- /*LOG_I(PHY,*/printf("slot_fep: slot %d, symbol %d, nb_prefix_samples %u, nb_prefix_samples0 %u, slot_offset %u, sample_offset %d,rx_offset %u, frame_length_samples %u\n",
- Ns, symbol, nb_prefix_samples, nb_prefix_samples0, slot_offset, sample_offset, rx_offset, frame_length_samples);
+ // if (ue->frame <100)
+ printf("slot_fep: slot %d, symbol %d, nb_prefix_samples %u, nb_prefix_samples0 %u, slot_offset %u, sample_offset %d,rx_offset %u, frame_length_samples %u\n",
+ Ns, symbol, nb_prefix_samples, nb_prefix_samples0, slot_offset, sample_offset, rx_offset, frame_length_samples);
#endif
- abs_symbol = Ns * frame_parms->symbols_per_slot + symbol;
-
- for (int idx_symb = Ns*frame_parms->symbols_per_slot; idx_symb < abs_symbol; idx_symb++)
- rx_offset += (abs_symbol%(0x7<numerology_index)) ? nb_prefix_samples : nb_prefix_samples0;
+ for (unsigned char aa=0; aanb_antennas_rx; aa++) {
+ memset(&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int32_t));
- rx_offset += frame_parms->ofdm_symbol_size * symbol;
+ int16_t *rxdata_ptr;
- if (abs_symbol%(0x7<numerology_index)) {
+ if (frame_length_samples - rx_offset < frame_parms->ofdm_symbol_size) {
- rx_offset += nb_prefix_samples;
- if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size))
- memcpy((short*) &common_vars->rxdata[aa][frame_length_samples],
- (short*) &common_vars->rxdata[aa][0],
- frame_parms->ofdm_symbol_size*sizeof(int));
+ memcpy((void *)&tmp_dft_in[0],
+ (void *)&common_vars->rxdata[aa][rx_offset],
+ (frame_length_samples - rx_offset) * sizeof(int32_t));
+ memcpy((void *)&tmp_dft_in[frame_length_samples - rx_offset],
+ (void *)&common_vars->rxdata[aa][0],
+ (frame_parms->ofdm_symbol_size - (frame_length_samples - rx_offset)) * sizeof(int32_t));
+ rxdata_ptr = (int16_t *)&tmp_dft_in[0];
- if ((rx_offset&7)!=0) { // if input to dft is not 256-bit aligned, issue for size 6,15 and 25 PRBs
- memcpy((void *)tmp_dft_in,
- (void *) &common_vars->rxdata[aa][rx_offset],
- frame_parms->ofdm_symbol_size*sizeof(int));
- dft(dftsize,(int16_t *)tmp_dft_in,
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
- } else { // use dft input from RX buffer directly
-#if UE_TIMING_TRACE
- start_meas(&ue->rx_dft_stats);
-#endif
+ } else if ((rx_offset & 7) != 0) {
+ // if input to dft is not 256-bit aligned
+ memcpy((void *)&tmp_dft_in[0],
+ (void *)&common_vars->rxdata[aa][rx_offset],
+ frame_parms->ofdm_symbol_size * sizeof(int32_t));
+ rxdata_ptr = (int16_t *)&tmp_dft_in[0];
- dft(dftsize,(int16_t *) &common_vars->rxdata[aa][rx_offset],
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
-#if UE_TIMING_TRACE
- stop_meas(&ue->rx_dft_stats);
-#endif
- }
} else {
- rx_offset += nb_prefix_samples0;
- if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size))
- memcpy((void *) &common_vars->rxdata[aa][frame_length_samples],
- (void *) &common_vars->rxdata[aa][0],
- frame_parms->ofdm_symbol_size*sizeof(int));
-#if UE_TIMING_TRACE
- start_meas(&ue->rx_dft_stats);
-#endif
-
- if ((rx_offset&7)!=0) { // if input to dft is not 128-bit aligned, issue for size 6 and 15 PRBs
- memcpy((void *)tmp_dft_in,
- (void *) &common_vars->rxdata[aa][rx_offset],
- frame_parms->ofdm_symbol_size*sizeof(int));
- dft(dftsize,(int16_t *)tmp_dft_in,
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
- } else { // use dft input from RX buffer directly
- dft(dftsize,(int16_t *) &common_vars->rxdata[aa][rx_offset],
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
- }
-#if UE_TIMING_TRACE
- stop_meas(&ue->rx_dft_stats);
-#endif
-
+ // use dft input from RX buffer directly
+ rxdata_ptr = (int16_t *)&common_vars->rxdata[aa][rx_offset];
}
+#if UE_TIMING_TRACE
+ start_meas(&ue->rx_dft_stats);
+#endif
+
+ dft(dftsize,
+ rxdata_ptr,
+ (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
+ 1);
+
+#if UE_TIMING_TRACE
+ stop_meas(&ue->rx_dft_stats);
+#endif
+
int symb_offset = (Ns%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
int32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation[0])[symbol + symb_offset];
((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1];
@@ -400,14 +265,13 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
(int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
frame_parms->ofdm_symbol_size,
15);
-
}
-
#ifdef DEBUG_FEP
printf("slot_fep: done\n");
#endif
- return(0);
+
+ return 0;
}
@@ -416,89 +280,60 @@ int nr_slot_fep_ul(NR_DL_FRAME_PARMS *frame_parms,
int32_t *rxdataF,
unsigned char symbol,
unsigned char Ns,
- int sample_offset,
- int no_prefix)
+ int sample_offset)
{
- int32_t slot_offset, rxdata_offset;
-
- unsigned int nb_prefix_samples = (no_prefix ? 0 : frame_parms->nb_prefix_samples);
- unsigned int nb_prefix_samples0 = (no_prefix ? 0 : frame_parms->nb_prefix_samples0);
+ unsigned int nb_prefix_samples = frame_parms->nb_prefix_samples;
+ unsigned int nb_prefix_samples0 = frame_parms->nb_prefix_samples0;
- int tmp_dft_in[8192] __attribute__ ((aligned (32)));
+ dft_size_idx_t dftsize = get_dft_size_idx(frame_parms->ofdm_symbol_size);
+ // This is for misalignment issues
+ int32_t tmp_dft_in[8192] __attribute__ ((aligned (32)));
- dft_size_idx_t dftsize;
+ unsigned int slot_offset = frame_parms->get_samples_slot_timestamp(Ns,frame_parms,0);
- switch (frame_parms->ofdm_symbol_size) {
- case 128:
- dftsize = DFT_128;
- break;
+ // offset of first OFDM symbol
+ int32_t rxdata_offset = slot_offset + nb_prefix_samples0;
+ // offset of n-th OFDM symbol
+ rxdata_offset += symbol * (frame_parms->ofdm_symbol_size + nb_prefix_samples);
+ // use OFDM symbol from within 1/8th of the CP to avoid ISI
+ rxdata_offset -= nb_prefix_samples / 8;
- case 256:
- dftsize = DFT_256;
- break;
+ int16_t *rxdata_ptr;
- case 512:
- dftsize = DFT_512;
- break;
+ if(sample_offset > rxdata_offset) {
- case 1024:
- dftsize = DFT_1024;
- break;
+ memcpy((void *)&tmp_dft_in[0],
+ (void *)&rxdata[frame_parms->samples_per_frame - sample_offset + rxdata_offset],
+ (sample_offset - rxdata_offset) * sizeof(int32_t));
+ memcpy((void *)&tmp_dft_in[sample_offset - rxdata_offset],
+ (void *)&rxdata[0],
+ (frame_parms->ofdm_symbol_size - sample_offset + rxdata_offset) * sizeof(int32_t));
+ rxdata_ptr = (int16_t *)&tmp_dft_in[0];
- case 1536:
- dftsize = DFT_1536;
- break;
+ } else if (((rxdata_offset - sample_offset) & 7) != 0) {
- case 2048:
- dftsize = DFT_2048;
- break;
+ // if input to dft is not 256-bit aligned
+ memcpy((void *)&tmp_dft_in[0],
+ (void *)&rxdata[rxdata_offset - sample_offset],
+ (frame_parms->ofdm_symbol_size) * sizeof(int32_t));
+ rxdata_ptr = (int16_t *)&tmp_dft_in[0];
- case 4096:
- dftsize = DFT_4096;
- break;
+ } else {
- case 8192:
- dftsize = DFT_8192;
- break;
+ // use dft input from RX buffer directly
+ rxdata_ptr = (int16_t *)&rxdata[rxdata_offset - sample_offset];
- default:
- dftsize = DFT_512;
- break;
}
-
- slot_offset = frame_parms->get_samples_slot_timestamp(Ns,frame_parms,0);
- if(symbol == 0)
- rxdata_offset = slot_offset + nb_prefix_samples0 - SOFFSET;
- else
- rxdata_offset = slot_offset + nb_prefix_samples0 + (symbol * (frame_parms->ofdm_symbol_size + nb_prefix_samples)) - SOFFSET;
-
- if(sample_offset>rxdata_offset) {
- memcpy1((void *)tmp_dft_in,
- (void *) &rxdata[frame_parms->samples_per_frame-sample_offset+rxdata_offset],
- (sample_offset-rxdata_offset)*sizeof(int));
-
- memcpy1((void *)&tmp_dft_in[sample_offset-rxdata_offset],
- (void *) &rxdata[0],
- (frame_parms->ofdm_symbol_size-sample_offset+rxdata_offset)*sizeof(int));
-
- dft(dftsize,(int16_t *)&tmp_dft_in,
- (int16_t *)&rxdataF[symbol * frame_parms->ofdm_symbol_size], 1);
- }
- else {
- //dft(dftsize,(int16_t *)&rxdata[rxdata_offset-sample_offset],
- // (int16_t *)&rxdataF[symbol * frame_parms->ofdm_symbol_size], 1);
- memcpy((void *)tmp_dft_in,
- (void *) &rxdata[rxdata_offset-sample_offset],
- (frame_parms->ofdm_symbol_size)*sizeof(int));
- dft(dftsize,(int16_t *)&tmp_dft_in,
- (int16_t *)&rxdataF[symbol * frame_parms->ofdm_symbol_size], 1);
- }
+ dft(dftsize,
+ rxdata_ptr,
+ (int16_t *)&rxdataF[symbol * frame_parms->ofdm_symbol_size],
+ 1);
// clear DC carrier from OFDM symbols
rxdataF[symbol * frame_parms->ofdm_symbol_size] = 0;
- return(0);
+ return 0;
}
void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms,
diff --git a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
index ec55eabf31..a54aec7bc2 100644
--- a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
+++ b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
@@ -37,22 +37,20 @@
int nr_est_timing_advance_pusch(PHY_VARS_gNB* gNB, int UE_id)
{
- int temp, i, aa, max_pos = 0, max_val = 0;
- short Re, Im;
- uint8_t cyclic_shift = 0;
+ int i, aa, max_pos = 0, max_val = 0;
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
NR_gNB_PUSCH *gNB_pusch_vars = gNB->pusch_vars[UE_id];
int32_t **ul_ch_estimates_time = gNB_pusch_vars->ul_ch_estimates_time;
- int sync_pos = (frame_parms->ofdm_symbol_size - cyclic_shift*frame_parms->ofdm_symbol_size/12) % (frame_parms->ofdm_symbol_size);
+ int sync_pos = frame_parms->nb_prefix_samples / 8;
for (i = 0; i < frame_parms->ofdm_symbol_size; i++) {
- temp = 0;
+ int temp = 0;
for (aa = 0; aa < frame_parms->nb_antennas_rx; aa++) {
- Re = ((int16_t*)ul_ch_estimates_time[aa])[(i<<1)];
- Im = ((int16_t*)ul_ch_estimates_time[aa])[1+(i<<1)];
+ short Re = ((int16_t*)ul_ch_estimates_time[aa])[(i<<1)];
+ short Im = ((int16_t*)ul_ch_estimates_time[aa])[1+(i<<1)];
temp += (Re*Re/2) + (Im*Im/2);
}
diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach.c b/openair1/PHY/NR_TRANSPORT/nr_prach.c
index b5a3c061e9..64b14091d6 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_prach.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_prach.c
@@ -301,205 +301,300 @@ void rx_nr_prach_ru(RU_t *ru,
// do DFT
if (mu==1) {
- if (fp->N_RB_UL <= 100)
- AssertFatal(1==0,"N_RB_UL %d not support for NR PRACH yet\n",fp->N_RB_UL);
- else if (fp->N_RB_UL < 137) {
- if (fp->threequarter_fs==0) {
- //40 MHz @ 61.44 Ms/s
- //50 MHz @ 61.44 Ms/s
- prach2 = prach[aa] + (Ncp<<2); // Ncp is for 30.72 Ms/s, so multiply by 2 for I/Q, and 2 to bring to 61.44 Ms/s
- if (prach_sequence_length == 0) {
- if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
- dftlen=49152;
- dft(DFT_49152,prach2,rxsigF[aa],1);
+ switch(fp->samples_per_subframe) {
+ case 15360:
+ // 10, 15 MHz @ 15.36 Ms/s
+ prach2 = prach[aa] + (1*Ncp); // Ncp is for 30.72 Ms/s, so divide by 2 to bring to 15.36 Ms/s and multiply by 2 for I/Q
+ if (prach_sequence_length == 0) {
+ if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
+ dftlen=12288;
+ dft(DFT_12288,prach2,rxsigF[aa],1);
+ }
+ if (prachFormat == 1 || prachFormat == 2) {
+ dft(DFT_12288,prach2+24576,rxsigF[aa]+24576,1);
+ reps++;
+ }
+ if (prachFormat == 2) {
+ dft(DFT_12288,prach2+(24576*2),rxsigF[aa]+(24576*2),1);
+ dft(DFT_12288,prach2+(24576*3),rxsigF[aa]+(24576*3),1);
+ reps+=2;
+ }
+ if (prachFormat == 3) {
+ dftlen=3072;
+ for (int i=0;i<4;i++) dft(DFT_3072,prach2+(i*3072*2),rxsigF[aa]+(i*3072*2),1);
+ reps=4;
+ }
+ } else { // 839 sequence
+ if (prachStartSymbol == 0) prach2+=16; // 8 samples @ 15.36 Ms/s in first symbol of each half subframe (15/30 kHz only)
+
+ dftlen=512;
+ dft(DFT_512,prach2,rxsigF[aa],1);
+ if (prachFormat != 9/*C0*/) {
+ dft(DFT_512,prach2+1024,rxsigF[aa]+1024,1);
+ reps++;
+ }
+ if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
+ dft(DFT_512,prach2+1024*2,rxsigF[aa]+1024*2,1);
+ dft(DFT_512,prach2+1024*3,rxsigF[aa]+1024*3,1);
+ reps+=2;
+ }
+ if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
+ dft(DFT_512,prach2+1024*4,rxsigF[aa]+1024*4,1);
+ dft(DFT_512,prach2+1024*5,rxsigF[aa]+1024*5,1);
+ reps+=2;
+ }
+ if (prachFormat == 8/*B4*/) {
+ for (int i=6;i<12;i++) dft(DFT_512,prach2+(1024*i),rxsigF[aa]+(1024*i),1);
+ reps+=6;
+ }
}
- if (prachFormat == 1 || prachFormat == 2) {
- dft(DFT_49152,prach2+98304,rxsigF[aa]+98304,1);
- reps++;
- }
- if (prachFormat == 2) {
- dft(DFT_49152,prach2+(98304*2),rxsigF[aa]+(98304*2),1);
- dft(DFT_49152,prach2+(98304*3),rxsigF[aa]+(98304*3),1);
- reps+=2;
- }
- if (prachFormat == 3) {
- dftlen=12288;
- for (int i=0;i<4;i++) dft(DFT_12288,prach2+(i*12288*2),rxsigF[aa]+(i*12288*2),1);
- reps=4;
- }
- }// 839 sequence
- else {
- if (prachStartSymbol == 0)
- prach2+=64; // 32 samples @ 61.44 Ms/s in first symbol of each half subframe (15/30 kHz only)
+ break;
- dftlen=2048;
- dft(DFT_2048,prach2,rxsigF[aa],1);
- if (prachFormat != 9/*C0*/) {
- dft(DFT_2048,prach2+4096,rxsigF[aa]+4096,1);
- reps++;
- }
- if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
- dft(DFT_2048,prach2+4096*2,rxsigF[aa]+4096*2,1);
- dft(DFT_2048,prach2+4096*3,rxsigF[aa]+4096*3,1);
- reps+=2;
- }
- if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
- dft(DFT_2048,prach2+4096*4,rxsigF[aa]+4096*4,1);
- dft(DFT_2048,prach2+4096*5,rxsigF[aa]+4096*5,1);
- reps+=2;
- }
- if (prachFormat == 8/*B4*/) {
- for (int i=6;i<12;i++) dft(DFT_2048,prach2+(4096*i),rxsigF[aa]+(4096*i),1);
- reps+=6;
- }
- }
- } else { // threequarter sampling
- // 40 MHz @ 46.08 Ms/s
- prach2 = prach[aa] + (3*Ncp); // 46.08 is 1.5 * 30.72, times 2 for I/Q
- if (prach_sequence_length == 0) {
- AssertFatal(fp->N_RB_UL <= 107,"cannot do 108..136 PRBs with 3/4 sampling\n");
- if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
- dftlen=36864;
- dft(DFT_36864,prach2,rxsigF[aa],1);
- reps++;
- }
- if (prachFormat == 1 || prachFormat == 2) {
- dft(DFT_36864,prach2+73728,rxsigF[aa]+73728,1);
- reps++;
- }
- if (prachFormat == 2) {
- dft(DFT_36864,prach2+(73728*2),rxsigF[aa]+(73728*2),1);
- dft(DFT_36864,prach2+(73728*3),rxsigF[aa]+(73728*3),1);
- reps+=2;
- }
- if (prachFormat == 3) {
- dftlen=9216;
- for (int i=0;i<4;i++) dft(DFT_9216,prach2+(i*9216*2),rxsigF[aa]+(i*9216*2),1);
- reps=4;
- }
- } else {
- if (prachStartSymbol == 0) prach2+=48; // 24 samples @ 46.08 Ms/s in first symbol of each half subframe (15/30 kHz only)
- dftlen=1536;
- dft(DFT_1536,prach2,rxsigF[aa],1);
- if (prachFormat != 9/*C0*/) {
- dft(DFT_1536,prach2+3072,rxsigF[aa]+3072,1);
- reps++;
- }
-
- if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
- dft(DFT_1536,prach2+3072*2,rxsigF[aa]+3072*2,1);
- dft(DFT_1536,prach2+3072*3,rxsigF[aa]+3072*3,1);
- reps+=2;
- }
- if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
- dft(DFT_1536,prach2+3072*4,rxsigF[aa]+3072*4,1);
- dft(DFT_1536,prach2+3072*5,rxsigF[aa]+3072*5,1);
- reps+=2;
- }
- if (prachFormat == 8/*B4*/) {
- for (int i=6;i<12;i++) dft(DFT_1536,prach2+(3072*i),rxsigF[aa]+(3072*i),1);
- reps+=6;
- }
- } // short format
- } // 3/4 sampling
- } // <=50 MHz BW
- else if (fp->N_RB_UL <= 273) {
- if (fp->threequarter_fs==0) {
- prach2 = prach[aa] + (Ncp<<3);
- //80,90,100 MHz @ 122.88 Ms/s
+ case 30720:
+ // 20, 25, 30 MHz @ 30.72 Ms/s
+ prach2 = prach[aa] + (2*Ncp); // Ncp is for 30.72 Ms/s, so just multiply by 2 for I/Q
+ if (prach_sequence_length == 0) {
+ if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
+ dftlen=24576;
+ dft(DFT_24576,prach2,rxsigF[aa],1);
+ }
+ if (prachFormat == 1 || prachFormat == 2) {
+ dft(DFT_24576,prach2+49152,rxsigF[aa]+49152,1);
+ reps++;
+ }
+ if (prachFormat == 2) {
+ dft(DFT_24576,prach2+(49152*2),rxsigF[aa]+(49152*2),1);
+ dft(DFT_24576,prach2+(49152*3),rxsigF[aa]+(49152*3),1);
+ reps+=2;
+ }
+ if (prachFormat == 3) {
+ dftlen=6144;
+ for (int i=0;i<4;i++) dft(DFT_6144,prach2+(i*6144*2),rxsigF[aa]+(i*6144*2),1);
+ reps=4;
+ }
+ } else { // 839 sequence
+ if (prachStartSymbol == 0) prach2+=32; // 16 samples @ 30.72 Ms/s in first symbol of each half subframe (15/30 kHz only)
- if (prach_sequence_length == 0) {
- if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
- dftlen=98304;
- dft(DFT_98304,prach2,rxsigF[aa],1);
+ dftlen=1024;
+ dft(DFT_1024,prach2,rxsigF[aa],1);
+ if (prachFormat != 9/*C0*/) {
+ dft(DFT_1024,prach2+2048,rxsigF[aa]+2048,1);
+ reps++;
+ }
+ if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
+ dft(DFT_1024,prach2+2048*2,rxsigF[aa]+2048*2,1);
+ dft(DFT_1024,prach2+2048*3,rxsigF[aa]+2048*3,1);
+ reps+=2;
+ }
+ if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
+ dft(DFT_1024,prach2+2048*4,rxsigF[aa]+2048*4,1);
+ dft(DFT_1024,prach2+2048*5,rxsigF[aa]+2048*5,1);
+ reps+=2;
+ }
+ if (prachFormat == 8/*B4*/) {
+ for (int i=6;i<12;i++) dft(DFT_1024,prach2+(2048*i),rxsigF[aa]+(2048*i),1);
+ reps+=6;
+ }
}
- if (prachFormat == 1 || prachFormat == 2) {
- dft(DFT_98304,prach2+196608,rxsigF[aa]+196608,1);
- reps++;
- }
- if (prachFormat == 2) {
- dft(DFT_98304,prach2+(196608*2),rxsigF[aa]+(196608*2),1);
- dft(DFT_98304,prach2+(196608*3),rxsigF[aa]+(196608*3),1);
- reps+=2;
- }
- if (prachFormat == 3) {
- dftlen=24576;
- for (int i=0;i<4;i++) dft(DFT_24576,prach2+(i*2*24576),rxsigF[aa]+(i*2*24576),1);
- reps=4;
- }
- }
- else {
- if (prachStartSymbol == 0) prach2+=128; // 64 samples @ 122.88 Ms/s in first symbol of each half subframe (15/30 kHz only)
+ break;
- dftlen=4096;
- dft(DFT_4096,prach2,rxsigF[aa],1);
- if (prachFormat != 9/*C0*/) {
- dft(DFT_4096,prach2+8192,rxsigF[aa]+8192,1);
- reps++;
- }
-
- if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
- dft(DFT_4096,prach2+8192*2,rxsigF[aa]+8192*2,1);
- dft(DFT_4096,prach2+8192*3,rxsigF[aa]+8192*3,1);
- reps+=2;
- }
- if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
- dft(DFT_4096,prach2+8192*4,rxsigF[aa]+8192*4,1);
- dft(DFT_4096,prach2+8192*5,rxsigF[aa]+8192*5,1);
- reps+=2;
- }
- if (prachFormat == 8/*B4*/) {
- for (int i=6;i<12;i++) dft(DFT_4096,prach2+(8192*i),rxsigF[aa]+(8192*i),1);
- reps+=6;
- }
- }
- } else {
- AssertFatal(fp->N_RB_UL <= 217,"cannot do more than 217 PRBs with 3/4 sampling\n");
- prach2 = prach[aa] + (6*Ncp);
- // 80 MHz @ 92.16 Ms/s
- if (prach_sequence_length == 0) {
- if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
- dftlen=73728;
- dft(DFT_73728,prach2,rxsigF[aa],1);
- reps++;
- }
- if (prachFormat == 1 || prachFormat == 2) {
- dft(DFT_73728,prach2+(2*73728),rxsigF[aa]+(2*73728),1);
- reps++;
- }
- if (prachFormat == 3) {
- dftlen=18432;
- for (int i=0;i<4;i++) dft(DFT_18432,prach2+(i*2*18432),rxsigF[aa]+(i*2*18432),1);
- reps=4;
- }
- } else {
- if (prachStartSymbol == 0) prach2+=96; // 64 samples @ 122.88 Ms/s in first symbol of each half subframe (15/30 kHz only)
+ case 61440:
+ // 40, 50, 60 MHz @ 61.44 Ms/s
+ prach2 = prach[aa] + (4*Ncp); // Ncp is for 30.72 Ms/s, so multiply by 2 for I/Q, and 2 to bring to 61.44 Ms/s
+ if (prach_sequence_length == 0) {
+ if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
+ dftlen=49152;
+ dft(DFT_49152,prach2,rxsigF[aa],1);
+ }
+ if (prachFormat == 1 || prachFormat == 2) {
+ dft(DFT_49152,prach2+98304,rxsigF[aa]+98304,1);
+ reps++;
+ }
+ if (prachFormat == 2) {
+ dft(DFT_49152,prach2+(98304*2),rxsigF[aa]+(98304*2),1);
+ dft(DFT_49152,prach2+(98304*3),rxsigF[aa]+(98304*3),1);
+ reps+=2;
+ }
+ if (prachFormat == 3) {
+ dftlen=12288;
+ for (int i=0;i<4;i++) dft(DFT_12288,prach2+(i*12288*2),rxsigF[aa]+(i*12288*2),1);
+ reps=4;
+ }
+ } else { // 839 sequence
+ if (prachStartSymbol == 0) prach2+=64; // 32 samples @ 61.44 Ms/s in first symbol of each half subframe (15/30 kHz only)
- dftlen=3072;
- dft(DFT_3072,prach2,rxsigF[aa],1);
- if (prachFormat != 9/*C0*/) {
- dft(DFT_3072,prach2+6144,rxsigF[aa]+6144,1);
- reps++;
- }
-
- if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
- dft(DFT_3072,prach2+6144*2,rxsigF[aa]+6144*2,1);
- dft(DFT_3072,prach2+6144*3,rxsigF[aa]+6144*3,1);
- reps+=2;
- }
- if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
- dft(DFT_3072,prach2+6144*4,rxsigF[aa]+6144*4,1);
- dft(DFT_3072,prach2+6144*5,rxsigF[aa]+6144*5,1);
- reps+=2;
- }
- if (prachFormat == 8/*B4*/) {
- for (int i=6;i<12;i++) dft(DFT_3072,prach2+(6144*i),rxsigF[aa]+(6144*i),1);
- reps+=6;
- }
- }
+ dftlen=2048;
+ dft(DFT_2048,prach2,rxsigF[aa],1);
+ if (prachFormat != 9/*C0*/) {
+ dft(DFT_2048,prach2+4096,rxsigF[aa]+4096,1);
+ reps++;
+ }
+ if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
+ dft(DFT_2048,prach2+4096*2,rxsigF[aa]+4096*2,1);
+ dft(DFT_2048,prach2+4096*3,rxsigF[aa]+4096*3,1);
+ reps+=2;
+ }
+ if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
+ dft(DFT_2048,prach2+4096*4,rxsigF[aa]+4096*4,1);
+ dft(DFT_2048,prach2+4096*5,rxsigF[aa]+4096*5,1);
+ reps+=2;
+ }
+ if (prachFormat == 8/*B4*/) {
+ for (int i=6;i<12;i++) dft(DFT_2048,prach2+(4096*i),rxsigF[aa]+(4096*i),1);
+ reps+=6;
+ }
+ }
+ break;
+
+ case 46080:
+ // 40 MHz @ 46.08 Ms/s
+ prach2 = prach[aa] + (3*Ncp); // 46.08 is 1.5 * 30.72, times 2 for I/Q
+ if (prach_sequence_length == 0) {
+ if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
+ dftlen=36864;
+ dft(DFT_36864,prach2,rxsigF[aa],1);
+ }
+ if (prachFormat == 1 || prachFormat == 2) {
+ dft(DFT_36864,prach2+73728,rxsigF[aa]+73728,1);
+ reps++;
+ }
+ if (prachFormat == 2) {
+ dft(DFT_36864,prach2+(73728*2),rxsigF[aa]+(73728*2),1);
+ dft(DFT_36864,prach2+(73728*3),rxsigF[aa]+(73728*3),1);
+ reps+=2;
+ }
+ if (prachFormat == 3) {
+ dftlen=9216;
+ for (int i=0;i<4;i++) dft(DFT_9216,prach2+(i*9216*2),rxsigF[aa]+(i*9216*2),1);
+ reps=4;
+ }
+ } else { // 839 sequence
+ if (prachStartSymbol == 0) prach2+=48; // 24 samples @ 46.08 Ms/s in first symbol of each half subframe (15/30 kHz only)
+
+ dftlen=1536;
+ dft(DFT_1536,prach2,rxsigF[aa],1);
+ if (prachFormat != 9/*C0*/) {
+ dft(DFT_1536,prach2+3072,rxsigF[aa]+3072,1);
+ reps++;
+ }
+ if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
+ dft(DFT_1536,prach2+3072*2,rxsigF[aa]+3072*2,1);
+ dft(DFT_1536,prach2+3072*3,rxsigF[aa]+3072*3,1);
+ reps+=2;
+ }
+ if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
+ dft(DFT_1536,prach2+3072*4,rxsigF[aa]+3072*4,1);
+ dft(DFT_1536,prach2+3072*5,rxsigF[aa]+3072*5,1);
+ reps+=2;
+ }
+ if (prachFormat == 8/*B4*/) {
+ for (int i=6;i<12;i++) dft(DFT_1536,prach2+(3072*i),rxsigF[aa]+(3072*i),1);
+ reps+=6;
+ }
+ }
+ break;
+
+ case 122880:
+ // 70, 80, 90, 100 MHz @ 122.88 Ms/s
+ prach2 = prach[aa] + (8*Ncp);
+ if (prach_sequence_length == 0) {
+ if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
+ dftlen=98304;
+ dft(DFT_98304,prach2,rxsigF[aa],1);
+ }
+ if (prachFormat == 1 || prachFormat == 2) {
+ dft(DFT_98304,prach2+196608,rxsigF[aa]+196608,1);
+ reps++;
+ }
+ if (prachFormat == 2) {
+ dft(DFT_98304,prach2+(196608*2),rxsigF[aa]+(196608*2),1);
+ dft(DFT_98304,prach2+(196608*3),rxsigF[aa]+(196608*3),1);
+ reps+=2;
+ }
+ if (prachFormat == 3) {
+ dftlen=24576;
+ for (int i=0;i<4;i++) dft(DFT_24576,prach2+(i*2*24576),rxsigF[aa]+(i*2*24576),1);
+ reps=4;
+ }
+ } else { // 839 sequence
+ if (prachStartSymbol == 0) prach2+=128; // 64 samples @ 122.88 Ms/s in first symbol of each half subframe (15/30 kHz only)
+
+ dftlen=4096;
+ dft(DFT_4096,prach2,rxsigF[aa],1);
+ if (prachFormat != 9/*C0*/) {
+ dft(DFT_4096,prach2+8192,rxsigF[aa]+8192,1);
+ reps++;
+ }
+
+ if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
+ dft(DFT_4096,prach2+8192*2,rxsigF[aa]+8192*2,1);
+ dft(DFT_4096,prach2+8192*3,rxsigF[aa]+8192*3,1);
+ reps+=2;
+ }
+ if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
+ dft(DFT_4096,prach2+8192*4,rxsigF[aa]+8192*4,1);
+ dft(DFT_4096,prach2+8192*5,rxsigF[aa]+8192*5,1);
+ reps+=2;
+ }
+ if (prachFormat == 8/*B4*/) {
+ for (int i=6;i<12;i++) dft(DFT_4096,prach2+(8192*i),rxsigF[aa]+(8192*i),1);
+ reps+=6;
+ }
+ }
+ break;
+
+ case 92160:
+ // 80, 90 MHz @ 92.16 Ms/s
+ prach2 = prach[aa] + (6*Ncp);
+ if (prach_sequence_length == 0) {
+ if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
+ dftlen=73728;
+ dft(DFT_73728,prach2,rxsigF[aa],1);
+ }
+ if (prachFormat == 1 || prachFormat == 2) {
+ dft(DFT_73728,prach2+147456,rxsigF[aa]+147456,1);
+ reps++;
+ }
+ if (prachFormat == 2) {
+ dft(DFT_73728,prach2+(147456*2),rxsigF[aa]+(147456*2),1);
+ dft(DFT_73728,prach2+(147456*3),rxsigF[aa]+(147456*3),1);
+ reps+=2;
+ }
+ if (prachFormat == 3) {
+ dftlen=18432;
+ for (int i=0;i<4;i++) dft(DFT_18432,prach2+(i*2*18432),rxsigF[aa]+(i*2*18432),1);
+ reps=4;
+ }
+ } else {
+ if (prachStartSymbol == 0) prach2+=96; // 64 samples @ 122.88 Ms/s in first symbol of each half subframe (15/30 kHz only)
+
+ dftlen=3072;
+ dft(DFT_3072,prach2,rxsigF[aa],1);
+ if (prachFormat != 9/*C0*/) {
+ dft(DFT_3072,prach2+6144,rxsigF[aa]+6144,1);
+ reps++;
+ }
+
+ if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
+ dft(DFT_3072,prach2+6144*2,rxsigF[aa]+6144*2,1);
+ dft(DFT_3072,prach2+6144*3,rxsigF[aa]+6144*3,1);
+ reps+=2;
+ }
+ if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
+ dft(DFT_3072,prach2+6144*4,rxsigF[aa]+6144*4,1);
+ dft(DFT_3072,prach2+6144*5,rxsigF[aa]+6144*5,1);
+ reps+=2;
+ }
+ if (prachFormat == 8/*B4*/) {
+ for (int i=6;i<12;i++) dft(DFT_3072,prach2+(6144*i),rxsigF[aa]+(6144*i),1);
+ reps+=6;
+ }
+ }
+ break;
+ default:
+ AssertFatal(1==0,"sample_rate %f MHz not support for NR PRACH yet\n", fp->samples_per_subframe / 1000.0);
}
}
- }
else if (mu==3) {
if (fp->threequarter_fs) {
AssertFatal(1==0,"3/4 sampling not supported for numerology %d\n",mu);
diff --git a/openair1/PHY/NR_TRANSPORT/pucch_rx.c b/openair1/PHY/NR_TRANSPORT/pucch_rx.c
index 2d1fdff4be..70481fe67e 100644
--- a/openair1/PHY/NR_TRANSPORT/pucch_rx.c
+++ b/openair1/PHY/NR_TRANSPORT/pucch_rx.c
@@ -1604,7 +1604,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
re_offset = (12*pucch_pdu->prb_start) + (12*pucch_pdu->bwp_start) + frame_parms->first_carrier_offset;
// estimate CQI for MAC (from antenna port 0 only)
int SNRtimes10 = dB_fixed_times10(signal_energy_nodc(&rxdataF[0][(l2*frame_parms->ofdm_symbol_size)+re_offset],12*pucch_pdu->prb_size)) - (10*gNB->measurements.n0_power_tot_dB);
- int cqi;
+ int cqi,bit_left;
if (SNRtimes10 < -640) cqi=0;
else if (SNRtimes10 > 635) cqi=255;
else cqi=(640+SNRtimes10)/5;
@@ -1628,7 +1628,8 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
uci_pdu->harq.harq_payload[i] = decodedPayload[0] & 255;
decodedPayload[0]>>=8;
}
- uci_pdu->harq.harq_payload[i] = decodedPayload[0] & ((1<<(pucch_pdu->bit_len_harq&7))-1);
+ bit_left = pucch_pdu->bit_len_harq-((harq_bytes-1)<<3);
+ uci_pdu->harq.harq_payload[i] = decodedPayload[0] & ((1<>= pucch_pdu->bit_len_harq;
}
@@ -1642,6 +1643,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
// csi
if (pucch_pdu->bit_len_csi_part1>0) {
uci_pdu->pduBitmap|=4;
+ uci_pdu->csi_part1.csi_part1_bit_len=pucch_pdu->bit_len_csi_part1;
int csi_part1_bytes=pucch_pdu->bit_len_csi_part1>>3;
if ((pucch_pdu->bit_len_csi_part1&7) > 0) csi_part1_bytes++;
uci_pdu->csi_part1.csi_part1_payload = (uint8_t*)malloc(csi_part1_bytes);
@@ -1651,7 +1653,8 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
uci_pdu->csi_part1.csi_part1_payload[i] = decodedPayload[0] & 255;
decodedPayload[0]>>=8;
}
- uci_pdu->csi_part1.csi_part1_payload[i] = decodedPayload[0] & ((1<<(pucch_pdu->bit_len_csi_part1&7))-1);
+ bit_left = pucch_pdu->bit_len_csi_part1-((csi_part1_bytes-1)<<3);
+ uci_pdu->csi_part1.csi_part1_payload[i] = decodedPayload[0] & ((1<>= pucch_pdu->bit_len_csi_part1;
}
diff --git a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
index abc944bc00..8176514eb4 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
@@ -402,11 +402,12 @@ void nr_pdcch_extract_rbs_single(int32_t **rxdataF,
c_rb = 0;
for (int rb=0;rb>3] & (1<<(7-(c_rb_by6&7)))) == 0) {
- c_rb+=6;
- c_rb_by6 = c_rb/6;
- }
+ c_rb+=6;
+ c_rb_by6 = c_rb/6;
+ }
LOG_DDD("c_rb=%d\n",c_rb);
rxF=NULL;
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
index 13270c5c4b..189ad53efa 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
@@ -289,8 +289,7 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *ue, int n_frames)
proc,
i,
0,
- is*fp->samples_per_frame+ue->ssb_offset,
- 0);
+ is*fp->samples_per_frame+ue->ssb_offset);
#ifdef DEBUG_INITIAL_SYNCH
LOG_I(PHY,"Calling sss detection (normal CP)\n");
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c b/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c
index 3ab88dac0a..0ba02c6bac 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c
@@ -244,86 +244,82 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
*********************************************************/
if (mu==1) {
- if (fp->N_RB_UL <= 100)
- AssertFatal(1 == 0, "N_RB_UL %d not support for NR PRACH yet\n", fp->N_RB_UL);
- else if (fp->N_RB_UL < 137) {
- if (fp->threequarter_fs == 0) {
- //40 MHz @ 61.44 Ms/s
- //50 MHz @ 61.44 Ms/s
+ switch(fp->samples_per_subframe) {
+ case 15360:
+ // 10, 15 MHz @ 15.36 Ms/s
if (prach_sequence_length == 0) {
if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2)
- dftlen = 49152;
+ dftlen = 12288;
if (prach_fmt_id == 3)
- dftlen = 12288;
- } // 839 sequence
- else {
- switch (mu){
- case 1:
- dftlen = 2048;
- break;
- default:
- AssertFatal(1 == 0, "Shouldn't get here\n");
- break;
- }
+ dftlen = 3072;
+ } else { // 839 sequence
+ dftlen = 512;
}
- } else { // threequarter sampling
- // 40 MHz @ 46.08 Ms/s
+ break;
+
+ case 30720:
+ // 20, 25, 30 MHz @ 30.72 Ms/s
+ if (prach_sequence_length == 0) {
+ if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2)
+ dftlen = 24576;
+ if (prach_fmt_id == 3)
+ dftlen = 6144;
+ } else { // 839 sequence
+ dftlen = 1024;
+ }
+ break;
+
+ case 46080:
+ // 40 MHz @ 46.08 Ms/s
if (prach_sequence_length == 0) {
- AssertFatal(fp->N_RB_UL <= 107, "cannot do 108..136 PRBs with 3/4 sampling\n");
if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2)
dftlen = 36864;
if (prach_fmt_id == 3)
dftlen = 9216;
- } else {
- switch (mu){
- case 1:
- dftlen = 1536;
- break;
- default:
- AssertFatal(1 == 0, "Shouldn't get here\n");
- break;
- }
- } // short format
- } // 3/4 sampling
- } // <=50 MHz BW
- else if (fp->N_RB_UL <= 273) {
- if (fp->threequarter_fs == 0) {
- //80,90,100 MHz @ 122.88 Ms/s
+ } else { // 839 sequence
+ dftlen = 1536;
+ }
+ break;
+
+ case 61440:
+ // 40, 50, 60 MHz @ 61.44 Ms/s
+ if (prach_sequence_length == 0) {
+ if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2)
+ dftlen = 49152;
+ if (prach_fmt_id == 3)
+ dftlen = 12288;
+ } else { // 839 sequence
+ dftlen = 2048;
+ }
+ break;
+
+ case 92160:
+ // 50, 60, 70, 80, 90 MHz @ 92.16 Ms/s
+ if (prach_sequence_length == 0) {
+ if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2)
+ dftlen = 73728;
+ if (prach_fmt_id == 3)
+ dftlen = 18432;
+ } else { // 839 sequence
+ dftlen = 3072;
+ }
+ break;
+
+ case 122880:
+ // 70, 80, 90, 100 MHz @ 122.88 Ms/s
if (prach_sequence_length == 0) {
if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2)
dftlen = 98304;
if (prach_fmt_id == 3)
dftlen = 24576;
+ } else { // 839 sequence
+ dftlen = 4096;
}
- } else { // threequarter sampling
- switch (mu){
- case 1:
- dftlen = 4096;
- break;
- default:
- AssertFatal(1 == 0, "Shouldn't get here\n");
- break;
- }
+ break;
+
+ default:
+ AssertFatal(1==0,"sample rate %f MHz not supported for numerology %d\n", fp->samples_per_subframe / 1000.0, mu);
}
- } else {
- AssertFatal(fp->N_RB_UL <= 217, "cannot do more than 217 PRBs with 3/4 sampling\n");
- // 80 MHz @ 92.16 Ms/s
- if (prach_sequence_length == 0) {
- if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2)
- dftlen = 73728;
- if (prach_fmt_id == 3)
- dftlen = 18432;
- } else {
- switch (mu){
- case 1:
- dftlen = 3072;
- break;
- default:
- AssertFatal(1 == 0, "Shouldn't get here\n");
- break;
- }
- }
- }
}
else if (mu==3) {
if (fp->threequarter_fs)
@@ -425,15 +421,16 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
uint8_t use_extended_prach_prefix = 0;
if(fp->numerology_index == 0) {
if (prachStartSymbol == 0 || prachStartSymbol == 7)
- use_extended_prach_prefix = 1;
+ use_extended_prach_prefix = 1;
}
else {
if (slot%(fp->slots_per_subframe/2)==0 && prachStartSymbol == 0)
- use_extended_prach_prefix = 1;
+ use_extended_prach_prefix = 1;
}
-
- if (fp->N_RB_UL <= 34) { //32 PRB case 61.44Msps
- if (fp->threequarter_fs == 0) {
+
+ if (mu == 3) {
+ switch (fp->samples_per_subframe) {
+ case 61440: // 32 PRB case, 61.44 Msps
Ncp<<=1; //to account for 61.44Mbps
// This is after cyclic prefix
prach2 = prach+(Ncp<<1); //times 2 for complex samples
@@ -491,13 +488,9 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
prach_len = (512*12)+Ncp;
}
}
- }
- else
- AssertFatal(1==0,"3/4 sampling not supported for this PRACH size %d\n",fp->N_RB_UL);
-
- }
- else if (fp->N_RB_UL <= 68) {//66 PRB case, 122.88 Msps
- if (fp->threequarter_fs == 0) {
+ break;
+
+ case 122880: // 66 PRB case, 122.88 Msps
Ncp<<=2; //to account for 122.88Mbps
// This is after cyclic prefix
prach2 = prach+(Ncp<<1); //times 2 for complex samples
@@ -555,13 +548,211 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
prach_len = (1024*12)+Ncp;
}
}
+ break;
+
+ default:
+ AssertFatal(1==0,"sample rate %f MHz not supported for numerology %d\n", fp->samples_per_subframe / 1000.0, mu);
}
- else
- AssertFatal(1==0,"3/4 sampling not supported for this PRACH size %d\n",fp->N_RB_UL);
- }
- else if (fp->N_RB_UL < 137) { // 46.08 or 61.44 Ms/s
- if (fp->threequarter_fs == 0) { // full sampling @ 61.44 Ms/s
- Ncp<<=1; //to account for 61.44Mbps
+ } else if (mu == 1) {
+ switch (fp->samples_per_subframe) {
+ case 15360: // full sampling @ 15.36 Ms/s
+ Ncp = Ncp/2; // to account for 15.36 Ms/s
+ // This is after cyclic prefix
+ prach2 = prach+(2*Ncp); // times 2 for complex samples
+ if (prach_sequence_length == 0){
+ if (prach_fmt_id == 0) { // 24576 samples @ 30.72 Ms/s, 12288 samples @ 15.36 Ms/s
+ idft(IDFT_12288,prachF,prach2,1);
+ // here we have | empty | Prach12288 |
+ memmove(prach,prach+(12288<<1),(Ncp<<2));
+ // here we have | Prefix | Prach12288 |
+ prach_len = 12288+Ncp;
+ } else if (prach_fmt_id == 1) { // 24576 samples @ 30.72 Ms/s, 12288 samples @ 15.36 Ms/s
+ idft(IDFT_12288,prachF,prach2,1);
+ // here we have | empty | Prach12288 | empty12288 |
+ memmove(prach2+(12288<<1),prach2,(12288<<2));
+ // here we have | empty | Prach12288 | Prach12288 |
+ memmove(prach,prach+(12288<<2),(Ncp<<2));
+ // here we have | Prefix | Prach12288 | Prach12288 |
+ prach_len = (12288*2)+Ncp;
+ } else if (prach_fmt_id == 2) { // 24576 samples @ 30.72 Ms/s, 12288 samples @ 15.36 Ms/s
+ idft(IDFT_12288,prachF,prach2,1);
+ // here we have | empty | Prach12288 | empty12288 | empty12288 | empty12288 |
+ memmove(prach2+(12288<<1),prach2,(12288<<2));
+ // here we have | empty | Prach12288 | Prach12288 | empty12288 | empty12288 |
+ memmove(prach2+(12288<<2),prach2,(12288<<3));
+ // here we have | empty | Prach12288 | Prach12288 | Prach12288 | Prach12288 |
+ memmove(prach,prach+(12288<<3),(Ncp<<2));
+ // here we have | Prefix | Prach12288 | Prach12288 | Prach12288 | Prach12288 |
+ prach_len = (12288*4)+Ncp;
+ } else if (prach_fmt_id == 3) { // 6144 samples @ 30.72 Ms/s, 3072 samples @ 15.36 Ms/s
+ idft(IDFT_3072,prachF,prach2,1);
+ // here we have | empty | Prach3072 | empty3072 | empty3072 | empty3072 |
+ memmove(prach2+(3072<<1),prach2,(3072<<2));
+ // here we have | empty | Prach3072 | Prach3072 | empty3072 | empty3072 |
+ memmove(prach2+(3072<<2),prach2,(3072<<3));
+ // here we have | empty | Prach3072 | Prach3072 | Prach3072 | Prach3072 |
+ memmove(prach,prach+(3072<<3),(Ncp<<2));
+ // here we have | Prefix | Prach3072 | Prach3072 | Prach3072 | Prach3072 |
+ prach_len = (3072*4)+Ncp;
+ }
+ } else { // short PRACH sequence
+ if (use_extended_prach_prefix)
+ Ncp += 8; // 16*kappa, kappa=0.5 for 15.36 Ms/s
+ prach2 = prach+(2*Ncp); // times 2 for complex samples
+ if (prach_fmt_id == 9) {
+ idft(IDFT_512,prachF,prach2,1);
+ // here we have | empty | Prach512 |
+ memmove(prach,prach+(512<<1),(Ncp<<2));
+ // here we have | Prefix | Prach512 |
+ prach_len = (512*1)+Ncp;
+ } else if (prach_fmt_id == 4 || prach_fmt_id == 7) {
+ idft(IDFT_512,prachF,prach2,1);
+ // here we have | empty | Prach512 | empty512 |
+ memmove(prach2+(512<<1),prach2,(512<<2));
+ // here we have | empty | Prach512 | Prach512 |
+ memmove(prach,prach+(512<<1),(Ncp<<2));
+ // here we have | Prefix | Prach512 | Prach512 |
+ prach_len = (512*2)+Ncp;
+ } else if (prach_fmt_id == 5) { // 4x512
+ idft(IDFT_512,prachF,prach2,1);
+ // here we have | empty | Prach512 | empty512 | empty512 | empty512 |
+ memmove(prach2+(512<<1),prach2,(512<<2));
+ // here we have | empty | Prach512 | Prach512 | empty512 | empty512 |
+ memmove(prach2+(512<<2),prach2,(512<<3));
+ // here we have | empty | Prach512 | Prach512 | Prach512 | Prach512 |
+ memmove(prach,prach+(512<<1),(Ncp<<2));
+ // here we have | Prefix | Prach512 | Prach512 | Prach512 | Prach512 |
+ prach_len = (512*4)+Ncp;
+ } else if (prach_fmt_id == 6) { // 6x512
+ idft(IDFT_512,prachF,prach2,1);
+ // here we have | empty | Prach512 | empty512 | empty512 | empty512 | empty512 | empty512 |
+ memmove(prach2+(512<<1),prach2,(512<<2));
+ // here we have | empty | Prach512 | Prach512 | empty512 | empty512 | empty512 | empty512 |
+ memmove(prach2+(512<<2),prach2,(512<<3));
+ // here we have | empty | Prach512 | Prach512 | Prach512 | Prach512 | empty512 | empty512 |
+ memmove(prach2+(512<<3),prach2,(512<<3));
+ // here we have | empty | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 |
+ memmove(prach,prach+(512<<1),(Ncp<<2));
+ // here we have | Prefix | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 |
+ prach_len = (512*6)+Ncp;
+ } else if (prach_fmt_id == 8) { // 12x512
+ idft(IDFT_512,prachF,prach2,1);
+ // here we have | empty | Prach512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 |
+ memmove(prach2+(512<<1),prach2,(512<<2));
+ // here we have | empty | Prach512 | Prach512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 |
+ memmove(prach2+(512<<2),prach2,(512<<3));
+ // here we have | empty | Prach512 | Prach512 | Prach512 | Prach512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 |
+ memmove(prach2+(512<<3),prach2,(512<<3));
+ // here we have | empty | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 |
+ memmove(prach2+(512<<1)*6,prach2,(512<<2)*6);
+ // here we have | empty | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 |
+ memmove(prach,prach+(512<<1),(Ncp<<2));
+ // here we have | Prefix | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 |
+ prach_len = (512*12)+Ncp;
+ }
+ }
+ break;
+
+ case 30720: // full sampling @ 30.72 Ms/s
+ Ncp = Ncp*1; // to account for 30.72 Ms/s
+ // This is after cyclic prefix
+ prach2 = prach+(2*Ncp); // times 2 for complex samples
+ if (prach_sequence_length == 0){
+ if (prach_fmt_id == 0) { // 24576 samples @ 30.72 Ms/s
+ idft(IDFT_24576,prachF,prach2,1);
+ // here we have | empty | Prach24576 |
+ memmove(prach,prach+(24576<<1),(Ncp<<2));
+ // here we have | Prefix | Prach24576 |
+ prach_len = 24576+Ncp;
+ } else if (prach_fmt_id == 1) { // 24576 samples @ 30.72 Ms/s
+ idft(IDFT_24576,prachF,prach2,1);
+ // here we have | empty | Prach24576 | empty24576 |
+ memmove(prach2+(24576<<1),prach2,(24576<<2));
+ // here we have | empty | Prach24576 | Prach24576 |
+ memmove(prach,prach+(24576<<2),(Ncp<<2));
+ // here we have | Prefix | Prach24576 | Prach24576 |
+ prach_len = (24576*2)+Ncp;
+ } else if (prach_fmt_id == 2) { // 24576 samples @ 30.72 Ms/s
+ idft(IDFT_24576,prachF,prach2,1);
+ // here we have | empty | Prach24576 | empty24576 | empty24576 | empty24576 |
+ memmove(prach2+(24576<<1),prach2,(24576<<2));
+ // here we have | empty | Prach24576 | Prach24576 | empty24576 | empty24576 |
+ memmove(prach2+(24576<<2),prach2,(24576<<3));
+ // here we have | empty | Prach24576 | Prach24576 | Prach24576 | Prach24576 |
+ memmove(prach,prach+(24576<<3),(Ncp<<2));
+ // here we have | Prefix | Prach24576 | Prach24576 | Prach24576 | Prach24576 |
+ prach_len = (24576*4)+Ncp;
+ } else if (prach_fmt_id == 3) { // 6144 samples @ 30.72 Ms/s
+ idft(IDFT_6144,prachF,prach2,1);
+ // here we have | empty | Prach6144 | empty6144 | empty6144 | empty6144 |
+ memmove(prach2+(6144<<1),prach2,(6144<<2));
+ // here we have | empty | Prach6144 | Prach6144 | empty6144 | empty6144 |
+ memmove(prach2+(6144<<2),prach2,(6144<<3));
+ // here we have | empty | Prach6144 | Prach6144 | Prach6144 | Prach6144 |
+ memmove(prach,prach+(6144<<3),(Ncp<<2));
+ // here we have | Prefix | Prach6144 | Prach6144 | Prach6144 | Prach6144 |
+ prach_len = (6144*4)+Ncp;
+ }
+ } else { // short PRACH sequence
+ if (use_extended_prach_prefix)
+ Ncp += 16; // 16*kappa, kappa=1 for 30.72Msps
+ prach2 = prach+(2*Ncp); // times 2 for complex samples
+ if (prach_fmt_id == 9) {
+ idft(IDFT_1024,prachF,prach2,1);
+ // here we have | empty | Prach1024 |
+ memmove(prach,prach+(1024<<1),(Ncp<<2));
+ // here we have | Prefix | Prach1024 |
+ prach_len = (1024*1)+Ncp;
+ } else if (prach_fmt_id == 4 || prach_fmt_id == 7) {
+ idft(IDFT_1024,prachF,prach2,1);
+ // here we have | empty | Prach1024 | empty1024 |
+ memmove(prach2+(1024<<1),prach2,(1024<<2));
+ // here we have | empty | Prach1024 | Prach1024 |
+ memmove(prach,prach+(1024<<1),(Ncp<<2));
+ // here we have | Prefix | Prach1024 | Prach1024 |
+ prach_len = (1024*2)+Ncp;
+ } else if (prach_fmt_id == 5) { // 4x1024
+ idft(IDFT_1024,prachF,prach2,1);
+ // here we have | empty | Prach1024 | empty1024 | empty1024 | empty1024 |
+ memmove(prach2+(1024<<1),prach2,(1024<<2));
+ // here we have | empty | Prach1024 | Prach1024 | empty1024 | empty1024 |
+ memmove(prach2+(1024<<2),prach2,(1024<<3));
+ // here we have | empty | Prach1024 | Prach1024 | Prach1024 | Prach1024 |
+ memmove(prach,prach+(1024<<1),(Ncp<<2));
+ // here we have | Prefix | Prach1024 | Prach1024 | Prach1024 | Prach1024 |
+ prach_len = (1024*4)+Ncp;
+ } else if (prach_fmt_id == 6) { // 6x1024
+ idft(IDFT_1024,prachF,prach2,1);
+ // here we have | empty | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 |
+ memmove(prach2+(1024<<1),prach2,(1024<<2));
+ // here we have | empty | Prach1024 | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 |
+ memmove(prach2+(1024<<2),prach2,(1024<<3));
+ // here we have | empty | Prach1024 | Prach1024 | Prach1024 | Prach1024 | empty1024 | empty1024 |
+ memmove(prach2+(1024<<3),prach2,(1024<<3));
+ // here we have | empty | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 |
+ memmove(prach,prach+(1024<<1),(Ncp<<2));
+ // here we have | Prefix | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 |
+ prach_len = (1024*6)+Ncp;
+ } else if (prach_fmt_id == 8) { // 12x1024
+ idft(IDFT_1024,prachF,prach2,1);
+ // here we have | empty | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 |
+ memmove(prach2+(1024<<1),prach2,(1024<<2));
+ // here we have | empty | Prach1024 | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 |
+ memmove(prach2+(1024<<2),prach2,(1024<<3));
+ // here we have | empty | Prach1024 | Prach1024 | Prach1024 | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 |
+ memmove(prach2+(1024<<3),prach2,(1024<<3));
+ // here we have | empty | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 |
+ memmove(prach2+(1024<<1)*6,prach2,(1024<<2)*6);
+ // here we have | empty | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 |
+ memmove(prach,prach+(1024<<1),(Ncp<<2));
+ // here we have | Prefix | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 |
+ prach_len = (1024*12)+Ncp;
+ }
+ }
+ break;
+
+ case 61440: // full sampling @ 61.44 Ms/s
+ Ncp = Ncp*2; // to account for 61.44 Ms/s
// This is after cyclic prefix
prach2 = prach+(Ncp<<1); //times 2 for complex samples
if (prach_sequence_length == 0){
@@ -587,7 +778,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
memmove(prach,prach+(49152<<3),(Ncp<<2));
// here we have |Prefix | Prach49152 | Prach49152| Prach49152 | Prach49152
prach_len = (49152*4)+Ncp;
- } else if (prach_fmt_id == 3) { // //6144 samples @ 30.72 Ms/s, 12288 samples @ 61.44 Ms/s
+ } else if (prach_fmt_id == 3) { // 6144 samples @ 30.72 Ms/s, 12288 samples @ 61.44 Ms/s
idft(IDFT_12288,prachF,prach2,1);
memmove(prach2+(12288<<1),prach2,(12288<<2));
// here we have |empty | Prach12288 | Prach12288| empty12288 | empty12288
@@ -649,7 +840,9 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
prach_len = (2048*12)+Ncp;
}
}
- } else { // threequarter sampling @ 46.08 Ms/s
+ break;
+
+ case 46080: // threequarter sampling @ 46.08 Ms/s
Ncp = (Ncp*3)/2;
prach2 = prach+(Ncp<<1);
if (prach_sequence_length == 0){
@@ -738,9 +931,9 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
prach_len = (1536*12)+Ncp;
}
}
- }
- } else if (fp->N_RB_UL <= 273) {// 92.16 or 122.88 Ms/s
- if (fp->threequarter_fs == 0) { // full sampling @ 122.88 Ms/s
+ break;
+
+ case 122880: // full sampling @ 122.88 Ms/s
Ncp<<=2; //to account for 122.88Mbps
// This is after cyclic prefix
prach2 = prach+(Ncp<<1); //times 2 for complex samples
@@ -828,7 +1021,9 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
prach_len = (4096*12)+Ncp;
}
}
- } else { // three quarter sampling @ 92.16 Ms/s
+ break;
+
+ case 92160: // three quarter sampling @ 92.16 Ms/s
Ncp = (Ncp*3); //to account for 92.16 Msps
prach2 = prach+(Ncp<<1); //times 2 for complex samples
if (prach_sequence_length == 0){
@@ -915,6 +1110,10 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
prach_len = (3072*12)+Ncp;
}
}
+ break;
+
+ default:
+ AssertFatal(1==0,"sample rate %f MHz not supported for numerology %d\n", fp->samples_per_subframe / 1000.0, mu);
}
}
diff --git a/openair1/SCHED_NR/nr_ru_procedures.c b/openair1/SCHED_NR/nr_ru_procedures.c
index 160fc44d58..4fbb4524e9 100644
--- a/openair1/SCHED_NR/nr_ru_procedures.c
+++ b/openair1/SCHED_NR/nr_ru_procedures.c
@@ -520,8 +520,7 @@ void nr_fep0(RU_t *ru, int first_half) {
ru->common.rxdataF[aa],
l,
proc->tti_rx,
- ru->N_TA_offset,
- 0);
+ ru->N_TA_offset);
}
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPRX+proc->tti_rx, 0);
@@ -657,8 +656,7 @@ void nr_fep_full(RU_t *ru, int slot) {
ru->common.rxdataF[aa],
l,
proc->tti_rx,
- ru->N_TA_offset,
- 0);
+ ru->N_TA_offset);
}
}
diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
index 6efbe35b1e..ef3ccbdfcb 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
@@ -369,7 +369,6 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
int timing_advance_update, cqi;
int sync_pos;
- uint16_t mu = gNB->frame_parms.numerology_index;
NR_gNB_ULSCH_t *ulsch = gNB->ulsch[ULSCH_id][0];
NR_UL_gNB_HARQ_t *harq_process = ulsch->harq_processes[harq_pid];
@@ -377,18 +376,10 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
// pdu->data = gNB->ulsch[ULSCH_id+1][0]->harq_processes[harq_pid]->b;
sync_pos = nr_est_timing_advance_pusch(gNB, ULSCH_id); // estimate timing advance for MAC
- timing_advance_update = sync_pos * (1 << mu); // scale by the used scs numerology
// scale the 16 factor in N_TA calculation in 38.213 section 4.2 according to the used FFT size
- switch (gNB->frame_parms.N_RB_DL) {
- case 106: timing_advance_update /= 16; break;
- case 217: timing_advance_update /= 32; break;
- case 245: timing_advance_update /= 32; break;
- case 273: timing_advance_update /= 32; break;
- case 66: timing_advance_update /= 12; break;
- case 32: timing_advance_update /= 12; break;
- default: AssertFatal(0==1,"No case defined for PRB %d to calculate timing_advance_update\n",gNB->frame_parms.N_RB_DL);
- }
+ uint16_t bw_scaling = 16 * gNB->frame_parms.ofdm_symbol_size / 2048;
+ timing_advance_update = sync_pos / bw_scaling;
// put timing advance command in 0..63 range
timing_advance_update += 31;
@@ -519,15 +510,12 @@ void phy_procedures_gNB_common_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
unsigned char aa;
for(symbol = 0; symbol < (gNB->frame_parms.Ncp==EXTENDED?12:14); symbol++) {
- // nr_slot_fep_ul(gNB, symbol, proc->slot_rx, 0, 0);
-
for (aa = 0; aa < gNB->frame_parms.nb_antennas_rx; aa++) {
nr_slot_fep_ul(&gNB->frame_parms,
gNB->common_vars.rxdata[aa],
gNB->common_vars.rxdataF[aa],
symbol,
slot_rx,
- 0,
0);
}
}
diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
index 33cf421b03..f7085c4555 100644
--- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
@@ -203,20 +203,15 @@ uint8_t get_ra_PreambleIndex(uint8_t Mod_id, uint8_t CC_id, uint8_t gNB_id){
}
-
-// scale the 16 factor in N_TA calculation in 38.213 section 4.2 according to the used FFT size
-uint16_t get_bw_scaling(uint16_t nb_rb){
- uint16_t bw_scaling;
- switch (nb_rb) {
- case 32: bw_scaling = 4; break;
- case 66: bw_scaling = 8; break;
- case 106: bw_scaling = 16; break;
- case 217: bw_scaling = 32; break;
- case 245: bw_scaling = 32; break;
- case 273: bw_scaling = 32; break;
- default: abort();
- }
- return bw_scaling;
+// convert time factor "16 * 64 * T_c / (2^mu)" in N_TA calculation in TS38.213 section 4.2 to samples by multiplying with samples per second
+// 16 * 64 * T_c / (2^mu) * samples_per_second
+// = 16 * T_s / (2^mu) * samples_per_second
+// = 16 * 1 / (15 kHz * 2048) / (2^mu) * (15 kHz * 2^mu * ofdm_symbol_size)
+// = 16 * 1 / 2048 * ofdm_symbol_size
+// = 16 * ofdm_symbol_size / 2048
+static inline
+uint16_t get_bw_scaling(uint16_t ofdm_symbol_size){
+ return 16 * ofdm_symbol_size / 2048;
}
// UL time alignment procedures:
@@ -234,12 +229,10 @@ void ue_ta_procedures(PHY_VARS_NR_UE *ue, int slot_tx, int frame_tx){
if (frame_tx == ul_time_alignment->ta_frame && slot_tx == ul_time_alignment->ta_slot) {
- uint8_t numerology = ue->frame_parms.numerology_index;
- uint16_t bwp_ul_NB_RB = ue->frame_parms.N_RB_UL;
- int factor_mu = 1 << numerology;
- uint16_t bw_scaling = get_bw_scaling(bwp_ul_NB_RB);
+ uint16_t ofdm_symbol_size = ue->frame_parms.ofdm_symbol_size;
+ uint16_t bw_scaling = get_bw_scaling(ofdm_symbol_size);
- ue->timing_advance += (ul_time_alignment->ta_command - 31) * bw_scaling / factor_mu;
+ ue->timing_advance += (ul_time_alignment->ta_command - 31) * bw_scaling;
LOG_I(PHY, "In %s: [UE %d] [%d.%d] Got timing advance command %u from MAC, new value is %d\n",
__FUNCTION__,
@@ -890,33 +883,19 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
int nr_slot_rx = proc->nr_slot_rx;
int ret=0, ret1=0;
NR_UE_PDSCH *pdsch_vars;
- uint8_t is_cw0_active = 0;
- uint8_t is_cw1_active = 0;
- uint8_t dmrs_type, nb_re_dmrs;
uint16_t dmrs_len = get_num_dmrs(dlsch0->harq_processes[dlsch0->current_harq_pid]->dlDmrsSymbPos);
- uint16_t nb_symb_sch = 9;
nr_downlink_indication_t dl_indication;
fapi_nr_rx_indication_t rx_ind;
uint16_t number_pdus = 1;
// params for UL time alignment procedure
NR_UL_TIME_ALIGNMENT_t *ul_time_alignment = &ue->ul_time_alignment[eNB_id];
- uint16_t slots_per_frame = ue->frame_parms.slots_per_frame;
- uint16_t slots_per_subframe = ue->frame_parms.slots_per_subframe;
- uint8_t numerology = ue->frame_parms.numerology_index, mapping_type_ul, mapping_type_dl;
- int ul_tx_timing_adjustment, N_TA_max, factor_mu, N_t_1, N_t_2, N_1, N_2, d_1_1 = 0, d_2_1, d;
- uint8_t d_2_2 = 0;// set to 0 because there is only 1 BWP
- // TODO this should corresponds to the switching time as defined in
- // TS 38.133
- uint16_t ofdm_symbol_size = ue->frame_parms.ofdm_symbol_size;
- uint16_t nb_prefix_samples = ue->frame_parms.nb_prefix_samples;
- uint32_t t_subframe = 1; // subframe duration of 1 msec
- uint16_t start_symbol;
- float tc_factor;
- is_cw0_active = dlsch0->harq_processes[harq_pid]->status;
- nb_symb_sch = dlsch0->harq_processes[harq_pid]->nb_symbols;
- start_symbol = dlsch0->harq_processes[harq_pid]->start_symbol;
- dmrs_type = dlsch0->harq_processes[harq_pid]->dmrsConfigType;
+ uint8_t is_cw0_active = dlsch0->harq_processes[harq_pid]->status;
+ uint16_t nb_symb_sch = dlsch0->harq_processes[harq_pid]->nb_symbols;
+ uint16_t start_symbol = dlsch0->harq_processes[harq_pid]->start_symbol;
+ uint8_t dmrs_type = dlsch0->harq_processes[harq_pid]->dmrsConfigType;
+
+ uint8_t nb_re_dmrs;
if (dmrs_type==NFAPI_NR_DMRS_TYPE1) {
nb_re_dmrs = 6*dlsch0->harq_processes[harq_pid]->n_dmrs_cdm_groups;
}
@@ -924,6 +903,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
nb_re_dmrs = 4*dlsch0->harq_processes[harq_pid]->n_dmrs_cdm_groups;
}
+ uint8_t is_cw1_active = 0;
if(dlsch1)
is_cw1_active = dlsch1->harq_processes[harq_pid]->status;
@@ -1186,53 +1166,29 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
}
}
- // TODO CRC check for CW0
-
- // Check CRC for CW 0
- /*if (ret == (1+dlsch0->max_turbo_iterations)) {
- *dlsch_errors=*dlsch_errors+1;
- if(dlsch0->rnti != 0xffff){
- LOG_D(PHY,"[UE %d][PDSCH %x/%d] AbsSubframe %d.%d : DLSCH CW0 in error (rv %d,round %d, mcs %d,TBS %d)\n",
- ue->Mod_id,dlsch0->rnti,
- harq_pid,frame_rx,nr_slot_rx,
- dlsch0->harq_processes[harq_pid]->rvidx,
- dlsch0->harq_processes[harq_pid]->round,
- dlsch0->harq_processes[harq_pid]->mcs,
- dlsch0->harq_processes[harq_pid]->TBS);
- }
- } else {
- if(dlsch0->rnti != 0xffff){
- LOG_D(PHY,"[UE %d][PDSCH %x/%d] AbsSubframe %d.%d : Received DLSCH CW0 (rv %d,round %d, mcs %d,TBS %d)\n",
- ue->Mod_id,dlsch0->rnti,
- harq_pid,frame_rx,nr_slot_rx,
- dlsch0->harq_processes[harq_pid]->rvidx,
- dlsch0->harq_processes[harq_pid]->round,
- dlsch0->harq_processes[harq_pid]->mcs,
- dlsch0->harq_processes[harq_pid]->TBS);
- }
- if ( LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)){
- int j;
- LOG_D(PHY,"dlsch harq_pid %d (rx): \n",dlsch0->current_harq_pid);
-
- for (j=0; jharq_processes[dlsch0->current_harq_pid]->TBS>>3; j++)
- LOG_T(PHY,"%x.",dlsch0->harq_processes[dlsch0->current_harq_pid]->b[j]);
- LOG_T(PHY,"\n");
- }*/
-
if (ue->mac_enabled == 1) {
- uint16_t bw_scaling = get_bw_scaling(ue->frame_parms.N_RB_DL);
-
/* Time Alignment procedure
// - UE processing capability 1
// - Setting the TA update to be applied after the reception of the TA command
// - Timing adjustment computed according to TS 38.213 section 4.2
// - Durations of N1 and N2 symbols corresponding to PDSCH and PUSCH are
// computed according to sections 5.3 and 6.4 of TS 38.214 */
- factor_mu = 1 << numerology;
- N_TA_max = 3846 * bw_scaling / factor_mu;
+ const int numerology = ue->frame_parms.numerology_index;
+ const int ofdm_symbol_size = ue->frame_parms.ofdm_symbol_size;
+ const int nb_prefix_samples = ue->frame_parms.nb_prefix_samples;
+ const int samples_per_subframe = ue->frame_parms.samples_per_subframe;
+ const int slots_per_frame = ue->frame_parms.slots_per_frame;
+ const int slots_per_subframe = ue->frame_parms.slots_per_subframe;
+
+ const double tc_factor = 1.0 / samples_per_subframe;
+ const uint16_t bw_scaling = get_bw_scaling(ofdm_symbol_size);
+
+ const int Ta_max = 3846; // Max value of 12 bits TA Command
+ const double N_TA_max = Ta_max * bw_scaling * tc_factor;
/* PDSCH decoding time N_1 for processing capability 1 */
+ int N_1;
if (ue->dmrs_DownlinkConfig.pdsch_dmrs_AdditionalPosition == pdsch_dmrs_pos0)
N_1 = pdsch_N_1_capability_1[numerology][1];
else if (ue->dmrs_DownlinkConfig.pdsch_dmrs_AdditionalPosition == pdsch_dmrs_pos1 || ue->dmrs_DownlinkConfig.pdsch_dmrs_AdditionalPosition == 2) // TODO set to pdsch_dmrs_pos2 when available
@@ -1241,12 +1197,12 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
N_1 = pdsch_N_1_capability_1[numerology][3];
/* PUSCH preapration time N_2 for processing capability 1 */
- N_2 = pusch_N_2_timing_capability_1[numerology][1];
- mapping_type_dl = ue->PDSCH_Config.pdsch_TimeDomainResourceAllocation[0]->mappingType;
- mapping_type_ul = ue->pusch_config.pusch_TimeDomainResourceAllocation[0]->mappingType;
+ const int N_2 = pusch_N_2_timing_capability_1[numerology][1];
/* d_1_1 depending on the number of PDSCH symbols allocated */
- d = 0; // TODO number of overlapping symbols of the scheduling PDCCH and the scheduled PDSCH
+ const int d = 0; // TODO number of overlapping symbols of the scheduling PDCCH and the scheduled PDSCH
+ int d_1_1 = 0;
+ mappingType_t mapping_type_dl = ue->PDSCH_Config.pdsch_TimeDomainResourceAllocation[0]->mappingType;
if (mapping_type_dl == typeA)
if (nb_symb_sch + start_symbol < 7)
d_1_1 = 7 - (nb_symb_sch + start_symbol);
@@ -1261,22 +1217,26 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
}
/* d_2_1 */
+ int d_2_1;
+ mappingType_t mapping_type_ul = ue->pusch_config.pusch_TimeDomainResourceAllocation[0]->mappingType;
if (mapping_type_ul == typeB && start_symbol != 0)
d_2_1 = 0;
else
d_2_1 = 1;
+ /* d_2_2 */
+ const double d_2_2 = 0.0; // set to 0 because there is only 1 BWP: TODO this should corresponds to the switching time as defined in TS 38.133
+
/* N_t_1 time duration in msec of N_1 symbols corresponding to a PDSCH reception time
// N_t_2 time duration in msec of N_2 symbols corresponding to a PUSCH preparation time */
- N_t_1 = (N_1 + d_1_1) * (ofdm_symbol_size + nb_prefix_samples) / factor_mu;
- N_t_2 = (N_2 + d_2_1) * (ofdm_symbol_size + nb_prefix_samples) / factor_mu;
+ double N_t_1 = (N_1 + d_1_1) * (ofdm_symbol_size + nb_prefix_samples) * tc_factor;
+ double N_t_2 = (N_2 + d_2_1) * (ofdm_symbol_size + nb_prefix_samples) * tc_factor;
if (N_t_2 < d_2_2) N_t_2 = d_2_2;
/* Time alignment procedure */
- // N_t_1 + N_t_2 + N_TA_max is in unit of Ts, therefore must be converted to Tc
// N_t_1 + N_t_2 + N_TA_max must be in msec
- tc_factor = 64 * 0.509 * 10e-7;
- ul_tx_timing_adjustment = 1 + ceil(slots_per_subframe*((N_t_1 + N_t_2 + N_TA_max)*tc_factor + 0.5)/t_subframe);
+ const double t_subframe = 1.0; // subframe duration of 1 msec
+ const int ul_tx_timing_adjustment = 1 + (int)ceil(slots_per_subframe*(N_t_1 + N_t_2 + N_TA_max + 0.5)/t_subframe);
if (ul_time_alignment->apply_ta == 1){
ul_time_alignment->ta_slot = (nr_slot_rx + ul_tx_timing_adjustment) % slots_per_frame;
@@ -1290,13 +1250,6 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
LOG_D(PHY,"Frame %d slot %d -- Starting UL time alignment procedures. TA update will be applied at frame %d slot %d\n", frame_rx, nr_slot_rx, ul_time_alignment->ta_frame, ul_time_alignment->ta_slot);
}
}
-
- /*ue->total_TBS[eNB_id] = ue->total_TBS[eNB_id] + dlsch0->harq_processes[dlsch0->current_harq_pid]->TBS;
- ue->total_received_bits[eNB_id] = ue->total_TBS[eNB_id] + dlsch0->harq_processes[dlsch0->current_harq_pid]->TBS;
- }*/
-
- // TODO CRC check for CW1
-
}
}
@@ -1701,9 +1654,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
nr_slot_fep(ue,
proc,
(ue->symbol_offset+i)%(fp->symbols_per_slot),
- nr_slot_rx,
- 0,
- 0);
+ nr_slot_rx);
#if UE_TIMING_TRACE
start_meas(&ue->dlsch_channel_estimation_stats);
@@ -1757,9 +1708,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
nr_slot_fep(ue,
proc,
l,
- nr_slot_rx,
- 0,
- 0);
+ nr_slot_rx);
dci_cnt = 0;
for(int n_ss = 0; n_ssnb_search_space; n_ss++) {
@@ -1819,9 +1768,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
nr_slot_fep(ue,
proc,
m, //to be updated from higher layer
- nr_slot_rx,
- 0,
- 0);
+ nr_slot_rx);
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PDSCH, VCD_FUNCTION_OUT);
}
diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c
index 76ee5a09cc..19ee8224c2 100644
--- a/openair1/SIMULATION/NR_PHY/dlsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlsim.c
@@ -205,6 +205,7 @@ int oai_nfapi_ul_tti_req(nfapi_nr_ul_tti_request_t *ul_tti_req){ return(0); }
openair0_config_t openair0_cfg[MAX_CARDS];
void update_ptrs_config(NR_CellGroupConfig_t *secondaryCellGroup, uint16_t *rbSize, uint8_t *mcsIndex,int8_t *ptrs_arg);
void update_dmrs_config(NR_CellGroupConfig_t *scg,PHY_VARS_NR_UE *ue, int8_t* dmrs_arg);
+extern void fix_scd(NR_ServingCellConfig_t *scd);// forward declaration
/* specific dlsim DL preprocessor: uses rbStart/rbSize/mcs from command line of
dlsim, does not search for CCE/PUCCH occasion but simply sets to 0 */
@@ -675,6 +676,7 @@ int main(int argc, char **argv)
rrc.carrier.servingcellconfigcommon = calloc(1,sizeof(*rrc.carrier.servingcellconfigcommon));
NR_ServingCellConfigCommon_t *scc = rrc.carrier.servingcellconfigcommon;
+ NR_ServingCellConfig_t *scd = calloc(1,sizeof(NR_ServingCellConfig_t));
NR_CellGroupConfig_t *secondaryCellGroup=calloc(1,sizeof(*secondaryCellGroup));
prepare_scc(rrc.carrier.servingcellconfigcommon);
uint64_t ssb_bitmap;
@@ -682,13 +684,18 @@ int main(int argc, char **argv)
ssb_bitmap = 1;// Enable only first SSB with index ssb_indx=0
fix_scc(scc,ssb_bitmap);
- fill_default_secondaryCellGroup(scc,
- secondaryCellGroup,
- 0,
- 1,
- n_tx,
- 0);
+ prepare_scd(scd);
+ fill_default_secondaryCellGroup(scc,
+ scd,
+ secondaryCellGroup,
+ 0,
+ 1,
+ n_tx,
+ 0);
+
+ /* RRC parameter validation for secondaryCellGroup */
+ fix_scd(scd);
/* -U option modify DMRS */
if(modify_dmrs) {
update_dmrs_config(secondaryCellGroup, NULL,dmrs_arg);
diff --git a/openair1/SIMULATION/NR_PHY/nr_unitary_defs.h b/openair1/SIMULATION/NR_PHY/nr_unitary_defs.h
index 906636d56f..b78b42db91 100644
--- a/openair1/SIMULATION/NR_PHY/nr_unitary_defs.h
+++ b/openair1/SIMULATION/NR_PHY/nr_unitary_defs.h
@@ -222,6 +222,7 @@ void fill_scc(NR_ServingCellConfigCommon_t *scc,uint64_t *ssb_bitmap,int N_RB_DL
void fix_scc(NR_ServingCellConfigCommon_t *scc,uint64_t ssbmap);
void prepare_scc(NR_ServingCellConfigCommon_t *scc);
+void prepare_scd(NR_ServingCellConfig_t *scd);
ngap_gNB_config_t ngap_config;
uint32_t ngap_generate_gNB_id(void) {return 0;}
void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port) { return;}
diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c
index 7b845c5bd3..a3c2501197 100644
--- a/openair1/SIMULATION/NR_PHY/pbchsim.c
+++ b/openair1/SIMULATION/NR_PHY/pbchsim.c
@@ -101,8 +101,8 @@ void nr_phy_config_request_sim_pbchsim(PHY_VARS_gNB *gNB,
//gNB_config->subframe_config.dl_cyclic_prefix_type.value = (fp->Ncp == NORMAL) ? NFAPI_CP_NORMAL : NFAPI_CP_EXTENDED;
gNB->mac_enabled = 1;
- fp->dl_CarrierFreq = 3500000000;//from_nrarfcn(gNB_config->nfapi_config.rf_bands.rf_band[0],gNB_config->nfapi_config.nrarfcn.value);
- fp->ul_CarrierFreq = 3500000000;//fp->dl_CarrierFreq - (get_uldl_offset(gNB_config->nfapi_config.rf_bands.rf_band[0])*100000);
+ fp->dl_CarrierFreq = 3600000000;//from_nrarfcn(gNB_config->nfapi_config.rf_bands.rf_band[0],gNB_config->nfapi_config.nrarfcn.value);
+ fp->ul_CarrierFreq = 3600000000;//fp->dl_CarrierFreq - (get_uldl_offset(gNB_config->nfapi_config.rf_bands.rf_band[0])*100000);
if (mu>2) fp->nr_band = 257;
else fp->nr_band = 78;
fp->threequarter_fs= 0;
@@ -692,9 +692,7 @@ int main(int argc, char **argv)
nr_slot_fep(UE,
&proc,
i%frame_parms->symbols_per_slot,
- ssb_slot,
- 0,
- 0);
+ ssb_slot);
nr_pbch_channel_estimation(UE,&proc,0,ssb_slot,i%frame_parms->symbols_per_slot,i-(UE->symbol_offset+1),ssb_index%8,n_hf);
diff --git a/openair1/SIMULATION/NR_PHY/prachsim.c b/openair1/SIMULATION/NR_PHY/prachsim.c
index 8bd54ec345..74ca8d9184 100644
--- a/openair1/SIMULATION/NR_PHY/prachsim.c
+++ b/openair1/SIMULATION/NR_PHY/prachsim.c
@@ -465,7 +465,10 @@ int main(int argc, char **argv){
nr_phy_config_request_sim(gNB, N_RB_UL, N_RB_UL, mu, Nid_cell, SSB_positions);
- uint64_t absoluteFrequencyPointA = (mu==1 ? 640000 : 2070833);
+ uint64_t absoluteFrequencyPointA = to_nrarfcn(frame_parms->nr_band,
+ frame_parms->dl_CarrierFreq,
+ frame_parms->numerology_index,
+ frame_parms->N_RB_UL*(180e3)*(1 << frame_parms->numerology_index));
uint8_t subframe = slot/frame_parms->slots_per_subframe;
diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c
index 2b0f713f7f..fce690ebd2 100644
--- a/openair1/SIMULATION/NR_PHY/ulsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulsim.c
@@ -82,6 +82,7 @@ double cpuf;
//uint8_t nfapi_mode = 0;
uint64_t downlink_frequency[MAX_NUM_CCs][4];
+extern void fix_scd(NR_ServingCellConfig_t *scd);// forward declaration
int8_t nr_mac_rrc_data_ind_ue(const module_id_t module_id, const int CC_id, const uint8_t gNB_index,
const int8_t channel, const uint8_t* pduP, const sdu_size_t pdu_len) { return 0; }
@@ -619,8 +620,8 @@ int main(int argc, char **argv)
frame_parms = &gNB->frame_parms; //to be initialized I suppose (maybe not necessary for PBCH)
- frame_parms->nb_antennas_tx = n_tx;
- frame_parms->nb_antennas_rx = n_rx;
+ //frame_parms->nb_antennas_tx = n_tx;
+ //frame_parms->nb_antennas_rx = n_rx;
frame_parms->N_RB_DL = N_RB_DL;
frame_parms->N_RB_UL = N_RB_UL;
frame_parms->Ncp = extended_prefix_flag ? EXTENDED : NORMAL;
@@ -638,6 +639,7 @@ int main(int argc, char **argv)
rrc.carrier.servingcellconfigcommon = calloc(1,sizeof(*rrc.carrier.servingcellconfigcommon));
NR_ServingCellConfigCommon_t *scc = rrc.carrier.servingcellconfigcommon;
+ NR_ServingCellConfig_t *scd = calloc(1,sizeof(NR_ServingCellConfig_t));
NR_CellGroupConfig_t *secondaryCellGroup=calloc(1,sizeof(*secondaryCellGroup));
prepare_scc(rrc.carrier.servingcellconfigcommon);
uint64_t ssb_bitmap;
@@ -645,7 +647,10 @@ int main(int argc, char **argv)
fix_scc(scc,ssb_bitmap);
+ prepare_scd(scd);
+
fill_default_secondaryCellGroup(scc,
+ scd,
secondaryCellGroup,
0,
1,
@@ -654,11 +659,14 @@ int main(int argc, char **argv)
// xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)secondaryCellGroup);
+ /* RRC parameter validation for secondaryCellGroup */
+ fix_scd(scd);
+
AssertFatal((gNB->if_inst = NR_IF_Module_init(0))!=NULL,"Cannot register interface");
gNB->if_inst->NR_PHY_config_req = nr_phy_config_request;
// common configuration
- rrc_mac_config_req_gNB(0,0,1,1,pusch_tgt_snrx10,pucch_tgt_snrx10,scc,0,0,NULL);
+ rrc_mac_config_req_gNB(0,0,n_tx,n_rx,pusch_tgt_snrx10,pucch_tgt_snrx10,scc,0,0,NULL);
// UE dedicated configuration
rrc_mac_config_req_gNB(0,0,1,1,pusch_tgt_snrx10,pucch_tgt_snrx10,NULL,1,secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup);
phy_init_nr_gNB(gNB,0,0);
@@ -1065,70 +1073,69 @@ int main(int argc, char **argv)
}
- nr_fill_ulsch(gNB,frame,slot,pusch_pdu);
+ //nr_fill_ulsch(gNB,frame,slot,pusch_pdu); // Not needed as its its already filled as apart of "nr_schedule_response(Sched_INFO);"
for (int i=0;i<(TBS/8);i++) ulsch_ue[0]->harq_processes[harq_pid]->a[i]=i&0xff;
if (input_fd == NULL) {
- // set FAPI parameters for UE, put them in the scheduled response and call
- nr_ue_scheduled_response(&scheduled_response);
-
-
- /////////////////////////phy_procedures_nr_ue_TX///////////////////////
- ///////////
-
- phy_procedures_nrUE_TX(UE, &UE_proc, gNB_id);
-
-
- if (n_trials==1) {
- LOG_M("txsig0.m","txs0", UE->common_vars.txdata[0],frame_parms->samples_per_subframe*10,1,1);
- LOG_M("txsig0F.m","txs0F", UE->common_vars.txdataF[0],frame_parms->ofdm_symbol_size*14,1,1);
- }
- ///////////
- ////////////////////////////////////////////////////
- tx_offset = frame_parms->get_samples_slot_timestamp(slot,frame_parms,0);
-
- txlev = signal_energy(&UE->common_vars.txdata[0][tx_offset + 5*frame_parms->ofdm_symbol_size + 4*frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0],
- frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples);
+ // set FAPI parameters for UE, put them in the scheduled response and call
+ nr_ue_scheduled_response(&scheduled_response);
+
+
+ /////////////////////////phy_procedures_nr_ue_TX///////////////////////
+ ///////////
+
+ phy_procedures_nrUE_TX(UE, &UE_proc, gNB_id);
+
+
+ if (n_trials==1) {
+ LOG_M("txsig0.m","txs0", UE->common_vars.txdata[0],frame_parms->samples_per_subframe*10,1,1);
+ LOG_M("txsig0F.m","txs0F", UE->common_vars.txdataF[0],frame_parms->ofdm_symbol_size*14,1,1);
+ }
+ ///////////
+ ////////////////////////////////////////////////////
+ tx_offset = frame_parms->get_samples_slot_timestamp(slot,frame_parms,0);
+
+ txlev = signal_energy(&UE->common_vars.txdata[0][tx_offset + 5*frame_parms->ofdm_symbol_size + 4*frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0],
+ frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples);
}
else n_trials = 1;
if (input_fd == NULL ) {
- sigma_dB = 10 * log10((double)txlev * ((double)frame_parms->ofdm_symbol_size/(12*nb_rb))) - SNR;;
- sigma = pow(10,sigma_dB/10);
+ sigma_dB = 10 * log10((double)txlev * ((double)frame_parms->ofdm_symbol_size/(12*nb_rb))) - SNR;;
+ sigma = pow(10,sigma_dB/10);
- if(n_trials==1) printf("sigma %f (%f dB), txlev %f (factor %f)\n",sigma,sigma_dB,10*log10((double)txlev),(double)(double)frame_parms->ofdm_symbol_size/(12*nb_rb));
+ if(n_trials==1) printf("sigma %f (%f dB), txlev %f (factor %f)\n",sigma,sigma_dB,10*log10((double)txlev),(double)(double)
+ frame_parms->ofdm_symbol_size/(12*nb_rb));
- for (i=0; icommon_vars.txdata[aa][slot_offset]))[(i<<1)]);
- s_im[aa][i] = ((double)(((short *)&UE->common_vars.txdata[aa][slot_offset]))[(i<<1)+1]);
- }
- }
-
+ for (i=0; inb_antennas_rx; aa++) {
+ s_re[aa][i] = ((double)(((short *)&UE->common_vars.txdata[aa][slot_offset]))[(i<<1)]);
+ s_im[aa][i] = ((double)(((short *)&UE->common_vars.txdata[aa][slot_offset]))[(i<<1)+1]);
+ }
+ }
- if (UE2gNB->max_Doppler == 0) {
- multipath_channel(UE2gNB,s_re,s_im,r_re,r_im,
- slot_length,0,(n_trials==1)?1:0);
- } else {
- multipath_tv_channel(UE2gNB,s_re,s_im,r_re,r_im,
- 2*slot_length,0);
- }
- for (i=0; inb_antennas_rx; ap++) {
- ((int16_t*) &gNB->common_vars.rxdata[ap][slot_offset])[(2*i) + (delay*2)] = (int16_t)((r_re[ap][i]) + (sqrt(sigma/2)*gaussdouble(0.0,1.0))); // convert to fixed point
- ((int16_t*) &gNB->common_vars.rxdata[ap][slot_offset])[(2*i)+1 + (delay*2)] = (int16_t)((r_im[ap][i]) + (sqrt(sigma/2)*gaussdouble(0.0,1.0)));
+
+ if (UE2gNB->max_Doppler == 0) {
+ multipath_channel(UE2gNB, s_re, s_im, r_re, r_im, slot_length, 0, (n_trials==1)?1:0);
+ } else {
+ multipath_tv_channel(UE2gNB, s_re, s_im, r_re, r_im, 2*slot_length, 0);
+ }
+ for (i=0; inb_antennas_rx; ap++) {
+ ((int16_t*) &gNB->common_vars.rxdata[ap][slot_offset])[(2*i) + (delay*2)] = (int16_t)((r_re[ap][i]) + (sqrt(sigma/2)*gaussdouble(0.0,1.0))); // convert to fixed point
+ ((int16_t*) &gNB->common_vars.rxdata[ap][slot_offset])[(2*i)+1 + (delay*2)] = (int16_t)((r_im[ap][i]) + (sqrt(sigma/2)*gaussdouble(0.0,1.0)));
/* Add phase noise if enabled */
if (pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {
phase_noise(ts, &((int16_t*)&gNB->common_vars.rxdata[ap][slot_offset])[(2*i)],
&((int16_t*)&gNB->common_vars.rxdata[ap][slot_offset])[(2*i)+1]);
}
- }
- }
+ }
+ }
- }
+ } /*End input_fd */
if(pusch_pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {
diff --git a/openair2/COMMON/rrc_messages_types.h b/openair2/COMMON/rrc_messages_types.h
index a2968391d0..64c42eaf0e 100644
--- a/openair2/COMMON/rrc_messages_types.h
+++ b/openair2/COMMON/rrc_messages_types.h
@@ -42,6 +42,7 @@
#include "LTE_SL-DiscResourcePool-r12.h"
#include "NR_RACH-ConfigCommon.h"
#include "NR_ServingCellConfigCommon.h"
+#include "NR_ServingCellConfig.h"
//-------------------------------------------------------------------------------------------//
// Messages for RRC logging
#if defined(DISABLE_ITTI_XER_PRINT)
@@ -405,6 +406,7 @@ typedef struct NRRrcConfigurationReq_s {
uint16_t mnc[PLMN_LIST_MAX_SIZE];
uint8_t mnc_digit_length[PLMN_LIST_MAX_SIZE];
NR_ServingCellConfigCommon_t *scc;
+ NR_ServingCellConfig_t *scd;
int ssb_SubcarrierOffset;
int pdsch_AntennaPorts;
int pusch_AntennaPorts;
diff --git a/openair2/GNB_APP/RRC_nr_paramsvalues.h b/openair2/GNB_APP/RRC_nr_paramsvalues.h
index 1f1d076e9d..d05908e8ed 100644
--- a/openair2/GNB_APP/RRC_nr_paramsvalues.h
+++ b/openair2/GNB_APP/RRC_nr_paramsvalues.h
@@ -211,6 +211,24 @@
#define CARRIERBANDWIDTH_OKVALUES {11,18,24,25,31,32,38,51,52,65,66,78,79,93,106,107,121,132,133,135,160,162,189,216,217,245,264,270,273}
+/* Serving Cell Config Dedicated */
+#define GNB_CONFIG_STRING_SERVINGCELLCONFIGDEDICATED "servingCellConfigDedicated"
+#define GNB_CONFIG_STRING_DLPTRSFREQDENSITY0_0 "dl_ptrsFreqDensity0_0"
+#define GNB_CONFIG_STRING_DLPTRSFREQDENSITY1_0 "dl_ptrsFreqDensity1_0"
+#define GNB_CONFIG_STRING_DLPTRSTIMEDENSITY0_0 "dl_ptrsTimeDensity0_0"
+#define GNB_CONFIG_STRING_DLPTRSTIMEDENSITY1_0 "dl_ptrsTimeDensity1_0"
+#define GNB_CONFIG_STRING_DLPTRSTIMEDENSITY2_0 "dl_ptrsTimeDensity2_0"
+#define GNB_CONFIG_STRING_DLPTRSEPRERATIO_0 "dl_ptrsEpreRatio_0"
+#define GNB_CONFIG_STRING_DLPTRSREOFFSET_0 "dl_ptrsReOffset_0"
+#define GNB_CONFIG_STRING_ULPTRSFREQDENSITY0_0 "ul_ptrsFreqDensity0_0"
+#define GNB_CONFIG_STRING_ULPTRSFREQDENSITY1_0 "ul_ptrsFreqDensity1_0"
+#define GNB_CONFIG_STRING_ULPTRSTIMEDENSITY0_0 "ul_ptrsTimeDensity0_0"
+#define GNB_CONFIG_STRING_ULPTRSTIMEDENSITY1_0 "ul_ptrsTimeDensity1_0"
+#define GNB_CONFIG_STRING_ULPTRSTIMEDENSITY2_0 "ul_ptrsTimeDensity2_0"
+#define GNB_CONFIG_STRING_ULPTRSREOFFSET_0 "ul_ptrsReOffset_0"
+#define GNB_CONFIG_STRING_ULPTRSMAXPORTS_0 "ul_ptrsMaxPorts_0"
+#define GNB_CONFIG_STRING_ULPTRSPOWER_0 "ul_ptrsPower_0"
+
/*--------------------------------------------------------------------------------------------------------------------*/
/* pdcch_ConfigSIB1 parameters */
/*--------------------------------------------------------------------------------------------------------------------*/
@@ -395,6 +413,26 @@
{GNB_CONFIG_STRING_SSPBCHBLOCKPOWER,NULL,0,i64ptr:&scc->ss_PBCH_BlockPower,defint64val:20,TYPE_INT64,0}, \
{GNB_CONFIG_STRING_MSG1SUBCARRIERSPACING,NULL,0,i64ptr:scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg1_SubcarrierSpacing,defintval:-1,TYPE_INT64,0}}
+/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
+/* Serving Cell Config Dedicated configuration parameters */
+/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+#define SCDPARAMS_DESC(scd) { \
+{GNB_CONFIG_STRING_DLPTRSFREQDENSITY0_0,NULL,0,i64ptr:scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->frequencyDensity->list.array[0],defint64val:-1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_DLPTRSFREQDENSITY1_0,NULL,0,i64ptr:scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->frequencyDensity->list.array[1],defint64val:-1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_DLPTRSTIMEDENSITY0_0,NULL,0,i64ptr:scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->timeDensity->list.array[0],defint64val:-1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_DLPTRSTIMEDENSITY1_0,NULL,0,i64ptr:scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->timeDensity->list.array[1],defint64val:-1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_DLPTRSTIMEDENSITY2_0,NULL,0,i64ptr:scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->timeDensity->list.array[2],defint64val:-1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_DLPTRSEPRERATIO_0,NULL,0,i64ptr:scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->epre_Ratio,defint64val:-1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_DLPTRSREOFFSET_0,NULL,0,i64ptr:scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->resourceElementOffset,defint64val:-1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_ULPTRSFREQDENSITY0_0,NULL,0,i64ptr:scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[0],defint64val:-1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_ULPTRSFREQDENSITY1_0,NULL,0,i64ptr:scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[1],defint64val:-1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_ULPTRSTIMEDENSITY0_0,NULL,0,i64ptr:scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[0],defint64val:-1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_ULPTRSTIMEDENSITY1_0,NULL,0,i64ptr:scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[1],defint64val:-1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_ULPTRSTIMEDENSITY2_0,NULL,0,i64ptr:scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[2],defint64val:-1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_ULPTRSREOFFSET_0,NULL,0,i64ptr:scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset,defint64val:-1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_ULPTRSMAXPORTS_0,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->maxNrofPorts,defint64val:0,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_ULPTRSPOWER_0,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->ptrs_Power,defint64val:0,TYPE_INT64,0}}
diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c
index 0600ee408a..48176943a7 100644
--- a/openair2/GNB_APP/gnb_config.c
+++ b/openair2/GNB_APP/gnb_config.c
@@ -293,6 +293,171 @@ void fix_scc(NR_ServingCellConfigCommon_t *scc,uint64_t ssbmap) {
}
}
+/* Function to allocate dedicated serving cell config strutures */
+void prepare_scd(NR_ServingCellConfig_t *scd) {
+ // Allocate downlink structures
+
+ scd->downlinkBWP_ToAddModList = CALLOC(1, sizeof(scd->downlinkBWP_ToAddModList));
+
+ // Downlink bandwidth part
+ NR_BWP_Downlink_t *bwp = calloc(1, sizeof(*bwp));
+ bwp->bwp_Id = 1;
+
+ // Allocate downlink dedicated bandwidth part and PDSCH structures
+ bwp->bwp_Dedicated = calloc(1, sizeof(*bwp->bwp_Dedicated));
+ bwp->bwp_Dedicated->pdsch_Config = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config));
+ bwp->bwp_Dedicated->pdsch_Config->present = NR_SetupRelease_PDSCH_Config_PR_setup;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup));
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA));
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->present = NR_SetupRelease_DMRS_DownlinkConfig_PR_setup;
+
+ // Allocate DL DMRS and PTRS configuration
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup));
+ NR_DMRS_DownlinkConfig_t *NR_DMRS_DownlinkCfg = bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup;
+ NR_DMRS_DownlinkCfg->phaseTrackingRS=CALLOC(1, sizeof(*NR_DMRS_DownlinkCfg->phaseTrackingRS));
+ NR_DMRS_DownlinkCfg->phaseTrackingRS->present = NR_SetupRelease_PTRS_DownlinkConfig_PR_setup;
+ NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup = CALLOC(1, sizeof(*NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup));
+ NR_PTRS_DownlinkConfig_t *NR_PTRS_DownlinkCfg = NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup;
+ NR_PTRS_DownlinkCfg->frequencyDensity = CALLOC(1, sizeof(NR_PTRS_DownlinkCfg->frequencyDensity));
+ int *dl_rbs[2];
+ for (int i=0;i<2;i++) {
+ dl_rbs[i] = CALLOC(1, sizeof(*dl_rbs[i]));
+ *dl_rbs[i] = 0;
+ ASN_SEQUENCE_ADD(&NR_PTRS_DownlinkCfg->frequencyDensity->list, dl_rbs[i]);
+ }
+ NR_PTRS_DownlinkCfg->timeDensity = CALLOC(1, sizeof(NR_PTRS_DownlinkCfg->timeDensity));
+ int *dl_mcs[3];
+ for (int i=0;i<3;i++) {
+ dl_mcs[i] = CALLOC(1, sizeof(*dl_mcs[i]));
+ *dl_mcs[i] = 0;
+ ASN_SEQUENCE_ADD(&NR_PTRS_DownlinkCfg->timeDensity->list, dl_mcs[i]);
+ }
+ NR_PTRS_DownlinkCfg->epre_Ratio = CALLOC(1, sizeof(NR_PTRS_DownlinkCfg->epre_Ratio));
+ NR_PTRS_DownlinkCfg->resourceElementOffset = CALLOC(1, sizeof(NR_PTRS_DownlinkCfg->resourceElementOffset));
+ *NR_PTRS_DownlinkCfg->resourceElementOffset = 0;
+ ASN_SEQUENCE_ADD(&scd->downlinkBWP_ToAddModList->list,bwp);
+
+ // Allocate uplink structures
+
+ scd->uplinkConfig = CALLOC(1, sizeof(NR_UplinkConfig_t));
+ scd->uplinkConfig->uplinkBWP_ToAddModList = CALLOC(1, sizeof(scd->uplinkConfig->uplinkBWP_ToAddModList));
+
+ NR_PUSCH_Config_t *pusch_Config = CALLOC(1, sizeof(*pusch_Config));
+
+ // Allocate UL DMRS and PTRS structures
+ pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB = CALLOC(1, sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB));
+ pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->present = NR_SetupRelease_DMRS_UplinkConfig_PR_setup;
+ pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup = CALLOC(1, sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup));
+ NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup;
+ NR_DMRS_UplinkConfig->phaseTrackingRS = CALLOC(1, sizeof(*NR_DMRS_UplinkConfig->phaseTrackingRS));
+ NR_DMRS_UplinkConfig->phaseTrackingRS->present = NR_SetupRelease_PTRS_UplinkConfig_PR_setup;
+ NR_DMRS_UplinkConfig->phaseTrackingRS->choice.setup = CALLOC(1, sizeof(*NR_DMRS_UplinkConfig->phaseTrackingRS->choice.setup));
+ NR_PTRS_UplinkConfig_t *NR_PTRS_UplinkConfig = NR_DMRS_UplinkConfig->phaseTrackingRS->choice.setup;
+ NR_PTRS_UplinkConfig->transformPrecoderDisabled = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled));
+ NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity));
+ int *n_rbs[2];
+ for (int i=0;i<2;i++) {
+ n_rbs[i] = CALLOC(1, sizeof(*n_rbs[i]));
+ *n_rbs[i] = 0;
+ ASN_SEQUENCE_ADD(&NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity->list, n_rbs[i]);
+ }
+ NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity));
+ int *ptrs_mcs[3];
+ for (int i = 0; i < 3; i++) {
+ ptrs_mcs[i] = CALLOC(1, sizeof(*ptrs_mcs[i]));
+ *ptrs_mcs[i] = 0;
+ ASN_SEQUENCE_ADD(&NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity->list, ptrs_mcs[i]);
+ }
+ NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset = CALLOC(1, sizeof(NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset));
+ *NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset = 0;
+
+ // UL bandwidth part
+ NR_BWP_Uplink_t *ubwp = CALLOC(1, sizeof(*ubwp));
+ ubwp->bwp_Id = 1;
+ ubwp->bwp_Dedicated = CALLOC(1, sizeof(*ubwp->bwp_Dedicated));
+
+ ubwp->bwp_Dedicated->pusch_Config = CALLOC(1, sizeof(*ubwp->bwp_Dedicated->pusch_Config));
+ ubwp->bwp_Dedicated->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup;
+ ubwp->bwp_Dedicated->pusch_Config->choice.setup = pusch_Config;
+
+ ASN_SEQUENCE_ADD(&scd->uplinkConfig->uplinkBWP_ToAddModList->list,ubwp);
+}
+
+/* This function checks dedicated serving cell configuration and performs fixes as needed */
+void fix_scd(NR_ServingCellConfig_t *scd) {
+ // Check for DL PTRS parameters validity
+ if (scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS) {
+ // If any of the frequencyDensity values are not set or are out of bounds, PTRS is assumed to be not present
+ for (int i = scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->frequencyDensity->list.count-1; i >= 0; i--) {
+ if ((*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->frequencyDensity->list.array[i] < 1)
+ || (*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->frequencyDensity->list.array[i] > 276)) {
+ LOG_I(RRC, "DL PTRS frequencyDensity %d not set. Assuming PTRS not present! \n", i);
+ free(scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS);
+ scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS = NULL;
+ break;
+ }
+ }
+ }
+ if (scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS) {
+ // If any of the timeDensity values are not set or are out of bounds, PTRS is assumed to be not present
+ for (int i = scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->timeDensity->list.count-1; i >= 0; i--) {
+ if ((*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->timeDensity->list.array[i] < 0)
+ || (*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->timeDensity->list.array[i] > 29)) {
+ LOG_I(RRC, "DL PTRS timeDensity %d not set. Assuming PTRS not present! \n", i);
+ free(scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS);
+ scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS = NULL;
+ break;
+ }
+ }
+ }
+ if (scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS) {
+ if (*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->resourceElementOffset > 2) {
+ LOG_I(RRC, "Freeing DL PTRS resourceElementOffset \n");
+ free(scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->resourceElementOffset);
+ scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->resourceElementOffset = NULL;
+ }
+ if (*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->epre_Ratio > 1) {
+ LOG_I(RRC, "Freeing DL PTRS epre_Ratio \n");
+ free(scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->epre_Ratio);
+ scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->epre_Ratio = NULL;
+ }
+ }
+
+ if (scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS) {
+ // If any of the frequencyDensity values are not set or are out of bounds, PTRS is assumed to be not present
+ for (int i = scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.count-1; i >= 0; i--) {
+ if ((*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[i] < 1)
+ || (*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[i] > 276)) {
+ LOG_I(RRC, "UL PTRS frequencyDensity %d not set. Assuming PTRS not present! \n", i);
+ free(scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS);
+ scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS = NULL;
+ break;
+ }
+ }
+ }
+
+ if (scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS) {
+ // If any of the timeDensity values are not set or are out of bounds, PTRS is assumed to be not present
+ for (int i = scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.count-1; i >= 0; i--) {
+ if ((*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[i] < 0)
+ || (*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[i] > 29)) {
+ LOG_I(RRC, "UL PTRS timeDensity %d not set. Assuming PTRS not present! \n", i);
+ free(scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS);
+ scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS = NULL;
+ break;
+ }
+ }
+ }
+ if (scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS) {
+ // Check for UL PTRS parameters validity
+ if (*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset > 2) {
+ LOG_I(RRC, "Freeing UL PTRS resourceElementOffset \n");
+ free(scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset);
+ scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset = NULL;
+ }
+ }
+}
+
void RCconfig_nr_flexran()
{
uint16_t i;
@@ -627,6 +792,13 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) {
prepare_scc(scc);
paramdef_t SCCsParams[] = SCCPARAMS_DESC(scc);
paramlist_def_t SCCsParamList = {GNB_CONFIG_STRING_SERVINGCELLCONFIGCOMMON, NULL, 0};
+
+ // Serving Cell Config Dedicated
+ NR_ServingCellConfig_t *scd = calloc(1,sizeof(NR_ServingCellConfig_t));
+ memset((void*)scd,0,sizeof(NR_ServingCellConfig_t));
+ prepare_scd(scd);
+ paramdef_t SCDsParams[] = SCDPARAMS_DESC(scd);
+ paramlist_def_t SCDsParamList = {GNB_CONFIG_STRING_SERVINGCELLCONFIGDEDICATED, NULL, 0};
////////// Physical parameters
@@ -700,6 +872,23 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) {
(int)scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.preambleReceivedTargetPower);
fix_scc(scc,ssb_bitmap);
}
+
+ sprintf(aprefix, "%s.[%i]", GNB_CONFIG_STRING_GNB_LIST, 0);
+
+ config_getlist(&SCDsParamList, NULL, 0, aprefix);
+ if (SCDsParamList.numelt > 0) {
+ sprintf(aprefix, "%s.[%i].%s.[%i]", GNB_CONFIG_STRING_GNB_LIST,0,GNB_CONFIG_STRING_SERVINGCELLCONFIGDEDICATED, 0);
+ config_get( SCDsParams,sizeof(SCDsParams)/sizeof(paramdef_t),aprefix);
+ LOG_I(RRC,"Read in ServingCellConfigDedicated UL (FreqDensity_0 %d, FreqDensity_1 %d, TimeDensity_0 %d, TimeDensity_1 %d, TimeDensity_2 %d, RE offset %d \n",
+ (int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[0],
+ (int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[1],
+ (int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[0],
+ (int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[1],
+ (int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[2],
+ (int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset);
+ }
+ fix_scd(scd);
+
printf("NRRRC %d: Southbound Transport %s\n",i,*(GNBParamList.paramarray[i][GNB_TRANSPORT_S_PREFERENCE_IDX].strptr));
if (strcmp(*(GNBParamList.paramarray[i][GNB_TRANSPORT_S_PREFERENCE_IDX].strptr), "local_mac") == 0) {
@@ -772,6 +961,7 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) {
printf("pucch_TargetSNRx10 %d\n",*GNBParamList.paramarray[i][GNB_PUCCH_TARGETPOW_X10_IDX].iptr);
NRRRC_CONFIGURATION_REQ (msg_p).pucch_TargetSNRx10 = *GNBParamList.paramarray[i][GNB_PUCCH_TARGETPOW_X10_IDX].iptr;
NRRRC_CONFIGURATION_REQ (msg_p).scc = scc;
+ NRRRC_CONFIGURATION_REQ (msg_p).scd = scd;
}//
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
index ce4e0f81f3..cdeb23c099 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
@@ -1402,19 +1402,17 @@ int get_nr_prach_info_from_index(uint8_t index,
if (table_6_3_3_2_3_prachConfig_Index[index][1] != -1)
format2 = (uint8_t) table_6_3_3_2_3_prachConfig_Index[index][1];
*format = ((uint8_t) table_6_3_3_2_3_prachConfig_Index[index][0]) | (format2<<8);
- LOG_D(MAC,"Frame %d slot %d: Getting PRACH info from index %d (col 6 %lu) absoluteFrequencyPointA %u mu %u frame_type %u start_symbol %u N_t_slot %u N_dur %u N_RA_slot %u RA_sfn_index %u \n",
- frame,
- slot,
- index,
- table_6_3_3_2_3_prachConfig_Index[index][6],
- pointa,
- mu,
- unpaired,
- *start_symbol,
- *N_t_slot,
- *N_dur,
- *N_RA_slot,
- *RA_sfn_index);
+ LOG_D(MAC,"Frame %d slot %d: Getting PRACH info from index %d (col 6 %lu) absoluteFrequencyPointA %u mu %u frame_type %u start_symbol %u N_t_slot %u N_dur %u N_RA_slot %u RA_sfn_index %u \n", frame,
+ slot,
+ index, table_6_3_3_2_3_prachConfig_Index[index][6],
+ pointa,
+ mu,
+ unpaired,
+ *start_symbol,
+ *N_t_slot,
+ *N_dur,
+ *N_RA_slot,
+ *RA_sfn_index);
}
return 1;
}
@@ -3001,7 +2999,12 @@ bool set_dl_ptrs_values(NR_PTRS_DownlinkConfig_t *ptrs_config,
valid = false;
return valid;
}
- //printf("[MAC] PTRS is set K= %u L= %u\n", *K_ptrs,1<<*L_ptrs);
+
+ /* Moved below check from scheduler function to here */
+ if (*L_ptrs >= NrOfSymbols) {
+ valid = false;
+ return valid;
+ }
return valid;
}
@@ -3375,3 +3378,79 @@ int get_type0_PDCCH_CSS_config_parameters(NR_Type0_PDCCH_CSS_config_t *type0_PDC
return 0;
}
+
+/* extract UL PTRS values from RRC and validate it based upon 38.214 6.2.3 */
+bool set_ul_ptrs_values(NR_PTRS_UplinkConfig_t *ul_ptrs_config,
+ uint16_t rbSize,uint8_t mcsIndex, uint8_t mcsTable,
+ uint8_t *K_ptrs, uint8_t *L_ptrs,
+ uint8_t *reOffset, uint8_t *maxNumPorts, uint8_t *ulPower,
+ uint8_t NrOfSymbols)
+{
+ bool valid = true;
+
+ /* as defined in T 38.214 6.2.3 */
+ if(rbSize < 3) {
+ valid = false;
+ return valid;
+ }
+ /* Check for Frequency Density values */
+ if(ul_ptrs_config->transformPrecoderDisabled->frequencyDensity->list.count < 2) {
+ /* Default value for K_PTRS = 2 as defined in T 38.214 6.2.3 */
+ *K_ptrs = 2;
+ }
+ else {
+ *K_ptrs = get_K_ptrs(*ul_ptrs_config->transformPrecoderDisabled->frequencyDensity->list.array[0],
+ *ul_ptrs_config->transformPrecoderDisabled->frequencyDensity->list.array[1],
+ rbSize);
+ }
+ /* Check for time Density values */
+ if(ul_ptrs_config->transformPrecoderDisabled->timeDensity->list.count < 3) {
+ *L_ptrs = 0;
+ }
+ else {
+ *L_ptrs = get_L_ptrs(*ul_ptrs_config->transformPrecoderDisabled->timeDensity->list.array[0],
+ *ul_ptrs_config->transformPrecoderDisabled->timeDensity->list.array[1],
+ *ul_ptrs_config->transformPrecoderDisabled->timeDensity->list.array[2],
+ mcsIndex,
+ mcsTable);
+ }
+
+ *reOffset = *ul_ptrs_config->transformPrecoderDisabled->resourceElementOffset;
+ *maxNumPorts = ul_ptrs_config->transformPrecoderDisabled->maxNrofPorts;
+ *ulPower = ul_ptrs_config->transformPrecoderDisabled->ptrs_Power;
+ /* If either or both of the parameters PT-RS time density (LPT-RS) and PT-RS frequency density (KPT-RS), shown in Table
+ * 6.2.3.1-1 and Table 6.2.3.1-2, indicates that 'PT-RS not present', the UE shall assume that PT-RS is not present
+ */
+ if(*K_ptrs ==2 || *K_ptrs ==4 ) {
+ valid = true;
+ }
+ else {
+ valid = false;
+ return valid;
+ }
+ if(*L_ptrs ==0 || *L_ptrs ==1 || *L_ptrs ==2 ) {
+ valid = true;
+ }
+ else {
+ valid = false;
+ return valid;
+ }
+ /* PTRS is not present also :
+ * When the UE is receiving a PUSCH with allocation duration of 4 symbols and if LPT-RS is set to 4, the UE shall assume
+ * PT-RS is not transmitted
+ * When the UE is receiving a PUSCH with allocation duration of 2 symbols as defined in Clause 6.4.1.2.2 of [4, TS
+ * 38.211] and if LPT-RS is set to 2 or 4, the UE shall assume PT-RS is not transmitted.
+ */
+ if((NrOfSymbols == 4 && *L_ptrs ==2) || ((NrOfSymbols == 2 && *L_ptrs > 0))) {
+ valid = false;
+ return valid;
+ }
+
+ /* Moved below check from nr_ue_scheduler function to here */
+ if (*L_ptrs >= NrOfSymbols) {
+ valid = false;
+ return valid;
+ }
+ return valid;
+}
+
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
index ffb36963a7..3e21131b69 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
@@ -81,7 +81,7 @@ int get_nr_prach_info_from_index(uint8_t index,
uint8_t *N_dur,
uint16_t *RA_sfn_index,
uint8_t *N_RA_slot,
- uint8_t *config_period);
+ uint8_t *config_period);
int get_nr_prach_occasion_info_from_index(uint8_t index,
uint32_t pointa,
@@ -141,6 +141,11 @@ bool set_dl_ptrs_values(NR_PTRS_DownlinkConfig_t *ptrs_config,
uint8_t *nERatio,uint8_t *reOffset,
uint8_t NrOfSymbols);
+bool set_ul_ptrs_values(NR_PTRS_UplinkConfig_t *ul_ptrs_config,
+ uint16_t rbSize,uint8_t mcsIndex, uint8_t mcsTable,
+ uint8_t *K_ptrs, uint8_t *L_ptrs,
+ uint8_t *reOffset, uint8_t *maxNumPorts, uint8_t *ulPower,
+ uint8_t NrOfSymbols);
uint8_t get_num_dmrs_symbols(NR_PDSCH_Config_t *pdsch_Config,int dmrs_TypeA_Position,int NrOfSymbols);
/* \brief Set the transform precoding according to 6.1.3 of 3GPP TS 38.214 version 16.3.0 Release 16
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
index 568d1808de..cb104092f1 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
@@ -583,7 +583,6 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
}
}
-
break;
}
@@ -1020,6 +1019,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
&dlsch_config_pdu_1_1->PTRSReOffset, dlsch_config_pdu_1_1->number_symbols);
if(valid_ptrs_setup==true) {
dlsch_config_pdu_1_1->pduBitmap |= 0x1;
+ LOG_D(MAC, "DL PTRS values: PTRS time den: %d, PTRS freq den: %d\n", dlsch_config_pdu_1_1->PTRSTimeDensity, dlsch_config_pdu_1_1->PTRSFreqDensity);
}
}
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
index 194df8101f..ad1958ef33 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
@@ -561,20 +561,11 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
} else if (dci) {
int target_ss;
- uint8_t ptrs_time_density;
- uint8_t ptrs_freq_density;
- nfapi_nr_ue_ptrs_ports_t ptrs_ports_list;
+ bool valid_ptrs_setup = 0;
uint16_t n_RB_ULBWP = NRRIV2BW(mac->ULbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
fapi_nr_pusch_config_dedicated_t *pusch_config_dedicated = &mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated;
NR_PUSCH_Config_t *pusch_Config = mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup;
- // These should come from RRC config!!!
- uint8_t ptrs_mcs1 = 2;
- uint8_t ptrs_mcs2 = 4;
- uint8_t ptrs_mcs3 = 10;
- uint16_t n_rb0 = 25;
- uint16_t n_rb1 = 75;
-
// Basic sanity check for MCS value to check for a false or erroneous DCI
if (dci->mcs > 28) {
LOG_W(MAC, "MCS value %d out of bounds! Possibly due to false DCI. Ignoring DCI!\n", dci->mcs);
@@ -690,12 +681,6 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
pusch_config_pdu->absolute_delta_PUSCH = 4;
}
- ptrs_time_density = get_L_ptrs(ptrs_mcs1, ptrs_mcs2, ptrs_mcs3, pusch_config_pdu->mcs_index, pusch_config_pdu->mcs_table);
- ptrs_freq_density = get_K_ptrs(n_rb0, n_rb1, pusch_config_pdu->rb_size);
- // PTRS ports configuration
- // TbD: ptrs_dmrs_port and ptrs_port_index are not initialised!
- ptrs_ports_list.ptrs_re_offset = 0;
-
/* DMRS */
l_prime_mask = get_l_prime(pusch_config_pdu->nr_of_symbols, typeB, pusch_dmrs_pos0, pusch_len1);
if (pusch_config_pdu->transform_precoding == transform_precoder_disabled)
@@ -709,12 +694,20 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
}
/* PTRS */
- pusch_config_pdu->pusch_ptrs.ptrs_time_density = ptrs_time_density;
- pusch_config_pdu->pusch_ptrs.ptrs_freq_density = ptrs_freq_density;
- pusch_config_pdu->pusch_ptrs.ptrs_ports_list = &ptrs_ports_list;
-
- if (1 << pusch_config_pdu->pusch_ptrs.ptrs_time_density >= pusch_config_pdu->nr_of_symbols) {
- pusch_config_pdu->pdu_bit_map &= ~PUSCH_PDU_BITMAP_PUSCH_PTRS; // disable PUSCH PTRS
+ if (mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS != NULL) {
+ if (pusch_config_pdu->transform_precoding == transform_precoder_disabled) {
+ nfapi_nr_ue_ptrs_ports_t ptrs_ports_list;
+ pusch_config_pdu->pusch_ptrs.ptrs_ports_list = &ptrs_ports_list;
+ valid_ptrs_setup = set_ul_ptrs_values(mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup,
+ pusch_config_pdu->rb_size, pusch_config_pdu->mcs_index, pusch_config_pdu->mcs_table,
+ &pusch_config_pdu->pusch_ptrs.ptrs_freq_density,&pusch_config_pdu->pusch_ptrs.ptrs_time_density,
+ &pusch_config_pdu->pusch_ptrs.ptrs_ports_list->ptrs_re_offset,&pusch_config_pdu->pusch_ptrs.num_ptrs_ports,
+ &pusch_config_pdu->pusch_ptrs.ul_ptrs_power, pusch_config_pdu->nr_of_symbols);
+ if(valid_ptrs_setup==true) {
+ pusch_config_pdu->pdu_bit_map |= PUSCH_PDU_BITMAP_PUSCH_PTRS;
+ }
+ LOG_D(MAC, "UL PTRS values: PTRS time den: %d, PTRS freq den: %d\n", pusch_config_pdu->pusch_ptrs.ptrs_time_density, pusch_config_pdu->pusch_ptrs.ptrs_freq_density);
+ }
}
}
diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c
index 3986e5b7f0..3a6acc283d 100644
--- a/openair2/LAYER2/NR_MAC_gNB/config.c
+++ b/openair2/LAYER2/NR_MAC_gNB/config.c
@@ -311,8 +311,6 @@ void config_common(int Mod_idP, int pdsch_AntennaPorts, int pusch_AntennaPorts,
}
-
-
extern uint16_t sl_ahead;
int rrc_mac_config_req_gNB(module_id_t Mod_idP,
int ssb_SubcarrierOffset,
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
index 3c300c5f9d..8bd1e848e1 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
@@ -66,11 +66,15 @@ void dump_mac_stats(gNB_MAC_INST *gNB)
int num = 1;
for (int UE_id = UE_info->list.head; UE_id >= 0; UE_id = UE_info->list.next[UE_id]) {
LOG_I(MAC, "UE ID %d RNTI %04x (%d/%d)\n", UE_id, UE_info->rnti[UE_id], num++, UE_info->num_UEs);
- const NR_mac_stats_t *stats = &UE_info->mac_stats[UE_id];
- LOG_I(MAC, "UE %d: dlsch_rounds %d/%d/%d/%d, dlsch_errors %d\n",
+ NR_mac_stats_t *stats = &UE_info->mac_stats[UE_id];
+ const int avg_rsrp = stats->num_rsrp_meas > 0 ? stats->cumul_rsrp / stats->num_rsrp_meas : 0;
+ LOG_I(MAC, "UE %d: dlsch_rounds %d/%d/%d/%d, dlsch_errors %d, average RSRP %d (%d meas)\n",
UE_id,
stats->dlsch_rounds[0], stats->dlsch_rounds[1],
- stats->dlsch_rounds[2], stats->dlsch_rounds[3], stats->dlsch_errors);
+ stats->dlsch_rounds[2], stats->dlsch_rounds[3], stats->dlsch_errors,
+ avg_rsrp, stats->num_rsrp_meas);
+ stats->num_rsrp_meas = 0;
+ stats->cumul_rsrp = 0 ;
LOG_I(MAC, "UE %d: dlsch_total_bytes %d\n", UE_id, stats->dlsch_total_bytes);
LOG_I(MAC, "UE %d: ulsch_rounds %d/%d/%d/%d, ulsch_errors %d\n",
UE_id,
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
index 20da8fa30a..94524795f3 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
@@ -646,6 +646,7 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
int res_found = 0;
pucch_pdu->bit_len_harq = O_ack;
+ pucch_pdu->bit_len_csi_part1 = O_csi;
uint16_t O_uci = O_csi + O_ack;
@@ -698,6 +699,8 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
n_set = pucch_Config->resourceSetToAddModList->list.count;
AssertFatal(n_set>0,"PUCCH resourceSetToAddModList is empty\n");
+ LOG_D(MAC, "UCI n_set= %d\n", n_set);
+
N2 = 2;
// procedure to select pucch resource id from resource sets according to
// number of uci bits and pucch resource indicator pucch_resource
@@ -1635,7 +1638,7 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *secon
add_nr_list(&UE_info->list, UE_id);
memset(&UE_info->mac_stats[UE_id], 0, sizeof(NR_mac_stats_t));
set_Y(UE_info->Y[UE_id], rntiP);
- compute_csi_bitlen(secondaryCellGroup, UE_info, UE_id);
+ compute_csi_bitlen (secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup, UE_info, UE_id, mod_idP);
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
memset(sched_ctrl, 0, sizeof(*sched_ctrl));
sched_ctrl->ta_frame = 0;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
index 629b4dc7b0..247a7e2c45 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
@@ -80,6 +80,42 @@ void nr_fill_nfapi_pucch(module_id_t mod_id,
pucch->sr_flag);
}
+#define MIN_RSRP_VALUE -141
+#define MAX_NUM_SSB 128
+#define MAX_SSB_SCHED 8
+#define L1_RSRP_HYSTERIS 10 //considering 10 dBm as hysterisis for avoiding frequent SSB Beam Switching. !Fixme provide exact value if any
+//#define L1_DIFF_RSRP_STEP_SIZE 2
+
+int ssb_index_sorted[MAX_NUM_SSB] = {0};
+int ssb_rsrp_sorted[MAX_NUM_SSB] = {0};
+
+//Measured RSRP Values Table 10.1.16.1-1 from 36.133
+//Stored all the upper limits[Max RSRP Value of corresponding index]
+//stored -1 for invalid values
+int L1_SSB_CSI_RSRP_measReport_mapping_38133_10_1_6_1_1[128] = {
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //0 - 9
+ -1, -1, -1, -1, -1, -1, -140, -139, -138, -137, //10 - 19
+ -136, -135, -134, -133, -132, -131, -130, -129, -128, -127, //20 - 29
+ -126, -125, -124, -123, -122, -121, -120, -119, -118, -117, //30 - 39
+ -116, -115, -114, -113, -112, -111, -110, -109, -108, -107, //40 - 49
+ -106, -105, -104, -103, -102, -101, -100, -99, -98, -97, //50 - 59
+ -96, -95, -94, -93, -92, -91, -90, -89, -88, -87, //60 - 69
+ -86, -85, -84, -83, -82, -81, -80, -79, -78, -77, //70 - 79
+ -76, -75, -74, -73, -72, -71, -70, -69, -68, -67, //80 - 89
+ -66, -65, -64, -63, -62, -61, -60, -59, -58, -57, //90 - 99
+ -56, -55, -54, -53, -52, -51, -50, -49, -48, -47, //100 - 109
+ -46, -45, -44, -44, -1, -1, -1, -1, -1, -1, //110 - 119
+ -1, -1, -1, -1, -1, -1, -1, -1//120 - 127
+ };
+
+//Differential RSRP values Table 10.1.6.1-2 from 36.133
+//Stored the upper limits[MAX RSRP Value]
+int diff_rsrp_ssb_csi_meas_10_1_6_1_2[16] = {
+ 0, -2, -4, -6, -8, -10, -12, -14, -16, -18, //0 - 9
+ -20, -22, -24, -26, -28, -30 //10 - 15
+};
+
+
void nr_schedule_pucch(int Mod_idP,
frame_t frameP,
sub_frame_t slotP) {
@@ -106,74 +142,293 @@ void nr_schedule_pucch(int Mod_idP,
}
+//! Calculating number of bits set
+uint8_t number_of_bits_set (uint8_t buf,uint8_t * max_ri){
+ uint8_t nb_of_bits_set = 0;
+ uint8_t mask = 0xff;
+ uint8_t index = 0;
+
+ for (index=7; (buf & mask) && (index>=0) ; index--){
+ if (buf & (1<>=1;
+ }
+ *max_ri = 8-index;
+ return nb_of_bits_set;
+}
+
+
//!TODO : same function can be written to handle csi_resources
-void compute_csi_bitlen (NR_CellGroupConfig_t *secondaryCellGroup, NR_UE_info_t *UE_info, int UE_id) {
+void compute_csi_bitlen(NR_CSI_MeasConfig_t *csi_MeasConfig, NR_UE_info_t *UE_info, int UE_id, module_id_t Mod_idP){
uint8_t csi_report_id = 0;
uint8_t csi_resourceidx =0;
uint8_t csi_ssb_idx =0;
-
- NR_CSI_MeasConfig_t *csi_MeasConfig = secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup;
+ NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type;
NR_CSI_ResourceConfigId_t csi_ResourceConfigId;
+
for (csi_report_id=0; csi_report_id < csi_MeasConfig->csi_ReportConfigToAddModList->list.count; csi_report_id++){
- csi_ResourceConfigId=csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->resourcesForChannelMeasurement;
- UE_info->csi_report_template[UE_id][csi_report_id].reportQuantity_type = csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->reportQuantity.present;
+ struct NR_CSI_ReportConfig *csi_reportconfig = csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id];
+ nr_csi_report_t *csi_report = &UE_info->csi_report_template[UE_id][csi_report_id];
+ csi_ResourceConfigId=csi_reportconfig->resourcesForChannelMeasurement;
+ reportQuantity_type = csi_reportconfig->reportQuantity.present;
+ csi_report->reportQuantity_type = reportQuantity_type;
for ( csi_resourceidx = 0; csi_resourceidx < csi_MeasConfig->csi_ResourceConfigToAddModList->list.count; csi_resourceidx++) {
- if ( csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]->csi_ResourceConfigId != csi_ResourceConfigId)
- continue;
+ struct NR_CSI_ResourceConfig *csi_resourceconfig = csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx];
+ if ( csi_resourceconfig->csi_ResourceConfigId != csi_ResourceConfigId)
+ continue;
else {
- //Finding the CSI_RS or SSB Resources
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_Resource_type= csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]->csi_RS_ResourceSetList.present;
- if (NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB ==UE_info->csi_report_template[UE_id][csi_report_id].CSI_Resource_type){
- struct NR_CSI_ResourceConfig__csi_RS_ResourceSetList__nzp_CSI_RS_SSB * nzp_CSI_RS_SSB = csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB;
+ uint8_t nb_ssb_resources =0;
+ //Finding the CSI_RS or SSB Resources
+ if (NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP == reportQuantity_type ||
+ NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP == reportQuantity_type) {
- UE_info->csi_report_template[UE_id][csi_report_id].nb_of_nzp_csi_report = nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList!=NULL ? nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list.count:0;
- UE_info->csi_report_template[UE_id][csi_report_id].nb_of_csi_ssb_report = nzp_CSI_RS_SSB->csi_SSB_ResourceSetList!=NULL ? nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list.count:0;
+ if (NR_CSI_ReportConfig__groupBasedBeamReporting_PR_disabled == csi_reportconfig->groupBasedBeamReporting.present) {
+ if (NULL != csi_reportconfig->groupBasedBeamReporting.choice.disabled->nrofReportedRS)
+ csi_report->CSI_report_bitlen.nb_ssbri_cri = *(csi_reportconfig->groupBasedBeamReporting.choice.disabled->nrofReportedRS)+1;
+ else
+ /*! From Spec 38.331
+ * nrofReportedRS
+ * The number (N) of measured RS resources to be reported per report setting in a non-group-based report. N <= N_max, where N_max is either 2 or 4 depending on UE
+ * capability. FFS: The signaling mechanism for the gNB to select a subset of N beams for the UE to measure and report.
+ * When the field is absent the UE applies the value 1
+ */
+ csi_report->CSI_report_bitlen.nb_ssbri_cri= 1;
+ }else
+ csi_report->CSI_report_bitlen.nb_ssbri_cri= 2;
+
+ if (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP == csi_report->reportQuantity_type) {
+ for ( csi_ssb_idx = 0; csi_ssb_idx < csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.count; csi_ssb_idx++) {
+ if (csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_ssb_idx]->csi_SSB_ResourceSetId ==
+ *(csi_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list.array[0])){
+
+ ///We can configure only one SSB resource set from spec 38.331 IE CSI-ResourceConfig
+ nb_ssb_resources= csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_ssb_idx]->csi_SSB_ResourceList.list.count;
+ csi_report->SSB_Index_list = csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_ssb_idx]->csi_SSB_ResourceList.list.array;
+ csi_report->CSI_Index_list = NULL;
+ break;
+ }
+ }
+ } else /*if (NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP == UE_info->csi_report_template[UE_id][csi_report_id].reportQuantity_type)*/{
+ for ( csi_ssb_idx = 0; csi_ssb_idx < csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.count; csi_ssb_idx++) {
+ if (csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_ssb_idx]->nzp_CSI_ResourceSetId ==
+ *(csi_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list.array[0])) {
+
+ ///For periodic and semi-persistent CSI Resource Settings, the number of CSI-RS Resource Sets configured is limited to S=1 for spec 38.212
+ nb_ssb_resources= csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_ssb_idx]->nzp_CSI_RS_Resources.list.count;
+ csi_report->CSI_Index_list = csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_ssb_idx]->nzp_CSI_RS_Resources.list.array;
+ csi_report->SSB_Index_list = NULL;
+ break;
+ }
+ }
+ }
+
+ if (nb_ssb_resources) {
+ csi_report->CSI_report_bitlen.cri_ssbri_bitlen =ceil(log2 (nb_ssb_resources));
+ csi_report->CSI_report_bitlen.rsrp_bitlen = 7; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP
+ csi_report->CSI_report_bitlen.diff_rsrp_bitlen =4; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP
+ } else {
+ csi_report->CSI_report_bitlen.cri_ssbri_bitlen =0;
+ csi_report->CSI_report_bitlen.rsrp_bitlen = 0;
+ csi_report->CSI_report_bitlen.diff_rsrp_bitlen =0;
+ }
+
+ LOG_I (MAC, "UCI: CSI_bit len : ssbri %d, rsrp: %d, diff_rsrp: %d\n",
+ csi_report->CSI_report_bitlen.cri_ssbri_bitlen,
+ csi_report->CSI_report_bitlen.rsrp_bitlen,
+ csi_report->CSI_report_bitlen.diff_rsrp_bitlen);
}
- if (0 != UE_info->csi_report_template[UE_id][csi_report_id].nb_of_csi_ssb_report){
- uint8_t nb_ssb_resources =0;
+ uint8_t ri_restriction;
+ uint8_t ri_bitlen;
+ uint8_t nb_allowed_ri;
+ uint8_t max_ri;
+
+ if (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI == reportQuantity_type ||
+ NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_LI_PMI_CQI==reportQuantity_type ||
+ NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_CQI==reportQuantity_type ||
+ NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_i1_CQI==reportQuantity_type||
+ NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_i1==reportQuantity_type){
+
for ( csi_ssb_idx = 0; csi_ssb_idx < csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.count; csi_ssb_idx++) {
- if (csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_ssb_idx]->csi_SSB_ResourceSetId ==
- *(csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list.array[0])) {
- ///We can configure only one SSB resource set from spec 38.331 IE CSI-ResourceConfig
- if (NR_CSI_ReportConfig__groupBasedBeamReporting_PR_disabled ==
- csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->groupBasedBeamReporting.present ) {
- if (NULL != csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->groupBasedBeamReporting.choice.disabled->nrofReportedRS)
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].nb_ssbri_cri = *(csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->groupBasedBeamReporting.choice.disabled->nrofReportedRS)+1;
- else
- /*! From Spec 38.331
- * nrofReportedRS
- * The number (N) of measured RS resources to be reported per report setting in a non-group-based report. N <= N_max, where N_max is either 2 or 4 depending on UE
- * capability. FFS: The signaling mechanism for the gNB to select a subset of N beams for the UE to measure and report.
- * When the field is absent the UE applies the value 1
- */
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].nb_ssbri_cri= 1;
- } else
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].nb_ssbri_cri= 2;
+ if (csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_ssb_idx]->nzp_CSI_ResourceSetId ==
+ *(csi_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list.array[0])) {
+ ///For periodic and semi-persistent CSI Resource Settings, the number of CSI-RS Resource Sets configured is limited to S=1 for spec 38.212
+ nb_ssb_resources= csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_ssb_idx]->nzp_CSI_RS_Resources.list.count;
+ csi_report->CSI_Index_list = csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_ssb_idx]->nzp_CSI_RS_Resources.list.array;
+ csi_report->SSB_Index_list = NULL;
+ }
+ break;
+ }
+ csi_report->csi_meas_bitlen.cri_bitlen=ceil(log2 (nb_ssb_resources));
- nb_ssb_resources= csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_ssb_idx]->csi_SSB_ResourceList.list.count;
- if (nb_ssb_resources){
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].cri_ssbri_bitlen =ceil(log2 (nb_ssb_resources));
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].rsrp_bitlen = 7; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].diff_rsrp_bitlen =4; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP
- }
- else{
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].cri_ssbri_bitlen =0;
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].rsrp_bitlen = 0;
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].diff_rsrp_bitlen =0;
- }
+ if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel==csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.present){
- LOG_I (MAC, "UCI: CSI_bit len : ssbri %d, rsrp: %d, diff_rsrp: %d\n",
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].cri_ssbri_bitlen,
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].rsrp_bitlen,
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].diff_rsrp_bitlen);
- break ;
+ switch (RC.nrmac[Mod_idP]->config[0].carrier_config.num_tx_ant.value) {
+ case 1:;
+ csi_report->csi_meas_bitlen.ri_bitlen=0;
+ break;
+ case 2:
+ /* From Spec 38.212
+ * If the higher layer parameter nrofCQIsPerReport=1, nRI in Table 6.3.1.1.2-3 is the number of allowed rank indicator
+ * values in the 4 LSBs of the higher layer parameter typeI-SinglePanel-ri-Restriction according to Subclause 5.2.2.2.1 [6,
+ * TS 38.214]; otherwise nRI in Table 6.3.1.1.2-3 is the number of allowed rank indicator values according to Subclause
+ * 5.2.2.2.1 [6, TS 38.214].
+ *
+ * But from Current RRC ASN structures nrofCQIsPerReport is not present. Present a dummy variable is present so using it to
+ * calculate RI for antennas equal or more than two.
+ * */
+ AssertFatal (NULL!=csi_reportconfig->dummy, "nrofCQIsPerReport is not present");
+
+ ri_restriction = csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0];
+
+ /* Replace dummy with the nrofCQIsPerReport from the CSIreport
+ config when equalent ASN structure present */
+ if (0==*(csi_reportconfig->dummy)){
+ nb_allowed_ri = number_of_bits_set((ri_restriction & 0xf0), &max_ri);
+ ri_bitlen = ceil(log2(nb_allowed_ri));
+ }
+ else{
+ nb_allowed_ri = number_of_bits_set(ri_restriction, &max_ri);
+ ri_bitlen = ceil(log2(nb_allowed_ri));
+ }
+ ri_bitlen = ri_bitlen<1?ri_bitlen:1; //from the spec 38.212 and table 6.3.1.1.2-3: RI, LI, CQI, and CRI of codebookType=typeI-SinglePanel
+ csi_report->csi_meas_bitlen.ri_bitlen=ri_bitlen;
+ break;
+ case 4:
+ AssertFatal (NULL!=csi_reportconfig->dummy, "nrofCQIsPerReport is not present");
+
+ ri_restriction = csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0];
+
+ /* Replace dummy with the nrofCQIsPerReport from the CSIreport
+ config when equalent ASN structure present */
+ if (0==*(csi_reportconfig->dummy)){
+ nb_allowed_ri = number_of_bits_set((ri_restriction & 0xf0), &max_ri);
+ ri_bitlen = ceil(log2(nb_allowed_ri));
+ }
+ else{
+ nb_allowed_ri = number_of_bits_set(ri_restriction,&max_ri);
+ ri_bitlen = ceil(log2(nb_allowed_ri));
+ }
+ ri_bitlen = ri_bitlen<2?ri_bitlen:2; //from the spec 38.212 and table 6.3.1.1.2-3: RI, LI, CQI, and CRI of codebookType=typeI-SinglePanel
+ csi_report->csi_meas_bitlen.ri_bitlen=ri_bitlen;
+ break;
+ case 6:
+ case 8:
+ AssertFatal (NULL!=csi_reportconfig->dummy, "nrofCQIsPerReport is not present");
+
+ ri_restriction = csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0];
+
+ /* Replace dummy with the nrofCQIsPerReport from the CSIreport
+ config when equalent ASN structure present */
+ if (0==*(csi_reportconfig->dummy)){
+ nb_allowed_ri = number_of_bits_set((ri_restriction & 0xf0),&max_ri);
+ ri_bitlen = ceil(log2(nb_allowed_ri));
+ }
+ else{
+ nb_allowed_ri = number_of_bits_set(ri_restriction, &max_ri);
+ ri_bitlen = ceil(log2(nb_allowed_ri));
+ }
+ csi_report->csi_meas_bitlen.ri_bitlen=ri_bitlen;
+ break;
+ default:
+ AssertFatal(RC.nrmac[Mod_idP]->config[0].carrier_config.num_tx_ant.value>8,"Number of antennas %d are out of range", RC.nrmac[Mod_idP]->config[0].carrier_config.num_tx_ant.value);
+ }
+ }
+ csi_report->csi_meas_bitlen.li_bitlen=0;
+ csi_report->csi_meas_bitlen.cqi_bitlen=0;
+ csi_report->csi_meas_bitlen.pmi_x1_bitlen=0;
+ csi_report->csi_meas_bitlen.pmi_x2_bitlen=0;
+ }
+
+ if( NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_LI_PMI_CQI==reportQuantity_type ){
+ if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel==csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.present){
+
+ switch (RC.nrmac[Mod_idP]->config[0].carrier_config.num_tx_ant.value) {
+ case 1:;
+ csi_report->csi_meas_bitlen.li_bitlen=0;
+ break;
+ case 2:
+ case 4:
+ case 6:
+ case 8:
+ /* From Spec 38.212
+ * If the higher layer parameter nrofCQIsPerReport=1, nRI in Table 6.3.1.1.2-3 is the number of allowed rank indicator
+ * values in the 4 LSBs of the higher layer parameter typeI-SinglePanel-ri-Restriction according to Subclause 5.2.2.2.1 [6,
+ * TS 38.214]; otherwise nRI in Table 6.3.1.1.2-3 is the number of allowed rank indicator values according to Subclause
+ * 5.2.2.2.1 [6, TS 38.214].
+ *
+ * But from Current RRC ASN structures nrofCQIsPerReport is not present. Present a dummy variable is present so using it to
+ * calculate RI for antennas equal or more than two.
+ * */
+ //! TODO: The bit length of LI is as follows LI = log2(RI), Need to confirm wheather we should consider maximum RI can be reported from ri_restricted
+ // or we should consider reported RI. If we need to consider reported RI for calculating LI bit length then we need to modify the code.
+ csi_report->csi_meas_bitlen.li_bitlen=ceil(log2(max_ri))<2?ceil(log2(max_ri)):2;
+ break;
+ default:
+ AssertFatal(RC.nrmac[Mod_idP]->config[0].carrier_config.num_tx_ant.value>8,"Number of antennas %d are out of range", RC.nrmac[Mod_idP]->config[0].carrier_config.num_tx_ant.value);
+ }
+ }
+ }
+
+ if (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI == reportQuantity_type ||
+ NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_LI_PMI_CQI==reportQuantity_type ||
+ NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_CQI==reportQuantity_type ||
+ NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_i1_CQI==reportQuantity_type){
+
+ switch (RC.nrmac[Mod_idP]->config[0].carrier_config.num_tx_ant.value){
+ case 1:
+ case 2:
+ case 4:
+ case 6:
+ case 8:
+ /* From Spec 38.212
+ * If the higher layer parameter nrofCQIsPerReport=1, nRI in Table 6.3.1.1.2-3 is the number of allowed rank indicator
+ * values in the 4 LSBs of the higher layer parameter typeI-SinglePanel-ri-Restriction according to Subclause 5.2.2.2.1 [6,
+ * TS 38.214]; otherwise nRI in Table 6.3.1.1.2-3 is the number of allowed rank indicator values according to Subclause
+ * 5.2.2.2.1 [6, TS 38.214].
+ *
+ * But from Current RRC ASN structures nrofCQIsPerReport is not present. Present a dummy variable is present so using it to
+ * calculate RI for antennas equal or more than two.
+ * */
+
+ if (max_ri > 4 && max_ri < 8){
+ if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel==csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.present){
+ if (NR_CSI_ReportConfig__reportFreqConfiguration__cqi_FormatIndicator_widebandCQI==csi_reportconfig->reportFreqConfiguration->cqi_FormatIndicator)
+ csi_report->csi_meas_bitlen.cqi_bitlen = 8;
+ else
+ csi_report->csi_meas_bitlen.cqi_bitlen = 4;
+ }
+ }else{ //This condition will work even for type1-multipanel.
+ if (NR_CSI_ReportConfig__reportFreqConfiguration__cqi_FormatIndicator_widebandCQI==csi_reportconfig->reportFreqConfiguration->cqi_FormatIndicator)
+ csi_report->csi_meas_bitlen.cqi_bitlen = 4;
+ else
+ csi_report->csi_meas_bitlen.cqi_bitlen = 2;
+ }
+ break;
+ default:
+ AssertFatal(RC.nrmac[Mod_idP]->config[0].carrier_config.num_tx_ant.value>8,"Number of antennas %d are out of range", RC.nrmac[Mod_idP]->config[0].carrier_config.num_tx_ant.value);
+ }
+ }
+ if (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI == reportQuantity_type ||
+ NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_LI_PMI_CQI==reportQuantity_type){
+ if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel==csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.present){
+ switch (csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.present){
+ case NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_two:
+ if (max_ri ==1)
+ csi_report->csi_meas_bitlen.pmi_x1_bitlen = 2;
+ else if (max_ri ==2)
+ csi_report->csi_meas_bitlen.pmi_x1_bitlen = 1;
+ break;
+ default:
+ AssertFatal(csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.present!=
+ NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_two,
+ "Not handled Yet %d", csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.present);
+ break;
}
}
}
- if (0 != UE_info->csi_report_template[UE_id][csi_report_id].nb_of_nzp_csi_report)
- AssertFatal(1==0,"Currently configuring only SSB beamreporting.");
break;
}
}
@@ -181,12 +436,27 @@ void compute_csi_bitlen (NR_CellGroupConfig_t *secondaryCellGroup, NR_UE_info_t
}
-uint16_t nr_get_csi_bitlen(const nr_csi_report_t *csi_report)
-{
- const CRI_SSBRI_RSRP_bitlen_t *bitlen = &csi_report->CSI_report_bitlen[0];
- return bitlen->cri_ssbri_bitlen * bitlen->nb_ssbri_cri
- + bitlen->rsrp_bitlen
- + bitlen->diff_rsrp_bitlen * (bitlen->nb_ssbri_cri - 1) * csi_report->nb_of_csi_ssb_report;
+uint16_t nr_get_csi_bitlen(int Mod_idP,
+ int UE_id,
+ uint8_t csi_report_id) {
+
+ uint16_t csi_bitlen =0;
+ NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
+ L1_RSRP_bitlen_t * CSI_report_bitlen = NULL;
+ CSI_Meas_bitlen_t * csi_meas_bitlen = NULL;
+
+ if (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP==UE_info->csi_report_template[UE_id][csi_report_id].reportQuantity_type||
+ NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP==UE_info->csi_report_template[UE_id][csi_report_id].reportQuantity_type){
+ CSI_report_bitlen = &(UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen); //This might need to be moodif for Aperiodic CSI-RS measurements
+ csi_bitlen+= ((CSI_report_bitlen->cri_ssbri_bitlen * CSI_report_bitlen->nb_ssbri_cri) +
+ CSI_report_bitlen->rsrp_bitlen +(CSI_report_bitlen->diff_rsrp_bitlen *
+ (CSI_report_bitlen->nb_ssbri_cri -1 )));
+ } else{
+ csi_meas_bitlen = &(UE_info->csi_report_template[UE_id][csi_report_id].csi_meas_bitlen); //This might need to be moodif for Aperiodic CSI-RS measurements
+ csi_bitlen+= (csi_meas_bitlen->cri_bitlen +csi_meas_bitlen->ri_bitlen+csi_meas_bitlen->li_bitlen+csi_meas_bitlen->cqi_bitlen+csi_meas_bitlen->pmi_x1_bitlen+csi_meas_bitlen->pmi_x2_bitlen);
+ }
+
+ return csi_bitlen;
}
@@ -244,7 +514,7 @@ void nr_csi_meas_reporting(int Mod_idP,
curr_pucch->ul_slot = sched_slot;
curr_pucch->resource_indicator = res_index;
curr_pucch->csi_bits +=
- nr_get_csi_bitlen(&UE_info->csi_report_template[UE_id][csi_report_id]);
+ nr_get_csi_bitlen(Mod_idP,UE_id,csi_report_id);
// going through the list of PUCCH resources to find the one indexed by resource_id
uint16_t *vrb_map_UL = &RC.nrmac[Mod_idP]->common_channels[0].vrb_map_UL[sched_slot * MAX_BWP_SIZE];
@@ -312,6 +582,375 @@ static void handle_dl_harq(module_id_t mod_id,
}
}
+int checkTargetSSBInFirst64TCIStates_pdschConfig(int ssb_index_t, int Mod_idP, int UE_id) {
+ NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
+ NR_CellGroupConfig_t *secondaryCellGroup = UE_info->secondaryCellGroup[UE_id] ;
+ int nb_tci_states = secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList->list.count;
+ NR_TCI_State_t *tci =NULL;
+ int i;
+
+ for(i=0; ispCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList->list.array[i];
+
+ if(tci != NULL) {
+ if(tci->qcl_Type1.referenceSignal.present == NR_QCL_Info__referenceSignal_PR_ssb) {
+ if(tci->qcl_Type1.referenceSignal.choice.ssb == ssb_index_t)
+ return tci->tci_StateId; // returned TCI state ID
+ }
+ // if type2 is configured
+ else if(tci->qcl_Type2 != NULL && tci->qcl_Type2->referenceSignal.present == NR_QCL_Info__referenceSignal_PR_ssb) {
+ if(tci->qcl_Type2->referenceSignal.choice.ssb == ssb_index_t)
+ return tci->tci_StateId; // returned TCI state ID
+ } else LOG_I(MAC,"SSB index is not found in first 64 TCI states of TCI_statestoAddModList[%d]", i);
+ }
+ }
+
+ // tci state not identified in first 64 TCI States of PDSCH Config
+ return -1;
+}
+
+int checkTargetSSBInTCIStates_pdcchConfig(int ssb_index_t, int Mod_idP, int UE_id) {
+ NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
+ NR_CellGroupConfig_t *secondaryCellGroup = UE_info->secondaryCellGroup[UE_id] ;
+ int nb_tci_states = secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList->list.count;
+ NR_TCI_State_t *tci =NULL;
+ NR_TCI_StateId_t *tci_id = NULL;
+ int bwp_id = 1;
+ NR_BWP_Downlink_t *bwp = secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_id-1];
+ NR_ControlResourceSet_t *coreset = bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list.array[bwp_id-1];
+ int i;
+ int flag = 0;
+ int tci_stateID = -1;
+
+ for(i=0; ispCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList->list.array[i];
+
+ if(tci != NULL && tci->qcl_Type1.referenceSignal.present == NR_QCL_Info__referenceSignal_PR_ssb) {
+ if(tci->qcl_Type1.referenceSignal.choice.ssb == ssb_index_t) {
+ flag = 1;
+ tci_stateID = tci->tci_StateId;
+ break;
+ } else if(tci->qcl_Type2 != NULL && tci->qcl_Type2->referenceSignal.present == NR_QCL_Info__referenceSignal_PR_ssb) {
+ flag = 1;
+ tci_stateID = tci->tci_StateId;
+ break;
+ }
+ }
+
+ if(flag != 0 && tci_stateID != -1 && coreset != NULL) {
+ for(i=0; i<64 && itci_StatesPDCCH_ToAddList->list.count; i++) {
+ tci_id = coreset->tci_StatesPDCCH_ToAddList->list.array[i];
+
+ if(tci_id != NULL && *tci_id == tci_stateID)
+ return tci_stateID;
+ }
+ }
+ }
+
+ // Need to implement once configuration is received
+ return -1;
+}
+
+//returns the measured RSRP value (upper limit)
+int get_measured_rsrp(uint8_t index) {
+ //if index is invalid returning minimum rsrp -140
+ if((index >= 0 && index <= 15) || index >= 114)
+ return MIN_RSRP_VALUE;
+
+ return L1_SSB_CSI_RSRP_measReport_mapping_38133_10_1_6_1_1[index];
+}
+
+//returns the differential RSRP value (upper limit)
+int get_diff_rsrp(uint8_t index, int strongest_rsrp) {
+ if(strongest_rsrp != -1) {
+ return strongest_rsrp + diff_rsrp_ssb_csi_meas_10_1_6_1_2[index];
+ } else
+ return MIN_RSRP_VALUE;
+}
+
+//identifies the target SSB Beam index
+//keeps the required date for PDCCH and PDSCH TCI state activation/deactivation CE consutruction globally
+//handles triggering of PDCCH and PDSCH MAC CEs
+void tci_handling(module_id_t Mod_idP, int UE_id, frame_t frame, slot_t slot) {
+
+ int strongest_ssb_rsrp = 0;
+ int cqi_idx = 0;
+ int curr_ssb_beam_index = 0; //ToDo: yet to know how to identify the serving ssb beam index
+ uint8_t target_ssb_beam_index = curr_ssb_beam_index;
+ uint8_t is_triggering_ssb_beam_switch =0;
+ uint8_t ssb_idx = 0;
+ int pdsch_bwp_id =0;
+ int ssb_index[MAX_NUM_SSB] = {0};
+ int ssb_rsrp[MAX_NUM_SSB] = {0};
+ uint8_t idx = 0;
+ int bwp_id = 1;
+ NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
+ NR_CellGroupConfig_t *secondaryCellGroup = UE_info->secondaryCellGroup[UE_id];
+ NR_BWP_Downlink_t *bwp = secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_id-1];
+ //bwp indicator
+ int n_dl_bwp = secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count;
+ uint8_t nr_ssbri_cri = 0;
+ uint8_t nb_of_csi_ssb_report = UE_info->csi_report_template[UE_id][cqi_idx].nb_of_csi_ssb_report;
+ int better_rsrp_reported = -140-(-0); /*minimum_measured_RSRP_value - minimum_differntail_RSRP_value*///considering the minimum RSRP value as better RSRP initially
+ uint8_t diff_rsrp_idx = 0;
+ uint8_t i, j;
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ NR_mac_stats_t *stats = &UE_info->mac_stats[UE_id];
+
+ if (n_dl_bwp < 4)
+ pdsch_bwp_id = bwp_id;
+ else
+ pdsch_bwp_id = bwp_id - 1; // as per table 7.3.1.1.2-1 in 38.212
+
+ /*Example:
+ CRI_SSBRI: 1 2 3 4| 5 6 7 8| 9 10 1 2|
+ nb_of_csi_ssb_report = 3 //3 sets as above
+ nr_ssbri_cri = 4 //each set has 4 elements
+ storing ssb indexes in ssb_index array as ssb_index[0] = 1 .. ssb_index[4] = 5
+ ssb_rsrp[0] = strongest rsrp in first set, ssb_rsrp[4] = strongest rsrp in second set, ..
+ idx: resource set index
+ */
+
+ //for all reported SSB
+ for (idx = 0; idx < nb_of_csi_ssb_report; idx++) {
+ nr_ssbri_cri = sched_ctrl->CSI_report[idx].choice.ssb_cri_report.nr_ssbri_cri;
+ //extracting the ssb indexes
+ for (ssb_idx = 0; ssb_idx < nr_ssbri_cri; ssb_idx++) {
+ ssb_index[idx * nb_of_csi_ssb_report + ssb_idx] = sched_ctrl->CSI_report[idx].choice.ssb_cri_report.CRI_SSBRI[ssb_idx];
+ }
+
+ //if strongest measured RSRP is configured
+ strongest_ssb_rsrp = get_measured_rsrp(sched_ctrl->CSI_report[idx].choice.ssb_cri_report.RSRP);
+ // including ssb rsrp in mac stats
+ stats->cumul_rsrp += strongest_ssb_rsrp;
+ stats->num_rsrp_meas++;
+ ssb_rsrp[idx * nb_of_csi_ssb_report] = strongest_ssb_rsrp;
+ LOG_D(MAC,"ssb_rsrp = %d\n",strongest_ssb_rsrp);
+
+ //if current ssb rsrp is greater than better rsrp
+ if(ssb_rsrp[idx * nb_of_csi_ssb_report] > better_rsrp_reported) {
+ better_rsrp_reported = ssb_rsrp[idx * nb_of_csi_ssb_report];
+ target_ssb_beam_index = idx * nb_of_csi_ssb_report;
+ }
+
+ for(diff_rsrp_idx =1; diff_rsrp_idx < nr_ssbri_cri; diff_rsrp_idx++) {
+ ssb_rsrp[idx * nb_of_csi_ssb_report + diff_rsrp_idx] = get_diff_rsrp(sched_ctrl->CSI_report[idx].choice.ssb_cri_report.diff_RSRP[diff_rsrp_idx-1], strongest_ssb_rsrp);
+
+ //if current reported rsrp is greater than better rsrp
+ if(ssb_rsrp[idx * nb_of_csi_ssb_report + diff_rsrp_idx] > better_rsrp_reported) {
+ better_rsrp_reported = ssb_rsrp[idx * nb_of_csi_ssb_report + diff_rsrp_idx];
+ target_ssb_beam_index = idx * nb_of_csi_ssb_report + diff_rsrp_idx;
+ }
+ }
+ }
+
+
+ if(ssb_index[target_ssb_beam_index] != ssb_index[curr_ssb_beam_index] && ssb_rsrp[target_ssb_beam_index] > ssb_rsrp[curr_ssb_beam_index]) {
+ if( ssb_rsrp[target_ssb_beam_index] - ssb_rsrp[curr_ssb_beam_index] > L1_RSRP_HYSTERIS) {
+ is_triggering_ssb_beam_switch = 1;
+ LOG_D(MAC, "Triggering ssb beam switching using tci\n");
+ }
+ }
+
+ if(is_triggering_ssb_beam_switch) {
+ //filling pdcch tci state activativation mac ce structure fields
+ sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.is_scheduled = 1;
+ //OAI currently focusing on Non CA usecase hence 0 is considered as serving
+ //cell id
+ sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.servingCellId = 0; //0 for PCell as 38.331 v15.9.0 page 353 //serving cell id for which this MAC CE applies
+ sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.coresetId = 0; //coreset id for which the TCI State id is being indicated
+
+ /* 38.321 v15.8.0 page 66
+ TCI State ID: This field indicates the TCI state identified by TCI-StateId as specified in TS 38.331 [5] applicable
+ to the Control Resource Set identified by CORESET ID field.
+ If the field of CORESET ID is set to 0,
+ this field indicates a TCI-StateId for a TCI state of the first 64 TCI-states configured by tci-States-ToAddModList and tciStates-ToReleaseList in the PDSCH-Config in the active BWP.
+ If the field of CORESET ID is set to the other value than 0,
+ this field indicates a TCI-StateId configured by tci-StatesPDCCH-ToAddList and tciStatesPDCCH-ToReleaseList in the controlResourceSet identified by the indicated CORESET ID.
+ The length of the field is 7 bits
+ */
+ if(sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.coresetId == 0) {
+ int tci_state_id = checkTargetSSBInFirst64TCIStates_pdschConfig(ssb_index[target_ssb_beam_index], Mod_idP, UE_id);
+
+ if( tci_state_id != -1)
+ sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tciStateId = tci_state_id;
+ else {
+ //identify the best beam within first 64 TCI States of PDSCH
+ //Config TCI-states-to-addModList
+ int flag = 0;
+
+ for(i =0; ssb_index_sorted[i]!=0; i++) {
+ tci_state_id = checkTargetSSBInFirst64TCIStates_pdschConfig(ssb_index_sorted[i], Mod_idP, UE_id) ;
+
+ if(tci_state_id != -1 && ssb_rsrp_sorted[i] > ssb_rsrp[curr_ssb_beam_index] && ssb_rsrp_sorted[i] - ssb_rsrp[curr_ssb_beam_index] > L1_RSRP_HYSTERIS) {
+ sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tciStateId = tci_state_id;
+ flag = 1;
+ break;
+ }
+ }
+
+ if(flag == 0 || ssb_rsrp_sorted[i] < ssb_rsrp[curr_ssb_beam_index] || ssb_rsrp_sorted[i] - ssb_rsrp[curr_ssb_beam_index] < L1_RSRP_HYSTERIS) {
+ sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.is_scheduled = 0;
+ }
+ }
+ } else {
+ int tci_state_id = checkTargetSSBInTCIStates_pdcchConfig(ssb_index[target_ssb_beam_index], Mod_idP, UE_id);
+
+ if (tci_state_id !=-1)
+ sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tciStateId = tci_state_id;
+ else {
+ //identify the best beam within CORESET/PDCCH
+ ////Config TCI-states-to-addModList
+ int flag = 0;
+
+ for(i =0; ssb_index_sorted[i]!=0; i++) {
+ tci_state_id = checkTargetSSBInTCIStates_pdcchConfig(ssb_index_sorted[i], Mod_idP, UE_id);
+
+ if( tci_state_id != -1 && ssb_rsrp_sorted[i] > ssb_rsrp[curr_ssb_beam_index] && ssb_rsrp_sorted[i] - ssb_rsrp[curr_ssb_beam_index] > L1_RSRP_HYSTERIS) {
+ sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tciStateId = tci_state_id;
+ flag = 1;
+ break;
+ }
+ }
+
+ if(flag == 0 || ssb_rsrp_sorted[i] < ssb_rsrp[curr_ssb_beam_index] || ssb_rsrp_sorted[i] - ssb_rsrp[curr_ssb_beam_index] < L1_RSRP_HYSTERIS) {
+ sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.is_scheduled = 0;
+ }
+ }
+ }
+
+ sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tci_present_inDCI = bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list.array[bwp_id-1]->tci_PresentInDCI;
+
+ //filling pdsch tci state activation deactivation mac ce structure fields
+ if(sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tci_present_inDCI) {
+ sched_ctrl->UE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.is_scheduled = 1;
+ /*
+ Serving Cell ID: This field indicates the identity of the Serving Cell for which the MAC CE applies
+ Considering only PCell exists. Serving cell index of PCell is always 0, hence configuring 0
+ */
+ sched_ctrl->UE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.servingCellId = 0;
+ /*
+ BWP ID: This field indicates a DL BWP for which the MAC CE applies as the codepoint of the DCI bandwidth
+ part indicator field as specified in TS 38.212
+ */
+ sched_ctrl->UE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.bwpId = pdsch_bwp_id;
+
+ /*
+ * TODO ssb_rsrp_sort() API yet to code to find 8 best beams, rrc configuration
+ * is required
+ */
+ for(i = 0; i<8; i++) {
+ sched_ctrl->UE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.tciStateActDeact[i] = i;
+ }
+
+ sched_ctrl->UE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.highestTciStateActivated = 8;
+
+ for(i = 0, j =0; iUE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.tciStateActDeact[i]) {
+ sched_ctrl->UE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.codepoint[j] = i;
+ j++;
+ }
+ }
+ }//tci_presentInDCI
+ }//is-triggering_beam_switch
+}//tci handling
+
+void reverse_n_bits(uint8_t *value, uint16_t bitlen) {
+ uint16_t j;
+ uint8_t i;
+ for(j = bitlen - 1,i = 0; j > i; j--, i++) {
+ if(((*value>>j)&1) != ((*value>>i)&1)) {
+ *value ^= (1<csi_part1.csi_part1_bit_len)/8);
+ uint8_t *payload = uci_pdu->csi_part1.csi_part1_payload;
+ NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type = NR_CSI_ReportConfig__reportQuantity_PR_NOTHING;
+ NR_UE_info_t *UE_info = &(RC.nrmac[Mod_idP]->UE_info);
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ uint8_t csi_report_id = 0;
+
+ UE_info->csi_report_template[UE_id][csi_report_id].nb_of_csi_ssb_report = 0;
+ for ( csi_report_id =0; csi_report_id < csi_MeasConfig->csi_ReportConfigToAddModList->list.count; csi_report_id++ ) {
+ //Has to implement according to reportSlotConfig type
+ /*reportQuantity must be considered according to the current scheduled
+ CSI-ReportConfig if multiple CSI-ReportConfigs present*/
+ reportQuantity_type = UE_info->csi_report_template[UE_id][csi_report_id].reportQuantity_type;
+ LOG_D(PHY,"SFN/SF:%d%d reportQuantity type = %d\n",frame,slot,reportQuantity_type);
+
+ if (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP == reportQuantity_type ||
+ NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP == reportQuantity_type) {
+ uint8_t csi_ssb_idx = 0;
+ uint8_t diff_rsrp_idx = 0;
+ uint8_t cri_ssbri_bitlen = UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen.cri_ssbri_bitlen;
+
+ /*! As per the spec 38.212 and table: 6.3.1.1.2-12 in a single UCI sequence we can have multiple CSI_report
+ * the number of CSI_report will depend on number of CSI resource sets that are configured in CSI-ResourceConfig RRC IE
+ * From spec 38.331 from the IE CSI-ResourceConfig for SSB RSRP reporting we can configure only one resource set
+ * From spec 38.214 section 5.2.1.2 For periodic and semi-persistent CSI Resource Settings, the number of CSI-RS Resource Sets configured is limited to S=1
+ */
+
+ /** from 38.214 sec 5.2.1.4.2
+ - if the UE is configured with the higher layer parameter groupBasedBeamReporting set to 'disabled', the UE is
+ not required to update measurements for more than 64 CSI-RS and/or SSB resources, and the UE shall report in
+ a single report nrofReportedRS (higher layer configured) different CRI or SSBRI for each report setting
+
+ - if the UE is configured with the higher layer parameter groupBasedBeamReporting set to 'enabled', the UE is not
+ required to update measurements for more than 64 CSI-RS and/or SSB resources, and the UE shall report in a
+ single reporting instance two different CRI or SSBRI for each report setting, where CSI-RS and/or SSB
+ resources can be received simultaneously by the UE either with a single spatial domain receive filter, or with
+ multiple simultaneous spatial domain receive filter
+ */
+
+ idx = 0; //Since for SSB RSRP reporting in RRC can configure only one ssb resource set per one report config
+ sched_ctrl->CSI_report[idx].choice.ssb_cri_report.nr_ssbri_cri = UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen.nb_ssbri_cri;
+
+ for (csi_ssb_idx = 0; csi_ssb_idx < sched_ctrl->CSI_report[idx].choice.ssb_cri_report.nr_ssbri_cri ; csi_ssb_idx++) {
+ if(cri_ssbri_bitlen > 1)
+ reverse_n_bits(payload, cri_ssbri_bitlen);
+
+ if (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP == reportQuantity_type)
+ sched_ctrl->CSI_report[idx].choice.ssb_cri_report.CRI_SSBRI [csi_ssb_idx] =
+ *(UE_info->csi_report_template[UE_id][csi_report_id].SSB_Index_list[cri_ssbri_bitlen>0?((*payload)&~(~1<<(cri_ssbri_bitlen-1))):cri_ssbri_bitlen]);
+ else
+ sched_ctrl->CSI_report[idx].choice.ssb_cri_report.CRI_SSBRI [csi_ssb_idx] =
+ *(UE_info->csi_report_template[UE_id][csi_report_id].CSI_Index_list[cri_ssbri_bitlen>0?((*payload)&~(~1<<(cri_ssbri_bitlen-1))):cri_ssbri_bitlen]);
+
+ *payload >>= cri_ssbri_bitlen;
+ LOG_D(PHY,"SSB_index = %d\n",sched_ctrl->CSI_report[idx].choice.ssb_cri_report.CRI_SSBRI [csi_ssb_idx]);
+ }
+
+ reverse_n_bits(payload, 7);
+ sched_ctrl->CSI_report[idx].choice.ssb_cri_report.RSRP = (*payload) & 0x7f;
+ *payload >>= 7;
+
+ for ( diff_rsrp_idx =0; diff_rsrp_idx < sched_ctrl->CSI_report[idx].choice.ssb_cri_report.nr_ssbri_cri - 1; diff_rsrp_idx++ ) {
+ reverse_n_bits(payload,4);
+ sched_ctrl->CSI_report[idx].choice.ssb_cri_report.diff_RSRP[diff_rsrp_idx] = (*payload) & 0x0f;
+ *payload >>= 4;
+ }
+ UE_info->csi_report_template[UE_id][csi_report_id].nb_of_csi_ssb_report++;
+ LOG_D(MAC,"csi_payload size = %d, rsrp_id = %d\n",payload_size, sched_ctrl->CSI_report[idx].choice.ssb_cri_report.RSRP);
+ }
+ }
+
+ if ( !(reportQuantity_type))
+ AssertFatal(reportQuantity_type, "reportQuantity is not configured");
+
+}
+
void handle_nr_uci_pucch_0_1(module_id_t mod_id,
frame_t frame,
sub_frame_t slot,
@@ -374,6 +1013,7 @@ void handle_nr_uci_pucch_2_3_4(module_id_t mod_id,
LOG_E(MAC, "%s(): unknown RNTI %04x in PUCCH UCI\n", __func__, uci_234->rnti);
return;
}
+ NR_CSI_MeasConfig_t *csi_MeasConfig = RC.nrmac[mod_id]->UE_info.secondaryCellGroup[UE_id]->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup;
NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info;
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
@@ -413,6 +1053,15 @@ void handle_nr_uci_pucch_2_3_4(module_id_t mod_id,
handle_dl_harq(mod_id, UE_id, pid, uci_234->harq.harq_crc != 1 && acknack);
}
}
+ if ((uci_234->pduBitmap >> 2) & 0x01) {
+ //API to parse the csi report and store it into sched_ctrl
+ extract_pucch_csi_report (csi_MeasConfig, uci_234, frame, slot, UE_id, mod_id);
+ //TCI handling function
+ tci_handling(mod_id, UE_id,frame, slot);
+ }
+ if ((uci_234->pduBitmap >> 3) & 0x01) {
+ //@TODO:Handle CSI Report 2
+ }
}
@@ -743,5 +1392,4 @@ uint16_t compute_pucch_prb_size(uint8_t format,
else{
AssertFatal(1==0,"Not yet implemented");
}
-
}
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
index 25a419af16..9784b6b79e 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
@@ -1064,18 +1064,16 @@ void nr_schedule_ulsch(module_id_t module_id,
/* PUSCH PTRS */
if (ps->NR_DMRS_UplinkConfig->phaseTrackingRS != NULL) {
- // TODO to be fixed from RRC config
- uint8_t ptrs_mcs1 = 2; // higher layer parameter in PTRS-UplinkConfig
- uint8_t ptrs_mcs2 = 4; // higher layer parameter in PTRS-UplinkConfig
- uint8_t ptrs_mcs3 = 10; // higher layer parameter in PTRS-UplinkConfig
- uint16_t n_rb0 = 25; // higher layer parameter in PTRS-UplinkConfig
- uint16_t n_rb1 = 75; // higher layer parameter in PTRS-UplinkConfig
- pusch_pdu->pusch_ptrs.ptrs_time_density = get_L_ptrs(ptrs_mcs1, ptrs_mcs2, ptrs_mcs3, pusch_pdu->mcs_index, pusch_pdu->mcs_table);
- pusch_pdu->pusch_ptrs.ptrs_freq_density = get_K_ptrs(n_rb0, n_rb1, pusch_pdu->rb_size);
+ bool valid_ptrs_setup = false;
pusch_pdu->pusch_ptrs.ptrs_ports_list = (nfapi_nr_ptrs_ports_t *) malloc(2*sizeof(nfapi_nr_ptrs_ports_t));
- pusch_pdu->pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset = 0;
-
- pusch_pdu->pdu_bit_map |= PUSCH_PDU_BITMAP_PUSCH_PTRS; // enable PUSCH PTRS
+ valid_ptrs_setup = set_ul_ptrs_values(ps->NR_DMRS_UplinkConfig->phaseTrackingRS->choice.setup,
+ pusch_pdu->rb_size, pusch_pdu->mcs_index, pusch_pdu->mcs_table,
+ &pusch_pdu->pusch_ptrs.ptrs_freq_density,&pusch_pdu->pusch_ptrs.ptrs_time_density,
+ &pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_re_offset,&pusch_pdu->pusch_ptrs.num_ptrs_ports,
+ &pusch_pdu->pusch_ptrs.ul_ptrs_power, pusch_pdu->nr_of_symbols);
+ if (valid_ptrs_setup==true) {
+ pusch_pdu->pdu_bit_map |= PUSCH_PDU_BITMAP_PUSCH_PTRS; // enable PUSCH PTRS
+ }
}
else{
pusch_pdu->pdu_bit_map &= ~PUSCH_PDU_BITMAP_PUSCH_PTRS; // disable PUSCH PTRS
@@ -1139,4 +1137,4 @@ void nr_schedule_ulsch(module_id_t module_id,
memset(sched_pusch, 0, sizeof(*sched_pusch));
}
-}
\ No newline at end of file
+}
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
index f18bede58b..5099fcd378 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
@@ -331,7 +331,7 @@ uint16_t compute_pucch_prb_size(uint8_t format,
uint8_t n_symb,
uint8_t n_re_ctrl);
-void compute_csi_bitlen (NR_CellGroupConfig_t *secondaryCellGroup, NR_UE_info_t *UE_info, int UE_id);
+void compute_csi_bitlen(NR_CSI_MeasConfig_t *csi_MeasConfig, NR_UE_info_t *UE_info, int UE_id, module_id_t Mod_idP);
int get_dlscs(nfapi_nr_config_request_t *cfg);
diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
index 63587d58a4..ac583b5270 100644
--- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
@@ -246,8 +246,17 @@ typedef struct pdcchStateInd {
uint8_t servingCellId;
uint8_t coresetId;
uint8_t tciStateId;
+ bool tci_present_inDCI;
} pdcchStateInd_t;
+typedef struct pucchSpatialRelation {
+ bool is_scheduled;
+ uint8_t servingCellId;
+ uint8_t bwpId;
+ uint8_t pucchResourceId;
+ bool s0tos7_actDeact[8];
+} pucchSpatialRelation_t;
+
typedef struct SPCSIReportingpucch {
bool is_scheduled;
uint8_t servingCellId;
@@ -271,12 +280,14 @@ typedef struct pdschTciStatesActDeact {
uint8_t bwpId;
uint8_t highestTciStateActivated;
bool tciStateActDeact[MAX_TCI_STATES];
+ uint8_t codepoint[8];
} pdschTciStatesActDeact_t;
typedef struct UE_info {
sp_zp_csirs_t sp_zp_csi_rs;
csi_rs_im_t csi_im;
pdcchStateInd_t pdcch_state_ind;
+ pucchSpatialRelation_t pucch_spatial_relation;
SPCSIReportingpucch_t SP_CSI_reporting_pucch;
aperiodicCSI_triggerStateSelection_t aperi_CSI_trigger;
pdschTciStatesActDeact_t pdsch_TCI_States_ActDeact;
@@ -352,6 +363,84 @@ typedef struct NR_UE_harq {
uint32_t tb_size;
} NR_UE_harq_t;
+//! fixme : need to enhace for the multiple TB CQI report
+
+
+//
+/*! As per spec 38.214 section 5.2.1.4.2
+ * - if the UE is configured with the higher layer parameter groupBasedBeamReporting set to 'disabled', the UE shall report in
+ a single report nrofReportedRS (higher layer configured) different CRI or SSBRI for each report setting.
+ * - if the UE is configured with the higher layer parameter groupBasedBeamReporting set to 'enabled', the UE shall report in a
+ single reporting instance two different CRI or SSBRI for each report setting, where CSI-RS and/or SSB
+ resources can be received simultaneously by the UE either with a single spatial domain receive filter, or with
+ multiple simultaneous spatial domain receive filter
+*/
+#define MAX_NR_OF_REPORTED_RS 4
+
+typedef enum NR_CSI_Report_Config {
+ CSI_Report_PR_cri_ri_li_pmi_cqi_report,
+ CSI_Report_PR_ssb_cri_report
+} NR_CSI_Report_Config_PR;
+struct CRI_RI_LI_PMI_CQI {
+ uint8_t cri;
+ uint8_t ri;
+ uint8_t li;
+ uint8_t pmi_x1;
+ uint8_t pmi_x2;
+ uint8_t cqi;
+};
+
+typedef struct CRI_SSB_RSRP {
+ uint8_t nr_ssbri_cri;
+ uint8_t CRI_SSBRI[MAX_NR_OF_REPORTED_RS];
+ uint8_t RSRP;
+ uint8_t diff_RSRP[MAX_NR_OF_REPORTED_RS - 1];
+} CRI_SSB_RSRP_t;
+
+struct CSI_Report {
+ NR_CSI_Report_Config_PR present;
+ union Config_CSI_Report {
+ struct CRI_RI_LI_PMI_CQI cri_ri_li_pmi_cqi_report;
+ struct CRI_SSB_RSRP ssb_cri_report;
+ } choice;
+};
+
+#define MAX_SR_BITLEN 8
+
+typedef struct {
+ uint8_t nb_ssbri_cri;
+ uint8_t cri_ssbri_bitlen;
+ uint8_t rsrp_bitlen;
+ uint8_t diff_rsrp_bitlen;
+}L1_RSRP_bitlen_t;
+
+typedef struct{
+ uint8_t cri_bitlen;
+ uint8_t ri_bitlen;
+ uint8_t li_bitlen;
+ uint8_t pmi_x1_bitlen;
+ uint8_t pmi_x2_bitlen;
+ uint8_t cqi_bitlen;
+} CSI_Meas_bitlen_t;
+
+typedef struct nr_csi_report {
+ NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type;
+ long periodicity;
+ uint16_t offset;
+ long ** SSB_Index_list;
+ long ** CSI_Index_list;
+// uint8_t nb_of_nzp_csi_report;
+ uint8_t nb_of_csi_ssb_report;
+ L1_RSRP_bitlen_t CSI_report_bitlen;
+ CSI_Meas_bitlen_t csi_meas_bitlen;
+} nr_csi_report_t;
+
+/*! As per the spec 38.212 and table: 6.3.1.1.2-12 in a single UCI sequence we can have multiple CSI_report
+ the number of CSI_report will depend on number of CSI resource sets that are configured in CSI-ResourceConfig RRC IE
+ From spec 38.331 from the IE CSI-ResourceConfig for SSB RSRP reporting we can configure only one resource set
+ From spec 38.214 section 5.2.1.2 For periodic and semi-persistent CSI Resource Settings, the number of CSI-RS Resource Sets configured is limited to S=1
+ */
+#define MAX_CSI_RESOURCE_SET_IN_CSI_RESOURCE_CONFIG 16
typedef struct NR_UE_old_sched {
uint16_t rbSize;
int time_domain_allocation;
@@ -376,26 +465,8 @@ typedef struct NR_UE_ul_harq {
NR_sched_pusch_t sched_pusch;
} NR_UE_ul_harq_t;
-
-typedef struct {
- uint8_t nb_ssbri_cri;
- uint8_t cri_ssbri_bitlen;
- uint8_t rsrp_bitlen;
- uint8_t diff_rsrp_bitlen;
-}CRI_SSBRI_RSRP_bitlen_t;
-
-
-#define MAX_CSI_RESOURCE_SET_IN_CSI_RESOURCE_CONFIG 16
-typedef struct nr_csi_report {
- NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type;
- NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR CSI_Resource_type;
- uint8_t nb_of_nzp_csi_report;
- uint8_t nb_of_csi_ssb_report;
- CRI_SSBRI_RSRP_bitlen_t CSI_report_bitlen[MAX_CSI_RESOURCE_SET_IN_CSI_RESOURCE_CONFIG];
-} nr_csi_report_t;
-
-
/*! \brief scheduling control information set through an API */
+#define MAX_CSI_REPORTS 48
typedef struct {
/// total amount of data awaiting for this UE
uint32_t num_total_bytes;
@@ -450,6 +521,8 @@ typedef struct {
uint8_t tpc0;
uint8_t tpc1;
uint16_t ul_rssi;
+ uint8_t current_harq_pid;
+ struct CSI_Report CSI_report[MAX_CSI_REPORTS];
/// information about every HARQ process
NR_UE_harq_t harq_processes[NR_MAX_NB_HARQ_PROCESSES];
/// HARQ processes that are free
@@ -487,6 +560,8 @@ typedef struct {
int ulsch_total_bytes_scheduled;
int ulsch_total_bytes_rx;
int ulsch_current_bytes;
+ int cumul_rsrp;
+ uint8_t num_rsrp_meas;
} NR_mac_stats_t;
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
index 597cba7bf5..ec48b0adae 100644
--- a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
@@ -776,7 +776,7 @@ void nr_DRB_preconfiguration(uint16_t crnti)
drb_ToAddMod->pdcp_Config = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config));
drb_ToAddMod->pdcp_Config->drb = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->drb));
drb_ToAddMod->pdcp_Config->drb->discardTimer = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->drb->discardTimer));
- *drb_ToAddMod->pdcp_Config->drb->discardTimer=NR_PDCP_Config__drb__discardTimer_ms30;
+ *drb_ToAddMod->pdcp_Config->drb->discardTimer=NR_PDCP_Config__drb__discardTimer_infinity;
drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeUL = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeUL));
*drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeUL = NR_PDCP_Config__drb__pdcp_SN_SizeUL_len12bits;
drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeDL = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeDL));
diff --git a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
index b183b32aab..5b5f3e6b3c 100644
--- a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
+++ b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
@@ -43,7 +43,6 @@
NR_IF_Module_t *if_inst[MAX_IF_MODULES];
NR_Sched_Rsp_t Sched_INFO[MAX_IF_MODULES][MAX_NUM_CCs];
-
extern int oai_nfapi_harq_indication(nfapi_harq_indication_t *harq_ind);
extern int oai_nfapi_crc_indication(nfapi_crc_indication_t *crc_ind);
extern int oai_nfapi_cqi_indication(nfapi_cqi_indication_t *cqi_ind);
@@ -96,6 +95,7 @@ void handle_nr_uci(NR_UL_IND_t *UL_info)
handle_nr_uci_pucch_0_1(mod_id, frame, slot, uci_pdu);
break;
}
+
case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE: {
const nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_pdu = &uci_list[i].pucch_pdu_format_2_3_4;
handle_nr_uci_pucch_2_3_4(mod_id, frame, slot, uci_pdu);
diff --git a/openair2/RRC/NR/nr_rrc_proto.h b/openair2/RRC/NR/nr_rrc_proto.h
index 6d876a0eef..5aafbaee4c 100644
--- a/openair2/RRC/NR/nr_rrc_proto.h
+++ b/openair2/RRC/NR/nr_rrc_proto.h
@@ -79,17 +79,19 @@ void fill_default_coresetZero(NR_ControlResourceSet_t *coreset0, NR_ServingCellC
void fill_default_searchSpaceZero(NR_SearchSpace_t *ss0);
void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
- NR_CellGroupConfig_t *secondaryCellGroup,
- int scg_id,
- int servCellIndex,
- int n_physical_antenna_ports,
- int initial_csi_index);
+ NR_ServingCellConfig_t *servingcellconfigdedicated,
+ NR_CellGroupConfig_t *secondaryCellGroup,
+ int scg_id,
+ int servCellIndex,
+ int n_physical_antenna_ports,
+ int initial_csi_index);
void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
- NR_RRCReconfiguration_IEs_t *reconfig,
- NR_CellGroupConfig_t *secondaryCellGroup,
- int n_physical_antenna_ports,
- int initial_csi_index);
+ NR_ServingCellConfig_t *servingcellconfigdedicated,
+ NR_RRCReconfiguration_IEs_t *reconfig,
+ NR_CellGroupConfig_t *secondaryCellGroup,
+ int n_physical_antenna_ports,
+ int initial_csi_index);
void fill_default_rbconfig(NR_RadioBearerConfig_t *rbconfig,
int eps_bearer_id, int rb_id,
diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c
index 508d63a111..9bea266ffd 100755
--- a/openair2/RRC/NR/rrc_gNB.c
+++ b/openair2/RRC/NR/rrc_gNB.c
@@ -278,6 +278,8 @@ static void init_NR_SI(gNB_RRC_INST *rrc, gNB_RrcConfigurationReq *configuration
parse_CG_ConfigInfo(rrc,CG_ConfigInfo,NULL);
} else {
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_allocate_new_UE_context(rrc);
+ ue_context_p->ue_context.spCellConfig = calloc(1, sizeof(struct NR_SpCellConfig));
+ ue_context_p->ue_context.spCellConfig->spCellConfigDedicated = configuration->scd;
LOG_I(NR_RRC,"Adding new user (%p)\n",ue_context_p);
rrc_add_nsa_user(rrc,ue_context_p,NULL);
}
@@ -634,7 +636,7 @@ rrc_gNB_generate_defaultRRCReconfiguration(
DRB_config->pdcp_Config = calloc(1, sizeof(*DRB_config->pdcp_Config));
DRB_config->pdcp_Config->drb = calloc(1,sizeof(*DRB_config->pdcp_Config->drb));
DRB_config->pdcp_Config->drb->discardTimer = calloc(1, sizeof(*DRB_config->pdcp_Config->drb->discardTimer));
- *DRB_config->pdcp_Config->drb->discardTimer = NR_PDCP_Config__drb__discardTimer_ms30;
+ *DRB_config->pdcp_Config->drb->discardTimer = NR_PDCP_Config__drb__discardTimer_infinity;
DRB_config->pdcp_Config->drb->pdcp_SN_SizeUL = calloc(1, sizeof(*DRB_config->pdcp_Config->drb->pdcp_SN_SizeUL));
*DRB_config->pdcp_Config->drb->pdcp_SN_SizeUL = NR_PDCP_Config__drb__pdcp_SN_SizeUL_len18bits;
DRB_config->pdcp_Config->drb->pdcp_SN_SizeDL = calloc(1, sizeof(*DRB_config->pdcp_Config->drb->pdcp_SN_SizeDL));
diff --git a/openair2/RRC/NR/rrc_gNB_nsa.c b/openair2/RRC/NR/rrc_gNB_nsa.c
index 654bf45399..c1efc9550c 100644
--- a/openair2/RRC/NR/rrc_gNB_nsa.c
+++ b/openair2/RRC/NR/rrc_gNB_nsa.c
@@ -238,11 +238,21 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
cipher_algo,
NR_SecurityConfig__keyToUse_secondary);
}
- fill_default_reconfig(carrier->servingcellconfigcommon,
+ if (ue_context_p->ue_context.spCellConfig) {
+ fill_default_reconfig(carrier->servingcellconfigcommon,
+ ue_context_p->ue_context.spCellConfig->spCellConfigDedicated,
reconfig_ies,
ue_context_p->ue_context.secondaryCellGroup,
carrier->pdsch_AntennaPorts,
carrier->initial_csi_index[rrc->Nb_ue]);
+ } else {
+ fill_default_reconfig(carrier->servingcellconfigcommon,
+ NULL,
+ reconfig_ies,
+ ue_context_p->ue_context.secondaryCellGroup,
+ carrier->pdsch_AntennaPorts,
+ carrier->initial_csi_index[rrc->Nb_ue]);
+ }
ue_context_p->ue_id_rnti = ue_context_p->ue_context.secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity;
NR_CG_Config_t *CG_Config = calloc(1,sizeof(*CG_Config));
memset((void *)CG_Config,0,sizeof(*CG_Config));
diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c
index 633673444b..b2b8107e52 100644
--- a/openair2/RRC/NR/rrc_gNB_reconfig.c
+++ b/openair2/RRC/NR/rrc_gNB_reconfig.c
@@ -31,6 +31,7 @@
#define RRC_GNB_NSA_C
#include "NR_ServingCellConfigCommon.h"
+#include "NR_ServingCellConfig.h"
#include "NR_RRCReconfiguration.h"
#include "NR_RRCReconfiguration-IEs.h"
#include "NR_CellGroupConfig.h"
@@ -143,6 +144,7 @@ void fill_default_searchSpaceZero(NR_SearchSpace_t *ss0) {
}
void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
+ NR_ServingCellConfig_t *servingcellconfigdedicated,
NR_CellGroupConfig_t *secondaryCellGroup,
int scg_id,
int servCellIndex,
@@ -285,7 +287,11 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->ext1 = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->ext1));
secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->ext1->t311 = NR_RLF_TimersAndConstants__ext1__t311_ms30000;
secondaryCellGroup->spCellConfig->rlmInSyncOutOfSyncThreshold = NULL;
- secondaryCellGroup->spCellConfig->spCellConfigDedicated = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated));
+ if (servingcellconfigdedicated) {
+ secondaryCellGroup->spCellConfig->spCellConfigDedicated = servingcellconfigdedicated;
+ } else {
+ secondaryCellGroup->spCellConfig->spCellConfigDedicated = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated));
+ }
secondaryCellGroup->spCellConfig->spCellConfigDedicated->tdd_UL_DL_ConfigurationDedicated = NULL;
secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP));
secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdcch_Config=NULL;
@@ -460,9 +466,15 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
#endif
secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToReleaseList= NULL;
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList));
+
+ NR_BWP_Downlink_t *bwp = NULL;
+ if (servingcellconfigdedicated) {
+ bwp=servingcellconfigdedicated->downlinkBWP_ToAddModList->list.array[0];
+ } else {
+ secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList));
- NR_BWP_Downlink_t *bwp=calloc(1,sizeof(*bwp));
+ bwp=calloc(1,sizeof(*bwp));
+ }
bwp->bwp_Id=1;
bwp->bwp_Common=calloc(1,sizeof(*bwp->bwp_Common));
// copy common BWP size from initial BWP except for bandwdith
@@ -577,8 +589,9 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
ASN_SEQUENCE_ADD(&bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list,pdschi);
}
- bwp->bwp_Dedicated=calloc(1,sizeof(*bwp->bwp_Dedicated));
-
+ if (!servingcellconfigdedicated) {
+ bwp->bwp_Dedicated=calloc(1,sizeof(*bwp->bwp_Dedicated));
+ }
bwp->bwp_Dedicated->pdcch_Config=calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config));
bwp->bwp_Dedicated->pdcch_Config->present = NR_SetupRelease_PDCCH_Config_PR_setup;
bwp->bwp_Dedicated->pdcch_Config->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup));
@@ -626,113 +639,30 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToReleaseList = NULL;
- bwp->bwp_Dedicated->pdsch_Config = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config));
+ if (!servingcellconfigdedicated) {
+ bwp->bwp_Dedicated->pdsch_Config = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config));
bwp->bwp_Dedicated->pdsch_Config->present = NR_SetupRelease_PDSCH_Config_PR_setup;
bwp->bwp_Dedicated->pdsch_Config->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup));
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->dataScramblingIdentityPDSCH = NULL;
bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA));
bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->present= NR_SetupRelease_DMRS_DownlinkConfig_PR_setup;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup));
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup));
+ }
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dataScramblingIdentityPDSCH = NULL;
bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type=NULL;//calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type));
bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->maxLength=NULL;
bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->scramblingID0=NULL;
bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->scramblingID1=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS=NULL;
-
+ if (!servingcellconfigdedicated) {
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS=NULL;
+ }
bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition));
*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos0;
- //bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList=NULL;
bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList));
-#if 0
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList));
-
- NR_TCI_State_t*tcid0=calloc(1,sizeof(*tcid0));
- tcid0->tci_StateId=0;
- tcid0->qcl_Type1.cell=NULL;
- tcid0->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid0->qcl_Type1.bwp_Id));
- *tcid0->qcl_Type1.bwp_Id=1;
- tcid0->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_csi_rs;
- tcid0->qcl_Type1.referenceSignal.choice.csi_rs = 2;
- tcid0->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeA;
- ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid0);
-
- NR_TCI_State_t*tcid1=calloc(1,sizeof(*tcid1));
- tcid1->tci_StateId=0;
- tcid1->qcl_Type1.cell=NULL;
- tcid1->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid1->qcl_Type1.bwp_Id));
- *tcid1->qcl_Type1.bwp_Id=1;
- tcid1->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_csi_rs;
- tcid1->qcl_Type1.referenceSignal.choice.csi_rs = 6;
- tcid1->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeA;
- ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid1);
-
- NR_TCI_State_t*tcid2=calloc(1,sizeof(*tcid2));
- tcid2->tci_StateId=2;
- tcid2->qcl_Type1.cell=NULL;
- tcid2->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid2->qcl_Type1.bwp_Id));
- *tcid2->qcl_Type1.bwp_Id=1;
- tcid2->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_csi_rs;
- tcid2->qcl_Type1.referenceSignal.choice.csi_rs = 10;
- tcid2->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeA;
- ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid2);
-
- NR_TCI_State_t*tcid3=calloc(1,sizeof(*tcid3));
- tcid3->tci_StateId=3;
- tcid3->qcl_Type1.cell=NULL;
- tcid3->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid3->qcl_Type1.bwp_Id));
- *tcid3->qcl_Type1.bwp_Id=1;
- tcid3->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_csi_rs;
- tcid3->qcl_Type1.referenceSignal.choice.csi_rs = 14;
- tcid3->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeA;
- ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid3);
-
- NR_TCI_State_t*tcid4=calloc(1,sizeof(*tcid4));
- tcid4->tci_StateId=4;
- tcid4->qcl_Type1.cell=NULL;
- tcid4->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid4->qcl_Type1.bwp_Id));
- *tcid4->qcl_Type1.bwp_Id=1;
- tcid4->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_csi_rs;
- tcid4->qcl_Type1.referenceSignal.choice.csi_rs = 18;
- tcid4->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeA;
- ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid4);
-
- NR_TCI_State_t*tcid5=calloc(1,sizeof(*tcid5));
- tcid5->tci_StateId=5;
- tcid5->qcl_Type1.cell=NULL;
- tcid5->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid5->qcl_Type1.bwp_Id));
- *tcid5->qcl_Type1.bwp_Id=1;
- tcid5->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_csi_rs;
- tcid5->qcl_Type1.referenceSignal.choice.csi_rs = 22;
- tcid5->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeA;
- ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid5);
-
- NR_TCI_State_t*tcid6=calloc(1,sizeof(*tcid6));
- tcid6->tci_StateId=6;
- tcid6->qcl_Type1.cell=NULL;
- tcid6->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid6->qcl_Type1.bwp_Id));
- *tcid6->qcl_Type1.bwp_Id=1;
- tcid6->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_csi_rs;
- tcid6->qcl_Type1.referenceSignal.choice.csi_rs = 26;
- tcid6->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeA;
- ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid6);
-
- NR_TCI_State_t*tcid7=calloc(1,sizeof(*tcid7));
- tcid7->tci_StateId=7;
- tcid7->qcl_Type1.cell=NULL;
- tcid7->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid7->qcl_Type1.bwp_Id));
- *tcid7->qcl_Type1.bwp_Id=1;
- tcid7->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_csi_rs;
- tcid7->qcl_Type1.referenceSignal.choice.csi_rs = 30;
- tcid7->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeA;
- ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid7);
-#endif
-
-
n_ssb = 0;
NR_TCI_State_t *tcid[64];
for (int i=0;i<64;i++) {
@@ -828,8 +758,9 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
*bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureDetectionTimer = NR_RadioLinkMonitoringConfig__beamFailureDetectionTimer_pbfd2;
#endif
- ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list,bwp);
-
+ if (!servingcellconfigdedicated) {
+ ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list,bwp);
+ }
secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id));
*secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id=1;
@@ -837,26 +768,38 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = NULL;
secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = calloc(1, sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id));
*secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = 1;
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig));
+
+ if (!servingcellconfigdedicated) {
+ secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig));
+ }
NR_BWP_UplinkDedicated_t *initialUplinkBWP = calloc(1,sizeof(*initialUplinkBWP));
secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP = initialUplinkBWP;
initialUplinkBWP->pucch_Config = NULL;
initialUplinkBWP->pusch_Config = calloc(1,sizeof(*initialUplinkBWP->pusch_Config));
initialUplinkBWP->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup;
- NR_PUSCH_Config_t *pusch_Config = calloc(1,sizeof(*pusch_Config));
+ NR_PUSCH_Config_t *pusch_Config = NULL;
+ if (servingcellconfigdedicated) {
+ pusch_Config = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup;
+ } else {
+ pusch_Config = calloc(1,sizeof(*pusch_Config));
+ }
initialUplinkBWP->pusch_Config->choice.setup = pusch_Config;
pusch_Config->txConfig=calloc(1,sizeof(*pusch_Config->txConfig));
*pusch_Config->txConfig= NR_PUSCH_Config__txConfig_codebook;
pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA = NULL;
- pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB));
- pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->present = NR_SetupRelease_DMRS_UplinkConfig_PR_setup;
- pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup));
+ if (!servingcellconfigdedicated) {
+ pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB));
+ pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->present = NR_SetupRelease_DMRS_UplinkConfig_PR_setup;
+ pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup));
+ }
NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup;
NR_DMRS_UplinkConfig->dmrs_Type = NULL;
NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = calloc(1,sizeof(*NR_DMRS_UplinkConfig->dmrs_AdditionalPosition));
*NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = NR_DMRS_UplinkConfig__dmrs_AdditionalPosition_pos0;
- NR_DMRS_UplinkConfig->phaseTrackingRS=NULL;
+ if (!servingcellconfigdedicated) {
+ NR_DMRS_UplinkConfig->phaseTrackingRS=NULL;
+ }
NR_DMRS_UplinkConfig->maxLength=NULL;
NR_DMRS_UplinkConfig->transformPrecodingDisabled = calloc(1,sizeof(*NR_DMRS_UplinkConfig->transformPrecodingDisabled));
NR_DMRS_UplinkConfig->transformPrecodingDisabled->scramblingID0 = NULL;
@@ -903,7 +846,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
pusch_Config->tp_pi2BPSK=NULL;
/*------------------------------TRANSFORM PRECODING- -----------------------------------------------------------------------*/
-
+
uint8_t transform_precoding = NR_PUSCH_Config__transformPrecoder_disabled;
// TBD: configure this from .conf file, Dedicated params cannot yet be configured in .conf file.
@@ -918,20 +861,20 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
if (servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder != NULL)
transform_precoding = NR_PUSCH_Config__transformPrecoder_enabled;
}
- else
+ else
transform_precoding = *pusch_Config->transformPrecoder;
-
-
+
+
if (transform_precoding == NR_PUSCH_Config__transformPrecoder_enabled ) {
/* Enable DMRS uplink config for transform precoding enabled */
NR_DMRS_UplinkConfig->transformPrecodingEnabled = calloc(1,sizeof(*NR_DMRS_UplinkConfig->transformPrecodingEnabled));
NR_DMRS_UplinkConfig->transformPrecodingEnabled->nPUSCH_Identity = NULL;
- NR_DMRS_UplinkConfig->transformPrecodingEnabled->sequenceGroupHopping = NULL;
+ NR_DMRS_UplinkConfig->transformPrecodingEnabled->sequenceGroupHopping = NULL;
NR_DMRS_UplinkConfig->transformPrecodingEnabled->sequenceHopping = NULL;
- NR_DMRS_UplinkConfig->transformPrecodingEnabled->ext1 = NULL;
+ NR_DMRS_UplinkConfig->transformPrecodingEnabled->ext1 = NULL;
LOG_I(RRC,"TRANSFORM PRECODING ENABLED......\n");
-
+
}
/*----------------------------------------------------------------------------------------------------------------------------*/
@@ -992,8 +935,13 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
ASN_SEQUENCE_ADD(&srs_Config->srs_ResourceToAddModList->list,srs_res0);
secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToReleaseList = NULL;
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList));
- NR_BWP_Uplink_t *ubwp = calloc(1,sizeof(*ubwp));
+ NR_BWP_Uplink_t *ubwp = NULL;
+ if (servingcellconfigdedicated) {
+ ubwp = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[0];
+ } else {
+ secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList));
+ ubwp = calloc(1,sizeof(*ubwp));
+ }
ubwp->bwp_Id=1;
ubwp->bwp_Common = calloc(1,sizeof(*ubwp->bwp_Common));
// copy bwp_Common from Initial UL BWP except for bandwidth
@@ -1006,7 +954,9 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
ubwp->bwp_Common->pusch_ConfigCommon = servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon;
ubwp->bwp_Common->pucch_ConfigCommon = servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon;
- ubwp->bwp_Dedicated = calloc(1,sizeof(*ubwp->bwp_Dedicated));
+ if (!servingcellconfigdedicated) {
+ ubwp->bwp_Dedicated = calloc(1,sizeof(*ubwp->bwp_Dedicated));
+ }
ubwp->bwp_Dedicated->pucch_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->pucch_Config));
ubwp->bwp_Dedicated->pucch_Config->present = NR_SetupRelease_PUCCH_Config_PR_setup;
NR_PUCCH_Config_t *pucch_Config = calloc(1,sizeof(*pucch_Config));
@@ -1136,11 +1086,12 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
ASN_SEQUENCE_ADD(&pucch_Config->pucch_PowerControl->p0_Set->list,p00);
pucch_Config->pucch_PowerControl->pathlossReferenceRSs = NULL;
- // copy pusch_Config from dedicated initialBWP
- ubwp->bwp_Dedicated->pusch_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->pusch_Config));
- ubwp->bwp_Dedicated->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup;
- ubwp->bwp_Dedicated->pusch_Config->choice.setup = pusch_Config;
-
+ if (!servingcellconfigdedicated) {
+ // copy pusch_Config from dedicated initialBWP
+ ubwp->bwp_Dedicated->pusch_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->pusch_Config));
+ ubwp->bwp_Dedicated->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup;
+ ubwp->bwp_Dedicated->pusch_Config->choice.setup = pusch_Config;
+ }
ubwp->bwp_Dedicated->configuredGrantConfig = NULL;
ubwp->bwp_Dedicated->srs_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->srs_Config));
ubwp->bwp_Dedicated->srs_Config->present = NR_SetupRelease_SRS_Config_PR_setup;
@@ -1148,7 +1099,9 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
ubwp->bwp_Dedicated->beamFailureRecoveryConfig = NULL;
- ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list,ubwp);
+ if (!servingcellconfigdedicated) {
+ ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list,ubwp);
+ }
secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id));
*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id = 1;
@@ -1300,7 +1253,9 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
secondaryCellGroup->spCellConfig->spCellConfigDedicated->servingCellMO=NULL;
}
+
void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
+ NR_ServingCellConfig_t *servingcellconfigdedicated,
NR_RRCReconfiguration_IEs_t *reconfig,
NR_CellGroupConfig_t *secondaryCellGroup,
int n_physical_antenna_ports,
@@ -1311,7 +1266,7 @@ void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon
// radioBearerConfig
reconfig->radioBearerConfig=NULL;
// secondaryCellGroup
- fill_default_secondaryCellGroup(servingcellconfigcommon,secondaryCellGroup,1,1,n_physical_antenna_ports,initial_csi_index);
+ fill_default_secondaryCellGroup(servingcellconfigcommon,servingcellconfigdedicated,secondaryCellGroup,1,1,n_physical_antenna_ports,initial_csi_index);
xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)secondaryCellGroup);
char scg_buffer[1024];
@@ -1347,7 +1302,7 @@ void fill_default_rbconfig(NR_RadioBearerConfig_t *rbconfig,
drb_ToAddMod->pdcp_Config = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config));
drb_ToAddMod->pdcp_Config->drb = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->drb));
drb_ToAddMod->pdcp_Config->drb->discardTimer = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->drb->discardTimer));
- *drb_ToAddMod->pdcp_Config->drb->discardTimer=NR_PDCP_Config__drb__discardTimer_ms30;
+ *drb_ToAddMod->pdcp_Config->drb->discardTimer=NR_PDCP_Config__drb__discardTimer_infinity;
drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeUL = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeUL));
*drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeUL = NR_PDCP_Config__drb__pdcp_SN_SizeUL_len18bits;
drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeDL = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeDL));
diff --git a/openair2/X2AP/x2ap_eNB_generate_messages.c b/openair2/X2AP/x2ap_eNB_generate_messages.c
index fdce8678b0..7c3a89e7f4 100644
--- a/openair2/X2AP/x2ap_eNB_generate_messages.c
+++ b/openair2/X2AP/x2ap_eNB_generate_messages.c
@@ -1318,6 +1318,9 @@ MCC_MNC_TO_PLMNID(instance_p->mcc, instance_p->mnc, instance_p->mnc_digit_length
ASN_SEQUENCE_ADD(&servedCellMember->servedNRCellInfo.nrModeInfo.choice.tdd.nRFreqInfo.freqBandListNr, freq_band);
switch (instance_p->N_RB_DL[i]) {
+ case 24:
+ servedCellMember->servedNRCellInfo.nrModeInfo.choice.tdd.nR_TxBW.nRNRB = X2AP_NRNRB_nrb24;
+ break;
case 32:
servedCellMember->servedNRCellInfo.nrModeInfo.choice.tdd.nR_TxBW.nRNRB = X2AP_NRNRB_nrb32;
break;
diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
index dd29d01fae..61a742af65 100644
--- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
+++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
@@ -1110,7 +1110,7 @@ extern "C" {
case 46080000:
//openair0_cfg[0].samples_per_packet = 2048;
- openair0_cfg[0].tx_sample_advance = 15;
+ openair0_cfg[0].tx_sample_advance = 65;
openair0_cfg[0].tx_bw = 40e6;
openair0_cfg[0].rx_bw = 40e6;
break;
@@ -1125,7 +1125,7 @@ extern "C" {
case 15360000:
//openair0_cfg[0].samples_per_packet = 2048;
- openair0_cfg[0].tx_sample_advance = 45;
+ openair0_cfg[0].tx_sample_advance = 40;
openair0_cfg[0].tx_bw = 10e6;
openair0_cfg[0].rx_bw = 10e6;
break;
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf
new file mode 100644
index 0000000000..a02cf1485a
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf
@@ -0,0 +1,339 @@
+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 = 208; mnc = 93; mnc_length = 2;});
+
+ tr_s_preference = "local_mac"
+
+ ////////// Physical parameters:
+
+ ssb_SubcarrierOffset = 0;
+ pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
+
+ servingCellConfigCommon = (
+ {
+ #spCellConfigCommon
+
+ physCellId = 0;
+
+ # downlinkConfigCommon
+ # frequencyInfoDL
+ # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
+ absoluteFrequencySSB = 641032;
+ dl_frequencyBand = 78;
+ # this is 3600 MHz
+ dl_absoluteFrequencyPointA = 640000;
+ #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=50 (275*(L-1))+RBstart
+ initialDLBWPlocationAndBandwidth = 6366;
+ # subcarrierSpacing
+ # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialDLBWPsubcarrierSpacing = 1;
+ #pdcch-ConfigCommon
+ initialDLBWPcontrolResourceSetZero = 12;
+ initialDLBWPsearchSpaceZero = 0;
+ #pdsch-ConfigCommon
+ #pdschTimeDomainAllocationList (up to 16 entries)
+ initialDLBWPk0_0 = 0;
+ #initialULBWPmappingType
+ #0=typeA,1=typeB
+ initialDLBWPmappingType_0 = 0;
+ #this is SS=1,L=13
+ initialDLBWPstartSymbolAndLength_0 = 40;
+
+ initialDLBWPk0_1 = 0;
+ initialDLBWPmappingType_1 = 0;
+ #this is SS=2,L=12
+ initialDLBWPstartSymbolAndLength_1 = 53;
+
+ initialDLBWPk0_2 = 0;
+ initialDLBWPmappingType_2 = 0;
+ #this is SS=1,L=12
+ initialDLBWPstartSymbolAndLength_2 = 54;
+
+ initialDLBWPk0_3 = 0;
+ initialDLBWPmappingType_3 = 0;
+ #this is SS=1,L=4
+ initialDLBWPstartSymbolAndLength_3 = 57;
+
+ #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 = 6366;
+ # 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 = 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 = 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 = 4;
+ #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,
+
+ # pusch-ConfigCommon (up to 16 elements)
+ initialULBWPk2_0 = 6;
+ initialULBWPmappingType_0 = 1
+ # this is SS=0 L=11
+ initialULBWPstartSymbolAndLength_0 = 55;
+
+ initialULBWPk2_1 = 6;
+ initialULBWPmappingType_1 = 1;
+ # this is SS=0 L=12
+ initialULBWPstartSymbolAndLength_1 = 69;
+ initialULBWPk2_2 = 7;
+ initialULBWPmappingType_2 = 1;
+ # this is SS=10 L=4
+ initialULBWPstartSymbolAndLength_2 = 52;
+
+ 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=spare1
+ 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 = 10;
+ }
+
+ );
+
+ # Dedicated Serving Cell Configuration
+ servingCellConfigDedicated = (
+ {
+ # DL PTRS related parameters.
+ # 3GPP TS 38.331 PTRS-DownlinkConfig
+
+ # frequencyDensity value range: 1-276
+ dl_ptrsFreqDensity0_0 = 25;
+ dl_ptrsFreqDensity1_0 = 75;
+
+ # timeDensity value range: 0-29
+ dl_ptrsTimeDensity0_0 = 2;
+ dl_ptrsTimeDensity1_0 = 4;
+ dl_ptrsTimeDensity2_0 = 10;
+
+ # epre_Ratio
+ # 0 = "00", 1 = "01" in TS 38.214, table 4.1-2
+ dl_ptrsEpreRatio_0 = 0;
+
+ # resourceElementOffset
+ # 0 = offset01 1 = offset02, 2 = offset02
+ # 3GPP TS 38.331 PTRS-DownlinkConfig; TS 38.211 sec. 7.4.1.2.2
+ dl_ptrsReOffset_0 = 0;
+
+ # UL PTRS related parameters.
+ # 3GPP TS 38.331 PTRS-UplinkConfig
+
+ # frequencyDensity value range: 1-276
+ ul_ptrsFreqDensity0_0 = 25;
+ ul_ptrsFreqDensity1_0 = 75;
+
+ # timeDensity value range: 0-29
+ ul_ptrsTimeDensity0_0 = 2;
+ ul_ptrsTimeDensity1_0 = 4;
+ ul_ptrsTimeDensity2_0 = 10;
+
+ # resourceElementOffset
+ # 0 = offset01 1 = offset02, 2 = offset02
+ # TS 38.331 PTRS-UplinkConfig; TS 38.211 sec. 6.4.1.2.2.1
+ ul_ptrsReOffset_0 = 0;
+
+ # maxNrofPorts
+ # 0 = n1, 1 = n2
+ ul_ptrsMaxPorts_0 = 0;
+
+ # ptrs-Power
+ # 0 = p00, 1 = p01, 2 = p10, 3 = p11
+ #ul_ptrsPower_0 = 0;
+ }
+ );
+
+ # ------- SCTP definitions
+ SCTP :
+ {
+ # Number of streams to use in input/output
+ SCTP_INSTREAMS = 2;
+ SCTP_OUTSTREAMS = 2;
+ };
+
+
+ ////////// MME parameters:
+ mme_ip_address = ( { ipv4 = "192.168.12.26";
+ ipv6 = "192:168:30::17";
+ active = "yes";
+ preference = "ipv4";
+ }
+ );
+
+ NETWORK_INTERFACES :
+ {
+
+ GNB_INTERFACE_NAME_FOR_S1_MME = "eth0";
+ GNB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24";
+ GNB_INTERFACE_NAME_FOR_S1U = "eth0";
+ GNB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24";
+ GNB_PORT_FOR_S1U = 2152; # Spec 2152
+ };
+ }
+);
+
+MACRLCs = (
+ {
+ num_cc = 1;
+ tr_s_preference = "local_L1";
+ tr_n_preference = "local_RRC";
+ }
+);
+
+L1s = (
+ {
+ num_cc = 1;
+ tr_n_preference = "local_mac";
+ pusch_proc_threads = 8;
+ }
+);
+
+RUs = (
+ {
+ local_rf = "yes"
+ nb_tx = 1
+ nb_rx = 1
+ att_tx = 0
+ att_rx = 0;
+ bands = [7];
+ max_pdschReferenceSignalPower = -27;
+ max_rxgain = 114;
+ 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];
+ sdr_addrs = "type=x300";
+ clock_src = "external";
+ }
+);
+
+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";
+ }
+);
+
+log_config :
+{
+ global_log_level ="info";
+ global_log_verbosity ="medium";
+ hw_log_level ="info";
+ hw_log_verbosity ="medium";
+ phy_log_level ="info";
+ phy_log_verbosity ="medium";
+ mac_log_level ="info";
+ mac_log_verbosity ="high";
+ rlc_log_level ="info";
+ rlc_log_verbosity ="medium";
+ pdcp_log_level ="info";
+ pdcp_log_verbosity ="medium";
+ rrc_log_level ="info";
+ rrc_log_verbosity ="medium";
+};
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf
new file mode 100644
index 0000000000..17b7421376
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf
@@ -0,0 +1,293 @@
+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 = 208; mnc = 93; mnc_length = 2;});
+
+ tr_s_preference = "local_mac"
+
+ ////////// Physical parameters:
+
+ ssb_SubcarrierOffset = 0;
+ pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
+
+ servingCellConfigCommon = (
+ {
+ #spCellConfigCommon
+
+ physCellId = 0;
+
+# downlinkConfigCommon
+ #frequencyInfoDL
+ # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
+ absoluteFrequencySSB = 640288;
+ dl_frequencyBand = 78;
+ # this is 3600 MHz
+ dl_absoluteFrequencyPointA = 640000;
+ #scs-SpecificCarrierList
+ dl_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_subcarrierSpacing = 1;
+ dl_carrierBandwidth = 24;
+ #initialDownlinkBWP
+ #genericParameters
+ # this is RBstart=41,L=24 (275*(L-1))+RBstart
+ initialDLBWPlocationAndBandwidth = 6325;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialDLBWPsubcarrierSpacing = 1;
+ #pdcch-ConfigCommon
+ initialDLBWPcontrolResourceSetZero = 0;
+ initialDLBWPsearchSpaceZero = 0;
+ #pdsch-ConfigCommon
+ #pdschTimeDomainAllocationList (up to 16 entries)
+ initialDLBWPk0_0 = 0;
+ #initialULBWPmappingType
+ #0=typeA,1=typeB
+ initialDLBWPmappingType_0 = 0;
+ #this is SS=1,L=13
+ initialDLBWPstartSymbolAndLength_0 = 40;
+
+ initialDLBWPk0_1 = 0;
+ initialDLBWPmappingType_1 = 0;
+ #this is SS=2,L=12
+ initialDLBWPstartSymbolAndLength_1 = 53;
+
+ initialDLBWPk0_2 = 0;
+ initialDLBWPmappingType_2 = 0;
+ #this is SS=1,L=12
+ initialDLBWPstartSymbolAndLength_2 = 54;
+
+ initialDLBWPk0_3 = 0;
+ initialDLBWPmappingType_3 = 0;
+ #this is SS=1,L=5
+ initialDLBWPstartSymbolAndLength_3 = 57;
+
+ #uplinkConfigCommon
+ #frequencyInfoUL
+ ul_frequencyBand = 78;
+ #scs-SpecificCarrierList
+ ul_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_subcarrierSpacing = 1;
+ ul_carrierBandwidth = 24;
+ pMax = 20;
+ #initialUplinkBWP
+ #genericParameters
+ initialULBWPlocationAndBandwidth = 6325;
+# 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 = 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 = 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 = 4;
+#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,
+
+ # pusch-ConfigCommon (up to 16 elements)
+ initialULBWPk2_0 = 6;
+ initialULBWPmappingType_0 = 1
+ # this is SS=0 L=11
+ initialULBWPstartSymbolAndLength_0 = 55;
+
+ initialULBWPk2_1 = 6;
+ initialULBWPmappingType_1 = 1;
+ # this is SS=0 L=12
+ initialULBWPstartSymbolAndLength_1 = 69;
+
+ initialULBWPk2_2 = 7;
+ initialULBWPmappingType_2 = 1;
+ # this is SS=10 L=4
+ initialULBWPstartSymbolAndLength_2 = 52;
+
+ 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=spare1
+ 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 = 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.12.26";
+ ipv6 = "192:168:30::17";
+ active = "yes";
+ preference = "ipv4";
+ }
+ );
+
+ NETWORK_INTERFACES :
+ {
+
+ GNB_INTERFACE_NAME_FOR_S1_MME = "eth0";
+ GNB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24";
+ GNB_INTERFACE_NAME_FOR_S1U = "eth0";
+ GNB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24";
+ GNB_PORT_FOR_S1U = 2152; # Spec 2152
+ };
+ }
+);
+
+MACRLCs = (
+ {
+ num_cc = 1;
+ tr_s_preference = "local_L1";
+ tr_n_preference = "local_RRC";
+ }
+);
+
+L1s = (
+ {
+ num_cc = 1;
+ tr_n_preference = "local_mac";
+ pusch_proc_threads = 8;
+ }
+);
+
+RUs = (
+ {
+ local_rf = "yes"
+ nb_tx = 1
+ nb_rx = 1
+ att_tx = 0
+ att_rx = 0;
+ bands = [7];
+ 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];
+ sdr_addrs = "type=b200";
+ #"addr=192.168.18.207";
+ #"addr=192.168.10.2,mgmt_addr=192.168.10.2,second_addr=192.168.20.2";
+ clock_src = "external";
+ }
+);
+
+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";
+ }
+);
+
+ log_config :
+ {
+ global_log_level ="info";
+ global_log_verbosity ="medium";
+ hw_log_level ="info";
+ hw_log_verbosity ="medium";
+ phy_log_level ="info";
+ phy_log_verbosity ="medium";
+ mac_log_level ="info";
+ mac_log_verbosity ="high";
+ rlc_log_level ="info";
+ rlc_log_verbosity ="medium";
+ pdcp_log_level ="info";
+ pdcp_log_verbosity ="medium";
+ rrc_log_level ="info";
+ rrc_log_verbosity ="medium";
+ };
+
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf
new file mode 100644
index 0000000000..38ce771e06
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf
@@ -0,0 +1,291 @@
+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 = 208; mnc = 93; mnc_length = 2;});
+
+ tr_s_preference = "local_mac"
+
+ ////////// Physical parameters:
+
+ ssb_SubcarrierOffset = 0;
+ pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
+
+ servingCellConfigCommon = (
+ {
+ #spCellConfigCommon
+
+ physCellId = 0;
+
+# downlinkConfigCommon
+ #frequencyInfoDL
+ # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
+ absoluteFrequencySSB = 640288;
+ dl_frequencyBand = 78;
+ # this is 3600 MHz
+ dl_absoluteFrequencyPointA = 640000;
+ #scs-SpecificCarrierList
+ dl_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_subcarrierSpacing = 1;
+ dl_carrierBandwidth = 24;
+ #initialDownlinkBWP
+ #genericParameters
+ # this is RBstart=41,L=24 (275*(L-1))+RBstart
+ initialDLBWPlocationAndBandwidth = 6325;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialDLBWPsubcarrierSpacing = 1;
+ #pdcch-ConfigCommon
+ initialDLBWPcontrolResourceSetZero = 0;
+ initialDLBWPsearchSpaceZero = 0;
+ #pdsch-ConfigCommon
+ #pdschTimeDomainAllocationList (up to 16 entries)
+ initialDLBWPk0_0 = 0;
+ #initialULBWPmappingType
+ #0=typeA,1=typeB
+ initialDLBWPmappingType_0 = 0;
+ #this is SS=1,L=13
+ initialDLBWPstartSymbolAndLength_0 = 40;
+
+ initialDLBWPk0_1 = 0;
+ initialDLBWPmappingType_1 = 0;
+ #this is SS=2,L=12
+ initialDLBWPstartSymbolAndLength_1 = 53;
+
+ initialDLBWPk0_2 = 0;
+ initialDLBWPmappingType_2 = 0;
+ #this is SS=1,L=12
+ initialDLBWPstartSymbolAndLength_2 = 54;
+
+ initialDLBWPk0_3 = 0;
+ initialDLBWPmappingType_3 = 0;
+ #this is SS=1,L=5
+ initialDLBWPstartSymbolAndLength_3 = 57;
+
+ #uplinkConfigCommon
+ #frequencyInfoUL
+ ul_frequencyBand = 78;
+ #scs-SpecificCarrierList
+ ul_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_subcarrierSpacing = 1;
+ ul_carrierBandwidth = 24;
+ pMax = 20;
+ #initialUplinkBWP
+ #genericParameters
+ initialULBWPlocationAndBandwidth = 6325;
+# 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 = 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 = 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 = 4;
+#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,
+
+ # pusch-ConfigCommon (up to 16 elements)
+ initialULBWPk2_0 = 6;
+ initialULBWPmappingType_0 = 1
+ # this is SS=0 L=11
+ initialULBWPstartSymbolAndLength_0 = 55;
+
+ initialULBWPk2_1 = 6;
+ initialULBWPmappingType_1 = 1;
+ # this is SS=0 L=12
+ initialULBWPstartSymbolAndLength_1 = 69;
+
+ initialULBWPk2_2 = 7;
+ initialULBWPmappingType_2 = 1;
+ # this is SS=10 L=4
+ initialULBWPstartSymbolAndLength_2 = 52;
+
+ 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=spare1
+ 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 = 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.12.26";
+ ipv6 = "192:168:30::17";
+ active = "yes";
+ preference = "ipv4";
+ }
+ );
+
+ NETWORK_INTERFACES :
+ {
+
+ GNB_INTERFACE_NAME_FOR_S1_MME = "eth0";
+ GNB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24";
+ GNB_INTERFACE_NAME_FOR_S1U = "eth0";
+ GNB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24";
+ GNB_PORT_FOR_S1U = 2152; # Spec 2152
+ };
+ }
+);
+
+MACRLCs = (
+ {
+ num_cc = 1;
+ tr_s_preference = "local_L1";
+ tr_n_preference = "local_RRC";
+ }
+);
+
+L1s = (
+ {
+ num_cc = 1;
+ tr_n_preference = "local_mac";
+ pusch_proc_threads = 8;
+ }
+);
+
+RUs = (
+ {
+ local_rf = "yes"
+ nb_tx = 1
+ nb_rx = 1
+ att_tx = 0
+ att_rx = 0;
+ bands = [7];
+ 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];
+ sdr_addrs = "addr=192.168.10.2,mgmt_addr=192.168.10.2,second_addr=192.168.20.2";
+ clock_src = "external";
+ }
+);
+
+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";
+ }
+);
+
+ log_config :
+ {
+ global_log_level ="info";
+ global_log_verbosity ="medium";
+ hw_log_level ="info";
+ hw_log_verbosity ="medium";
+ phy_log_level ="info";
+ phy_log_verbosity ="medium";
+ mac_log_level ="info";
+ mac_log_verbosity ="high";
+ rlc_log_level ="info";
+ rlc_log_verbosity ="medium";
+ pdcp_log_level ="info";
+ pdcp_log_verbosity ="medium";
+ rrc_log_level ="info";
+ rrc_log_verbosity ="medium";
+ };
+
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf
new file mode 100644
index 0000000000..c17174d1b6
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf
@@ -0,0 +1,291 @@
+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 = 208; mnc = 93; mnc_length = 2;});
+
+ tr_s_preference = "local_mac"
+
+ ////////// Physical parameters:
+
+ ssb_SubcarrierOffset = 0;
+ pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
+
+ servingCellConfigCommon = (
+ {
+ #spCellConfigCommon
+
+ physCellId = 0;
+
+# downlinkConfigCommon
+ #frequencyInfoDL
+ # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
+ absoluteFrequencySSB = 640288;
+ dl_frequencyBand = 78;
+ # this is 3600 MHz
+ dl_absoluteFrequencyPointA = 640000;
+ #scs-SpecificCarrierList
+ dl_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_subcarrierSpacing = 1;
+ dl_carrierBandwidth = 24;
+ #initialDownlinkBWP
+ #genericParameters
+ # this is RBstart=41,L=24 (275*(L-1))+RBstart
+ initialDLBWPlocationAndBandwidth = 6325;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialDLBWPsubcarrierSpacing = 1;
+ #pdcch-ConfigCommon
+ initialDLBWPcontrolResourceSetZero = 0;
+ initialDLBWPsearchSpaceZero = 0;
+ #pdsch-ConfigCommon
+ #pdschTimeDomainAllocationList (up to 16 entries)
+ initialDLBWPk0_0 = 0;
+ #initialULBWPmappingType
+ #0=typeA,1=typeB
+ initialDLBWPmappingType_0 = 0;
+ #this is SS=1,L=13
+ initialDLBWPstartSymbolAndLength_0 = 40;
+
+ initialDLBWPk0_1 = 0;
+ initialDLBWPmappingType_1 = 0;
+ #this is SS=2,L=12
+ initialDLBWPstartSymbolAndLength_1 = 53;
+
+ initialDLBWPk0_2 = 0;
+ initialDLBWPmappingType_2 = 0;
+ #this is SS=1,L=12
+ initialDLBWPstartSymbolAndLength_2 = 54;
+
+ initialDLBWPk0_3 = 0;
+ initialDLBWPmappingType_3 = 0;
+ #this is SS=1,L=5
+ initialDLBWPstartSymbolAndLength_3 = 57;
+
+ #uplinkConfigCommon
+ #frequencyInfoUL
+ ul_frequencyBand = 78;
+ #scs-SpecificCarrierList
+ ul_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_subcarrierSpacing = 1;
+ ul_carrierBandwidth = 24;
+ pMax = 20;
+ #initialUplinkBWP
+ #genericParameters
+ initialULBWPlocationAndBandwidth = 6325;
+# 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 = 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 = 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 = 4;
+#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,
+
+ # pusch-ConfigCommon (up to 16 elements)
+ initialULBWPk2_0 = 6;
+ initialULBWPmappingType_0 = 1
+ # this is SS=0 L=11
+ initialULBWPstartSymbolAndLength_0 = 55;
+
+ initialULBWPk2_1 = 6;
+ initialULBWPmappingType_1 = 1;
+ # this is SS=0 L=12
+ initialULBWPstartSymbolAndLength_1 = 69;
+
+ initialULBWPk2_2 = 7;
+ initialULBWPmappingType_2 = 1;
+ # this is SS=10 L=4
+ initialULBWPstartSymbolAndLength_2 = 52;
+
+ 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=spare1
+ 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 = 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.12.26";
+ ipv6 = "192:168:30::17";
+ active = "yes";
+ preference = "ipv4";
+ }
+ );
+
+ NETWORK_INTERFACES :
+ {
+
+ GNB_INTERFACE_NAME_FOR_S1_MME = "eth0";
+ GNB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24";
+ GNB_INTERFACE_NAME_FOR_S1U = "eth0";
+ GNB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24";
+ GNB_PORT_FOR_S1U = 2152; # Spec 2152
+ };
+ }
+);
+
+MACRLCs = (
+ {
+ num_cc = 1;
+ tr_s_preference = "local_L1";
+ tr_n_preference = "local_RRC";
+ }
+);
+
+L1s = (
+ {
+ num_cc = 1;
+ tr_n_preference = "local_mac";
+ pusch_proc_threads = 8;
+ }
+);
+
+RUs = (
+ {
+ local_rf = "yes"
+ nb_tx = 1
+ nb_rx = 1
+ att_tx = 0
+ att_rx = 0;
+ bands = [7];
+ max_pdschReferenceSignalPower = -27;
+ max_rxgain = 114;
+ 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];
+ sdr_addrs = "type=x300";
+ clock_src = "external";
+ }
+);
+
+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";
+ }
+);
+
+ log_config :
+ {
+ global_log_level ="info";
+ global_log_verbosity ="medium";
+ hw_log_level ="info";
+ hw_log_verbosity ="medium";
+ phy_log_level ="info";
+ phy_log_verbosity ="medium";
+ mac_log_level ="info";
+ mac_log_verbosity ="high";
+ rlc_log_level ="info";
+ rlc_log_verbosity ="medium";
+ pdcp_log_level ="info";
+ pdcp_log_verbosity ="medium";
+ rrc_log_level ="info";
+ rrc_log_verbosity ="medium";
+ };
+
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf
new file mode 100644
index 0000000000..185edc5666
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf
@@ -0,0 +1,307 @@
+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 = 222; mnc = 01; mnc_length = 2;});
+
+ tr_s_preference = "local_mac"
+
+ ////////// Physical parameters:
+
+ ssb_SubcarrierOffset = 31; //0;
+ pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
+ pusch_TargetSNRx10 = 200;
+ pucch_TargetSNRx10 = 200;
+
+ servingCellConfigCommon = (
+ {
+ #spCellConfigCommon
+
+ physCellId = 0;
+
+# downlinkConfigCommon
+ #frequencyInfoDL
+ # this is 3600 MHz + 12 PRBs@30kHz SCS
+ absoluteFrequencySSB = 640288;
+ dl_frequencyBand = 78;
+ # this is 3600 MHz
+ dl_absoluteFrequencyPointA = 640000;
+ #scs-SpecificCarrierList
+ dl_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_subcarrierSpacing = 1;
+ dl_carrierBandwidth = 24;
+ #initialDownlinkBWP
+ #genericParameters
+ # this is RBstart=0,L=24 (275*(L-1))+RBstart
+ initialDLBWPlocationAndBandwidth = 6325;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialDLBWPsubcarrierSpacing = 1;
+ #pdcch-ConfigCommon
+ initialDLBWPcontrolResourceSetZero = 0;
+ initialDLBWPsearchSpaceZero = 0;
+ #pdsch-ConfigCommon
+ #pdschTimeDomainAllocationList (up to 16 entries)
+ initialDLBWPk0_0 = 0;
+ #initialULBWPmappingType
+ #0=typeA,1=typeB
+ initialDLBWPmappingType_0 = 0;
+ #this is SS=1,L=13
+ initialDLBWPstartSymbolAndLength_0 = 40;
+
+ initialDLBWPk0_1 = 0;
+ initialDLBWPmappingType_1 = 0;
+ #this is SS=2,L=12
+ initialDLBWPstartSymbolAndLength_1 = 53;
+
+ initialDLBWPk0_2 = 0;
+ initialDLBWPmappingType_2 = 0;
+ #this is SS=1,L=12
+ initialDLBWPstartSymbolAndLength_2 = 54;
+
+ initialDLBWPk0_3 = 0;
+ initialDLBWPmappingType_3 = 0;
+ #this is SS=1,L=4 //5 (4 is for 43, 5 is for 57)
+ initialDLBWPstartSymbolAndLength_3 = 57; //43; //57;
+ #uplinkConfigCommon
+ #frequencyInfoUL
+ ul_frequencyBand = 78;
+ #scs-SpecificCarrierList
+ ul_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_subcarrierSpacing = 1;
+ ul_carrierBandwidth = 24;
+ pMax = 20;
+ #initialUplinkBWP
+ #genericParameters
+ initialULBWPlocationAndBandwidth = 6325;
+# 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 = 13;
+ preambleReceivedTargetPower = -100;
+#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 = 5;
+#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 = 4;
+#oneHalf (0..15) 4,8,12,16,...60,64
+ ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14; //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,
+ # pusch-ConfigCommon (up to 16 elements)
+ initialULBWPk2_0 = 2;
+ initialULBWPmappingType_0 = 1
+ # this is SS=0 L=12
+ initialULBWPstartSymbolAndLength_0 = 55;
+
+ initialULBWPk2_1 = 2;
+ initialULBWPmappingType_1 = 1;
+ # this is SS=0 L=11
+ initialULBWPstartSymbolAndLength_1 = 69;
+
+ initialULBWPk2_2 = 7;
+ initialULBWPmappingType_2 = 1;
+ # this is SS=10 L=4
+ initialULBWPstartSymbolAndLength_2 = 52;
+
+ 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; #0x80;
+
+# ssb_periodicityServingCell
+# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
+ 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; //8; //7;
+ nrofDownlinkSymbols = 6; //0; //6;
+ nrofUplinkSlots = 2;
+ nrofUplinkSymbols = 4; //0; //4;
+
+ ssPBCH_BlockPower = -25;
+ }
+
+ );
+
+
+ # ------- 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 = "yes";
+ 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";
+ }
+);
+
+L1s = (
+ {
+ num_cc = 1;
+ tr_n_preference = "local_mac";
+ pusch_proc_threads = 8;
+ }
+);
+
+RUs = (
+ {
+ local_rf = "yes"
+ nb_tx = 1
+ nb_rx = 1
+ att_tx = 0
+ att_rx = 0;
+ bands = [7];
+ max_pdschReferenceSignalPower = -27;
+ max_rxgain = 114;
+ 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];
+ clock_src = "external";
+ }
+);
+
+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";
+ //parallel_config = "PARALLEL_SINGLE_THREAD";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+ }
+);
+
+ log_config :
+ {
+ global_log_level ="info";
+ global_log_verbosity ="medium";
+ hw_log_level ="info";
+ hw_log_verbosity ="medium";
+ phy_log_level ="info";
+ phy_log_verbosity ="medium";
+ mac_log_level ="info";
+ mac_log_verbosity ="high";
+ rlc_log_level ="info";
+ rlc_log_verbosity ="medium";
+ pdcp_log_level ="info";
+ pdcp_log_verbosity ="medium";
+ rrc_log_level ="info";
+ rrc_log_verbosity ="medium";
+ };
+