2014-04-25 2 views
16

Linux 시스템 용 모듈 및 드라이버를 작성하는 방법을 배우려고합니다. 마찬가지로 this 질문과 마찬가지로 간단한 "Hello World"모듈을 USB 키보드 핫 플러그 ​​(아래 코드)로 실행하려고합니다. insmodemodprobe 명령으로 모듈을 초기화하더라도 (dmesg은 디버깅 메시지를 표시 함) 키보드를 끼우면 모듈이로드되지 않습니다.키보드의 모듈로드 hotplug

내가 무슨 짓을 :

  1. 실행 makehellomodule.ko 파일을 생성 할 수 있습니다.
  2. hellomodule.ko 파일을/lib/modules/"my_kernel_version"/
  3. depmod -a comand로 복사하십시오.

이 세 단계를 거친 후 modules.aliasmodules.dep 파일에 모듈을 추가했습니다. 여전히 작동하지 않습니다.

이 커널 구성 오류 또는 완전히 다른 것이 있습니까?

시스템 : 우분투 14.04 LTS; 커널 : 3.14.0

hellomodule.c :

#include <linux/module.h> 
#include <linux/kernel.h> 
#include <linux/init.h> 
#include <linux/usb.h> 
#include <linux/usb/input.h> 
#include <linux/hid.h> 

MODULE_AUTHOR("author"); 
MODULE_DESCRIPTION("helloworld module\n"); 
MODULE_LICENSE("GPL"); 

static struct usb_device_id hello_id_table [] = { 
     { USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID, 
     USB_INTERFACE_SUBCLASS_BOOT, 
      USB_INTERFACE_PROTOCOL_KEYBOARD) }, 
    { } /* Terminating entry */ 
}; 

MODULE_DEVICE_TABLE (usb, hello_id_table); 

static int hello_probe(struct usb_interface *interface, 
    const struct usb_device_id *id) 
{ 
    pr_debug("HelloModule: USB keyboard probe function called\n"); 
    return 0; 
} 

static void hello_disconnect(struct usb_interface *interface) 
{ 
    pr_debug("HelloModule: USB keyboard disconnect function called\n"); 
} 

static struct usb_driver hello_driver = { 
//.owner = THIS_MODULE, 
.name =  "hello_driver", 
.probe = hello_probe, 
.disconnect = hello_disconnect, 
.id_table = hello_id_table 
}; 

static int __init hello_init(void) 
{ 
    int retval = 0; 

    pr_debug("HelloModule: Hello World!\n"); 
    retval = usb_register(&hello_driver); 
    if (retval) 
     pr_debug("HelloModule: usb_register failed. Error number %d", retval); 

    return 0; 
} 

static void __exit hello_exit(void) 
{ 
    usb_deregister(&hello_driver); 
    pr_debug("HelloModule: exit\n"); 
} 

module_init(hello_init); 
module_exit(hello_exit); 

메이크 :

obj-m := hellomodule.o 
CFLAGS_hellomodule.o := -DDEBUG 

KDIR := /lib/modules/`uname -r`/build 

default: 
    make -C $(KDIR) M=$(PWD) modules 
clean: 
    make -C $(KDIR) M=$(PWD) clean 
+0

이 문제를 해결할 수 있었습니까? – bacchus

+0

@bacchus 아니에요. 동일한 시스템을 설치하고 모듈 자체를 변경하지 않고 다른 컴퓨터로 전환했습니다. 문제를 더 조사하지는 않았지만 커널 구성에 문제가 있다고 생각합니다. –

답변

12

나는 동일한 문제가있었습니다. 제 경우에는 USB 마우스를 사용했기 때문에 usbhid 모듈이 이미로드되어 있기 때문에 발생했습니다.

DRIVER!="?*", ENV{MODALIAS}=="?*", RUN{builtin}="kmod load $env{MODALIAS}" 

당신이 할 수 : 우분투 14.04, 새로운 장치가 연결되어 적절한 모듈을로드 udev에 규칙에, 제대로 이해한다면

은 (/lib/udev/rules.d/80-drivers.rules에 위치) 다음이다 참조, kmod load은 새 장치에 드라이버가없는 경우에만 실행됩니다. 그러나 usbhid이 이미로드 된 경우 방금 부착 된 키보드에는 이미 드라이버가 있습니다. 따라서 "hello world"모듈이로드되지 않습니다.

가능한 솔루션

따라서는 DRIVER!="?*" 조건을 제거하기로 돌려 udev에 규칙을 수정/무시하는 것입니다

ENV{MODALIAS}=="?*", RUN{builtin}="kmod load $env{MODALIAS}"`. 

또 다른 가능한 해결 방법은 키보드를 부착하기 전에 usbhid 모듈을 언로드하는 것입니다. 물론, 이로 인해 새 키보드를 연결할 때까지 모든 USB 키보드, 마우스 및 기타 HID 클래스 장치가 작동하지 않게됩니다.

-1

는 가상 컴퓨터를 사용하십니까? 그렇다면 라이브 USB에서도 실제 설치를 시도하십시오. 나는 데비안의 라이브 USB 설치를 시도한 후에 VirtualBox를 사용하여 동일한 문제를 해결했습니다. 허브 응답 후

편집 : 는 또한 http://wiki.sourcemage.org/FrequentlyAskedQuestions%282f%29KernelConfiguration.html#kmodload 참조, 커널 구성 될 수있다 (질문 "나는 모듈을 KMOD를 통해 자동으로 부하를해야합니까 어떻게?").

menuconfig에서로드 가능한 모듈 지원에서 "커널 모듈 로더"옵션을 활성화 할 수 있습니다. 하지만 아직이 답변을 확인하지 않았습니다.