mknod 에 대해서
글쓴이: nekoko / 작성시간: 월, 2008/05/19 - 8:08오후
usb 마우스로부터 이벤트 값을 읽기 위해
mknod /dev/input/event0 c 13 64 를 치고
read를 하려고 이 파일을 open했습니다.
값이 잘 읽히는걸 확인하고 마우스를 뽑습니다.
그리고나서 cat /dev/input/event0 을 하면
"no such device" 라고 나옵니다.
문제는 다시 마우스를 연결하면 /dev/input/event0 을 읽을 수가 없습니다.
마우스를 빼는 순간 자동으로 close()가 되는 것 같은데..
다시 이 파일을 open하면 열리지가 않습니다.
rm /dev/input/event0 으로 파일을 지우고 다시 mknod /dev/input/event0 c 13 64 를 한 뒤
cat /dev/input/event0 을 해보면 역시 "no such device"라고 나옵니다. (마우스가 꽂혀있는데도)
하지만 mknod /dev/input/event1 c 13 65 로 minor를 바꿔서 이걸 cat해보면 읽혀지구요.
(/proc/bus/input/devices 의 handler 내용에서 event* 부분의 뒷번호가 바뀌더라구요)
mknod로 만든 파일이 close되면 같은 major, minor를 갖는 장치는 다시 open할 수가 없나요?
어째서 open하고 마우스를 뽑고 다시 꽂으면 두번다시 같은 파일을 열 수 없는지 모르겠습니다..
Forums:
event0 노드를 open()
event0 노드를 open() 하고 있는 상태에서 USB 를 제거하면,
커널 내부에서 event0 노드와 관련된 자료구조가 지워지지 않습니다.
(일반적인 파일과 마찬가지입니다)
하지만 장치는 이미 제거되고 없는 상태이므로,
event0 를 다시 open() 하려고 하면 -ENODEV 가 리턴됩니다.
이 상태에서 다시 USB 를 연결하면 이미 event0 노드에 대한 자료가 이미 있으므로
event1 가 만들어집니다.
event0 를 open() 하고 있던 놈을 종료하면, 비로소 event0 가 깨끗하게 지워집니다.
OTL
ㅠㅠ
빠른 리플에 얼른 다시 해보았는데..
event0을 open()하고 있던 놈이라면.. 그냥 open했을 때 반환한
fd를 close하면 되는 거 맞지요?
그렇게 해서 제대로 close를 했는데
그 후에 다시 open하면 열리지가 않아요.. no such device 헉
혹시.. 디바이스 드라이버 쪽에서 계속 붙잡고 있기 때문이라거나 뭐..
그런건지..
"I'm convinced that the only thing that kept me going was that I loved what I did." - Steve Jobs 1955-2011
USB 마우스 탈착 없이
USB 마우스 탈착 없이 open()/close() 만 했는데도 그런 증상이면 커널 드라이버 버그입니다.
커널 버전이...?
그리고, /dev/input/mice 로도 버튼 정보 잘 나오는데요.
fedora8 에서 해봤는데 휠버튼의 정보가 gana 님이 링크해주신 xorg 소스와는 좀 틀리게 나오긴 합니다.
IMPS, EXPS 모두요. 코드가 틀리긴해도 wheel 버튼 구별은 확실히 됩니다.
커널 드라이버 보고 대충 맞춰서 끄적거린 코드 첨부합니다.
음... kldp 이상해졌군요. 파일첨부가 안되네요. 아쉽...
OTL
커널은
안녕하세요?
커널은 2.6.23.14 입니다.
자세히는 마우스 탈착없이 close한게 아니고 먼저 마우스를 뽑고나서 close하게 했구요
/dev/input/mice의 3바이트 정보의 첫 1바이트를 보면 저는 휠값이 동일하게 나오던데..
휠버튼을 '클릭'하는 값은 저도 구별이 되구요. 위아래로 휠을 굴릴 때 나오는 값이 구별이 안되요
커널이 마우스를 3버튼 마우스로 인식해서 그런 것 같기도 하고..
"I'm convinced that the only thing that kept me going was that I loved what I did." - Steve Jobs 1955-2011
IMPS 혹은 EXPS 초기화
마우스를 제거하고, close(event0) 한 뒤 open(event0) 하면 당연히 -ENODEV 입니다.
마우스를 제거하고, 다시 연결한 뒤, close(event0) 하고 open(event0) 해도 당연히 -ENODEV 입니다.
앞서 말씀드렸듯,
마우스가 연결될 당시에 event0 가 제거되지 않고 남아있는 상태였기 때문에,
그 순간에는 event1 라는 새 이름을 가지고 등록됩니다.
한글은 쉬운데, 국어는 왜 이리 어려운지 모르겠어요.
IMPS 혹은 EXPS 초기화 절차를 거치면 데이타를 4byte 단위로 받게 됩니다.
네번째 바이트에 추가 버튼 정보가 있습니다.
초기화 절차 없이 사용하면 general PS/2 형식으로만 데이타를 받기 때문에 3byte 뿐이고,
여기엔 추가버튼 정보가 없습니다.
OTL
아
imps나 exps 초기화는 어떻게 하나요..?
그리고 마우스 제거하고 close를 했고 마우스를 꽂고나서 open을 했습니다 ^^
좀 헷갈리네요..
"I'm convinced that the only thing that kept me going was that I loved what I did." - Steve Jobs 1955-2011
첨부가 안되니
첨부가 안되니 코드를 간단히 적겠습니다.
본래는 진짜 마우스 장치로 커맨드가 날아가고 ack 도 받고, 데이타도 받고 해야하지만,
2.6 커널의 mousedev 장치는 에물레이션 모드만 바꿔주는 것이므로,
사실 위와 같은 복잡한 과정은 필요없습니다. 하지만 그렇다해도...
덧.
IMPS 의 경우,
시퀀스는 {0xf3, 200, 0xf3, 100, 0xf3, 80} 이고,
id 는 3 입니다.
OTL
네
좀 어렵긴 하지만 ^^; 참고하겠습니다.
시퀀스나 id같은 용어는 제가 아직 몰라서
공부를 해야 하겠습니다
"I'm convinced that the only thing that kept me going was that I loved what I did." - Steve Jobs 1955-2011
댓글 달기