Последовательный драйвер в пользовательском пространстве

Можно ли написать драйвер последовательного порта в пользовательском пространстве, но при этом устройство будет отображаться в системе как обычный драйвер последовательного порта /dev/ttyS0?

Полная история состоит в том, что у нас есть pci express fpga, а за pci express fpga стоит несколько устройств: серийные номера, canbus, i2c, mdio и т. Д.

Я думал реализовать его как uio_pci_generic, но драйвер последовательного порта немного проблематичен, потому что мы предпочитаем, чтобы он отображался как обычный последовательный порт /dev/ttyS0.

Если вышеперечисленное невозможно: Можно ли реализовать некоторые устройства pci в ядре (последовательное соединение), а другие - в пространстве пользователя? Это проблематично с точки зрения прерывания?

Спасибо за любую идею.


person ransh    schedule 02.01.2019    source источник


Ответы (2)


Да, вы можете сделать это с помощью pty. Драйвер пользовательского режима открывает главный конец pty, а приложение, которое хочет использовать последовательный порт, открывает подчиненный конец. Найдите Linux pty.

person prl    schedule 02.01.2019
comment
Это не будет ttyS0, это будет ttypX. Я полагаю, что это приемлемо. - person prl; 02.01.2019
comment
Это все еще другое. мы не можем установить скорость передачи или использовать stty, например, не так ли? - person ransh; 02.01.2019
comment
Да, думаю, можно. stackoverflow.com/questions/21641754/ - person prl; 02.01.2019
comment
И последнее: знакомы ли вы с каким-либо примером, показывающим pty с реальным устройством? Большое спасибо! - person ransh; 03.01.2019

Везде, где вам нужно использовать прерывания, вам нужно писать код для пространства ядра, а не пользователя. Обработчики прерываний должны обслуживаться в атомарном контексте, а пользовательское пространство не может предоставлять атомарный контекст. Во-вторых, если вам нужно написать слой HAL, он также должен быть записан в пространстве ядра.

person user2699113    schedule 02.01.2019
comment
с uio_pci_generic можно дождаться прерывания в пользовательском пространстве. - person ransh; 02.01.2019