![](https://secure.gravatar.com/avatar/7dd51d3db690d1d052c216b5a9e04c4a.jpg?s=120&d=mm&r=g)
Scripsit Samuel Thibault die 17.07.2009 19:54:
Janusz Krzysztofik, le Tue 14 Jul 2009 17:31:23 +0200, a écrit :
AFAICS, even if tty lowlevel write() could be used unmodified, a convenient way of reading characters from a tty is missing and should be implemented in a line discipline. Please correct me if I am wrong.
Have you seen the receive_buf line discipline hook? Indeed it's not a read() operation as from userland, but at least you can get the data from the tty that way.
That's as it should be. A read() operation that sleeps until some data is available isn't very useful in kernel mode, as it can only be used if you have the ability to sleep. A callback function which runs your code as soon as the data arrives is a much better fit, although of course it requires a bit of rethinking.
OTOH, I found that some kind of abstraction layer for acccessing devices over a tty could be convenient. Instead of allocating a new line discipline for each specific device, sometimes found on a specific board only, why not just create a new bus type?
I'd tend to agree with you, as I also have a use case for that: braille & speech synthesis devices. However for now I haven't found a really convincing argument why line disciplines aren't enough.
I was in the same situation three years ago when I implemented the ser_gigaset driver for an RS232 connected ISDN adapter, and found the line discipline (LD) interface quite adequate once I had figured out how to use it. The only inconvenience is how LDs are loaded and attached to a serial interface, via the TIOCSETD ioctl, because you need a userspace daemon which keeps the tty device open so that the LD stays attached to it.