2016-12-13 3 views
0

現在、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%(おそらくそれほど頻繁ではありません)です。

これはどこから来たのか、それを修正する方法、または回避する方法はありますか?前もって感謝します。

答えて

0

問題が見つかりました。

これは私のudevルールにあります。十分正確ではありません。 hidraw0、と(私の場合)input/event15

私はデバイスを接続

は、Linuxは2つの character specialデバイス /dev/内のファイルを作成します。それらは、例えば、 ID_VENDOR_ID、または ID_USB_DRIVERのような多くの環境値を共有します。しかし、彼らは同じを共有しません MAJOR

私がしたことは、自分のudevルールにENV{MAJOR}=="correct_major"を追加して、今度は私のシンボリックリンクが正しいデバイスファイルにリンクされています。

これは時にはうまくいかなかった理由も説明しています。udevルールの詳細が不足しているため、シンボリックリンクが正しいデバイスファイルにリンクされていることがあります。