Lines Matching refs:uart
164 static void uart_deinit(struct uart_vdev *uart);
178 rxfifo_reset(struct uart_vdev *uart, int size) in rxfifo_reset() argument
182 if (size > uart->rxfifo_size) in rxfifo_reset()
183 size = uart->rxfifo_size; in rxfifo_reset()
185 fifo = &uart->rxfifo; in rxfifo_reset()
191 uart_reset_backend(&uart->be); in rxfifo_reset()
195 rxfifo_available(struct uart_vdev *uart) in rxfifo_available() argument
199 fifo = &uart->rxfifo; in rxfifo_available()
204 rxfifo_putchar(struct uart_vdev *uart, uint8_t ch) in rxfifo_putchar() argument
208 fifo = &uart->rxfifo; in rxfifo_putchar()
214 if (!rxfifo_available(uart)) in rxfifo_putchar()
215 uart_enable_backend(&uart->be, false); in rxfifo_putchar()
222 rxfifo_getchar(struct uart_vdev *uart) in rxfifo_getchar() argument
228 fifo = &uart->rxfifo; in rxfifo_getchar()
230 if (!rxfifo_available(uart)) in rxfifo_getchar()
236 uart_enable_backend(&uart->be, true); in rxfifo_getchar()
243 rxfifo_numchars(struct uart_vdev *uart) in rxfifo_numchars() argument
245 struct fifo *fifo = &uart->rxfifo; in rxfifo_numchars()
253 struct uart_vdev *uart = param; in uart_mevent_teardown() local
256 if (!uart) in uart_mevent_teardown()
259 be = &uart->be; in uart_mevent_teardown()
289 uart_deinit(uart); in uart_mevent_teardown()
331 uart_intr_reason(struct uart_vdev *uart) in uart_intr_reason() argument
333 if ((uart->lsr & LSR_OE) != 0 && (uart->ier & IER_ERLS) != 0) in uart_intr_reason()
335 else if (rxfifo_numchars(uart) > 0 && (uart->ier & IER_ERXRDY) != 0) in uart_intr_reason()
337 else if (uart->thre_int_pending && (uart->ier & IER_ETXRDY) != 0) in uart_intr_reason()
339 else if ((uart->msr & MSR_DELTA_MASK) != 0 && in uart_intr_reason()
340 (uart->ier & IER_EMSC) != 0) in uart_intr_reason()
351 uart_toggle_intr(struct uart_vdev *uart) in uart_toggle_intr() argument
355 intr_reason = uart_intr_reason(uart); in uart_toggle_intr()
358 (*uart->intr_deassert)(uart->arg); in uart_toggle_intr()
360 (*uart->intr_assert)(uart->arg); in uart_toggle_intr()
364 uart_reset(struct uart_vdev *uart) in uart_reset() argument
369 uart->dll = divisor; in uart_reset()
370 uart->dlh = divisor >> 16; in uart_reset()
371 uart->msr = modem_status(uart->mcr); in uart_reset()
373 rxfifo_reset(uart, 1); /* no fifo until enabled by software */ in uart_reset()
376 uart->ier = 0; in uart_reset()
377 uart->thre_int_pending = true; in uart_reset()
378 uart_toggle_intr(uart); in uart_reset()
384 struct uart_vdev *uart; in uart_drain() local
387 uart = arg; in uart_drain()
394 pthread_mutex_lock(&uart->mtx); in uart_drain()
396 if ((uart->mcr & MCR_LOOPBACK) != 0) { in uart_drain()
397 (void) uart_backend_read(&uart->be); in uart_drain()
400 while (rxfifo_available(uart) && (ch = uart_backend_read(&uart->be)) != -1) in uart_drain()
401 rxfifo_putchar(uart, ch); in uart_drain()
403 uart_toggle_intr(uart); in uart_drain()
406 pthread_mutex_unlock(&uart->mtx); in uart_drain()
410 uart_write(struct uart_vdev *uart, int offset, uint8_t value) in uart_write() argument
415 pthread_mutex_lock(&uart->mtx); in uart_write()
420 if ((uart->lcr & LCR_DLAB) != 0) { in uart_write()
422 uart->dll = value; in uart_write()
427 uart->dlh = value; in uart_write()
435 uart->thre_int_pending = false; in uart_write()
436 uart_toggle_intr(uart); in uart_write()
437 if (uart->mcr & MCR_LOOPBACK) { in uart_write()
438 if (rxfifo_putchar(uart, value) != 0) in uart_write()
439 uart->lsr |= LSR_OE; in uart_write()
441 uart_backend_write(&uart->be, value); in uart_write()
445 uart->thre_int_pending = true; in uart_write()
448 if (((uart->ier & IER_ETXRDY) == 0) && in uart_write()
450 uart->thre_int_pending = true; in uart_write()
455 uart->ier = value & 0x0F; in uart_write()
462 if ((uart->fcr & FCR_ENABLE) ^ (value & FCR_ENABLE)) { in uart_write()
463 fifosz = (value & FCR_ENABLE) ? uart->rxfifo_size : 1; in uart_write()
464 rxfifo_reset(uart, fifosz); in uart_write()
472 uart->fcr = 0; in uart_write()
475 rxfifo_reset(uart, uart->rxfifo_size); in uart_write()
477 uart->fcr = value & in uart_write()
482 uart->lcr = value; in uart_write()
486 uart->mcr = value & 0x1F; in uart_write()
487 msr = modem_status(uart->mcr); in uart_write()
494 if ((msr & MSR_CTS) ^ (uart->msr & MSR_CTS)) in uart_write()
495 uart->msr |= MSR_DCTS; in uart_write()
496 if ((msr & MSR_DSR) ^ (uart->msr & MSR_DSR)) in uart_write()
497 uart->msr |= MSR_DDSR; in uart_write()
498 if ((msr & MSR_DCD) ^ (uart->msr & MSR_DCD)) in uart_write()
499 uart->msr |= MSR_DDCD; in uart_write()
500 if ((uart->msr & MSR_RI) != 0 && (msr & MSR_RI) == 0) in uart_write()
501 uart->msr |= MSR_TERI; in uart_write()
507 uart->msr &= MSR_DELTA_MASK; in uart_write()
508 uart->msr |= msr; in uart_write()
522 uart->scr = value; in uart_write()
529 uart_toggle_intr(uart); in uart_write()
530 pthread_mutex_unlock(&uart->mtx); in uart_write()
534 uart_read(struct uart_vdev *uart, int offset) in uart_read() argument
538 pthread_mutex_lock(&uart->mtx); in uart_read()
543 if ((uart->lcr & LCR_DLAB) != 0) { in uart_read()
545 reg = uart->dll; in uart_read()
550 reg = uart->dlh; in uart_read()
557 reg = rxfifo_getchar(uart); in uart_read()
560 reg = uart->ier; in uart_read()
563 iir = (uart->fcr & FCR_ENABLE) ? IIR_FIFO_MASK : 0; in uart_read()
565 intr_reason = uart_intr_reason(uart); in uart_read()
571 uart->thre_int_pending = false; in uart_read()
578 reg = uart->lcr; in uart_read()
581 reg = uart->mcr; in uart_read()
585 uart->lsr |= LSR_TEMT | LSR_THRE; in uart_read()
588 if (rxfifo_numchars(uart) > 0) in uart_read()
589 uart->lsr |= LSR_RXRDY; in uart_read()
591 uart->lsr &= ~LSR_RXRDY; in uart_read()
593 reg = uart->lsr; in uart_read()
596 uart->lsr &= ~LSR_OE; in uart_read()
602 reg = uart->msr; in uart_read()
603 uart->msr &= ~MSR_DELTA_MASK; in uart_read()
606 reg = uart->scr; in uart_read()
614 uart_toggle_intr(uart); in uart_read()
615 pthread_mutex_unlock(&uart->mtx); in uart_read()
655 struct uart_vdev *uart; in uart_init() local
657 uart = calloc(1, sizeof(struct uart_vdev) + rxfifo_size); in uart_init()
658 if (uart) { in uart_init()
659 uart->arg = arg; in uart_init()
660 uart->rxfifo_size = rxfifo_size; in uart_init()
661 uart->intr_assert = intr_assert; in uart_init()
662 uart->intr_deassert = intr_deassert; in uart_init()
663 uart->rxfifo.buf = (uint8_t *)(uart + 1); in uart_init()
665 pthread_mutex_init(&uart->mtx, NULL); in uart_init()
667 uart_reset(uart); in uart_init()
670 return uart; in uart_init()
674 uart_deinit(struct uart_vdev *uart) in uart_deinit() argument
676 if (uart) in uart_deinit()
677 free(uart); in uart_deinit()
685 struct uart_vdev *uart = (struct uart_vdev *)arg; in uart_sock_accept() local
688 s = accept(uart->be.fd, NULL, NULL); in uart_sock_accept()
694 if (uart->be.opened) { in uart_sock_accept()
703 uart->be.opened = true; in uart_sock_accept()
704 uart->be.fd2 = s; in uart_sock_accept()
705 uart->be.evp2 = mevent_add(s, EVF_READ, uart_drain, uart, in uart_sock_accept()
706 uart_mevent_teardown, uart); in uart_sock_accept()
707 if (!uart->be.evp2) in uart_sock_accept()
921 uart_config_backend(struct uart_vdev *uart, struct uart_backend *be, long port) in uart_config_backend() argument
955 be->evp = mevent_add(fd, EVF_READ, uart_drain, uart, in uart_config_backend()
956 uart_mevent_teardown, uart); in uart_config_backend()
984 be->evp = mevent_add(fd, EVF_READ, uart_sock_accept, uart, NULL, NULL); in uart_config_backend()
1002 struct uart_vdev *uart; in uart_set_backend() local
1011 uart = uart_init(intr_assert, intr_deassert, arg, in uart_set_backend()
1013 return uart; in uart_set_backend()
1038 uart = uart_init(intr_assert, intr_deassert, arg, rxfifo_size); in uart_set_backend()
1039 if (!uart) in uart_set_backend()
1042 be = &uart->be; in uart_set_backend()
1050 if (uart_config_backend(uart, be, port) < 0) { in uart_set_backend()
1055 return uart; in uart_set_backend()
1072 uart_mevent_teardown(uart); in uart_set_backend()
1076 uart_deinit(uart); in uart_set_backend()
1083 uart_release_backend(struct uart_vdev *uart, const char *opts) in uart_release_backend() argument
1087 if (uart == NULL) in uart_release_backend()
1090 be = &uart->be; in uart_release_backend()
1100 uart_deinit(uart); in uart_release_backend()
1117 uart_mevent_teardown(uart); in uart_release_backend()
1122 uart_mevent_teardown(uart); in uart_release_backend()