uart->cntl_save.rie = 0;
uart->base_addr = base_addr;
+ uart->base_clk = 115200U;
return uart;
}
case SERIO_RXDA:
uart_clrie(uart);
break;
- case SERIO_SETBRDIV:
- // TODO
- break;
+ case SERIO_SETBRDRATE:
+ {
+ unsigned int div, rate;
+
+ rate = va_arg(args, speed_t);
+ if (!rate) {
+ return EINVAL;
+ }
+
+ div = uart->base_clk / va_arg(args, speed_t);
+ uart_baud_divisor(uart, div);
+ break;
+ }
+ case SERIO_SETBRDBASE:
+ {
+ int clk = va_arg(args, unsigned int);
+ if (!clk) {
+ return EINVAL;
+ }
+
+ uart->base_clk = clk;
+ break;
+ }
case SERIO_SETCNTRLMODE:
uart_set_control_mode(uart, va_arg(args, tcflag_t));
break;
}
void
-uart_handle_irq_overlap(int iv, struct llist_header* ports)
+uart_handle_irq_overlap(irq_t irq, struct llist_header* ports)
{
struct uart16550 *pos, *n;
llist_for_each(pos, n, ports, local_ports)
{
int is = uart_intr_identify(pos);
- if (iv == pos->iv && (is == UART_CHR_TIMEOUT)) {
+ if (irq == pos->irq && (is == UART_CHR_TIMEOUT)) {
goto done;
}
}
return;
done:
- uart_handle_irq(iv, pos);
+ uart_handle_irq(irq, pos);
}
void
-uart_handle_irq(int iv, struct uart16550 *uart)
+uart_handle_irq(irq_t irq, struct uart16550 *uart)
{
char tmpbuf[32];
char recv;