123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408 |
- Introduction
- ============
- MPQ DVB Adapter implements Digital Video Broadcasting devices according
- to LinuxTV (linuxtv.org) defined API and infrastructure.
- The implemented devices are dvb/demux devices, dvb/dvr devices and
- dvb/video devices.
- These devices are used in Qualcomm's MPQ chipsets that support
- broadcast applications.
- dvb/demux is responsible to receive a digital stream broadcasted over
- the air from a hardware unit (TSPP - Transport stream packet processor,
- or TSIF - Transport Stream Interface) and separates the stream into its
- various sub-streams such as video, audio and auxiliary data.
- The separation operation is named demuxing.
- dvb/dvr is used in conjunction with dvb/demux to re-play a digital
- stream from memory or to record stream to memory.
- dvb/video is used to handle the video decoding, it receives compressed
- video from dvb/demux through a stream-buffer interface and interacts
- with the existing HW video driver to perform the decoding.
- For more information on the TSIF interface, please refer to TSIF
- documentation under "Documentation/arm/msm/tsif.txt".
- For more information on the TSPP interface, please refer to TSPP
- documentation under "Documentation/arm/msm/tspp.txt".
- For more information on DVB-API definition, please refer dvb
- documentation under "Documentation/dvb/readme.txt".
- Hardware description
- ====================
- dvb/demux, dvb/dvr and dvb/video do not interact with a hardware directly;
- The implementation of these drivers is done using the kernel API of TSPP,
- TSIF and video drivers.
- Software description
- ====================
- Terminology
- -----------
- Stream: A stream is a TS packet source
- - For example, MPEG2 Transport Stream from TSIF0
- Filter: Enables TS packet filtering and routing according to PID (packet ID)
- - The decision regarding which PIDs in the stream will be routed
- is done via filters, each demux open request corresponds to a filter.
- - Filters can pass TS packets as-is (for recording), assemble them into
- "other" PES packets (for PES packets read by client), assemble and send
- them to decoder (for decoder PES), or assemble them into sections.
- Service: A service is a set of PIDs as defined in the service PMT.
- Each service may be carried in a different transport stream or part of the
- same transport stream. Processing a service means either preparing the
- data for display and/or for recording.
- Requirments
- -----------
- 1. Demuxing from different sources:
- - Live transport stream inputs (TSIF)
- - Memory inputs
- 2. Support different packet formats:
- - 188-bytes transport packets
- - 192-bytes transport packets
- 3. PID filtering
- 4. Output of the following data:
- - Decoder PES: PES (video and/or audio) that can be directed to HW decoders
- in tunneling mode (without interaction of user-space).
- - Other PES: a non-decoder PES, such as subtitle, teletext. The consumer
- of this data is user-space that reads the data through standard read
- calls.
- - Sections: Sections are used by user-space to acquire different kinds of
- information such as channels list, program user guide, etc.
- - Transport Stream Packets: Transport stream packets of specific PIDs as
- they were received in the input stream. User-space can use those to
- record specific services and/or to perform time-shift buffer.
- - PCR/STC: Pairs of PCR/STC can be used by user-space to perform
- clock-recovery.
- - Frame-indexing: For recorded stream, demux provides indexing of the
- I-frames within the stream that can be used for trick-modes operations
- while playing a recorded file.
- 5. Support decryption of scrambled transport packets.
- 6. Support recording of scrambled streams.
- 8. Section filtering.
- Control path
- ------------
- 1. Client opens a demux device. Open request is done on the same demux
- device for each filter.
- 2. Client may configure the demux's internal ring-buffer size used to
- hold the data for user-space (or default is used).
- 3. Client configures the opened filter either to capture sections,
- TS packets (for recording) or PES (decoder or non-decoder PES).
- - The demux configures the underlying HW accordingly through
- TSPP or TSIF kernel APIs
- - demux receives notification of new data from the underlying HW and
- performs demuxing operation based on the configuration.
- 4. Client can then read data received from the selected filter.
- Data path
- ---------
- For each filter that is opened, demux manages a circular buffer that
- holds the captured filter data; Client read commands extract data from
- the relevant ring buffer. Data loss can occur if a client cannot keep up
- with stream bandwidth.
- For PES data tunneled to decoder, demux manages a stream-buffer used to
- transfer the PES data to the decoder. The stream-buffer is built from
- two ring-buffers: One holding the PES payload (elementary stream) and
- the other holding PES parameters extracted from the PES header. The
- ring-buffer with PES parameters points to the location of respective PES
- payload in the PES payload ring-buffer.
- To allow concurrency of multiple stream processing, multiple demux/dvr
- devices exist. Each demux devices handles a single stream input. The
- number of demux devices is configurable depending on the required number
- of concurrent stream processing.
- The client configures each demux device with the stream to process,
- by default, all devices are configured to process stream from memory.
- The default setting can be changed by issuing ioctl that configures
- the demux source to either TSIF0 or TSIF1. For specific TSIF input,
- only one demux device may process it at a time.
- Background Processing
- ---------------------
- Demux allocates a kernel thread for each live-input to process
- the TS packets notified from the HW for specific input. There
- are two such inputs (TSIF0 and TSIF1), both can be processed in
- parallel by two seperate threads.
- The processing is the action of demuxing of the new data; it may sleep
- as it locks against the demux data-structure that may be accessed by
- user-space in the meanwhile.
- Dependencies
- ------------
- The demux driver depends on the following kernel drivers and subsystems:
- 1. TSIF driver: Used to receive TS packets from TSIF interface for
- targets supporting TSIF only.
- 2. TSPP driver: Used to receive TS packets and/or PES from TSPP
- interface for targets supporting TSPP.
- 3. TZ-COM: Used to communicate with TrustZone to handle scrambled
- streams.
- 4. ION: Used to allocate memory for buffers holding decoder-data in
- case the data is tunneled between demux and decoders.
- Also used to allocate memory for TSPP/TSIF output pipes.
- 5. dvb-core: Existing Linux infrastructure used for implementation of
- dvb devices.
- Design
- ======
- Goals
- -----
- The demux driver is designed to:
- 1. Fulfil the requirements listed above.
- 2. Be able to work on different chipsets having different HW
- capabilities. For example, some chipsets are equipped with TSIF only,
- others are equipped with TSPP of different versions.
- Design Blocks
- -------------
- Demux implementation hooks to the existing Linux dvb-core
- infrastructure as follows:
- +----------+ +------------------------------------------+
- | | | MPQ Demux Driver |
- | | | +----------+ +----------+ +----------+ |
- | | | | MPQ DMX | | MPQ DMX | | MPQ DMX | |
- | QCOM MPQ | | | TSIF | | TSPPv1 | | TSPPv2 | |
- | Adapter | | | Plugin | | Plugin | | Plugin | |
- | | | +----------+ +----------+ +----------+ |
- | | | +--------------------------------------+ |
- | | | | MPQ Demux Common Services | |
- | | | +--------------------------------------+ |
- +----------+ +------------------------------------------+
- +--------------------------------------------------------+
- | Linux DVB Core |
- | +----------+ +----------+ +----------+ |
- | | DVB | | DVB DMX | | DVB | |
- | | Demux | | Device | | Device | |
- | +----------+ +----------+ +----------+ |
- +--------------------------------------------------------+
- The new developed code is QCOM MPQ Adapter and the MPQ Demux driver
- with the various MPQ-DMX Plugins.
- QCOM MPQ Adapter registers a new DVB adapter to Linux dvb-core.
- The MPQ DVB adapter is built as a separate kernel module. Using it
- demux and video devices can register themselves to the adapter.
- MPQ-DMX plugins exist to hook to dvb-core demux implementation
- depending on the HW capabilities. Only one of these plugins might be
- compiled and run at a time on the target.
- As the name of each plugin implies, one plugin implements demux
- functionality for targets supporting TSIF only, and the others
- implement pluging for targets supporting TSPP in different versions.
- The plugin implementation is not hooked to specific chipset as
- different chipsets might have the same HW capability.
- The MPQ-DMX Plugin Common Services provides common services that are
- used by all plugins, such as registrations of demux devices to
- the dvb-core.
- The demux plugin is built as a separate kernel module. Each plugin
- hooks to the DVB-Demux by providing set of pointers to functions
- required for DVB-Demux and dvb-core operation. The actual
- implementation of these function differs between the plugins depending
- on the HW capabilities. The plugins may be viewed as "classes"
- inheriting from DVB-Demux "class".
- Interface to TSPP/TSIF Drivers
- ------------------------------
- Each demux plugin interacts with the kernel API of the relevant driver
- (either TSIF or TSPP) to receive TS packets or other kinds of data
- depending on the HW capabilities.
- The demux uses the kernel API of TSIF and TSPP drivers and registers
- callback triggered when new data is received. The callback schedules
- work to a single-threaded workqueue to process the data. The actual
- processing of the data depends on the HW capabilities.
- Interface to TZ-COM Driver
- --------------------------
- For cases HW does not support descrambling, the descrambling is
- performed by communicating with TZ using TZ-COM kernel API.
- ION driver is used to allocate input and output buffers provided to TZ.
- Interface to Decoders
- ---------------------
- The interface to the decoders is done through a stream-buffer interface.
- The design aims not to have direct calls between dvb/demux and
- dvb/video for de-coupling and generality. dvb/demux and dvb/video
- interact only with stream-buffer API.
- Stream buffer is built of two ring-buffers, one holding the PES payload
- (the video elementary stream) and the other holding parameters from PES
- headers required by decoders.
- The separation to two ring-buffers allows locking the payload buffer
- as secured buffer that only the decoder's HW may access while allowing
- the software to access the PES headers which are not required to be
- secured. Locking of the payload buffer is done when the data should be
- secured (scrambled video stream for example).
- The stream-buffer API make use of dvb-ring buffer implementation that
- is part of dvb-core.
- SMP/multi-core
- ==============
- Driver is fully SMP aware.
- Interface
- =========
- User-space API
- --------------
- dvb/demux and dvb/dvr each expose a char device interface to user-space
- as defined by linuxtv.org. Extension to this interface is done to add
- new features required by MPQ use-cases. The extensions preserve backward
- compatibility of the API defined by linuxtv.org
- The devices appear in file-system under:
- /dev/dvb/adapter0/demuxN
- /dev/dvb/adapter0/dvrN
- Where "N" ranges between 0 to total number of demux devices defined.
- The default configuration is 4 devices.
- Extensions to this API (through new ioctl) exist to provide the
- following functionality:
- 1. DMX_SET_TS_PACKET_FORMAT: Set the transport stream TS packet format.
- Configures whether the stream fed to demux from memory is with TS packet
- of 188 bytes long, 192 bytes long, etc.
- Default is 188 bytes long to preserve backward compatibility.
- Returns the following values:
- 0 in case of success.
- -EINVAL if the parameter is invalid.
- -EBUSY if demux is already running.
- 2. DMX_SET_DECODER_BUFFER_SIZE: Set the decoder's buffer size.
- For data tunneled to decoder, client can configure the size of the buffer
- holding the PES payload.
- Default is set to the fixed size value that exists in current dvb-core to
- preserve backward compatibility.
- Returns the following values:
- 0 in case of success.
- -EINVAL if the parameter is invalid.
- -EBUSY if demux is already running.
- 3. DMX_SET_TS_OUT_FORMAT: Set the TS packet recording format.
- Indicates whether the TS packet used for recording should be in 188 or 192
- bytes long format. In case of 192-packets output, 4 bytes zero timestamp
- is attached to the original 188 packet.
- Default is set for 188 to preserve backward compatibility.
- Returns the following values:
- 0 in case of success.
- -EINVAL if the parameter is invalid.
- -EBUSY if demux is already running.
- 4. Added support for mmap for direct access to input/output buffers.
- User can either use the original read/write syscalls or use mmap
- on the specific file-handle. Several ioctls were exposed so that
- user can find-out the status of the buffers (DMX_GET_BUFFER_STATUS),
- to notify demux when data is consumed (DMX_RELEASE_DATA) or notify
- dvr when data is fed (DMX_FEED_DATA).
- 5. DMX_SET_PLAYBACK_MODE: Set playback mode in memory input.
- In memory input, contrary to live input, playback can be in pull mode,
- where if one of output buffers is full, demux stalls waiting for free space,
- this would cause DVR input buffer fullness to accumulate.
- Returns the following values:
- 0 in case of success.
- -EINVAL if the parameter is invalid.
- -EBUSY if demux is already running.
- debugfs
- -------
- debugfs is used for debug purposes.
- Directory in debugfs is created for each demux device.
- Each directory includes several performance counters of the specific demux:
- Total demuxing time, total CRC time, HW notification rate, HW notification
- buffer size.
- Exported Kernel API
- -------------------
- MPQ adapter exports the following kernel API:
- 1. Getter API for the registered MPQ adapter handle.
- This is used by demux plugin as well as dvb/video implementation to
- register their devices to that adapter.
- 2. Stream buffer API: Used to tunnel the data between dvb/demux and
- decoders. The API is used by dvb/demux and by decoders to write/read
- tunneled data.
- 3. Stream buffer interface registration: Used to register stream-buffer
- interfaces. When demux driver is asked to tunnel data to a decoder,
- the demux allocates a stream-buffer to be shared between demux and
- the decoder. For the decoder to retrieve the info of the
- stream-buffer it should connect to, stream-buffer registration API
- exist.
- The demux registers the new allocated stream buffer handle to MPQ
- Adapter, and the decoder may query the registered interface through
- MPQ Adapter.
- Driver parameters
- =================
- There are three kernel modules required for DVB API operation:
- 1. dvb-core.ko: This is an existing Linux module for dvb functionality.
- The parameters for this module are the one defined by linuxtv.org.
- An additional parameter was added to specify whether to collect
- performance debug information exposed through debugfs.
- Parameter name: dvb_demux_performancecheck
- 2. mpq-adapter.ko: MPQ DVB adapter module. Has a parameter to
- specify the adapter number, the number (X) is the same as the one
- that appears in /dev/dvb/adapterX. Default is 0.
- Parameter name: adapter_nr
- 3. mpq-dmx-hw-plugin.ko: Module for demux HW plugin. Receives as a
- parameter the number of required demux devices. Default is set to the
- number specified in kernel configuration.
- Parameter name: mpq_demux_device_num
- Config options
- ==============
- New kernel configurations is available (through make menuconfig) to
- enable MPQ based adapter functionality. The following configurations
- exist:
- 1. Control whether to enable QCOM MPQ DVB adapter (tri-state).
- It depends on having dvb-core enabled.
- 2. If MPQ adapter is enabled:
- 2.1. Control whether to enable MPQ dvb/demux (tri-state)
- 2.2. Control whether to enable MPQ dvb/video (tri-state)
- 2.3. If dvb/demux is enabled:
- 2.3.1. Configure the number of demux devices. Default is 4.
- 2.3.2. Select the desired demux plugin. Each plugin would appear
- in the list of options depending whether the respective
- driver (TSIF/TSPP) is enabled or not.
- Dependencies
- ============
- 1. The implementation depends on having dvb-core enabled.
- 2. Each demux plugin depends on whether the relevant driver it uses
- is enabled. TSIF plugin depends on TSIF driver and TSPP plugins
- depend on TSPP driver.
- 3. There's no communication to other processors.
- User space utilities
- ====================
- N/A
- Other
- =====
- N/A
- Known issues
- ============
- N/A
|