Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 22 Apr 1996 01:43:03 -0400 (EDT)
From:      Dave Chapeskie <dchapes@zeus.leitch.com>
To:        jfrancis@frii.com
Cc:        hackers@FreeBSD.ORG
Subject:   Device Driver ioctl() help
Message-ID:  <199604220543.BAA01869@tap.zeus.leitch.com>
In-Reply-To: <199604220432.WAA06308@deimos.frii.com>

next in thread | previous in thread | raw e-mail | index | archive | help
In message <199604220432.WAA06308@deimos.frii.com> jfrancis@frii.com writes:
>#define JOY_SETTIMEOUT    _IOW('J', 1, int)    /* set timeout */
[...]
>	Ok, it looks like the 'J' has something to do with a "group",
>but what kind of group?  How is this value chosen and what does it do?

    Get a good book on writing device drivers.  Typically you just use
group 0 unless you know what you're doing. _IO is used when no data is
needed; _IOR when you need data returned from the driver; _IOW when you
want data passed into the driver; and _IOWR to pass the data both ways.

>	In my user-level code, I can call `ioctl(fd,STUFF,0x69)'.  In

    Ack!!  RTFM, ioctl's third argument is a pointer.

ie: header:
	#define MYDEV_CMD1	_IOW(0,1,int)
user code:
	int arg = 42;
	ioctl(fd,MYDEV_CMD1,&arg)
driver code:
int
mydev_ioctl(dev_t dev, int cmd, caddr_t data, int flags, struct proc *p)
{
	switch(cmd) {
	case MYDEV_CMD1:
		if( *(int*)data == 42 )
....


>Obviously I'm missing something, but none
>of the kernel books I have tell me what, and I can't seem to sort it
>out.

    I think you need a better book.  I can't recommend one at the moment
since I'm not at work where my bookshelf is.

-- 
Dave Chapeskie
Leitch Technology International Inc.
Email: dchapes@zeus.leitch.com



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