Date: Mon, 21 Sep 2009 14:58:40 -0400 From: Pierre-Luc Drouin <pldrouin@pldrouin.net> To: Hans Petter Selasky <hselasky@c2i.net> Cc: ed@freebsd.org, freebsd-usb@freebsd.org Subject: Re: usb/138659: uftdi driver broken in RELENG_8/CURRENT Message-ID: <4AB7CCE0.2000703@pldrouin.net> In-Reply-To: <200909212045.20657.hselasky@c2i.net> References: <4AB6DA79.7050209@pldrouin.net> <200909212014.36874.hselasky@c2i.net> <4AB7C5EA.5090008@pldrouin.net> <200909212045.20657.hselasky@c2i.net>
next in thread | previous in thread | raw e-mail | index | archive | help
Hans Petter Selasky wrote: > On Monday 21 September 2009 20:28:58 Pierre-Luc Drouin wrote: > >> Hans Petter Selasky wrote: >> >>> On Monday 21 September 2009 19:52:13 Pierre-Luc Drouin wrote: >>> >>>> Hans Petter Selasky wrote: >>>> >>>>> On Monday 21 September 2009 19:29:10 Pierre-Luc Drouin wrote: >>>>> >>>>>> Hans Petter Selasky wrote: >>>>>> >>>>>>> On Monday 21 September 2009 03:44:25 Pierre-Luc Drouin wrote: >>>>>>> >>>>>>>> Hi, >>>>>>>> >>>>>>>> I am also having troubles with the uftdi driver on 8.0-BETA4. >>>>>>>> I am trying to use a fan controller (mCubed bigNG) that uses a >>>>>>>> FT232BL chip and it does not seem to be responding on FreeBSD 8.0 >>>>>>>> while the same code works perfectly on Linux (I have not tried the >>>>>>>> code on RELENG_7 yet but I could install it if necessary). >>>>>>>> >>>>>>>> Here is the very simple code I am using for testing: >>>>>>>> #include <termios.h> >>>>>>>> #include <fcntl.h> >>>>>>>> #include <string.h> >>>>>>>> #include <unistd.h> >>>>>>>> #include <stdio.h> >>>>>>>> >>>>>>>> int main(); >>>>>>>> >>>>>>>> #define DEV "/dev/ttyU0" >>>>>>>> >>>>>>>> #define TBAN_SER_SOURCE1 0x05 /* Primary source */ >>>>>>>> #define TBAN_SER_SOURCE2 0x06 /* Alternative source >>>>>>>> (miniNG...) */ >>>>>>>> >>>>>>>> #define TBAN_SER_REQUEST 0x36 >>>>>>>> >>>>>>>> int main() >>>>>>>> { >>>>>>>> int fd; >>>>>>>> int result; >>>>>>>> struct termios oldtio, newtio; >>>>>>>> unsigned char buf[285]; >>>>>>>> >>>>>>>> printf("Opening device\n"); >>>>>>>> fd=open(DEV, O_RDWR | O_NOCTTY); >>>>>>>> >>>>>>>> if(fd<0) { >>>>>>>> perror(DEV); >>>>>>>> return 1; >>>>>>>> } >>>>>>>> >>>>>>>> result=tcgetattr(fd,&oldtio); >>>>>>>> if(result<0) { >>>>>>>> perror("tcgetattr"); >>>>>>>> return 1; >>>>>>>> } >>>>>>>> >>>>>>>> memcpy(&newtio,&oldtio,sizeof(struct termios)); >>>>>>>> newtio.c_cflag = B19200 >>>>>>>> >>>>>>>> | CRTSCTS >>>>>>>> | CS8 >>>>>>>> | CREAD; >>>>>>>> >>>>>>>> newtio.c_iflag = IGNPAR; >>>>>>>> newtio.c_oflag = 0; >>>>>>>> newtio.c_lflag = 0; >>>>>>>> newtio.c_cc[VMIN] = 1; >>>>>>>> newtio.c_cc[VTIME] = 0; >>>>>>>> >>>>>>>> result=tcflush(fd, TCIFLUSH); >>>>>>>> if(result<0) { >>>>>>>> perror("tcflush"); >>>>>>>> return 1; >>>>>>>> } >>>>>>>> >>>>>>>> result=tcsetattr(fd,TCSANOW,&newtio); >>>>>>>> if(result<0) { >>>>>>>> perror("tcsetattr"); >>>>>>>> return 1; >>>>>>>> } >>>>>>>> >>>>>>>> sleep(1); >>>>>>>> >>>>>>>> printf("Performing initial query\n"); >>>>>>>> buf[0]=TBAN_SER_SOURCE1; >>>>>>>> buf[1]=TBAN_SER_REQUEST; >>>>>>>> >>>>>>>> printf("Requesting status\n"); >>>>>>>> result=write(fd,buf,2); >>>>>>>> if(result<0) { >>>>>>>> perror("write"); >>>>>>>> return 1; >>>>>>>> } >>>>>>>> >>>>>>>> sleep(1); >>>>>>>> >>>>>>>> printf("Reading status\n"); >>>>>>>> result=read(fd,buf,32); >>>>>>>> if(result<0) { >>>>>>>> perror("read"); >>>>>>>> return 1; >>>>>>>> } >>>>>>>> >>>>>>>> result=tcsetattr(fd,TCSANOW,&oldtio); >>>>>>>> if(result<0) { >>>>>>>> perror("tcsetattr"); >>>>>>>> return 1; >>>>>>>> } >>>>>>>> >>>>>>>> result=close(fd); >>>>>>>> if(result<0) { >>>>>>>> perror("close"); >>>>>>>> return 1; >>>>>>>> } >>>>>>>> return 0; >>>>>>>> } >>>>>>>> >>>>>>>> It hangs while reading independently of the number of bits I am >>>>>>>> reading. >>>>>>>> >>>>>>>> Here is the output from dmesg when I load the uftdi module: >>>>>>>> Sep 20 21:31:31 ldaemon kernel: uftdi0: <USB - Serial> on usbus6 >>>>>>>> Sep 20 21:31:31 ldaemon kernel: ucom_attach_tty:317: tp = >>>>>>>> 0xffffff001f12b400, unit = 0 Sep 20 21:31:31 ldaemon kernel: >>>>>>>> ucom_attach_tty:346: ttycreate: U0 Sep 20 21:31:34 ldaemon root: >>>>>>>> Unknown USB device: vendor 0x051d product 0x0002 bus uhub0 >>>>>>>> >>>>>>>> Here is the output in /var/log/messages when I enable the debug >>>>>>>> output for ucom and uftdi: Sep 20 21:33:30 ldaemon kernel: >>>>>>>> ucom_open:554: tp = 0xffffff001f12b400 Sep 20 21:33:30 ldaemon >>>>>>>> kernel: ucom_dtr:827: onoff = 1 Sep 20 21:33:30 ldaemon kernel: >>>>>>>> ucom_line_state:799: on=0x01, off=0x00 Sep 20 21:33:30 ldaemon >>>>>>>> kernel: ucom_rts:838: onoff = 1 >>>>>>>> Sep 20 21:33:30 ldaemon kernel: ucom_line_state:799: on=0x02, >>>>>>>> off=0x00 Sep 20 21:33:30 ldaemon kernel: ucom_break:816: onoff = 0 >>>>>>>> Sep 20 21:33:30 ldaemon kernel: ucom_line_state:799: on=0x00, >>>>>>>> off=0x04 Sep 20 21:33:30 ldaemon kernel: ucom_status_change:901: >>>>>>>> Sep 20 21:33:30 ldaemon kernel: ucom_param:950: sc = >>>>>>>> 0xffffff001f12ac58 Sep 20 21:33:30 ldaemon kernel: >>>>>>>> uftdi_pre_param:653: >>>>>>>> Sep 20 21:33:30 ldaemon kernel: ucom_dtr:827: onoff = 1 >>>>>>>> Sep 20 21:33:30 ldaemon kernel: ucom_line_state:799: on=0x01, >>>>>>>> off=0x00 Sep 20 21:33:30 ldaemon kernel: ucom_rts:838: onoff = 1 >>>>>>>> Sep 20 21:33:30 ldaemon kernel: ucom_line_state:799: on=0x02, >>>>>>>> off=0x00 Sep 20 21:33:30 ldaemon kernel: ucom_cfg_open:520: >>>>>>>> Sep 20 21:33:30 ldaemon kernel: uftdi_cfg_open:354: >>>>>>>> Sep 20 21:33:30 ldaemon kernel: uftdi_read_callback:459: status >>>>>>>> change msr=0xf0 (0x00) lsr=0x60 (0x00) Sep 20 21:33:30 ldaemon >>>>>>>> kernel: ucom_status_change:901: >>>>>>>> Sep 20 21:33:30 ldaemon kernel: uftdi_cfg_get_status:705: msr=0xf0 >>>>>>>> lsr=0x60 Sep 20 21:33:30 ldaemon kernel: ucom_cfg_status_change:887: >>>>>>>> DCD changed to 1 Sep 20 21:33:30 ldaemon kernel: >>>>>>>> uftdi_cfg_param:672: Sep 20 21:33:30 ldaemon kernel: ucom_ioctl:653: >>>>>>>> cmd = 0x402c7413 Sep 20 21:33:30 ldaemon kernel: ucom_ioctl:653: cmd >>>>>>>> = 0x80047410 Sep 20 21:33:30 ldaemon kernel: ucom_ioctl:653: cmd = >>>>>>>> 0x802c7414 Sep 20 21:33:30 ldaemon kernel: ucom_param:950: sc = >>>>>>>> 0xffffff001f12ac58 Sep 20 21:33:30 ldaemon kernel: >>>>>>>> uftdi_pre_param:653: >>>>>>>> Sep 20 21:33:30 ldaemon kernel: uftdi_cfg_get_status:705: msr=0xf0 >>>>>>>> lsr=0x60 Sep 20 21:33:30 ldaemon kernel: uftdi_cfg_param:672: >>>>>>>> Sep 20 21:33:30 ldaemon kernel: ucom_get_data:1064: cnt=0 >>>>>>>> Sep 20 21:33:31 ldaemon kernel: ucom_ioctl:653: cmd = 0x80047410 >>>>>>>> Sep 20 21:33:32 ldaemon kernel: ucom_outwakeup:1009: sc = >>>>>>>> 0xffffff001f12ac58 Sep 20 21:33:32 ldaemon kernel: >>>>>>>> ucom_get_data:1064: cnt=2 >>>>>>>> Sep 20 21:33:32 ldaemon kernel: ucom_get_data:1064: cnt=0 >>>>>>>> >>>>>>>> I really need to get this working so I am ready to test things as >>>>>>>> much as I can... >>>>>>>> >>>>>>> Hi, >>>>>>> >>>>>>> You need to set raw mode for the TTY device I think. Maybe Ed can >>>>>>> give you the function name you need to call to do that? >>>>>>> >>>>>>> --HPS >>>>>>> >>>>>> Do I need to do something like that? >>>>>> ioctl(fileno(stdin), TIOCGETP, &tty_org); >>>>>> tty = tty_org; >>>>>> >>>>>> /* set terminal to raw mode ... */ >>>>>> tty.sg_flags |= CRMOD; >>>>>> tty.sg_flags &= ~ECHO; >>>>>> tty.sg_flags &= ~XTABS; >>>>>> tty.sg_flags |= RAW; >>>>>> >>>>>> Thanks! >>>>>> Pierre-Luc Drouin >>>>>> >>>>> Hi, >>>>> >>>>> You need to call this function: >>>>> >>>>> void >>>>> cfmakeraw(struct termios *t); >>>>> >>>>> --HPS >>>>> >>>> Hi, >>>> >>>> it still does not work. I have added the line >>>> cfmakeraw(&newtio); >>>> >>>> just before the call to tcflush and I get the following output in >>>> /var/log/messages: >>>> Sep 21 13:38:46 ldaemon kernel: ucom_open:554: tp = 0xffffff001f12b400 >>>> Sep 21 13:38:46 ldaemon kernel: ucom_dtr:827: onoff = 1 >>>> Sep 21 13:38:46 ldaemon kernel: ucom_line_state:799: on=0x01, off=0x00 >>>> Sep 21 13:38:46 ldaemon kernel: ucom_rts:838: onoff = 1 >>>> Sep 21 13:38:46 ldaemon kernel: ucom_line_state:799: on=0x02, off=0x00 >>>> Sep 21 13:38:46 ldaemon kernel: ucom_break:816: onoff = 0 >>>> Sep 21 13:38:46 ldaemon kernel: ucom_line_state:799: on=0x00, off=0x04 >>>> Sep 21 13:38:46 ldaemon kernel: ucom_status_change:901: >>>> Sep 21 13:38:46 ldaemon kernel: ucom_param:950: sc = 0xffffff001f12ac58 >>>> Sep 21 13:38:46 ldaemon kernel: uftdi_pre_param:653: >>>> Sep 21 13:38:46 ldaemon kernel: ucom_dtr:827: onoff = 1 >>>> Sep 21 13:38:46 ldaemon kernel: ucom_line_state:799: on=0x01, off=0x00 >>>> Sep 21 13:38:46 ldaemon kernel: ucom_rts:838: onoff = 1 >>>> Sep 21 13:38:46 ldaemon kernel: ucom_line_state:799: on=0x02, off=0x00 >>>> Sep 21 13:38:46 ldaemon kernel: ucom_cfg_open:520: >>>> Sep 21 13:38:46 ldaemon kernel: uftdi_cfg_open:354: >>>> uftdi_cfg_get_status:705: msr=0xf0 lsr=0x60 >>>> Sep 21 13:38:46 ldaemon kernel: ucom_cfg_status_change:887: DCD changed >>>> to 1 Sep 21 13:38:46 ldaemon kernel: uftdi_cfg_param:672: >>>> Sep 21 13:38:46 ldaemon kernel: ucom_ioctl:653: cmd = 0x402c7413 >>>> Sep 21 13:38:46 ldaemon kernel: ucom_ioctl:653: cmd = 0x80047410 >>>> Sep 21 13:38:46 ldaemon kernel: ucom_ioctl:653: cmd = 0x802c7414 >>>> Sep 21 13:38:46 ldaemon kernel: ucom_param:950: sc = 0xffffff001f12ac58 >>>> Sep 21 13:38:46 ldaemon kernel: uftdi_pre_param:653: >>>> Sep 21 13:38:46 ldaemon kernel: uftdi_cfg_param:672: >>>> Sep 21 13:38:46 ldaemon kernel: ucom_get_data:1064: cnt=0 >>>> Sep 21 13:38:47 ldaemon kernel: ucom_ioctl:653: cmd = 0x80047410 >>>> Sep 21 13:38:48 ldaemon kernel: ucom_outwakeup:1009: sc = >>>> 0xffffff001f12ac58 Sep 21 13:38:48 ldaemon kernel: ucom_get_data:1064: >>>> cnt=2 >>>> Sep 21 13:38:48 ldaemon kernel: ucom_get_data:1064: cnt=0 >>>> >>> Can you try adding a delay after setting the baud rate? >>> >>> --HPS >>> >> The code already sleeps for 1 second after I applying the baud rate (via >> tcsetattr(fd,TCSANOW,&newtio)). I am not sure to understand what you >> mean... >> > > Hi, > > I mean try adding some: > > usleep(1000000); > > To your code to see if that changes anything. > > Also try reading one byte instead of 32. > > Last, try adding a printout to: > > src/sys/dev/usb/serial/uftdi.c > > uftdi_read_callback() > > and printout the actlen variable. > > --HPS > > ok, so I added the usleep statement right after the existing sleep statement. I also tried reading a single byte. It did not make any difference... I added a print statement to print the value of actlen right after it is set via usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL); Here is the new output in /var/log/messages: Sep 21 14:55:28 ldaemon kernel: ucom_open:554: tp = 0xffffff0139488800 Sep 21 14:55:28 ldaemon kernel: ucom_dtr:827: onoff = 1 Sep 21 14:55:28 ldaemon kernel: ucom_line_state:799: on=0x01, off=0x00 Sep 21 14:55:28 ldaemon kernel: ucom_rts:838: onoff = 1 Sep 21 14:55:28 ldaemon kernel: ucom_line_state:799: on=0x02, off=0x00 Sep 21 14:55:28 ldaemon kernel: ucom_break:816: onoff = 0 Sep 21 14:55:28 ldaemon kernel: ucom_line_state:799: on=0x00, off=0x04 Sep 21 14:55:28 ldaemon kernel: ucom_status_change:901: Sep 21 14:55:28 ldaemon kernel: ucom_param:950: sc = 0xffffff013bcac458 Sep 21 14:55:28 ldaemon kernel: ucom_dtr:827: onoff = 1 Sep 21 14:55:28 ldaemon kernel: ucom_line_state:799: on=0x01, off=0x00 Sep 21 14:55:28 ldaemon kernel: ucom_rts:838: onoff = 1 Sep 21 14:55:28 ldaemon kernel: ucom_line_state:799: on=0x02, off=0x00 Sep 21 14:55:28 ldaemon kernel: ucom_cfg_open:520: Sep 21 14:55:28 ldaemon kernel: actlen is 0 Sep 21 14:55:28 ldaemon kernel: actlen is 2 Sep 21 14:55:28 ldaemon kernel: actlen is 2 Sep 21 14:55:28 ldaemon kernel: ucom_cfg_status_change:887: DCD changed to 1 Sep 21 14:55:28 ldaemon kernel: ucom_ioctl:653: cmd = 0x402c7413 Sep 21 14:55:28 ldaemon kernel: ucom_ioctl:653: cmd = 0x80047410 Sep 21 14:55:28 ldaemon kernel: ucom_ioctl:653: cmd = 0x802c7414 Sep 21 14:55:28 ldaemon kernel: ucom_param:950: sc = 0xffffff013bcac458 Sep 21 14:55:28 ldaemon kernel: actlen is 2 Sep 21 14:55:28 ldaemon last message repeated 12 times Sep 21 14:55:28 ldaemon kernel: ucom_get_data:1064: cnt=0 Sep 21 14:55:28 ldaemon kernel: actlen is 2 Sep 21 14:55:30 ldaemon last message repeated 111 times Sep 21 14:55:30 ldaemon kernel: ucom_ioctl:653: cmd = 0x80047410 Sep 21 14:55:30 ldaemon kernel: actlen is 2 Sep 21 14:55:31 ldaemon last message repeated 62 times Sep 21 14:55:31 ldaemon kernel: ucom_outwakeup:1009: sc = 0xffffff013bcac458 Sep 21 14:55:31 ldaemon kernel: ucom_get_data:1064: cnt=2 Sep 21 14:55:31 ldaemon kernel: ucom_get_data:1064: cnt=0 Sep 21 14:55:31 ldaemon kernel: actlen is 2
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4AB7CCE0.2000703>