Hi, Oliver 

> -----Original Message-----
> From: Oliver Neukum [mailto:[email protected]] 
> Sent: Saturday, March 30, 2013 10:34 AM
> To: Mike Verstegen
> Cc: [email protected]
> Subject: Re: cdc_acm device - unexpected characters sent to USB device
> 
> On Saturday 30 March 2013 03:20:15 Mike Verstegen wrote:
> 
> >  -  Downloaded the source code for the cdc_acm driver. 
> >  -  Added a bunch of printk debug messages and stack_dumps 
> to follow what's going on. 
> >  -  I rmmod'd the "stock" cdc_acm and insmod'd my 
> instrumented module. 
> >  -  All the device enumeration works, right driver attached, etc. 
> >  -  Since the code works on Ubuntu 12.04/Linux 3.2, I 
> grabbed the 3.2 cdc_acm code and compiled that module on the 
> Centos 6 / Linux 3.6 platform. Using that 3.2 module instead 
> of the 3.6 module did not make a difference. I reverted to 
> the 3.6 module. 
> >  -  Turned on the debug file system with usbmon and watched 
> the USB traffic. I can see that there are extra characters 
> being sent on the USB interface. 
> >  -  To watch what's going on, on top of the printk's in the 
> cdc_acm module, I've merged the output of usb mon (cat 
> /sys/kernel/debug/usb/usbmon/3u | logger) and the output of 
> the test application (scan_example /dev/ttyACM0 | logger -s) 
> so I have a single stream of time correlated debug trail. 
> >  -  The spurious characters sent on the USB endpoint are 
> x5E x40 x5E x40 x5E x40 x5E x40 x41 (in ASCII its ^@^@^@^@A ) 
> which looks like some sort of probing or trying to get the 
> attention of a modem These characters are sent immediately 
> after the application's write() causes the 4 hello bytes to 
> be sent to the end point.
> 
> To clarify, is acm_tty_write() called with the additional 
> bytes or isn't it?
> 
>       Regards
>               Oliver
> 
> 

Hi, Oliver

Such a simple question you asked -- but it lead to a useful discovery.

My logs show that acm_tty_write is called multiple times

- The application opens the device and then calls write() to send the 4 byte 
message to the fd. This results in a call to acm_tty_write
- From somewhere else, acm_tty_write is called several times, each with a 
count=1 and one of the offending characters noted above.

To get find out where the unexpected calls to acm_tty_write were coming from, I 
added a dump_stack at the entry point to acm_tty_write. From those stack 
frames, I can see that the first acm_tty_write call is from my application, but 
the second and subsequent calls are from  a kworker thread.

So at this point, it doesn't look like a cdc_acm driver problem, but instead an 
unexpected call to acm_tty_write from another process. Having briefly looked 
the trace output of the kworker queue, it may a challenge to find out what 
thread in there is making this call.

Thanks

Mike--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to