Распечатка 5.4 Функции приёма

Предыдущая  Содержание  Следующая V*D*V

Распечатка 5.4.

 

void my_uart_char_rx(struct uart_port *port)

{

  struct tty_struct *tty = port->info->tty;

  struct uart_count *icount = &port->icount;

  unsigned int i=0;

 

  while(CHAR_READY())

  {

    unsigned char c;

    unsigned char flag = TTY_NORMAL;

    unsigned char st = READ_RX_STATUS();

 

    if(tty->flip.count >= TTY_FLIPBUF_SIZE)

      break;

 

    c = READ_CHAR();

 

    icount->rx++;

 

    if(st & (PARITY_ERROR | FRAME_ERROR | OVERRUN _ERROR) )

    {

      if(st & PARITY_ERROR)

        icount->parity ++;

      if(st & FRAME_ERROR)

        icount->frame ++;

      if(st & OVERRUN_ERROR)

        icount->overrun ++;

 

      /*

       * Если нас просили игнорировать ошибки, то делаем следующее

       */

      if(st & port->ignore_status_mask)

      {

        if(++i > IGNORE_ERROR_NUM)

          break;

        goto ignore;

      }

 

      /*

       * Сообщаем об ошибках, которые нас не просили игнорировать

       */

      st &= port->read_status_mask;

      if(st & PARITY_ERROR) flag = TTY_PARITY;

      if(st & FRAME_ERROR) flag = TTY_FRAME;

      /*

       * Переполнение это специальный случай; оно не влияет на

       * чтение символа

       */

      if(st & OVERRUN_ERROR)

      {

        tty_insert_flip_char(tty, c, flag);

        c = 0;

        flag = TTY_OVERRUN;

      }

    }

    tty_insert_flip_char(tty,c,flag);

 

ignore:

  }

  tty_flip_buffer_push(tty);

}

 

static void my_uart_stop_rx(struct uart_port *port)

{

  STOP_RX();

}

 

Предыдущая  Содержание  Следующая