장치 드라이버에 관한 질문입니다.

dododosa의 이미지

안녕하세요. 리눅스 개발을 처음해보는 초짜입니다.

궁금한게 있어서 질문 드립니다..

리눅스는 PNP 기능을 제공을 하는건가요???
USB포트에 마우스나 키보드를 추가 장착 했을때 인식을 하는것을 봐서는 그런것 같은데..
만약에 USB storage의 경우는 직접 마운트 해줘야하는것 같고..

애매하네요;;

장치를 usb port 에 꼳 았을때 hotplug이벤트로 값받아와서 정보를 파싱하고 (udev를 설치를 못하는 상황이라..)
장치가 뭔지.. 그리고 출력되는 값을 컨트롤?? 할 수 있는 방법이 있는지
조심스럽게 여쭈어 봅니다.

goforit의 이미지

>장치를 usb port 에 꼳 았을때 hotplug이벤트로 값받아와서 정보를 파싱하고 (udev를 설치를 못하는 상황이라..)
>장치가 뭔지.. 그리고 출력되는 값을 컨트롤?? 할 수 있는 방법이 있는지
>조심스럽게 여쭈어 봅니다.

#1 Open netlink socket
ex) socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);

#2 Receive uevent message from kernel
ex) recvmsg(device_fd, &hdr, 0);

#3 Parse USB uevent from message above

참조
===
http://goo.gl/izxQKd

dododosa의 이미지

답글을 남겨주신거 보니 제 의도랑 다르게 질문을 올려놨었네요 ㅠ
그래도 남겨주신 자료 보고 잘 분석해서 잘 쓰겠습니다 감사합니다 ^^

dododosa의 이미지

답글을 남겨주신거 보니 제가 제 의도랑 다르게 질문을 올려놨었네요 ㅠ
그래도 남겨주신 자료 보고 잘 분석해서 잘 쓰겠습니다 감사합니다 ^^

익명 사용자의 이미지

누가 만들어놓은 것을 그냥 가져다 쓰고 싶다는 의도의 질문이라면,
busybox mdev 를 사용하세요. /proc/sys/kernel/hotplug 에 등록해서 사용할 수 있습니다.
uevent 방식에 비하면 상대적으로 매우 비효율 적입니다만,
시스템 전반적으로 보면 부담이 크게 증가하는 것은 아닙니다.

dododosa의 이미지

kobject_evnet를 이용해서 hotplug 이벤트를 받아와서 메세지를 msg 단위로 key : value 셋으로 파싱을 지난주에 해놨었구요 ...

음 .. keyboard를 장착 하니 이런 메시지가 출력이 되더라구요.
keyboard remove

buffer = remove@/devices/platform/ohci-brcm.0/usb2/2-1/2-1:1.0/input/input0/event0ACTION=removeDEVPATH=/devices/platform/ohci-brcm.0/usb2/2-1/2-1:1.0/input/input0/event0SUBSYSTEM=inputMAJOR=13MINOR=64DEVNAME=input/event0SEQNUM=452

buffer = remove@/devices/platform/ohci-brcm.0/usb2/2-1/2-1:1.0/input/input0ACTION=removeDEVPATH=/devices/platform/ohci-brcm.0/usb2/2-1/2-1:1.0/input/input0SUBSYSTEM=inputPRODUCT=3/4b4/101/111NAME="Cypress USB Keyboard"PHYS="usb-ohci_hcd-1/input0"UNIQ=""EV==120013KEY==10000 7 ff9f207a c14057ff febeffdf ffefffff ffffffff fffffffeMSC==10LED==1fMODALIAS=input:b0003v04B4p0101e0111-e0,1,4,11,14,k71,72,73,74,75,77,79,7A,7B,7C,7D,7E,7F,80,81,82,83,84,85,86,87,88,89,8A,8C,8E,96,98,9E,9F,A1,A3,A4,A5,A6,AD,B0,B1,B2,B3,B4,B7,B8,B9,BA,BB,BC,BD,BE,BF,C0,C1,C2,F0,ram4,l0,1,2,3,4,sfwSEQNUM=453

