Difference between revisions of "Unit USBCDCACM"

From Ultibo.org
Jump to: navigation, search
Line 604: Line 604:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 619: Line 619:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 631: Line 631:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 643: Line 643:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 655: Line 655:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 670: Line 670:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Device'''
+
! Device
 
| The USB device to attempt to bind to
 
| The USB device to attempt to bind to
 
|-
 
|-
! '''Interrface'''
+
! Interrface
 
| The USB interface to attempt to bind to (or nil for whole device)
 
| The USB interface to attempt to bind to (or nil for whole device)
 
|-
 
|-
! '''Return'''
+
! Return
| USB_STATUS_SUCCESS if completed, USB_STATUS_DEVICE_UNSUPPORTED if unsupported or another error code on failure
+
| USB_STATUS_SUCCESS if completed, USB_STATUS_DEVICE_UNSUPPORTED if unsupported or another error code on failure.
 
|-
 
|-
 
|}
 
|}
Line 688: Line 688:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Device'''
+
! Device
 
| The USB device to unbind from
 
| The USB device to unbind from
 
|-
 
|-
! '''Interrface'''
+
! Interrface
 
| The USB interface to unbind from (or nil for whole device)
 
| The USB interface to unbind from (or nil for whole device)
 
|-
 
|-
! '''Return'''
+
! Return
 
| USB_STATUS_SUCCESS if completed or another error code on failure
 
| USB_STATUS_SUCCESS if completed or another error code on failure
 
|-
 
|-
Line 706: Line 706:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Request'''
+
! Request
 
| The USB request which has completed
 
| The USB request which has completed
 
|-
 
|-
Line 718: Line 718:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Request'''
+
! Request
 
| The USB request which has completed
 
| The USB request which has completed
 
|-
 
|-
! '''Note'''
+
! Note
 
| Request is passed to worker thread for processing to prevent blocking the USB completion
 
| Request is passed to worker thread for processing to prevent blocking the USB completion
 
|-
 
|-
Line 733: Line 733:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Request'''
+
! Request
 
| The USB transmit request to use
 
| The USB transmit request to use
 
|-
 
|-
! '''Note'''
+
! Note
 
| Caller must hold the lock on the serial device
 
| Caller must hold the lock on the serial device
 
|-
 
|-
Line 748: Line 748:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Request'''
+
! Request
 
| The USB request which has completed
 
| The USB request which has completed
 
|-
 
|-
Line 760: Line 760:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Request'''
+
! Request
 
| The USB request which has completed
 
| The USB request which has completed
 
|-
 
|-
! '''Note'''
+
! Note
 
| Request is passed to worker thread for processing to prevent blocking the USB completion
 
| Request is passed to worker thread for processing to prevent blocking the USB completion
 
|-
 
|-
Line 775: Line 775:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Request'''
+
! Request
 
| The USB request which has completed
 
| The USB request which has completed
 
|-
 
|-
Line 787: Line 787:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Request'''
+
! Request
 
| The USB request which has completed
 
| The USB request which has completed
 
|-
 
|-
! '''Note'''
+
! Note
 
| Request is passed to worker thread for processing to prevent blocking the USB completion
 
| Request is passed to worker thread for processing to prevent blocking the USB completion
 
|-
 
|-
Line 805: Line 805:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Device'''
+
! Device
 
| USB device to check
 
| USB device to check
 
|-
 
|-
! '''Quirks'''
+
! Quirks
 
| Return value for any device specific quirks (eg CDCACM_QUIRK_NO_UNION_NORMAL)
 
| Return value for any device specific quirks (eg CDCACM_QUIRK_NO_UNION_NORMAL)
 
|-
 
|-
! '''Return'''
+
! Return
 
| USB_STATUS_SUCCESS if completed or another error code on failure
 
| USB_STATUS_SUCCESS if completed or another error code on failure
 
|-
 
|-
Line 823: Line 823:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Device'''
+
! Device
 
| USB device to check
 
| USB device to check
 
|-
 
|-
! '''Interrface'''
+
! Interrface
 
| USB interface to check
 
| USB interface to check
 
|-
 
|-
! '''Return'''
+
! Return
 
| USB_STATUS_SUCCESS if completed or another error code on failure
 
| USB_STATUS_SUCCESS if completed or another error code on failure
 
|-
 
|-
Line 841: Line 841:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Device'''
+
! Device
 
