/ dev / hidraw: baca izin


8

Apa yang harus saya lakukan untuk memiliki izin baca di / dev / hidraw *?

Saya melihat hal-hal tentang aturan udev dan melihat ini di internet, tetapi dunia udev seperti negeri asing bagi saya, dan jika ada semacam solusi yang lebih sederhana di mana saya hanya menambahkan diri saya ke grup yang akan menjadi keren ...

(Ubuntu 13.10 Preview)

Jangan ragu untuk mengulang pertanyaannya - saya tidak terlalu tertarik dengan apa yang sebenarnya disebut 'hidraw'.

EDIT:

H'okay, jadi, hanya beberapa informasi untuk mengklarifikasi masalah ini: Saya benar-benar melangkah melalui kode yang disebut open()metode POSIX , dan mendapatkan errnoizin yang tidak mencukupi. Berjalan catdi file sebagai pengguna normal menghasilkan kesalahan izin yang tidak mencukupi, sementara berjalan di bawah suhasil dalam operasi yang sukses (meskipun tidak berarti) cat.

EDIT EDIT:

Atas permintaan, saya memberikan kode yang relevan dengan panggilan POSIX. Itu dari perpustakaan HIDAPI oleh Signal11 (fungsi hid_open_path). Saya percaya bahwa kode ini benar, karena tampaknya sudah cukup lama digunakan. Saya telah menambahkan komentar yang terletak di mana errnobacaan yang relevan terjadi di 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;
}

Cuplikan KodeBraiam ditambahkan.
pengguna

Jawaban:


11

Saya menyerah untuk mencari tahu cara lain untuk melakukannya selain aturan udev, dan alih-alih hanya belajar sedikit tentang udev dan menulis aturan flippin. Baris berikut ditempatkan dalam .rulesfile (saya beri nama milik saya 99-hidraw-permissions.rules) yang terletak di bawah /etc/udev/rules.d.

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

Pada dasarnya ini menetapkan semua perangkat yang keluar dari subsistem hidraw di kernel ke grup plugdevdan menetapkan izin untuk r / wr / wr (masing-masing untuk root [pemilik default], plugdev, dan semua orang lainnya). Dengan diriku yang ditambahkan ke grup plugdev, semuanya keren.

Tidak cukup meleleh seperti yang saya duga. Aturan Udev sebenarnya tampak sangat mudah ... Maksudku, sepertinya mereka bisa konyol jika Anda berurusan dengan ID produk individu dan yang lainnya, tetapi mereka tampaknya sangat jinak untuk apa yang mereka lakukan.


Ini bekerja untuk saya karena saya ingin menggunakan alat konfigurasi Roccat, dan itu membutuhkan izin root. Dengan ini saya dapat menggunakan alat dengan pengguna normal.
LnxSlck

5

Untuk memahami sesuatu ... mulailah mengetahuinya.

Ok, pertama-tama, mari kita lihat apa hidrawartinya dan apa yang terdiri dari:

  • hid (Perangkat Antarmuka Manusia): Perangkat antarmuka manusia atau HID adalah jenis perangkat komputer yang berinteraksi langsung dengan, dan paling sering mengambil input dari, manusia dan dapat mengirimkan output ke manusia. sumber wikipedia
  • raw: Ini dimaksudkan sebagai mentah , tetapi dalam suasana Linux itu juga berarti langsung.

Dari sini kita dapat menyimpulkan bahwa hidrawini adalah metode mentah / langsung untuk mengakses hid . Sekarang mari kita lihat apa yang dipikirkan sistem kami tentang ini:

$ 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

Jadi, apa character specialartinya? File khusus karakter atau perangkat karakter berhubungan dengan perangkat yang digunakan oleh sistem untuk mentransmisikan data satu karakter setiap kali, misalnya getchar,. lagi Wikipedia adalah teman kita. Hal yang sama mengikuti cdi awal ls -lperintah.

Apa yang harus saya lakukan untuk memiliki izin baca di / dev / hidraw *?

Jadi, bagaimana ini menyelesaikan pertanyaan Anda? Untuk mengakses /dev/hidraw*Anda harus menggunakan implementasi C untuk membaca / menulis ke file ini. Tetapi, jika yang Anda inginkan adalah informasi tentang HID yang terhubung, Anda harus melihatnya /sys/class/hidraw/hidraw*/. Contoh:

$ 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

Mempertimbangkan bahwa hanya kernel yang memiliki akses langsung di sebagian besar kasus ke perangkat, dan Anda hanya boleh menggunakan panggilan yang disediakan di userspace untuk berkomunikasi dengan perangkat ini.

Saya melihat hal-hal tentang aturan udev dan melihat ini di internet, tetapi dunia udev seperti tanah asing bagi saya

Kecuali jika Anda mengembangkan driver / perangkat baru yang seharusnya tidak terlalu Anda mainkan udev, otak Anda bisa rusak secara permanen.


Saya benar-benar melangkah melalui kode yang disebut open()metode POSIX , dan mendapat errnoizin yang tidak mencukupi. Berjalan catdi file sebagai pengguna normal menghasilkan kesalahan izin yang tidak mencukupi, sementara berjalan di bawah suhasil dalam operasi yang sukses (meskipun tidak berarti) cat. Meskipun saya menghargai info tambahan, itu sebenarnya tidak membantu dengan kurangnya masalah izin saya ... Juga, saya bekerja dengan HID eksperimental, jadi saya benar-benar baik-baik saja dengan membuat otak saya penuh dengan rasa sakit-sangat-baik hal udev itu perlu.
pengguna
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.