Date: Sat, 12 Aug 2000 04:14:30 -0700 From: Devin Butterfield <dbutter@wireless.net> To: Mike Smith <msmith@FreeBSD.ORG>, freebsd-hackers@FreeBSD.ORG Subject: Re: Need help with driver....(long) Message-ID: <39953196.1103F555@wireless.net> References: <200008112235.PAA00839@mass.osd.bsdi.com>
next in thread | previous in thread | raw e-mail | index | archive | help
Mike Smith wrote: > > > I'm a newbie to device driver writing and I have been learning well by > > reading the code of the other drivers in the system. I would ultimately > > like to port a linux driver for a VoIP telephony card (Quicknet > > PhoneJack) to FreeBSD, and so far I have a skeleton driver which does > > successfully probe the card. > > It does? How? Is this a PnP card? Yes, it is a PnP card. > MAKEDEV is a script which does not interact with the kernel in any way. > You need to explicitly update MAKEDEV to know about your device. Ok, thanks for clearing that up. :) > Where are you initialising these fields in the softc? (I assume, in your > probe, correct?) > Well, I think I'm initializing it correctly...see below. > You should check the return values from bus_alloc_resource and make_dev, > both of which you need to save in the softc so that you can detach > correctly. Ok, I'll try this... One thing I did try, was to write a very simple program to open the device (now that I have correctly created the node in /dev) and I inserted a printf in my ixj_open() in the driver to indicate that it entered the open function...and this does seem to work. If open succeeds, can I safely conclude that I'm doing things right? On another note, I also compiled my skeleton driver as a module and it loads ok, but if I try to use my little program to open the device, it fails. I then tried inserting printf's in the probe and attach functions, but when I load the module I still don't get any output. It doesn't seem the driver probes or attaches if I load it as a module. What am I doing wrong? Below is the skeleton driver. I apologize if posting the entire thing was inappropriate, but this way you guys can see exactly what I'm doing, and more specifically, what I'm doing wrong. ;) Thanks again. -- Regards, Devin. #include <sys/types.h> #include <sys/param.h> #include <sys/systm.h> #include <sys/malloc.h> #include <sys/conf.h> #include <sys/kernel.h> #include <sys/module.h> #include <sys/uio.h> #include <sys/bus.h> #include <machine/bus.h> #include <machine/resource.h> #include <sys/rman.h> #include <isa/isavar.h> /* more ISA stuff... */ struct ixj_softc { /* param struct per a dev. */ dev_t dev; int port_rid; /* resource id for port range */ int port_used; /* nonzero if ports used */ struct resource* port_res; /* resource for port range */ }; /* Function prototypes */ static devclass_t ixj_isa_devclass; static int ixj_isa_probe(device_t dev); static int ixj_isa_attach(device_t dev); static int ixj_isa_detach(device_t dev); static d_open_t ixj_open; static d_close_t ixj_close; static d_read_t ixj_read; static d_write_t ixj_write; static d_ioctl_t ixj_ioctl; #define CDEV_MAJOR 100 #define NIXJ 16 static struct cdevsw ixj_cdevsw = { ixj_open, /* open */ ixj_close, /* close */ ixj_read, /* read */ ixj_write, /* write */ ixj_ioctl, /* ioctl */ nopoll, nommap, nostrategy, "ixj", /* name */ CDEV_MAJOR, /* major */ nodump, nopsize, 0, -1 /* bmaj */ }; /* Possible Vendor ID's */ /* add ID's for all cards here */ static struct isa_pnp_id ixj_ids[] = { { 0x10048946, "QTI0400 Internet PhoneJack" }, /* QTI0400 */ { 0, NULL } }; static int ixj_isa_probe(device_t dev) /* isapnp probe */ { struct ixj_softc *sc = device_get_softc(dev); /* initialize softc */ bzero(sc, sizeof(struct ixj_softc)); /* get value from pnp probe */ if(ISA_PNP_PROBE(device_get_parent(dev), dev, ixj_ids) == ENXIO) return ENXIO; return (0); } static int ixj_isa_attach (device_t dev) /* attach device */ { /* int unit = device_get_unit(dev); */ struct ixj_softc *sc = device_get_softc(dev); struct resource *res; int rid; int size; printf("attaching device.\n"); if (sc->port_used > 0) { size = sc->port_used; rid = sc->port_rid; res = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, 0ul, ~0ul, size, RF_ACTIVE); if (res) { sc->port_rid = rid; sc->port_res = res; sc->port_used = size; } } sc->dev = make_dev(&ixj_cdevsw, 0, UID_ROOT, GID_WHEEL, 0666, "phone0"); return (0); } static int ixj_isa_detach (dev) /* detach device */ device_t dev; { struct ixj_softc *sc = device_get_softc(dev); /* release io resources */ bus_release_resource(dev, SYS_RES_IOPORT, sc->port_rid, sc->port_res); return (0); } static device_method_t ixj_isa_methods[] = { /* Device interface */ DEVMETHOD(device_probe, ixj_isa_probe), DEVMETHOD(device_attach, ixj_isa_attach), DEVMETHOD(device_detach, ixj_isa_detach), { 0, 0 } }; static driver_t ixj_isa_driver = { "ixj", ixj_isa_methods, sizeof(struct ixj_softc) }; static int ixj_open(dev_t dev, int oflags, int devtype, struct proc *p) { /* do stuff here */ printf("Phone device successfully opened.\n"); return (0); } static int ixj_close(dev_t dev, int fflag, int devtype, struct proc *p) { /* do stuff here */ printf("Phone device successfully closed.\n"); return (0); } static int ixj_read(dev_t dev, struct uio *uio, int ioflag) { /* do stuff here */ return (0); } static int ixj_write(dev_t dev, struct uio *uio, int ioflag) { /* do stuff here */ return (0); } static int ixj_ioctl (dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) { /* do stuff here */ return (0); } DRIVER_MODULE(ixj, isa, ixj_isa_driver, ixj_isa_devclass, 0, 0); To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?39953196.1103F555>