/ proc / bus / input / devices 데이터에서 EV 설명


12

아무도 그 EV가치가 무엇인지 설명해 줄 수 있습니까 /proc/bus/input/devices?

키보드는 항상 가치가 120013있습니다. 왜?


참고 : 키보드는 항상을 가지고 있지 않지만 0x120013최소한 그렇습니다 . 당신은하고 싶지 않아 if(ev == 0x120013){ isKeyboard = true; }, 당신은하고 싶은 것if((ev & 0x120013) == 0x120013){ isKeyboard = true; }
앤디

답변:


22

bitmask장치가 지원 하는 for 이벤트를 나타냅니다 .

devicesAT 키보드 입력 샘플 :

I: Bus=0011 Vendor=0001 Product=0001 Version=ab41
N: Name="AT Translated Set 2 keyboard"
P: Phys=isa0060/serio0/input0
S: Sysfs=/devices/platform/i8042/serio0/input/input2
U: Uniq=
H: Handlers=sysrq kbd event2 
B: PROP=0
B: EV=120013
B: KEY=20000 200 20 0 0 0 0 500f 2100002 3803078 f900d401 feffffdf ffefffff ffffffff fffffffe
B: MSC=10
B: LED=7

B에 대한 전면 관중석은 bitmap, N, P, S, U, H해당 이름 값 단순히 첫 글자이며 I입니다 ID. 순서대로 :

  • I => @id: id of the device (struct input_id)
    • Bus     => id.bustype
    • Vendor  => id.vendor
    • Product => id.product
    • Version => id.version
  • N => name of the device.
  • P => physical path to the device in the system hierarchy.
  • S => sysfs path.
  • U => unique identification code for the device (if device has it).
  • H => list of input handles associated with the device.
  • B => bitmaps
    • PROP => device properties and quirks.
    • EV   => types of events supported by the device.
    • KEY  => keys/buttons this device has.
    • MSC  => miscellaneous events supported by the device.
    • LED  => leds present on the device.

비트 마스크

아시다시피 컴퓨터는 이진법을 다루므로

1 = 0001
2 = 0010
3 = 0011
4 = 0100
5 = 0101
...

따라서 내가 5비트 0과 2를 가질 수있는 값 을 가진 비트 맵이 있다면 , 다른 말로 각 숫자에 이름을 부여하고 값에 해당하는지 확인할 수 있습니다.

예 :

A = 1,  001
B = 2,  010
C = 4,  100

그런 다음 바이너리 가 MYVAR = 5있는 경우 101체크 아웃합니다.

MYVAR & A == TRUE   (101 & 001 => 001)
MYVAR & B == FALSE  (101 & 010 => 000)
MYVAR & C == TRUE   (101 & 100 => 100 )

따라서 내 var 에는 A와 C가 있습니다.


커널은 좀 더 정교하고 복잡한 방식을 사용하며 비트 단위로 오프셋을 설정합니다. 하나의 컴퓨터 (CPU) 정수에서 더 많은 비트를 사용할 수 있기 때문에 한 가지 이유가 사용됩니다. 예를 들어 KEY비트 맵을보십시오.

우리가 말하면 :

A = 0
B = 1
C = 6
...

그리고

target = 0;
set_bit(A, target);  => target ==      0001
set_bit(C, target);  => target == 0100 0001

디코딩 120013

120013은 16 진수입니다. 바이너리로 우리에게 제공합니다 :

0x120013 == 0001 0010 0000 0000 0001 0011 binary
               1    2    0    0    1    3

오른쪽부터 번호가 매겨져 있습니다.

   2            1               <= offset (10's)
3210 9876 5432 1098 7654 3210   <= offset (counted from right)
0001 0010 0000 0000 0001 0011   <= binary

Set bits are:
   0, 1, 4, 17, 20

그런 다음 다음에 해당하는지 확인하십시오 input.h.

   0  EV_SYN (0x00)
   1  EV_KEY (0x01)
   4  EV_MSC (0x04)
  17  EV_LED (0x11)
  20  EV_REP (0x14)

이것이 무엇을 의미하는지 확인하려면 커널 설명서를 참조하십시오 .

* EV_SYN:
  - Used as markers to separate events. Events may be separated in time or in
    space, such as with the multitouch protocol.

* EV_KEY:
  - Used to describe state changes of keyboards, buttons, or other key-like
    devices.

* EV_MSC:
  - Used to describe miscellaneous input data that do not fit into other types.

* EV_LED:
  - Used to turn LEDs on devices on and off.

* EV_REP:
  - Used for autorepeating devices.

, "편집 2 (계속) :" 특히이 관심이있을 수 있습니다.


2
이 답변은 놀랍습니다!
Anish Ramaswamy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.