Date: Sat, 01 Feb 1997 22:27:51 -0500 From: "Brian J. McGovern" <mcgovern@spoon.beta.com> To: hackers@freebsd.org Subject: Device Driver: Almost home(?) Message-ID: <199702020327.WAA00333@spoon.beta.com>
next in thread | raw e-mail | index | archive | help
Ok. I've collated a half dozen responses, and merged them in to what I hope is less of a Frankenstein. At this point, I've modified files.i386, and moved foo.c in to /usr/src/sys/dev/foo/foo.c. I've added a "pseudo-device foo 1" line to the config file, and see foo.h being generated with an NFOO #define'ed to 1. I see the make depend and the make compile the chunk, so I'm fairly sure its making it in there. However, I don't think fooinit() is being run properly, and I'm not sure of the call I make to register the device. As before, if someone can sanity check me, and let me take it a step or two further, I'd appreciate it. I think that once I can get it to where I can tinker and debug, I should be set. Also, I'm getting a warning about the SYSINIT macro, stating "warning: initialization from incompatible pointer type". If someone could give me a lead on that as well, I'd appreciate it. Anyhow, here is the contents of foo.c: #include <sys/param.h> #include <sys/systm.h> #include <sys/reboot.h> #include <sys/ioctl.h> #include <sys/tty.h> #include <sys/proc.h> #include <sys/conf.h> #include <sys/file.h> #include <sys/uio.h> #include <sys/kernel.h> #include <sys/malloc.h> #include <sys/syslog.h> #ifdef DEVFS #include <sys/devfsext.h> #endif #include <machine/clock.h> #include <i386/isa/isa.h> #include <i386/isa/isa_device.h> static char message[] = "The quick brown fox jumps over a lazy dog\n"; #define CDEV_MAJOR 20 static d_read_t fooread; static struct cdevsw foo_cdevsw = { nxopen, nxclose, fooread, nxwrite, nxioctl, nxstop, nxreset, nxdevtotty, nxselect, nxmmap, NULL, "foo", NULL, -1 }; static void fooinit(void) { dev_t dev; printf("Test character driver\n"); cdevsw_add(&dev,&foo_cdevsw,NULL); } static int fooread(dev,myuio, flag) dev_t dev; struct uio *myuio; int flag; { unsigned char *buffer_pointer; int toread; if ((myuio->uio_iovcnt != 1) || (minor(dev) != 0)) return ENODEV; while(myuio->uio_resid) { buffer_pointer = (message + (myuio->uio_offset % sizeof(message))); toread = ((long unsigned int)(message + sizeof(message)) - (long unsigned int)buffer_pointer); uiomove(buffer_pointer, toread, myuio); myuio->uio_offset + toread; myuio->uio_resid = myuio->uio_resid - toread; } return 0; } SYSINIT(foodev, SI_SUB_DRIVERS, SI_ORDER_MIDDLE+CDEV_MAJOR, fooinit, NULL); As always, thanks in advance. -Brian
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199702020327.WAA00333>