Fix for USB under linux
Hi
I’m playing with the usb serial port code from FreeRTOS V5.0.2 / lwIP_Demo_Rowley_ARM7 and I think there’s a couple of things in the descriptors.h which might be improved.
The serial port can be made to work with linux if you change the value of the interface protocol (the comment is bInterfaceProtocol) in the config descriptor (pxConfigDescriptor) to something valid. It has a value of 0, which I don’t think the spec allows. By making it 1, linux will work. In ubuntu, my device is now available as a serial port named /dev/ttyACM0 . Windows is unaffected, except that you might have to reinstall the driver if you’ve used the old value.
That is, change the value in descriptors.h line 117 from: 0x00 to 0x01 .
Also, I think the values for the vendor id and product id are confusing. The atmel USB vendor id is 0x03EB. In descriptors.h and the FreeRTOSCDC.inf for windows this value has the wrong byte order. This will work fine for the demo, but its confusing as an example (if you did mean to use the atmel vendor id).
Thanks,
Mick D
-– C:/FreeRTOSV5.0.2-orig/Demo/lwIP_Demo_Rowley_ARM7/USB/descriptors.h Fri May 30 16:27:00 2008
+++ C:/FreeRTOSV5.0.2/Demo/lwIP_Demo_Rowley_ARM7/USB/descriptors.h Wed Jun 25 11:47:19 2008
@@ -114,8 +114,8 @@
0x00, /* bDeviceSubclass: */
0x00, /* bDeviceProtocol: */
0x08, /* bMaxPacketSize0 */
– 0x03, 0xEB, /* idVendorL */
– 0x20, 0x09, /* idProductL */
+ 0xEB, 0x03, /* idVendorL */
+ 0x09, 0x20, /* idProductL */
0x10, 0x01, /* bcdDeviceL */
usbMANUFACTURER_STRING, /* iManufacturer */
usbPRODUCT_STRING, /* iProduct */
@@ -148,7 +148,7 @@
0x01, /* bNumEndpoints */
0x02, /* bInterfaceClass: Comm Interface Class */
0x02, /* bInterfaceSubclass: Abstract Control Model*/
– 0x00, /* bInterfaceProtocol */
+ 0x01, /* bInterfaceProtocol */
usbINTERFACE_STRING,/* iInterface */
/* Header Functional Descriptor */
Fix for USB under linux
Excellent information – thanks. I’m updating the SVN repository now.
Regards
Fix for USB under linux
FYI, by making this change device will not be seen as a usb-serial device so
it is not possible to use serial console programs like minicom. Instead
one can change bmCapabilities field in call management functional descriptor
to 0x01(originally it is 0x00). So it will be possible to use serial
emulation programs with the device, at least this is what I’m doing.
Regards,
Caglar
Fix for USB under linux
So you are saying its best to leave bInterfaceProtocol as 0, and change bInterfaceProtocol to 1 instead. Can somebody verify that this will work under Linux too?
Regards.
Fix for USB under linux
Both yes and no. If you were meant to say bmCapabilities in the place second of bInterfaceProtocol in your second, then yes. I’ve tested this on SUSE and it’s working with usbserial module. To test driver someone can try these as root after plugging device.
$modprobe usbserial vendor=0xeb03 product=0x0920
$minicom -s
then write /dev/ttyUSB0 under Serial Port Setup->Serial Device and click ESC twice. It should work.
Regards,
Caglar
Fix for USB under linux
I’ve tried this and can’t get it to work, for ubuntu hardy at least. If I understand you correctly, then compared to the freertos source, there’s only 1 change. bmCapabilities = 0x01 for the call management interface in descriptors.h . My patch is below. /dev/ttyUSB0 shows up after I use the modprobe command, but minicom seems to hang when sending to it, even running as root.
I tried minicom with my previous patch, and it worked with /dev/ACM0 ok.
Thanks
-– FreeRTOSV5.0.2-orig/Demo/lwIP_Demo_Rowley_ARM7/USB/descriptors.h 2008-05-30 16:27:00 +0800
+++ FreeRTOSV5.0.2/Demo/lwIP_Demo_Rowley_ARM7/USB/descriptors.h 2008-06-26 14:11:31 +0800
@@ -175,7 +175,7 @@
0x05, /* bFunctionLength */
0x24, /* bDescriptor type: CS_INTERFACE */
0x01, /* bDescriptor subtype: Call Management Func*/
– 0x00, /* bmCapabilities: D1 + D0 */
+ 0x01, /* bmCapabilities: D1 + D0 */
0x01, /* bDataInterface: Data Class Interface 1*/
/* CDC Control – Endpoint 3 descriptor
Fix for USB under linux
You are right, your solution is working with minicom also. Both methods are working for me.
Regards,
Caglar
Fix for USB under linux
I have used LPCUSB on a NXP lpc2368 and it sets both bInterfaceProtocol and bmCapabilities to a 1. It works fine for me in Ubuntu using minicom.
// device descriptor
0x12,
DESC_DEVICE,
LE_WORD(0x0101), // bcdUSB
0x02, // bDeviceClass
0x00, // bDeviceSubClass
0x00, // bDeviceProtocol
MAX_PACKET_SIZE0, // bMaxPacketSize
LE_WORD(0xFFFF), // idVendor
LE_WORD(0x0005), // idProduct
LE_WORD(0x0100), // bcdDevice
0x01, // iManufacturer
0x02, // iProduct
0x03, // iSerialNumber
0x01, // bNumConfigurations
// configuration descriptor
0x09,
DESC_CONFIGURATION,
LE_WORD(67), // wTotalLength
0x02, // bNumInterfaces
0x01, // bConfigurationValue
0x00, // iConfiguration
0xC0, // bmAttributes
0x32, // bMaxPower
// control class interface
0x09,
DESC_INTERFACE,
0x00, // bInterfaceNumber
0x00, // bAlternateSetting
0x01, // bNumEndPoints
0x02, // bInterfaceClass
0x02, // bInterfaceSubClass
0x01, // bInterfaceProtocol, linux requires value of 1 for the cdc_acm module
0x00, // iInterface
// header functional descriptor
0x05,
CS_INTERFACE,
0x00,
LE_WORD(0x0110),
// call management functional descriptor
0x05,
CS_INTERFACE,
0x01,
0x01, // bmCapabilities = device handles call management
0x01, // bDataInterface
// ACM functional descriptor
0x04,
CS_INTERFACE,
0x02,
0x02, // bmCapabilities
// union functional descriptor
0x05,
CS_INTERFACE,
0x06,
0x00, // bMasterInterface
0x01, // bSlaveInterface0
// notification EP
0x07,
DESC_ENDPOINT,
INT_IN_EP, // bEndpointAddress
0x03, // bmAttributes = intr
LE_WORD(8), // wMaxPacketSize
0x0A, // bInterval
// data class interface descriptor
0x09,
DESC_INTERFACE,
0x01, // bInterfaceNumber
0x00, // bAlternateSetting
0x02, // bNumEndPoints
0x0A, // bInterfaceClass = data
0x00, // bInterfaceSubClass
0x00, // bInterfaceProtocol
0x00, // iInterface
// data EP OUT
0x07,
DESC_ENDPOINT,
BULK_OUT_EP, // bEndpointAddress
0x02, // bmAttributes = bulk
LE_WORD(MAX_PACKET_SIZE), // wMaxPacketSize
0x00, // bInterval
// data EP in
0x07,
DESC_ENDPOINT,
BULK_IN_EP, // bEndpointAddress
0x02, // bmAttributes = bulk
LE_WORD(MAX_PACKET_SIZE), // wMaxPacketSize
0x00, // bInterval
Fix for USB under linux
Sorry to re-open an old discussion but I see that the bInterfaceProtocol is back to 0x00 since revision 426 as evidenced here: http://freertos.svn.sourceforge.net/viewvc/freertos/trunk/Demo/lwIP_Demo_Rowley_ARM7/USB/descriptors.h?r1=400&r2=426
Is there a reason for that? I am asking because without that I haven’t been able to get USB working from Linux (I am using Ubuntu Hardy) without setting bInterfacceProtocol to 1.
Thanks.
Fix for USB under linux
Unfortunately I don’t have a Linux machine to test on, and I get conflicting reports from users on how the descriptors should be configured. Its nothing more than that.
Regards.