-
poll/select implementation in tty Linux driver
Hi,
I need to implement poll function in my tty Linux driver , user space application should call poll/select functions in user space. The problem is tty_operations does not support poll() function, like file_operations.
How can I implement it?
Thank you
-
Originally Posted by mudak777
Hi,
I need to implement poll function in my tty Linux driver , user space application should call poll/select functions in user space. The problem is tty_operations does not support poll() function, like file_operations.
How can I implement it?
Thank you
Sure they do! Because each tty has a set of file descriptors (stdin,stdout,stderr) that go along with them. That what is what you want to poll or select on. For example you could select on STDIN_FILENO (defined in unistd.h) to poll for input on the stdin of your tty. You can throw STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO into your fdset to poll anything that crosses the tty.
AFAIK your process will have only have access to it's tty/pty/pts. It won't be able to access the pty's owned by other processes from user space. Check out the ttysnoop source for a little simple lesson on how to access anyone's tty from kernel space.
"There's a big difference between "copy" and "use". It's exatcly the same
issue whether it's music or code. You can't re-distribute other peoples
music (becuase it's _their_ copyright), but they shouldn't put limits on
how you personally _use_ it (because it's _your_ life)."
--Linus Torvalds
-
Um, I think he's writing a TTY driver, not a userspace program.
If I'm right, and you're doing a kernel-mode driver, the poll() implementation for TTYs is (at least in 2.6.18) held in the line discipline structure, not the tty_struct. The tty_struct has an "ldisc" member, which is a tty_ldisc. That ldisc's "poll" member should point to your poll routine.
The TTY file_operations structure has a poll member that points at drivers/char/tty_io.c's tty_poll function. See that function (and functions in the rest of the file) to find out how it gets the function that does the real polling. I'm sure there's a sample TTY driver implementation somewhere in the kernel, but I don't know where it would be.
-
Ah, he wrote:
Originally Posted by mudak777
poll function in my tty Linux driver , user space application
And I read:
Originally Posted by mudak777
poll function in my tty Linux user space application
And I was wondering to myself why he specified user space application.
"There's a big difference between "copy" and "use". It's exatcly the same
issue whether it's music or code. You can't re-distribute other peoples
music (becuase it's _their_ copyright), but they shouldn't put limits on
how you personally _use_ it (because it's _your_ life)."
--Linus Torvalds
-
Kernel-mode driver
Hi,
Thank you for your respond.
Yes, I'm doing a kernel mode driver. The problem is, that customer wants
to use in his user space application select function. That means I need to
implement in my driver poll() function. Unfortunately I did not find any example
in Linux serial drivers. I used last Linux kernel, but have no idea how to use line discipline with tty_struct, since I use open,close, write, ioctl etc in tty_struct. I know tty_io.c has tty_poll() function, I need maybe somhow to call it from my driver.
Originally Posted by bwkaz
Um, I think he's writing a TTY driver, not a userspace program.
If I'm right, and you're doing a kernel-mode driver, the poll() implementation for TTYs is (at least in 2.6.18) held in the line discipline structure, not the tty_struct. The tty_struct has an "ldisc" member, which is a tty_ldisc. That ldisc's "poll" member should point to your poll routine.
The TTY file_operations structure has a poll member that points at drivers/char/tty_io.c's tty_poll function. See that function (and functions in the rest of the file) to find out how it gets the function that does the real polling. I'm sure there's a sample TTY driver implementation somewhere in the kernel, but I don't know where it would be.
-
No, you don't call tty_poll from your driver. tty_poll is the TTY device's poll() handler, and it calls into your driver through the line discipline struct. Your driver is still what does the poll() implementation, it just doesn't do it directly in the file_operations struct (because it doesn't have one). It does it by setting up tty->ldisc (where "tty" is your driver's tty_struct) and then sets tty->ldisc->poll to your poll() handler function.
I still haven't found a sample tty_struct handler that uses an ldisc (or that doesn't, for that matter). I'd really like to know where one is hiding; that whole interface wouldn't exist unless it needed to...
-
I added struct tty_ldisc as a second srtucture to my driver (it had before tty_operations), and after calling select() function in application (user level),
I'm able to awake poll function inside my tty driver. But it's strange to use both structures tty_ldisc and tty_operations in one driver.
Have you any idea?
-
Any idea on what? That's how it's done. Whether it seems strange or not (and I'd agree that it does, a bit), that's how the TTY layer was designed.
-
Thanks.
-
What are the implementation details?
Originally Posted by mudak777
I added struct tty_ldisc as a second srtucture to my driver (it had before tty_operations), and after calling select() function in application (user level),
I'm able to awake poll function inside my tty driver. But it's strange to use both structures tty_ldisc and tty_operations in one driver.
Have you any idea?
I am trying to do the same for a tty driver I am developing and the user needs poll(). I can't figure out how to get it implemented.
-
Originally Posted by markclark
I am trying to do the same for a tty driver I am developing and the user needs poll(). I can't figure out how to get it implemented.
Never mind, figured it out.
static unsigned int my_tty_poll(struct tty_struct *tty, struct file *filp, poll_table *wait)
{ ... }
static struct tty_ldisc_ops ops_ldisc = {
...
.poll = my_tty_poll,
};
in the init section:
tty_register_ldisc(&ops_ldisc);
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
|