buffer = remove@/devices/platform/ohci-brcm.0/usb2/2-1/2-1:1.0/0003:04B4:0101.0001ACTION=removeDEVPATH=/devices/platform/ohci-brcm.0/usb2/2-1/2-1:1.0/0003:04B4:0101.0001SUBSYSTEM=hidHID_ID=0003:000004B4:00000101HID_NAME=Cypress USB KeyboardHID_PHYS=usb-ohci_hcd-1/input0HID_UNIQ=MODALIAS=hid:b0003v000004B4p00000101SEQNUM=454

buffer = remove@/devices/platform/ohci-brcm.0/usb2/2-1/2-1:1.0ACTION=removeDEVPATH=/devices/platform/ohci-brcm.0/usb2/2-1/2-1:1.0SUBSYSTEM=usbDEVTYPE=usb_interfaceDEVICE=/proc/bus/usb/002/002PRODUCT=4b4/101/1TYPE=0/0/0INTERFACE=3/1/1MODALIAS=usb:v04B4p0101d0001dc00dsc00dp00ic03isc01ip01SEQNUM=455

buffer = remove@/devices/platform/ohci-brcm.0/usb2/2-1/2-1:1.1/input/input1/event1ACTION=removeDEVPATH=/devices/platform/ohci-brcm.0/usb2/2-1/2-1:1.1/input/input1/event1SUBSYSTEM=inputMAJOR=13MINOR=65DEVNAME=input/event1SEQNUM=456

buffer = remove@/devices/platform/ohci-brcm.0/usb2/2-1/2-1:1.1/input/input1ACTION=removeDEVPATH=/devices/platform/ohci-brcm.0/usb2/2-1/2-1:1.1/input/input1SUBSYSTEM=inputPRODUCT=3/4b4/101/111NAME="Cypress USB Keyboard"PHYS="usb-ohci_hcd-1/input1"UNIQ=""EV==10001fKEY==837fff 2c3027 bf004444 0 0 1 10f84 8b27c007 ffe67bfa d9415fff 9ebeffcd f3cfffff febffbff dffffffeREL==40ABS==1 0MSC==10MODALIAS=input:b0003v04B4p0101e0111-e0,1,2,3,4,14,k71,72,73,74,75,77,79,7A,7B,7C,7F,80,81,82,83,84,85,86,87,88,89,8A,8B,8C,8E,90,96,98,9B,9C,9E,9F,A1,A3,A4,A5,A6,A7,A8,A9,AB,AC,AD,AE,B1,B2,B5,B6,B7,B8,B9,BA,BB,BC,BD,BE,BF,C0,C1,C2,CE,CF,D0,D1,D2,D5,D8,D9,DB,DF,E2,E7,E8,E9,EA,EB,F0,100,162,166,16A,16E,178,179,17A,17B,17C,17D,17F,180,181,182,185,18C,18D,192,193,195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA,1AB,1AC,1AD,1AE,1B0,1B1,1B7,r6,a20,m4,lsfwSEQNUM=457

buffer = remove@/devices/platform/ohci-brcm.0/usb2/2-1/2-1:1.1/0003:04B4:0101.0002ACTION=removeDEVPATH=/devices/platform/ohci-brcm.0/usb2/2-1/2-1:1.1/0003:04B4:0101.0002SUBSYSTEM=hidHID_ID=0003:000004B4:00000101HID_NAME=Cypress USB KeyboardHID_PHYS=usb-ohci_hcd-1/input1HID_UNIQ=MODALIAS=hid:b0003v000004B4p00000101SEQNUM=458

