Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 10 Apr 2008 11:48:44 -0400
From:      John Baldwin <jhb@freebsd.org>
To:        freebsd-drivers@freebsd.org
Cc:        Rick Hunnicutt <rk_hunnicutt@yahoo.com>
Subject:   Re: New driver writer
Message-ID:  <200804101148.44612.jhb@freebsd.org>
In-Reply-To: <535058.32207.qm@web37606.mail.mud.yahoo.com>

index | next in thread | previous in thread | raw e-mail

On Tuesday 08 April 2008 03:29:07 pm Rick Hunnicutt wrote:
> Hello all,
>  
> I'm writing a BSD PCI character driver and have many questions. I have the 
architecture handbook and it answers some questions but leaves much 
unaddressed. For example, the parameters on the open/close/read/write calls 
don't seems to be address. Am I expected to dig around the code base to 
decipher their purpose or have I missed a vital area of documentation?
>  
> Thank you for your help.

Yeah, you'll have to dig for now. :(  The way you normally do cdev's though is 
something like this:

struct foo_softc {
	device_t	foo_dev;
	...
	struct cdev	*foo_cdev;
	...
};

static int
static int
foo_attach(device_t dev)
{
	struct foo_softc *sc;

	sc = device_get_softc(dev);
	....

	sc->foo_cdev = make_dev(&foo_cdevsw, unit2minor(device_get_unit(dev)),
	    UID_ROOT, GID_WHEEL, 0600, "foo%d", device_get_unit(dev));
	if (sc->foo_cdev == NULL)
		/* error handling */
	sc->foo_cdev->si_drv1 = sc;
	...
}

static int
foo_detach(device_t dev)
{

	...
	if (sc->foo_cdev)
		destroy_dev(sc->foo_cdev);
	...
}

static int
foo_open(struct cdev *dev, int flag, int mode, struct thread *td)
{
	struct foo_softc *sc;

	sc = dev->si_drv1;
	/* Now you have the foo_softc structure and can do whatever you want */
}

That is, the trick is for the driver to store a pointer to its softc structure 
in the 'si_drv1' member of the cdev when you create the cdev.  You can then 
get the softc pointer out of 'si_drv1' in your cdevsw routines.  There are 
also 'si_drv0' (u_int) and 'si_drv2' (another void * like 'si_drv1') fields 
in 'struct cdev' that the driver "owns" and is free to put whatever data is 
desired in.

-- 
John Baldwin


help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200804101148.44612.jhb>