From 1b989ed27a3822d07fb10fc0ac801fed0df967bf Mon Sep 17 00:00:00 2001 From: Raymond Knopp <raymond.knopp@eurecom.fr> Date: Fri, 18 Jul 2014 14:02:50 +0000 Subject: [PATCH] git-svn-id: http://svn.eurecom.fr/openair4G/trunk@5574 818b1a75-f10b-46b9-bf7c-635c3b92a50f --- targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c | 4 +- .../ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c | 97 +++++++++++++++---- targets/ARCH/EXMIMO/USERSPACE/OCTAVE/txsig.m | 27 ++++-- 3 files changed, 97 insertions(+), 31 deletions(-) diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c b/targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c index fc7e4e3d637..ff3859c1474 100755 --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c @@ -214,7 +214,7 @@ int openair_device_ioctl(struct inode *inode,struct file *filp, unsigned int cmd case openair_GET_BIGSHMTOPS_KVIRT: - //printk("[openair][IOCTL] : openair_GET_BIGSHMTOPS_KVIRT (0x%p)[0] = %p[0] (bigshm_head) for 0..3 (sizeof %d) \n", (void *)arg, bigshm_head[0], sizeof(bigshm_head)); + //printk("[openair][IOCTL] : openair_GET_BIGSHMTOPS_KVIRT (0x%p)[0] = %p[0] (bigshm_head) for 0..3 (sizeof %d) \n", (void *)arg, bigshm_head[0], sizeof(bigshm_head)); copy_to_user((void *)arg, bigshm_head, sizeof(bigshm_head)); break; @@ -222,7 +222,7 @@ int openair_device_ioctl(struct inode *inode,struct file *filp, unsigned int cmd case openair_GET_PCI_INTERFACE_BOTS_KVIRT: - //printk("[openair][IOCTL] : openair_GET_PCI_INTERFACE_BOTS_KVIRT: copying exmimo_pci_kvirt(@%8p) to %lx (sizeof %d)\n", &exmimo_pci_kvirt[0], arg, sizeof(exmimo_pci_kvirt)); + //printk("[openair][IOCTL] : openair_GET_PCI_INTERFACE_BOTS_KVIRT: copying exmimo_pci_kvirt(@%8p) to %lx (sizeof %d)\n", &exmimo_pci_kvirt[0], arg, sizeof(exmimo_pci_kvirt)); copy_to_user((void *)arg, exmimo_pci_kvirt, sizeof(exmimo_pci_kvirt)); break; diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c index a6d1f25d397..54be675bd60 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c @@ -13,6 +13,7 @@ #include <string.h> #include <unistd.h> #include <stdio.h> +#include <stdlib.h> #include "openair0_lib.h" #include "openair_device.h" @@ -28,6 +29,13 @@ int openair0_num_detected_cards = 0; unsigned int PAGE_SHIFT; +static uint32_t rf_local[4] = {8255000,8255000,8255000,8255000}; // UE zepto + //{8254617, 8254617, 8254617, 8254617}; //eNB khalifa + //{8255067,8254810,8257340,8257340}; // eNB PETRONAS + +static uint32_t rf_vcocal[4] = {910,910,910,910}; +static uint32_t rf_vcocal_850[4] = {2015, 2015, 2015, 2015}; +static uint32_t rf_rxdc[4] = {32896,32896,32896,32896}; unsigned int log2_int( unsigned int x ) { @@ -39,20 +47,23 @@ unsigned int log2_int( unsigned int x ) int openair0_open(void) { exmimo_pci_interface_bot_virtual_t exmimo_pci_kvirt[MAX_CARDS]; - unsigned int bigshm_top_kvirtptr[MAX_CARDS]; + void *bigshm_top_kvirtptr[MAX_CARDS]; int card; int ant; int openair0_num_antennas[4]; PAGE_SHIFT = log2_int( sysconf( _SC_PAGESIZE ) ); - + + if ((openair0_fd = open("/dev/openair0", O_RDWR,0)) <0) { return -1; } ioctl(openair0_fd, openair_GET_NUM_DETECTED_CARDS, &openair0_num_detected_cards); + + if ( openair0_num_detected_cards == 0 ) { @@ -63,8 +74,10 @@ int openair0_open(void) ioctl(openair0_fd, openair_GET_BIGSHMTOPS_KVIRT, &bigshm_top_kvirtptr[0]); ioctl(openair0_fd, openair_GET_PCI_INTERFACE_BOTS_KVIRT, &exmimo_pci_kvirt[0]); - //printf("bigshm_top_kvirtptr: %08x %08x %08x %08x\n", bigshm_top_kvirtptr[0], bigshm_top_kvirtptr[1], bigshm_top_kvirtptr[2], bigshm_top_kvirtptr[3]); - + printf("bigshm_top_kvirtptr (MAX_CARDS %d): %p %p %p %p\n", MAX_CARDS,bigshm_top_kvirtptr[0], bigshm_top_kvirtptr[1], bigshm_top_kvirtptr[2], bigshm_top_kvirtptr[3]); + + + for( card=0; card < openair0_num_detected_cards; card++) { bigshm_top[card] = (char *)mmap( NULL, @@ -80,22 +93,30 @@ int openair0_open(void) } // calculate userspace addresses - openair0_exmimo_pci[card].firmware_block_ptr = (char*) (bigshm_top[card] + (unsigned int)exmimo_pci_kvirt[0].firmware_block_ptr - bigshm_top_kvirtptr[0]); - openair0_exmimo_pci[card].printk_buffer_ptr = (char*) (bigshm_top[card] + (unsigned int)exmimo_pci_kvirt[0].printk_buffer_ptr - bigshm_top_kvirtptr[0]); - openair0_exmimo_pci[card].exmimo_config_ptr = (exmimo_config_t*) (bigshm_top[card] + (unsigned int)exmimo_pci_kvirt[0].exmimo_config_ptr - bigshm_top_kvirtptr[0]); - openair0_exmimo_pci[card].exmimo_id_ptr = (exmimo_id_t*) (bigshm_top[card] + (unsigned int)exmimo_pci_kvirt[0].exmimo_id_ptr - bigshm_top_kvirtptr[0]); - - //printf("openair0_exmimo_pci.firmware_block_ptr (%p) = bigshm_top(%p) + exmimo_pci_kvirt.firmware_block_ptr(%p) - bigshm_top_kvirtptr(%x)\n", - // openair0_exmimo_pci[card].firmware_block_ptr, bigshm_top, exmimo_pci_kvirt[card].firmware_block_ptr, bigshm_top_kvirtptr[card]); - //printf("card%d, openair0_exmimo_pci.exmimo_id_ptr (%p) = bigshm_top(%p) + exmimo_pci_kvirt.exmimo_id_ptr (%p) - bigshm_top_kvirtptr(%x)\n", - // card, openair0_exmimo_pci[card].exmimo_id_ptr, bigshm_top[card], exmimo_pci_kvirt[card].exmimo_id_ptr, bigshm_top_kvirtptr[card]); +#if __x86_64 + openair0_exmimo_pci[card].firmware_block_ptr = (bigshm_top[card] + (int64_t)exmimo_pci_kvirt[0].firmware_block_ptr - (int64_t)bigshm_top_kvirtptr[0]); + openair0_exmimo_pci[card].printk_buffer_ptr = (bigshm_top[card] + (int64_t)exmimo_pci_kvirt[0].printk_buffer_ptr - (int64_t)bigshm_top_kvirtptr[0]); + openair0_exmimo_pci[card].exmimo_config_ptr = (exmimo_config_t*) (bigshm_top[card] + (int64_t)exmimo_pci_kvirt[0].exmimo_config_ptr - (int64_t)bigshm_top_kvirtptr[0]); + openair0_exmimo_pci[card].exmimo_id_ptr = (exmimo_id_t*) (bigshm_top[card] + (int64_t)exmimo_pci_kvirt[0].exmimo_id_ptr - (int64_t)bigshm_top_kvirtptr[0]); +#else + openair0_exmimo_pci[card].firmware_block_ptr = (bigshm_top[card] + (int32_t)exmimo_pci_kvirt[0].firmware_block_ptr - (int32_t)bigshm_top_kvirtptr[0]); + openair0_exmimo_pci[card].printk_buffer_ptr = (bigshm_top[card] + (int32_t)exmimo_pci_kvirt[0].printk_buffer_ptr - (int32_t)bigshm_top_kvirtptr[0]); + openair0_exmimo_pci[card].exmimo_config_ptr = (exmimo_config_t*) (bigshm_top[card] + (int32_t)exmimo_pci_kvirt[0].exmimo_config_ptr - (int32_t)bigshm_top_kvirtptr[0]); + openair0_exmimo_pci[card].exmimo_id_ptr = (exmimo_id_t*) (bigshm_top[card] + (int32_t)exmimo_pci_kvirt[0].exmimo_id_ptr - (int32_t)bigshm_top_kvirtptr[0]); +#endif + + printf("openair0_exmimo_pci.firmware_block_ptr (%p) = bigshm_top(%p) + exmimo_pci_kvirt.firmware_block_ptr(%p) - bigshm_top_kvirtptr(%p)\n", + openair0_exmimo_pci[card].firmware_block_ptr, bigshm_top, exmimo_pci_kvirt[card].firmware_block_ptr, bigshm_top_kvirtptr[card]); + printf("card%d, openair0_exmimo_pci.exmimo_id_ptr (%p) = bigshm_top(%p) + exmimo_pci_kvirt.exmimo_id_ptr (%p) - bigshm_top_kvirtptr(%p)\n", + card, openair0_exmimo_pci[card].exmimo_id_ptr, bigshm_top[card], exmimo_pci_kvirt[card].exmimo_id_ptr, bigshm_top_kvirtptr[card]); //if (openair0_exmimo_pci[card].exmimo_id_ptr->board_swrev != BOARD_SWREV_CNTL2) // { // error("Software revision %d and firmware revision %d do not match, Please update either Software or Firmware",BOARD_SWREV_CNTL2,openair0_exmimo_pci[card].exmimo_id_ptr->board_swrev); // return -5; // } - + + if ( openair0_exmimo_pci[card].exmimo_id_ptr->board_exmimoversion == 1) openair0_num_antennas[card] = 2; @@ -105,8 +126,13 @@ int openair0_open(void) for (ant=0; ant<openair0_num_antennas[card]; ant++) { - openair0_exmimo_pci[card].rxcnt_ptr[ant] = (unsigned int *) (bigshm_top[card] + (unsigned int)exmimo_pci_kvirt[card].rxcnt_ptr[ant] - bigshm_top_kvirtptr[card]); - openair0_exmimo_pci[card].txcnt_ptr[ant] = (unsigned int *) (bigshm_top[card] + (unsigned int)exmimo_pci_kvirt[card].txcnt_ptr[ant] - bigshm_top_kvirtptr[card]); +#if __x86_64__ + openair0_exmimo_pci[card].rxcnt_ptr[ant] = (unsigned int *) (bigshm_top[card] + (int64_t)exmimo_pci_kvirt[card].rxcnt_ptr[ant] - (int64_t)bigshm_top_kvirtptr[card]); + openair0_exmimo_pci[card].txcnt_ptr[ant] = (unsigned int *) (bigshm_top[card] + (int64_t)exmimo_pci_kvirt[card].txcnt_ptr[ant] - (int64_t)bigshm_top_kvirtptr[card]); +#else + openair0_exmimo_pci[card].rxcnt_ptr[ant] = (unsigned int *) (bigshm_top[card] + (int32_t)exmimo_pci_kvirt[card].rxcnt_ptr[ant] - (int32_t)bigshm_top_kvirtptr[card]); + openair0_exmimo_pci[card].txcnt_ptr[ant] = (unsigned int *) (bigshm_top[card] + (int32_t)exmimo_pci_kvirt[card].txcnt_ptr[ant] - (int32_t)bigshm_top_kvirtptr[card]); +#endif } for (ant=0; ant<openair0_num_antennas[card]; ant++) @@ -201,7 +227,11 @@ int openair0_device_init(openair0_device *device, openair0_config_t *openair0_cf int ret; int ant; + + ret = openair0_open(); + + if ( ret != 0 ) { if (ret == -1) printf("Error opening /dev/openair0"); @@ -225,6 +255,8 @@ int openair0_device_init(openair0_device *device, openair0_config_t *openair0_cf exit(-1); } + + if (p_exmimo_id->board_swrev>=9) p_exmimo_config->framing.eNB_flag = 0; else @@ -238,6 +270,10 @@ int openair0_device_init(openair0_device *device, openair0_config_t *openair0_cf p_exmimo_config->framing.resampling_factor = 2; #endif + if (!openair0_cfg) { + printf("Error, openair0_cfg is null!!\n"); + return(-1); + } for (ant=0;ant<max(openair0_cfg->tx_num_channels,openair0_cfg->rx_num_channels);ant++) p_exmimo_config->rf.rf_mode[ant] = RF_MODE_BASE; for (ant=0;ant<openair0_cfg->tx_num_channels;ant++) @@ -264,14 +300,37 @@ int openair0_device_init(openair0_device *device, openair0_config_t *openair0_cf for (ant = 0; ant<openair0_cfg->rx_num_channels; ant++) { p_exmimo_config->rf.do_autocal[ant] = 1; p_exmimo_config->rf.rf_freq_rx[ant] = (unsigned int)openair0_cfg->rx_freq[ant]; - p_exmimo_config->rf.tx_gain[ant][0] = (unsigned int)openair0_cfg->rx_gain; + p_exmimo_config->rf.rx_gain[ant][0] = (unsigned int)openair0_cfg->rx_gain[ant]; + printf("openair0 : programming RX antenna %d (freq %d, gain %d)\n",ant,p_exmimo_config->rf.rf_freq_rx[ant],p_exmimo_config->rf.rx_gain[ant][0]); } for (ant = 0; ant<openair0_cfg->tx_num_channels; ant++) { - p_exmimo_config->rf.do_autocal[ant] = 1; p_exmimo_config->rf.rf_freq_tx[ant] = (unsigned int)openair0_cfg->tx_freq[ant]; - p_exmimo_config->rf.tx_gain[ant][0] = (unsigned int)openair0_cfg->tx_gain; + p_exmimo_config->rf.tx_gain[ant][0] = (unsigned int)openair0_cfg->tx_gain[ant]; + printf("openair0 : programming TX antenna %d (freq %d, gain %d)\n",ant,p_exmimo_config->rf.rf_freq_tx[ant],p_exmimo_config->rf.tx_gain[ant][0]); } + p_exmimo_config->rf.rf_local[ant] = rf_local[ant]; + p_exmimo_config->rf.rf_rxdc[ant] = rf_rxdc[ant]; + + for (ant=0;ant<4;ant++) { + p_exmimo_config->rf.rf_local[ant] = rf_local[ant]; + p_exmimo_config->rf.rf_rxdc[ant] = rf_rxdc[ant]; + + if (( p_exmimo_config->rf.rf_freq_tx[ant] >= 850000000) && ( p_exmimo_config->rf.rf_freq_tx[ant] <= 865000000)) { + p_exmimo_config->rf.rf_vcocal[ant] = rf_vcocal_850[ant]; + p_exmimo_config->rf.rffe_band_mode[ant] = DD_TDD; + } + else if (( p_exmimo_config->rf.rf_freq_tx[ant] >= 1900000000) && ( p_exmimo_config->rf.rf_freq_tx[ant] <= 2000000000)) { + p_exmimo_config->rf.rf_vcocal[ant] = rf_vcocal[ant]; + p_exmimo_config->rf.rffe_band_mode[ant] = B19G_TDD; + } + else { + p_exmimo_config->rf.rf_vcocal[ant] = rf_vcocal[ant]; + p_exmimo_config->rf.rffe_band_mode[ant] = 0; + } + } + + return(0); } unsigned int *openair0_daq_cnt() { diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/txsig.m b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/txsig.m index 112d82c8b20..920385131d5 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/txsig.m +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/txsig.m @@ -1,9 +1,10 @@ %fc = 2660000000; -fc = 1907600000; +%fc = 1907600000; %fc = 859.5e6; +fc = [2051800000 2051800000 1551800000 2000000000]; rxgain=0; -txgain=25; +txgain=20; eNB_flag = 0; card = 0; active_rf = [1 1 1 0]; @@ -23,8 +24,8 @@ rf_rxdc = rf_rxdc * active_rf; rf_vcocal = rf_vcocal_19G * active_rf; %rf_vcocal = rf_vcocal_26G_eNB * chan_sel; rxgain = rxgain*active_rf; -txgain = txgain*active_rf; -freq_tx = fc*active_rf; +txgain = txgain*[2 2 1 1]; +freq_tx = fc.*active_rf; freq_rx = freq_tx; %freq_rx = freq_tx-120000000*chan_sel; %freq_tx = freq_rx+1920000; @@ -38,17 +39,23 @@ oarf_config_exmimo(card, freq_rx,freq_tx,tdd_config,syncmode,rxgain,txgain,eNB_f amp = pow2(14)-1; n_bit = 16; -s = zeros(76800*4,4); +s = zeros(76800,4); -select = 1; +select = 0; switch(select) +case 0 + s(:,1) = amp * ones(1,76800); + s(:,2) = amp * ones(1,76800); + s(:,3) = amp*OFDM_TX_FRAME(512,199,128,120,1).'; + s(:,4) = amp * ones(1,76800); + case 1 - s(:,1) = floor(amp * (exp(1i*2*pi*(0:((76800*4)-1))/7680))); - s(:,2) = floor(amp * (exp(1i*2*pi*(0:((76800*4)-1))/7680))); - s(:,3) = floor(amp * (exp(1i*2*pi*(0:((76800*4)-1))/7680))); - s(:,4) = floor(amp * (exp(1i*2*pi*(0:((76800*4)-1))/7680))); + s(:,1) = floor(amp * (exp(1i*2*pi*(0:((76800*4)-1))/4))); + s(:,2) = floor(amp * (exp(1i*2*pi*(0:((76800*4)-1))/4))); + s(:,3) = floor(amp * (exp(1i*2*pi*(0:((76800*4)-1))/4))); + s(:,4) = floor(amp * (exp(1i*2*pi*(0:((76800*4)-1))/4))); case 2 s(38400+128,1)= 80-1j*40; -- GitLab