mirror of https://github.com/PentHertz/srsLTE.git
Added timing traces for phy/mac/radio classes.
This commit is contained in:
parent
f9b7b7827b
commit
033d50978b
|
@ -0,0 +1,19 @@
|
||||||
|
function [ tti, values ] = read_trace_uint( filename, count )
|
||||||
|
|
||||||
|
[tidin msg]=fopen(filename,'r');
|
||||||
|
if (tidin==-1)
|
||||||
|
fprintf('error opening %s: %s\n',filename, msg);
|
||||||
|
out=[];
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if (nargin==1)
|
||||||
|
count=inf;
|
||||||
|
end
|
||||||
|
|
||||||
|
x=fread(tidin,2*count,'uint');
|
||||||
|
i=1:2:length(x);
|
||||||
|
tti=x(i);
|
||||||
|
values=x(i+1);
|
||||||
|
end
|
||||||
|
|
|
@ -26,12 +26,14 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
bool threads_new_rt(pthread_t *thread, void *(*start_routine) (void*), void *arg);
|
bool threads_new_rt(pthread_t *thread, void *(*start_routine) (void*), void *arg);
|
||||||
bool threads_new_rt_cpu(pthread_t *thread, void *(*start_routine) (void*), void *arg, int cpu);
|
bool threads_new_rt_prio(pthread_t *thread, void *(*start_routine) (void*), void *arg, uint32_t prio_offset);
|
||||||
|
bool threads_new_rt_cpu(pthread_t *thread, void *(*start_routine) (void*), void *arg, int cpu, uint32_t prio_offset);
|
||||||
void threads_print_self();
|
void threads_print_self();
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -0,0 +1,98 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* \section COPYRIGHT
|
||||||
|
*
|
||||||
|
* Copyright 2013-2015 The srsLTE Developers. See the
|
||||||
|
* COPYRIGHT file at the top-level directory of this distribution.
|
||||||
|
*
|
||||||
|
* \section LICENSE
|
||||||
|
*
|
||||||
|
* This file is part of the srsLTE library.
|
||||||
|
*
|
||||||
|
* srsLTE is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* srsLTE is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* A copy of the GNU Affero General Public License can be found in
|
||||||
|
* the LICENSE file in the top-level directory of this distribution
|
||||||
|
* and at http://www.gnu.org/licenses/.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#ifndef TRACE_H
|
||||||
|
#define TRACE_H
|
||||||
|
|
||||||
|
namespace srslte {
|
||||||
|
|
||||||
|
template<class elemType>
|
||||||
|
class trace
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
trace(uint32_t nof_elems_) : tti(nof_elems_), data(nof_elems_) {
|
||||||
|
rpm=0;
|
||||||
|
nof_elems=nof_elems_;
|
||||||
|
wrapped = false;
|
||||||
|
};
|
||||||
|
void push_cur_time_us(uint32_t cur_tti) {
|
||||||
|
struct timeval t;
|
||||||
|
gettimeofday(&t, NULL);
|
||||||
|
elemType us = t.tv_sec*1e6+t.tv_usec;
|
||||||
|
push(cur_tti, us);
|
||||||
|
}
|
||||||
|
void push(uint32_t value_tti, elemType value) {
|
||||||
|
tti[rpm] = value_tti;
|
||||||
|
data[rpm] = value;
|
||||||
|
rpm++;
|
||||||
|
if (rpm >= nof_elems) {
|
||||||
|
rpm = 0;
|
||||||
|
wrapped = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bool writeToBinary(std::string filename) {
|
||||||
|
FILE *f = fopen(filename.c_str(), "w");
|
||||||
|
if (f != NULL) {
|
||||||
|
uint32_t st=wrapped?(rpm+1):0;
|
||||||
|
do {
|
||||||
|
writeToBinaryValue(f, st++);
|
||||||
|
if (st >= nof_elems) {
|
||||||
|
st=0;
|
||||||
|
}
|
||||||
|
} while(st<rpm);
|
||||||
|
fclose(f);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
perror("fopen");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::vector<uint32_t> tti;
|
||||||
|
std::vector<elemType> data;
|
||||||
|
uint32_t rpm;
|
||||||
|
uint32_t nof_elems;
|
||||||
|
bool wrapped;
|
||||||
|
|
||||||
|
void writeToBinaryValue(FILE *f, uint32_t idx) {
|
||||||
|
fwrite(&tti[idx], 1, sizeof(uint32_t), f);
|
||||||
|
fwrite(&data[idx], 1, sizeof(elemType), f);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -35,15 +35,19 @@
|
||||||
#include "srsapps/common/threads.h"
|
#include "srsapps/common/threads.h"
|
||||||
|
|
||||||
bool threads_new_rt(pthread_t *thread, void *(*start_routine) (void*), void *arg) {
|
bool threads_new_rt(pthread_t *thread, void *(*start_routine) (void*), void *arg) {
|
||||||
return threads_new_rt_cpu(thread, start_routine, arg, -1);
|
return threads_new_rt_prio(thread, start_routine, arg, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool threads_new_rt_cpu(pthread_t *thread, void *(*start_routine) (void*), void *arg, int cpu) {
|
bool threads_new_rt_prio(pthread_t *thread, void *(*start_routine) (void*), void *arg, uint32_t prio_offset) {
|
||||||
|
return threads_new_rt_cpu(thread, start_routine, arg, -1, prio_offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool threads_new_rt_cpu(pthread_t *thread, void *(*start_routine) (void*), void *arg, int cpu, uint32_t prio_offset) {
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
|
|
||||||
pthread_attr_t attr;
|
pthread_attr_t attr;
|
||||||
struct sched_param param;
|
struct sched_param param;
|
||||||
param.sched_priority = sched_get_priority_max(SCHED_FIFO);
|
param.sched_priority = sched_get_priority_max(SCHED_FIFO) - prio_offset;
|
||||||
|
|
||||||
pthread_attr_init(&attr);
|
pthread_attr_init(&attr);
|
||||||
if (pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED)) {
|
if (pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED)) {
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include "srsapps/radio/radio.h"
|
#include "srsapps/radio/radio.h"
|
||||||
#include "srslte/srslte.h"
|
#include "srslte/srslte.h"
|
||||||
#include "srslte/cuhd/cuhd.h"
|
#include "srslte/cuhd/cuhd.h"
|
||||||
|
#include "srsapps/common/trace.h"
|
||||||
|
|
||||||
#ifndef RADIO_UHD_H
|
#ifndef RADIO_UHD_H
|
||||||
#define RADIO_UHD_H
|
#define RADIO_UHD_H
|
||||||
|
@ -42,6 +43,7 @@ namespace srslte {
|
||||||
class radio_uhd : public radio
|
class radio_uhd : public radio
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
radio_uhd() : tr_local_time(1024*10), tr_usrp_time(1024*10), tr_tx_time(1024*10), tr_is_eob(1024*10) {};
|
||||||
bool init();
|
bool init();
|
||||||
bool init(char *args);
|
bool init(char *args);
|
||||||
bool init_agc();
|
bool init_agc();
|
||||||
|
@ -67,15 +69,19 @@ namespace srslte {
|
||||||
float get_tx_gain();
|
float get_tx_gain();
|
||||||
float get_rx_gain();
|
float get_rx_gain();
|
||||||
|
|
||||||
|
void start_trace();
|
||||||
|
void write_trace(std::string filename);
|
||||||
void start_rx();
|
void start_rx();
|
||||||
void stop_rx();
|
void stop_rx();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
void save_trace(uint32_t is_eob, srslte_timestamp_t *usrp_time);
|
||||||
|
|
||||||
void *uhd;
|
void *uhd;
|
||||||
|
|
||||||
static const double lo_offset = 8e6; // LO offset (in Hz)
|
static const double lo_offset = 8e6; // LO offset (in Hz)
|
||||||
static const double burst_settle_time = 0.4e-3; // Start of burst settle time (off->on RF transition time)
|
static const double burst_settle_time = 0.3e-3; // Start of burst settle time (off->on RF transition time)
|
||||||
const static uint32_t burst_settle_max_samples = 12288; // 30.72 MHz is maximum frequency
|
const static uint32_t burst_settle_max_samples = 12288; // 30.72 MHz is maximum frequency
|
||||||
|
|
||||||
srslte_timestamp_t end_of_burst_time;
|
srslte_timestamp_t end_of_burst_time;
|
||||||
|
@ -84,6 +90,13 @@ namespace srslte {
|
||||||
double burst_settle_time_rounded; // settle time rounded to sample time
|
double burst_settle_time_rounded; // settle time rounded to sample time
|
||||||
cf_t zeros[burst_settle_max_samples];
|
cf_t zeros[burst_settle_max_samples];
|
||||||
double cur_tx_srate;
|
double cur_tx_srate;
|
||||||
|
|
||||||
|
trace<uint32_t> tr_local_time;
|
||||||
|
trace<uint32_t> tr_usrp_time;
|
||||||
|
trace<uint32_t> tr_tx_time;
|
||||||
|
trace<uint32_t> tr_is_eob;
|
||||||
|
bool trace_enabled;
|
||||||
|
uint32_t my_tti;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -92,18 +92,23 @@ void radio_uhd::get_time(srslte_timestamp_t *now) {
|
||||||
bool radio_uhd::tx(void* buffer, uint32_t nof_samples, srslte_timestamp_t tx_time)
|
bool radio_uhd::tx(void* buffer, uint32_t nof_samples, srslte_timestamp_t tx_time)
|
||||||
{
|
{
|
||||||
if (is_start_of_burst) {
|
if (is_start_of_burst) {
|
||||||
|
|
||||||
if (burst_settle_samples != 0) {
|
if (burst_settle_samples != 0) {
|
||||||
srslte_timestamp_t tx_time_pad;
|
srslte_timestamp_t tx_time_pad;
|
||||||
srslte_timestamp_copy(&tx_time_pad, &tx_time);
|
srslte_timestamp_copy(&tx_time_pad, &tx_time);
|
||||||
srslte_timestamp_sub(&tx_time_pad, 0, burst_settle_time_rounded);
|
srslte_timestamp_sub(&tx_time_pad, 0, burst_settle_time_rounded);
|
||||||
|
save_trace(1, &tx_time_pad);
|
||||||
cuhd_send_timed2(uhd, zeros, burst_settle_samples, tx_time_pad.full_secs, tx_time_pad.frac_secs, true, false);
|
cuhd_send_timed2(uhd, zeros, burst_settle_samples, tx_time_pad.full_secs, tx_time_pad.frac_secs, true, false);
|
||||||
}
|
}
|
||||||
is_start_of_burst = false;
|
is_start_of_burst = false;
|
||||||
srslte_timestamp_copy(&end_of_burst_time, &tx_time);
|
|
||||||
srslte_timestamp_add(&end_of_burst_time, 0, nof_samples*cur_tx_srate);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cuhd_send_timed2(uhd, buffer, nof_samples, tx_time.full_secs, tx_time.frac_secs, false, false) > 0) {
|
// Save possible end of burst time
|
||||||
|
srslte_timestamp_copy(&end_of_burst_time, &tx_time);
|
||||||
|
srslte_timestamp_add(&end_of_burst_time, 0, (double) nof_samples/cur_tx_srate);
|
||||||
|
|
||||||
|
save_trace(0, &tx_time);
|
||||||
|
if (cuhd_send_timed2(uhd, buffer, nof_samples, tx_time.full_secs, tx_time.frac_secs, true, false) > 0) {
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
@ -112,10 +117,36 @@ bool radio_uhd::tx(void* buffer, uint32_t nof_samples, srslte_timestamp_t tx_tim
|
||||||
|
|
||||||
bool radio_uhd::tx_end()
|
bool radio_uhd::tx_end()
|
||||||
{
|
{
|
||||||
|
save_trace(2, &end_of_burst_time);
|
||||||
cuhd_send_timed2(uhd, zeros, burst_settle_samples, end_of_burst_time.full_secs, end_of_burst_time.frac_secs, false, true);
|
cuhd_send_timed2(uhd, zeros, burst_settle_samples, end_of_burst_time.full_secs, end_of_burst_time.frac_secs, false, true);
|
||||||
is_start_of_burst = true;
|
is_start_of_burst = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void radio_uhd::start_trace() {
|
||||||
|
trace_enabled = true;
|
||||||
|
my_tti = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void radio_uhd::write_trace(std::string filename)
|
||||||
|
{
|
||||||
|
tr_local_time.writeToBinary(filename + ".local");
|
||||||
|
tr_is_eob.writeToBinary(filename + ".eob");
|
||||||
|
tr_usrp_time.writeToBinary(filename + ".usrp");
|
||||||
|
tr_tx_time.writeToBinary(filename + ".tx");
|
||||||
|
}
|
||||||
|
|
||||||
|
void radio_uhd::save_trace(uint32_t is_eob, srslte_timestamp_t *tx_time) {
|
||||||
|
if (trace_enabled) {
|
||||||
|
tr_local_time.push_cur_time_us(my_tti);
|
||||||
|
srslte_timestamp_t usrp_time;
|
||||||
|
cuhd_get_time(uhd, &usrp_time.full_secs, &usrp_time.frac_secs);
|
||||||
|
tr_usrp_time.push(my_tti, srslte_timestamp_uint32(&usrp_time));
|
||||||
|
tr_tx_time.push(my_tti, srslte_timestamp_uint32(tx_time));
|
||||||
|
tr_is_eob.push(my_tti, is_eob);
|
||||||
|
my_tti++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void radio_uhd::set_rx_freq(float freq)
|
void radio_uhd::set_rx_freq(float freq)
|
||||||
{
|
{
|
||||||
cuhd_set_rx_freq(uhd, freq);
|
cuhd_set_rx_freq(uhd, freq);
|
||||||
|
|
|
@ -45,6 +45,8 @@
|
||||||
#include "srsapps/ue/mac/mux.h"
|
#include "srsapps/ue/mac/mux.h"
|
||||||
#include "srsapps/ue/mac/demux.h"
|
#include "srsapps/ue/mac/demux.h"
|
||||||
#include "srsapps/ue/mac/sdu_handler.h"
|
#include "srsapps/ue/mac/sdu_handler.h"
|
||||||
|
#include "srsapps/common/trace.h"
|
||||||
|
|
||||||
|
|
||||||
#ifndef UEMAC_H
|
#ifndef UEMAC_H
|
||||||
#define UEMAC_H
|
#define UEMAC_H
|
||||||
|
@ -57,7 +59,7 @@ typedef _Complex float cf_t;
|
||||||
class mac : public timer_callback
|
class mac : public timer_callback
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
mac() : timers_db((uint32_t) NOF_MAC_TIMERS) {}
|
mac() : timers_db((uint32_t) NOF_MAC_TIMERS), tr_end_time(1024*10), tr_start_time(1024*10) {started=false;}
|
||||||
bool init(phy *phy_h, tti_sync *ttisync, log *log_h);
|
bool init(phy *phy_h, tti_sync *ttisync, log *log_h);
|
||||||
void stop();
|
void stop();
|
||||||
int get_tti();
|
int get_tti();
|
||||||
|
@ -83,6 +85,9 @@ public:
|
||||||
void reconfiguration();
|
void reconfiguration();
|
||||||
void reset();
|
void reset();
|
||||||
|
|
||||||
|
void start_trace();
|
||||||
|
void write_trace(std::string filename);
|
||||||
|
|
||||||
void timer_expired(uint32_t timer_id);
|
void timer_expired(uint32_t timer_id);
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -110,7 +115,7 @@ private:
|
||||||
static void* mac_thread_fnc(void*);
|
static void* mac_thread_fnc(void*);
|
||||||
|
|
||||||
int tti;
|
int tti;
|
||||||
bool started = false;
|
bool started;
|
||||||
bool is_synchronized;
|
bool is_synchronized;
|
||||||
uint16_t last_temporal_crnti;
|
uint16_t last_temporal_crnti;
|
||||||
|
|
||||||
|
@ -144,6 +149,12 @@ private:
|
||||||
void setup_timers();
|
void setup_timers();
|
||||||
void timeAlignmentTimerExpire();
|
void timeAlignmentTimerExpire();
|
||||||
|
|
||||||
|
trace<uint32_t> tr_start_time;
|
||||||
|
trace<uint32_t> tr_end_time;
|
||||||
|
bool tr_enabled;
|
||||||
|
void tr_log_start(uint32_t tti);
|
||||||
|
void tr_log_end(uint32_t tti);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,6 +79,32 @@ int mac::get_tti()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mac::start_trace()
|
||||||
|
{
|
||||||
|
tr_enabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mac::write_trace(std::string filename)
|
||||||
|
{
|
||||||
|
tr_start_time.writeToBinary(filename + ".start");
|
||||||
|
tr_end_time.writeToBinary(filename + ".end");
|
||||||
|
}
|
||||||
|
|
||||||
|
void mac::tr_log_start(uint32_t tti)
|
||||||
|
{
|
||||||
|
if (tr_enabled) {
|
||||||
|
tr_start_time.push_cur_time_us(tti);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void mac::tr_log_end(uint32_t tti)
|
||||||
|
{
|
||||||
|
if (tr_enabled) {
|
||||||
|
tr_end_time.push_cur_time_us(tti);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Implement Section 5.8
|
// Implement Section 5.8
|
||||||
void mac::reconfiguration()
|
void mac::reconfiguration()
|
||||||
{
|
{
|
||||||
|
@ -164,7 +190,9 @@ void mac::main_radio_loop() {
|
||||||
}
|
}
|
||||||
if (is_synchronized) {
|
if (is_synchronized) {
|
||||||
/* Warning: Here order of invocation of procedures is important!! */
|
/* Warning: Here order of invocation of procedures is important!! */
|
||||||
|
tr_log_end(tti);
|
||||||
tti = ttisync->wait();
|
tti = ttisync->wait();
|
||||||
|
tr_log_start(tti);
|
||||||
log_h->step(tti);
|
log_h->step(tti);
|
||||||
|
|
||||||
// Step all procedures
|
// Step all procedures
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
|
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
#include "liblte_rrc.h"
|
#include "liblte_rrc.h"
|
||||||
#include "srsapps/radio/radio_uhd.h"
|
#include "srsapps/radio/radio_uhd.h"
|
||||||
|
@ -46,6 +47,7 @@ typedef struct {
|
||||||
float uhd_rx_gain;
|
float uhd_rx_gain;
|
||||||
float uhd_tx_gain;
|
float uhd_tx_gain;
|
||||||
int verbose;
|
int verbose;
|
||||||
|
bool do_trace;
|
||||||
}prog_args_t;
|
}prog_args_t;
|
||||||
|
|
||||||
void args_default(prog_args_t *args) {
|
void args_default(prog_args_t *args) {
|
||||||
|
@ -54,19 +56,21 @@ void args_default(prog_args_t *args) {
|
||||||
args->uhd_rx_gain = -1; // set to autogain
|
args->uhd_rx_gain = -1; // set to autogain
|
||||||
args->uhd_tx_gain = -1;
|
args->uhd_tx_gain = -1;
|
||||||
args->verbose = 0;
|
args->verbose = 0;
|
||||||
|
args->do_trace = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void usage(prog_args_t *args, char *prog) {
|
void usage(prog_args_t *args, char *prog) {
|
||||||
printf("Usage: %s [gv] -f rx_frequency (in Hz) -F tx_frequency (in Hz)\n", prog);
|
printf("Usage: %s [gGtv] -f rx_frequency (in Hz) -F tx_frequency (in Hz)\n", prog);
|
||||||
printf("\t-g UHD RX gain [Default AGC]\n");
|
printf("\t-g UHD RX gain [Default AGC]\n");
|
||||||
printf("\t-G UHD TX gain [Default same as RX gain (AGC)]\n");
|
printf("\t-G UHD TX gain [Default same as RX gain (AGC)]\n");
|
||||||
|
printf("\t-t Enable trace [Default disabled]\n");
|
||||||
printf("\t-v [increase verbosity, default none]\n");
|
printf("\t-v [increase verbosity, default none]\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void parse_args(prog_args_t *args, int argc, char **argv) {
|
void parse_args(prog_args_t *args, int argc, char **argv) {
|
||||||
int opt;
|
int opt;
|
||||||
args_default(args);
|
args_default(args);
|
||||||
while ((opt = getopt(argc, argv, "gGfFv")) != -1) {
|
while ((opt = getopt(argc, argv, "gGftFv")) != -1) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'g':
|
case 'g':
|
||||||
args->uhd_rx_gain = atof(argv[optind]);
|
args->uhd_rx_gain = atof(argv[optind]);
|
||||||
|
@ -80,6 +84,9 @@ void parse_args(prog_args_t *args, int argc, char **argv) {
|
||||||
case 'F':
|
case 'F':
|
||||||
args->uhd_tx_freq = atof(argv[optind]);
|
args->uhd_tx_freq = atof(argv[optind]);
|
||||||
break;
|
break;
|
||||||
|
case 't':
|
||||||
|
args->do_trace = true;
|
||||||
|
break;
|
||||||
case 'v':
|
case 'v':
|
||||||
args->verbose++;
|
args->verbose++;
|
||||||
break;
|
break;
|
||||||
|
@ -202,7 +209,6 @@ void setup_mac_phy_sib2(LIBLTE_RRC_SYS_INFO_BLOCK_TYPE_2_STRUCT *sib2, srslte::u
|
||||||
phy->set_param(srslte::ue::phy_params::SRS_CS_BWCFG, sib2->rr_config_common_sib.srs_ul_cnfg.bw_cnfg);
|
phy->set_param(srslte::ue::phy_params::SRS_CS_BWCFG, sib2->rr_config_common_sib.srs_ul_cnfg.bw_cnfg);
|
||||||
phy->set_param(srslte::ue::phy_params::SRS_CS_SFCFG, sib2->rr_config_common_sib.srs_ul_cnfg.subfr_cnfg);
|
phy->set_param(srslte::ue::phy_params::SRS_CS_SFCFG, sib2->rr_config_common_sib.srs_ul_cnfg.subfr_cnfg);
|
||||||
phy->set_param(srslte::ue::phy_params::SRS_CS_ACKNACKSIMUL, sib2->rr_config_common_sib.srs_ul_cnfg.ack_nack_simul_tx);
|
phy->set_param(srslte::ue::phy_params::SRS_CS_ACKNACKSIMUL, sib2->rr_config_common_sib.srs_ul_cnfg.ack_nack_simul_tx);
|
||||||
phy->set_param(srslte::ue::phy_params::SRS_IS_CS_CONFIGURED, 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Set SRS ConfigCommon: BW-Configuration=%d, SF-Configuration=%d, ACKNACK=%d\n",
|
printf("Set SRS ConfigCommon: BW-Configuration=%d, SF-Configuration=%d, ACKNACK=%d\n",
|
||||||
|
@ -233,7 +239,6 @@ void process_connsetup(LIBLTE_RRC_CONNECTION_SETUP_STRUCT *msg, srslte::ue::mac
|
||||||
phy->set_param(srslte::ue::phy_params::SRS_UE_HOP, msg->rr_cnfg.phy_cnfg_ded.srs_ul_cnfg_ded.srs_hopping_bandwidth);
|
phy->set_param(srslte::ue::phy_params::SRS_UE_HOP, msg->rr_cnfg.phy_cnfg_ded.srs_ul_cnfg_ded.srs_hopping_bandwidth);
|
||||||
phy->set_param(srslte::ue::phy_params::SRS_UE_TXCOMB, msg->rr_cnfg.phy_cnfg_ded.srs_ul_cnfg_ded.tx_comb);
|
phy->set_param(srslte::ue::phy_params::SRS_UE_TXCOMB, msg->rr_cnfg.phy_cnfg_ded.srs_ul_cnfg_ded.tx_comb);
|
||||||
phy->set_param(srslte::ue::phy_params::SRS_BETA, 10);
|
phy->set_param(srslte::ue::phy_params::SRS_BETA, 10);
|
||||||
phy->set_param(srslte::ue::phy_params::SRS_IS_UE_CONFIGURED, 1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
printf("Set PHY configuration: SR-n_pucch=%d, SR-ConfigIndex=%d, SRS-ConfigIndex=%d, SRS-bw=%d, SRS-Nrcc=%d, SRS-hop=%d, SRS-Ncs=%d\n",
|
printf("Set PHY configuration: SR-n_pucch=%d, SR-ConfigIndex=%d, SRS-ConfigIndex=%d, SRS-bw=%d, SRS-Nrcc=%d, SRS-hop=%d, SRS-Ncs=%d\n",
|
||||||
|
@ -299,13 +304,23 @@ uint32_t lengths[2] = {37, 41};
|
||||||
uint8_t reply[2] = {0x00, 0x04};
|
uint8_t reply[2] = {0x00, 0x04};
|
||||||
|
|
||||||
|
|
||||||
|
srslte::radio_uhd radio_uhd;
|
||||||
|
srslte::ue::phy phy;
|
||||||
|
srslte::ue::mac mac;
|
||||||
|
|
||||||
|
void sig_int_handler(int signo)
|
||||||
|
{
|
||||||
|
//radio_uhd.write_trace("radio");
|
||||||
|
phy.write_trace("phy");
|
||||||
|
mac.write_trace("mac");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
prog_args_t prog_args;
|
prog_args_t prog_args;
|
||||||
srslte::ue::tti_sync_cv ttisync(10240);
|
srslte::ue::tti_sync_cv ttisync(10240);
|
||||||
srslte::radio_uhd radio_uhd;
|
|
||||||
srslte::ue::phy phy;
|
|
||||||
srslte::ue::mac mac;
|
|
||||||
srslte::log_stdout mac_log("MAC"), phy_log("PHY");
|
srslte::log_stdout mac_log("MAC"), phy_log("PHY");
|
||||||
|
|
||||||
parse_args(&prog_args, argc, argv);
|
parse_args(&prog_args, argc, argv);
|
||||||
|
@ -320,7 +335,15 @@ int main(int argc, char *argv[])
|
||||||
phy_log.set_level_debug();
|
phy_log.set_level_debug();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (prog_args.do_trace) {
|
||||||
|
// Capture SIGINT to write traces
|
||||||
|
signal(SIGINT, sig_int_handler);
|
||||||
|
//radio_uhd.start_trace();
|
||||||
|
phy.start_trace();
|
||||||
|
mac.start_trace();
|
||||||
|
}
|
||||||
|
|
||||||
// Init Radio and PHY
|
// Init Radio and PHY
|
||||||
if (prog_args.uhd_rx_gain > 0 && prog_args.uhd_tx_gain > 0) {
|
if (prog_args.uhd_rx_gain > 0 && prog_args.uhd_tx_gain > 0) {
|
||||||
radio_uhd.init();
|
radio_uhd.init();
|
||||||
|
@ -449,6 +472,8 @@ int main(int argc, char *argv[])
|
||||||
// Wait for ConnectionSetup
|
// Wait for ConnectionSetup
|
||||||
n = mac.recv_dcch0_sdu(bit_msg.msg, LIBLTE_MAX_MSG_SIZE);
|
n = mac.recv_dcch0_sdu(bit_msg.msg, LIBLTE_MAX_MSG_SIZE);
|
||||||
if (n > 0) {
|
if (n > 0) {
|
||||||
|
phy.set_param(srslte::ue::phy_params::SRS_IS_CS_CONFIGURED, 1);
|
||||||
|
phy.set_param(srslte::ue::phy_params::SRS_IS_UE_CONFIGURED, 1);
|
||||||
printf("Received on DCCH0 %d bytes\n", n/8);
|
printf("Received on DCCH0 %d bytes\n", n/8);
|
||||||
printf("Send RLC ACK\n");
|
printf("Send RLC ACK\n");
|
||||||
srslte_bit_pack_vector(reply, bit_msg.msg, 2*8);
|
srslte_bit_pack_vector(reply, bit_msg.msg, 2*8);
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#include "srsapps/ue/phy/sched_grant.h"
|
#include "srsapps/ue/phy/sched_grant.h"
|
||||||
#include "srsapps/common/queue.h"
|
#include "srsapps/common/queue.h"
|
||||||
#include "srsapps/radio/radio.h"
|
#include "srsapps/radio/radio.h"
|
||||||
|
#include "srsapps/common/trace.h"
|
||||||
|
|
||||||
#ifndef UEPHY_H
|
#ifndef UEPHY_H
|
||||||
#define UEPHY_H
|
#define UEPHY_H
|
||||||
|
@ -119,6 +120,9 @@ public:
|
||||||
ul_buffer* get_ul_buffer(uint32_t tti);
|
ul_buffer* get_ul_buffer(uint32_t tti);
|
||||||
dl_buffer* get_dl_buffer(uint32_t tti);
|
dl_buffer* get_dl_buffer(uint32_t tti);
|
||||||
|
|
||||||
|
void start_trace();
|
||||||
|
void write_trace(std::string filename);
|
||||||
|
|
||||||
void main_radio_loop();
|
void main_radio_loop();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -166,6 +170,11 @@ private:
|
||||||
|
|
||||||
bool is_first_of_burst;
|
bool is_first_of_burst;
|
||||||
|
|
||||||
|
trace<uint32_t> tr_start_time;
|
||||||
|
trace<uint32_t> tr_end_time;
|
||||||
|
bool tr_enabled;
|
||||||
|
void tr_log_start();
|
||||||
|
void tr_log_end();
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,11 +56,11 @@ namespace ue {
|
||||||
bool send(srslte::radio* radio_handler, float cfo, srslte_timestamp_t rx_time);
|
bool send(srslte::radio* radio_handler, float cfo, srslte_timestamp_t rx_time);
|
||||||
private:
|
private:
|
||||||
static const uint32_t tx_advance_sf = 1; // Number of subframes to advance transmission
|
static const uint32_t tx_advance_sf = 1; // Number of subframes to advance transmission
|
||||||
phy_params *params_db = NULL;
|
phy_params *params_db;
|
||||||
log *log_h;
|
log *log_h;
|
||||||
int preamble_idx;
|
int preamble_idx;
|
||||||
int allowed_subframe;
|
int allowed_subframe;
|
||||||
bool initiated = false;
|
bool initiated;
|
||||||
uint32_t len;
|
uint32_t len;
|
||||||
cf_t *buffer[64];
|
cf_t *buffer[64];
|
||||||
srslte_prach_t prach_obj;
|
srslte_prach_t prach_obj;
|
||||||
|
|
|
@ -116,15 +116,16 @@ bool dl_buffer::get_ul_grant(ul_sched_grant *grant)
|
||||||
if (srslte_ue_dl_find_ul_dci(&ue_dl, &dci_msg, cfi, tti%10, grant->get_rnti()) != 1) {
|
if (srslte_ue_dl_find_ul_dci(&ue_dl, &dci_msg, cfi, tti%10, grant->get_rnti()) != 1) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
grant->set_shortened(false);
|
grant->set_shortened(false);
|
||||||
if (params_db->get_param(phy_params::SRS_IS_CS_CONFIGURED)) {
|
if (params_db->get_param(phy_params::SRS_IS_CS_CONFIGURED)) {
|
||||||
if (srslte_refsignal_srs_send_cs((uint32_t) params_db->get_param(phy_params::SRS_CS_SFCFG), tti%10) == 1) {
|
if (srslte_refsignal_srs_send_cs((uint32_t) params_db->get_param(phy_params::SRS_CS_SFCFG), (tti+4)%10) == 1) {
|
||||||
grant->set_shortened(true);
|
grant->set_shortened(true);
|
||||||
printf("UL grant tti=%d is shortened. SF-CFG=%d\n", tti, (int) params_db->get_param(phy_params::SRS_CS_SFCFG));
|
printf("UL grant tti=%d is shortened. SF-CFG=%d\n", tti+4,
|
||||||
|
(int) params_db->get_param(phy_params::SRS_CS_SFCFG));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
return grant->create_from_dci(&dci_msg, cell, params_db->get_param(phy_params::PUSCH_HOPPING_OFFSET));
|
return grant->create_from_dci(&dci_msg, cell, params_db->get_param(phy_params::PUSCH_HOPPING_OFFSET));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,7 +43,7 @@
|
||||||
namespace srslte {
|
namespace srslte {
|
||||||
namespace ue {
|
namespace ue {
|
||||||
|
|
||||||
phy::phy()
|
phy::phy() : tr_end_time(1024*10), tr_start_time(1024*10)
|
||||||
{
|
{
|
||||||
started = false;
|
started = false;
|
||||||
is_sfn_synched = false;
|
is_sfn_synched = false;
|
||||||
|
@ -59,6 +59,30 @@ bool phy::init_agc(srslte::radio* radio_handler_, srslte::ue::tti_sync* ttisync_
|
||||||
return init_(radio_handler_, ttisync_, log_h, true);
|
return init_(radio_handler_, ttisync_, log_h, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void phy::start_trace()
|
||||||
|
{
|
||||||
|
tr_enabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void phy::write_trace(std::string filename)
|
||||||
|
{
|
||||||
|
tr_start_time.writeToBinary(filename + ".start");
|
||||||
|
tr_end_time.writeToBinary(filename + ".end");
|
||||||
|
}
|
||||||
|
|
||||||
|
void phy::tr_log_start()
|
||||||
|
{
|
||||||
|
if (tr_enabled) {
|
||||||
|
tr_start_time.push_cur_time_us(get_current_tti());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void phy::tr_log_end()
|
||||||
|
{
|
||||||
|
if (tr_enabled) {
|
||||||
|
tr_end_time.push_cur_time_us(get_current_tti());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool phy::init_(srslte::radio* radio_handler_, srslte::ue::tti_sync* ttisync_, log *log_h_, bool do_agc_)
|
bool phy::init_(srslte::radio* radio_handler_, srslte::ue::tti_sync* ttisync_, log *log_h_, bool do_agc_)
|
||||||
{
|
{
|
||||||
|
@ -314,7 +338,7 @@ bool phy::init_prach() {
|
||||||
|
|
||||||
ul_buffer* phy::get_ul_buffer(uint32_t tti)
|
ul_buffer* phy::get_ul_buffer(uint32_t tti)
|
||||||
{
|
{
|
||||||
if (tti + 1 < get_current_tti()) {
|
if ((tti + 1)%10240 < get_current_tti() && tti > 6) {
|
||||||
Warning("Warning access to PHY UL buffer too late. Requested TTI=%d while PHY is in %d\n", tti, get_current_tti());
|
Warning("Warning access to PHY UL buffer too late. Requested TTI=%d while PHY is in %d\n", tti, get_current_tti());
|
||||||
}
|
}
|
||||||
return (ul_buffer*) ul_buffer_queue->get(tti);
|
return (ul_buffer*) ul_buffer_queue->get(tti);
|
||||||
|
@ -524,8 +548,9 @@ void phy::run_rx_tx_state()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Receive alligned buffer for the current tti
|
// Receive alligned buffer for the current tti
|
||||||
|
tr_log_end();
|
||||||
get_dl_buffer(current_tti)->recv_ue_sync(&ue_sync, &last_rx_time);
|
get_dl_buffer(current_tti)->recv_ue_sync(&ue_sync, &last_rx_time);
|
||||||
|
tr_log_start();
|
||||||
ttisync->increase();
|
ttisync->increase();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
#define TIMESTAMP_
|
#define TIMESTAMP_
|
||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
#include <stdint.h>
|
||||||
#include "srslte/config.h"
|
#include "srslte/config.h"
|
||||||
|
|
||||||
typedef struct SRSLTE_API{
|
typedef struct SRSLTE_API{
|
||||||
|
@ -63,4 +64,6 @@ SRSLTE_API int srslte_timestamp_sub(srslte_timestamp_t *t,
|
||||||
|
|
||||||
SRSLTE_API double srslte_timestamp_real(srslte_timestamp_t *t);
|
SRSLTE_API double srslte_timestamp_real(srslte_timestamp_t *t);
|
||||||
|
|
||||||
|
SRSLTE_API uint32_t srslte_timestamp_uint32(srslte_timestamp_t *t);
|
||||||
|
|
||||||
#endif // TIMESTAMP_
|
#endif // TIMESTAMP_
|
||||||
|
|
|
@ -80,3 +80,8 @@ int srslte_timestamp_sub(srslte_timestamp_t *t, time_t full_secs, double frac_se
|
||||||
double srslte_timestamp_real(srslte_timestamp_t *t){
|
double srslte_timestamp_real(srslte_timestamp_t *t){
|
||||||
return t->frac_secs + t->full_secs;
|
return t->frac_secs + t->full_secs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t srslte_timestamp_uint32(srslte_timestamp_t *t){
|
||||||
|
uint32_t x = t->full_secs*1e6 + (uint32_t) (t->frac_secs*1e6);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue