[완료] 마우스 프로그래밍 관련.. /dev/input/mice 읽어오기

nekoko의 이미지

USB 마우스 프로그래밍을 하고 있습니다.

mknod /dev/input/mice c 13 63 을 하고나서

read()로 이걸 읽어와 마우스 이벤트를 처리하려고 합니다.

그런데..

int read_bytes;
struct input_event ev;

read_bytes = read(fd, &ev, sizeof(struct input_event));

이런 식으로 하면, input_event를 읽어오지 않습니다. 3바이트를 읽어오는데요

minor번호 63에서 읽어오려면 어떤 형식으로 읽어와야 하는지요?
3바이트가 구체적으로 어떤 내용인지 모르겠습니다.

minor를 64로 해서 (여기서부턴 이벤트 이벤트 핸들러?) 읽어오면 제대로
input_event 구조체를 읽어오구요..

전부 검색해봐도 input_event로 읽어오는 것밖에 안나와있고
63으로부터 읽어오려면 어떤 형식으로 읽어야하는지는 못 찾겠네요

굳이 63으로 하려는 이유는.. 64로 하면, usb마우스를 뽑았다가 다시 꽂으면
63으로부터 다시 읽어오기가 안되더라구요. (이 이유도 모르겠습니다)
64로 하면, 다시 꽂으면 다시 읽기가 됩니다.

아무런 조언이나 환영입니다.

minzkn의 이미지

도구의 결함은 장인의 손으로 극복한다.

ganadist의 이미지

아래 코드는 X 서버의 마우스 드라이버 소스입니다.

            buttons = (pBuf[0] & 0x04) >> 1 |       /* Middle */
                      (pBuf[0] & 0x02) >> 1 |       /* Right */
                      (pBuf[0] & 0x01) << 2 |       /* Left */
                      (pBuf[0] & 0x40) >> 3 |       /* button 4 */
                      (pBuf[0] & 0x80) >> 3;        /* button 5 */
            dx = (pBuf[0] & 0x10) ?    pBuf[1]-256  :  pBuf[1];
            dy = (pBuf[0] & 0x20) ?  -(pBuf[2]-256) : -pBuf[2];

그리고 64는 마우스 장치가 아니라 linux input event device 입니다.

----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러

----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러

nekoko의 이미지

3바이트가 그런 내용이었군요~
등잔 밑이 어둡다더니 kldp 위키를 안 찾아봤네요
두분 빠른 답변 고맙습니다

(그런데
http://www.frogmouth.net/hid-doco/x401.html
http://blog.naver.com/nugu99?Redirect=Log&logNo=70004648008 (유영창님 강좌)
같은 곳을 보면 read를 할 때 input_event로 읽으라고 나와있는데..
보통 마우스 프로그래밍할 때 이벤트 처리를 어떤 식으로 하는지
확실히 모르겠네요)

"I'm convinced that the only thing that kept me going was that I loved what I did." - Steve Jobs 1955-2011

ganadist의 이미지

시스템에 여러개의 마우스 장치가 연결되어 있더라도 모든 마우스 이벤트는 /dev/input/mice 장치에서 얻을 수 있습니다.

linux input event device (보통 줄여서 evdev라고합니다.)는 각 장치마다 따로 이벤트가 발생됩니다.

그리고 evdev는 마우스, 키보드, 터치, 조이스틱, 등등의 모든 입력장치를 모두 포함합니다..

input_event를 사용하려면 먼저 해당 장치가 원하는 장치인지 확인하는 부분이 필요할껍니다.

참고로 현재 시스템에 등록된 evdev를 확인하려면 다음 명령을 사용하세요.

$ cat /proc/bus/input/devices 
I: Bus=0010 Vendor=001f Product=0001 Version=0100
N: Name="PC Speaker"
P: Phys=isa0061/input0
S: Sysfs=/class/input/input0
U: Uniq=
H: Handlers=kbd event0 
B: EV=40001
B: SND=6
 
I: Bus=0019 Vendor=0000 Product=0002 Version=0000
N: Name="Power Button (FF)"
P: Phys=LNXPWRBN/button/input0
S: Sysfs=/class/input/input1
U: Uniq=
H: Handlers=kbd event1 
B: EV=3
B: KEY=100000 0 0 0
 
I: Bus=0019 Vendor=0000 Product=0001 Version=0000
N: Name="Power Button (CM)"
P: Phys=PNP0C0C/button/input0
S: Sysfs=/class/input/input2
U: Uniq=
H: Handlers=kbd event2 
B: EV=3
B: KEY=100000 0 0 0
 
I: Bus=0003 Vendor=1267 Product=0103 Version=0100
N: Name="USB HIDBP Keyboard 1267:0103"
P: Phys=/input0
S: Sysfs=/class/input/input3
U: Uniq=
H: Handlers=kbd event3 
B: EV=120003
B: KEY=7 ff87207a c14057ff febeffdf ffefffff ffffffff fffffffe
B: LED=1f
 
I: Bus=0003 Vendor=1267 Product=0103 Version=0110
N: Name="HID 1267:0103"
P: Phys=usb-0000:00:1d.0-1/input1
S: Sysfs=/class/input/input4
U: Uniq=
H: Handlers=kbd event4 
B: EV=1f
B: KEY=37fff 2c3027 bf004444 0 0 1 c04 a27c000 267bfa d941dfed 9e0000 0 0 0
B: REL=40
B: ABS=1 0
B: MSC=10
 