| USB device to check
 
| USB device to check
 
|-
 
|-
! '''Interrface'''
+
! Interrface
 
| USB interface to check
 
| USB interface to check
 
|-
 
|-
! '''Return'''
+
! Return
 
| USB_STATUS_SUCCESS if completed or another error code on failure
 
| USB_STATUS_SUCCESS if completed or another error code on failure
 
|-
 
|-
Line 859: Line 859:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Device'''
+
! Device
 
| USB device to check
 
| USB device to check
 
|-
 
|-
! '''Interrface'''
+
! Interrface
 
| USB interface to check (Optional)
 
| USB interface to check (Optional)
 
|-
 
|-
! '''DataInterface'''
+
! DataInterface
 
| Return value for the located data interface
 
| Return value for the located data interface
 
|-
 
|-
! '''ControlInterface'''
+
! ControlInterface
 
| Return value for the located control interface
 
| Return value for the located control interface
 
|-
 
|-
! '''Quirks'''
+
! Quirks
 
| Any known quirks for this device from identification (eg CDCACM_QUIRK_NO_UNION_NORMAL)
 
| Any known quirks for this device from identification (eg CDCACM_QUIRK_NO_UNION_NORMAL)
 
|-
 
|-
! '''Capabilities'''
+
! Capabilities
 
| Return value for ACM capabilities (eg USB_CDC_ACM_CAP_LINE)
 
| Return value for ACM capabilities (eg USB_CDC_ACM_CAP_LINE)
 
|-
 
|-
! '''Return'''
+
! Return
 
| USB_STATUS_SUCCESS if completed or another error code on failure
 
| USB_STATUS_SUCCESS if completed or another error code on failure
 
|-
 
|-
Line 889: Line 889:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 901: Line 901:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 913: Line 913:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 925: Line 925:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-

Revision as of 06:08, 24 April 2018

Return to Unit Reference


Description


USB CDC ACM Driver unit

The Abstract Control Model (ACM) is part of the USB Communications Device Class (CDC) standard which allows modem like devices to be supported by USB with a standardized protocol for data transfer and modem control.

A CDC ACM device is defined by information in the interface descriptors and is not specific to any product and vendor Id. There are numerous devices that support the CDC ACM protocol and some of the most important from Ultibo are the Arduino Mega 2560 R3 and the Arduino Due.

This driver presents any device recognized as a CDC ACM as a generic serial interface device that can be accessed using the API in the Serial unit. It should not be necessary to directly call any of the functions in this unit from application code.

Constants



CDC ACM specific constants CDCACM_*
CDCACM_DRIVER_NAME = 'USB CDC ACM Serial Driver'; Name of CDC ACM driver
 
CDCACM_SERIAL_DESCRIPTION = 'USB CDC ACM Serial'; Description of CDC ACM device
 
CDCACM_MIN_BAUD = 0; Minimum is device specific
CDCACM_MAX_BAUD = 0; Maximum is device specific
 
CDCACM_MIN_DATABITS = SERIAL_DATA_5BIT;  
CDCACM_MAX_DATABITS = SERIAL_DATA_8BIT;  
 
CDCACM_MIN_STOPBITS = SERIAL_STOP_1BIT;  
CDCACM_MAX_STOPBITS = SERIAL_STOP_1BIT5;  
 
CDCACM_MAX_PARITY = SERIAL_PARITY_SPACE;  
 
CDCACM_MAX_FLOW = SERIAL_FLOW_DSR_DTR;  


CDC ACM USB request CDCACM_USB_REQUEST_*
CDCACM_USB_REQUEST_TYPE = (USB_BMREQUESTTYPE_TYPE_CLASS or USB_BMREQUESTTYPE_RECIPIENT_INTERFACE);  


CDC ACM device quirk CDCACM_QUIRK_*
CDCACM_QUIRK_NONE = $00000000;  
CDCACM_QUIRK_NO_UNION_NORMAL = $00000001;  
CDCACM_QUIRK_SINGLE_RX_URB = $00000002;  
CDCACM_QUIRK_NO_CAP_LINE = $00000004;  
CDCACM_QUIRK_NO_DATA_INTERFACE = $00000008;  
CDCACM_QUIRK_IGNORE_DEVICE = $00000010;  
CDCACM_QUIRK_CONTROL_LINE_STATE = $00000020;  
CDCACM_QUIRK_CLEAR_HALT_CONDITIONS = $00000040;  
CDCACM_QUIRK_SEND_ZERO_PACKET = $00000080;  


CDC ACM device Id CDCACM_DEVICE_ID_*
CDCACM_DEVICE_ID_COUNT = 39; Number of supported Device IDs
 
CDCACM_DEVICE_ID:array[0..CDCACM_DEVICE_ID_COUNT - 1] of TCDCACMDeviceId = (
(idVendor:$076d;idProduct:$0006;Quirks:CDCACM_QUIRK_NO_UNION_NORMAL), Denso Cradle CU-321 (has no union descriptor)
(idVendor:$17ef;idProduct:$7000;Quirks:CDCACM_QUIRK_NO_UNION_NORMAL), Lenovo USB modem (has no union descriptor)
(idVendor:$0870;idProduct:$0001;Quirks:CDCACM_QUIRK_NO_UNION_NORMAL), Metricom GS Modem (has no union descriptor)
(idVendor:$0e8d;idProduct:$0003;Quirks:CDCACM_QUIRK_NO_UNION_NORMAL), FIREFLY, MediaTek Inc (has no union descriptor)
(idVendor:$0e8d;idProduct:$3329;Quirks:CDCACM_QUIRK_NO_UNION_NORMAL), MediaTek Inc GPS (has no union descriptor)
(idVendor:$0482;idProduct:$0203;Quirks:CDCACM_QUIRK_NO_UNION_NORMAL), KYOCERA AH-K3001V (has no union descriptor)
(idVendor:$079b;idProduct:$000f;Quirks:CDCACM_QUIRK_NO_UNION_NORMAL), BT On-Air USB MODEM (has no union descriptor)
(idVendor:$0ace;idProduct:$1602;Quirks:CDCACM_QUIRK_SINGLE_RX_URB), ZyDAS 56K USB MODEM
(idVendor:$0ace;idProduct:$1608;Quirks:CDCACM_QUIRK_SINGLE_RX_URB), ZyDAS 56K USB MODEM (firmware bug)
(idVendor:$0ace;idProduct:$1611;Quirks:CDCACM_QUIRK_SINGLE_RX_URB), ZyDAS 56K USB MODEM - new version (firmware bug)
(idVendor:$22b8;idProduct:$7000;Quirks:CDCACM_QUIRK_NO_UNION_NORMAL), Motorola Q Phone (has no union descriptor)
(idVendor:$0803;idProduct:$3095;Quirks:CDCACM_QUIRK_NO_UNION_NORMAL), Zoom Telephonics Model 3095F USB MODEM (has no union descriptor)
(idVendor:$0572;idProduct:$1321;Quirks:CDCACM_QUIRK_NO_UNION_NORMAL), Conexant USB MODEM CX93010 (has no union descriptor)
(idVendor:$0572;idProduct:$1324;Quirks:CDCACM_QUIRK_NO_UNION_NORMAL), Conexant USB MODEM RD02-D400 (has no union descriptor)
(idVendor:$0572;idProduct:$1328;Quirks:CDCACM_QUIRK_NO_UNION_NORMAL), Shiro/Aztech USB MODEM UM-3100 (has no union descriptor)
(idVendor:$20df;idProduct:$0001;Quirks:CDCACM_QUIRK_CONTROL_LINE_STATE), Simtec Electronics Entropy Key
(idVendor:$2184;idProduct:$001c;Quirks:CDCACM_QUIRK_NONE), GW Instek AFG-2225
(idVendor:$22b8;idProduct:$6425;Quirks:CDCACM_QUIRK_NONE), Motorola MOTOMAGX phones
Motorola H24 HSPA module
(idVendor:$22b8;idProduct:$2d91;Quirks:CDCACM_QUIRK_NONE), modem
(idVendor:$22b8;idProduct:$2d92;Quirks:CDCACM_QUIRK_NO_UNION_NORMAL), modem + diagnostics (handle only modem interface)
(idVendor:$22b8;idProduct:$2d93;Quirks:CDCACM_QUIRK_NO_UNION_NORMAL), modem + AT port (handle only modem interface)
(idVendor:$22b8;idProduct:$2d95;Quirks:CDCACM_QUIRK_NO_UNION_NORMAL), modem + AT port + diagnostics (handle only modem interface)
(idVendor:$22b8;idProduct:$2d96;Quirks:CDCACM_QUIRK_NO_UNION_NORMAL), modem + NMEA (handle only modem interface)
(idVendor:$22b8;idProduct:$2d97;Quirks:CDCACM_QUIRK_NO_UNION_NORMAL), modem + diagnostics + NMEA (handle only modem interface)
(idVendor:$22b8;idProduct:$2d99;Quirks:CDCACM_QUIRK_NO_UNION_NORMAL), modem + AT port + NMEA (handle only modem interface)
(idVendor:$22b8;idProduct:$2d9a;Quirks:CDCACM_QUIRK_NO_UNION_NORMAL), modem + AT port + diagnostics + NMEA (handle only modem interface)
(idVendor:$0572;idProduct:$1329;Quirks:CDCACM_QUIRK_NO_UNION_NORMAL), Hummingbird huc56s (Conexant) (union descriptor misplaced on data interface instead of communications interface)
(idVendor:$0572;idProduct:$1340;Quirks:CDCACM_QUIRK_NO_UNION_NORMAL), Conexant CX93010-2x UCMxx
(idVendor:$05f9;idProduct:$4002;Quirks:CDCACM_QUIRK_NO_UNION_NORMAL), PSC Scanning, Magellan 800i
(idVendor:$1bbb;idProduct:$0003;Quirks:CDCACM_QUIRK_NO_UNION_NORMAL), Alcatel OT-I650 (reports zero length descriptor)
(idVendor:$1576;idProduct:$03b1;Quirks:CDCACM_QUIRK_NO_UNION_NORMAL), Maretron USB100 (reports zero length descriptor)
(idVendor:$2912;idProduct:$0001;Quirks:CDCACM_QUIRK_CLEAR_HALT_CONDITIONS), ATOL FPrint
Support for Owen devices
(idVendor:$03eb;idProduct:$0030;Quirks:CDCACM_QUIRK_NONE), Owen SI30
Support for Droids MuIn LCD
(idVendor:$04d8;idProduct:$000b;Quirks:CDCACM_QUIRK_NO_DATA_INTERFACE),  
(idVendor:$04d8;idProduct:$0082;Quirks:CDCACM_QUIRK_IGNORE_DEVICE), Application mode
(idVendor:$04d8;idProduct:$0083;Quirks:CDCACM_QUIRK_IGNORE_DEVICE), Bootloader mode
Samsung phone in firmware update mode
(idVendor:$04e8;idProduct:$685d;Quirks:CDCACM_QUIRK_IGNORE_DEVICE),  
Exclude Infineon Flash Loader utility
(idVendor:$058b;idProduct:$0041;Quirks:CDCACM_QUIRK_IGNORE_DEVICE),  
(idVendor:$1519;idProduct:$0452;Quirks:CDCACM_QUIRK_SEND_ZERO_PACKET)); Intel 7260 modem


CDC ACM interface Id CDCACM_INTERFACE_ID_*
CDCACM_INTERFACE_ID_COUNT = 7; Number of supported Interface Ids
 
CDCACM_INTERFACE_ID:array[0..CDCACM_INTERFACE_ID_COUNT - 1] of TUSBInterfaceId = ( Control interfaces with no protocol set
(bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_NONE), Control interfaces with AT-command sets
(bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_AT_V25TER),  
(bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_AT_PCCA101),  
(bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_AT_PCCA101_WAKE),  
(bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_AT_GSM),  
(bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_AT_3G),  
(bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_AT_CDMA));  


CDC ACM device and interface Id CDCACM_DEVICE_INTERFACE_ID_*
CDCACM_DEVICE_INTERFACE_ID_COUNT = 58; Number of supported Device and Interface IDs
 
CDCACM_DEVICE_INTERFACE_ID:array[0..CDCACM_DEVICE_INTERFACE_ID_COUNT - 1] of TUSBDeviceAndInterfaceId = (
Nokia S60 phones expose two ACM channels. The first is a modem and is picked up by the standard AT-command information below. The second is 'vendor-specific' but is treated as a serial device.
Other USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL/USB_SUBCLASS_CDC_ACM/USB_PROTOCOL_CDC_ACM_VENDOR devices are likely to be Microsoft RNDIS not a modem.
(idVendor:$0421; idProduct:$042D;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia 3250
(idVendor:$0421; idProduct:$04D8;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia 5500 Sport
(idVendor:$0421; idProduct:$04C9;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia E50
(idVendor:$0421; idProduct:$0419;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia E60
(idVendor:$0421; idProduct:$044D;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia E61
(idVendor:$0421; idProduct:$0001;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia E61i
(idVendor:$0421; idProduct:$0475;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia E62
(idVendor:$0421; idProduct:$0508;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia E65
(idVendor:$0421; idProduct:$0418;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia E70
(idVendor:$0421; idProduct:$0425;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia N71
(idVendor:$0421; idProduct:$0486;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia N73
(idVendor:$0421; idProduct:$04DF;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia N75
(idVendor:$0421; idProduct:$000e;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia N77
(idVendor:$0421; idProduct:$0445;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia N80
(idVendor:$0421; idProduct:$042F;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia N91 & N91 8GB
(idVendor:$0421; idProduct:$048E;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia N92
(idVendor:$0421; idProduct:$0420;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia N93
(idVendor:$0421; idProduct:$04E6;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia N93i
(idVendor:$0421; idProduct:$04B2;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia 5700 XpressMusic
(idVendor:$0421; idProduct:$0134;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia 6110 Navigator (China)
(idVendor:$0421; idProduct:$046E;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia 6110 Navigator
(idVendor:$0421; idProduct:$002f;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia 6120 classic &
(idVendor:$0421; idProduct:$0088;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia 6121 classic
(idVendor:$0421; idProduct:$00fc;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia 6124 classic
(idVendor:$0421; idProduct:$0042;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia E51
(idVendor:$0421; idProduct:$00b0;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia E66
(idVendor:$0421; idProduct:$00ab;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia E71
(idVendor:$0421; idProduct:$0481;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia N76
(idVendor:$0421; idProduct:$0007;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia N81 & N81 8GB
(idVendor:$0421; idProduct:$0071;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia N82
(idVendor:$0421; idProduct:$04F0;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia N95 & N95-3 NAM
(idVendor:$0421; idProduct:$0070;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia N95 8GB
(idVendor:$0421; idProduct:$00e9;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia 5320 XpressMusic
(idVendor:$0421; idProduct:$0099;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia 6210 Navigator, RM-367
(idVendor:$0421; idProduct:$0128;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia 6210 Navigator, RM-419
(idVendor:$0421; idProduct:$008f;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia 6220 Classic
(idVendor:$0421; idProduct:$00a0;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia 6650
(idVendor:$0421; idProduct:$007b;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia N78
(idVendor:$0421; idProduct:$0094;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia N85
(idVendor:$0421; idProduct:$003a;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia N96 & N96-3
(idVendor:$0421; idProduct:$00e9;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia 5320 XpressMusic
(idVendor:$0421; idProduct:$0108;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia 5320 XpressMusic 2G
(idVendor:$0421; idProduct:$01f5;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia N97, RM-505
(idVendor:$0421; idProduct:$02e3;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia 5230, RM-588
(idVendor:$0421; idProduct:$0178;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia E63
(idVendor:$0421; idProduct:$010e;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia E75
(idVendor:$0421; idProduct:$02d9;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia 6760 Slide
(idVendor:$0421; idProduct:$01d0;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia E52
(idVendor:$0421; idProduct:$0223;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia E72
(idVendor:$0421; idProduct:$0275;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia X6
(idVendor:$0421; idProduct:$026c;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia N97 Mini
(idVendor:$0421; idProduct:$0154;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia 5800 XpressMusic
(idVendor:$0421; idProduct:$04ce;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia E90
(idVendor:$0421; idProduct:$01d4;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia E55
(idVendor:$0421; idProduct:$0302;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia N8
(idVendor:$0421; idProduct:$0335;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia E7
(idVendor:$0421; idProduct:$03cd;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR), Nokia C7
(idVendor:$04e7; idProduct:$6651;bInterfaceClass:USB_CLASS_CODE_COMMUNICATIONS_AND_CDC_CONTROL; bInterfaceSubClass:USB_SUBCLASS_CDC_ACM; bInterfaceProtocol:USB_PROTOCOL_CDC_ACM_VENDOR)); Samsung GTi8510 (INNOV8)


Type definitions



CDC ACM device Id

PCDCACMDeviceId = ^TCDCACMDeviceId;

TCDCACMDeviceId = record

idVendor:Word;  
idProduct:Word;  
Quirks:LongWord;  

CDC ACM device

PCDCACMDevice = ^TCDCACMDevice;

TCDCACMDevice = record

Serial Properties
Serial:TSerialDevice;  
USB Properties
Quirks:LongWord; Unusual behaviours of specific chip versions
ReceiveSize:LongWord; Maximum Receive size for Bulk IN Endpoint
TransmitSize:LongWord; Maximum Transmit size for Bulk OUT Endpoint
TransmitActive:LongBool; True if a Transmit request is currently in progress
DataInterface:PUSBInterface; USB interface for data requests
ControlInterface:PUSBInterface; USB interface for control requests
ReceiveRequest:PUSBRequest; USB request Bulk IN Endpoint
ReceiveEndpoint:PUSBEndpointDescriptor; CDC ACM Bulk IN Endpoint
TransmitRequest:PUSBRequest; USB request for Bulk OUT Endpoint
TransmitEndpoint:PUSBEndpointDescriptor; CDC ACM Bulk OUT Endpoint
InterruptRequest:PUSBRequest; USB request for Interrupt IN Endpoint
InterruptEndpoint:PUSBEndpointDescriptor; CDC ACM Interrupt IN Endpoint
PendingCount:LongWord; Number of USB requests pending for this device
WaiterThread:TThreadId; Thread waiting for pending requests to complete (for device detachment)
Statistics Properties
ReceiveComplete:LongWord;  
TransmitComplete:LongWord;  
InterruptComplete:LongWord;  
InterruptErrors:LongWord;  


Public variables


None defined

Function declarations



Initialization functions

procedure CDCACMInit;
Description: To be documented
Note None documented


CDC ACM serial functions

function CDCACMSerialDeviceOpen(Serial:PSerialDevice; BaudRate,DataBits,StopBits,Parity,FlowControl,ReceiveDepth,TransmitDepth:LongWord):LongWord;
Description: To be documented
Note None documented


function CDCACMSerialDeviceClose(Serial:PSerialDevice):LongWord;
Description: To be documented
Note None documented


function CDCACMSerialDeviceRead(Serial:PSerialDevice; Buffer:Pointer; Size,Flags:LongWord; var Count:LongWord):LongWord;
Description: To be documented
Note None documented


function CDCACMSerialDeviceWrite(Serial:PSerialDevice; Buffer:Pointer; Size,Flags:LongWord; var Count:LongWord):LongWord;
Description: To be documented
Note None documented


CDC ACM USB functions

function CDCACMDriverBind(Device:PUSBDevice; Interrface:PUSBInterface):LongWord;
Description: Bind the CDC ACM driver to a USB device if it is suitable
Device The USB device to attempt to bind to
Interrface The USB interface to attempt to bind to (or nil for whole device)
Return USB_STATUS_SUCCESS if completed, USB_STATUS_DEVICE_UNSUPPORTED if unsupported or another error code on failure.


function CDCACMDriverUnbind(Device:PUSBDevice; Interrface:PUSBInterface):LongWord;
Description: Unbind the CDC ACM driver from a USB device
Device The USB device to unbind from
Interrface The USB interface to unbind from (or nil for whole device)
Return USB_STATUS_SUCCESS if completed or another error code on failure


procedure CDCACMReceiveWorker(Request:PUSBRequest);
Description: Called (by a Worker thread) to process a completed USB request from the CDC ACM bulk IN endpoint
Request The USB request which has completed


procedure CDCACMReceiveComplete(Request:PUSBRequest);
Description: Called when a USB request from the CDC ACM bulk IN endpoint completes
Request The USB request which has completed
Note Request is passed to worker thread for processing to prevent blocking the USB completion


procedure CDCACMTransmitStart(Request:PUSBRequest);
Description: Called to continue transmission of data from the transmit buffer
Request The USB transmit request to use
Note Caller must hold the lock on the serial device


procedure CDCACMTransmitWorker(Request:PUSBRequest);
Description: Called (by a Worker thread) to process a completed USB request to the CDC ACM bulk OUT endpoint
Request The USB request which has completed


procedure CDCACMTransmitComplete(Request:PUSBRequest);
Description: Called when a USB request to the CDC ACM bulk OUT endpoint completes
Request The USB request which has completed
Note Request is passed to worker thread for processing to prevent blocking the USB completion


procedure CDCACMInterruptWorker(Request:PUSBRequest);
Description: Called (by a Worker thread) to process a completed USB request to the CDC ACM interrupt IN endpoint
Request The USB request which has completed


procedure CDCACMInterruptComplete(Request:PUSBRequest);
Description: Called when a USB request from the CDC ACM interrupt IN endpoint completes
Request The USB request which has completed
Note Request is passed to worker thread for processing to prevent blocking the USB completion


CDC ACM helper functions

function CDCACMCheckDevice(Device:PUSBDevice; var Quirks:LongWord):LongWord;
Description: Check the Vendor and Device Id against the supported devices
Device USB device to check
Quirks Return value for any device specific quirks (eg CDCACM_QUIRK_NO_UNION_NORMAL)
Return USB_STATUS_SUCCESS if completed or another error code on failure


function CDCACMCheckInterface(Device:PUSBDevice; Interrface:PUSBInterface):LongWord;
Description: Check the Interface against the supported devices
Device USB device to check
Interrface USB interface to check
Return USB_STATUS_SUCCESS if completed or another error code on failure


function CDCACMCheckDeviceAndInterface(Device:PUSBDevice; Interrface:PUSBInterface):LongWord;
Description: Check the Device and Interface against the supported devices
Device USB device to check
Interrface USB interface to check
Return USB_STATUS_SUCCESS if completed or another error code on failure


function CDCACMFindInterfaces(Device:PUSBDevice; Interrface:PUSBInterface; var DataInterface,ControlInterface:PUSBInterface; Quirks:LongWord; var Capabilities:Byte):LongWord;
Description: Locate the data and control interfaces from the functional descriptors
Device USB device to check
Interrface USB interface to check (Optional)
DataInterface Return value for the located data interface
ControlInterface Return value for the located control interface
Quirks Any known quirks for this device from identification (eg CDCACM_QUIRK_NO_UNION_NORMAL)
Capabilities Return value for ACM capabilities (eg USB_CDC_ACM_CAP_LINE)
Return USB_STATUS_SUCCESS if completed or another error code on failure


function CDCACMControlRequest(Serial:PCDCACMDevice; Request:Byte; Value:Word; Data:Pointer;Size:Word):LongWord;
Description: To be documented
Note None documented


function CDCACMGetLineRequest(Serial:PCDCACMDevice; var LineCoding:TUSBCDCLineCoding):LongWord;
Description: To be documented
Note None documented


function CDCACMSetLineRequest(Serial:PCDCACMDevice; const LineCoding:TUSBCDCLineCoding):LongWord;
Description: To be documented
Note None documented


function CDCACMSetControlRequest(Serial:PCDCACMDevice; Control:Word):LongWord;
Description: To be documented
Note None documented


Return to Unit Reference