diff --git a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c index 72cc76984b8212cbf5bcf2ffc581bc48cb715144..ebc724aa5de5313ffdb26eaeab97047cc9642dcf 100644 --- a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c +++ b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c @@ -132,7 +132,37 @@ int trx_brf_end(openair0_device *device) { return 0; } -//int openair0_dev_init_bladerf(openair0_device *device, openair0_config_t *openair0_cfg) { + +int trx_brf_get_stats(openair0_device* device) { + + return(0); + +} + +int trx_brf_reset_stats(openair0_device* device) { + + return(0); + +} + +int trx_brf_stop(openair0_device* device) { + + return(0); + +} + +int trx_brf_set_freq(openair0_device* device) { + + return(0); + +} +int trx_brf_set_gains(openair0_device* device) { + + return(0); + +} + + int openair0_device_init(openair0_device *device, openair0_config_t *openair0_cfg) { int status; @@ -141,10 +171,12 @@ int openair0_device_init(openair0_device *device, openair0_config_t *openair0_cf brf_state_t *brf = (brf_state_t*)malloc(sizeof(brf_state_t)); memset(brf, 0, sizeof(brf_state_t)); // init required params for BRF - brf->num_buffers = 128; - brf->buffer_size = (unsigned int)openair0_cfg[card].samples_per_packet*sizeof(int32_t); // buffer size = 4096 for sample_len of 1024 - brf->num_transfers = 16; - brf->timeout_ms = 0; + //brf->dev_model = ; + + brf->num_buffers = 128; + brf->buffer_size = (unsigned int)openair0_cfg[card].samples_per_packet*sizeof(int32_t); // buffer size = 4096 for sample_len of 1024 + brf->num_transfers = 16; + brf->timeout_ms = 0; brf->sample_rate=(unsigned int)openair0_cfg[card].sample_rate; printf("\n[BRF] sampling_rate %d, num_buffers %d, buffer_size %d, num transfer %d, timeout_ms %d\n", @@ -258,6 +290,11 @@ int openair0_device_init(openair0_device *device, openair0_config_t *openair0_cf device->trx_end_func = trx_brf_end; device->trx_read_func = trx_brf_read; device->trx_write_func = trx_brf_write; + device->trx_get_stats_func = trx_brf_get_stats; + device->trx_reset_stats_func = trx_brf_reset_stats; + device->trx_stop_func = trx_brf_stop; + device->trx_set_freq_func = trx_brf_set_freq; + device->trx_set_gains_func = trx_brf_set_gains; memcpy((void*)&device->openair0_cfg,(void*)openair0_cfg,sizeof(openair0_config_t)); return 0; @@ -269,26 +306,7 @@ int brf_error(int status) { //return 1; // or status error code } -int openair0_stop(int card) { - - return(0); - -} - -int openair0_print_stats(openair0_device* device) { - return(0); - -} -int openair0_reset_stats(openair0_device* device) { - - return(0); - -} -int openair0_set_frequencies(openair0_device* device, openair0_config_t *openair0_cfg,int dummy) { - return 0; - -} int openair0_set_rx_frequencies(openair0_device* device, openair0_config_t *openair0_cfg) { return 0; } diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h index 0e31dc9f3b4f932c69a72dc02a873ad0fd50c445..b5417290763a7b068743de71c719c2c66fc4012e 100644 --- a/targets/ARCH/COMMON/common_lib.h +++ b/targets/ARCH/COMMON/common_lib.h @@ -40,9 +40,12 @@ #ifndef COMMON_LIB_H #define COMMON_LIB_H #include <stdint.h> +#include <sys/types.h> typedef int64_t openair0_timestamp; typedef volatile int64_t openair0_vtimestamp; + + typedef struct openair0_device_t openair0_device; /* structrue holds the parameters to configure USRP devices */ @@ -78,7 +81,7 @@ typedef struct { //! number of samples per RX/TX packet (USRP + Ethernet) int samples_per_packet; // delay in sending samples (write) due to hardware access, softmodem processing and fronthaul delay if exist - int tx_delay; + int tx_delay; //! adjust the position of the samples after delay when sending unsigned int tx_forward_nsamps; //! number of RX channels (=RX antennas) @@ -144,10 +147,13 @@ typedef enum { } dev_type_t; + /*!\brief type */ typedef enum { MIN_FUNC_TYPE = 0, + /*!\brief device functions within a BBU */ BBU_FUNC, + /*!\brief device functions within a RRH */ RRH_FUNC, MAX_FUNC_TYPE @@ -156,13 +162,13 @@ typedef enum { struct openair0_device_t { /* Module ID of this device */ int Mod_id; - - /* Type of this device */ - func_type_t func_type; /* Type of this device */ dev_type_t type; + /* Type of the device's host (BBU/RRH) */ + func_type_t func_type; + /* RF frontend parameters set by application */ openair0_config_t openair0_cfg; @@ -174,14 +180,11 @@ struct openair0_device_t { /* Called to start the transceiver. Return 0 if OK, < 0 if error */ int (*trx_start_func)(openair0_device *device); - /* Called to initiate transceiver threads */ - void (*trx_thread_func)(openair0_device *device, unsigned int rt_period, uint8_t RT_flag,uint8_t NRT_flag); - - /* Called to request connection from the transceiver/RRH. Return 0 if OK, < 0 if error */ - int (*trx_request_func)(openair0_device *device); + /* Called to send a request message between BBU-RRH */ + int (*trx_request_func)(openair0_device *device, void *msg, ssize_t msg_len); - /* Called to reply back to connection state to eNB/BBU. Return 0 if OK, < 0 if error */ - int (*trx_reply_func)(openair0_device *openair0); + /* Called to send a reply message between BBU-RRH */ + int (*trx_reply_func)(openair0_device *openair0, void *msg, ssize_t msg_len); /* Write 'nsamps' samples on each channel from buffers. buff[0] is the array for * the first channel. timestamp if the time (in samples) at which the first sample @@ -216,6 +219,23 @@ struct openair0_device_t { /* Terminate operation of the transceiver -- free all associated resources */ void (*trx_end_func)(openair0_device *device); + + /* Terminate operation */ + int (*trx_stop_func)(int card); + + /* Functions API related to UE*/ + + /*! \brief Set RX feaquencies + * \param + * \returns 0 in success + */ + int (*trx_set_freq_func)(openair0_device* device, openair0_config_t *openair0_cfg,int exmimo_dump_config); + /*! \brief Set gains + * \param + * \returns 0 in success + */ + int (*trx_set_gains_func)(openair0_device* device, openair0_config_t *openair0_cfg); + }; @@ -225,31 +245,19 @@ extern "C" #endif /* return 0 if OK */ - int openair0_device_init(openair0_device* device, openair0_config_t *openair0_cfg); -openair0_timestamp get_usrp_time(openair0_device *device); - -//EXMIMO -//int openair0_dev_init_exmimo(openair0_device *device, openair0_config_t *openair0_cfg); -//USPRP -//int openair0_dev_init_usrp(openair0_device* device, openair0_config_t *openair0_cfg); -//BLADERF -//int openair0_dev_init_bladerf(openair0_device* device, openair0_config_t *openair0_cfg); + //int openair0_stop(int card); //ETHERNET int openair0_dev_init_eth(openair0_device *device, openair0_config_t *openair0_cfg); + //int openair0_stop_eth(int card); + //int openair0_set_gains_eth(openair0_device* device, openair0_config_t *openair0_cfg); + //int openair0_set_frequencies_eth(openair0_device* device, openair0_config_t *openair0_cfg,int exmimo_dump_config); -int openair0_set_frequencies(openair0_device* device, openair0_config_t *openair0_cfg,int exmimo_dump_config); - +//USPRP +openair0_timestamp get_usrp_time(openair0_device *device); int openair0_set_rx_frequencies(openair0_device* device, openair0_config_t *openair0_cfg); -int openair0_set_gains(openair0_device* device, openair0_config_t *openair0_cfg); - -int openair0_print_stats(openair0_device* device); - -int openair0_reset_stats(openair0_device* device); - -int openair0_stop(int card); #ifdef __cplusplus } diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c index 1b91050b9d5a07116822d3a31e23c8530104609e..2e90e5227462321feaebe91010cd75c760c0f65e 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -52,12 +52,8 @@ #include "common_lib.h" #include "ethernet_lib.h" -#define DEFAULT_IF "eth0" -#define BUF_SIZ 8960 /*Jumbo frame size*/ -#define MAX_INST 4 -//int sockfd[MAX_INST]; -int num_devices = 0; +int num_devices_eth = 0; int dest_addr_len[MAX_INST]; char sendbuf[MAX_INST][BUF_SIZ]; /*TODO*/ @@ -69,7 +65,7 @@ int ethernet_socket_init(openair0_device *device) { eth_state_t *eth = (eth_state_t*)device->priv; int Mod_id = device->Mod_id; -// struct sockaddr_in *dest = &dest_addr[Mod_id]; + // struct sockaddr_in *dest = &dest_addr[Mod_id]; char str[INET_ADDRSTRLEN]; const char *dest_ip; int dest_port; @@ -156,7 +152,7 @@ void ethernet_socket_opt (openair0_device *device){ } -int trx_eth_request(openair0_device *device) { +int trx_eth_set_dev_conf(openair0_device *device) { int Mod_id = device->Mod_id; eth_state_t *eth = (eth_state_t*)device->priv; @@ -191,7 +187,7 @@ int trx_eth_request(openair0_device *device) { -int trx_eth_reply(openair0_device *device) { +int trx_eth_get_dev_conf(openair0_device *device) { eth_state_t *eth = (eth_state_t*)device->priv; int Mod_id = device->Mod_id; @@ -218,9 +214,44 @@ int trx_eth_reply(openair0_device *device) { device->openair0_cfg.remote_port =ntohs(eth->dest_addr[Mod_id].sin_port); device->openair0_cfg.remote_ip=str; //ethernet_socket_opt (device); - printf("[RRH] write mod_%d %d to %s:%d\n",Mod_id,eth->sockfd[Mod_id],str,ntohs(eth->dest_addr[Mod_id].sin_port)); + // printf("[RRH] write mod_%d %d to %s:%d\n",Mod_id,eth->sockfd[Mod_id],str,ntohs(eth->dest_addr[Mod_id].sin_port)); - return 1; + return 0; +} + +int trx_eth_request(openair0_device *device, void *msg, ssize_t msg_len) { + + int Mod_id = device->Mod_id; + eth_state_t *eth = (eth_state_t*)device->priv; + + if (sendto(eth->sockfd[Mod_id],msg,msg_len,0,(struct sockaddr *)ð->dest_addr[Mod_id],dest_addr_len[Mod_id])==-1){ + perror("ETHERNET: "); + exit(0); + } + + return 0; +} + + + +int trx_eth_reply(openair0_device *device, void *msg, ssize_t msg_len) { + + eth_state_t *eth = (eth_state_t*)device->priv; + int Mod_id = device->Mod_id; + + /* receive from client (lte-softmodem) */ + if (recvfrom(eth->sockfd[Mod_id], + msg, + msg_len, + 0, + (struct sockaddr *)ð->dest_addr[Mod_id], + (socklen_t *)&dest_addr_len[Mod_id])==-1){ + perror("ETHERNET: "); + exit(0); + } + + + return 0; } @@ -240,17 +271,14 @@ int ethernet_write_data(openair0_device *device, openair0_timestamp timestamp, v /* we don't want to ovewrite with the header info the previous tx buffer data so we store it*/ int32_t temp0 = *(int32_t *)buff2; openair0_timestamp temp1 = *(openair0_timestamp *)(buff2 + sizeof(int32_t)); - //printf("temp0=%d temp=%d\n",temp0,temp1); - //char str[INET_ADDRSTRLEN]; n_written = 0; *(int16_t *)(buff2 + sizeof(int16_t))=1+(antenna_id<<1); *(openair0_timestamp *)(buff2 + sizeof(int32_t)) = timestamp; - //inet_ntop(AF_INET, &(eth->dest_addr[Mod_id].sin_addr), str, INET_ADDRSTRLEN); - //printf("[RRH]write mod_%d %d to %s:%d, len %d, buff %p antenna %d\n", - //Mod_id,eth->sockfd[Mod_id],str,ntohs(eth->dest_addr[Mod_id].sin_port),(nsamps<<2)+header_size, buff2, antenna_id); + /* printf("[RRH]write mod_%d %d , len %d, buff %p antenna %d\n", + Mod_id,eth->sockfd[Mod_id],(nsamps<<2)+header_size, buff2, antenna_id);*/ while(n_written < nsamps) { /* Send packet */ @@ -273,7 +301,6 @@ while(n_written < nsamps) { /* tx buffer values restored */ *(int32_t *)buff2 = temp0; *(openair0_timestamp *)(buff2 + sizeof(int32_t)) = temp1; - //printf("-----------------temp0=%d temp=%d\n",*(int32_t *)buff2,*(openair0_timestamp *)(buff2 + sizeof(int32_t))); return n_written; } @@ -284,7 +311,6 @@ int ethernet_read_data(openair0_device *device,openair0_timestamp *timestamp,voi int bytes_received; int block_cnt; int ret; - char str[INET_ADDRSTRLEN]; uint16_t header_size=sizeof(int32_t) + sizeof(openair0_timestamp); @@ -299,15 +325,13 @@ int ethernet_read_data(openair0_device *device,openair0_timestamp *timestamp,voi eth_state_t *eth = (eth_state_t*)device->priv; int Mod_id = device->Mod_id; - inet_ntop(AF_INET, &(eth->dest_addr[Mod_id].sin_addr), str, INET_ADDRSTRLEN); - // send command RX for nsamps samples - // printf("requesting %d samples from (%s:%d)\n",nsamps,str,ntohs(eth->dest_addr[Mod_id].sin_port)); - bytes_received=0; block_cnt=0; + /* printf("[RRH] read mod_%d %d,len %d, buff %p antenna %d\n", + Mod_id,eth->sockfd[Mod_id],(nsamps<<2)+header_size, buff2, antenna_id);*/ + while(bytes_received < (int)((nsamps<<2))) { - //printf("requesting %d bytes\n",(nsamps<<2)); ret=recvfrom(eth->sockfd[Mod_id], buff2+bytes_received, (nsamps<<2)+header_size-bytes_received, @@ -315,7 +339,6 @@ int ethernet_read_data(openair0_device *device,openair0_timestamp *timestamp,voi (struct sockaddr *)ð->dest_addr[Mod_id], (socklen_t *)&dest_addr_len[Mod_id]); - //printf("bytes_received %d (ret %d)\n",bytes_received+ret,ret); if (ret==-1) { if (errno == EAGAIN) { perror("ETHERNET READ: "); @@ -349,8 +372,18 @@ int ethernet_read_data(openair0_device *device,openair0_timestamp *timestamp,voi } int trx_eth_start(openair0_device *device){ - - return ethernet_socket_init(device); + + if (ethernet_socket_init(device)!=0) { + return -1; + } + + if (device->func_type == BBU_FUNC ) { + return trx_eth_set_dev_conf(device); + } + else{ + return trx_eth_get_dev_conf(device); + } + return(0); } int trx_eth_write(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int antenna_id, int flags) { @@ -364,26 +397,45 @@ int trx_eth_read(openair0_device *device, openair0_timestamp *ptimestamp, void * } -int openair0_stop(int card) { +int trx_eth_stop(int card) { + return(0); +} +int trx_eth_set_freq(openair0_device* device, openair0_config_t *openair0_cfg,int exmimo_dump_config) { return(0); +} +int trx_eth_set_gains(openair0_device* device, openair0_config_t *openair0_cfg) { + return(0); } -int openair0_print_stats(openair0_device* device) { + +int trx_eth_get_stats(openair0_device* device) { return(0); } -int openair0_reset_stats(openair0_device* device) { + +int trx_eth_reset_stats(openair0_device* device) { return(0); } + + + void trx_eth_end(openair0_device *device) { - // close all the sockets - + eth_state_t *eth = (eth_state_t*)device->priv; + int Mod_id = device->Mod_id; + /*destroys socket only for the processes that call the eth_end fuction-- shutdown() for beaking the pipe */ + if ( close(eth->sockfd[Mod_id]) <0 ) { + perror("ETHERNET: Failed to close socket"); + exit(0); + }else { + printf("[RRH] socket for mod_id %d has been successfully closed.",Mod_id); + } + } @@ -392,24 +444,24 @@ int openair0_dev_init_eth(openair0_device *device, openair0_config_t *openair0_c eth_state_t *eth = (eth_state_t*)malloc(sizeof(eth_state_t)); int card = 0; memset(eth, 0, sizeof(eth_state_t)); - eth->buffer_size = (unsigned int)openair0_cfg[card].samples_per_packet*sizeof(int32_t); // buffer size = 4096 for sample_len of 1024 + eth->buffer_size = (unsigned int)openair0_cfg[card].samples_per_packet*sizeof(int32_t); // buffer size = 4096 for sample_len of 1024 eth->sample_rate = (unsigned int)openair0_cfg[card].sample_rate; device->priv = eth; printf("ETHERNET: Initializing openair0_device for %s ...\n", ((device->func_type == BBU_FUNC) ? "BBU": "RRH")); - device->Mod_id = num_devices++; + device->Mod_id = num_devices_eth++; device->trx_start_func = trx_eth_start; device->trx_request_func = trx_eth_request; device->trx_reply_func = trx_eth_reply; - device->trx_end_func = trx_eth_end; - device->trx_read_func = trx_eth_read; device->trx_write_func = trx_eth_write; + device->trx_read_func = trx_eth_read; + device->trx_get_stats_func = trx_eth_get_stats; + device->trx_reset_stats_func = trx_eth_reset_stats; + device->trx_end_func = trx_eth_end; + device->trx_stop_func = trx_eth_stop; + device->trx_set_freq_func = trx_eth_set_freq; + device->trx_set_gains_func = trx_eth_set_gains; memcpy((void*)&device->openair0_cfg,(void*)openair0_cfg,sizeof(openair0_config_t)); - - /* if (ethernet_socket_init(device)!=0){ - return -1; - }*/ - return 0; } diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h index 727f06738af6a5c37f3a94d17fb3b735b66f7474..8914ff580945431d35396e667debf52c11b92722 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h @@ -47,6 +47,9 @@ #include <net/if.h> #include <netinet/ether.h> +#define MAX_INST 4 +#define DEFAULT_IF "eth0" +#define BUF_SIZ 8960 /*Jumbo frame size*/ typedef struct { @@ -54,9 +57,8 @@ typedef struct { //struct eth_if *dev; // An empty ("") or NULL device identifier will result in the first encountered device being opened (using the first discovered backend) - int sockfd[4]; - struct sockaddr_in dest_addr[4]; - + int sockfd[MAX_INST]; + struct sockaddr_in dest_addr[MAX_INST]; unsigned int buffer_size; unsigned int timeout_ns; @@ -102,12 +104,12 @@ struct eth_meta_data{ typedef struct { - /* packet's timestamp */ + /* packet's timestamp */ openair0_timestamp timestamp; /* variable declared for alignment purposes (sample size=32 bit) */ - int16_t not_used; + int16_t not_used; /* antenna port used to resynchronize*/ - int16_t antenna_id; + int16_t antenna_id; } header_t; diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c index 6c8f4f16f92df91b812cdae3399a2f0b17aa7153..01eca4bf6abb28e16acd3344eb911748db4bea49 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c @@ -247,7 +247,6 @@ int openair0_stop_without_reset(int card) #define MY_RF_MODE (RXEN + TXEN + TXLPFNORM + TXLPFEN + TXLPF25 + RXLPFNORM + RXLPFEN + RXLPF25 + LNA1ON +LNAMax + RFBBNORM + DMAMODE_RX + DMAMODE_TX) #define RF_MODE_BASE (LNA1ON + RFBBNORM) -//int openair0_dev_init_exmimo(openair0_device *device, openair0_config_t *openair0_cfg) { int openair0_device_init(openair0_device *device, openair0_config_t *openair0_cfg) { // Initialize card @@ -483,6 +482,10 @@ int openair0_set_frequencies(openair0_device* device, openair0_config_t *openair } +int openair0_set_gains(openair0_device* device, openair0_config_t *openair0_cfg){ + return(0); +} + unsigned int *openair0_daq_cnt(void) { return((unsigned int *)openair0_exmimo_pci[0].rxcnt_ptr[0]); diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index 2ad4de988934ae0cf932626a2dd7616e1659f1de..3a1782b8a03fdd88d3630a57d686a0a5d33601aa 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -56,7 +56,7 @@ typedef struct // -------------------------------- uhd::usrp::multi_usrp::sptr usrp; //uhd::usrp::multi_usrp::sptr rx_usrp; - + //create a send streamer and a receive streamer uhd::tx_streamer::sptr tx_stream; uhd::rx_streamer::sptr rx_stream; @@ -123,6 +123,7 @@ static void trx_usrp_end(openair0_device *device) s->tx_stream->send("", 0, s->tx_md); s->tx_md.end_of_burst = false; } + static int trx_usrp_write(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) { usrp_state_t *s = (usrp_state_t*)device->priv; @@ -199,7 +200,7 @@ static bool is_equal(double a, double b) return std::fabs(a-b) < std::numeric_limits<double>::epsilon(); } -int openair0_set_frequencies(openair0_device* device, openair0_config_t *openair0_cfg, int dummy) { +int trx_usrp_set_freq(openair0_device* device, openair0_config_t *openair0_cfg, int dummy) { usrp_state_t *s = (usrp_state_t*)device->priv; @@ -227,7 +228,7 @@ int openair0_set_rx_frequencies(openair0_device* device, openair0_config_t *open } -int openair0_set_gains(openair0_device* device, +int trx_usrp_set_gains(openair0_device* device, openair0_config_t *openair0_cfg) { usrp_state_t *s = (usrp_state_t*)device->priv; @@ -247,11 +248,11 @@ int openair0_set_gains(openair0_device* device, return(0); } -int openair0_stop(int card) { +int trx_usrp_stop(int card) { return(0); - } + rx_gain_calib_table_t calib_table[] = { {3500000000.0,46.0}, {2660000000.0,53.0}, @@ -279,17 +280,18 @@ void set_rx_gain_offset(openair0_config_t *openair0_cfg, int chain_index) { } -int openair0_print_stats(openair0_device* device) { + +int trx_usrp_get_stats(openair0_device* device) { return(0); } -int openair0_reset_stats(openair0_device* device) { +int trx_usrp_reset_stats(openair0_device* device) { return(0); } -//int openair0_dev_init_usrp(openair0_device* device, openair0_config_t *openair0_cfg) + int openair0_device_init(openair0_device* device, openair0_config_t *openair0_cfg) { @@ -438,9 +440,14 @@ int openair0_device_init(openair0_device* device, openair0_config_t *openair0_cf device->priv = s; device->trx_start_func = trx_usrp_start; - device->trx_end_func = trx_usrp_end; - device->trx_read_func = trx_usrp_read; device->trx_write_func = trx_usrp_write; + device->trx_read_func = trx_usrp_read; + device->trx_get_stats_func = trx_usrp_get_stats; + device->trx_reset_stats_func = trx_usrp_reset_stats; + device->trx_end_func = trx_usrp_end; + device->trx_stop_func = trx_usrp_stop; + device->trx_set_freq_func = trx_usrp_set_freq; + device->trx_set_gains_func = trx_usrp_set_gains; s->sample_rate = openair0_cfg[0].sample_rate; // TODO: diff --git a/targets/RT/USER/UE_transport_IQ.c b/targets/RT/USER/UE_transport_IQ.c index 74623e1ba81b88ed442909264c44477f36f055e4..f88e22dbfa1fb5f87604f48e238130ad74c5045f 100644 --- a/targets/RT/USER/UE_transport_IQ.c +++ b/targets/RT/USER/UE_transport_IQ.c @@ -273,7 +273,7 @@ void *rrh_UE_thread(void *arg) { while (rrh_exit==0) { - cmd=dev->eth_dev.trx_reply_func(&dev->eth_dev); + cmd=dev->eth_dev.trx_start_func(&dev->eth_dev); /* allocate memory for TX/RX buffers */ rx_buffer_UE = (int32_t**)malloc16(dev->eth_dev.openair0_cfg.rx_num_channels*sizeof(int32_t*)); diff --git a/targets/RT/USER/eNB_transport_IQ.c b/targets/RT/USER/eNB_transport_IQ.c index 19b03f76928aa6b5183a235f1372d53727c6c4d2..43981257ec9f79b8b9d5c7d2e71420ca2161006d 100644 --- a/targets/RT/USER/eNB_transport_IQ.c +++ b/targets/RT/USER/eNB_transport_IQ.c @@ -51,8 +51,6 @@ #include "rrh_gw_externs.h" #include "rt_wrapper.h" -#define RRH_eNB_PORT 50000 -#define RRH_eNB_DEST_IP "192.168.12.31" #define PRINTF_PERIOD 3750 #define HEADER_SIZE ((sizeof(int32_t) + sizeof(openair0_timestamp))>>2) //#undef LOWLATENCY @@ -64,29 +62,30 @@ void *rrh_eNB_tx_thread(void *); void *rrh_proc_eNB_thread(void *); void *rrh_eNB_thread(void *); void set_rt_period( openair0_config_t openair0_cfg); -void print_dev_config(openair0_device device); +void check_dev_config( rrh_module_t *mod_enb); -openair0_timestamp timestamp_eNB_tx[4]= {0,0,0,0},timestamp_eNB_rx[4]= {0,0,0,0}; -openair0_timestamp nrt_eNB_counter[4]= {0,0,0,0}; pthread_t main_rrh_eNB_thread; pthread_attr_t attr, attr_proc; struct sched_param sched_param_rrh; -pthread_cond_t sync_eNB_cond[4]; -pthread_mutex_t sync_eNB_mutex[4]; +pthread_cond_t sync_eNB_cond[4]; +pthread_mutex_t sync_eNB_mutex[4]; +openair0_timestamp nrt_eNB_counter[4]= {0,0,0,0}; int32_t overflow_rx_buffer_eNB[4]= {0,0,0,0}; int32_t nsamps_eNB[4]= {0,0,0,0}; int32_t eNB_tx_started=0,eNB_rx_started=0; int32_t counter_eNB_rx[4]= {0,0,0,0}; int32_t counter_eNB_tx[4]= {0,0,0,0}; + uint8_t RT_flag_eNB,NRT_flag_eNB; int32_t **tx_buffer_eNB, **rx_buffer_eNB; - void *rrh_eNB_thread_status; -void *rx_eNB[2]; //to be fixed -void *tx_eNB[2]; //to be fixed -int sync_eNB_rx[4]= {-1,-1,-1,-1}; +void **rx_eNB; //was fixed to 2 ant +void **tx_eNB; //was fixed to 2 ant + +int sync_eNB_rx[4]= {-1,-1,-1,-1}; +openair0_timestamp timestamp_eNB_tx[4]= {0,0,0,0},timestamp_eNB_rx[4]= {0,0,0,0}; unsigned int rx_pos=0, next_rx_pos=0; unsigned int tx_pos=0, prev_tx_pos=0; @@ -100,30 +99,117 @@ unsigned int tx_pos=0, prev_tx_pos=0; * \note * @ingroup _oai */ -void create_eNB_trx_threads( rrh_module_t *dev_enb, uint8_t RT_flag, uint8_t NRT_flag){ - +void create_eNB_trx_threads( rrh_module_t *mod_enb, uint8_t RT_flag, uint8_t NRT_flag){ + //int i; - int error_code_eNB;//, error_code_proc_eNB; - + int error_code_eNB; + RT_flag_eNB=RT_flag; NRT_flag_eNB=NRT_flag; - + pthread_attr_init(&attr); sched_param_rrh.sched_priority = sched_get_priority_max(SCHED_FIFO); pthread_attr_setschedparam(&attr,&sched_param_rrh); pthread_attr_setschedpolicy(&attr,SCHED_FIFO); -/* - for (i=0; i<4; i++) { - pthread_mutex_init(&sync_eNB_mutex[i],NULL); - pthread_cond_init(&sync_eNB_cond[i],NULL); - }*/ - - error_code_eNB = pthread_create(&main_rrh_eNB_thread, &attr, rrh_eNB_thread, (void *)dev_enb); + /*for (i=0; i<4; i++) { + pthread_mutex_init(&sync_eNB_mutex[i],NULL); + pthread_cond_init(&sync_eNB_cond[i],NULL); + }*/ + + /* handshake with client to exchange parameters */ + mod_enb->eth_dev.trx_start_func(&mod_enb->eth_dev);//change port make it plus_id + + memcpy((void*)&mod_enb->devs->openair0_cfg,(void *)&mod_enb->eth_dev.openair0_cfg,sizeof(openair0_config_t)); + + /* update certain parameters */ + if ( mod_enb->devs->type == EXMIMO_IF ) { + if ( mod_enb->devs->openair0_cfg.num_rb_dl == 100 ) { + mod_enb->devs->openair0_cfg.samples_per_packet = 2048; + mod_enb->devs->openair0_cfg.tx_forward_nsamps = 175; + mod_enb->devs->openair0_cfg.tx_delay = 8; + } + else if( mod_enb->devs->openair0_cfg.num_rb_dl == 50 ){ + mod_enb->devs->openair0_cfg.samples_per_packet = 2048; + mod_enb->devs->openair0_cfg.tx_forward_nsamps = 95; + mod_enb->devs->openair0_cfg.tx_delay = 5; + } + else if( mod_enb->devs->openair0_cfg.num_rb_dl == 25 ){ + mod_enb->devs->openair0_cfg.samples_per_packet = 1024; + mod_enb->devs->openair0_cfg.tx_forward_nsamps = 70; + mod_enb->devs->openair0_cfg.tx_delay = 6; + } + else if( mod_enb->devs->openair0_cfg.num_rb_dl == 6 ){ + mod_enb->devs->openair0_cfg.samples_per_packet = 256; + mod_enb->devs->openair0_cfg.tx_forward_nsamps = 40; + mod_enb->devs->openair0_cfg.tx_delay = 8; + } + } + else if (mod_enb->devs->type == USRP_IF) { + if ( mod_enb->devs->openair0_cfg.num_rb_dl == 100 ) { + mod_enb->devs->openair0_cfg.samples_per_packet = 2048; + mod_enb->devs->openair0_cfg.tx_forward_nsamps = 175; + mod_enb->devs->openair0_cfg.tx_delay = 8; + } + else if( mod_enb->devs->openair0_cfg.num_rb_dl == 50 ) { + mod_enb->devs->openair0_cfg.samples_per_packet = 2048; + mod_enb->devs->openair0_cfg.tx_forward_nsamps = 95; + mod_enb->devs->openair0_cfg.tx_delay = 5; + } + else if( mod_enb->devs->openair0_cfg.num_rb_dl == 25 ) { + mod_enb->devs->openair0_cfg.samples_per_packet = 1024; + mod_enb->devs->openair0_cfg.tx_forward_nsamps = 70; + mod_enb->devs->openair0_cfg.tx_delay = 6; + } + else if( mod_enb->devs->openair0_cfg.num_rb_dl == 6 ) { + mod_enb->devs->openair0_cfg.samples_per_packet = 256; + mod_enb->devs->openair0_cfg.tx_forward_nsamps = 40; + mod_enb->devs->openair0_cfg.tx_delay = 8; + } + } + else if (mod_enb->devs->type == BLADERF_IF) { + if ( mod_enb->devs->openair0_cfg.num_rb_dl == 100 ) { + mod_enb->devs->openair0_cfg.samples_per_packet = 2048; + mod_enb->devs->openair0_cfg.tx_forward_nsamps = 175; + mod_enb->devs->openair0_cfg.tx_delay = 8; + } + else if( mod_enb->devs->openair0_cfg.num_rb_dl == 50 ){ + mod_enb->devs->openair0_cfg.samples_per_packet = 2048; + mod_enb->devs->openair0_cfg.tx_forward_nsamps = 95; + mod_enb->devs->openair0_cfg.tx_delay = 5; + } + else if( mod_enb->devs->openair0_cfg.num_rb_dl == 25 ){ + mod_enb->devs->openair0_cfg.samples_per_packet = 1024; + mod_enb->devs->openair0_cfg.tx_forward_nsamps = 70; + mod_enb->devs->openair0_cfg.tx_delay = 6; + } + else if( mod_enb->devs->openair0_cfg.num_rb_dl == 6 ){ + mod_enb->devs->openair0_cfg.samples_per_packet = 256; + mod_enb->devs->openair0_cfg.tx_forward_nsamps = 40; + mod_enb->devs->openair0_cfg.tx_delay = 8; + } + } + + /* check sanity of received configuration parameters and print */ + check_dev_config(mod_enb); + +#ifndef ETHERNET + /* initialize and apply configuration to associated RF device */ + if (openair0_device_init(mod_enb->devs, &mod_enb->devs->openair0_cfg)<0){ + LOG_E(RRH,"Exiting, cannot initialize RF device.\n"); + exit(-1); + } + else { + LOG_I(RRH,"RF device has been successfully initialized.\n"); + } + +#endif + + error_code_eNB = pthread_create(&main_rrh_eNB_thread, &attr, rrh_eNB_thread, (void *)mod_enb); if (error_code_eNB) { - printf("Error while creating eNB thread\n"); + LOG_E(RRH,"Error while creating eNB thread\n"); exit(-1); } - + } /*! \fn void *rrh_eNB_thread(void *arg) @@ -139,62 +225,69 @@ void *rrh_eNB_thread(void *arg) rrh_module_t *dev=(rrh_module_t *)arg; pthread_t eNB_rx_thread, eNB_tx_thread; int error_code_eNB_rx, error_code_eNB_tx; - int16_t i,j; + int32_t i,j; void *tmp; unsigned int samples_per_frame=0; - + while (rrh_exit==0) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_TRX, 1 ); - - /* handshake with client to exchange parameters */ - dev->eth_dev.trx_reply_func(&dev->eth_dev);//change port make it plus_id - /* prints received configuration parameters */ - print_dev_config(dev->eth_dev); - set_rt_period(dev->eth_dev.openair0_cfg); - samples_per_frame = dev->eth_dev.openair0_cfg.samples_per_frame; + + + if (dev->devs->type != NONE_IF) { + set_rt_period(dev->eth_dev.openair0_cfg); + } + samples_per_frame = dev->eth_dev.openair0_cfg.samples_per_frame; /* allocate memory for TX/RX buffers each antenna port has a TX and a RX buffer - each TX and RX buffer is of (samples_per_frame + HEADER_SIZE) samples(int32_t) */ + each TX and RX buffer is of (samples_per_frame + HEADER_SIZE) samples (size of samples is 4 bytes) */ rx_buffer_eNB = (int32_t**)malloc16(dev->eth_dev.openair0_cfg.rx_num_channels*sizeof(int32_t*)); tx_buffer_eNB = (int32_t**)malloc16(dev->eth_dev.openair0_cfg.tx_num_channels*sizeof(int32_t*)); - LOG_D(RRH,"rx ch %d %p and tx ch %d %p\n", + LOG_I(RRH,"rx ch %d %p and tx ch %d %p\n", dev->eth_dev.openair0_cfg.rx_num_channels, rx_buffer_eNB, dev->eth_dev.openair0_cfg.tx_num_channels, tx_buffer_eNB); + /* rx_buffer_eNB points to the beginning of data */ for (i=0; i<dev->eth_dev.openair0_cfg.rx_num_channels; i++) { tmp=(void *)malloc(sizeof(int32_t)*(samples_per_frame + HEADER_SIZE)); memset(tmp,0,sizeof(int32_t)*(samples_per_frame + HEADER_SIZE)); rx_buffer_eNB[i]=( tmp + (HEADER_SIZE*sizeof(int32_t)) ); - LOG_D(RRH," rx ch %d %p |%p header=%d size=%d sample=%d spf=%d\n", - i, - rx_buffer_eNB[i],tmp,HEADER_SIZE,(sizeof(int32_t)*(samples_per_frame + HEADER_SIZE)),sizeof(int32_t),samples_per_frame); + LOG_I(RRH," rx ch %d %p |%p\n",i,rx_buffer_eNB[i],tmp); } /* tx_buffer_eNB points to the beginning of data */ for (i=0; i<dev->eth_dev.openair0_cfg.tx_num_channels; i++) { tmp=(void *)malloc(sizeof(int32_t)*(samples_per_frame + HEADER_SIZE)); memset(tmp,0,sizeof(int32_t)*(samples_per_frame + HEADER_SIZE)); tx_buffer_eNB[i]=( tmp + (HEADER_SIZE*sizeof(int32_t)) ); - LOG_D(RRH," tx ch %d %p| %p \n", i,tx_buffer_eNB[i],tmp); + LOG_I(RRH," tx ch %d %p| %p \n", i,tx_buffer_eNB[i],tmp); } /* dummy initialization for TX/RX buffers */ - for (i=0; i<dev->eth_dev.openair0_cfg.tx_num_channels; i++) { + for (i=0; i<dev->eth_dev.openair0_cfg.rx_num_channels; i++) { for (j=0; j<samples_per_frame; j++) { rx_buffer_eNB[i][j]=32+i; - tx_buffer_eNB[i][j]=13+i; } } - + /* dummy initialization for TX/RX buffers */ + for (i=0; i<dev->eth_dev.openair0_cfg.tx_num_channels; i++) { + for (j=0; j<samples_per_frame; j++) { + tx_buffer_eNB[i][j]=12+i; + } + } + + /* allocate TX/RX buffers pointers used in write/read operations */ + rx_eNB = (void**)malloc16(dev->eth_dev.openair0_cfg.rx_num_channels*sizeof(int32_t*)); + tx_eNB = (void**)malloc16(dev->eth_dev.openair0_cfg.tx_num_channels*sizeof(int32_t*)); + #ifdef LOWLATENCY error_code_eNB_rx = pthread_create(&eNB_rx_thread, NULL, rrh_eNB_rx_thread, (void *)dev); error_code_eNB_tx = pthread_create(&eNB_tx_thread, NULL, rrh_eNB_tx_thread, (void *)dev); - LOG_D(RRH,"[eNB][SCHED] deadline scheduling applied to TX/RX threads\n"); + LOG_I(RRH,"[eNB][SCHED] deadline scheduling applied to eNB TX/RX threads\n"); #else pthread_attr_t attr_eNB_rx, attr_eNB_tx; struct sched_param sched_param_eNB_rx, sched_param_eNB_tx; @@ -209,7 +302,7 @@ void *rrh_eNB_thread(void *arg) error_code_eNB_rx = pthread_create(&eNB_rx_thread, &attr_eNB_rx, rrh_eNB_rx_thread, (void *)dev); error_code_eNB_tx = pthread_create(&eNB_tx_thread, &attr_eNB_tx, rrh_eNB_tx_thread, (void *)dev); - LOG_D(RRH,"[eNB][SCHED] FIFO scheduling applied to TX/RX threads\n"); + LOG_I(RRH,"[eNB][SCHED] FIFO scheduling applied to eNB TX/RX threads\n"); #endif if (error_code_eNB_rx) { @@ -253,7 +346,7 @@ void *rrh_eNB_rx_thread(void *arg){ rrh_module_t *dev = (rrh_module_t *)arg; ssize_t bytes_sent; int i, spp ,pck_rx=0; - openair0_vtimestamp last_hw_counter=0; //volatile int64_t last_hw_counter=0;---> read + openair0_vtimestamp last_hw_counter=0; //volatile int64_t unsigned int samples_per_frame=0; uint8_t loopback=0,measurements=0; @@ -266,7 +359,6 @@ void *rrh_eNB_rx_thread(void *arg){ measurements = dev->measurements; next_rx_pos = spp; - LOG_I(RRH,"rt period is set to %d\n",rt_period); #ifdef LOWLATENCY struct sched_attr attr; unsigned int flags = 0; @@ -352,7 +444,7 @@ void *rrh_eNB_rx_thread(void *arg){ VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RX_TS, timestamp_eNB_rx[i]&0xffffffff ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); - //LOG_D(RRH,"rx_buffer_eNB[i][rx_pos]=%p ,rx_pos=%d, i=%d ts=%d\n",&rx_buffer_eNB[i][rx_pos],rx_pos,i,timestamp_eNB_rx[i]); + //LOG_D(RRH," rx_eNB[i]=%p rx_buffer_eNB[i][rx_pos]=%p ,rx_pos=%d, i=%d ts=%d\n",rx_eNB[i],&rx_buffer_eNB[i][rx_pos],rx_pos,i,timestamp_eNB_rx[i]); if ((bytes_sent = dev->eth_dev.trx_write_func (&dev->eth_dev, timestamp_eNB_rx[i], rx_eNB, @@ -382,7 +474,7 @@ void *rrh_eNB_rx_thread(void *arg){ min_rx_time = total_rx_time; if (total_rx_time > max_rx_time){ max_rx_time = total_rx_time; - LOG_D(RRH,"Max value %d update at rx_position %d \n",timestamp_eNB_rx[i], rx_pos); + LOG_I(RRH,"Max value %d update at rx_position %d \n",total_rx_time,timestamp_eNB_rx[i]); } average_rx_time = (long long unsigned int)((average_rx_time*trial)+total_rx_time)/(trial+1); } @@ -542,47 +634,74 @@ void *rrh_eNB_tx_thread(void *arg){ //needs to be fixed void set_rt_period( openair0_config_t openair0_cfg){ - AssertFatal(openair0_cfg.samples_per_frame > 0, "invalide samples per frame !%u\n",openair0_cfg.samples_per_frame); - AssertFatal(openair0_cfg.samples_per_packet > 0, "invalide samples per packets !%u\n",openair0_cfg.samples_per_packet); rt_period= (double)(openair0_cfg.samples_per_packet/(openair0_cfg.samples_per_frame/10.0)*1000000); - AssertFatal(rt_period > 0, "invalide rt period !%u\n", rt_period); - LOG_I(RRH,"Real time period is set to %d ns.\n",rt_period); - // set the calibration parameters for ETH later: check with RK - openair0_cfg.tx_delay=0; - openair0_cfg.tx_forward_nsamps=0; - - //only in case of NRT with emulated UE - create_timer_thread(); - // usleep(rt_period*1000); - + AssertFatal(rt_period > 0, "Invalid rt period !%u\n", rt_period); + //only in case of NRT with emulated UE + //create_timer_thread(); } -void print_dev_config(openair0_device device){ - - printf("\tMod_id=%d\n \tlog level=%d\n \tDL_RB=%d\n \tspf=%d\n \tsr=%f\n \tspp=%d\n \ttx_delay=%d\n \ttx_forwd_samps=%d\n \trx_ch=%d\n \ttx_ch=%d\n \trx_freq=%f\n \ttx_freq=%f\n \trxg_mode=%d\n \trx_gain=%f\n \ttx_gain=%f\n \trx_bw=%f\n \ttx_bw=%f\n \tautocal=%d\n \trem_addr %s:%d\n \tmy_addr %s:%d\n", - device.openair0_cfg.Mod_id, - device.openair0_cfg.log_level, - device.openair0_cfg.num_rb_dl, - device.openair0_cfg.samples_per_frame, - device.openair0_cfg.sample_rate, - device.openair0_cfg.samples_per_packet, - device.openair0_cfg.tx_delay, - device.openair0_cfg.tx_forward_nsamps, - device.openair0_cfg.rx_num_channels, - device.openair0_cfg.tx_num_channels, - device.openair0_cfg.rx_freq[0], - device.openair0_cfg.tx_freq[0], - device.openair0_cfg.rxg_mode[0], - device.openair0_cfg.rx_gain[0], - device.openair0_cfg.tx_gain[0], - device.openair0_cfg.rx_bw, - device.openair0_cfg.tx_bw, - device.openair0_cfg.autocal[0], - device.openair0_cfg.remote_ip, - device.openair0_cfg.remote_port, - device.openair0_cfg.my_ip, - device.openair0_cfg.my_port - ); - +void check_dev_config( rrh_module_t *mod_enb) { + + + AssertFatal( (mod_enb->devs->openair0_cfg.num_rb_dl==100 || mod_enb->devs->openair0_cfg.num_rb_dl==50 || mod_enb->devs->openair0_cfg.num_rb_dl==25 || mod_enb->devs->openair0_cfg.num_rb_dl==6) , "Invalid number of resource blocks! %d\n", mod_enb->devs->openair0_cfg.num_rb_dl); + AssertFatal( mod_enb->devs->openair0_cfg.samples_per_frame > 0 , "Invalid number of samples per frame! %d\n",mod_enb->devs->openair0_cfg.samples_per_frame); + AssertFatal( mod_enb->devs->openair0_cfg.sample_rate > 0.0, "Invalid sample rate! %f\n", mod_enb->devs->openair0_cfg.sample_rate); + AssertFatal( mod_enb->devs->openair0_cfg.samples_per_packet > 0 , "Invalid number of samples per packet! %d\n",mod_enb->devs->openair0_cfg.samples_per_packet); + AssertFatal( mod_enb->devs->openair0_cfg.rx_num_channels > 0 , "Invalid number of RX antennas! %d\n", mod_enb->devs->openair0_cfg.rx_num_channels); + AssertFatal( mod_enb->devs->openair0_cfg.tx_num_channels > 0 , "Invalid number of TX antennas! %d\n", mod_enb->devs->openair0_cfg.tx_num_channels); + AssertFatal( mod_enb->devs->openair0_cfg.rx_freq[0] > 0.0 ,"Invalid RX frequency! %f\n", mod_enb->devs->openair0_cfg.rx_freq[0]); + AssertFatal( mod_enb->devs->openair0_cfg.tx_freq[0] > 0.0 ,"Invalid TX frequency! %f\n", mod_enb->devs->openair0_cfg.tx_freq[0]); + AssertFatal( mod_enb->devs->openair0_cfg.rx_gain[0] > 0.0 ,"Invalid RX gain! %f\n", mod_enb->devs->openair0_cfg.rx_gain[0]); + AssertFatal( mod_enb->devs->openair0_cfg.tx_gain[0] > 0.0 ,"Invalid TX gain! %f\n", mod_enb->devs->openair0_cfg.tx_gain[0]); + AssertFatal( mod_enb->devs->openair0_cfg.rx_bw > 0.0 ,"Invalid RX bw! %f\n", mod_enb->devs->openair0_cfg.rx_bw); + AssertFatal( mod_enb->devs->openair0_cfg.tx_bw > 0.0 ,"Invalid RX bw! %f\n", mod_enb->devs->openair0_cfg.tx_bw); + // AssertFatal( mod_enb->devs->openair0_cfg.autocal[0] > 0 , "Invalid auto calibration choice! %d\n", mod_enb->devs->openair0_cfg.autocal[0]); + + printf("\n---------------------RF device configuration parameters---------------------\n"); + + printf("\tMod_id=%d\n \tlog level=%d\n \tDL_RB=%d\n \tsamples_per_frame=%d\n \tsample_rate=%f\n \tsamples_per_packet=%d\n \ttx_delay=%d\n \ttx_forward_nsamps=%d\n \trx_num_channels=%d\n \ttx_num_channels=%d\n \trx_freq_0=%f\n \ttx_freq_0=%f\n \trx_freq_1=%f\n \ttx_freq_1=%f\n \trx_freq_2=%f\n \ttx_freq_2=%f\n \trx_freq_3=%f\n \ttx_freq_3=%f\n \trxg_mode=%d\n \trx_gain_0=%f\n \ttx_gain_0=%f\n \trx_gain_1=%f\n \ttx_gain_1=%f\n \trx_gain_2=%f\n \ttx_gain_2=%f\n \trx_gain_3=%f\n \ttx_gain_3=%f\n \trx_gain_offset_2=%f\n \ttx_gain_offset_3=%f\n \trx_bw=%f\n \ttx_bw=%f\n \tautocal=%d\n \trem_addr %s:%d\n \tmy_addr %s:%d\n", + mod_enb->devs->openair0_cfg.Mod_id, + mod_enb->devs->openair0_cfg.log_level, + mod_enb->devs->openair0_cfg.num_rb_dl, + mod_enb->devs->openair0_cfg.samples_per_frame, + mod_enb->devs->openair0_cfg.sample_rate, + mod_enb->devs->openair0_cfg.samples_per_packet, + mod_enb->devs->openair0_cfg.tx_delay, + mod_enb->devs->openair0_cfg.tx_forward_nsamps, + mod_enb->devs->openair0_cfg.rx_num_channels, + mod_enb->devs->openair0_cfg.tx_num_channels, + mod_enb->devs->openair0_cfg.rx_freq[0], + mod_enb->devs->openair0_cfg.tx_freq[0], + mod_enb->devs->openair0_cfg.rx_freq[1], + mod_enb->devs->openair0_cfg.tx_freq[1], + mod_enb->devs->openair0_cfg.rx_freq[2], + mod_enb->devs->openair0_cfg.tx_freq[2], + mod_enb->devs->openair0_cfg.rx_freq[3], + mod_enb->devs->openair0_cfg.tx_freq[3], + mod_enb->devs->openair0_cfg.rxg_mode[0], + mod_enb->devs->openair0_cfg.rx_gain[0], + mod_enb->devs->openair0_cfg.tx_gain[0], + mod_enb->devs->openair0_cfg.rx_gain[1], + mod_enb->devs->openair0_cfg.tx_gain[1], + mod_enb->devs->openair0_cfg.rx_gain[2], + mod_enb->devs->openair0_cfg.tx_gain[2], + mod_enb->devs->openair0_cfg.rx_gain[3], + mod_enb->devs->openair0_cfg.tx_gain[3], + //mod_enb->devs->openair0_cfg.rx_gain_offset[0], + //mod_enb->devs->openair0_cfg.rx_gain_offset[1], + mod_enb->devs->openair0_cfg.rx_gain_offset[2], + mod_enb->devs->openair0_cfg.rx_gain_offset[3], + mod_enb->devs->openair0_cfg.rx_bw, + mod_enb->devs->openair0_cfg.tx_bw, + mod_enb->devs->openair0_cfg.autocal[0], + mod_enb->devs->openair0_cfg.remote_ip, + mod_enb->devs->openair0_cfg.remote_port, + mod_enb->devs->openair0_cfg.my_ip, + mod_enb->devs->openair0_cfg.my_port + ); + + printf("----------------------------------------------------------------------------\n"); + + } diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 8ed88c0f807cd0b3bd99976b522030e4eee74895..bf7eb77ea402a66e4ca39d0b77ad3847da592b5d 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -2966,6 +2966,7 @@ openair0_cfg[card].num_rb_dl=frame_parms[0]->N_RB_DL; #ifdef ETHERNET openair0.type=ETH_IF; // not used for the moment + openair0.func_type = BBU_FUNC; openair0_dev_init_eth(&openair0, &openair0_cfg[0]); #else #ifdef EXMIMO @@ -2984,8 +2985,7 @@ openair0_cfg[card].num_rb_dl=frame_parms[0]->N_RB_DL; printf("Exiting, cannot initialize device\n"); exit(-1); } - else if (mode==loop_through_memory) { - + else if (mode==loop_through_memory) { } #endif @@ -3304,12 +3304,14 @@ openair0_cfg[card].num_rb_dl=frame_parms[0]->N_RB_DL; #endif #ifndef EXMIMO + #ifndef USRP_DEBUG if (mode!=loop_through_memory) if (openair0.trx_start_func(&openair0) != 0 ) LOG_E(HW,"Could not start the device\n"); #endif + #endif diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index bb117a2f718e5e993b98a3ab37a7bd42eb66570f..7c0539497b935c3f69d515a2516bd0369667d89b 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -443,11 +443,16 @@ static void *UE_thread_synch(void *arg) openair0_cfg[0].rx_gain[0] -= 0; break; } +#ifndef EXMIMO + openair0.trx_set_freq_func(&openair0,&openair0_cfg[0],0); + openair0.trx_set_gains_func(&openair0,&openair0_cfg[0]); + openair0.trx_stop_func(0); +#else openair0_set_frequencies(&openair0,&openair0_cfg[0],0); openair0_set_gains(&openair0,&openair0_cfg[0]); openair0_stop(0); +#endif sleep(1); - init_frame_parms(&UE->lte_frame_parms,1); } else { @@ -516,10 +521,15 @@ static void *UE_thread_synch(void *arg) openair0_cfg[card].tx_freq[i] = downlink_frequency[card][i]+uplink_frequency_offset[card][i]+freq_offset; #ifdef OAI_USRP openair0_cfg[card].rx_gain[i] = UE->rx_total_gain_dB;//-USRP_GAIN_OFFSET; - + + +#ifndef EXMIMO + openair0.trx_set_freq_func(&openair0,&openair0_cfg[0],0); + +#else openair0_set_frequencies(&openair0,&openair0_cfg[0],0); - +#endif switch(UE->lte_frame_parms.N_RB_DL) { case 6: openair0_cfg[card].rx_gain[i] -= 12; diff --git a/targets/RT/USER/rrh.c b/targets/RT/USER/rrh.c index 77ba378beed82b785ffd9c22569352964195734a..7e4e54935181e61db785cebda0d328de8a7fa10a 100644 --- a/targets/RT/USER/rrh.c +++ b/targets/RT/USER/rrh.c @@ -1030,9 +1030,10 @@ void *rrh_eNB_thread(void *arg) rrh_eNB_desc.clientaddr = clientaddr; rrh_eNB_desc.clientaddrlen = clientaddrlen; - cmd = cmd&1; + //cmd = cmd&1; + cmd = cmd|1;//in order to make cmd evalution dummy (the first message from lte to rrh has changed, see: @ethernet_lib.c trx_start_func has been substituted by trx_request_func ) inet_ntop(AF_INET, &(((struct sockaddr_in*)&clientaddr)->sin_addr), str, INET_ADDRSTRLEN); - + if (cmd==START_CMD) { pthread_attr_init(&attr_eNB_rx); diff --git a/targets/RT/USER/rrh.gtkw b/targets/RT/USER/rrh.gtkw index 36ebadf9ca5fbe847b1a1d2914469f54eab9c46c..8eb2333489cbb44d23282d99fa22fa76257a6557 100644 --- a/targets/RT/USER/rrh.gtkw +++ b/targets/RT/USER/rrh.gtkw @@ -2,7 +2,7 @@ [*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI [*] Thu Jul 9 09:53:25 2015 [*] -[dumpfile] "/tmp/openair_dump_eNB.vcd" +[dumpfile] "/tmp/openair_dump_rrh.vcd" [dumpfile_mtime] "Thu Jul 9 09:52:29 2015" [dumpfile_size] 170586112 [savefile] "/home/sud/openair4G/targets/RT/USER/eNB2.gtkw" diff --git a/targets/RT/USER/rrh_gw.c b/targets/RT/USER/rrh_gw.c index d9394a866eaa6c238bd178dd7a54f74828226b4b..204dc6d0b6c85acc17ee486437966f2751b53125 100644 --- a/targets/RT/USER/rrh_gw.c +++ b/targets/RT/USER/rrh_gw.c @@ -53,6 +53,7 @@ #include "common_lib.h" #include "rrh_gw.h" // change to rrh_new.h, put externs in rrh_extern.h #include "rt_wrapper.h" +#include "rrh_gw_externs.h" // change to rrh_new.h, put externs in rrh_extern.h #include "log_if.h" @@ -68,10 +69,10 @@ static void debug_init(void); static void get_options(int argc, char *argv[]); static void print_help(void); static void get_RFinterfaces(void); -static rrh_module_t new_module(unsigned int id, dev_type_t type); +static rrh_module_t new_module(unsigned int id); +int get_ip_address(char* if_name); - -char rrh_ip[20] = "192.168.12.31"; // there is code to detect the my ip address +char rrh_ip[20] = "192.168.12.242"; // there is code to detect the my ip address int rrh_port = 50000; // has to be an option /* log */ @@ -86,34 +87,33 @@ int16_t ue_log_verbosity = LOG_MED; /* flags definitions */ -uint8_t eNB_flag=0; -uint8_t UE_flag=0; -uint8_t EXMIMO_flag=0; -uint8_t USRP_flag=0; -uint8_t RT_flag=0, NRT_flag=1; -uint8_t rrh_exit=0; +uint8_t eNB_flag=0; +uint8_t UE_flag=0; +uint8_t EXMIMO_flag=0; +uint8_t USRP_flag=0; +uint8_t RT_flag=0, NRT_flag=1; +uint8_t rrh_exit=0; +uint8_t loopback_flag=0; +uint8_t measurements_flag=0; /* Default operation as RRH: - - there are no eNB nor UE modules + - there are neither eNB nor UE modules - no RF device is asscociated with RRH */ uint8_t num_eNB_mod=0; uint8_t num_UE_mod=0; uint8_t num_EXMIMO_mod=0; uint8_t num_USRP_mod=0; -uint8_t loopback_flag=0; -uint8_t measurements_flag=0; uint8_t hardware_target=NONE_IF; -unsigned int RT_period=0; -rrh_module_t *enb_array,*ue_array; +rrh_module_t *enb_array; +rrh_module_t *ue_array; + pthread_mutex_t timer_mutex; openair0_vtimestamp hw_counter=0; +unsigned int rt_period=0; +struct itimerspec timerspec; -unsigned int rt_period; - -struct itimerspec timerspec; - -char* if_name="eth0"; +char* if_name="lo"; int main(int argc, char **argv) { @@ -123,40 +123,72 @@ int main(int argc, char **argv) { get_options(argc, argv); /* initialize logger and signal analyzer */ debug_init(); - + /* */ set_latency_target(); /*make a graceful exit when ctrl-c is pressed */ signal(SIGSEGV, signal_handler); signal(SIGINT, signal_handler); - //probe RF front end devices interfaced to RRH - //get_RFinterfaces(); + /*probe RF front end devices interfaced to RRH */ + // get_RFinterfaces(); + + +#ifdef ETHERNET + int error_code_timer; + pthread_t main_timer_proc_thread; + + LOG_I(RRH,"Creating timer thread with rt period %d ns.\n",rt_period); + + /* setup the timer to generate an interrupt: + -for the first time in (sample_per_packet/sample_rate) ns + -and then every (sample_per_packet/sample_rate) ns */ + timerspec.it_value.tv_sec = rt_period/1000000000; + timerspec.it_value.tv_nsec = rt_period%1000000000; + timerspec.it_interval.tv_sec = rt_period/1000000000; + timerspec.it_interval.tv_nsec = rt_period%1000000000; + + //#ifndef LOWLATENCY + pthread_attr_t attr_timer; + struct sched_param sched_param_timer; + + pthread_attr_init(&attr_timer); + sched_param_timer.sched_priority = sched_get_priority_max(SCHED_FIFO); + pthread_attr_setschedparam(&attr_timer,&sched_param_timer); + pthread_attr_setschedpolicy(&attr_timer,SCHED_FIFO); + + pthread_mutex_init(&timer_mutex,NULL); + + error_code_timer = pthread_create(&main_timer_proc_thread, &attr_timer, timer_proc, (void *)&timerspec); + LOG_I(RRH,"[SCHED] FIFO scheduling applied to timer thread \n"); + /*#else + error_code_timer = pthread_create(&main_timer_proc_thread, NULL, timer_proc, (void *)&timerspec); + LOG_I(RRH,"[SCHED] deadline scheduling applied to timer thread \n"); + #endif*/ + + if (error_code_timer) { + LOG_E(RRH,"Error while creating timer proc thread\n"); + exit(-1); + } +#endif + /* create modules based on input arguments */ - if (eNB_flag==1){ - + if (eNB_flag==1){ enb_array=(rrh_module_t*)malloc(num_eNB_mod*sizeof(rrh_module_t)); - // create num of modules - for(i=0;i<num_eNB_mod;i++){ - /* - enb_array[i]=new_module(i, get_RF_interfaces(&hardware_target)); - */ - enb_array[i]=new_module(i, NONE_IF); + for(i=0;i<num_eNB_mod;i++){ + enb_array[i]=new_module(i);//enb_array[i]=new_module(i, get_RF_interfaces(&hardware_target)); create_eNB_trx_threads(&enb_array[i],RT_flag,NRT_flag); - LOG_I(RRH,"[eNB %d] module(s) created (%u) \n",i,num_eNB_mod); + LOG_I(RRH,"[eNB %d] module(s) created (out of %u) \n",i,num_eNB_mod); } - } - if (UE_flag==1){ - + if (UE_flag==1){ ue_array=(rrh_module_t*)malloc(num_UE_mod*sizeof(rrh_module_t)); - // create num of modules for(i=0;i<num_UE_mod;i++){ - ue_array[i]=new_module(i, NONE_IF); + ue_array[i]=new_module(i); create_UE_trx_threads(&ue_array[i],RT_flag,NRT_flag); - LOG_I(RRH,"[UE %d] module(s) created (%u)\n",i, num_UE_mod); + LOG_I(RRH,"[UE %d] module(s) created (out of %u)\n",i, num_UE_mod); } } - + printf("TYPE <CTRL-C> TO TERMINATE\n"); while (rrh_exit==0) @@ -178,137 +210,55 @@ int main(int argc, char **argv) { * \note * @ingroup _oai */ -static rrh_module_t new_module (unsigned int id, dev_type_t type) { +static rrh_module_t new_module (unsigned int id) { rrh_module_t rrh_mod; openair0_config_t openair0_cfg; - + rrh_mod.id=id; rrh_mod.loopback=loopback_flag; rrh_mod.measurements=measurements_flag; - rrh_mod.eth_dev.func_type=RRH_FUNC; + /* each module is associated with an ethernet device */ rrh_mod.eth_dev.type=ETH_IF; - get_ip_addreess(if_name); + rrh_mod.eth_dev.func_type=RRH_FUNC; + get_ip_address(if_name); openair0_cfg.my_ip=&rrh_ip[0]; openair0_cfg.my_port=rrh_port; - //printf("rrh ip %s\n", rrh_mod.eth_dev.openair0_cfg.my_ip); - /* ethernet device initialization*/ + /* ethernet device initialization */ if (openair0_dev_init_eth(&rrh_mod.eth_dev, &openair0_cfg)<0){ LOG_E(RRH,"Exiting, cannot initialize ethernet interface.\n"); exit(-1); } + + /* specify associated RF device */ + openair0_device *oai_dv = (openair0_device *)malloc(sizeof(openair0_device)); + memset(oai_dv,0, sizeof(openair0_device)); + +#ifdef EXMIMO + rrh_mod.devs=oai_dv; + rrh_mod.devs->type=EXMIMO_IF; + LOG_I(RRH,"Setting RF device to EXMIMO\n"); +#elif OAI_USRP + rrh_mod.devs=oai_dv; + rrh_mod.devs->type=USRP_IF; + LOG_I(RRH,"Setting RF device to USRP\n"); +#elif OAI_BLADERF + rrh_mod.devs=oai_dv; + rrh_mod.devs->type=BLADERF_IF; + LOG_I(RRH,"Setting RF device to BLADERF\n"); +#else + rrh_mod.devs=oai_dv; + rrh_mod.devs->type=NONE_IF; + LOG_I(RRH,"Setting RF interface to NONE_IF... \n"); +#endif - /* initialize another HW device */ - switch(type){ - case ETH_IF: - LOG_E(RRH,"Error: one module is associated with one ETHERNET iterface!\n"); - break; - case EXMIMO_IF: - rrh_mod.devs=malloc(sizeof(openair0_device)); - rrh_mod.devs->type=EXMIMO_IF; - LOG_I(RRH,"Setting RF interface to EXMIMO_IF and initializing device ...\n"); - /*if (openair0_device_init(rrh_mod.devs, &openair0_cfg)<0){ - printf("Exiting, cannot initialize device.\n"); - exit(-1); - }*/ - break; - case USRP_IF: - rrh_mod.devs=malloc(sizeof(openair0_device)); - rrh_mod.devs->type=USRP_IF; - LOG_I(RRH,"Setting RF interface to USRP_IF and initializing device ...\n"); - /*if (openair0_device_init(rrh_mod.devs, &openair0_cfg)<0){ - printf("Exiting, cannot initialize device.\n"); - exit(-1); - } */ - break; - case BLADERF_IF: - rrh_mod.devs=malloc(sizeof(openair0_device)); - rrh_mod.devs->type=BLADERF_IF; - LOG_I(RRH,"Setting RF interface to BLADERF_IF and initializing device ...\n"); - /* if (openair0_device_init(rrh_mod.devs, &openair0_cfg)<0){ - printf("Exiting, cannot initialize device.\n"); - exit(-1); - } */ - break; - case NONE_IF: - rrh_mod.devs=NULL; - LOG_I(RRH,"Setting RF interface to NONE_IF... \n"); - break; - default: - break; - } return rrh_mod; } -/*! \fn static void get_RFinterfaces(void) -* \brief this function -* \param[in] -* \param[out] -* \return -* \note -* @ingroup _oai -*/ -static void get_RFinterfaces(void) { - - //tbd - EXMIMO_flag=1; - USRP_flag=1; - num_EXMIMO_mod=1; - num_USRP_mod=1; - -} - - -/*!\fn void create_timer_thread(void) -* \brief this function -* \param[in] -* \param[out] -* \return -* \note -* @ingroup _oai -*/ -void create_timer_thread() { - - int error_code_timer; - pthread_t main_timer_proc_thread; - - LOG_I(RRH,"Creating timer thread with rt period %d ns.\n",rt_period); - - /* setup the timer to generate an interrupt: - -for the first time in (sample_per_packet/sample_rate) ns - -and then every (sample_per_packet/sample_rate) ns */ - timerspec.it_value.tv_sec = rt_period/1000000000; - timerspec.it_value.tv_nsec = rt_period%1000000000; - timerspec.it_interval.tv_sec = rt_period/1000000000; - timerspec.it_interval.tv_nsec = rt_period%1000000000; - - pthread_mutex_init(&timer_mutex,NULL); - -#ifndef LOWLATENCY - pthread_attr_t attr_timer; - struct sched_param sched_param_timer; - - pthread_attr_init(&attr_timer); - sched_param_timer.sched_priority = sched_get_priority_max(SCHED_FIFO-1); - pthread_attr_setschedparam(&attr_timer,&sched_param_timer); - pthread_attr_setschedpolicy(&attr_timer,SCHED_FIFO-1); - error_code_timer = pthread_create(&main_timer_proc_thread, &attr_timer, timer_proc, (void *)&timerspec); - LOG_D(RRH,"[SCHED] FIFO scheduling \n"); -#else - error_code_timer = pthread_create(&main_timer_proc_thread, NULL, timer_proc, (void *)&timerspec); - LOG_D(RRH,"[SCHED] LOWLATENCY scheduling \n"); -#endif - - if (error_code_timer) { - LOG_E(RRH,"Error while creating timer proc thread\n"); - exit(-1); - } -} - /*! \fn void *timer_proc(void *arg) * \brief this function @@ -320,13 +270,11 @@ void create_timer_thread() { */ void *timer_proc(void *arg) { - timer_t timerid; // timer ID for timer - struct itimerspec *timer = (struct itimerspec*)arg; // the timer data structure + timer_t timerid; + struct itimerspec *timer= (struct itimerspec *)arg ; // the timer data structure struct itimerspec *old_value; - LOG_I(RRH,"timer thread created\n"); - - + /* #ifdef LOWLATENCY struct sched_attr attr; unsigned int flags = 0; @@ -338,30 +286,27 @@ void *timer_proc(void *arg) { attr.sched_policy = SCHED_DEADLINE; attr.sched_runtime = (0.1 * 100) * 10000; // - attr.sched_deadline = rt_period;//(0.1 * 100) * 10000; // + attr.sched_deadline = rt_period-30000;//(0.1 * 100) * 10000; // attr.sched_period = rt_period;//(0.1 * 100) * 10000; // each TX/RX thread has, as a function of RT PERIOD ?? if (sched_setattr(0, &attr, flags) < 0 ) { perror("[SCHED] timer thread: sched_setattr failed\n"); exit(-1); } -#endif - //printf("Starting the timer\n"); - if (timer_create (CLOCK_REALTIME, NULL, &timerid) == -1) { +#endif + */ + if (timer_create (CLOCK_REALTIME, NULL, &timerid) == -1) { fprintf (stderr, "couldn't create a timer\n"); perror (NULL); exit (EXIT_FAILURE); } signal(SIGALRM, timer_signal_handler); - // and start it! + LOG_I(RRH,"Timer has started!\n"); timer_settime (timerid, 0, timer, old_value); - //timer_settime (timerid, TIMER_ABSTIME, timer, old_value); - + while (!rrh_exit) { - //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_TM, 1 ); sleep(1); - //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_TM, 0 ); } timer_delete(timerid); @@ -437,16 +382,10 @@ static void debug_init(void) { // vcd initialization if (ouput_vcd) { + vcd_signal_dumper_init("/tmp/openair_dump_rrh.vcd"); - if (eNB_flag==1) - vcd_signal_dumper_init("/tmp/openair_dump_eNB.vcd"); - if (UE_flag==1) - vcd_signal_dumper_init("/tmp/openair_dump_UE.vcd"); - - } - } - +} /*!\fn void get_options(int argc, char *argv[]) * \brief this function @@ -504,21 +443,29 @@ static void get_options(int argc, char *argv[]) { measurements_flag=1; break; case 'w': - /* force to use this target*/ - //hardware_target= + /* force to use this target*/ + hardware_target=1; break; - case 'h': - print_help(); - exit(-1); + case 'h': + print_help(); + exit(-1); default: /* '?' */ //fprintf(stderr, "Usage: \n", argv[0]); exit(-1); - } } - } -int get_ip_addreess(char* if_name){ +} + +/*!\fn void print_help(void) +* \brief this function +* \param[in] +* \param[out] +* \return +* \note +* @ingroup _oai +*/ +int get_ip_address(char* if_name) { int fd; struct ifreq ifr; @@ -569,3 +516,84 @@ static void print_help(void) { } +/*! \fn void exit_fun(const char* s) +* \brief this function +* \param[in] +* \param[out] +* \return +* \note +* @ingroup _oai +*/ +void exit_fun(const char* s) +{ + if (s != NULL) { + printf("%s %s() Exiting RRH: %s\n",__FILE__, __FUNCTION__, s); + } + rrh_exit = 1; + exit (-1); +} + + +/*! \fn static void get_RFinterfaces(void) +* \brief this function +* \param[in] +* \param[out] +* \return +* \note +* @ingroup _oai +*/ +static void get_RFinterfaces(void) { + + EXMIMO_flag=1; + USRP_flag=1; + num_EXMIMO_mod=1; + num_USRP_mod=1; + +} + + +/*!\fn void create_timer_thread(void) +* \brief this function +* \param[in] +* \param[out] +* \return +* \note +* @ingroup _oai +*/ +void create_timer_thread() { + + int error_code_timer; + pthread_t main_timer_proc_thread; + + LOG_I(RRH,"Creating timer thread with rt period %d ns.\n",rt_period); + + /* setup the timer to generate an interrupt: + -for the first time in (sample_per_packet/sample_rate) ns + -and then every (sample_per_packet/sample_rate) ns */ + timerspec.it_value.tv_sec = rt_period/1000000000; + timerspec.it_value.tv_nsec = rt_period%1000000000; + timerspec.it_interval.tv_sec = rt_period/1000000000; + timerspec.it_interval.tv_nsec = rt_period%1000000000; + + pthread_mutex_init(&timer_mutex,NULL); + +#ifndef LOWLATENCY + pthread_attr_t attr_timer; + struct sched_param sched_param_timer; + + pthread_attr_init(&attr_timer); + sched_param_timer.sched_priority = sched_get_priority_max(SCHED_FIFO-1); + pthread_attr_setschedparam(&attr_timer,&sched_param_timer); + pthread_attr_setschedpolicy(&attr_timer,SCHED_FIFO-1); + error_code_timer = pthread_create(&main_timer_proc_thread, &attr_timer, timer_proc, (void *)&timerspec); + LOG_I(RRH,"[SCHED] FIFO scheduling applied to timer thread \n"); +#else + error_code_timer = pthread_create(&main_timer_proc_thread, NULL, timer_proc, (void *)&timerspec); + LOG_I(RRH,"[SCHED] deadline scheduling applied to timer thread \n"); +#endif + + if (error_code_timer) { + LOG_E(RRH,"Error while creating timer proc thread\n"); + exit(-1); + } +} diff --git a/targets/RT/USER/rrh_gw.h b/targets/RT/USER/rrh_gw.h index de941f1b375a6ff5580bf43b9dfdcf41c4a6f120..7d6d89b9d1a56216d8fe332ea3ef5f17f1ae944b 100644 --- a/targets/RT/USER/rrh_gw.h +++ b/targets/RT/USER/rrh_gw.h @@ -51,7 +51,7 @@ /*! \brief RRH supports two types of modules: eNB and UE each module is associated a device of type ETH_IF - and optionally with another device (USRP/BLADERF/EXMIMO) */ + and optionally with an RF device (USRP/BLADERF/EXMIMO) */ typedef struct { //! module id uint8_t id; @@ -80,6 +80,6 @@ void create_timer_thread(void); ** FUNCTION PROTOTYPES ** ******************************************************************************/ void create_UE_trx_threads( rrh_module_t *dev_ue, uint8_t RT_flag, uint8_t NRT_flag); -void create_eNB_trx_threads( rrh_module_t *dev_enb, uint8_t RT_flag, uint8_t NRT_flag); +void create_eNB_trx_threads( rrh_module_t *mod_enb, uint8_t RT_flag, uint8_t NRT_flag); #endif diff --git a/targets/RT/USER/rrh_gw_externs.h b/targets/RT/USER/rrh_gw_externs.h index 317af1bf4868600a1d2bab76ed8be436fc93cb98..47cb50605b8a9012eabbf3192fc9a4ef9ebc7cde 100644 --- a/targets/RT/USER/rrh_gw_externs.h +++ b/targets/RT/USER/rrh_gw_externs.h @@ -47,7 +47,8 @@ extern int32_t nsamps_UE[4],nsamps_eNB[4]; extern int32_t overflow_rx_buffer_eNB[4],overflow_rx_buffer_UE[4]; extern uint8_t rrh_exit; extern int32_t **rx_buffer_eNB, **rx_buffer_UE; +extern unsigned int rt_period; +extern pthread_mutex_t timer_mutex; -extern unsigned int rt_period; #endif