//-----------------------------------------------------------------------------
void
fifo_printf_init (void)
{
  //-----------------------------------------------------------------------------
  printk ("[TRACE] INIT\n");
  rtf_create (FIFO_PRINTF_L1_NO, FIFO_PRINTF_SIZE);
  rtf_create (FIFO_PRINTF_L2_NO, FIFO_PRINTF_SIZE);
}
예제 #2
0
/*------------------------------------------------------------------------------*/
int L3_xface_init(void) {
  /*------------------------------------------------------------------------------*/

  int ret = 0;

#ifdef USER_MODE

  int sock;
  LOG_D(RRC, "[L3_XFACE] init de l'interface \n");

  if (open_socket (&S_rrc, RRC_RRM_SOCK_PATH, RRM_RRC_SOCK_PATH, 0) == -1)
    return (-1);

  if (S_rrc.s == -1) {
    return (-1);
  }

  socket_setnonblocking (S_rrc.s);
  msg ("Interface Connected... RRM-RRC\n");
  return 0;

#else

  ret=rtf_create(RRC2RRM_FIFO,32768);

  if (ret < 0) {
    msg("[openair][MAC][INIT] Cannot create RRC2RRM fifo %d (ERROR %d)\n",RRC2RRM_FIFO,ret);

    return(-1);
  }
  else {
    msg("[openair][MAC][INIT] Created RRC2RRM fifo %d\n",RRC2RRM_FIFO);
    rtf_reset(RRC2RRM_FIFO);
  }

  ret=rtf_create(RRM2RRC_FIFO,32768);

  if (ret < 0) {
    msg("[openair][MAC][INIT] Cannot create RRM2RRC fifo %d (ERROR %d)\n",RRM2RRC_FIFO,ret);

    return(-1);
  }
  else {
    msg("[openair][MAC][INIT] Created RRC2RRM fifo %d\n",RRM2RRC_FIFO);
    rtf_reset(RRM2RRC_FIFO);
  }

  return(0);

#endif
}
예제 #3
0
파일: SysDep.c 프로젝트: ruby6117/ccode
int RTFOpen(int minor, int size)
{
  int err;
  if (minor < 0) {
    int i;
    for (i = 0; i < RTF_NO; ++i) 
      if (rtf_create(i, size) == 0) { minor = i; break; }
    if (minor < 0) return -1;
    return minor;
  }
  /* else minor >= 0.. */
  err = rtf_create(minor, size);
  if (err) return err;
  return minor;
}
예제 #4
0
파일: rtai_fifoout.c 프로젝트: ArcEye/RTAI
static void init(scicos_block *block)
{
  int sizeData = sizeof(float)*(block->nin+1);
  int dim = block->ipar[1]/sizeData*sizeData;
  rtf_create(block->ipar[0],dim);
  rtf_reset(block->ipar[0]);
}
예제 #5
0
int init_module(void)
{
    unsigned int            local_ip;
    unsigned int            server_ip = rt_inet_aton(server_ip_s);
    struct rtnet_callback   callback  = {echo_rcv, NULL};


    if (strlen(local_ip_s) != 0)
        local_ip = rt_inet_aton(local_ip_s);
    else
        local_ip = INADDR_ANY;

    if (interval < 1) interval = 1;
    if (interval > 1000) interval = 1000;

    if (packetsize < 1) packetsize = 1;
    if (packetsize > 1400) packetsize = 1400;

    printk("***** start of rt_client ***** %s %s *****\n", __DATE__, __TIME__);
    printk("local  ip address %s=%08x\n", local_ip_s, local_ip);
    printk("server ip address %s=%08x\n", server_ip_s, server_ip);
    printk("interval = %d\n", interval);
    printk("packetsize = %d\n", packetsize);
    printk("start timer %d\n", start_timer);

    rtf_create(PRINT, 8000);

    /* create rt-socket */
    sock = socket_rt(AF_INET,SOCK_DGRAM,0);

    /* bind the rt-socket to local_addr */
    memset(&local_addr, 0, sizeof(struct sockaddr_in));
    local_addr.sin_family = AF_INET;
    local_addr.sin_port = htons(RCV_PORT);
    local_addr.sin_addr.s_addr = local_ip;
    bind_rt(sock, (struct sockaddr *)&local_addr, sizeof(struct sockaddr_in));

    /* set server-addr */
    memset(&server_addr, 0, sizeof(struct sockaddr_in));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(SRV_PORT);
    server_addr.sin_addr.s_addr = server_ip;

    /* set up callback handler */
    ioctl_rt(sock, RTNET_RTIOC_CALLBACK, &callback);

    if (start_timer) {
        rt_set_oneshot_mode();
        start_rt_timer(0);
    }

    rt_task_init(&rt_task,(void *)process,0,4096,10,0,NULL);
    rt_task_make_periodic_relative_ns(&rt_task, 1000000,
                                      (RTIME)interval * 1000000);

    return 0;
}
예제 #6
0
int init_module(void)
{
    int err;

    if( (err = rtf_create(FROM_KERN, 1000)) < 0 ) {
    	printk("rtf_create: %d, errno = %d\n", FROM_KERN, err);
        return err;
    }
    if( (err = rtf_create(TO_KERN, 1000)) < 0 ) {
    	printk("rtf_create: %d, errno = %d\n", TO_KERN, err);
        return err;
    }
    if( (err = rtf_create_handler(TO_KERN, &handler)) ) {
        printk("rtf_create_handler: %d, errno = %d\n", TO_KERN,  err);
        return err;
    }
    rt_mount();
    return 0;
}
예제 #7
0
파일: clock.c 프로젝트: cjecho/RTAI
int init_module(void)
{
	hide = FALSE;
	pause = FALSE;
	rtf_create(Keyboard, 1000);
	rtf_create_handler(Keyboard, keybrd_handler);
	rtf_create(Screen, 10000);
	rt_sem_init(&keybrd_sem, 0);
	rt_task_init_cpuid(&read, ClockChrono_Read, 0, 2000, 0, 0, 0, READ_RUN_ON_CPU);
	rt_task_init_cpuid(&chrono, ClockChrono_Chrono, 0, 2000, 0, 0, 0, CHRONO_RUN_ON_CPU);
	rt_task_init_cpuid(&clock, ClockChrono_Clock, 0, 2000, 0, 0, 0, CLOCK_RUN_ON_CPU);
	rt_task_init_cpuid(&write, ClockChrono_Write, 0, 2000, 0, 0, 0, WRITE_RUN_ON_CPU);
	start_rt_apic_timers(apic_setup_data, 0);
	rt_task_resume(&read);
	rt_task_resume(&chrono);
	rt_task_resume(&clock);
	rt_task_resume(&write);
	return 0;
}
예제 #8
0
파일: latency.c 프로젝트: ArcEye/RTAI
static int
__latency_init(void)
{

	/* XXX check option ranges here */

	/* register a proc entry */
#ifdef CONFIG_PROC_FS
	create_proc_read_entry("rtai/latency_calibrate", /* name             */
	                       0,			 /* default mode     */
	                       NULL, 			 /* parent dir       */
			       proc_read, 		 /* function         */
			       NULL			 /* client data      */
	);
#endif

	rtf_create(DEBUG_FIFO, 16000);	/* create a fifo length: 16000 bytes */
	rt_linux_use_fpu(use_fpu);	/* declare if we use the FPU         */

	rt_task_init(			/* create our measuring task         */
			    &thread,	/* poiter to our RT_TASK             */
			    fun,	/* implementation of the task        */
			    0,		/* we could transfer data -> task    */
			    3000,	/* stack size                        */
			    0,		/* priority                          */
			    use_fpu,	/* do we use the FPU?                */
			    0		/* signal? XXX                       */
	);

	rt_set_runnable_on_cpus(	/* select on which CPUs the task is  */
		&thread,		/* allowed to run                    */
		RUN_ON_CPUS
	);

	/* Test if we have to start the timer                                */
	if (start_timer || (start_timer = !rt_is_hard_timer_running())) {
		if (timer_mode) {
			rt_set_periodic_mode();
		} else {
			rt_set_oneshot_mode();
		}
		rt_assign_irq_to_cpu(TIMER_8254_IRQ, TIMER_TO_CPU);
		period_counts = start_rt_timer(nano2count(period));
	} else {
		period_counts = nano2count(period);
	}

	loops = (1000000000*avrgtime)/period;

	/* Calculate the start time for the task. */
	/* We set this to "now plus 10 periods"   */
	expected = rt_get_time() + 10 * period_counts;
	rt_task_make_periodic(&thread, expected, period_counts);
	return 0;
}
예제 #9
0
int init_module(void)
{
#ifdef CONFIG_X86_LOCAL_APIC
	params.mp        = 1;
#endif /* CONFIG_X86_LOCAL_APIC */
	params.freq_apic = RTAI_FREQ_APIC;
	params.cpu_freq  = RTAI_CPU_FREQ;
	rtf_create(0, FIFOBUFSIZE);
	if ((srq = rt_request_srq(CALSRQ, (void *)user_srq, user_srq)) < 0) {
                printk("No sysrq available for the calibration.\n");
                return srq;
	}
	return 0;
}
예제 #10
0
int init_module(void)
{
    int err, i;

    if( (err = rtf_create(FROM_KERN, 1000)) < 0 ) {
    	printk("rtf_create: %d, errno = %d\n", FROM_KERN, err);
        return err;
    }
    for(i = 0; i < NTASKS; i++) {
        if( (err = rt_task_create(&td[i])) ) {
            return err;
        }
    }
    return 0;
}
예제 #11
0
int init_module(void)
{
	int ret;

	unsigned long local_ip  = rt_inet_aton(local_ip_s);
	unsigned long server_ip = rt_inet_aton(server_ip_s);

	rtf_create(PRINT, 40000);
	rt_sem_init(&tx_sem, 0);

	rt_printk ("local  ip address %s=%8x\n", local_ip_s, (unsigned int) local_ip);
	rt_printk ("server ip address %s=%8x\n", server_ip_s, (unsigned int) server_ip);

	/* create rt-socket */
	sock=rt_socket(AF_INET,SOCK_DGRAM,0);
	
	/* bind the rt-socket to local_addr */	
	memset(&local_addr, 0, sizeof(struct sockaddr_in));
	local_addr.sin_family = AF_INET;
	local_addr.sin_port = htons(RCV_PORT);
	local_addr.sin_addr.s_addr = local_ip;
	ret=rt_socket_bind(sock, (struct sockaddr *) &local_addr, sizeof(struct sockaddr_in));

	/* set server-addr */
	memset(&server_addr, 0, sizeof(struct sockaddr_in));
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(SRV_PORT);
	server_addr.sin_addr.s_addr = server_ip;

	// set up receiving
	rt_socket_callback(sock, echo_rcv, NULL);
	
	rt_set_oneshot_mode();
	start_rt_timer(TIMERTICKS);

        ret=rt_task_init(&rt_task,(void *)process,0,4096,10,0,NULL);

        rt_task_resume(&rt_task);

        rt_request_global_irq(parirq, parport_irq_handler);
        rt_startup_irq(parirq);

        outb(0xFF, PAR_DATA);
        outb(0x14 + KHZ0_1, PAR_CONTROL);

	return ret;
}
예제 #12
0
int init_module(void)
{
	int ret;
	RTIME tick_period;

	unsigned int local_ip  = rt_inet_aton(local_ip_s);
	unsigned int server_ip = rt_inet_aton(server_ip_s);

	if (interval < 1) interval = 1;
	if (interval > 1000) interval = 1000;

	if (packetsize < 1) packetsize = 1;
	if (packetsize > 1400) packetsize = 1400;

	printk ("***** start of rt_client ***** %s %s *****\n", __DATE__, __TIME__);
	printk ("local  ip address %s=%08x\n", local_ip_s, local_ip);
	printk ("server ip address %s=%08x\n", server_ip_s, server_ip);
	printk ("interval = %d\n", interval);
	printk ("packetsize = %d\n", packetsize);

	rtf_create(PRINT, 8000);

	/* create rt-socket */
	sock=rt_socket(AF_INET,SOCK_DGRAM,0);
	
	/* bind the rt-socket to local_addr */	
	memset(&local_addr, 0, sizeof(struct sockaddr_in));
	local_addr.sin_family = AF_INET;
	local_addr.sin_port = htons(RCV_PORT);
	local_addr.sin_addr.s_addr = local_ip;
	ret=rt_socket_bind(sock, (struct sockaddr *) &local_addr, sizeof(struct sockaddr_in));

	/* set server-addr */
	memset(&server_addr, 0, sizeof(struct sockaddr_in));
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(SRV_PORT);
	server_addr.sin_addr.s_addr = server_ip;

	/* set up receiving */
	rt_socket_callback(sock, echo_rcv, NULL);
	
        tick_period = start_rt_timer(nano2count(TICK_PERIOD));
        ret=rt_task_init(&rt_task,(void *)process,0,4096,0,0,NULL);
        ret=rt_task_make_periodic_relative_ns( &rt_task, 1000000, (RTIME) interval * 1000000);
	return 0;
}
예제 #13
0
int init_module(void)
{
	rt_assign_irq_to_cpu(0, 0);
	rtf_create(CMDF, 10000);
	if (Mode) {
		rt_typed_sem_init(&sem, 0, SEM_TYPE);
	}
	rt_task_init_cpuid(&thread, intr_handler, 0, STACK_SIZE, 0, 0, 0, 0);
	rt_task_resume(&thread);
#ifdef IRQEXT
	rt_request_timer((void *)rt_timer_tick_ext, imuldiv(TICK, FREQ_8254, 1000000000), 0);
	rt_set_global_irq_ext(0, 1, 0);
#else
	rt_request_timer((void *)rt_timer_tick, imuldiv(TICK, FREQ_8254, 1000000000), 0);
#endif
	SETUP_8254_TSC_EMULATION;
	return 0;
}
예제 #14
0
static int __preempt_init(void)
{
	RTIME start;

	rtf_create(FIFO, 1000);
	rt_linux_use_fpu(USE_FPU);
	rt_task_init_cpuid(&thread, fun, 0, 5000, 0, USE_FPU, 0, 0);
	rt_task_init_cpuid(&Fast_Task, Fast_Thread, 0, 5000, 1, 0, 0, 0);
	rt_task_init_cpuid(&Slow_Task, Slow_Thread, 0, 5000, 2, 0, 0, 0);
#ifdef ONESHOT_MODE
	rt_set_oneshot_mode();
#endif
	period = start_rt_timer(nano2count(TICK_TIME));
	expected = start = rt_get_time() + 100*period;
	rt_task_make_periodic(&thread, start, period);
	rt_task_make_periodic(&Fast_Task, start, FASTMUL*period);
	rt_task_make_periodic(&Slow_Task, start, SLOWMUL*period);

	return 0;
}
예제 #15
0
int init_module(void)
{
	int ret;

	unsigned long local_ip  = rt_inet_aton(local_ip_s);
	unsigned long broadcast_ip = rt_inet_aton(broadcast_ip_s);

	rtf_create(PRINT, 40000);
	rt_sem_init(&tx_sem, 0);

	rt_printk ("local     ip address %s=%8x\n", local_ip_s, local_ip);
	rt_printk ("broadcast ip address %s=%8x\n", broadcast_ip_s, broadcast_ip);

	/* create rt-socket */
	sock=rt_socket(AF_INET,SOCK_DGRAM,0);
	
	/* bind the rt-socket to local_addr */	
	memset(&local_addr, 0, sizeof(struct sockaddr_in));
	local_addr.sin_family = AF_INET;
	local_addr.sin_port = htons(RCV_PORT);
	local_addr.sin_addr.s_addr = local_ip;
	ret=rt_socket_bind(sock, (struct sockaddr *) &local_addr, sizeof(struct sockaddr_in));

	/* set server-addr */
	memset(&broadcast_addr, 0, sizeof(struct sockaddr_in));
	broadcast_addr.sin_family = AF_INET;
	broadcast_addr.sin_port = htons(SRV_PORT);
	broadcast_addr.sin_addr.s_addr = broadcast_ip;

	// set up receiving
	rt_socket_callback(sock, echo_rcv, NULL);
	
	/* Timer already started by RTmac in oneshot mode. */
	//rt_set_oneshot_mode();
	//start_rt_timer(TIMERTICKS); 

        ret=rt_task_init(&rt_task,(void *)process,0,4096,10,0,NULL);
        ret=rt_task_make_periodic_relative_ns( &rt_task, 10 * 1000*1000, cycle * 1000);

	return ret;
}
예제 #16
0
int init_module(void)
{
    unsigned int add_rtskbs = 30;
    int ret;

    unsigned long local_ip;
    unsigned long server_ip;


    if (strlen(local_ip_s) != 0)
        local_ip = rt_inet_aton(local_ip_s);
    else
        local_ip = INADDR_ANY;
    server_ip = rt_inet_aton(server_ip_s);

    rtf_create(PRINT_FIFO, 40000);
    rt_sem_init(&tx_sem, 0);

    rt_printk("local  ip address %s=%8x\n", local_ip_s, (unsigned int) local_ip);
    rt_printk("server ip address %s=%8x\n", server_ip_s, (unsigned int) server_ip);

    /* create rt-socket */
    rt_printk("create rtsocket\n");
    if ((sock = socket_rt(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
        rt_printk("socket not created\n");
        return sock;
    }

    /* extend the socket pool */
    ret = ioctl_rt(sock, RTNET_RTIOC_EXTPOOL, &add_rtskbs);
    if (ret != (int)add_rtskbs) {
        close_rt(sock);
        rt_printk("ioctl_rt(RTNET_RTIOC_EXTPOOL) = %d\n", ret);
        return -1;
    }

    /* bind the rt-socket to local_addr */
    local_addr.sin_family = AF_INET;
    local_addr.sin_port = htons(RCV_PORT);
    local_addr.sin_addr.s_addr = local_ip;
    if ((ret = bind_rt(sock, (struct sockaddr *)&local_addr,
                       sizeof(struct sockaddr_in))) < 0) {
        close_rt(sock);
        rt_printk("can't bind rtsocket\n");
        return ret;
    }

    /* set server-addr */
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(SRV_PORT);
    server_addr.sin_addr.s_addr = server_ip;

    rt_task_init(&xmit_task,(void *)process,0,4096,10,0,NULL);
    rt_task_resume(&xmit_task);

    rt_task_init(&recv_task,(void *)echo_rcv,0,4096,9,0,NULL);
    rt_task_resume(&recv_task);

    rt_request_global_irq(parirq, parport_irq_handler);
    rt_startup_irq(parirq);

    outb(0xFF, PAR_DATA);
    outb(0x14 + KHZ0_1, PAR_CONTROL);

    return ret;
}
예제 #17
0
int init_module(void)
{
    unsigned int nonblock = 1;
    unsigned int add_rtskbs = 30;
    int ret;

    unsigned long local_ip;
    unsigned long server_ip;


    if (strlen(local_ip_s) != 0)
        local_ip = rt_inet_aton(local_ip_s);
    else
        local_ip = INADDR_ANY;
    server_ip = rt_inet_aton(server_ip_s);

    rtf_create(PRINT_FIFO, 40000);
    rt_sem_init(&tx_sem, 0);

    rt_printk ("local  ip address %s=%8x\n", local_ip_s, (unsigned int) local_ip);
    rt_printk ("server ip address %s=%8x\n", server_ip_s, (unsigned int) server_ip);

    /* create rt-socket */
    rt_printk("create rtsocket\n");
    if ((sock=rt_socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
        rt_printk("socket not created\n");
        return sock;
    }

    /* switch to non-blocking */
    ret = rt_setsockopt(sock, SOL_SOCKET, RT_SO_NONBLOCK, &nonblock, sizeof(nonblock));
    rt_printk("rt_setsockopt(RT_SO_NONBLOCK) = %d\n", ret);

    /* extend the socket pool */
    ret = rt_setsockopt(sock, SOL_SOCKET, RT_SO_EXTPOOL, &add_rtskbs, sizeof(add_rtskbs));
    if (ret != (int)add_rtskbs) {
        rt_socket_close(sock);
        rt_printk("rt_setsockopt(RT_SO_EXTPOOL) = %d\n", ret);
        return -1;
    }

    /* bind the rt-socket to local_addr */
    memset(&local_addr, 0, sizeof(struct sockaddr_in));
    local_addr.sin_family = AF_INET;
    local_addr.sin_port = htons(RCV_PORT);
    local_addr.sin_addr.s_addr = local_ip;
    if ( (ret=rt_socket_bind(sock, (struct sockaddr *) &local_addr, sizeof(struct sockaddr_in)))<0 ) {
        rt_socket_close(sock);
        rt_printk("can't bind rtsocket\n");
        return ret;
    }

    /* set server-addr */
    memset(&server_addr, 0, sizeof(struct sockaddr_in));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(SRV_PORT);
    server_addr.sin_addr.s_addr = server_ip;

    /* set up receiving */
    rt_socket_callback(sock, echo_rcv, NULL);

    ret=rt_task_init(&rt_task,(void *)process,0,4096,10,0,NULL);

    rt_task_resume(&rt_task);

    rt_request_global_irq(parirq, parport_irq_handler);
    rt_startup_irq(parirq);

    outb(0xFF, PAR_DATA);
    outb(0x14 + KHZ0_1, PAR_CONTROL);

    return ret;
}
예제 #18
0
static void *intr_handler(void *args)
{
	RT_TASK *mytask;
	RTIME period;
	int playfifo, cntrfifo;
	char data;
#ifdef U_LAW
	int go=1;
	int divisor = DIVISOR;
#else
	char temp;
#endif
	rt_allow_nonroot_hrt();
	pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);

#ifdef U_LAW
	if (iopl(3)) {
	  printf("iopl() failed/n");
	  exit(1);
	}  
	outb_p(0x92, 0x43); /* binary, mode1, LSB only, ch 2 */
	/* You can make this bigger, but then you start to get
	 * clipping, which sounds bad.  29 is good */

	/* VOLUME SETTING */
	pcsp_calc_vol(70);

	port61 = inb(0x61) | 0x3;
#else
	ioperm(PORT_ADR, 1, 1);
#endif

 	if (!(mytask = rt_task_init_schmod(nam2num("SOUND"), 1, 0, 0, SCHED_FIFO, 0xF))) {
		printf("CANNOT INIT SOUND TASK\n");
		exit(1);
	}
	playfifo = 0;
	cntrfifo = 1;
	rtf_create(playfifo, 8192); /* 1s buffer */
	rtf_reset(playfifo);
	rtf_create(cntrfifo, 1000);
	rtf_reset(cntrfifo);

	rt_set_oneshot_mode();
	start_rt_timer(0);
	period = nano2count(PERIOD);

	printf("\nINIT SOUND TASK\n");

	mlockall(MCL_CURRENT | MCL_FUTURE);
	
#ifdef HARDREALTIME
	rt_make_hard_real_time();
#endif	
	rt_task_make_periodic(mytask, rt_get_time() + 5*period, period);
	rtf_put(cntrfifo, &data, 1);

	rt_sleep(nano2count(100000000));

	while(1) {
#ifdef U_LAW
	  if (!(--divisor)) {
	    divisor = DIVISOR;
	    //cpu_used[hard_cpu_id()]++;
	    if (!(rtf_get(playfifo, &data, 1) > 0)) {
	      go=0;
	    }else{
	      go=1;
	    }
	  }
	  if(go){
	    outb(port61,0x61);
	    outb(port61^1,0x61);
	    outb(vl_tab[((unsigned int)data)&0xff], 0x42);
	  }
#else
	  if (rtf_get(playfifo, &data, 1) > 0) {
	    go=1;
	    data = filter(data);
	    temp = inb(PORT_ADR);            
	    temp &= 0xfd;
	    temp |= (data & 1) << 1;
	    outb(temp, PORT_ADR);
	  } else {
	    go=0;
	  }	
#endif
	  rt_task_wait_period();
	  if (go==0) { 
	  	if (rtf_get(cntrfifo, &data, 1) > 0) {
	    		break;
	    	}		
	  } 
	}
	
	stop_rt_timer();
	rt_make_soft_real_time();
	rtf_destroy(playfifo);
	rtf_destroy(cntrfifo);
	rt_task_delete(mytask);
	printf("\nEND SOUND TASK\n");
	return 0;
}
예제 #19
0
int init_module(void)
{
	int ret;
	RTIME tick_period;
	struct rtsocket *socket;

	unsigned long local_ip  = rt_inet_aton(local_ip_s);
	unsigned long client_ip = rt_inet_aton(client_ip_s);


	rt_printk ("local  ip address %s=%8x\n", local_ip_s, local_ip);
	rt_printk ("client ip address %s=%8x\n", client_ip_s, client_ip);

	/* create rt-socket */
	rt_printk("create rtsocket\n");	
	if ( !(sock=rt_socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) ) {
		rt_printk("socket not created\n");
		return -ENOMEM;
	}
	
	/* bind the rt-socket to local_addr */	
	rt_printk("bind rtsocket to local address:port\n");
	memset(&local_addr, 0, sizeof(struct sockaddr_in));
	local_addr.sin_family = AF_INET;
	local_addr.sin_port = htons(RCV_PORT);
	local_addr.sin_addr.s_addr = local_ip;
	if ( (ret=rt_socket_bind(sock, (struct sockaddr *) &local_addr, sizeof(struct sockaddr_in)))<0 ) {
		rt_printk("can't bind rtsocket\n");
		return ret;
	}
	
	/* set client-addr */
	rt_printk("connect rtsocket to client address:port\n");
	memset(&client_addr, 0, sizeof(struct sockaddr_in));
	client_addr.sin_family = AF_INET;
	client_addr.sin_port = htons(SRV_PORT);
	client_addr.sin_addr.s_addr = client_ip;
	if ( (ret=rt_socket_connect(sock, (struct sockaddr *) &client_addr, sizeof(struct sockaddr_in)))<0 ) {
		rt_printk("can't connect rtsocket\n");
		return ret;
	}

	/* get socket-structure for printing */
	if ( (socket=rt_socket_lookup(sock)) ) {
		rt_printk("src  addr: %x:%x\n", socket->saddr, socket->sport);
		rt_printk("dest addr: %x:%x\n", socket->daddr, socket->dport);
	}

	/* set up receiving */
	rt_socket_callback(sock, echo_rcv, NULL);

	/* initialize semaphore */
	rt_sem_init(&tx_sem, 0);

	/* create print-fifo */
	rtf_create (PRINT, 3000);

	tick_period = start_rt_timer(nano2count(TICK_PERIOD));
	ret=rt_task_init(&rt_task,(void *)process,0,4096,0,0,NULL);
	ret=rt_task_make_periodic_relative_ns( &rt_task, 1000000, 1000000000);

	return ret;
}
예제 #20
0
int logInit (void)
{
#ifdef USER_MODE
#ifndef RTAI
  int i;
#endif
  g_log = calloc(1, sizeof(log_t));

#else
  g_log = kmalloc(sizeof(log_t), GFP_KERNEL);
#endif

  if (g_log == NULL) {
#ifdef USER_MODE
    perror ("cannot allocated memory for log generation module \n");
    exit(EXIT_FAILURE);
#else
    printk("cannot allocated memory for log generation module \n");
    return(-1);
#endif
  }


#if ! defined(CN_BUILD)
  g_log->log_component[PHY].name = "PHY";
  g_log->log_component[PHY].level = LOG_EMERG;
  g_log->log_component[PHY].flag =  LOG_MED;
  g_log->log_component[PHY].interval =  1;
  g_log->log_component[PHY].fd = 0;
  g_log->log_component[PHY].filelog = 0;
  g_log->log_component[PHY].filelog_name = "/tmp/phy.log";

  g_log->log_component[MAC].name = "MAC";
  g_log->log_component[MAC].level = LOG_EMERG;
  g_log->log_component[MAC].flag =  LOG_MED;
  g_log->log_component[MAC].interval =  1;
  g_log->log_component[MAC].fd = 0;
  g_log->log_component[MAC].filelog = 0;
  g_log->log_component[MAC].filelog_name = "/tmp/mac.log";

  g_log->log_component[OPT].name = "OPT";
  g_log->log_component[OPT].level = LOG_EMERG;
  g_log->log_component[OPT].flag = LOG_MED;
  g_log->log_component[OPT].interval =  1;
  g_log->log_component[OPT].fd = 0;
  g_log->log_component[OPT].filelog = 0;
  g_log->log_component[OPT].filelog_name = "";

  g_log->log_component[RLC].name = "RLC";
  g_log->log_component[RLC].level = LOG_INFO;
  g_log->log_component[RLC].flag = LOG_MED;
  g_log->log_component[RLC].interval =  1;
  g_log->log_component[RLC].fd = 0;
  g_log->log_component[RLC].filelog = 0;
  g_log->log_component[RLC].filelog_name = "/tmp/rlc.log";

  g_log->log_component[PDCP].name = "PDCP";
  g_log->log_component[PDCP].level = LOG_INFO;
  g_log->log_component[PDCP].flag = LOG_MED;
  g_log->log_component[PDCP].interval =  1;
  g_log->log_component[PDCP].fd = 0;
  g_log->log_component[PDCP].filelog = 0;
  g_log->log_component[PDCP].filelog_name = "/tmp/pdcp.log";

  g_log->log_component[RRC].name = "RRC";
  g_log->log_component[RRC].level = LOG_TRACE;
  g_log->log_component[RRC].flag = LOG_MED;
  g_log->log_component[RRC].interval =  1;
  g_log->log_component[RRC].fd = 0;
  g_log->log_component[RRC].filelog = 0;
  g_log->log_component[RRC].filelog_name = "/tmp/rrc.log";

  g_log->log_component[EMU].name = "EMU";
  g_log->log_component[EMU].level = LOG_EMERG;
  g_log->log_component[EMU].flag =  LOG_MED;
  g_log->log_component[EMU].interval =  1;
  g_log->log_component[EMU].fd = 0;
  g_log->log_component[EMU].filelog = 0;
  g_log->log_component[EMU].filelog_name = "";

  g_log->log_component[OMG].name = "OMG";
  g_log->log_component[OMG].level = LOG_EMERG;
  g_log->log_component[OMG].flag =  LOG_MED;
  g_log->log_component[OMG].interval =  1;
  g_log->log_component[OMG].fd = 0;
  g_log->log_component[OMG].filelog = 0;
  g_log->log_component[OMG].filelog_name = "/tmp/omg.csv";

  g_log->log_component[OTG].name = "OTG";
  g_log->log_component[OTG].level = LOG_EMERG;
  g_log->log_component[OTG].flag =  LOG_MED;
  g_log->log_component[OTG].interval =  1;
  g_log->log_component[OTG].fd = 0;
  g_log->log_component[OTG].filelog = 0;
  g_log->log_component[OTG].filelog_name = "/tmp/otg.log";

  g_log->log_component[OTG_LATENCY].name = "OTG_LATENCY";
  g_log->log_component[OTG_LATENCY].level = LOG_EMERG;
  g_log->log_component[OTG_LATENCY].flag =  LOG_MED;
  g_log->log_component[OTG_LATENCY].interval =  1;
  g_log->log_component[OTG_LATENCY].fd = 0;
  g_log->log_component[OTG_LATENCY].filelog = 0;
  g_log->log_component[OTG_LATENCY].filelog_name = "/tmp/otg_latency.dat";

  g_log->log_component[OTG_LATENCY_BG].name = "OTG_LATENCY_BG";
  g_log->log_component[OTG_LATENCY_BG].level = LOG_EMERG;
  g_log->log_component[OTG_LATENCY_BG].flag =  LOG_MED;
  g_log->log_component[OTG_LATENCY_BG].interval =  1;
  g_log->log_component[OTG_LATENCY_BG].fd = 0;
  g_log->log_component[OTG_LATENCY_BG].filelog = 0;
  g_log->log_component[OTG_LATENCY_BG].filelog_name = "/tmp/otg_latency_bg.dat";

  g_log->log_component[OTG_GP].name = "OTG_GP";
  g_log->log_component[OTG_GP].level = LOG_EMERG;
  g_log->log_component[OTG_GP].flag =  LOG_MED;
  g_log->log_component[OTG_GP].interval =  1;
  g_log->log_component[OTG_GP].fd = 0;
  g_log->log_component[OTG_GP].filelog = 0;
  g_log->log_component[OTG_GP].filelog_name = "/tmp/otg_goodput.dat";

  g_log->log_component[OTG_GP_BG].name = "OTG_GP_BG";
  g_log->log_component[OTG_GP_BG].level = LOG_EMERG;
  g_log->log_component[OTG_GP_BG].flag =  LOG_MED;
  g_log->log_component[OTG_GP_BG].interval =  1;
  g_log->log_component[OTG_GP_BG].fd = 0;
  g_log->log_component[OTG_GP_BG].filelog = 0;
  g_log->log_component[OTG_GP_BG].filelog_name = "/tmp/otg_goodput_bg.dat";

  g_log->log_component[OTG_JITTER].name = "OTG_JITTER";
  g_log->log_component[OTG_JITTER].level = LOG_EMERG;
  g_log->log_component[OTG_JITTER].flag =  LOG_MED;
  g_log->log_component[OTG_JITTER].interval =  1;
  g_log->log_component[OTG_JITTER].fd = 0;
  g_log->log_component[OTG_JITTER].filelog = 0;
  g_log->log_component[OTG_JITTER].filelog_name = "/tmp/otg_jitter.dat";

  g_log->log_component[OCG].name = "OCG";
  g_log->log_component[OCG].level = LOG_EMERG;
  g_log->log_component[OCG].flag =  LOG_MED;
  g_log->log_component[OCG].interval =  1;
  g_log->log_component[OCG].fd = 0;
  g_log->log_component[OCG].filelog = 0;
  g_log->log_component[OCG].filelog_name = "";

  g_log->log_component[PERF].name = "PERF";
  g_log->log_component[PERF].level = LOG_EMERG;
  g_log->log_component[PERF].flag =  LOG_MED;
  g_log->log_component[PERF].interval =  1;
  g_log->log_component[PERF].fd = 0;
  g_log->log_component[PERF].filelog = 0;
  g_log->log_component[PERF].filelog_name = "";

  g_log->log_component[OIP].name = "OIP";
  g_log->log_component[OIP].level = LOG_EMERG;
  g_log->log_component[OIP].flag =  LOG_MED;
  g_log->log_component[OIP].interval =  1;
  g_log->log_component[OIP].fd = 0;
  g_log->log_component[OIP].filelog = 0;
  g_log->log_component[OIP].filelog_name = "";

  g_log->log_component[CLI].name = "CLI";
  g_log->log_component[CLI].level = LOG_EMERG;
  g_log->log_component[CLI].flag =  LOG_MED;
  g_log->log_component[CLI].interval =  1;
  g_log->log_component[CLI].fd = 0;
  g_log->log_component[CLI].filelog =  0;
  g_log->log_component[CLI].filelog_name = "";

  g_log->log_component[MSC].name = "MSC";
  g_log->log_component[MSC].level = LOG_EMERG;
  g_log->log_component[MSC].flag =  LOG_MED;
  g_log->log_component[MSC].interval =  1;
  g_log->log_component[MSC].fd = 0;
  g_log->log_component[MSC].filelog =  0;
  g_log->log_component[MSC].filelog_name = "/tmp/msc.log";

  g_log->log_component[OCM].name = "OCM";
  g_log->log_component[OCM].level = LOG_EMERG;
  g_log->log_component[OCM].flag =  LOG_MED;
  g_log->log_component[OCM].interval =  1;
  g_log->log_component[OCM].fd = 0;
  g_log->log_component[OCM].filelog =  0;
  g_log->log_component[OCM].filelog_name = "/tmp/ocm.log";

  g_log->log_component[HW].name = "HW";
  g_log->log_component[HW].level = LOG_EMERG;
  g_log->log_component[HW].flag = LOG_MED;
  g_log->log_component[HW].interval = 1;
  g_log->log_component[HW].fd = 0;
  g_log->log_component[HW].filelog = 0;
  g_log->log_component[HW].filelog_name = "";

  g_log->log_component[OSA].name = "OSA";
  g_log->log_component[OSA].level = LOG_EMERG;
  g_log->log_component[OSA].flag = LOG_MED;
  g_log->log_component[OSA].interval = 1;
  g_log->log_component[OSA].fd = 0;
  g_log->log_component[OSA].filelog = 0;
  g_log->log_component[OSA].filelog_name = "";

  g_log->log_component[RAL_ENB].name = "eRAL";
  g_log->log_component[RAL_ENB].level = LOG_EMERG;
  g_log->log_component[RAL_ENB].flag = LOG_MED;
  g_log->log_component[RAL_ENB].interval = 1;
  g_log->log_component[RAL_ENB].fd = 0;
  g_log->log_component[RAL_ENB].filelog = 0;
  g_log->log_component[RAL_ENB].filelog_name = "";

  g_log->log_component[RAL_UE].name = "mRAL";
  g_log->log_component[RAL_UE].level = LOG_EMERG;
  g_log->log_component[RAL_UE].flag = LOG_MED;
  g_log->log_component[RAL_UE].interval = 1;
  g_log->log_component[RAL_UE].fd = 0;
  g_log->log_component[RAL_UE].filelog = 0;
  g_log->log_component[RAL_UE].filelog_name = "";

  g_log->log_component[ENB_APP].name = "ENB_APP";
  g_log->log_component[ENB_APP].level = LOG_EMERG;
  g_log->log_component[ENB_APP].flag = LOG_MED;
  g_log->log_component[ENB_APP].interval = 1;
  g_log->log_component[ENB_APP].fd = 0;
  g_log->log_component[ENB_APP].filelog = 0;
  g_log->log_component[ENB_APP].filelog_name = "";

  g_log->log_component[FLEXRAN_AGENT].name = "FLEXRAN_AGENT";
  g_log->log_component[FLEXRAN_AGENT].level = LOG_DEBUG;
  g_log->log_component[FLEXRAN_AGENT].flag = LOG_MED;
  g_log->log_component[FLEXRAN_AGENT].interval = 1;
  g_log->log_component[FLEXRAN_AGENT].fd = 0;
  g_log->log_component[FLEXRAN_AGENT].filelog = 0;
  g_log->log_component[FLEXRAN_AGENT].filelog_name = "";
  
  g_log->log_component[TMR].name = "TMR";
  g_log->log_component[TMR].level = LOG_EMERG;
  g_log->log_component[TMR].flag = LOG_MED;
  g_log->log_component[TMR].interval = 1;
  g_log->log_component[TMR].fd = 0;
  g_log->log_component[TMR].filelog = 0;
  g_log->log_component[TMR].filelog_name = "";

  g_log->log_component[USIM].name = "USIM";
  g_log->log_component[USIM].level = LOG_DEBUG;
  g_log->log_component[USIM].flag = LOG_NONE;
  g_log->log_component[USIM].interval = 1;
  g_log->log_component[USIM].fd = 0;
  g_log->log_component[USIM].filelog = 0;
  g_log->log_component[USIM].filelog_name = "/tmp/usim.txt";

  /* following log component are used for the localization*/
  g_log->log_component[LOCALIZE].name = "LOCALIZE";
  g_log->log_component[LOCALIZE].level = LOG_EMERG;
  g_log->log_component[LOCALIZE].flag =  LOG_MED;
  g_log->log_component[LOCALIZE].interval =  1;
  g_log->log_component[LOCALIZE].fd = 0;
  g_log->log_component[LOCALIZE].filelog = 0;
  g_log->log_component[LOCALIZE].filelog_name = "/tmp/localize.log";
#endif // ! defined(CN_BUILD)

  g_log->log_component[NAS].name = "NAS";
  g_log->log_component[NAS].level = LOG_TRACE;
  g_log->log_component[NAS].flag = LOG_MED;
  g_log->log_component[NAS].interval =  1;
  g_log->log_component[NAS].fd = 0;
  g_log->log_component[NAS].filelog = 0;
  g_log->log_component[NAS].filelog_name = "/tmp/nas.log";

  g_log->log_component[UDP_].name = "UDP";
  g_log->log_component[UDP_].level = LOG_EMERG;
  g_log->log_component[UDP_].flag = LOG_FULL;
  g_log->log_component[UDP_].interval = 1;
  g_log->log_component[UDP_].fd = 0;
  g_log->log_component[UDP_].filelog = 0;
  g_log->log_component[UDP_].filelog_name = "";

  g_log->log_component[GTPU].name = "GTPV1U";
  g_log->log_component[GTPU].level = LOG_EMERG;
  g_log->log_component[GTPU].flag = LOG_FULL;
  g_log->log_component[GTPU].interval = 1;
  g_log->log_component[GTPU].fd = 0;
  g_log->log_component[GTPU].filelog = 0;
  g_log->log_component[GTPU].filelog_name = "";

  g_log->log_component[S1AP].name = "S1AP";
  g_log->log_component[S1AP].level = LOG_EMERG;
  g_log->log_component[S1AP].flag = LOG_FULL;
  g_log->log_component[S1AP].interval = 1;
  g_log->log_component[S1AP].fd = 0;
  g_log->log_component[S1AP].filelog = 0;
  g_log->log_component[S1AP].filelog_name = "";

  g_log->log_component[SCTP].name = "SCTP";
  g_log->log_component[SCTP].level = LOG_EMERG;
  g_log->log_component[SCTP].flag = LOG_MED;
  g_log->log_component[SCTP].interval = 1;
  g_log->log_component[SCTP].fd = 0;
  g_log->log_component[SCTP].filelog = 0;
  g_log->log_component[SCTP].filelog_name = "";
 
  g_log->log_component[RRH].name = "RRH";
  g_log->log_component[RRH].level = LOG_EMERG;
  g_log->log_component[RRH].flag = LOG_MED;
  g_log->log_component[RRH].interval = 1;
  g_log->log_component[RRH].fd = 0;
  g_log->log_component[RRH].filelog = 0;
  g_log->log_component[RRH].filelog_name = "";
  
  g_log->level2string[LOG_EMERG]         = "G"; //EMERG
  g_log->level2string[LOG_ALERT]         = "A"; // ALERT
  g_log->level2string[LOG_CRIT]          = "C"; // CRITIC
  g_log->level2string[LOG_ERR]           = "E"; // ERROR
  g_log->level2string[LOG_WARNING]       = "W"; // WARNING
  g_log->level2string[LOG_NOTICE]        = "N"; // NOTICE
  g_log->level2string[LOG_INFO]          = "I"; //INFO
  g_log->level2string[LOG_DEBUG]         = "D"; // DEBUG
  g_log->level2string[LOG_FILE]          = "F"; // file
  g_log->level2string[LOG_TRACE]         = "T"; // TRACE

  g_log->onlinelog = 1; //online log file
  g_log->syslog = 0;
  g_log->filelog   = 0;
  g_log->level  = LOG_TRACE;
  g_log->flag   = LOG_LOW;

#ifndef RTAI
  g_log->config.remote_ip      = 0;
  g_log->config.remote_level   = LOG_EMERG;
  g_log->config.facility       = LOG_LOCAL7;
  g_log->config.audit_ip       = 0;
  g_log->config.audit_facility = LOG_LOCAL6;
  g_log->config.format         = 0x00; // online debug inactive

  g_log->filelog_name = "/tmp/openair.log";

  if (g_log->syslog) {
#if ! defined(CN_BUILD)
    openlog(g_log->log_component[EMU].name, LOG_PID, g_log->config.facility);
#endif // ! defined(CN_BUILD)
  }

  if (g_log->filelog) {
    gfd = open(g_log->filelog_name, O_WRONLY | O_CREAT, 0666);
  }

  // could put a loop here to check for all comps
  for (i=MIN_LOG_COMPONENTS; i < MAX_LOG_COMPONENTS; i++) {
    if (g_log->log_component[i].filelog == 1 ) {
      g_log->log_component[i].fd = open(g_log->log_component[i].filelog_name,
                                        O_WRONLY | O_CREAT | O_APPEND, 0666);
    }
  }

#else
  g_log->syslog = 0;
  g_log->filelog   = 0;
  rtf_create (FIFO_PRINTF_NO, FIFO_PRINTF_SIZE);
#endif

#ifdef USER_MODE
  printf("log init done\n");
#else
  printk("log init done\n");
#endif

  return 0;
}
예제 #21
0
int main(int argc, char **argv) {

#ifdef RTAI
  RT_TASK *task;
  RTIME period;
#endif
  int i,j,aa;
  void *status;

  /*
  uint32_t rf_mode_max[4]     = {55759,55759,55759,55759};
  uint32_t rf_mode_med[4]     = {39375,39375,39375,39375};
  uint32_t rf_mode_byp[4]     = {22991,22991,22991,22991};
  */
  uint32_t my_rf_mode = RXEN + TXEN + TXLPFNORM + TXLPFEN + TXLPF25 + RXLPFNORM + RXLPFEN + RXLPF25 + LNA1ON +LNAMax + RFBBNORM + DMAMODE_RX + DMAMODE_TX;
  uint32_t rf_mode_base = TXLPFNORM + TXLPFEN + TXLPF25 + RXLPFNORM + RXLPFEN + RXLPF25 + LNA1ON +LNAMax + RFBBNORM;
  uint32_t rf_mode[4]     = {my_rf_mode,0,0,0};
  uint32_t rf_local[4]    = {8255000,8255000,8255000,8255000}; // UE zepto
    //{8254617, 8254617, 8254617, 8254617}; //eNB khalifa
    //{8255067,8254810,8257340,8257340}; // eNB PETRONAS

  uint32_t rf_vcocal[4]   = {910,910,910,910};
  uint32_t rf_vcocal_850[4] = {2015, 2015, 2015, 2015};
  uint32_t rf_rxdc[4]     = {32896,32896,32896,32896};
  uint32_t rxgain[4]      = {20,20,20,20};
  uint32_t txgain[4]      = {20,20,20,20};

  uint16_t Nid_cell = 0;
  uint8_t  cooperation_flag=0, transmission_mode=1, abstraction_flag=0;
  uint8_t beta_ACK=0,beta_RI=0,beta_CQI=2;

  int c;
  char do_forms=0;
  unsigned int fd;
  unsigned int tcxo = 114;

  int amp;
  uint8_t prach_fmt;
  int N_ZC;

  char rxg_fname[100];
  char txg_fname[100];
  char rflo_fname[100];
  char rfdc_fname[100];
  FILE *rxg_fd=NULL;
  FILE *txg_fd=NULL;
  FILE *rflo_fd=NULL;
  FILE *rfdc_fd=NULL;
  unsigned int rxg_max[4]={133,133,133,133}, rxg_med[4]={127,127,127,127}, rxg_byp[4]={120,120,120,120};
  int tx_max_power=0;

  char line[1000];
  int l;
  int ret, ant;
  int ant_offset=0;

  int error_code;
  char *itti_dump_file = NULL;

  const struct option long_options[] = {
    {"calib-ue-rx", required_argument, NULL, 256},
    {"calib-ue-rx-med", required_argument, NULL, 257},
    {"calib-ue-rx-byp", required_argument, NULL, 258},
    {"debug-ue-prach", no_argument, NULL, 259},
    {"no-L2-connect", no_argument, NULL, 260},
    {NULL, 0, NULL, 0}};

  //mode = normal_txrx;


  while ((c = getopt_long (argc, argv, "C:K:O:ST:UdF:V",long_options,NULL)) != -1)
    {
      switch (c)
        {
	case 'V':
          ouput_vcd = 1;
	  break;
        case 'd':
          do_forms=1;
          break;
        case 'U':
          UE_flag = 1;
          break;
        case 'C':
          carrier_freq[0] = atoi(optarg);
          carrier_freq[1] = atoi(optarg);
          carrier_freq[2] = atoi(optarg);
          carrier_freq[3] = atoi(optarg);
          break;
        case 'S':
          fs4_test=1;
          break;
        case 'T':
          tcxo=atoi(optarg);
          break;
        case 'K':
#if defined(ENABLE_ITTI)
          itti_dump_file = strdup(optarg);
#else
          printf("-K option is disabled when ENABLE_ITTI is not defined\n");
#endif
          break;
        case 'O':
#if defined(ENABLE_USE_MME)
          EPC_MODE_ENABLED = 1;
          if (optarg == NULL) /* No IP address provided: use localhost */
          {
            memcpy(&EPC_MODE_MME_ADDRESS[0], "127.0.0.1", 10);
          } else {
            uint8_t ip_length = strlen(optarg) + 1;
            memcpy(&EPC_MODE_MME_ADDRESS[0], optarg,
            ip_length > 16 ? 16 : ip_length);
          }
#else
          printf("You enabled mme mode without s1ap compiled...\n");
#endif
          break;
	case 'F':
	  sprintf(rxg_fname,"%srxg.lime",optarg);
	  rxg_fd = fopen(rxg_fname,"r");
	  if (rxg_fd) {
	    printf("Loading RX Gain parameters from %s\n",rxg_fname);
	    l=0;
	    while (fgets(line, sizeof(line), rxg_fd)) {
	      if ((strlen(line)==0) || (*line == '#')) continue; //ignore empty or comment lines
	      else {
		if (l==0) sscanf(line,"%d %d %d %d",&rxg_max[0],&rxg_max[1],&rxg_max[2],&rxg_max[3]);
		if (l==1) sscanf(line,"%d %d %d %d",&rxg_med[0],&rxg_med[1],&rxg_med[2],&rxg_med[3]);
		if (l==2) sscanf(line,"%d %d %d %d",&rxg_byp[0],&rxg_byp[1],&rxg_byp[2],&rxg_byp[3]);
		l++;
	      }
	    }
	  }
	  else 
	    printf("%s not found, running with defaults\n",rxg_fname);

	  sprintf(txg_fname,"%stxg.lime",optarg);
	  txg_fd = fopen(txg_fname,"r");
	  if (txg_fd) {
	    printf("Loading TX Gain parameters from %s\n",txg_fname);
	    l=0;
	    while (fgets(line, sizeof(line), txg_fd)) {
	      if ((strlen(line)==0) || (*line == '#')) {
		continue; //ignore empty or comment lines
	      }
	      else {
		if (l==0) sscanf(line,"%d %d %d %d",&txgain[0],&txgain[1],&txgain[2],&txgain[3]);
		if (l==1) sscanf(line,"%d",&tx_max_power);
		l++;
	      }
	    }
	  }
	  else 
	    printf("%s not found, running with defaults\n",txg_fname);

	  sprintf(rflo_fname,"%srflo.lime",optarg);
	  rflo_fd = fopen(rflo_fname,"r");
	  if (rflo_fd) {
	    printf("Loading RF LO parameters from %s\n",rflo_fname);
	    fscanf(rflo_fd,"%d %d %d %d",&rf_local[0],&rf_local[1],&rf_local[2],&rf_local[3]);
	  }
	  else 
	    printf("%s not found, running with defaults\n",rflo_fname);

	  sprintf(rfdc_fname,"%srfdc.lime",optarg);
	  rfdc_fd = fopen(rfdc_fname,"r");
	  if (rfdc_fd) {
	    printf("Loading RF DC parameters from %s\n",rfdc_fname);
	    fscanf(rfdc_fd,"%d %d %d %d",&rf_rxdc[0],&rf_rxdc[1],&rf_rxdc[2],&rf_rxdc[3]);
	  }
	  else 
	    printf("%s not found, running with defaults\n",rfdc_fname);

	  break;
	  /*
	case 256:
	  mode = rx_calib_ue;
	  rx_input_level_dBm = atoi(optarg);
	  printf("Running with UE calibration on (LNA max), input level %d dBm\n",rx_input_level_dBm);
	  break;
	case 257:
	  mode = rx_calib_ue_med;
	  rx_input_level_dBm = atoi(optarg);
	  printf("Running with UE calibration on (LNA med), input level %d dBm\n",rx_input_level_dBm);
	  break;
	case 258:
	  mode = rx_calib_ue_byp;
	  rx_input_level_dBm = atoi(optarg);
	  printf("Running with UE calibration on (LNA byp), input level %d dBm\n",rx_input_level_dBm);
	  break;
	case 259:
	  mode = debug_prach;
	  break;
	case 260:
	  mode = no_L2_connect;
	  break;
	  */
        default:
          break;
        }
    }

  if (UE_flag==1)
    printf("configuring for UE\n");
  else
    printf("configuring for eNB\n");

  //randominit (0);
  //set_taus_seed (0);

  // initialize the log (see log.h for details)
  logInit();

#if defined(ENABLE_ITTI)
  itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info, messages_definition_xml, itti_dump_file);

# if defined(ENABLE_USE_MME)
  if (itti_create_task(TASK_SCTP, sctp_eNB_task, NULL) < 0) {
    LOG_E(EMU, "Create task failed");
    LOG_D(EMU, "Initializing SCTP task interface: FAILED\n");
    return -1;
  }
  if (itti_create_task(TASK_S1AP, s1ap_eNB_task, NULL) < 0) {
    LOG_E(EMU, "Create task failed");
    LOG_D(EMU, "Initializing S1AP task interface: FAILED\n");
    return -1;
  }
# endif

  if (itti_create_task(TASK_L2L1, l2l1_task, NULL) < 0) {
      LOG_E(EMU, "Create task failed");
      LOG_D(EMU, "Initializing L2L1 task interface: FAILED\n");
      return -1;
  }

  // Handle signals until all tasks are terminated
//   itti_wait_tasks_end();
#endif

  if (ouput_vcd) {
    if (UE_flag==1)
      vcd_signal_dumper_init("/tmp/openair_dump_UE.vcd");
    else
      vcd_signal_dumper_init("/tmp/openair_dump_eNB.vcd");
  }

#ifdef NAS_NETLINK
  netlink_init();
#endif

  // to make a graceful exit when ctrl-c is pressed
  signal(SIGSEGV, signal_handler);
  signal(SIGINT, signal_handler);

#ifndef RTAI
  check_clock();
#endif

    g_log->log_component[HW].level = LOG_DEBUG;
    g_log->log_component[HW].flag  = LOG_HIGH;
#ifdef OPENAIR2
    g_log->log_component[PHY].level = LOG_INFO;
#else
    g_log->log_component[PHY].level = LOG_INFO;
#endif
    g_log->log_component[PHY].flag  = LOG_HIGH;
    g_log->log_component[MAC].level = LOG_INFO;
    g_log->log_component[MAC].flag  = LOG_HIGH;
    g_log->log_component[RLC].level = LOG_INFO;
    g_log->log_component[RLC].flag  = LOG_HIGH;
    g_log->log_component[PDCP].level = LOG_INFO;
    g_log->log_component[PDCP].flag  = LOG_HIGH;
    g_log->log_component[OTG].level = LOG_INFO;
    g_log->log_component[OTG].flag  = LOG_HIGH;
    g_log->log_component[RRC].level = LOG_INFO;
    g_log->log_component[RRC].flag  = LOG_HIGH;


  // Initialize card
  ret = openair0_open();
  if ( ret != 0 ) {
          if (ret == -1)
              printf("Error opening /dev/openair0");
          if (ret == -2)
              printf("Error mapping bigshm");
          if (ret == -3)
              printf("Error mapping RX or TX buffer");
          return(ret);
     }

  printf ("Detected %d number of cards, %d number of antennas.\n", openair0_num_detected_cards, openair0_num_antennas[card]);
  
  p_exmimo_config = openair0_exmimo_pci[card].exmimo_config_ptr;
  p_exmimo_id     = openair0_exmimo_pci[card].exmimo_id_ptr;
  
  printf("Card %d: ExpressMIMO %d, HW Rev %d, SW Rev 0x%d\n", card, p_exmimo_id->board_exmimoversion, p_exmimo_id->board_hwrev, p_exmimo_id->board_swrev);

  if (p_exmimo_id->board_swrev>=BOARD_SWREV_CNTL2)
    p_exmimo_config->framing.eNB_flag   = 0; 
  else 
    p_exmimo_config->framing.eNB_flag   = !UE_flag;

  p_exmimo_config->framing.tdd_config = DUPLEXMODE_FDD + TXRXSWITCH_LSB;
  for (ant=0; ant<4; ant++) 
    p_exmimo_config->framing.resampling_factor[ant] = RESAMPLING_FACTOR;
 
  /*
  for (ant=0;ant<max(frame_parms->nb_antennas_tx,frame_parms->nb_antennas_rx);ant++) 
    p_exmimo_config->rf.rf_mode[ant] = rf_mode_base;
  for (ant=0;ant<frame_parms->nb_antennas_tx;ant++)
    p_exmimo_config->rf.rf_mode[ant] += (TXEN + DMAMODE_TX);
  for (ant=0;ant<frame_parms->nb_antennas_rx;ant++)
    p_exmimo_config->rf.rf_mode[ant] += (RXEN + DMAMODE_RX);
  for (ant=max(frame_parms->nb_antennas_tx,frame_parms->nb_antennas_rx);ant<4;ant++) {
    p_exmimo_config->rf.rf_mode[ant] = 0;
    carrier_freq[ant] = 0; //this turns off all other LIMEs
  }
  */

  ant_offset = 0;
  for (ant=0; ant<4; ant++) {
    if (ant==ant_offset) {
      //if (1) {
      p_exmimo_config->rf.rf_mode[ant] = rf_mode_base;
      //p_exmimo_config->rf.rf_mode[ant] += (TXEN + DMAMODE_TX);
      p_exmimo_config->rf.rf_mode[ant] += (RXEN + DMAMODE_RX);
    }
    else {
      p_exmimo_config->rf.rf_mode[ant] = 0;
      carrier_freq[ant] = 0; //this turns off all other LIMEs
    }
  }

  for (ant = 0; ant<4; ant++) { 
    p_exmimo_config->rf.do_autocal[ant] = 1;
    p_exmimo_config->rf.rf_freq_rx[ant] = carrier_freq[ant];
    p_exmimo_config->rf.rf_freq_tx[ant] = carrier_freq[ant];
    p_exmimo_config->rf.rx_gain[ant][0] = rxgain[ant];
    p_exmimo_config->rf.tx_gain[ant][0] = txgain[ant];
    
    p_exmimo_config->rf.rf_local[ant]   = rf_local[ant];
    p_exmimo_config->rf.rf_rxdc[ant]    = rf_rxdc[ant];

    if ((carrier_freq[ant] >= 850000000) && (carrier_freq[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 ((carrier_freq[ant] >= 1900000000) && (carrier_freq[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;	    
    }

    p_exmimo_config->rf.rffe_gain_txlow[ant] = 31;
    p_exmimo_config->rf.rffe_gain_txhigh[ant] = 31;
    p_exmimo_config->rf.rffe_gain_rxfinal[ant] = 52;
    p_exmimo_config->rf.rffe_gain_rxlow[ant] = 31;
  }


    number_of_cards = openair0_num_detected_cards;
    /*
    if (p_exmimo_id->board_exmimoversion==1) //ExpressMIMO1
      openair_daq_vars.timing_advance = 138;
    else //ExpressMIMO2
      openair_daq_vars.timing_advance = 0;
    */

  openair0_dump_config(card);

  printf("EXMIMO_CONFIG: rf_mode 0x %x %x %x %x, [0]: TXRXEn %d, TXLPFEn %d, TXLPF %d, RXLPFEn %d, RXLPF %d, RFBB %d, LNA %d, LNAGain %d, RXLPFMode %d, SWITCH %d, rf_rxdc %d, rf_local %d, rf_vcocal %d\n",  
	 p_exmimo_config->rf.rf_mode[0],
	 p_exmimo_config->rf.rf_mode[1],
	 p_exmimo_config->rf.rf_mode[2],
	 p_exmimo_config->rf.rf_mode[3],
	 (p_exmimo_config->rf.rf_mode[0]&3),  // RXen+TXen
	 (p_exmimo_config->rf.rf_mode[0]&4)>>2,         //TXLPFen
	 (p_exmimo_config->rf.rf_mode[0]&TXLPFMASK)>>3, //TXLPF
	 (p_exmimo_config->rf.rf_mode[0]&128)>>7,      //RXLPFen
	 (p_exmimo_config->rf.rf_mode[0]&RXLPFMASK)>>8, //TXLPF
	 (p_exmimo_config->rf.rf_mode[0]&RFBBMASK)>>16, // RFBB mode
	 (p_exmimo_config->rf.rf_mode[0]&LNAMASK)>>12, // RFBB mode
	 (p_exmimo_config->rf.rf_mode[0]&LNAGAINMASK)>>14, // RFBB mode
	 (p_exmimo_config->rf.rf_mode[0]&RXLPFMODEMASK)>>19, // RXLPF mode
	 (p_exmimo_config->framing.tdd_config&TXRXSWITCH_MASK)>>1, // Switch mode
	 p_exmimo_config->rf.rf_rxdc[0],
	 p_exmimo_config->rf.rf_local[0],
	 p_exmimo_config->rf.rf_vcocal[0]);
  
  for (ant=0;ant<4;ant++)
    p_exmimo_config->rf.do_autocal[ant] = 0;

#ifdef EMOS
  error_code = rtf_create(CHANSOUNDER_FIFO_MINOR,CHANSOUNDER_FIFO_SIZE);
  if (error_code==0)
    printf("[OPENAIR][SCHED][INIT] Created EMOS FIFO %d\n",CHANSOUNDER_FIFO_MINOR);
  else if (error_code==ENODEV)
    printf("[OPENAIR][SCHED][INIT] Problem: EMOS FIFO %d is greater than or equal to RTF_NO\n",CHANSOUNDER_FIFO_MINOR);
  else if (error_code==ENOMEM)
    printf("[OPENAIR][SCHED][INIT] Problem: cannot allocate memory for EMOS FIFO %d\n",CHANSOUNDER_FIFO_MINOR);
  else 
    printf("[OPENAIR][SCHED][INIT] Problem creating EMOS FIFO %d, error_code %d\n",CHANSOUNDER_FIFO_MINOR,error_code);
#endif

  mlockall(MCL_CURRENT | MCL_FUTURE);

#ifdef RTAI
  // make main thread LXRT soft realtime
  task = rt_task_init_schmod(nam2num("MYTASK"), 9, 0, 0, SCHED_FIFO, 0xF);

  // start realtime timer and scheduler
#ifdef TIMER_ONESHOT_MODE
  rt_set_oneshot_mode();
  start_rt_timer(0);
  printf("started RTAI timer inoneshot mode\n");
#else
  rt_set_periodic_mode();
  period = start_rt_timer(nano2count(500000));
  printf("started RTAI timer with period %llu ns\n",count2nano(period));
#endif

  printf("Init mutex\n");
  //mutex = rt_get_adr(nam2num("MUTEX"));
  mutex = rt_sem_init(nam2num("MUTEX"), 1);
  if (mutex==0)
    {
      printf("Error init mutex\n");
      exit(-1);
    }
  else
    printf("mutex=%p\n",mutex);
#endif

  DAQ_MBOX = (volatile unsigned int *) openair0_exmimo_pci[card].rxcnt_ptr[0];

  // this starts the DMA transfers
  if (UE_flag!=1)
      openair0_start_rt_acquisition(card);


#ifdef XFORMS
  if (do_forms==1) {
      fl_initialize (&argc, argv, NULL, 0, 0);
      form_stats = create_form_stats_form();
      if (UE_flag==1) {
          form_ue[UE_id] = create_lte_phy_scope_ue();
          sprintf (title, "LTE DL SCOPE UE");
          fl_show_form (form_ue[UE_id]->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
      } else {
            for(UE_id=0;UE_id<scope_enb_num_ue;UE_id++) {
                form_enb[UE_id] = create_lte_phy_scope_enb();
                sprintf (title, "UE%d LTE UL SCOPE eNB",UE_id+1);
                fl_show_form (form_enb[UE_id]->lte_phy_scope_enb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
            }
      }
      fl_show_form (form_stats->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "stats");
      if (UE_flag==0) {
          for (UE_id=0;UE_id<scope_enb_num_ue;UE_id++) {
              if (otg_enabled) {
                  fl_set_button(form_enb[UE_id]->button_0,1);
                  fl_set_object_label(form_enb[UE_id]->button_0,"DL Traffic ON");
              }
              else {
                  fl_set_button(form_enb[UE_id]->button_0,0);
                  fl_set_object_label(form_enb[UE_id]->button_0,"DL Traffic OFF");
              }
          }
      }
      else {
          if (openair_daq_vars.use_ia_receiver) {
              fl_set_button(form_ue[UE_id]->button_0,1);
              fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver ON");
          }
          else {
              fl_set_button(form_ue[UE_id]->button_0,0);
              fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver OFF");
          }
      }

      ret = pthread_create(&thread2, NULL, scope_thread, NULL);
      printf("Scope thread created, ret=%d\n",ret);
    }
#endif

#ifdef EMOS
  ret = pthread_create(&thread3, NULL, emos_thread, NULL);
  printf("EMOS thread created, ret=%d\n",ret);
#endif

  rt_sleep_ns(10*FRAME_PERIOD);

#ifndef RTAI
  pthread_attr_init (&attr_dlsch_threads);
  pthread_attr_setstacksize(&attr_dlsch_threads,OPENAIR_THREAD_STACK_SIZE);
  //attr_dlsch_threads.priority = 1;
  sched_param_dlsch.sched_priority = sched_get_priority_max(SCHED_FIFO); //OPENAIR_THREAD_PRIORITY;
  pthread_attr_setschedparam  (&attr_dlsch_threads, &sched_param_dlsch);
  pthread_attr_setschedpolicy (&attr_dlsch_threads, SCHED_FIFO);
#endif

  // start the main thread
  if (UE_flag == 1) {
    /*
#ifdef RTAI
    thread1 = rt_thread_create(UE_thread, NULL, 100000000);
#else
    error_code = pthread_create(&thread1, &attr_dlsch_threads, UE_thread, NULL);
    if (error_code!= 0) {
      LOG_D(HW,"[lte-softmodem.c] Could not allocate UE_thread, error %d\n",error_code);
      return(error_code);
    }
    else {
      LOG_D(HW,"[lte-softmodem.c] Allocate UE_thread successful\n");
    }
#endif
#ifdef DLSCH_THREAD
    init_rx_pdsch_thread();
    rt_sleep_ns(FRAME_PERIOD/10);
    init_dlsch_threads();
#endif
    printf("UE threads created\n");
    */
  }
  else {
#ifdef RTAI
    thread0 = rt_thread_create(eNB_thread, NULL, 100000000);
#else
    error_code = pthread_create(&thread0, &attr_dlsch_threads, eNB_thread, NULL);
    if (error_code!= 0) {
      LOG_D(HW,"[lte-softmodem.c] Could not allocate eNB_thread, error %d\n",error_code);
      return(error_code);
    }
    else {
      LOG_D(HW,"[lte-softmodem.c] Allocate eNB_thread successful\n");
    }
#endif
#ifdef ULSCH_THREAD
    init_ulsch_threads();
#endif
    printf("eNB threads created\n");
  }


  // wait for end of program
  printf("TYPE <CTRL-C> TO TERMINATE\n");
  //getchar();
  while (oai_exit==0)
    rt_sleep_ns(FRAME_PERIOD);

  // stop threads
#ifdef XFORMS
  printf("waiting for XFORMS thread\n");
  if (do_forms==1)
    {
      pthread_join(thread2,&status);
        fl_hide_form(form_stats->stats_form);
        fl_free_form(form_stats->stats_form);
        if (UE_flag==1) {
            fl_hide_form(form_ue[UE_id]->lte_phy_scope_ue);
            fl_free_form(form_ue[UE_id]->lte_phy_scope_ue);
        } else {
            for(UE_id=0;UE_id<scope_enb_num_ue;UE_id++) {
                fl_hide_form(form_enb[UE_id]->lte_phy_scope_enb);
                fl_free_form(form_enb[UE_id]->lte_phy_scope_enb);
            }
        }
    }
#endif

  printf("stopping MODEM threads\n");
  // cleanup
  if (UE_flag == 1) {
    /*
#ifdef RTAI
    rt_thread_join(thread1); 
#else
    pthread_join(thread1,&status); 
#endif
#ifdef DLSCH_THREAD
    cleanup_dlsch_threads();
    cleanup_rx_pdsch_thread();
#endif
    */
  }
  else {
#ifdef RTAI
    rt_thread_join(thread0); 
#else
    pthread_join(thread0,&status); 
#endif
#ifdef ULSCH_THREAD
    cleanup_ulsch_threads();
#endif
  }

#ifdef OPENAIR2
  //cleanup_pdcp_thread();
#endif

#ifdef RTAI
  stop_rt_timer();
#endif

  printf("stopping card\n");
  openair0_stop(card);
  printf("closing openair0_lib\n");
  openair0_close();

#ifdef EMOS
  printf("waiting for EMOS thread\n");
  pthread_cancel(thread3);
  pthread_join(thread3,&status);
#endif

#ifdef EMOS
  error_code = rtf_destroy(CHANSOUNDER_FIFO_MINOR);
  printf("[OPENAIR][SCHED][CLEANUP] EMOS FIFO closed, error_code %d\n", error_code);
#endif

  if (ouput_vcd)
    vcd_signal_dumper_close();

  logClean();

  return 0;
}