I: Bus=0003 Vendor=046d Product=c016 Version=0340
N: Name="Logitech Optical USB Mouse"
P: Phys=usb-0000:00:1d.1-1/input0
S: Sysfs=/class/input/input5
U: Uniq=
H: Handlers=mouse0 event5 
B: EV=7
B: KEY=1f0000 0 0 0 0 0 0 0 0
B: REL=103

----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러

----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러

nekoko의 이미지

리플 감사합니다.
그런데 혹시 응용프로그램에서
마우스가 뽑아지거나 꽂혀진 순간을 어떻게 알 수 있을까요?
마우스가 빠지면 커서를 없애고, 꽂히면 그려주려고 합니다.

저는 말씀하신 proc/bus/input/devices 를 open해서
파싱한 후 H: Handlers=mouse0 event5 부분에서 "mouse"라는
문자열이 검색되면 마우스가 꼽혀있고, 없으면 빠져있는 것으로
판단하도록 프로그래밍할 생각이었는데..
어떤가요?

"I'm convinced that the only thing that kept me going was that I loved what I did." - Steve Jobs 1955-2011

ganadist의 이미지

마우스 연결/해제 이벤트는 리눅스 핫플러그쪽을 보셔야 할껍니다.

조금 옛날문서라서 요새상황과 안맞는 부분이 많이 있지만 아래 문서를 참조하세요.

http://wiki.kldp.org/wiki.php/LinuxHotplug

그리고 현대적(?)인 방법으로 하고 싶다면 udev에 스크립트를 추가하거나 hal 이벤트를 dbus로 받아서 처리하면 됩니다.

----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러

----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러

nekoko의 이미지

답변 고맙습니다. :)

"I'm convinced that the only thing that kept me going was that I loved what I did." - Steve Jobs 1955-2011

bushi의 이미지

작성하신 프로그램이 항상 실행되어 있는 상태라면,
udev 처럼 커널이 뿌려주는 netlink 메시지를 직접 받아보실 수도 있습니다.
NETLINK_KOBJECT_UEVENT 를 열어서 받아보시면 됩니다.
단, root 권한이 필요합니다 -.-;

fedora8, linux-2.6.24 에서 해보니

마우스에 대해선,

add@/devices/pci0000:00/0000:00:1d.1/usb3/3-2
add@/class/usb_endpoint/usbdev3.5_ep00
add@/devices/pci0000:00/0000:00:1d.1/usb3/3-2/3-2:1.0
add@/class/input/input9
add@/class/input/input9/mouse2
add@/class/input/input9/event7
add@/class/hidraw/hidraw0
add@/class/usb_endpoint/usbdev3.5_ep81
 
remove@/class/usb_endpoint/usbdev3.5_ep81
remove@/class/input/input9/mouse2
remove@/class/input/input9/event7
remove@/class/input/input9
remove@/class/hidraw/hidraw0
remove@/devices/pci0000:00/0000:00:1d.1/usb3/3-2/3-2:1.0
remove@/class/usb_endpoint/usbdev3.5_ep00
remove@/devices/pci0000:00/0000:00:1d.1/usb3/3-2

USB 메모리에 대해선,

add@/devices/pci0000:00/0000:00:1d.7/usb1/1-4
add@/class/usb_endpoint/usbdev1.6_ep00
add@/devices/pci0000:00/0000:00:1d.7/usb1/1-4/1-4:1.0
add@/class/usb_endpoint/usbdev1.6_ep01
add@/class/usb_endpoint/usbdev1.6_ep82
add@/module/usb_storage
add@/bus/usb/drivers/usb-storage
add@/class/scsi_host/host4
add@/devices/pci0000:00/0000:00:1d.7/usb1/1-4/1-4:1.0/host4/target4:0:0/4:0:0:0
add@/class/scsi_disk/4:0:0:0
add@/block/sdb
add@/class/scsi_device/4:0:0:0
add@/class/scsi_generic/sg2
add@/class/bsg/4:0:0:0
 
add@/module/fat
add@/slab/fat_cache
add@/slab/fat_inode_cache
add@/module/vfat
 
remove@/class/usb_endpoint/usbdev1.6_ep01
remove@/class/usb_endpoint/usbdev1.6_ep82
remove@/class/bsg/4:0:0:0
remove@/class/scsi_generic/sg2
remove@/class/scsi_device/4:0:0:0
remove@/class/scsi_disk/4:0:0:0
remove@/block/sdb
remove@/devices/pci0000:00/0000:00:1d.7/usb1/1-4/1-4:1.0/host4/target4:0:0/4:0:0:0
remove@/class/scsi_host/host4
remove@/devices/pci0000:00/0000:00:1d.7/usb1/1-4/1-4:1.0
remove@/class/usb_endpoint/usbdev1.6_ep00
remove@/devices/pci0000:00/0000:00:1d.7/usb1/1-4

이렇게 날아오는군요. 예전과는 좀 다르네요. 전에는 mount/umount 이벤트도 날아왔었는데.
중간의 fat,vfat 은 udev->hal 이 동작해서 마운트하면서 나오는 이벤트들입니다.

OTL

nekoko의 이미지

참고하겠습니다 ^^

"I'm convinced that the only thing that kept me going was that I loved what I did." - Steve Jobs 1955-2011

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.