ডিভাইসগুলি সম্ভবত /dev/input/
নামযুক্ত একটি ফাইল পায় eventN
যেখানে এন বিভিন্ন ডিভাইস যেমন মাউস, কীবোর্ড, জ্যাক, পাওয়ার বোতাম ইত্যাদি etc.
ls -l /dev/input/by-{path,id}/
আপনাকে ইঙ্গিত দেওয়া উচিত
এছাড়াও দেখুন:
cat /proc/bus/input/devices
যেখানে Sysfs
মানটি পাথের নিচে /sys
।
আপনি উদাহরণ দিয়ে পরীক্ষা করতে পারেন
cat /dev/input/event2 # if 2 is kbd.
আইওসিটিএল ব্যবহার করতে এবং ডিভাইসগুলি + মনিটর পরীক্ষা করতে।
সম্পাদনা 2:
ঠিক আছে. অনুমানটি /dev/input/eventN
ব্যবহৃত হয়েছে এর ভিত্তিতে আমি এই উত্তরের প্রসার ঘটিয়েছি on
একটি উপায় হতে পারে:
প্রারম্ভকালে লুপ সমস্ত event
ফাইল পাওয়া যায় /dev/input/
। ioctl()
ইভেন্ট বিট অনুরোধ করতে ব্যবহার করুন :
ioctl(fd, EVIOCGBIT(0, sizeof(evbit)), &evbit);
তারপরে EV_KEY
-বিট সেট করা আছে কিনা তা পরীক্ষা করে দেখুন ।
আইএফএফ সেট করে তারপরে কীগুলি পরীক্ষা করুন:
ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(keybit)), &keybit);
উদাহরণস্বরূপ যদি নম্বর-কীগুলি আকর্ষণীয় হয় তবে তার জন্য বিটগুলি KEY_0
- KEY9
এবং - তে পরীক্ষা KEY_KP0
করুন KEY_KP9
।
আইএফএফ কীগুলি খুঁজে পাওয়া গেলে থ্রেডে ইভেন্ট ফাইলটি পর্যবেক্ষণ শুরু করে।
ফিরে 1।
এইভাবে আপনাকে এমন সমস্ত ডিভাইস পর্যবেক্ষণ করতে হবে যা চাওয়া মানদণ্ডগুলি পূরণ করে। আপনি কেবল পরীক্ষা করতে পারবেন না EV_KEY
যেমন পাওয়ার-বোতামটিতে এই বিট সেট থাকবে তবে এটি অবশ্যই KEY_A
সেট করবে না won't
বহিরাগত কীগুলির জন্য মিথ্যা ইতিবাচক চিত্র দেখেছেন, তবে সাধারণ কীগুলির জন্য এটি যথেষ্ট। পাওয়ার বাটন বা জ্যাকের জন্য যেমন ইভেন্ট ফাইলের তদারকি করার ক্ষেত্রে কোনও সরাসরি ক্ষতি নেই তবে আপনি যেগুলি প্রশ্নে ইভেন্টগুলি উদ্বোধন করবেন না (যেমন। খারাপ কোড)।
নীচে আরও বিস্তারিত।
সম্পাদনা 1:
শুভেচ্ছা "যে শেষ কথাটা ব্যাখ্যা কর ..." । এখানে স্ট্যাকওভারফ্লো জমির উপর দিয়ে যাচ্ছে ... তবে:
সি তে একটি দ্রুত এবং নোংরা নমুনা আপনাকে আসলে সঠিক ডিভাইস পেয়েছে কিনা তা যাচাই করতে, ইভেন্টের ধরণ, কোড এবং মান অনুবাদ করতে আপনাকে বিভিন্ন কোড প্রয়োগ করতে হবে। সাধারণত কী-ডাউন, কী-আপ, কী-পুনরাবৃত্তি, কী-কোড ইত্যাদি
বাকি সময় যোগ করার জন্য সময় নেই (এবং এখানে খুব বেশি)।
কোডিং ম্যাপিংয়ের জন্য linux/input.h
প্রোগ্রামগুলি যেমন dumpkeys
কার্নেল কোড ইত্যাদি পরীক্ষা করে দেখুন । যেমনdumpkeys -l
যাহাই হউক না কেন:
যেমন চালান:
# ./testprog /dev/input/event2
কোড:
#include <stdio.h>
#include <string.h> /* strerror() */
#include <errno.h> /* errno */
#include <fcntl.h> /* open() */
#include <unistd.h> /* close() */
#include <sys/ioctl.h> /* ioctl() */
#include <linux/input.h> /* EVIOCGVERSION ++ */
#define EV_BUF_SIZE 16
int main(int argc, char *argv[])
{
int fd, sz;
unsigned i;
/* A few examples of information to gather */
unsigned version;
unsigned short id[4]; /* or use struct input_id */
char name[256] = "N/A";
struct input_event ev[EV_BUF_SIZE]; /* Read up to N events ata time */
if (argc < 2) {
fprintf(stderr,
"Usage: %s /dev/input/eventN\n"
"Where X = input device number\n",
argv[0]
);
return EINVAL;
}
if ((fd = open(argv[1], O_RDONLY)) < 0) {
fprintf(stderr,
"ERR %d:\n"
"Unable to open `%s'\n"
"%s\n",
errno, argv[1], strerror(errno)
);
}
/* Error check here as well. */
ioctl(fd, EVIOCGVERSION, &version);
ioctl(fd, EVIOCGID, id);
ioctl(fd, EVIOCGNAME(sizeof(name)), name);
fprintf(stderr,
"Name : %s\n"
"Version : %d.%d.%d\n"
"ID : Bus=%04x Vendor=%04x Product=%04x Version=%04x\n"
"----------\n"
,
name,
version >> 16,
(version >> 8) & 0xff,
version & 0xff,
id[ID_BUS],
id[ID_VENDOR],
id[ID_PRODUCT],
id[ID_VERSION]
);
/* Loop. Read event file and parse result. */
for (;;) {
sz = read(fd, ev, sizeof(struct input_event) * EV_BUF_SIZE);
if (sz < (int) sizeof(struct input_event)) {
fprintf(stderr,
"ERR %d:\n"
"Reading of `%s' failed\n"
"%s\n",
errno, argv[1], strerror(errno)
);
goto fine;
}
/* Implement code to translate type, code and value */
for (i = 0; i < sz / sizeof(struct input_event); ++i) {
fprintf(stderr,
"%ld.%06ld: "
"type=%02x "
"code=%02x "
"value=%02x\n",
ev[i].time.tv_sec,
ev[i].time.tv_usec,
ev[i].type,
ev[i].code,
ev[i].value
);
}
}
fine:
close(fd);
return errno;
}
সম্পাদনা 2 (অব্যাহত):
নোট করুন যে আপনি যদি /proc/bus/input/devices
প্রতিটি লাইনের শুরুতে আপনার কাছে একটি চিঠি দেখেন । এখানে B
বিট-ম্যাপের অর্থ। এটি উদাহরণস্বরূপ:
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
এই বিটগুলির প্রত্যেকটিরই ডিভাইসের একটি বৈশিষ্ট্যের সাথে মিল রয়েছে। বিট-ম্যাপের দ্বারা যার অর্থ, 1 নির্ধারিত হিসাবে কোনও সম্পত্তি উপস্থিত রয়েছে তা নির্দেশ করে linux/input.h
। :
B: PROP=0 => 0000 0000
B: EV=120013 => 0001 0010 0000 0000 0001 0011 (Event types sup. in this device.)
| | | ||
| | | |+-- EV_SYN (0x00)
| | | +--- EV_KEY (0x01)
| | +------- EV_MSC (0x04)
| +----------------------- EV_LED (0x11)
+--------------------------- EV_REP (0x14)
B: KEY=20... => OK, I'm not writing out this one as it is a bit huge.
B: MSC=10 => 0001 0000
|
+------- MSC_SCAN
B: LED=7 => 0000 0111 , indicates what LED's are present
|||
||+-- LED_NUML
|+--- LED_CAPSL
+---- LED_SCROLL
কটাক্ষপাত আছে /drivers/input/input.{h,c}
কার্নেল সোর্স গাছে। অনেক ভাল কোড আছে। (যেমন ডিভাইসগুলির বৈশিষ্ট্যগুলি এই ফাংশন দ্বারা উত্পাদিত হয় ))
এই সম্পত্তি মানচিত্রের প্রতিটি দ্বারা প্রাপ্ত করা যেতে পারে ioctl
। উদাহরণস্বরূপ, আপনি যদি এলইডি বৈশিষ্ট্যগুলি উপলব্ধ তা পরীক্ষা করতে চান তবে বলুন:
ioctl(fd, EVIOCGBIT(EV_LED, sizeof(ledbit)), &ledbit);
কীভাবে সংজ্ঞায়িত struct input_dev
হয় তার input.h
জন্য সংজ্ঞাটি দেখুন ledbit
।
এলইডি এর স্ট্যাটাস পরীক্ষা করতে:
ioctl(fd, EVIOCGLED(sizeof(ledbit)), &ledbit);
যদি বিট 1 ইন ledbit
1 হয় তবে নাম-লকটি আলোকিত হয়। বিট 2 যদি 1 হয় তবে ক্যাপস লক জ্বালানো হয় ইত্যাদি
input.h
বিভিন্ন সংজ্ঞা আছে।
ঘটনা পর্যবেক্ষণের ক্ষেত্রে নোটগুলি:
পর্যবেক্ষণের জন্য সিউডো-কোড দিক নির্দেশে কিছু হতে পারে:
WHILE TRUE
READ input_event
IF event->type == EV_SYN THEN
IF event->code == SYN_DROPPED THEN
Discard all events including next EV_SYN
ELSE
This marks EOF current event.
FI
ELSE IF event->type == EV_KEY THEN
SWITCH ev->value
CASE 0: Key Release (act accordingly)
CASE 1: Key Press (act accordingly)
CASE 2: Key Autorepeat (act accordingly)
END SWITCH
FI
END WHILE
কিছু সম্পর্কিত নথি:
Documentation/input/input.txt
, এসএসপি নোট বিভাগ 5।
Documentation/input/event-codes.txt
, বিভিন্ন ইভেন্টের বর্ণনা ইত্যাদি EV_SYN
সম্পর্কে যেমন উদাহরণে উল্লেখ করা হয়েছে তা নোট করুনSYN_DROPPED
Documentation/input
... আপনি চান বাকী পড়ুন।
/dev/disk/by-id/
দ্বারা তৈরি করা হয়েছেudev
- প্রশ্নটি হ'ল এটি এই পার্টিকুলার কেসে (এমবেডেড প্ল্যাটফর্ম) পাওয়া যায় কিনা is