static void put_char(struct r3964_info *pInfo, unsigned char ch) { struct tty_struct *tty = pInfo->tty; /* FIXME: put_char should not be called from an IRQ */ tty_put_char(tty, ch); pInfo->bcc ^= ch; }
static void put_char(struct r3964_info *pInfo, unsigned char ch) { struct tty_struct *tty = pInfo->tty; tty_put_char(tty, ch); pInfo->bcc ^= ch; }
static int do_output_char(unsigned char c, struct tty_struct *tty, int space) { int spaces; if (!space) return -1; switch (c) { case '\n': if (O_ONLRET(tty)) tty->column = 0; if (O_ONLCR(tty)) { if (space < 2) return -1; tty->canon_column = tty->column = 0; tty->ops->write(tty, "\r\n", 2); return 2; } tty->canon_column = tty->column; break; case '\r': if (O_ONOCR(tty) && tty->column == 0) return 0; if (O_OCRNL(tty)) { c = '\n'; if (O_ONLRET(tty)) tty->canon_column = tty->column = 0; break; } tty->canon_column = tty->column = 0; break; case '\t': spaces = 8 - (tty->column & 7); if (O_TABDLY(tty) == XTABS) { if (space < spaces) return -1; tty->column += spaces; tty->ops->write(tty, " ", spaces); return spaces; } tty->column += spaces; break; case '\b': if (tty->column > 0) tty->column--; break; default: if (!iscntrl(c)) { if (O_OLCUC(tty)) c = toupper(c); if (!is_continuation(c, tty)) tty->column++; } break; } tty_put_char(tty, c); return 1; }
int ev3_uart_write_byte(struct tty_struct *tty, const u8 byte) { int ret; set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags); ret = tty_put_char(tty, byte); if (tty->ops->flush_chars) tty->ops->flush_chars(tty); return ret; }
static void process_echoes(struct tty_struct *tty) { int space, nr; unsigned char c; unsigned char *cp, *buf_end; if (!tty->echo_cnt) return; mutex_lock(&tty->output_lock); mutex_lock(&tty->echo_lock); space = tty_write_room(tty); buf_end = tty->echo_buf + N_TTY_BUF_SIZE; cp = tty->echo_buf + tty->echo_pos; nr = tty->echo_cnt; while (nr > 0) { c = *cp; if (c == ECHO_OP_START) { unsigned char op; unsigned char *opp; int no_space_left = 0; opp = cp + 1; if (opp == buf_end) opp -= N_TTY_BUF_SIZE; op = *opp; switch (op) { unsigned int num_chars, num_bs; case ECHO_OP_ERASE_TAB: if (++opp == buf_end) opp -= N_TTY_BUF_SIZE; num_chars = *opp; if (!(num_chars & 0x80)) num_chars += tty->canon_column; num_bs = 8 - (num_chars & 7); if (num_bs > space) { no_space_left = 1; break; } space -= num_bs; while (num_bs--) { tty_put_char(tty, '\b'); if (tty->column > 0) tty->column--; } cp += 3; nr -= 3; break; case ECHO_OP_SET_CANON_COL: tty->canon_column = tty->column; cp += 2; nr -= 2; break; case ECHO_OP_MOVE_BACK_COL: if (tty->column > 0) tty->column--; cp += 2; nr -= 2; break; case ECHO_OP_START: if (!space) { no_space_left = 1; break; } tty_put_char(tty, ECHO_OP_START); tty->column++; space--; cp += 2; nr -= 2; break; default: if (space < 2) { no_space_left = 1; break; } tty_put_char(tty, '^'); tty_put_char(tty, op ^ 0100); tty->column += 2; space -= 2; cp += 2; nr -= 2; } if (no_space_left) break; } else { if (O_OPOST(tty) && !(test_bit(TTY_HW_COOK_OUT, &tty->flags))) { int retval = do_output_char(c, tty, space); if (retval < 0) break; space -= retval; } else { if (!space) break; tty_put_char(tty, c); space -= 1; } cp += 1; nr -= 1; } if (cp >= buf_end) cp -= N_TTY_BUF_SIZE; } if (nr == 0) { tty->echo_pos = 0; tty->echo_cnt = 0; tty->echo_overrun = 0; } else { int num_processed = tty->echo_cnt - nr; tty->echo_pos += num_processed; tty->echo_pos &= N_TTY_BUF_SIZE - 1; tty->echo_cnt = nr; if (num_processed > 0) tty->echo_overrun = 0; } mutex_unlock(&tty->echo_lock); mutex_unlock(&tty->output_lock); if (tty->ops->flush_chars) tty->ops->flush_chars(tty); }