write/read data to/from parallel port
Gaye Abdoulaye Walsimou
walsimou at walsimou.com
Wed Dec 19 08:06:09 PST 2007
Hello List,
I am trying to learn driver writing under FreeBSD. My first goal is
reading/writing data through parallel port (0x378).
here is some dmesg output
ppc0: <Parallel port> at port 0x378-0x37f irq 7 on isa0
ppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode
ppc0: FIFO with 16/16/16 bytes threshold
Do I have to read all doc about ISA devices in the arch-handbook,
because there isn't any other way to do it?
Here is what I began to do (inspired by the arch-handbook, I can kldload
and kldunload) :
#include <sys/types.h>
#include <sys/module.h>
#include <sys/systm.h> /* uprintf */
#include <sys/errno.h>
#include <sys/param.h> /* defines used in kernel.h */
#include <sys/kernel.h> /* types used in module initialization */
#include <sys/conf.h> /* cdevsw struct */
#include <sys/uio.h> /* uio struct */
#include <sys/malloc.h>
/* Function prototypes */
static d_open_t mpp0_open;
static d_close_t mpp0_close;
static d_read_t mpp0_read;
static d_write_t mpp0_write;
/* Character device entry points */
static struct cdevsw mpp0_cdevsw = {
.d_version = D_VERSION,
.d_open = mpp0_open,
.d_close = mpp0_close,
.d_read = mpp0_read,
.d_write = mpp0_write,
.d_name = "mpp0",
};
/* vars */
static struct cdev *mpp0_dev;
/*
* This function is called by the kld[un]load(2) system calls to
* determine what actions to take when a module is loaded or unloaded.
*/
static int
mpp0_loader(struct module *m, int what, void *arg)
{
int err = 0;
switch (what) {
case MOD_LOAD: /* kldload */
mpp0_dev = make_dev(&mpp0_cdevsw,
0,
UID_ROOT,
GID_WHEEL,
0666,
"mpp0");
uprintf("mpp0 device loaded.\n");
break;
case MOD_UNLOAD: /* kldunload*/
destroy_dev(mpp0_dev);
uprintf("mpp0 device unloaded.\n");
break;
default:
err = EOPNOTSUPP;
break;
}
return(err);
}
static int
mpp0_open(struct cdev *dev, int oflags, int devtype, struct thread *p)
{
int err = 0;
uprintf("Opened device \"mpp0\" successfully.\n");
return(err);
}
static int
mpp0_close(struct cdev *dev, int fflag, int devtype, struct thread *p)
{
uprintf("Closing device \"mpp0\" successfully.\n");
return(0);
}
static int
mpp0_read(struct cdev *dev, struct uio *uio, int ioflag)
{
int err = 0;
if(uio->uio_resid > 0)
{
uprintf("Reading device \"mpp0\"\n");
}
return(err);
}
static int
mpp0_write(struct cdev *dev, struct uio *uio, int ioflag)
{
int err = 0;
if(uio->uio_resid > 0)
{
uprintf("Writing device \"mpp0\"\n");
}
return(err);
}
DEV_MODULE(mpp0,mpp0_loader,NULL);
More information about the freebsd-drivers
mailing list