Распечатка 5.3 Функции передачи |
Предыдущая Содержание Следующая |
Распечатка 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); }
|
Предыдущая Содержание Следующая |