Предположим, что у нас есть последовательное устройство / dev / ttyS0
с глухой скоростью 9600 бит / с.
Скажем, мы изменили его скорость, например, на 4800 бит / с, используя cfsetospeed
.
Теперь скорость записи в сеть должна быть ниже.
Где исходный код, выполняющий эту операцию? Какая часть операционной системы контролирует эту скорость? Кастомный драйвер, драйвер tty что ли? А как, выставив тактовую частоту или задержку?
Может быть, в драйвере, но я не нашел. Например, может ли кто-нибудь показать мне место в драйвере RocketPort ?
Я также не смог найти в драйвере tty .
Скорость последовательного порта обычно определяется самим оборудованием и настраивается драйвером оборудования.
Таким образом, следующей цепочкой будет вызов TCSETS
ioctl, который вызывает tty_set_termios()
в tty_ioctl.c
. Если вы проследите эту цепочку, то в драйвере RocketPort он вызовет rp_set_termios()
, который сам вызывает configure_r_port()
.
Выполняется некоторый расчет параметров конфигурации для отправки на микросхему RocketPort (, например. установка делителя ), которая в конечном итоге вызывает sSetBaud
(, определенную в rocket_int.h
), которая просто выводит байты на микросхему.
Таким образом, ядро само по себе не выполняет "битовую перестановку" последовательных линий для определения скорости передачи данных; Чип UART делает всю эту тяжелую работу за нас. Нам просто нужно запрограммировать чип:-)