tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: USB LKM driver question (pwc port)
On Tue, Feb 26, 2008 at 09:12:25PM +0100, Matthias Drochner wrote:
>
> 10.50%free.fr@localhost said:
> > However, I am unsure as to what I shall put in the MOD_DRV declaration
> > that follows USB_DECLARE_DRIVER. I found no help looking around in
> > the examples, since no LKM handles USB.
>
> I'm currently working on some changes to improve loadable
> driver support for USB. As things look now, you might be able
> to get an LKM working with the existing framework, if you
> load the LKM before plugging in the device.
It definitely works; I've done it. I sent Vincent the LKM skeleton off-
list, but it's probably worth repeating here for the archives.
> I'd suggest using eg sys/lkm/dev/pci/dummy_pci as a starting
> point. You need to adapt the attachment information to the
> USB "usbifif" interface, see dev/usb/files.usb.
My skeleton is for a whole-device attachment (ie, usbdevif), because
the gadget I was targeting is a something that only comes in a one-
function variant and doesn't have any useful interfaces AFAICT. But
the idea should be adaptable it a interface-attached device.
A stripped down skeleton for the LKM shim I've been using is attached;
it may be missing a few include files since I noticed it was a little
heavy from my attempt when then LKM shim and driver lived in a single
source file and took the pruning shears to it before posting without
actually testing it again.
I haven't included the driver itself, since this wrapper could be
linked with the driver source of any of the USB drivers with the
uxxx -> yourdevice replacment. The Makefile is also attached.
--rafal
--
Time is an illusion; lunchtime, doubly so. |/\/\| Rafal Boni
-- Ford Prefect |\/\/|
rafal%pobox.com@localhost
/* $NetBSD$ */
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/lkm.h>
#include <sys/device.h>
#include <dev/usb/usb.h>
#include <dev/usb/usbdi.h>
#include <dev/usb/usbdi_util.h>
#include <dev/usb/usbdevs.h>
CFDRIVER_DECL(uxxx, DV_DULL, NULL);
extern struct cfdriver uxxx_cd;
extern struct cfattach uxxx_ca;
/* locators: port, config, iface, vendor, product, release */
static int usbdevloc[] = { -1, -1, -1, -1, -1, -1 };
static struct cfparent uhubparent = {
"usbdevif", "uhub", DVUNIT_ANY
};
static struct cfdata uxxx_cfdata[] = {
{"uxxx", "uxxx", 0, FSTATE_STAR, usbdevloc, 0, &uhubparent},
{ 0 }
};
static struct cfdriver *uxxx_cfdrivers[] = {
&uxxx_cd,
NULL
};
static struct cfattach *uxxx_cfattachs[] = {
&uxxx_ca,
NULL
};
static const struct cfattachlkminit uxxx_cfattachinit[] = {
{ "uxxx", uxxx_cfattachs },
{ NULL }
};
int uxxx_lkmentry(struct lkm_table *, int, int);
MOD_DRV("uxxx", uxxx_cfdrivers, uxxx_cfattachinit, uxxx_cfdata);
int
uxxx_lkmentry(struct lkm_table *lkmtp, int cmd, int ver)
{
DISPATCH(lkmtp, cmd, ver, lkm_nofunc, lkm_nofunc, lkm_nofunc);
}
# $NetBSD: Makefile,v 1.2 2005/12/11 12:24:48 christos Exp $
S= ${.CURDIR}/../../../..
KMOD= uxxx
SRCS= uxxx_lkm.c
NOMAN= #yes
WARNS= 2
#CPPFLAGS+= -DDIAGNOSTIC -DLOCKDEBUG
#CPPFLAGS+= -DDIAGNOSTIC -DDEBUG
.PATH: $S/dev/usb
BUILDSYMLINKS+= uxxx.c real-uxxx.c
SRCS+= real-uxxx.c
.include <bsd.kmod.mk>
Home |
Main Index |
Thread Index |
Old Index