Asynchronous Communications with uftdi/ucom (Is there a bug?)

Pierre-Luc Drouin pldrouin at pldrouin.net
Mon Sep 28 04:48:38 UTC 2009


Hi,

I am trying to communicate with a fan controller that uses a FTDI 
FT232BL chip with uftdi/ucom and I am having troubles with asynchronous 
communications on FreeBSD (7.2 amd64 and 8.0-RC1 amd64, although what I 
present here has been obtained with 8.0-RC1 amd64). The exact same code 
works perfectly on Linux (amd64 on the same machine). I got synchronous 
communications working, but it seems that in asynchronous 
communications, SIGIO is generated randomly and read statements produce 
either junk or return the EINT, "Interrupted system call" error.

What I did is to write simplified code where I only request the device 
to provide its status. I have a source file that performs this in 
synchronous mode (bigngtest.c) and another one that does this in 
asynchronous mode (bigngtestasync.c). I ran both codes while enabling 
debug mode for uftdi and ucom and I put the output to stdout and the 
output to dmesg in some files. I also created files where I put the 
output when running the same codes on Linux.

These files can be found in a bzipped2 tar file here: 
http://download.yousendit.com/Y1Ryc0wwdGpVbTlFQlE9PQ

To summarize, here is how I set asynchronous mode compared to 
synchronous mode, in a "diff" format
 >   struct sigaction saio;
<   fd=open(DEV, O_RDWR | O_NOCTTY);
 >   fd=open(DEV, O_RDWR | O_NOCTTY | O_NONBLOCK);
...
 >   /* Install the signal handler before making the device asynchronous */
 >   saio.sa_handler = signal_handler_IO;
 >   result = sigemptyset(&saio.sa_mask);
 >   if(result<0) {
 >       perror("sigemptyset");
 >       return 1;
 >   }
 >   saio.sa_flags = 0;
 >   sigaction(SIGIO,&saio,NULL);
 >
 >   /* Allow the process to receive SIGIO */
 >   fcntl(fd, F_SETOWN, getpid());
 >   /* Make the file descriptor asynchronous */
 >   fcntl(fd, F_SETFL, FASYNC);

Please let me know if there are additional commands that are required to 
set asynchronous mode correctly on FreeBSD. Otherwise, it looks like 
there might be a bug somewhere in a kernel driver...

Thank you!
Pierre-Luc Drouin


More information about the freebsd-usb mailing list