The 'usb' component is used to connect USB peripheral drivers with USB host
controller drivers. To achieve this it provides two distinct services
to the corresponding sides. Via the 'Usb_host' service host controller
drivers report the devices currently connected to the bus. The 'usb'
component decides on basis of its policy, which of those devices show up,
when USB peripheral driver clients request their devices ROM via the
'Usb' service.
Those peripheral clients can acquire or release USB devices resp. interfaces,
and the 'usb' server exchanges signal handlers and shared-memory buffers
in between host controller side and peripheral side, so that the actual
data-transmission to the USB bus is direct and independent of this
USB multiplexing component.

Ths 'usb' component can report the configuration it currently uses, as well
as a report of all USB devices that were currently reported to it.
Both reports can be enabled separately via the config node of the component:

!+ start usb | ram: 10M
!  + provides
!    + service Usb
!    + service Usb_host
!  + config
!    + report | config: yes | devices: yes
!-

The devices report contains most relevant information about an USB device,
beside of its product/vendor information, it also contains information
about configurations, interface, and endpoints available.

Example report:

!+ devices
!  + device usb-2-2 | speed: full | vendor_id: 0x4e6 | product_id: 0x5116 | class: 0x0
!    + config | active: true | value: 0x1
!      + interface
!        | active:      true
!        | number:      0x0
!        | alt_setting: 0x0
!        | class:       0xb
!        | subclass:    0x0
!        | protocol:    0x0
!        + endpoint | address: 0x83 | attributes: 0x3 | max_packet_size: 0x8
!        + endpoint | address: 0x5  | attributes: 0x2 | max_packet_size: 0x40
!        + endpoint | address: 0x84 | attributes: 0x2 | max_packet_size: 0x40
!  + device usb-3-1 | speed: super | vendor_id: 0x1d6b | product_id: 0x3 | class: 0x9
!    + config | active: true | value: 0x1
!      + interface
!        | active:      true
!        | number:      0x0
!        | alt_setting: 0x0
!        | class:       0x9
!        | subclass:    0x0
!        | protocol:    0x0
!        + endpoint | address: 0x81 | attributes: 0x3 | max_packet_size: 0x4
!  + device usb-2-1 | speed: high | vendor_id: 0x1d6b | product_id: 0x2 | class: 0x9
!    + config | active: true | value: 0x1
!      + interface
!        | active:      true
!        | number:      0x0
!        | alt_setting: 0x0
!        | class:       0x9
!        | subclass:    0x0
!        | protocol:    0x0
!        + endpoint | address: 0x81 | attributes: 0x3 | max_packet_size: 0x4
!  + device usb-1-1 | speed: high | vendor_id: 0x1d6b | product_id: 0x2 | class: 0x9
!    + config | active: true | value: 0x1
!      + interface
!        | active:      true
!        | number:      0x0
!        | alt_setting: 0x0
!        | class:       0x9
!        | subclass:    0x0
!        | protocol:    0x0
!        + endpoint | address: 0x81 | attributes: 0x3 | max_packet_size: 0x4
!-

An USB device can get assigned to a client request via policy nodes
within the configuration of the 'usb' component. One can assign devices
based on their name, a vendor-product-tuple, or by defining the class-value
for all USB device interfaces that matches that class. Here are some examples:

!+ start usb_host | ram: 10M
!  + provides
!    + service Usb
!    + service Usb_host
!  + config
!    + policy | label: usb_hid ->
!      + device | class: 0x3
!    + policy | label: usb_block ->
!      + device usb-1-2
!    + policy | label: usb_net ->
!      + device | vendor_id: 0x0b95 | product_id: 0x1790
!-
