X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/8b8f49b713d64065775fe538232f8639083601bd..refs/heads/arm64-irq-premerge:/lunaix-os/includes/hal/term.h diff --git a/lunaix-os/includes/hal/term.h b/lunaix-os/includes/hal/term.h index 79f8f67..be7abd0 100644 --- a/lunaix-os/includes/hal/term.h +++ b/lunaix-os/includes/hal/term.h @@ -2,49 +2,87 @@ #define __LUNAIX_TERM_H #include +#include +#include +#include + +#include struct term; -struct term_lcntl +struct linebuffer { - struct llist_header lcntls; - size_t (*apply)(struct term* termdev, char* line, size_t len); + struct rbuffer* next; + struct rbuffer* current; + short sflags; + short sz_hlf; }; +#define LEVT_EOL (1) +#define LEVT_EOF (1 << 1) +#define LEVT_SIGRAISE (1 << 2) -struct linebuffer +typedef struct rbuffer** lbuf_ref_t; +#define ref_current(lbuf) (&(lbuf)->current) +#define ref_next(lbuf) (&(lbuf)->next) +#define deref(bref) (*(bref)) + +struct term; + +struct termport_pot_ops { - char* current; - char* next; - size_t sz_hlf; - off_t ptr; + void (*set_speed)(struct device*, speed_t); + void (*set_clkbase)(struct device*, unsigned int); + void (*set_cntrl_mode)(struct device*, tcflag_t); +}; + +struct termport_potens +{ + POTENS_META; + struct termport_pot_ops* ops; + struct term* term; }; struct term { struct device* dev; struct device* chdev; - struct llist_header lcntl_stack; - struct linebuffer line; + struct linebuffer line_out; + struct linebuffer line_in; + char* scratch_pad; pid_t fggrp; -}; -struct term* -term_create(); + struct termport_potens* tp_cap; + waitq_t line_in_event; -int -term_bind(struct term* tdev, struct device* chdev); + /* -- POSIX.1-2008 compliant fields -- */ + tcflag_t iflags; + tcflag_t oflags; + tcflag_t lflags; + tcflag_t cflags; + cc_t cc[_NCCS]; -int -term_push_lcntl(struct term* tdev, struct term_lcntl* lcntl); + /* -- END POSIX.1-2008 compliant fields -- */ + speed_t iospeed; + speed_t clkbase; + tcflag_t tflags; // temp flags +}; -int -term_pop_lcntl(struct term* tdev); +extern struct device* sysconsole; -struct term_lcntl* -term_get_lcntl(u32_t lcntl_index); +struct termport_potens* +term_attach_potens(struct device* chardev, + struct termport_pot_ops* ops, char* suffix); -void -line_flip(struct linebuffer* lbf); +int +term_bind(struct term* tdev, struct device* chdev); + +static inline void +line_flip(struct linebuffer* lbf) +{ + struct rbuffer* tmp = lbf->current; + lbf->current = lbf->next; + lbf->next = tmp; +} void line_alloc(struct linebuffer* lbf, size_t sz_hlf); @@ -52,23 +90,22 @@ line_alloc(struct linebuffer* lbf, size_t sz_hlf); void line_free(struct linebuffer* lbf, size_t sz_hlf); -static inline int -line_put_next(struct linebuffer* lbf, char val, int delta) -{ - size_t dptr = (size_t)(lbf->ptr + delta); - if (dptr >= lbf->sz_hlf) { - return 0; - } - - lbf->next[dptr] = val; - lbf->ptr++; - return 1; -} +void +term_sendsig(struct term* tdev, int signal); + +int +term_flush(struct term* tdev); int -term_sendline(struct term* tdev, size_t len); +term_read(struct term* tdev); int -term_readline(struct term* tdev, size_t len); +lcntl_transform_inseq(struct term* tdev); + +int +lcntl_transform_outseq(struct term* tdev); + +void +term_notify_data_avaliable(struct termport_potens* cap); #endif /* __LUNAIX_TERM_H */