What is the difference between evdev_event and input_inject_event?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

I did a trial on my Beagle Board which installed with Android GingerBread2.3.4. That is to sendevent from console and trigger the "mouse click" action.

Firstly I check what I will receive if I make some *real* mouse click action.
If I click the right-bottom corner of the screen:
# getevent
/dev/input/event2: 0004 0004 00090001
/dev/input/event2: 0001 0110 00000001
/dev/input/event2: 0000 0000 00000000
/dev/input/event2: 0004 0004 00090001
/dev/input/event2: 0001 0110 00000000
/dev/input/event2: 0000 0000 00000000

That means if I use "sendevent" with the same data and sequence, the "mouse click" action shoule be triggered.
But the trial failed. Nothing happened.

Then someone gave a solution.  Check this link: http://e2e.ti.com/support/embedded/android/f/509/p/207113/737993.aspx#737993
And I modified the kernel drivers/input/evdev.c file as below.
--- evdev.c    2012-09-19 21:33:08.239665514 +0800
+++ evdev_modified.c    2012-09-19 21:32:56.307334229 +0800
@@ -352,6 +352,8 @@
    while (retval < count) {

        if (input_event_from_user(buffer + retval, &event)) {
            retval = -EFAULT;
            goto out;
        }

        input_inject_event(&evdev->handle,
                   event.type, event.code, event.value);
         retval += input_event_size();
     }
 
+    evdev_event(&evdev->handle,event.type, event.code, event.value);
+
  out:
     mutex_unlock(&evdev->mutex);
     return retval;

And then recompile the kernel image and put it on the SD card, booting... and did the trial again. This time I succeeded.

But why?
evdev_event() has the totally same args as input_inject_event(), and I found that input_inject_event() was implemented by adding printk().
That shows when applying sendevent, the input_inject_event() will pass the event to handlers as well (my printk gives INPUT_PASS_TO_HANDLERS for 6 times, due to 6 data were sent).
Could anyone please help to clarify what the difference is between them? And why only evdev_event() helps in this case?


BTW, I have a HTC Sensation XE phone which installed with Android 4.0.3. And I checked its kernel source code, it is almost same to above code (without evdev_event()). But this phone can work when I sendevent to it, no need to add evdev_event().

Thanks!

BR,
Tom
_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@xxxxxxxxxxxxxxxxx
http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies

[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux