kernel: tty: support for printing newlines
This commit is contained in:
@@ -1,12 +1,58 @@
|
||||
#include <socks/tty.h>
|
||||
#include <socks/printk.h>
|
||||
|
||||
static void putchar(struct device *tty, int c)
|
||||
static void newline(struct device *tty)
|
||||
{
|
||||
struct tty_device *ttydev = TTY_DEVICE(tty);
|
||||
struct tty_driver *tty_driver = TTY_DRIVER(tty->dev_owner);
|
||||
struct tty_driver_ops *ops = tty_driver->tty_ops;
|
||||
|
||||
ttydev->tty_xcur = 0;
|
||||
ttydev->tty_ycur++;
|
||||
|
||||
if (ttydev->tty_ycur >= ttydev->tty_ycells) {
|
||||
ttydev->tty_xcur = 0;
|
||||
ttydev->tty_ycur = ttydev->tty_ycells - 1;
|
||||
|
||||
if (ops->tty_scroll) {
|
||||
ops->tty_scroll(tty, TTY_SCROLL_DOWN, 1);
|
||||
}
|
||||
}
|
||||
|
||||
ops->tty_move_cursor(tty, ttydev->tty_xcur, ttydev->tty_ycur);
|
||||
}
|
||||
|
||||
static void __putchar(struct device *tty, int c)
|
||||
{
|
||||
struct tty_device *ttydev = TTY_DEVICE(tty);
|
||||
struct tty_driver *tty_driver = TTY_DRIVER(tty->dev_owner);
|
||||
struct tty_driver_ops *ops = tty_driver->tty_ops;
|
||||
|
||||
ops->tty_putc(tty, c, ttydev->tty_xcur, ttydev->tty_ycur, ttydev->tty_curattrib);
|
||||
ttydev->tty_xcur++;
|
||||
|
||||
if (ttydev->tty_xcur >= ttydev->tty_xcells) {
|
||||
ttydev->tty_xcur = 0;
|
||||
ttydev->tty_ycur++;
|
||||
}
|
||||
|
||||
if (ttydev->tty_ycur >= ttydev->tty_ycells) {
|
||||
ttydev->tty_xcur = 0;
|
||||
ttydev->tty_ycur = ttydev->tty_ycells - 1;
|
||||
|
||||
if (ops->tty_scroll) {
|
||||
ops->tty_scroll(tty, TTY_SCROLL_DOWN, 1);
|
||||
}
|
||||
}
|
||||
|
||||
ops->tty_move_cursor(tty, ttydev->tty_xcur, ttydev->tty_ycur);
|
||||
}
|
||||
|
||||
static void putchar(struct device *tty, int c)
|
||||
{
|
||||
struct tty_driver *tty_driver = TTY_DRIVER(tty->dev_owner);
|
||||
struct tty_driver_ops *ops = tty_driver->tty_ops;
|
||||
|
||||
if (!ops->tty_putc) {
|
||||
return;
|
||||
}
|
||||
@@ -16,24 +62,14 @@ static void putchar(struct device *tty, int c)
|
||||
return;
|
||||
}
|
||||
|
||||
ops->tty_putc(tty, c, ttydev->tty_xcur, ttydev->tty_ycur, ttydev->tty_curattrib);
|
||||
ttydev->tty_xcur++;
|
||||
|
||||
if (ttydev->tty_xcur >= ttydev->tty_xcells) {
|
||||
ttydev->tty_xcur = 0;
|
||||
ttydev->tty_ycur++;
|
||||
switch (c) {
|
||||
case '\n':
|
||||
newline(tty);
|
||||
break;
|
||||
default:
|
||||
__putchar(tty, c);
|
||||
break;
|
||||
}
|
||||
|
||||
if (ttydev->tty_ycur >= ttydev->tty_ycells) {
|
||||
if (ops->tty_scroll) {
|
||||
ops->tty_scroll(tty, TTY_SCROLL_DOWN, 1);
|
||||
} else {
|
||||
ttydev->tty_xcur = 0;
|
||||
ttydev->tty_ycur = 0;
|
||||
}
|
||||
}
|
||||
|
||||
ops->tty_move_cursor(tty, ttydev->tty_xcur, ttydev->tty_ycur);
|
||||
}
|
||||
|
||||
kern_status_t tty_read(struct device *tty, void *buf, size_t max, size_t *nr_read, socks_flags_t flags)
|
||||
|
||||
Reference in New Issue
Block a user