ใครช่วยอธิบายให้ฉันรู้ว่าEVคุณค่า/proc/bus/input/devicesคืออะไร?
แป้นพิมพ์มีค่า120013เสมอ ทำไม?
ใครช่วยอธิบายให้ฉันรู้ว่าEVคุณค่า/proc/bus/input/devicesคืออะไร?
แป้นพิมพ์มีค่า120013เสมอ ทำไม?
คำตอบ:
มันเป็นตัวแทนbitmaskสำหรับเหตุการณ์ที่ได้รับการสนับสนุนโดยอุปกรณ์
ตัวอย่างdevicesรายการสำหรับแป้นพิมพ์ AT:
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.bustypeVendor => id.vendorProduct => id.productVersion => id.versionN => 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เป็นเลขฐานสิบหก ในฐานะที่เป็นไบนารีมันทำให้เรา:
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)
ในการตรวจสอบสิ่งที่พวกเขาหมายถึงการแนะนำอย่างรวดเร็วจะได้รับจากเอกสาร kernel
* 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 (ต่อ):"โดยเฉพาะอย่างยิ่งอาจจะเป็นที่สนใจ
0x120013แต่อย่างน้อยที่สุดก็จะ คุณไม่ต้องการทำif(ev == 0x120013){ isKeyboard = true; }คุณอยากจะทำif((ev & 0x120013) == 0x120013){ isKeyboard = true; }