示例#1
0
int __init rtcfg_init_frames(void)
{
    int ret;


    if (rtskb_pool_init(&rtcfg_pool, num_rtskbs) < num_rtskbs)
        return -ENOMEM;

    rtskb_queue_init(&rx_queue);
    rtdm_event_init(&rx_event, 0);

    ret = rtdm_task_init(&rx_task, "rtcfg-rx", rtcfg_rx_task, 0,
                         RTDM_TASK_LOWEST_PRIORITY, 0);
    if (ret < 0) {
        rtdm_event_destroy(&rx_event);
        goto error1;
    }

    ret = rtdev_add_pack(&rtcfg_packet_type);
    if (ret < 0)
        goto error2;

    return 0;

  error2:
    rtdm_event_destroy(&rx_event);
    rtdm_task_join_nrt(&rx_task, 100);

  error1:
    rtskb_pool_release(&rtcfg_pool);

    return ret;
}
示例#2
0
int demo_open_rt(struct rtdm_dev_context    *context,
                 rtdm_user_info_t           *user_info,
                 int                        oflags)
{
    struct demodrv_context  *my_context;
#ifdef USEMMAP
    unsigned long vaddr;
#endif
    int dev_id = context->device->device_id;
    int ret;
    
    // get the context for our driver - used to store driver info
    my_context = (struct demodrv_context *)context->dev_private;

#ifdef USEMMAP
    // allocate and prepare memory for our buffer
    my_context->buf = kmalloc(BUFFER_SIZE, GFP_KERNEL);
    /* mark pages reserved so that remap_pfn_range works */
    for (vaddr = (unsigned long)my_context->buf;
         vaddr < (unsigned long)my_context->buf + BUFFER_SIZE;
         vaddr += PAGE_SIZE)
        SetPageReserved(virt_to_page(vaddr));
    // write some test value to the start of our buffer
    *(int *)my_context->buf = 1234;

    my_context->mapped_user_addr = NULL;
#endif

    // we also have an interrupt handler:
#ifdef TIMERINT
    ret = rtdm_irq_request(&my_context->irq_handle, TIMER_INT, demo_interrupt,
                 0, context->device->proc_name, my_context);
#else
    ret = rtdm_irq_request(&my_context->irq_handle, PAR_INT, demo_interrupt,
                 0, context->device->proc_name, my_context);
#endif
    if (ret < 0)
        return ret;

    /* IPC initialisation - cannot fail with used parameters */
    rtdm_lock_init(&my_context->lock);
    rtdm_event_init(&my_context->irq_event, 0);
    my_context->dev_id         = dev_id;

    my_context->irq_events     = 0;
    my_context->irq_event_lock = 0;
    my_context->timeout = 0; // wait INFINITE

#ifndef TIMERINT
    //set port to interrupt mode; pins are output
    outb_p(0x10, BASEPORT + 2);
#endif
    // enable interrupt in RTDM
    rtdm_irq_enable(&my_context->irq_handle);
    return 0;
}
示例#3
0
static int rtdmtest_open(struct rtdm_dev_context *context,
			 rtdm_user_info_t *user_info, int oflags)
{
	struct rtdmtest_context *ctx;

	ctx = (struct rtdmtest_context *)context->dev_private;

	ctx->event.state = 0;
	rtdm_event_init(&ctx->event, 0);
	rtdm_sem_init(&ctx->sem, 0);
	rtdm_lock_count = 0;
	rtdm_mutex_init(&ctx->mutex);
	init_MUTEX(&ctx->nrt_mutex);
	if (rtdm_nrtsig_init(&ctx->nrtsig, rtdmtest_nrtsig_handler)) {
	    printk("rtdm_nrtsig_init failed\n");
	    return -EINVAL;
	}

	return 0;
}
示例#4
0
static int rtswitch_register_task(rtswitch_context_t *ctx,
                                  struct rttst_swtest_task *arg)
{
	rtswitch_task_t *t;

	down(&ctx->lock);

	if (ctx->next_index == ctx->tasks_count) {
		up(&ctx->lock);
		return -EBUSY;
	}

	arg->index = ctx->next_index;
	t = &ctx->tasks[arg->index];
	ctx->next_index++;
	t->base = *arg;
	sema_init(&t->nrt_synch, 0);
	rtdm_event_init(&t->rt_synch, 0);

	up(&ctx->lock);

	return 0;
}
示例#5
0
static int uart_open_nrt(struct rtdm_dev_context *context,rtdm_user_info_t *user_info_t,int oflags_t)
{
	MY_DEV *up=(MY_DEV *)context->device->device_data;
//	rtdm_lockctx_t context1;	
	int retval;
	
	printk("Local struct up=%x\n",up);

	f_cir_buf(up);

	rtdm_lock_init(&up->lock);
	rtdm_event_init(&up->w_event_tx,0);
	rtdm_event_init(&up->w_event_rx,0);
	
	printk("name of irq=%s\n",up->name);

	retval = request_irq(up->irq, serial_omap_irq,0, up->name, up);
//	if (retval)
//		return retval;
	
	retval=rtdm_irq_request(&up->irq_handle,up->irq,rtdm_my_isr,0,up->name,up);
	if(retval<0) 
	{
	 rtdm_printk("error in requesting irq\n");
         dev_err(up->dev, "failure requesting irq %i\n", up->irq);
	return retval;
	}

	dev_dbg(up->dev, "serial_omap_startup+%d\n", up->line);
	
	serial_omap_clear_fifos(up);
	serial_out(up,UART_MCR,UART_MCR_RTS);
	
	(void)serial_in(up,UART_LSR);
	
	if(serial_in(up,UART_LSR) & UART_LSR_DR)
		(void)serial_in(up,UART_RX);
	
	(void)serial_in(up,UART_IIR);
	(void)serial_in(up,UART_MSR);
	
	/*
	 * Now, initialize the UART
	 */
	serial_out(up, UART_LCR, UART_LCR_WLEN8);
	printk("UART has word length of 8 bit\n");
	
	up->msr_saved_flags=0;
	
	//enabling interrupts
	up->ier = UART_IER_RLSI | UART_IER_RDI;
	serial_out(up,UART_IER,up->ier);
	
	printk("enabling RLSI and RDI interrupt\n");
	
	//enable module level wake up
	serial_out(up,UART_OMAP_WER,OMAP_UART_WER_MOD_WKUP);
	
	printk("OMAP_UART_WER_MOD_WKUP\n");
//	up->port_activity=jiffies;

        return 0;
}