| |
| Section 1 Overview |
| |
| The Media Oriented Systems Transport (MOST) driver gives Linux applications |
| access a MOST network: The Automotive Information Backbone and the de-facto |
| standard for high-bandwidth automotive multimedia networking. |
| |
| MOST defines the protocol, hardware and software layers necessary to allow |
| for the efficient and low-cost transport of control, real-time and packet |
| data using a single medium (physical layer). Media currently in use are |
| fiber optics, unshielded twisted pair cables (UTP) and coax cables. MOST |
| also supports various speed grades up to 150 Mbps. |
| For more information on MOST, visit the MOST Cooperation website: |
| www.mostcooperation.com. |
| |
| Cars continue to evolve into sophisticated consumer electronics platforms, |
| increasing the demand for reliable and simple solutions to support audio, |
| video and data communications. MOST can be used to connect multiple |
| consumer devices via optical or electrical physical layers directly to one |
| another or in a network configuration. As a synchronous network, MOST |
| provides excellent Quality of Service and seamless connectivity for |
| audio/video streaming. Therefore, the driver perfectly fits to the mission |
| of Automotive Grade Linux to create open source software solutions for |
| automotive applications. |
| |
| The driver consists basically of three layers. The hardware layer, the |
| core layer and the application layer. The core layer consists of the core |
| module only. This module handles the communication flow through all three |
| layers, the configuration of the driver, the configuration interface |
| representation in sysfs, and the buffer management. |
| For each of the other two layers a selection of modules is provided. These |
| modules can arbitrarily be combined to meet the needs of the desired |
| system architecture. A module of the hardware layer is referred to as an |
| HDM (hardware dependent module). Each module of this layer handles exactly |
| one of the peripheral interfaces of a network interface controller (e.g. |
| USB, MediaLB, I2C). A module of the application layer is referred to as an |
| AIM (application interfacing module). The modules of this layer give access |
| to MOST via one the following ways: character devices, ALSA, Networking or |
| V4L2. |
| |
| To physically access MOST, an Intelligent Network Interface Controller |
| (INIC) is needed. For more information on available controllers visit: |
| www.microchip.com |
| |
| |
| |
| Section 1.1 Hardware Layer |
| |
| The hardware layer contains so called hardware dependent modules (HDM). For each |
| peripheral interface the hardware supports the driver has a suitable module |
| that handles the interface. |
| |
| The HDMs encapsulate the peripheral interface specific knowledge of the driver |
| and provides an easy way of extending the number of supported interfaces. |
| Currently the following HDMs are available: |
| |
| 1) MediaLB (DIM2) |
| Host wants to communicate with hardware via MediaLB. |
| |
| 2) I2C |
| Host wants to communicate with the hardware via I2C. |
| |
| 3) USB |
| Host wants to communicate with the hardware via USB. |
| |
| |
| Section 1.2 Core Layer |
| |
| The core layer contains the mostcore module only, which processes the driver |
| configuration via sysfs, buffer management and data forwarding. |
| |
| |
| |
| Section 1.2 Application Layer |
| |
| The application layer contains so called application interfacing modules (AIM). |
| Depending on how the driver should interface to the application, one or more |
| suitable modules can be selected. |
| |
| The AIMs encapsulate the application interface specific knowledge of the driver |
| and provides access to user space or other kernel subsystems. |
| Currently the following AIMs are available |
| |
| 1) Character Device |
| Applications can access the driver by means of character devices. |
| |
| 2) Networking |
| Standard networking applications (e.g. iperf) can by used to access |
| the driver via the networking subsystem. |
| |
| 3) Video4Linux (v4l2) |
| Standard video applications (e.g. VLC) can by used to access the |
| driver via the V4L subsystem. |
| |
| 4) Advanced Linux Sound Architecture (ALSA) |
| Standard sound applications (e.g. aplay, arecord, audacity) can by |
| used to access the driver via the ALSA subsystem. |
| |
| |
| |
| Section 2 Configuration |
| |
| See ABI/sysfs-class-most.txt |
| |
| |
| |
| Section 3 USB Padding |
| |
| When transceiving synchronous or isochronous data, the number of packets per USB |
| transaction and the sub-buffer size need to be configured. These values |
| are needed for the driver to process buffer padding, as expected by hardware, |
| which is for performance optimization purposes of the USB transmission. |
| |
| When transmitting synchronous data the allocated channel width needs to be |
| written to 'set_subbuffer_size'. Additionally, the number of MOST frames that |
| should travel to the host within one USB transaction need to be written to |
| 'packets_per_xact'. |
| |
| Internally the synchronous threshold is calculated as follows: |
| |
| frame_size = set_subbuffer_size * packets_per_xact |
| |
| In case 'packets_per_xact' is set to 0xFF the maximum number of packets, |
| allocated within one MOST frame, is calculated that fit into _one_ 512 byte |
| USB full packet. |
| |
| frame_size = floor(MTU_USB / bandwidth_sync) * bandwidth_sync |
| |
| This frame_size is the number of synchronous data within an USB transaction, |
| which renders MTU_USB - frame_size bytes for padding. |
| |
| When transmitting isochronous AVP data the desired packet size needs to be |
| written to 'set_subbuffer_size' and hardware will always expect two isochronous |
| packets within one USB transaction. This renders |
| |
| MTU_USB - (2 * set_subbuffer_size) |
| |
| bytes for padding. |
| |
| Note that at least 2 times set_subbuffer_size bytes for isochronous data or |
| set_subbuffer_size times packts_per_xact bytes for synchronous data need to be |
| put in the transmission buffer and passed to the driver. |
| |
| Since HDMs are allowed to change a chosen configuration to best fit its |
| constraints, it is recommended to always double check the configuration and read |
| back the previously written files. |
| |
| |
| |
| Section 4 Routing Channels |
| |
| To connect a channel that has been configured as outlined above to an AIM and |
| make it accessible to user space applications, the attribute file 'add_link' is |
| used. To actually bind a channel to the AIM a string needs to be written to the |
| file that complies with the following syntax: |
| |
| "most_device:channel_name:link_name[.param]" |
| |
| The example above links the channel "channel_name" of the device "most_device" |
| to the AIM. In case the AIM interfaces the VFS this would also create a device |
| node "link_name" in the /dev directory. The parameter "param" is an AIM dependent |
| string, which can be omitted in case the used AIM does not make any use of it. |
| |
| Cdev AIM example: |
| $ echo "mdev0:ep_81:my_rx_channel" >add_link |
| $ echo "mdev0:ep_81" >add_link |
| |
| |
| Sound/ALSA AIM example: |
| |
| The sound/ALSA AIM needs an additional parameter to determine the audio resolution |
| that is going to be used. The following strings can be used: |
| |
| - "1x8" (Mono) |
| - "2x16" (16-bit stereo) |
| - "2x24" (24-bit stereo) |
| - "2x32" (32-bit stereo) |
| |
| $ echo "mdev0:ep_81:audio_rx.2x16" >add_link |
| $ echo "mdev0:ep_81" >add_link |