ugen write hangs on BSD 7.2

Engineering ee at athyriogames.com
Wed May 26 23:37:34 UTC 2010


Hello all

I am having trouble communicating with a custom HID device using FreeBSD
7.2.

I was trying to use uhid, but it looks like it doesn't do interrupt out
transfers.

Open and read work fine, but write() errors with EIO

The device is a simple PIC based IO board. When sent 64 bytes, it responds
with 64 bytes. Oddly enough, my Windows version using ReadFile and WriteFile
works perfectly.

I'm looking into upgrading to BSD 8.0, but we have a lot of legacy code for
USB that won't compile under BSD8, so I'd rather avoid it. I wrote a small
test program - under BSD 8.0, it no longer hangs, but it still doesn't
write, so I'm not sure 8.0 is the answer. Although it looks like the naming
changed for 8. For instance, my device would be ugen0, and the first
endpoint would be ugen0.1. On 8.0, ugen0-ugen4 are always there, and
plugging the device in gets me ugen2.1 - not sure where the interrupt
endpoint went!

Here's a quick look at the test code, and output with hw.usb.debug on

void errp(void); // printfs errors in nice format

unsigned char io_buf[65];	//Allocate a memory buffer equal to our
endpoint size + 1  NOT ON STACK!!

int main(int argc,char *argv[])
{
	int bw;
	int i;
	int err;
	int device;
	char devname[64];

	if (argc != 2)
	{
		printf("Specify device\n");
		exit(1);
	}

	sprintf(devname,"/dev/%s",argv[1]);
	device = open(devname,O_RDWR);//|O_NONBLOCK|O_NDELAY );
	printf("Open dev %s: %d\n",devname,device);

	for(i=0;i<5;i++)
	{
		bw = write(device,io_buf,64);
		printf("write %d bytes to %d returned %d\n",64,device,bw);
		if (bw == (-1))	errp();
		bw = read(device,io_buf,64);
		printf("read %d bytes\n",bw);
		if (bw == (-1))	errp();
	}
	close(device);
	exit(0);
}




#./iotest ugen0.1
May 26 15:40:10  kernel: usbd_open_pipe: iface=0xc54dc960 address=0x1
flags=0x0
May 26 15:40:10  kernel: usbd_setup_pipe: dev=0xc5335a80 iface=0xc54dc960
ep=0xc54dc9cc pipe=0xe7b9b958
May 26 15:40:10  kernel: usbd_open_pipe_intr: address=0x81 flags=0x4 len=64
May 26 15:40:10  kernel: usbd_open_pipe: iface=0xc54dc960 address=0x81
flags=0x1
May 26 15:40:10  kernel: usbd_setup_pipe: dev=0xc5335a80 iface=0xc54dc960
ep=0xc54dc9c0 pipe=0xe7b9b930
May 26 15:40:10  kernel: usbd_alloc_xfer() = 0xc529c600
May 26 15:40:10  kernel: usbd_transfer: xfer=0xc529c600, flags=4,
pipe=0xc57b9480, running=0
May 26 15:40:10  kernel: usbd_dump_queue: pipe=0xc57b9480
May 26 15:40:10  kernel: usb_insert_transfer: pipe=0xc57b9480 running=0
timeout=0
Open dev /dev/ugen0.1: 3
May 26 15:40:10  kernel: usbd_alloc_xfer() = 0xc528c000
May 26 15:40:10  kernel: usbd_intr_transfer: start transfer 64 bytes
May 26 15:40:10  kernel: usbd_transfer: xfer=0xc528c000, flags=0,
pipe=0xc57c2a00, running=0
May 26 15:40:10  kernel: usbd_dump_queue: pipe=0xc57c2a00
May 26 15:40:10  kernel: usb_insert_transfer: pipe=0xc57c2a00 running=0
timeout=0

Stalls here, until CTRL-C

May 26 15:40:22  kernel: usbd_intr_transfer: tsleep=-1
May 26 15:40:22  kernel: usbd_ar_pipe: pipe=0xc57c2a00
May 26 15:40:22  kernel: usbd_dump_queue: pipe=0xc57c2a00
May 26 15:40:22  kernel: xfer=0xc528c000
May 26 15:40:22  kernel: usbd_ar_pipe: pipe=0xc57c2a00 xfer=0xc528c000
(methods=0xc0c50924)
May 26 15:40:22  kernel: usb_schedsoftintr: polling=0
May 26 15:40:22  kernel: usb_transfer_complete: pipe=0xc57c2a00
xfer=0xc528c000 status=6 actlen=0
May 26 15:40:22  kernel: usb_transfer_complete: repeat=0 new head=0
May 26 15:40:22  kernel: usbd_free_xfer: 0xc528c000
May 26 15:40:22  kernel: usbd_ar_pipe: pipe=0xc57c2a00
May 26 15:40:22  kernel: usbd_dump_queue: pipe=0xc57c2a00
May 26 15:40:22  kernel: usbd_ar_pipe: pipe=0xc57b9480
May 26 15:40:22  kernel: usbd_dump_queue: pipe=0xc57b9480
May 26 15:40:22  kernel: xfer=0xc529c600
May 26 15:40:22  kernel: usbd_ar_pipe: pipe=0xc57b9480 xfer=0xc529c600
(methods=0xc0c50924)
May 26 15:40:22  kernel: usb_schedsoftintr: polling=0
May 26 15:40:22  kernel: usb_transfer_complete: pipe=0xc57b9480
xfer=0xc529c600 status=6 actlen=0
May 26 15:40:22  kernel: usb_transfer_complete: repeat=0 new head=0
May 26 15:40:29  kernel: usb_event_thread: woke up
May 26 15:40:29  kernel: usb_discover
May 26 15:40:29  kernel: usb_event_thread: woke up
May 26 15:40:29  kernel: usb_discover
May 26 15:40:29  kernel: usb_event_thread: woke up

Any ideas?
Sam




More information about the freebsd-usb mailing list