Date: Sat, 01 Feb 1997 18:36:59 -0500 From: "Brian J. McGovern" <mcgovern@spoon.beta.com> To: hackers@freebsd.org Subject: Device driver help needed... Message-ID: <199702012336.SAA12533@spoon.beta.com>
next in thread | raw e-mail | index | archive | help
Ok. I'm sure that now I've terribly bastardized the uio structure, but at least the damn thing compiles :) Let see if I can get some comment on my interpretation of the uio stucture: struct uio { struct iovec *uio_iov; /* Pointer to IO Vector (possible array?) */ int uio_iovcnt; /* Number of IO vectors (?) */ off_t uio_offset; /* Offset in to device */ int uio_resid; /* Length of read request (?) */ enum uio_seg uio_segflg; /* I assume a segment of some kind, but I can only find reference to UIO_SYSSPACE */ enum uio_rw uio_rw; /* UIO_READ or UIO_WRITE (type of operation(?)) */ struct proc *uio_procp; /* No idea, but I've seen it set to curproc */ }; Ok, guys. Beat me up, and let me know whats incorrect. With that in mind, I've bent my device driver to look like this: ------ foo.c --------------------------------------- #define KERNEL #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 }; fooinit() { } 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; } } #define CDEV_MAJOR 20 ------------------------------------------------- Now, I'm sure there are bugs in there. Hell, I didn't know what I was doing half the time :) But, now its time to start debugging, which means I need to get it in to the kernel. Someone mentioned using SYSINIT to get it working as a pseudo-device driver. The file above is located in /usr/src/sys/i386/addons/foo.c. Anyone care to give me a set of steps (and code changes) to get it in the kernel? Thanks. -Brian
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199702012336.SAA12533>