kernel: tty: implement tty input using line disciplines
This commit is contained in:
@@ -25,6 +25,10 @@ extern size_t ringbuffer_avail(struct ringbuffer *buf);
|
||||
extern size_t ringbuffer_read(struct ringbuffer *buf, size_t size, void *buffer, socks_flags_t flags);
|
||||
extern size_t ringbuffer_write(struct ringbuffer *buf, size_t size, const void *buffer, socks_flags_t flags);
|
||||
|
||||
/* TODO */
|
||||
//extern size_t ringbuffer_peek(struct ringbuffer *buf, size_t at, size_t size, void *buffer);
|
||||
//extern size_t ringbuffer_skip(struct ringbuffer *buf, size_t count);
|
||||
|
||||
extern int ringbuffer_write_would_block(struct ringbuffer *buf);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
#define TTY_DEVICE(dev) ((dev)->dev_type == DEV_TYPE_CHAR ? (dev)->chr.c_tty : NULL)
|
||||
#define TTY_DRIVER(drv) ((struct tty_driver *)((char *)drv - offsetof(struct tty_driver, tty_base)))
|
||||
|
||||
#define TTY_EVENT_QUEUE_SIZE 4
|
||||
#define TTY_INPUT_QUEUE_SIZE 256
|
||||
|
||||
struct kext;
|
||||
|
||||
/* The TTY system.
|
||||
@@ -56,6 +59,13 @@ enum tty_scroll_dir {
|
||||
TTY_SCROLL_UP,
|
||||
};
|
||||
|
||||
enum tty_modifier_key {
|
||||
TTY_KEY_OTHER = 0x00u,
|
||||
TTY_KEY_CTRL = 0x01u,
|
||||
TTY_KEY_ALT = 0x02u,
|
||||
TTY_KEY_SHIFT = 0x04u,
|
||||
};
|
||||
|
||||
/* character attribute. this could be as simple as VGA's 16-colour palette
|
||||
plus an extra bit for bright, or a full 24-bit RGB value with bold and underline
|
||||
support, depending on what the driver supports. */
|
||||
@@ -81,19 +91,35 @@ struct tty_driver {
|
||||
struct tty_driver_ops *tty_ops;
|
||||
};
|
||||
|
||||
struct tty_ldisc {
|
||||
char name[OBJECT_NAME_MAX];
|
||||
void(*process_events)(struct device *);
|
||||
};
|
||||
|
||||
struct tty_device {
|
||||
unsigned int tty_xcells, tty_ycells;
|
||||
unsigned int tty_xcur, tty_ycur;
|
||||
unsigned int tty_iflag, tty_oflag, tty_lflag;
|
||||
tty_attrib_t tty_curattrib;
|
||||
|
||||
enum tty_modifier_key tty_modstate;
|
||||
|
||||
struct tty_ldisc *tty_ldisc;
|
||||
|
||||
/* raw input events sent to the TTY */
|
||||
struct ringbuffer tty_events;
|
||||
/* input characters processed from tty_events, returned by tty_read() */
|
||||
struct ringbuffer tty_input;
|
||||
};
|
||||
|
||||
extern kern_status_t tty_bootstrap(void);
|
||||
extern struct tty_ldisc *tty_default_line_discipline(void);
|
||||
|
||||
extern struct device *tty_device_create(void);
|
||||
extern kern_status_t tty_device_register(struct device *dev, struct tty_driver *owner, struct device *parent);
|
||||
|
||||
extern void tty_set_printk_output(struct device *tty);
|
||||
extern void tty_set_foreground(struct device *tty);
|
||||
extern kern_status_t tty_connect_foreground_input_device(struct device *input);
|
||||
|
||||
extern struct tty_driver *tty_driver_create(struct kext *self, const char *name);
|
||||
extern kern_status_t tty_driver_destroy(struct tty_driver *drv);
|
||||
@@ -106,6 +132,7 @@ static inline struct driver *tty_driver_base(struct tty_driver *drv)
|
||||
|
||||
extern kern_status_t tty_read(struct device *tty, void *buf, size_t max, size_t *nr_read, socks_flags_t flags);
|
||||
extern kern_status_t tty_write(struct device *tty, const void *buf, size_t len, size_t *nr_written, socks_flags_t flags);
|
||||
extern kern_status_t tty_report_event(struct device *tty, const struct input_event *ev);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user