[Top] [All Lists]

RE: questions about keyboard

To: 'Jan-Benedict Glaw' <>, Linux/MIPS Development <>
Subject: RE: questions about keyboard
From: "Xu, Jiang" <>
Date: Thu, 15 Apr 2004 14:08:54 -0600
Original-recipient: rfc822;
Thanks for the reply, I did some testing and found some interesting things:

1.  Everytime I push the key on the keyboard, I can see something out from
/dev/input/event0 by "cat /dev/input/event0".
However, I don't see a directory named "proc/input", did I miss configure
something in the kernel?
2.  read() does work and is a blocking read.  However, if I use select, then
it does not work.
Select() never detects the state change.
Here is the sample code I am using:
   int test_fd = -1;
   fd_set rfds;
   struct timeval tv;
   tv.tv_sec = 1;
   tv.tv_usec = 0;
   test_fd = open("/dev/input/event0", O_RDONLY); 
   if( test_fd < 0 )
   while( 1 )
        FD_SET(test_fd, &rfds);
      retval = select( 1, &rfds, NULL, NULL, &tv );
      if( retval )
         printf("\nDetects something....");

What could be wrong?



-----Original Message-----
From: Jan-Benedict Glaw [] 
Sent: Thursday, April 15, 2004 2:36 AM
To: Linux/MIPS Development
Subject: Re: questions about keyboard

On Wed, 2004-04-14 14:56:20 -0600, Xu, Jiang <> wrote
in message <>:
> 2.  In the application, how can I know which input/event# the usb 
> keyboard connects to?

You don't. You can

        - Hope that your keyboard is the one and only device...
        - Read /proc/bus/input/devices - there should be a "kbd" handler
          in the "H: " section
        - select() on all event* devices and just only process
          keypresses generated from "normal" keys.

> 3.  Is there some reference documents about how to read things from 
> input/event# ? I mean such as how to read key event?

I don't think there's really good docu available, but it's really simple.
Just open all devices, select() until there's data available (or just call a
blocking read() on it). Something like this should work, but you'd better
add error checking to the open() call...

#include <linux/input.h>

ssize_t ret;
struct input_event my_input;
int fd;

fd = open ("/dev/input/event0", O_RDONLY);
for (;;) {
        ret = read (fd, &my_input, sizeof (my_input));
        if (ret != sizeof (my_input)

        if (my_input.type != EV_KEY)
        /* my_input.code and my_input.type now contain the key and
           press/release state; refer to the #defines in linux/input.h
           for the mapping .code -> ASCII value */
close (fd);

   Jan-Benedict Glaw    . +49-172-7608481
   "Eine Freie Meinung in  einem Freien Kopf    | Gegen Zensur | Gegen Krieg
    fuer einen Freien Staat voll Freier Bürger" | im Internet! |   im Irak!
   ret = do_actions((curr | FREE_SPEECH) & ~(NEW_COPYRIGHT_LAW | DRM |

<Prev in Thread] Current Thread [Next in Thread>