buffer = remove@/devices/platform/ohci-brcm.0/usb2/2-1/2-1:1.1ACTION=removeDEVPATH=/devices/platform/ohci-brcm.0/usb2/2-1/2-1:1.1SUBSYSTEM=usbDEVTYPE=usb_interfaceDEVICE=/proc/bus/usb/002/002PRODUCT=4b4/101/1TYPE=0/0/0INTERFACE=3/0/0MODALIAS=usb:v04B4p0101d0001dc00dsc00dp00ic03isc00ip00SEQNUM=459

buffer = remove@/devices/platform/ohci-brcm.0/usb2/2-1/usb_device/usbdev2.2ACTION=removeDEVPATH=/devices/platform/ohci-brcm.0/usb2/2-1/usb_device/usbdev2.2SUBSYSTEM=usb_deviceMAJOR=189MINOR=129DEVNAME=usbdev2.2SEQNUM=460

buffer = remove@/devices/platform/ohci-brcm.0/usb2/2-1ACTION=removeDEVPATH=/devices/platform/ohci-brcm.0/usb2/2-1SUBSYSTEM=usbMAJOR=189MINOR=129DEVNAME=bus/usb/002/002DEVTYPE=usb_deviceDEVICE=/proc/bus/usb/002/002PRODUCT=4b4/101/1TYPE=0/0/0BUSNUM=002DEVNUM=002SEQNUM=461

물론 저 메시지를 파싱 하는 로직은 짜놨는데

이런식으로 하나의 장치를 remove 시켰을 뿐인데 많은 종류의 메시지가 유사하게 쏟아지니
이것이 하나의 장치라고 인식하게 하는 것이 맞는건지.. 이 메시지 중 하나만 장치인것인지 ..

그리고 이것을 피싱 한 후에는 또 어떻게
event0 등에서 쏟아지는 메시지를 연결하여 사용 할 수 있는지 몰라서 ;

기본적인 이론을 얻고자 글을 쓴것인데 전혀 다른 의미로 해석이 되어 전달이 되어진것 같습니다.

죄송합니다.

dododosa의 이미지

keyboard 입력에 대해서는 event0 라는 파일을 읽어서 처리 할 수 있다라고 알게 되어
그것에 대한 처리 로직까지 작성한 상태입니다.

그러니까 궁금한것은

kobject event 의 buufer 당 쏟아지는 이벤트를 어떻게 한대 묶어 "한개의 장치에서 발생하는 이벤트" 이다라고 표현을 할 수 있고
저 이벤트에서 어떤걸 가공을 해야 "KEYBOARD" 다 라는 것을 표현 할 수 있으며

KEYBOARD라면, 어디서 input/output 의 값을 받아 처리를 할 수 있는지에 대한것이 궁금합니다.

익명 사용자의 이미지

remove@, add@, remove@ 로 시작합니다.
nul-terminated string 들로 이어져 있고, string 의 갯수는 정해진 것이 없습니다.
recv 한 바이트 수만큼 전부 파싱하셔야 합니다..

"한 개의 장치에 관련된 이벤트이다" 라고 표현하고 싶다면 직접 DEVPATH 를 tracking 하셔야 합니다.

"KEYBOARD다" 라는 이벤트는 없습니다.
input subsystem 에서 add@ 이벤트가 날아왔을 때 같이 날아온 DEVPATH 를 이용해서 sysfs 나 dev 를 직접 뒤진 다음,
이 장치가 KEY event 를 보내주는 장치인지 아닌지 조사하시면 됩니다.
보통은 add@ 때 DEVNAME, DEVMODE, MAJOR, MINOR 를 이용해서 /dev/input/ 에 노드만 만들고 나머진 app 에 맡기고,
remove@ 때 DEVNAME 을 이용해서 /dev/input/ 의 노드를 삭제하고 나머진 app 에 맡깁니다.
app 은 /dev/input/ 을 inotify 로 감시하다 노드가 만들어지거나 삭제됐을 때 조사를 하던가 말던가 사용하던가 말던가 합니다.

dododosa의 이미지

감사합니다. 처음 질문을 해봐서 횡설수설이였는데 하나하나 대답을 해주셔서 감사합니다.^^

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.