/dev/hidraw: 읽기 권한

/dev/hidraw: 읽기 권한

/dev/hidraw*에 대한 읽기 액세스 권한을 얻으려면 어떻게 해야 합니까?

나는 udev 규칙에 관해 뭔가를 보고 있었는데,이것온라인이지만 udev의 세계는 나에게 외국처럼 느껴집니다. 그룹에 자신을 추가하는 더 쉬운 솔루션이 있다면 좋을 것 같습니다...

(우분투 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 하위 시스템에서 나오는 모든 장치를 이 그룹에 할당 plugdev하고 권한을 r/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그것은 무엇을 의미합니까? 캐릭터 특수 파일 또는 캐릭터 장치에는 시스템이 데이터를 전송하는 장치(예: 한 번에 한 캐릭터씩)가 포함됩니다 getchar.Wikipedia는 다시 우리의 친구입니다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그렇지 않으면 두뇌가 영구적으로 손상될 수 있습니다.

관련 정보