eCos Support for Developing USB-ethernet Peripherals
Prev |  |

# Communication Protocol

## Name

Communication Protocol -- Protocol used between the host-side device driver and the eCos USB-ethernet package

## Description

There is a USB standard for the protocol to be used between the host and a class of communication devices, including ethernet. However, the eCos USB-ethernet package does not implement this protocol: the target hardware for which the package was first developed had certain limitations, and could not implement the standard. Instead, the package implements a simple new protocol.

A USB-ethernet peripheral involves bulk transfers on two endpoints: one endpoint will be used for packets from host to peripheral and the other will be used for the opposite direction. Transfers in both directions are variable length, with a lower limit of 16 bytes and an upper limit of 1516 bytes. The first two bytes of each transfer constitute a header specific to USB-ethernet. The next 14 bytes form the normal header for an ethernet frame: destination MAC address, source MAC address, and a protocol field. The remaining data, up to 1500 bytes, are the payload. The first two bytes give the size of the ethernet frame, least significant byte first, with a value between 14 and 1514.

For example an ARP request from host to peripheral involves an ethernet frame of 42 bytes (0x002A), with the usual 14-byte header and a 28-byte payload. The destination is the broadcast address 0xFFFFFFFFFFFF. The source depends on the MAC address specified for the host in the call to `usbs_eth_init`, e.g. 0x405D90A9BC02. The remaining data is as specified by the appropriate IETF RFC's. The actual bulk USB transfer involves the following sequence of 44 bytes:

    2a 00 ff ff ff ff ff ff 40 5d 90 a9 bc 02 08 06
    00 01 08 00 06 04 00 01 40 5d 90 a9 bc 02 0a 00
    00 01 00 00 00 00 00 00 0a 00 00 02

In addition there are two control messages. These will be sent by the host to endpoint 0, the control endpoint, and by default they will be handled by `usbs_eth_class_control_handler`. If class-specific control messages are intercepted by other code then it is the responsibility of that code to invoke the USB-ethernet handler when appropriate.

The first control message can be used by the host to obtain a MAC address:

    #define ECOS_USBETH_CONTROL_GET_MAC_ADDRESS         0x01

The control message's type field should specify IN as the direction. The request field should be `0x01`. The length fields should specify a size of 6 bytes. The remaining fields of the control message will be ignored by the USB-ethernet package. The response consists of the 6-byte MAC address supplied by the initialization call `usbs_eth_init`.

The second control message can be used by the host to enable or disable promiscuous mode.

    #define ECOS_USBETH_CONTROL_SET_PROMISCUOUS_MODE    0x02

This control message involves no further data so the length field should be set to 0. The value field should be non-zero to enable promiscuous mode, zero to disable it. The request field should be `0x02`. The remaining fields in the control message will be ignored. It is the responsibility of the host-side device driver to keep track of whether or not promiscuous mode is currently enabled. It will be disabled when the peripheral changes to Configured state, typically at the point where the host-side device driver has been activated.

Prev | Home |
Example Host-side Device Driver |  |