/ dev / hidraw:読み取り権限


8

/ dev / hidraw *の読み取り権限を取得するには、何をする必要がありますか?

私はudevルールについて何かを見ていますが、ネットでこれを見ましたが、udevの世界は私にとっては異国の地のようなものです。 ...

(Ubuntu 13.10プレビュー)

質問のタグを自由に付け直してください。「hidraw」が正確に何に該当するかについては、あまり熱心ではありません。

編集:

H'okay、それで、問題を明確にするためのもう少しの情報:POSIX open()メソッドを呼び出すコードを文字通りステップ実行しerrno、不十分な権限のためにを取得しました。cat通常のユーザーとしてファイルを実行すると、アクセス許可エラーが発生します。一方、下で実行するsuと、(意味はありませんが)cat操作は成功します。

編集編集:

リクエストに応じて、POSIX呼び出しで関連するコードを提供しています。これは、Signal11(関数hid_open_path)によるHIDAPIライブラリからのものです。このコードはかなり長い間使用されているようで、正しいと信じています。errnoGDBで関連する読み物が行われた場所にコメントを追加しました。

hid_device *dev = NULL;

hid_init();

dev = new_hid_device();

if (kernel_version == 0) {
    struct utsname name;
    int major, minor, release;
    int ret;
    uname(&name);
    ret = sscanf(name.release, "%d.%d.%d", &major, &minor, &release);
    if (ret == 3) {
        kernel_version = major << 16 | minor << 8 | release;
        //printf("Kernel Version: %d\n", kernel_version);
    }
    else {
        printf("Couldn't sscanf() version string %s\n", name.release);
    }
}

/* OPEN HERE */
dev->device_handle = open(path, O_RDWR);

// errno at this location is 13: insufficient permissions

/* If we have a good handle, return it. */
if (dev->device_handle > 0) {

    /* Get the report descriptor */
    int res, desc_size = 0;
    struct hidraw_report_descriptor rpt_desc;

    memset(&rpt_desc, 0x0, sizeof(rpt_desc));

    /* Get Report Descriptor Size */
    res = ioctl(dev->device_handle, HIDIOCGRDESCSIZE, &desc_size);
    if (res < 0)
        perror("HIDIOCGRDESCSIZE");


    /* Get Report Descriptor */
    rpt_desc.size = desc_size;
    res = ioctl(dev->device_handle, HIDIOCGRDESC, &rpt_desc);
    if (res < 0) {
        perror("HIDIOCGRDESC");
    } else {
        /* Determine if this device uses numbered reports. */
        dev->uses_numbered_reports =
            uses_numbered_reports(rpt_desc.value,
                                  rpt_desc.size);
    }

    return dev;
}
else {
    /* Unable to open any devices. */
    free(dev);
    return NULL;
}

@Braiamコードスニペットが追加されました。
ユーザー

回答:


11

私は、udevルール以外の方法を理解しようとするのをあきらめましたが、代わりにudevについて少し学び、フリップピンルールを作成しました。次の行は、下にある.rulesファイル(私はmineと名付けました99-hidraw-permissions.rules)に配置されました/etc/udev/rules.d

KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0664", GROUP="plugdev"

基本的に、これはカーネルのhidrawサブシステムから出てくるすべてのデバイスをグループに割り当てplugdev、権限をr / wr / wrに設定します(root [デフォルトの所有者]、plugdev、およびその他すべてのユーザー)。私自身がplugdevグループに追加されたので、すべてがうまくいきました。

思ったほど脳が溶けない。Udevルールは実際には非常に単純に見えます... つまり、個々の製品IDやその他のものを処理しているとばかげている可能性があるように見えますが、それらは何をしているのかまったく気にしていません。


Roccat構成ツールを使用したかったため、これは私にとっては機能し、ルート権限が必要でした。これにより、通常のユーザーでツールを使用できます。
LnxSlck 2017年

5

何かを理解するために...それについて知っていることを始めます。

まず最初にhidraw、何が何を意味し、何が構成されているかを見てみましょう:

  • hid(ヒューマンインターフェースデバイス):ヒューマンインターフェースデバイスまたはHIDは、人間と直接対話し、ほとんどの場合、人間から入力を受け取り、人間に出力を配信するコンピューターデバイスの一種です。ソースウィキペディア
  • raw:これは粗雑なことを意味しますが、Linuxの雰囲気では直接的な意味もあります。

これから、hidにアクセスするための大まかな/直接的な方法であるhidrawと推測できます。次に、システムがこれについてどう考えているかを見てみましょう。

$ ls -l /dev/hidraw*
crw------- 1 root root 251, 0 Aug  3  2013 /dev/hidraw0
crw------- 1 root root 251, 1 Aug  3  2013 /dev/hidraw1
crw------- 1 root root 251, 2 Aug  3  2013 /dev/hidraw2
$ file /dev/hidraw*
/dev/hidraw0: character special 
/dev/hidraw1: character special 
/dev/hidraw2: character special

それで、どういうcharacter special意味ですか?キャラクター特殊ファイルまたはキャラクターデバイスは、システムが一度に1文字ずつデータを送信するデバイスなどに関連しますgetcharここでもウィキペディアは私たちの友達です。コマンドのc最初にも同じことが続きますls -l

/ dev / hidraw *の読み取り権限を取得するには、何をする必要がありますか?

それで、これはあなたの質問をどのように解決しますか?にアクセスするには/dev/hidraw*、C実装を使用してこのファイルの読み取り/書き込みを行う必要があります。ただし、HIDの接続に関する情報が必要な場合は、を確認する必要があります/sys/class/hidraw/hidraw*/。例:

$ cat /sys/class/hidraw/hidraw2/device/uevent
DRIVER=hid-generic
HID_ID=0003:000015D9:00000A4C
HID_NAME= USB OPTICAL MOUSE
HID_PHYS=usb-0000:00:1d.1-2/input0
HID_UNIQ=
MODALIAS=hid:b0003g0001v000015D9p00000A4C

ほとんどの場合、カーネルのみがデバイスに直接アクセスでき、これらのデバイスとの通信にはユーザー空間で提供される呼び出しのみを使用する必要があることを考慮してください。

私はudevルールについていろいろ見ていますが、これはネットで見ましたが、udevの世界は私にとって異国のようです

新しいドライバ/デバイスを開発しているのでない限りudev、あまり遊んではいけません。脳が永久に損傷を受ける可能性があります。


文字通りPOSIX open()メソッドを呼び出すコードをステップ実行しerrno、不十分な権限のためにを取得しました。cat通常のユーザーとしてファイルを実行すると、アクセス許可エラーが発生します。一方、下で実行するsuと、(意味はありませんが)cat操作は成功します。追加情報に感謝しますが、実際にはアクセス許可の不足の問題を解決するものではありません...また、実験的なHIDを使用しているので、頭が痛いほどいい状態になっていても大丈夫ですudevのものはそれが必要です。
ユーザーの
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.