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; }
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; }
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; }
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; }
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; }