現在、HIDデバイスを使用しています。 HIDとRS232の2つの設定モードがあります。 、とき通常は、今シンボリックリンクでの予期しないioctl動作
// HID_to_serial.c
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <unistd.h>
//#define DEFAULT_DEVICE_PATH "/dev/hidraw0"
#define DEFAULT_DEVICE_PATH "/dev/hid_device"
int main(int argc, char **argv)
{
int fd = open(DEFAULT_DEVICE_PATH, O_RDWR);
if (fd < 0)
{
perror("Unable to open device");
return 1;
}
// Very specific report descriptor
const char buf[64] = { 0x02, 0x0b, 0x02, 0x04, 0x42, 0x40, 0x10, 0x42,
0x62, 0x10, 0x42, 0x42, 0x03, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
int res = ioctl(fd, _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x06, 64), buf);
if (res < 0)
perror("ioctl");
else
printf("Device was succesfully switched back to serial mode!\n");
return 0;
}
:
ENV{ID_VENDOR}=="Vendor", ENV{ID_VENDOR_ID}=="001d", ENV{ID_USB_DRIVER}=="usbhid",\
SYMLINK+="hid_device", RUN+="/path/to/HID_to_serial"
スクリプトは次のとおりです。だから私は、このudevのルールを使用して、それはHIDデバイスとして接続していますいつでもRS232、に彼を切り替えるには小さなスクリプトを書きました私はデバイスを接続し、Linuxはそれに/dev/hidraw0
ファイルを与えます。そして、私が/dev/hidraw0
にスクリプトを使用すると、それは完全に動作します。スクリプトで使用されているレポート記述子は正しいものであり、すべてが意図どおりに機能します.HIDデバイスはRS232モードに戻ります。しかし
、私はudevのルールによって作成された/dev/hid_device
シンボリックリンクの上に私のスクリプトを使用しようとすると、それは私ioctl: Invalid argument
言って、時間の99%を動作しません。奇妙なことは、それが機能することですが、時間の1%(おそらくそれほど頻繁ではありません)です。
これはどこから来たのか、それを修正する方法、または回避する方法はありますか?前もって感謝します。