Распечатка 5.3 Функции передачи

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

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

 

static void my_uart_char_tx(struct uart_port *port)

{

  struct circ_buf *xmit = &port->info->xmit;

 

  /*

   * Если должен быть передан символ XON/XOFF, ядром

   * последовательного порта устанавливается поле x_char

   * данного порта

   */

  if(port->x_char)

  {

    SEND_CHAR(port->x_char);

    port->x_char = 0; /* Reset the field */

    return;

  }

 

  if(uart_tx_stopped(port) || uart_circ_empty(xmit))

  {

    my_uart_stop_tx(port, 0);

    return;

  }

 

  SEND_CHAR(xmit->buf[xmit->tail]);

 

  /*

   * UART_XMIT_SIZE определено include/linux/serial_core.h

   */

  xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE – 1);

 

  /*

   * Теперь проверяем, есть ли ещё символы для передачи

   * и есть ли достаточно места в буфере передачи, которое

   * определено макросом WAKEUP_CHARS в файле

   * include/linux/serial_core.h как 256. Предоставляемая ядром

   * последовательного порта функция uart_write_wakeup в конце

   * концов заканчивается функцией обработчика пробуждения TTY,

   * которая в свою очередь информирует дисциплину линии, что

   * низкоуровневый драйвер готов к приёму других данных.

   */

  if(uart_circ_chars_pending(xmit) < WAKEUP_CHARS)

    uart_write_wakeup(port);

  if(uart_circ_empty(xmit))

    my_uart_stop_tx(port, 0);

}

 

static void

my_uart_stop_tx(struct uart_port *port, unsigned int c)

{

  STOP_TX();

}

 

static void

my_uart_start_tx(struct uart_port *port, unsigned int start)

{

  START_TX();

  my_uart_char_tx(port);

}

 

/* Возвращает 0, если не пусто */

static unsigned int my_uart_tx_empty(struct uart_port *port)

{

  return (TX_EMPTY()? TIOCSER_TEMT : 0);

}

 

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