/dev/hidraw: 読み取り権限

/dev/hidraw: 読み取り権限

/dev/hidraw*への読み取りアクセス権を取得するにはどうすればよいですか?

私はudevルールについて何かを見ていましたが、これオンラインですが、udevの世界は私に外国のように感じます。グループに自分自身を追加するより簡単な解決策があれば良いと思います。

(Ubuntu 13.10 プレビュー)

この質問に自由にタグを付け直してください。私は「hidraw」が正確に何であるかはあまり興味がありません。

編集する:

さて、質問を明確にするためにもう少し情報を提供します。open()POSIXメソッドを呼び出すコードをそのまま実行しましたが、errno権限が不足しているというメッセージが表示されました。通常のユーザーとしてファイルを実行するとcat権限不足エラーが発生しますが、通常のユーザーとして実行するとsu(意味はありません)、操作は成功しますcat

編集済み:

要求時にPOSIX呼び出しに関する関連コードを提供しました。これはSignal11のHIDAPIライブラリ(関数hid_open_path)で提供されています。私はこのコードがかなり長い間使用されてきたので、正しいと思います。私はerrnoそれについて読んだGDBにメモを追加しました。

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;
}

答え1

私はudevルール以外のものを見つけることをあきらめ、udevについて少し学び、簡単なルールを書いた。次の行は、.rules下のファイル(私が名前を付ける)に配置されます。99-hidraw-permissions.rules/etc/udev/rules.d

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

デフォルトでは、これはカーネルのhidrawサブシステムからのすべてのデバイスをこのグループに割り当て、権限をplugdevr / wr / wr(ルート[デフォルト所有者]、Plugdev、および他のすべての人のそれぞれ)に設定します。私はPlugdevグループに直接参加し、すべてが順調に進んだ。

思ったより脳が溶けるほどではありませんでした。 Udevのルールは実際には非常にシンプルに見えます。私の言うことは、彼らは次のとおりです。できる別途の商品IDなどを扱う場合、これは面白くなるかもしれませんが、その効果はとても良いようです。

答え2

何かを理解するには…それを理解し始めてください。

hidrawいいですね。まず、これが何を意味し、何で構成されているかを見てみましょう。

  • hid(ヒューマンインターフェイスデバイス):ヒューマンインターフェイスデバイスまたはHIDは、人間と直接対話し、通常は人間から入力を受け取り、人間に出力を渡すことができるコンピュータデバイスです。ソースウィキペディア
  • raw: この意味は粗いしかし、Linux環境では直接的な意味もあります。

これから私たちはこれが一つであると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そうしないと、脳が永久に損傷する可能性があります。

関連情報