मुझे पता चला है कि यह कैसे करना है। संक्षेप में, आपको एक "फ़ीचर रिपोर्ट" भेजनी होगी, जिसमें बाइट्स 0x9, 0x0, 0x0, 0x0
को रूट के रूप में उपयुक्त हिड्रा डिवाइस में भेजा जाना चाहिए ।
आप इस आदेश के साथ सही hidraw डिवाइस पा सकते हैं:
dmesg | grep Apple | grep Keyboard | grep input0 | tail -1 | sed -e 's/.*hidraw\([[:digit:]]\+\).*/\/dev\/hidraw\1/'
मैजिक कंट्रोल पैकेट भेजने का कोड नीचे है। Gcc के साथ संकलित, hidraw डिवाइस को पैरामीटर के रूप में लेता है। तो पूरा प्रवाह है:
- नीचे दिए गए कोड को सहेजें
disable-capslock-delay.c
gcc -o disable-capslock-delay disable-capslock-delay.c
HIDDEVICE=$(dmesg | grep Apple | grep Keyboard | grep input0 | tail -1 | sed -e 's/.*hidraw\([[:digit:]]\+\).*/\/dev\/hidraw\1/')
sudo ./disable-capslock-delay $HIDDEVICE
चरण 3 और 4 को हर बार आपको रिबूट (या कीबोर्ड को अनप्लग और री-प्लग) करना होगा; आप उन्हें /etc/rc.local
(या आपके डिस्ट्रो के समकक्ष) बूट पर निष्पादित करने के लिए डाल सकते हैं (आपको sudo
उस मामले में ज़रूरत नहीं है , और आप संकलित बाइनरी को /usr/local/sbin/
या कुछ में स्थानांतरित करना चाह सकते हैं )।
मैंने वेंडर आईडी, डिवाइस आईडी और रिपोर्ट डिस्क्रिप्टर लंबाई के लिए कुछ सुरक्षा जांचों में लगा दिया है। यदि आपका मॉडल खान से अलग है तो आपको बाद के दो को बदलना पड़ सकता है।
#include <linux/hidraw.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv) {
if (argc != 2 || strcmp(argv[1], "-h") == 0) {
printf("Pass a hidraw device as the first and only parameter!\n");
printf("You may find the right device with:\n");
printf(" dmesg | grep Apple | grep Keyboard | grep input0 | tail -1 | "
"sed -e 's/.hidraw\([[:digit:]]\+\)./\/dev\/hidraw\1/'\n");
return 1;
}
int fd, i, res, desc_size = 0;
char buf[256];
struct hidraw_devinfo info;
char *device = argv[1];
fd = open(device, O_RDWR | O_NONBLOCK);
if (fd < 0) {
perror("Unable to open device");
return 1;
}
memset(&info, 0, sizeof(info));
memset(buf, 0, sizeof(buf));
// Get Report Descriptor Size
res = ioctl(fd, HIDIOCGRDESCSIZE, &desc_size);
if (res < 0) {
perror("HIDIOCGRDESCSIZE");
}
if (desc_size != 75) {
printf("Error: unexpected descriptor size %d; you've probably got "
"the wrong hidraw device!\n", desc_size);
return 1;
}
// Get Raw Info
res = ioctl(fd, HIDIOCGRAWINFO, &info);
if (res < 0) {
perror("HIDIOCGRAWINFO");
} else {
if (info.vendor != 0x05ac) {
printf("Error: Wrong vendor ID, make sure you got the right "
"hidraw device!\n");
return 1;
}
if (info.product != 0x0250) {
printf("Warning: Unknown product ID 0x%x!\n", info.product);
}
}
// Get Feature
buf[0] = 0x09; // Report Number
res = ioctl(fd, HIDIOCGFEATURE(256), buf);
if (res < 0) {
perror("HIDIOCGFEATURE");
} else {
printf("HID Feature Report (before change):\n\t");
for (i = 0; i < res; i++) printf("%hhx ", buf[i]);
puts("\n");
}
// Set Feature
buf[0] = 0x09; // Report Number
buf[1] = 0x00; // Report data
buf[2] = 0x00; // padding
buf[3] = 0x00; // padding
res = ioctl(fd, HIDIOCSFEATURE(4), buf);
if (res < 0) {
perror("HIDIOCSFEATURE");
} else {
printf("Caps lock delay disabled.\n");
}
// Get Feature
buf[0] = 0x09; // Report Number
res = ioctl(fd, HIDIOCGFEATURE(256), buf);
if (res < 0) {
perror("HIDIOCGFEATURE");
} else {
printf("HID Feature Report (after change):\n\t");
for (i = 0; i < res; i++) printf("%hhx ", buf[i]);
puts("\n");
}
close(fd);
return 0;
}