KLD and USB driver

gerarra at tin.it gerarra at tin.it
Sun Sep 5 12:19:14 PDT 2004


>I'm working on a usb device driver I've derived from existing drivers in
>sys/dev/usb (4.10-RELEASE).
>
>I can successfully load and unload the module, but the usb subsystem does
>not appear to see the driver. However if I compile my driver in the
>kernel, the usb sub system uses the driver correctly. Unfortunately this
>is making it time consuming to test changes to my driver code as I have
to
>compile the kernel each time.
>
>I haven't see this used in the existing usb drivers code, but I tried
>using the "KLD Skeleton" from the FreeBSD Architecture Handbook.
>Although I see the uprintf output at the terminal when load/unloading the
>module, the usb subsystem does not use my driver. Like the existing usb
>drivers, I'm using USB_DECLARE_DRIVER and DRIVER_MODULE statements.
>
>Is the KLD DECLARE_MODULE code really necessary for this driver (doesn't
>USB_DECLARE_DRIVER make the driver available already)? How can I determine
>why the driver works when compiled in the kernel, but not when dynamically
>loaded? I'm able to load/unload the uhid and ugen drivers and they work
as
>expected.

FreeBSD is dived into subsystems and every subsystem contains a certain
number of components. To mantain specific order starting subsystems SYSINIT
macro is provided by the kernel; very struct sysinit obj has a double-code
priority referencing subsystem priority and priority within the subsystem
(you can give a look to them in sys/kernel.h, enum sysinit_sub_id and enum
sysinit_elem_order enumerations). When you code a generic KLD, DECLARE_MODULE
macro is provided to manage linking; between the other things a struct sysinit
obj is done (through a call to SYSINIT macro) and initialized within a specified
subsystem and with a specified priority inside the subsystem, to let module
start properly. DRIVER_MODULE just does that: among the other things, calls
DECLARE_MODULE linking the new module in the DRIVERS subsystems. USB_DECLARE_DRIVER,
instead, just defines some functions to manage your usb driver. In the end,
the real linking is done by DRIVER_MODULE and you should not use DECLARE_MODULE
(DRIVER_MODULE alredy does). However for a review of the code the complete
source code might be provided.

greetings

rookie




More information about the freebsd-hackers mailing list