void dev_pic32_uart_cb (void *opaque) { struct pic32_uart_data *d = (struct pic32_uart_data *) opaque; d->output = 0; if (d->mode & PIC32_UMODE_ON) { /* UART enabled. */ if ((d->sta & PIC32_USTA_URXEN) && vtty_is_char_avail (d->vtty)) { /* Receive data available */ d->sta |= PIC32_USTA_URXDA; /* Activate receive interrupt. */ d->vm->set_irq (d->vm, d->irq + IRQ_RX); vp_mod_timer (d->uart_timer, vp_get_clock (rt_clock) + UART_TIME_OUT); return; } if ((d->sta & PIC32_USTA_UTXEN) && (d->output == 0)) { /* Activate transmit interrupt. */ d->output = TRUE; d->vm->set_irq (d->vm, d->irq + IRQ_TX); vp_mod_timer (d->uart_timer, vp_get_clock (rt_clock) + UART_TIME_OUT); return; } } vp_mod_timer (d->uart_timer, vp_get_clock (rt_clock) + UART_TIME_OUT); }
int dev_pic32_uart_init (vm_instance_t *vm, char *name, unsigned paddr, unsigned irq, vtty_t *vtty) { struct pic32_uart_data *d; /* allocate the private data structure */ d = malloc (sizeof (*d)); if (!d) { fprintf (stderr, "PIC32 UART: unable to create device.\n"); return (-1); } memset (d, 0, sizeof (*d)); d->dev = dev_create (name); if (!d->dev) { free (d); return (-1); } d->dev->priv_data = d; d->dev->phys_addr = paddr; d->dev->phys_len = UART_REG_SIZE; d->dev->flags = VDEVICE_FLAG_NO_MTS_MMAP; d->vm = vm; (*d).vtty = vtty; d->irq = irq; vtty->priv_data = d; d->dev->handler = dev_pic32_uart_access; d->dev->reset_handler = dev_pic32_uart_reset; (*d).vtty->read_notifier = pic32_tty_con_input; d->uart_timer = vp_new_timer (rt_clock, dev_pic32_uart_cb, d); vp_mod_timer (d->uart_timer, vp_get_clock (rt_clock) + UART_TIME_OUT); vm_bind_device (vm, d->dev); return (0); }
void dev_jz4740_active_ts(struct jz4740_ts_data *d) { vp_mod_timer(d->ts_timer, vp_get_clock(rt_clock) + TS_TIMEOUT); }