Dune HD STB - CUSTOM FIRMWARE IMAGES


Firmware image for Dune HD STB is a file in a special format (DFF) that can
be installed on the STB using one of firmware upgrade mechanisms supported
by Dune HD STBs.

Custom firmware images (DFF files) are signed (and include various
components which ensure secure boot of the STB and use various encryption
schemes and digital signatures), and their creation requires the use of
special tools and facilities.

This document provides a technical description of the available options for
custom firmware creation.

Overall process

The overall process to create a custom firmware image is the following:

1. Determine the requirements for the custom firmware:
   - The base firmware.
   - The list of needed changes relative to the base firmware.
   - Customer ID.
   - Cross-upgrade limitations.

2. Proceed with custom firmware image creation. Depending on business
   approval, the following options can be used:
   - a) Use Dune Firmware Build service to do it on your own.
         - Manual processing by Dune HD is not involved here.
         - See "Using Dune Firmware Build" section for more information.
   - b) Send a request to your Dune HD contacts.
         - The request is then processed manually by Dune HD (possibly with
           several rounds of requirements clarification/negotiation).
         - See "Sending firmware customization request to Dune HD" section
           for more information.

Base firmware

The base firmware could be a public retail firmware, a special SDK
firmware, or any other firmware which have features you need in the custom
firmware.

Ensure all features of the base firmware, that will be kept in the custom
firmware, suite your needs. E.g.:
   - Ensure media files and media streams in all needed formats and
     utilizing all needed media streaming protocols and DRM systems can be
     played without problems in the base firmware.
   - If your application is implemented as a Dune plugin or HTML app or SVG
     app or native GUI app, ensure all its functions work without problems
     in the base firmware.

Possible changes in the firmware

The changes in the firmware may include:

1. Custom boot logo.

If custom boot logo is needed, the picture should be provided in the
following format:
   - 1920x1080 8-bit BMP file, which does not use BMP compression.
   - NOTE: Ensure that BMP file does not use BMP compression. It must be
     uncompressed BMP file.
   - NOTE: Ensure that the size of the BMP file does not exceed 2MB.
   - NOTE: Avoid the use of too crisp and sharp lines, ensure the picture
     survives upscaling/downscaling without noticeable picture distortions.

2. Any changes in "tango" filesystem.

The "tango" filesystem contains most software components and resources
which determine the firmware behavior. Custom firmware versions may
customize the "tango" filesystem by adding/removing/changing/replacing
files.

This typically includes the following changes: adding a custom HTML
application or a custom plugin, online firmware upgrade settings, default
STB settings, custom configuration for various STB functions, etc.

If you understand how to change "tango" filesystem directly, you can do it
on your own, test/debug things directly on a STB, and once everything is
done, just pack the entire content of "tango" filesystem and provide it as
a CRAMFS image or .tar.gz archive.

Otherwise, you can specify the needed changes in the firmware using
higher-level specs (e.g.: add given plugin, use given skin, etc). See below
for the list of things that can be customized.

Certain changes (e.g. changes in the native Dune UI which can not be done
by modifying plugins/skins/configuration files) may require changes in the
proprietary software components, and can not be achieved just by modifying
files in "tango" filesystem. Such changes can only be done by Dune HD by a
special customization request.

Changes in Linux kernel or low-level STB boot loaders also can only be done
by Dune HD by a special customization request. NOTE: additional Linux
kernel modules can be built using Dune Linux Kernel SDK and included into
the firmware by modifying "tango" partition.

How to test customizations

During development/testing process, all changes which should be applied to
"tango" filesystem can be tested in several ways:

- Using "bind mount" or by replacing the "tango" filesystem directly in the
  flash memory of the STB. See "Modifying files in read-only /tango
  filesystem" and "Extracting and overwriting tango filesystem image"
  sections here:
      http://files.dune-hd.com/sdk/doc/html/dune_devel_info.html

- For many customizations, there is an alternative more simple way to test
  the customization, which does not require to modify the "tango"
  filesystem. This may be useful for quick and convenient preliminary
  testing of the changes before creating and testing the final "tango"
  image. Such possibilities are described in "How to test" sections below.

Custom boot logo can be tested by opening the BMP file in the photo viewer
in native Dune UI. The final test of the custom boot logo (how it looks
during the real STB boot) can only be done after getting the custom
firmware build.

Things that can be customized by altering "tango" filesystem


Plugins

You can add, remove, replace plugins included into the firmware.

Location in "tango" filesystem:
   /firmware_ext/plugins

Default state:
   The default list of plugins included into the firmware depends on a
   particular base firmware.

How to test:
   Additional plugins (or modified plugin versions) can be installed in a
   regular way, using native Dune UI. Note: wrongly implemented plugins may
   depend on a particular location where they are installed (or on the
   possibility to write into that location, which is absent in case when
   the plugin is included into the firmware); this should be taken into
   account when implementing the plugin.

UI skins for native Dune UI

You can replace the main UI skin and modify the set of additional UI skins
(add, remove, replace additional skins).

Location in "tango" filesystem:
   /firmware/skin
   /firmware_ext/alternative_skins

Default state:
   The default skin and the list of additional (alternative) skins included
   into the firmware depends on a particular base firmware.

How to test:
   A new skin can be first installed in a regular way as a custom skin,
   using native Dune UI. After the skin is debugged, it can be included
   into the "tango" filesystem of the custom firmware.

More information about "skins" mechanism:
   http://dune-hd.com/support/skins

UI translations for native Dune UI

Native Dune UI includes UI translations for a set of languages. You can
modify these UI translations, add new UI translations, remove unneeded UI
translations.

Location in "tango" filesystem:
   /firmware/translations/languages.properties
      This configuration files lists all available UI translations.
   /firmware/translations/dune_language_*.txt
      For each UI translation listed in the "languages.properties" file,
      there should be the corresponding "dune_language_*.txt" file

Default state:
   The default list of UI translations depends on a particular base
   firmware. New firmware versions may include updated UI translations and
   additional UI translations.

How to test:
   A new UI translation can be first installed in a regular way as a custom
   language file, using native Dune UI. After the UI translation is
   debugged, it can be included into the "tango" filesystem of the custom
   firmware.

More information about language files mechanism:
   http://dune-hd.com/support/languages

Default values of STB settings

You can specify default values for all settings that can be edited in the
Setup section of the native Dune UI (and that are stored in
/config/settings.properties file).

Typical settings for which default values are altered in custom firmware
versions:
   - Language.
   - Video connector and video mode.
   - Time zone and daylight saving flag.
   - NTP time server address.
   - Sleep timer.
   - Zoom mode.
   - Show or not show certain built-in apps in the main menu.

Location in "tango" filesystem:
   /firmware/config/settings.properties

Default state:
   The default "default values" depend on a particular base firmware. Note,
   the "/firmware/config/settings.properties" file may be absent in the
   base firmware -- in this case, to determine the default set of "default
   values", the following approach can be used: do a full settings reset
   using native Dune UI, then "touch" any setting in order to force the STB
   to write the settings, and then check the content of
   "/config/settings.properties" file.

How to test:
   Settings can be modified via Setup menu in native Dune UI, or the file
   "/config/settings.properties" can be edited directly (after the file is
   edited, reboot the STB or restart the "shell" process using "killall
   shell" command).

Forced upgrade of STB settings after firmware upgrade

If you need a firmware upgrade to force upgrading STB settings to
particular values, this can be done using "upgrade_settings.properties"
file.

Location in "tango" filesystem:
   /firmware/config/upgrade_settings.properties

This file should contain the following:
   - Settings that should be forced.
   - A special property "upgrade_settings_version_tag": the value of this
     property should be an unique version identifier (e.g.
     "somecustomerid-1.0"). On each STB boot, the STB checks if forced
     upgrade is needed by comparing the version tag specified in the
     upgrade_settings.properties file and the version tag corresponding to
     the latest applied forced upgrade (the version corresponding to the
     latest applied forced upgrade is stored by the STB together with the
     current STB settings). If the version tag specified in the
     upgrade_settings.properties file is not equal to the one stored by the
     STB, all the settings specified in the upgrade_settings.properties
     file are applied, and the version tag stored by the STB is updated.
     This allows to ensure that forced settings upgrade is performed only
     once after installing the new firmware which requires forced settings
     upgrade. The settings upgraded in such a way (by such a firmware
     update) can be further modified manually if required, and these manual
     modifications will be kept until another firmware update (with a new
     version tag) will request to do a forced upgrade of these settings
     again.

Example:
   video_connector = hdmi
   video_mode = 720p50
   upgrade_settings_version_tag = besttv-1.0

Default state:
   The file does not exist, and thus forced settings upgrade is not
   performed.

How to test:
   There is no way to test this via /config directory. See the general
   approach for testing changes in "tango" filesystem described in "How to
   test customizations" section.

Configuration files determining various STB behavior

You can adjust the behavior of STB (including the behavior of the native
Dune UI) in some additional ways using special configuration files.

/firmware/config/ro_config.properties
   Description:
      Contains various parameters which influence native Dune UI appearance
      and behavior. If some parameter is omitted, the default value is
      used.
   Supported parameters:
      web_browser_home_url
         Description:
            Specifies the web site URL which is proposed to the user when
            the user launches the Web Browser application, and which is
            launched when the home button inside the Web Browser
            application is pressed.
         Default value: http://dune-hd.com
      web_browser_home_title
         Description:
            Specifies the caption of the home button inside the Web Browser
            application.
         Default value: Dune HD
      fixed_ui_type
         Description:
            Forces the specified UI type (in Appearance setup it is called
            "Main screen style"). When fixed UI type is specified, it
            is forced to be the only UI type not depending on settings, and
            the "Main screen style" setting is hidden in Appearance setup.
         Possible values:
            type1, type2, type3.
            In the Appearance setup these values are called 'Plain', 'Tabs'
            and 'Folders' respectivelly.
         Default value: <unset>. By default, current UI type is taken from
            the Appearance setup 'Main screen style' setting.
         Important notes:
            Using this parameter is not recommended when new GUI skin is
            designed for custom firmware, in this case all customizations
            shall be performed directly in gui_skin_config.xml. However it
            is still convenient for restricting the default skins.
      fixed_setup_view
         Description:
            Forces the specified main screen view. When fixed main screen
            view is specified, it is forced to be the only main screen view
            not depending on settings and the 'Main screen view' is hidden
            in Appearance setup.
         Possible values:
            defined in gui_skin_config.xml of the particular GUI skin.
         Default value: <unset>. By default, current main screen view is
            taken from the Appearance setup 'Main screen view' setting.
         Important notes:
            Using this parameter is not recommended when new GUI skin is
            designed for custom firmware, in this case all customizations
            shall be performed directly in gui_skin_config.xml. However it
            is still convenient for restricting the default skins.
      fixed_setup_view
         Description:
            Forces the specified setup view. When fixed setup view is
            specified, it is forced to be the only setup view not depending
            on settings and the 'Setup view' is hidden in Appearance setup.
         Possible values:
            defined in gui_skin_config.xml of the particular GUI skin.
         Default value: <unset>. By default, current setup view is taken
            from the Appearance setup 'Setup view' setting.
         Important notes:
            Using this parameter is not recommended when new GUI skin is
            designed for custom firmware, in this case all customizations
            shall be performed directly in gui_skin_config.xml. However it
            is still convenient for restricting the default skins.
      fixed_folder_view
         Description:
            Forces the specified folder view. When fixed folder view is
            specified, it is forced to be the only folder view not depending
            on settings and the 'Folder view' is hidden in Appearance setup.
         Possible values:
            defined in gui_skin_config.xml of the particular GUI skin.
         Default value: <unset>. By default, current folder view is taken
            from the Appearance setup 'Folder view' setting.
         Important notes:
            Using this parameter is not recommended when new GUI skin is
            designed for custom firmware, in this case all customizations
            shall be performed directly in gui_skin_config.xml. However it
            is still convenient for restricting the default skins.
      sysinfo_logo_caption
         Description:
            Specifies the caption shown in "Setup / System Information"
            menu.
         Default value: Dune HD
      sysinfo_web_address
         Description:
            Specifies the URL shown in "Setup / System Information" menu.
         Default value: http://dune-hd.com
      sysinfo_web_address_enabled
         Description:
            Specifies whether the URL, specified in sysinfo_web_address
            parameter, must be shown in "Setup / System Information" menu.
            Posible values: "yes" and "no".
         Default value: yes
         Firmware versions:
            Available starting with firmware versions 131102_b9+.
      default_smb_server_name
         Description:
            Specifies the the default value of SMB server name setting
            (accessible via "Setup / Applications / SMB server" menu).
         Default value: Dune
      default_smb_server_description
         Description:
            Specifies the the default value of SMB server description
            setting (accessible via "Setup / Applications / SMB server"
            menu).
         Default value: Dune SMB server
      default_smb_server_workgroup
         Description:
            Specifies the the default value of SMB workgroup setting
            (accessible via "Setup / Applications / SMB server" menu).
         Default value: WORKGROUP
      fast_standby_led_on_power_off
         Description:
            Specifies LED light behaviour when system goes into standby
            mode by pressing "Power" RC button. Possible values are:
            - "no" -- LED light blinks once, then it remains "active"
               (blue) for a number of seconds untill all deinitialization is
               completed and finally switches to "inactive" (red) state.
            - "yes" -- LED light becomes red immediately
         Default value:
            - no
            - yes in firmware 130904_b8+
         Firmware versions:
            Available starting with firmware versions 130606_b6+.
      native_ui_by_hotkey_in_standby_enabled
         Description:
            Specifies if special handling of "D" RC button in standby mode
            is enabled ("yes") or not ("no"). When enabling, pressing "D" RC
            button in standby mode forces the loading of the native Dune
            UI, even if the STB is configured to boot to "stb_home"
            application instead of the native Dune UI. If it is desired to
            ensure that the native Dune UI can not be reached in a custom
            firmware, should be set to "no".
         Default value: yes.
         Firmware versions:
            Available starting with firmware versions *_b7+.
      external_plugins_enabled
         Description:
            Specifies which 3-party plugins are allowed. Possible values
            are:
            - "all" -- All 3-party plugins are allowed.
            - "signed" -- Only 3-party plugins signed by Dune HD are
              allowed. The 'signer_id' must be listed in the
              'allowed_plugin_signer_ids', if list is specified.
            - "none" -- No 3-party plugins are allowed. Only plugins
              included into the firmware are available for the user. It is
              not possible to update these preinstalled plugins (including
              online update mechanism).
            See also "Secure firmware" section below.
         Default value: all
         Firmware versions:
            Available starting with firmware versions 130803_b8+.
      allowed_plugin_signer_ids
         Description: Specifies a comma-separted list of allowed plugin
         signer identifiers. When parameter is not specified all signer
         identifiers are allowed.
         Default value: <unset>
         Firmware versions:
            Available starting with firmware versions 130803_b8+.
      plugins_installation_enabled
         Description:
            Specifies if the user should be able to install new plugins.
            Possible values are "yes" and "no". This parameter makes sense
            only if external_plugins_enabled != none. The value "no" does
            not prevent plugins, included into the firmware, from being
            updated via plugin online updated mechanism.
         Default value: yes
         Firmware versions:
            Available starting with firmware versions 130803_b8+.
      external_storage_plugins_enabled
         Description:
            Specifies if "System storage" (an external storage device used
            for system needs) can be used to store plugins. Possible values
            are "yes" and "no". This parameter makes sense only if
            external_plugins_enabled != none. The value should be set to
            "no" if it is needed to prevent advanced/malicious users from
            adding/changing plugins via direct access to this external
            storage device.
         Default value: yes
         Firmware versions:
            Available starting with firmware versions 130918_b8+.
      service_file_enabled
         Description:
            Specifies which DSF service files are allowed. Possible values
            are:
            - "all" -- All DSF service files are allowed.
            - "signed" -- Only DSF service files signed by Dune HD are
              allowed.
            See also "Secure firmware" section below.
         Default value: yes
         Firmware versions:
            Available starting with firmware versions 130924_b8+.
      dvb_channel_image_url_prefix
         Description:
            Specifies URL prefix to use for downloading icons for DVB
            channels. URL for a particular DVB channel icon is constructed
            by appending DVB channel name to this URL prefix.
         Default value:
            http://files3.dune-hd.com/channel_images/
         Firmware versions:
            Available starting with firmware versions 130727_b6+.
      skip_standby
         Description:
            Whether the standby mode should be immediately exitted each
            time it is entered.
         Possible value: yes, no
         Default value: no
         Firmware versions:
            Available starting with firmware versions 130618_b5+.
      force_fw_upgrade_autocheck_updates
         Description:
            Whether to always check online updates automatically, hiding
            the corresponding "Check updates automatically" setting from
            "Firmware Upgrade" setup.
         Possible values: yes, no
         Default value: no
         Firmware versions:
            Available starting with firmware versions 130801_b8+.
      soft_reset_settings_enabled
         Description:
            Whether 'Soft reset' option is enabled in Setup / General /
            Reset settings.
         Possible values: yes|no
         Default value: yes
         Firmware versions:
            Available starting with firmware versions 140402_b9+.
      recording_enabled
         Description:
            Whether playback recording enabled by pressing REC RC button in
            native Dune UI.
         Possible values: yes, no
         Default value: yes
         Firmware versions:
            Available starting with firmware versions 130830_b8+.
      recording_encryption
         Description:
            When set to 1 forces LPVR recordings to be written to disk in
            encrypted form. Encrypted recordings can be played only on the
            STB the recordings were made.
         Possible values: 0, 1
         Default value: 0
         Firmware versions:
            Available starting with firmware versions 140331_b9+.
      favorites_enabled
         Description:
            Whether favorites support in native Dune UI enabled including
            Favorites main screen item and "Add to main screen" popup menu
            actions.
         Possible values: yes, no
         Default value: yes
         Firmware versions:
            Available starting with firmware versions 130830_b8+.
      network_folders_enabled
         Description:
            Whether network folders enabled. When enabled, network folder
            can be created in 'Sources' Dune menu folder.
         Possible values: yes|no
         Default value: yes
         Firmware versions:
            Available starting with firmware versions 140402_b9+.
      manual_network_mounts_enabled
         Description:
            Whether manual network mounts should be shown in 'Sources' Dune
            menu folder.
         Possible values: yes|no
         Default value: yes
         Firmware versions:
            Available starting with firmware versions 140402_b9+.
      storage_ipc_check_timeout
         Description:
            Timeout in milliseconds between subsequent storage_manager
            checks for new IPC requests. Reducing this parameter allows to
            speed-up some STB API operations, but this also lead to
            increased CPU load.
         Possible values: 1..1000
         Default value: 500
         Firmware versions:
            Available starting with firmware versions 140126_b9+.
      dvbt_item_section_index
      dvbc_item_section_index
      dvbs_item_section_index
         Description:
            If non-negative value specifed, the DVB-T/DVB-C/DVB-S menu item
            is moved to the main screen. Affects only "Folders" main screen
            style, because in other cases DVB-T/DVB-C/DVB-S menu item is
            already on main screen. The property value (integer) specifies
            the position index of menu item.
         Possible values: non-negative integer or -1
         Default value: -1
         Firmware versions:
            dvbt_item_section_index:
               Available starting with firmware versions 130906_b8+.
            dvbc_item_section_index, dvbs_item_section_index:
               Available starting with firmware versions 140328_b9+.
      dvbt_is_default_section
      dvbc_is_default_section
      dvbs_is_default_section
         Description:
            Whether DVB-T/DVB-C/DVB-S menu item on the main 'sections'
            screen should be focused by default. Is effective only when
            corresponding dvb<X>_item_section_index property is set to
            non-negative value. Affects only "Folders" main screen style.
         Possible values: yes|no
         Default value: no
         Firmware versions:
            Available starting with firmware versions 140328_b9+.
      dvbt_player_only
      dvbc_player_only
         Description:
            Controls whether DVB-T/DVB-C application contains non-playback
            part.
            If set to yes: DVB-T/DVB-C application launches playback
            immediately when pressing Enter on application; if no:
            DVB-T/DVB-C application first enters channel browser in Dune
            menu.
         Possible values: yes|no
         Default value: no
         Firmware versions:
            Available starting with firmware versions 140402_b9+.
      dvbt_auto_suggest_scan
      dvbc_auto_suggest_scan
         Description:
            Specifes behaviour of default entering the DVB-T/DVB-C
            applications when channels not yet configured
            If yes: user is suggested to perform scan, otherwise user is
            adviced to go to DVB-C settings, adjust parameters and perform
            scan manually.
         Possible values: yes|no
         Default value: yes
         Firmware versions:
            Available starting with firmware versions 140402_b9+.
      server_messages_enabled
         Description:
            Whether server messages service enabled.
         Possible values: yes|no
         Default value: depends on build configuration; true for public
            builds, false for dune_native_gui_sdk/js_stb_sdk builds.
         Firmware versions:
            Available starting with firmware versions 140208_b8+.
      server_messages_url
         Description:
            Main URL or service messages service: contains list of actual
            messages.
         Possible values: http URL
         Default value: <unset>
         Firmware versions:
            Available starting with firmware versions 140208_b8+.
      server_messages_update_timeout
         Description:
            Timeout in seconds between subsequent checks for new server
            messages.
         Possible values: positive integer,
         Default value: 86400
         Firmware versions:
            Available starting with firmware versions 140208_b8+.
      server_messages_key_name
         Description:
            Name of key to be used for server messages verification. The
            corresponsing DSA public key file <key-name>.pem must exist in
            /firmware/config/keys/ directory. When value is empty or not
            specified, then the default hard-coded key will be used.
         Possible values: string, corresponding key-file must exist
         Default value: <unset>
         Firmware versions:
            Available starting with firmware versions 140208_b8+.
      directfb14_odelay
         Description:
            Internal setting, affects GUI initialization.
         Possible values: positive integer or -1
         Default value: -1
         Firmware versions:
            Available starting with firmware versions 130911_b8+.
      menu_protection_type
         Description:
            Enables/disables menu protection and specifies type of
            protection. Currently there only 'fixed_pin' protection type is
            available, meaning that PIN-code is hard-coded in the firmware
            and cannot be changed. See the description of 'fixed_pin' parameter.
            The exact menu components to be protected are specified in
            menu_config.xml by means of protected="yes" XML attribute.
         Possible values: none, fixed_pin
         Default value: none
         Firmware versions:
            Available starting with firmware versions 130911_b8+.
      fixed_pin
         Description:
            Specifies the fixed PIN code to be used with
            menu_protection_type='fixed_pin'.
         Possible values: <string>
         Default value: <unset>
         Firmware versions:
            Available starting with firmware versions 130911_b8+.
      opera_files_early_caching
         Description:
            Specifies whether to force Opera browser files to be cached by
            the operating system before the boot spash picture disappears.
            This setting affects only players on 8672/8674 chips or newer
            with Opera browser.
            This setting is useful only for the custom HTML appications
            ('stb_home' applications).
            Setting this parameter to yes leads to reducing the amount of
            'black screen' time between the boot splash disappearance and
            the Opera browser background picture appearance. However the
            overall loading time increases.
         Possible values: yes, no
         Default value: no
         Firmware versions:
            Available starting with firmware versions 131022_b9+.
      interface_language_wizard_enabled
         Description:
            Specifies whether to show "Interface Language" dialog in setup
            wizard. If 'no' => dialog is skipped and default iterface
            language is chosed. If 'yes' => dialog is shown unless
            /firmware/config/settings.properties contains
            'interface_language' value.
         Possible values: yes, no
         Default value: yes
         Firmware versions:
            Available starting with firmware versions 130830_b8+.
      default_interface_language
         Description:
            Specifies the default interface language.
         Possible values: one of the language names, defined in
            /firmware/translations/language.properties. Examples: english,
            french, german, etc.
         Default value: english
         Firmware versions:
            Available starting with firmware versions 130830_b8+.
      force_black_screen_for_initial_wizard
         Description:
            Forces black screen background for initial setup wizard dialog.
         Possible values: yes, no
         Default value: no
         Firmware versions:
            Available starting with firmware versions 130604_b6+.
      force_black_screen_for_upgrade_autocheck (not supported anymore)
         Description:
            Forces black screen background for initial firmware online
            upgrade autocheck dialogs. In 130914_b8+ parameter is ignored,
            the force_black_screen_for_initial_wizard value is used
            instead.
         Possible values: yes, no
         Default value: no
         Firmware versions:
            Available starting with firmware versions 130604_b6+.
            Not supported (ignored) starting with firmware version
            130914_b8+.
      background_url_for_initial_wizard
         Description:
            Specifies the image URL to be used as background for initial
            setup dialogs. Typically it is 1920x1080 jpeg included into
            images directory in base firmware skin
            /firmware/skin/images/some_image.jpg and references by gui_skin
            URL schema: gui_skin://images/some_image.jpg.
         Possible values: image URL string
         Default value: <unset>
         Firmware versions:
            Available starting with firmware versions 130825_b8+.
      network_wizard_main_check_url
         Description:
            Specifies the http URL to be used for internet availability
            check "Checking Internet..." during the initial network setup
            wizard.
         Possible values: http URL string pointing to permanently available
            Internet resource of small size.
         Default value: some firmware-specific http URL to *dune-hd.com.
         Firmware versions:
            Available starting with firmware versions 130816_b8+.
      network_wizard_additional_check_url
         Description:
            Specifies the http URL to be used for additional "Checking
            Server..." stage of the initial network setup wizard. If
            parameter not specified then no additional network checks is
            performed.
         Possible values: http URL string pointing to permanently available
            Internet resource of small size.
         Default value: <unset>
         Firmware versions:
            Available starting with firmware versions 130816_b8+.
      network_wizard_connection_pppoe_enabled
         Description:
            Specifies whether PPPoE connection type can be chosen in the
            initial network setup wizard.
         Possible values: yes, no
         Default value: yes
         Firmware versions:
            Available starting with firmware versions 130827_b8+.
      network_wizard_connection_none_enabled
         Description:
            Specifies whether None connection type can be chosen in the
            initial network setup wizard.
         Possible values: yes, no
         Default value: yes
         Firmware versions:
            Available starting with firmware versions 130827_b8+.
      network_wizard_advanced_settings_enabled
         Description:
            Specifies whether advanced network-setup stages are enabled
            during the initial setup wizard.
         Possible values: yes, no
         Default value: yes
         Firmware versions:
            Available starting with firmware versions 130827_b8+.
      network_wizard_continue_anyway_enabled
         Description:
            Specifies whether network setup wizard is allowed to be passed
            without all network checks succeeded. If value is 'no' then
            "Continue Anyway" button is not shown, prohibiting user to
            continue without entering the correct network settings.
            As a special administration feature, the secret key sequence
            can be typed to skip the "Checking network connection" stage.
         Possible values: yes, no
         Default value: yes
         Firmware versions:
            Available starting with firmware versions 130827_b8+.
      network_wizard_timesync_check_enabled
         Description:
            Specifies whether to enable "Time synchronization" checking.
         Possible values: yes, no
         Default value: yes
         Firmware versions:
            Available starting with firmware versions 131112_b8+.
      check_fw_upgrade_in_wizard
         Description:
            Specifies whether firmware upgrade autocheck shall be performed
            as part of the initial setup wizard.
         Possible values: yes, no
         Default value: no
         Firmware versions:
            Available starting with firmware versions 130827_b8+.
      force_fw_upgrade_in_wizard
         Description:
            Specifies whether firmware upgrade autocheck stage is allowed
            to be passed without performing the upgrade when new firmware
            is available.
            As a special administration feature, the secret key sequence
            can be typed to skip the error dialog.
         Possible values: yes, no
         Default value: no
         Firmware versions:
            Available starting with firmware versions 130827_b8+.
      force_initial_wizard
         Description:
            Specifies whether initial wizard shall be called in special use
            case: auto start of the HTML plugin. The parameter does not
            affect other use-cases.
         Possible values: yes, no
         Default value: no
         Firmware versions:
            Available starting with firmware versions 130619_b5+.
      fixed_wizard_tv_standard
         Description:
            If specified, the 'TV standard' stage of the initial video
            setup is not shown and the specified value is used.
         Possible values: pal, ntsc
         Default value: <unset>
         Firmware versions:
            Available starting with firmware versions 121201+.
      stbapi_color_key_enabled
         Description:
            Whether color key support is enabled. When enabled, STB API
            applications including web browser can set color key to make
            OSD layer transparent and reveal underlying video layer.
         Possible values: yes|no
         Default value: yes
         Firmware versions:
            Available starting with firmware versions 140709_b9+.
      ttx_loading_force_transparent_bg
         Description:
            Whether to use transparent background while showing special
            'Loading...' teletext page.
         Possible values: yes|no
         Default value: yes
         Firmware versions:
            Available starting with firmware versions 140723_b9+.
      shell_restart_on_return_from_launch_native_ui
         Description:
            Whether to restart shell process when returning to stb_home
            HTML application or native application from the call to STB API
            operation launchNativeUi(). Can be used when it is needed to
            ensure full resources cleanup/reinitialization.
         Possible values: yes|no
         Default value: no
         Firmware versions:
            Available starting with firmware versions 150814_10+.

   Default state:
      See default values described above. Also see the behavior of the
      native Dune UI in the standard (non-customized) firmware.
   How to test:
      Put this file into /config directory.

/firmware/config/nav_sections_order.txt
   Description:
      Allows to customize the order of sections in the main menu (e.g. make
      the "TV" section the first section). Contains one or more lines, each
      line specifies one section, the listed sections are put in the
      beginning in the specified order, the remaining sections (not
      specified in this file) are appended in their standard order.
   Example content:
      root://tv
   Default state:
      See Native Dune UI in the standard (non-customized) firmware.
   How to test:
      Put this file into /config directory.

/firmware/config/plugin_config.xml
   Description:
      Allows to restrict some actions for some plugins; i.e. allows to
      specify which plugins cannot be installed/replaced/deleted.
      There are also the ro_config parameters 'external_plugins_enabled'
      and 'plugins_installation_enabled' designed for the same purpose, but
      they provide less flexibility. Using of these ro_config parameters
      toghether with plugin_config.xml is not recommended; if ro_config
      possibilities are not sufficient, plugin_config.xml should be used
      instead.
   Firmware versions:
      Available in firmware_versions 150113_b9+.
   Syntax:
      <plugin_config>
        <plugins>
          <default_external>
            <allow_install> yes | signed | no </allow_install>
            <allow_delete> yes | no </allow_delete>
            <allow_replace> yes | same_signer_id | no </allow_replace>
          </default_external>
          <default_embedded>
            <allow_delete> yes | no </allow_delete>
            <allow_replace> yes | same_signer_id | no </allow_replace>
          </default_embedded>
          <plugin name="...">
            <allow_install> yes | signed | no </allow_install>
            <allow_delete> yes | no </allow_delete>
            <allow_replace> yes | same_signer_id | no </allow_replace>
          </plugin_name>
          ...
          <plugin name="...>
            ...
          </plugin>
        </plugins>
      </plugin_config>
   Terms used in this XML syntax and detailed description.
      - the installed plugin is called 'embedded' if it is built into
        firmware (e.g. if directory /firmware_ext/plugins/<plugin_name>
        exists); otherwise it is called 'external'. NOTE: despite embedded
        plugin was replaced or updated, it is still considered as embedded.
      - plugin can be 'installed', 'replaced' or 'updated'. 'Install'
        refers to deployment of the new plugin in system; 'replace' means
        any modification of existent plugin, excluding 'update' use-case;
        the 'update' means invocation of plugin online update mechanism.
   Detailed description:
      The 'default_embedded' section specifies the default restrictions for
      embedded plugins, the 'default_external' spefifies the default
      restrictions for external plugins. By default, everything is allowed.
      The 'plugin name="PluginName"' section overrides some aspects of the
      default restrictions for the specified plugin.
      'allow_install' = yes|signed|no: whether new external plugins'
      installation is allowed. Value 'signed' means that only signed
      external plugin installation is allowed.
      'allow_delete' = yes|no: whether delete is allowed.
      'allow_replace' = yes|same_signer_id|no: whether replace is allowed.
      Value 'same_signer_id' means that (1) if previous plugin is signed =>
      new plugin must be signed with same signer id; (2) if previous plugin
      is not signed => new plugins can be not signed or signed with any
      signer id. NOTE: the 'allow_replace' specification does not affect
      online update use-case; the update is always restricted by
      'same_signer_id' logic.
   Example 1:
      - signed plugins installation allowed (e.g. Dune Store plugins).
      - installation of not signed external plugins not allowed;
      - embedded plugin MyPlugin managed by customer: can be not signed,
         replace not allowed, online update can be enabled.
      - plugin_config.xml:
         <plugin_config>
           <plugins>
             <default_external>
               <allow_install>signed</allow_install>
               <allow_delete>yes</allow_delete>
               <allow_replace>same_signer_id</allow_replace>
             </default_external>
             <plugin name="MyPlugin">
               <allow_replace>no</allow_replace>
             </plugin>
           </plugins>
         </plugin_config>
      NOTE: to enable replace of MyPlugin from storage, change the corresponding 
      allow_replace value to 'same_signer_id' or 'yes'.
   Example 2
      - external plugins installation not allowed;
      - all embedded plugins: can be not signed, online update can be
        enabled, replace not allowed; delete not allowed.
      - plugin_config.xml:
         <plugin_config>
           <plugins>
             <default_external>
               <allow_install>no</allow_install>
             </default_external>
             <default_embedded>
               <allow_replace>no</allow_replace>
               <allow_delete>no</allow_delete>
             </default_embedded>
           </plugins>
         </plugin_config>
   Example 3
      - everything allowed for all plugins except embedded MyPlugin;
      - MyPlugin cannot be deleted or replaced; online update can be
         enabled.
      - plugin_config.xml:
         <plugin_config>
           <plugins>
             <plugin name="MyPlugin"">
               <allow_replace>no</allow_replace>
               <allow_delete>no</allow_delete>
             </plugin>
           </plugins>
         </plugin_config>

/firmware/config/menu_config.xml
   Description:
      The main Dune menu configuration file. Contains the specification of
      top-level Dune menu and setup hierarchy in XML format. Consists of 3
      parts:
         - global parameters;
         - list of top-level Dune menu sections;
         - list of setup screens;
   File structure:
      <dune_menu_config>

         <!-- global parameters -->
         <param_name>param_value</param_name>

         <!-- section list -->
         <sections>
            <section>
               <!-- ... -->
            </section>
            <!-- ... -->
         </sections>

         <!-- setup (available in firmware versions 131010_b9+) -->
         <setup>
            <screens>
               <screen id="applications" type="folder" icon_id="apps" small_icon_id="APPS">
                  <!-- ... -->
               </screen>
               <!-- ... -->
            </screens>
         </setup>

      </dune_menu_config>
   Supported global parameters:
      show_slave_sections
         Description:
            Specifies whether to show "slave" sections in "Folders" main
            screen style.
            If value "no" is specified, then appearance setup setting
            "Additional categories in main screen" is not shown.
            See below about "master" and "slave" sections.
         Possible values: yes, no
         Default value: no
   Section list:
      Specifies the ordered list of "sections" -- top-level Dune menu
      folders. The sections are shown at top level of Dune menu in "Tabs"
      and "Folders" main screen style.
      Each section has unique identifier known as "url". Each section URL
      must start with prefix root://. There is a number of predefined
      section URLs with special meaning, see below for details.
      Each section can be "master" or "slave". The master sections are
      always shown in menu. The slave section is shown in menu only if all
      the following conditions are met:
         1. The "show_slave_sections" parameter is "Yes".
         2. The setting "Main screen style" is "Folders".
         3. The setting "Additional categories in main screen" is "Yes".
      Each slave sections belongs to one of the master sections. When
      slave section is not shown, it's items are moved to it's master
      section.
      Some sections are so-called "application containers". Most Dune
      applications, implemented as Dune plugin, extend the Dune menu with
      new items, providing section URL to specify where to put it's menu
      items. For correct support of all existing Dune application, all
      standard application-container sections URLs must present in section
      list. Here are the ULRs of standard application container sections:
         root://tv
         root://applications
         root://video
         root://music_and_radio
         root://news_and_weather
         root://social_networks
         root://games
      The custom menu_config.xml may also specify other application
      container sections.
      When parameter "show_slave_sections" is "no" the slave sections are
      never visible but they still can be used to specify where to put the
      corresponding application menu items. See below the example of such
      "dummy" slave section definition.
      There is also a number of sections with predefined content and
      behaviour; some of them must present in every menu_config.xml. Their
      URLs are:
         root://sources
            This section contains menu items for storages, network folders
            and a Network Browser. This section must present in section list.
               NOTE: This section can be skipped in firmware versions
               131014_b8+.
         root://favorites
            This section is a "Favorites" folder: it contains the list of
            links, manually created by used by executing "Add to favorites"
            action from popup-menu or by pressing "D" RC button.
            This section can be skipped in section list, but only together
            with specifying favorites_enabled=no in ro_config.properties.
         root://setup
            This section contains Dune setup screen. See below about
            configuring the setup hierarchy in menu_config.xml.
            This section must present in section list.
   Master section example:
      <section>
         <url>root://tv</url>
         <caption_t_key>navigator_section_tv</caption_t_key>
         <details_t_key>navigator_section_tv_details</details_t_key>
         <small_state_text>TV</small_state_text>
         <icon_id>section_tv</icon_id>
         <small_icon_name>TV</small_icon_name>
         <tab_icon_url>gui_skin://special_icons/top_section_tv.aai</tab_icon_url>
         <tab_order_ndx>1</tab_order_ndx>
      </section>
   Slave section example:
      <section>
         <url>root://video</url>
         <master_section_url>root://applications</master_section_url>
         <caption_t_key>navigator_section_video</caption_t_key>
         <details_t_key>navigator_section_video_details</details_t_key>
         <small_state_text>VIDEO</small_state_text>
         <icon_id>section_video</icon_id>
         <small_icon_name>SECTION_VIDEO</small_icon_name>
      </section>
   "Dummy slave" section example:
      <section>
         <url>root://video</url>
         <master_section_url>root://applications</master_section_url>
      </section>
   Section parameters description:
      url
         Description:
            Unique section string identifier. Must be started with prefix
            root://. There is a number of predefined section URLs
            referenced from firmware code and from a large number of
            existing Dune plugins.
         Possible values: root://*
         Default value: parameter is mandatory
      caption_t_key
         Description:
            Translation key, referencing the user-visible section name.
            Key must present in the default translation file.
         Possible values: string key existing in default translation file
         Default value:
            parameter is mandatory unless section is "dummy slave", in the
            latter case value is ignored.
      details_t_key
         Description:
            Translation key, referencing the user-visible section
            description. The description is auto-split into words and
            painted in the details block in the right of the screen when
            section menu item is focused.
            Key must present in the default translation file.
         Possible values: string key existing in default translation file
         Default value:
            parameter is mandatory unless section is "dummy slave", in the
            latter case value is ignored.
      small_state_text
         Description:
            String, shown in FIP display for Dune models equipped with FIP
            display.
            String is preferred to have only ASCII 127 printable characters
            without lowercase letter; however it is not the requirement.
         Possible values: string
         Default value:
            parameter is mandatory unless section is "dummy slave", in the
            latter case value is ignored.
      icon_id
         Desciption:
            String, specifying the GUI representation of the menu item. The
            "icon_id" is a key, referencing some IconViewItem, described in
            the root IconView definition of the current GUI skin.
            The value of this parameter must be defined in the default GUI
            skin of custom firmware and in all skins, supported by the
            custom firmware.
            See the following root IconView definition files in GUI skins
            in the default dune firmware for more details:
               /firmware/skin/large_icons/nav_root_*.properties
               ("Base" skin)
               /firmware_ext/alternative_skins/Black/large_icons/nav_sections_demo_5x1.properties
               ("Black" skin)
            Also see how these files are referenced from GUI skin
            configuration files:
               /firmware/skin/dune_skin_config.xml and
               /firmware_ext/alternative_skins/Black/dune_skin_config.xml
         Possible values:
            string, mentioned in the root IconView GUI skin file, see
            description for more details.
         Default value:
            parameter is mandatory unless section is "dummy slave", in the
            latter case value is ignored.
      small_icon_name
         Description:
            String, identifying "small" icon for the section. This icon is
            pained in the path block when section is entered.
            Currently only a fixed hard-coded list of small icons can be
            used here: all icons from "small_icons" directory of the
            default Dune GUI skin. See the
            http://files.dune-hd.com/sdk/doc/html/small_icons.html for
            complete list of suppoted small icons with their identifiers.
         Possible values: string, a valid small icon identifier.
         Default value:
            parameter is mandatory unless section is "dummy slave", in the
            latter case value is ignored.
      master_section_url
         Description:
            String, specifying the master section URL, assigned to this
            slave section. If "master_section_url" parameter is specified,
            then this section called "slave"; otherwise it is called
            "master".
            The section, referenced by the "master_section_url", must be
            "master" itself.
            See the "Section list" description above for more details about
            master and slave sections.
         Possible values: string, URL of the existing section.
         Default value:
            if not specified, section is considered "master".
      tab_icon_url
         Description:
            Icon URL, specifying the representation of this master section
            in the top-box on main screen in "Tabs" main screen style.
            Value is ignored and should not be specified for slave sections.
            Normally, such icons are located in the "special_icons" folder
            of the current skin; so the URL shall look like:
            gui_skin://special_icons/<filename>.
            See the standard Dune firmware for examples.
         Possible values: gui_skin:// icon URL.
         Default value:
            value is mandatory for master sections and ignored for slave
            sections.
      tab_order_ndx
         Description:
            Integer, specifying the order of master sections in all cases
            when slave sections are hidden. NOTE: when slave sections are
            shown the order of sections is specified by order of section
            elements in menu_config.xml.
         Possible values: 0 .. number_of_master_sections-1
         Default value:
            value is mandatory for master sections and ignored for slave
            sections.
   Setup screen list:
      Setup screens customization available in firmware versions 131010_b9+.
      Specifies the list of setup screens.
      There are several types of setup screens:
         - folder
         - generic
         - other specific setup screens with predefined behaviour:
            - video
            - network
            - torrents
            - fw_upgrade
            - sysstor
            - plugins
            - sysinfo
      The "folder" setup screens represent the list of other setup screens.
      Folder screens may contain other folder screens, so the multi-level
      hirarchy of setup screens can be specified.
      The "generic" setup screens represent the list of setup settings,
      visualized as vertical list of GUI controls: comboboxes, text fields,
      buttons and fixed text strings.
      Other "special" setup screens have specific predefined visualization
      and behaviour. Some of them have type-specific parameters.
      Every setup screen has unique string identifier "id"; some of them
      have the predefined meaning:
         - id="setup"
            the root setup screen, must be "folder";
         - id="applications"
            setup screen of type "folder", many existing Dune plugins place
            their setup screens into this folder.
   Example of folder setup screen:
      <screen id="applications" type="folder" icon_id="apps" small_icon_id="APPS">
        <caption t_key="apps_setup_title"/>
        <screens>
          <screen id="presenter"/>
          <screen id="photo_viewer"/>
          <screen id="network_browser"/>
          <screen id="smb_server"/>
          <screen id="dvbt"/>
          <screen id="dvbc"/>
          <screen id="dvbs"/>
          <screen id="widget"/>
        </screens>
      </screen>
   Example of generic setup screen:
      <screen id="audio" type="generic" icon_id="audio" small_icon_id="AUDIO">
        <caption t_key="audio_setup_title"/>
        <settings>
          <setting id="digital_audio_connector"/>
          <setting id="spdif_audio_mode"/>
          <setting id="analog_audio_mode"/>
          <setting id="max_spdif_sample_rate"/>
          <setting id="hdmi_audio_mode"/>
          <setting id="bluray_audio_mode"/>
          <setting id="drc_mode"/>
          <setting id="volume_control_mode"/>
          <setting id="volume_indication"/>
          <setting id="dts_conversion_mode"/>
        </settings>
      </screen>
   Example of video setup screen:
      <screen id="video" type="video" icon_id="video" small_icon_id="VIDEO">
        <caption t_key="video_setup_title"/>
        <params>
          <param name="show_auto_framerate" value="yes"/>
          <param name="show_advanced_settings" value="yes"/>
        </params>
      </screen>
   Example of network setup screen:
      <screen id="network" type="network" icon_id="network" small_icon_id="NETWORK">
        <caption t_key="network_setup_title"/>
        <params>
          <param name="show_wifi_ap" value="yes"/>
        </params>
      </screen>
   Example of system information screen:
      <screen id="sysinfo" type="sysinfo" icon_id="sysinfo" small_icon_id="INFO">
        <caption t_key="sysinfo_title"/>
        <params>
          <param name="show_product_id" value="yes"/>
          <param name="show_firmware_version" value="yes"/>
          <param name="show_serial_number" value="yes"/>
          <param name="show_license" value="yes"/>
          <param name="show_ip" value="debug"/>
          <param name="show_mac" value="debug"/>
          <param name="show_time" value="no"/>
          <param name="show_system_storage" value="no"/>
        </params>
      </screen>
   Common setup screen parameters:
      id
         Syntax:
            XML attribute "id" of "screen" element.
         Description:
            Unique setup screen string identifier. The id="setup", and
            id="applications" have special meaning. See above the "Setup
            screen list" description for more details.
         Possible values: string
         Default value: value is mandatory
      type
         Syntax:
            XML attribute "type" of "screen" element.
         Description:
            Setup screen type. See above the "Setup screen list"
            description for more details.
         Possible values: string, one of the predefined string constants
         Default value: value is mandatory
      icon_id
         Syntax:
            XML attribute "icon_id" of "screen" element.
         Desciption:
            String, specifying the GUI representation of the setup screen
            item as an element of parent folder. The "icon_id" is a key,
            referencing some IconViewItem, described in the setup IconView
            definition of the current GUI skin. The value of this parameter
            must be defined in the default GUI skin of custom firmware and
            in all skins, supported by the custom firmware.
            See the following setup IconView definition files in GUI skins
            in the default dune firmware for more details:
               /firmware/skin/large_icons/setup_*.properties
               ("Base" skin)
               /firmware_ext/alternative_skins/Black/large_icons/setup_demo_5x2.properties
               ("Black" skin)
            Also see how these files are referenced from GUI skin
            configuration files:
               /firmware/skin/dune_skin_config.xml and
               /firmware_ext/alternative_skins/Black/dune_skin_config.xml
         Possible values:
            string, mentioned in the setup IconView GUI skin file, see
            description for more details.
         Default value: parameter is mandatory.
      small_icon_name
         Syntax:
            XML attribute "small_icon_id" of "screen" element.
         Description:
            String, identifying "small" icon for the setup screen item
            representation in the parent folder view. This icon is visible
            only when the "Setup screen view" setup setting is set to
            "List" which is rarely used.
            Currently only a fixed hard-coded list of small icons can be
            used here: all icons from "small_icons" directory of the
            default Dune GUI skin. See the
            http://files.dune-hd.com/sdk/doc/html/small_icons.html for
            complete list of suppoted small icons with their identifiers.
         Possible values: string, a valid small icon identifier.
         Default value: parameter is mandatory.
      caption
         Syntax:
            Child XML element "caption" of "screen" element. There are two
            variants:
               - reference the translation files by the "t_key" XML
               attribute of a single "caption" child element. Example:
                  <caption t_key="audio_setup_title"/>
               - specify the caption directly with possiblity to specify
               different languages by placing several "caption" XML
               elements with different values of "lang" attribute. The
               default caption must be specified as "caption" child elemnt
               without "lang" attribute. Example:
                  <caption>Audio</audio>
                  <caption lang="hebrew">וידוא</caption>
                  <!-- ... -->
         Description:
            User-visible setup screen name with multilanguage support.
         Possible values: see Syntax for more details
         Default value: value is mandatory
   Additional folder screen specification:
      screens / screen / id
         Folder screen specification is an ordered list of screen
         identifiers: the list of folder elements. Also see above the
         "Example of folder setup screen".
      screens / screen / protected
         Description:
            The "yes" value enables menu protection for entering the child
            setup screen. See the description of "menu_protection_type" of
            the ro_config.properties for more details.
         Possible values: yes | no
         Default value: no
      screens / screen / advanced
         Description:
            The "yes" value turns on the following logic: when setup
            setting "hide_advanced_settings" is set to "Yes" then the
            current setup screen element is hidden; otherwise it is shown
            as usual.
         Possible values: yes | no
         Default value: no
   Addition generic screen specification:
      settings / setting / id
         Generic screen specification is, primarily, an ordered list of
         settings.
         A list of available settings is fixed in firmware, see all
         <setting id="..."> specifications in
         /firmware/config/menu_config.xml from standard Dune firmware for a
         complete list of available setting identifiers.
         Every setting have predefined visualization (as GUI control) and a
         predefined effect on Dune firmware behaviour.
         Also see above the "Example of generic setup screen".
      settings / settings / protected
         Description:
            The "yes" value enables menu protection for modifying this
            setup setting. See the description of "menu_protection_type" of
            the ro_config.properties for more details.
         Possible values: yes | no
         Default value: no
      settings / setting / advanced
         Description:
            The "yes" value turns on the following logic: when setup
            setting "hide_advanced_settings" is set to "Yes" then the
            current setup screen is hidden; otherwise it is shown as usual.
         Possible values: yes | no
         Default value: no
   Additional video setup screen specifications:
      Several customization parameters supported for video setup screen.
      See above the "Example of video setup screen" for example and syntax.
      The supported parameters are:
         show_auto_framerate
            Description:
               Whether to show "Auto framerate" combobox in video setup
               screen.
            Possible values: yes | no
            Default value: yes
         show_advanced_settings
            Description:
               Whether to show "Advanced settings" button in video setup
               screen.
            Possible values: yes | no
            Default value: yes
   Additional network setup screen specifications:
      Several customization parameters supported for network setup screen.
      See above the "Example of network setup screen" for example and syntax.
      The supported parameters are:
         show_wifi_ap
            Description:
               Whether to show Wi-Fi access point customization settings in
               network setup screen if Wi-Fi access point is supported in
               firmware.
            Possible values: yes | no
            Default value: yes
   Additional system information screen specifications:
      Several customization parameters supported for system information screen.
      See above the "Example of system information screen" for example and
      syntax.
      The supported parameters are:
         show_product_id
         show_firmware_version
         show_serial_number
         show_license
         show_ip
         show_mac
         show_time
         show_system_storage
            Description:
               Whether to show the corresponding text line in system
               information screen.
            Possible values: yes | no
            Default value: yes
      Firmware versions:
         System information screen parameters available in firmware
         versions 140402_b9+.

   Default state:
      See the content of menu_config.xml file and the behavior of the
      Native Dune UI in the standard (non-customized) firmware.
   How to test:
      Put this file into /config directory.
   Firmware versions:
      Available in firmware versions 130315_b6+.

/firmware/config/menu_order.txt
/config/menu_order.txt
/config/menu_order_orig.txt
   Description:
      The menu_order.txt file specifies the initial order of elements in
      some Dune menu folders:
         - all application-container sections (folder URLS: root://tv,
            root://applications, root://video, etc..);
         - "Sources" section (folder URL: root://sources);
         - root setup folder screen, the same as setup section (folder URL:
            root://setup);
         - setup screen with id "applications" (folder
            setup://applications).
      Also see the description of /firmware/config/menu_config.xml for more
      details about Dune menu sections and setup screens.
   File structure / syntax:
      File is prosessed in forward direction. Each nonempty line contains
      single order declaration. The order declaration contains 2..4 fields
      separated by spaces:
      <folder_url> <order_decl_type> [<add_field1> [<add_field2]]
      The folder URL must be one of the application-container section URLs
      or one of the supported setup screen URLs; currently the only setup
      screen URL setup://applications is supported.
      The order_decl_type can take one of the following values:
      root, setup, plugin, others.
   How it works:
      Each order declaration matches one folder element or, rarely, a group
      of folder elements. The main idea is that order of folder elements is
      the same as order of the matching order declarations in
      menu_config.xml file. If several order declarations match the folder
      element, then the first declaration is choosen. If particular
      declaration matches nothing, it is ignored silently.
   Order declaration types:
      root
         Description:
            Matches non-plugin elements of Dune menu sections.
         Possible values of add_field1:
            internal_storages (normally belongs to root://sources);
            network_items_begin (normally belongs to root://sources);
            external_storages (normally belongs to root://sources);
            network_items_end (normally belongs to root://sources);
         Possible values of add_field2: must be empty
      setup
         Description:
            Matches non-plugin elements of setup folder screens.
         Possible values of add_field1:
            All setup screen identifiers, extept the root one with
            id="setup". Also see the description of
            /firmware/config/menu_config.xml about setup screens.
         Possible values of add_field2: must be empty
      plugin
         Description:
            Matches the plugin entry points. The "add_field1" is the
            plugin name, the "add_field2" is the plugin entry point media
            URL. If "add_field2" is empty, then order declaration matches
            all entry points of plugin in the corresponding folder.
         Possible values of add_field1:
            All setup screen identifiers, extept the root one with
            id="setup". Also see the description of
            /firmware/config/menu_config.xml about setup screens.
         Possible values of add_field2: must be empty
      others
         Description:
            Matches all folder elements, except the ones matched by other
            order declarations for the particular folder URL.
         Possible values of add_field1: must be empty
         Possible values of add_field2: must be empty
   Menu order processing details:
      The effective menu order declaration list is constructed from
      /firmware/config/menu_order.txt and /config/menu_order.txt in the
      following way:
         - if /firmware/config/menu_order.txt file differs from
         /config/menu_order_orig.txt => the only file
         /config/menu_order.txt is processed.
         - otherwise the /firmware/config/menu_order.txt is processed first
         and then the /firmware/config/menu_order.txt is processed. After
         that, the /firmware/config/menu_order.txt is copied to
         /config/menu_order.txt.
      Finally, all missing "plugin" order declarations are added for all
      existing Dune plugins and the result is saved to
      /config/menu_order.txt; so this file is changed by firmware each time
      the list of Dune plugins is changed.
      NOTE: as a result, if the initial menu order
      /firmware/config/menu_order.txt is changed during firmware upgrade,
      then it is merged with the effective menu order stored in the
      /config/menu_order.txt.
   How to test:
      Put this file into /config directory.
   Default state:
      See the content of this file and the behavior of the Native Dune UI
      in the standard (non-customized) firmware.
   Firmware versions:
      Available in firmware versions 130315_b6+.

/firmware/config/main_plugin_name.txt
   Description:
      Contains the name of so called "main plugin". If your want to enable
      automatic startup of certain plugin on STB boot, you can configure
      auto-start parameters in the plugin manifest (see documentation on
      PHP plugins), and declare this plugin as "main plugin".
   Example content:
      somepluginname
   Default state:
      There is no main plugin.
   How to test:
      Put this file into /config directory.

/firmware/config/nav_fw_upgrade_dont_ask_confirmations
   Description:
      A flag file which disables all confirmation dialogs shown by the
      native UI when firmware upgrade is triggered manually by the user by
      launching a firmware file (DFF) or trigerred via Dune STB API.
   Example content:
      Does not matter (only file existence is checked).
   Default state:
      These confirmation dialogs are enabled.
   How to test:
      Put this file into /config directory.

/firmware/config/fw_online_upgrade_dont_ask_confirmations
   Description:
      A flag file which disables most (all except the very first one)
      confirmation dialogs shown by the native UI when online firmware
      upgrade is triggered by the built-in online firmware mechanism (when
      the user launches online firmware upgrade via "Setup / Misc /
      Firmware Upgrade" menu, or when the online firmware upgrade is
      triggered automatically). The very first confirmation dialog is shown
      not depending on this flag.
   Example content:
      Does not matter (only file existence is checked).
   Default state:
      These confirmation dialogs are enabled.
   How to test:
      Put this file into /config directory.

/firmware/config/fw_autocheck_dont_confirm_new_suitable_version
   Description:
      A flag file which disables the very first confirmation dialog shown
      by the native UI when online firmware upgrade is automatically
      triggered by the built-in online firmware mechanism. Typically should
      be used together with "fw_online_upgrade_dont_ask_confirmations" flag
      file to completely disable any confirmations when automatic online
      firmware upgrade happens.
   Example content:
      Does not matter (only file existence is checked).
   Default state:
      This confirmation dialog is enabled.
   How to test:
      Put this file into /config directory.
   Firmware versions:
      Available starting with firmware version 130719_2101_b6.

/firmware/config/fw_autocheck_force_on_resume
   Description:
      A flag file which forces online firmware upgrade auto-check to be
      performed each time when STB leaves standby mode, even if the
      auto-check was already performed recently. Normally (when this file
      does not exist), the auto-check is performed not more often than each
      24 hours.
   Example content:
      Does not matter (only file existence is checked).
   Default state:
      Auto-check is performed not more often than each 24 hours.
   How to test:
      Put this file into /config directory.
   Firmware versions:
      Available starting with firmware version 130719_2101_b6.

/firmware/config/media_player_config.properties
   Description:
      Allows to specify whether media-player functionality is enabled or
      not. In runtime it is possible to override the configuration from
      /firmware/config/media_player_config.properties file. For this
      purpose /tmp/run/media_player_config.properties file should be used.
      The files contain the following parameter:
      - media_player -- Specifies whether media-player functionality is
        completely enabled ("yes") or completely disabled ("no").
      See also "Conditional enabling of media-player functionality" section
      below.
   Example content:
      media_player = no
   Default state:
      Media-player functionality is completely enabled.
   How to test:
      Put this file to /tmp/run/media_player_config.properties
   Firmware versions:
      Available starting with firmware versions 130831_b8+.

/firmware/config/dsconfig.xml
   Description:
      Allows to customize the list of application sources for Dune Store.
      See more information here:
         http://files.dune-hd.com/sdk/doc/html/dune_store.html
         "Using custom Dune Store server in custom firmware"
   Default state:
      Standard application source is used.
   How to test:
      Put this file into /config directory.
   Firmware versions:
      Available starting with firmware versions 130716_b6+.

/firmware/config/prefer_dhcp_ntp_server.flag
   Description:
      When this flag file exists, it specifies that NTP server provided by
      DHCP server should be used even if NTP server is unset in STB
      settings (i.e. "time_server" property in "settings.properties"
      configuration file is set to the default value "").
   Default state:
      NTP server specified in STB settings takes precedence over NTP server
      provided by DHCP server.
   How to test:
      There is no way to test this via /config directory. See the general
      approach for testing changes in "tango" filesystem described in "How to
      test customizations" section.

/firmware/config/default_dhcp_time_zone
   Description:
      The content of this file specifies the time zone which should be used
      when the time zone is unset in STB settings (i.e. "time_zone"
      property in "settings.properties" configuration file is set to the
      default value "auto", which means "use setting from DHCP"), and DHCP
      server does not provide the time zone information. The format of
      "default_dhcp_time_zone" setting is a string in the same format as
      provided by DHCP server, e.g. "GMT-04:00" for GMT+4.
   Default state:
      If neither STB settings nor DHCP server specify the time zone, GMT+0
      time zone is used.
   How to test:
      There is no way to test this via /config directory. See the general
      approach for testing changes in "tango" filesystem described in "How to
      test customizations" section.

Custom HTML application

Custom HTML application is launched on STB boot instead of native Dune UI.

NOTE: This requires base firmware with Opera or Webkit web browser.

For more information, see here:
   http://files.dune-hd.com/sdk/doc/html/html_apps.html

Location in "tango" filesystem:
   /firmware/config/stb_home/index.html

Default state:
   By default, this file is absent in the base firmware (i.e. native Dune
   UI is started).

How to test:
   Put the files into the following directory:
      /config/stb_home/

Custom web browser configuration for HTML application

The web browser can be started with custom parameters instead of the
default ones.

For more information about web browser start parameters, see "Web browser
start parameters" section here:
   http://files.dune-hd.com/sdk/doc/html/html_apps.html

Location in "tango" filesystem:
   /firmware/config/web_browser_start_params

Default state:
   The file does not exist, and thus the default parameters are used.

How to test:
   Put the file into the following directory:
      /config

Custom SVG application

Custom SVG application is launched on STB boot instead of native Dune UI.

NOTE: This requires base firmware with Ekioh browser.

Location in "tango" filesystem:
   /firmware/stb_home/index.svg

Default state:
   By default, this file is absent in the base firmware (i.e. native Dune
   UI is started).

How to test:
   Put the files into the following directory:
      /config/stb_home/

Additional tools:
   See the description of "dune_service_install_stb_home.dsf" in "Tools for
   installing files into /config/stb_home" section here:
      http://files.dune-hd.com/sdk/doc/html/html_apps.html

Custom native GUI application

Custom native GUI application (implemented in C/C++ using DirectFB and
optionally Qt, and using Dune C STB API) is launched on STB boot instead of
native Dune UI.

NOTE: This requires Native GUI SDK base firmware.

The custom native GUI application should replace "shell" executable.

Location in "tango" filesystem:
   a) Direct replacement of "shell" executable (recommended):
      /firmware/bin/shell
   b) Indirect replacement (when exists, this file contains the path of the
   executable which should be used instead of "/firmware/bin/shell"):
      /firmware/config/stb_exec.url

Default state:
   By default, "/firmware/bin/shell" contains the standard version of
   "shell" executable (which launches native Dune UI), and
   "/firmware/config/stb_exec.url" file does not exist.

How to test:
   Use "/config/stb_exec.url" as described in the Native GUI SDK
   documentation.

Custom fonts for Opera web browser

You can add custom fonts to Opera web browser (when a firmware with Opera
web browser is used), by adding them into the Opera fonts folder.

Location in "tango" filesystem:
   /firmware_ext/opera/fonts

How to test:
   Put the fonts into the following directory:
      /config/fonts

Custom fonts for Webkit web browser

You can add custom fonts to Webkit web browser (when a firmware with Webkit
web browser is used), by adding them into the Webkit fonts folder.

Location in "tango" filesystem:
   /firmware_ext/qt47_2browser/lib/fonts

How to test:
   There is no way to test this via /config directory. See the general
   approach for testing changes in "tango" filesystem described in "How to
   test customizations" section.

Custom boot script

Custom boot script is executed during STB boot, and can do various things,
e.g. it can launch background processes, modify various configuration files
in RAM disk, etc.

Typical usages:
   - Load some Linux kernel modules.
   - Launch some daemon in background.
   - Modify files in /etc (e.g. put custom root password into /etc/shadow,
     put custom configuration for the built-in HTTP server into
     /etc/httpd.conf).
   - Modify files (e.g. add static content or CGI scripts) in the root
     folder (/tmp/www) of the built-in HTTP server.

Various related information:
   http://files.dune-hd.com/sdk/doc/html/dune_devel_info.html
   http://files.dune-hd.com/sdk/doc/html/dune_boot_process.html

Location in "tango" filesystem:
   /firmware/config/start.sh

NOTE: To ensure that this script does not block STB boot, all actions that
may potentially block for a while or hangup are recommended to do in
background.

Default state:
   By default, this file does not exist.

How to test:
   Put the custom boot script into "/config/boot/" directory.

Custom environment script

Custom environment script is intended for changing environment variables
accessible by "shell" process, including web and SVG browsers, or native
GUI application. The script is sourced once during STB boot if it exists.

Typical usages:
   - Modify environment of main UI process.

Location in "tango" filesystem:
   /firmware/config/custom_env.sh

NOTE: primary goal of this script is to modify environment of main UI
process. If you would like to perform various actions on STB boot it is
recommended to use /firmware/config/start.sh instead, see "Custom boot
script".

Default state:
   By default, this file does not exist.

How to test:
   Create the following file:
      /config/custom_env.sh

Key for SSH access

NOTE: Supported only for base firmware versions which include SSH server
(such as SDK firmware versions).

Location in "tango" filesystem:
   /firmware/config/authorized_keys

Default state:
   By default, in the SDK base firmware versions, this file contains the
   development public key (NOTE: the corresponding private key is
   documented in the SDK and thus is publically available).

How to test:
   Put the "authorized_keys" file into "/config" directory.

Custom server for online firmware upgrade

Custom firmware can implement online firmware upgrade in several ways:

1) If the custom firmware is based on the native Dune UI (e.g. custom
   application is implemented as a PHP plugin), it it possible to customize
   the HTTP URL of the firmware upgrade server used by the built-in online
   firmware upgrade mechanism.

   Location in "tango" filesystem:
      /firmware/config/fw_online_upgrade_url.txt

   This file should contain the HTTP URL prefix pointing to the firmware
   upgrade server.

   For the details, please see here:
      http://files.dune-hd.com/sdk/doc/html/dune_online_firmware_upgrade.html
      "Built-in online firmware upgrade mechanism"

   Default state:
      By default, the standard Dune HD firmware upgrade server is used.

   How to test:
      Put the "fw_online_upgrade_url.txt" into "/config" directory.

2) If the custom firmware does not use the native Dune UI (e.g. HTML or SVG
   middleware UI is used), it can use a simple automatic firmware upgrade
   (also know as "STB upgrade checker") mechanism. This mechanism can also
   be used with the standard middleware systems, which do not provide their
   own online firmware upgrade mechanism.

   Location in "tango" filesystem:
      /firmware/config/stb_upgrade_checker.properties

   For the details, please see here:
      http://files.dune-hd.com/sdk/doc/html/dune_online_firmware_upgrade.html
      "Automatic firmware upgrade (STB upgrade checker mechanism)"

   Default state:
      By default, STB upgrade checker mechanism is disabled.

   How to test:
      Put the "stb_upgrade_checker.properties" file into "/config"
      directory.

3) If the custom firmware does not use the native Dune UI and implements
   its own GUI application (e.g. in HTML, SVG, or C), and the simple
   STB upgrade checker mechanism is not suitable, the custom GUI
   application can implement checking for firmware upgrades on its own.

   To do it, the following should be implemented in the custom GUI
   application:
      - Check for availability of firmware upgrades (on STB startup or
        periodically) -- using any suitable protocol and algorithm. As the
        result, the application should determine if the firmware upgrade is
        desired, and determine the target firmware version and firmware
        image URL.
      - Possibly show a message to the user and/or get a confirmation from
        the user (depending on what behavior is required by the
        application).
      - Use Dune STB API operation to trigger the firmware upgrade
        procedure (passing the firmware image URL to it). Dune STB will
        download the firmware image and perform firmware upgrade on its own
        (native Dune GUI will be shown to indicate the firmware upgrade
        process).

Custom STB boot procedure

If the standard STB boot procedure is not desired for some reason, it can
be replaced by modifying/replacing the corresponding files in the "tango"
filesystem. See here for more information:
   http://files.dune-hd.com/sdk/doc/html/dune_boot_process.html

Custom network initialization script

There is a special possibility allowing to override the standard network
initialization script with a custom one, in order to implement custom
network initialization logic.

Location in "tango" filesystem:
   /firmware/config/scripts/init_network.sh

If this script exists, it is used instead of the standard network
initialization logic located in "/firmware/scripts/init_network.sh".

NOTE: creation of a custom network initialization script may not be easy
and requires detailed understanding of the standard network initialization
logic located in the following files:
   /firmware/scripts/init_network.sh
   /firmware/scripts/udhcpc_callback.sh

Default state:
   The custom script file does not exist, and the initialization logic from
   the standard script is used.

How to test:
   Put the "init_network.sh" script into "/config/scripts" directory.

Product ID

Product ID is a string which identifies a particular model of Dune HD STB.
Different Dune HD models have different product IDs. Example: "hdtv_101" is
a product ID for for Dune HD TV-101. Product ID is shown in the native Dune
HD menu in Setup / Information.

Each firmware is always built for a particular product ID, and can not be
installed (excepting special cases) on the STB where the firmware for
another product ID is currently installed.

Customer ID

Custom firmware images typically have their own custom product IDs.

Customer ID is a string which is added to the base product ID (as prefix or
suffix) in order to distinguish custom and standard firmware versions, and
optionally to protect from "cross-upgrading" between standard and custom
firmware versions.

Example:
   Base product ID: hdtv_101
   Customer ID: besttv
   Resulting custom product ID: besttv__hdtv_101

Customer ID can be an arbitrary string (minimum length 3 characters,
maximum length 32 characters) consisting of lowercase alphanumeric
characters.

You can choose whatever customer ID you want and confirm with your Dune HD
contacts that this customer ID is valid and unique.

The same customer can use different customer IDs for different projects.

Cross-upgrade limitations

Cross-upgrade limitations determine if end users are allowed to install
custom firmware over standard firmware and vice versa.

NOTE: even if end users are prohibited to do cross-upgrades, the customer
itself can have a possibility to cross-upgrade the boxes in any direction
(this may be required e.g. for the initial preparation of STBs and for
service needs).

There are the following kinds of cross-upgrade limitations for end users:
   - (a) ("not_allowed") Cross-upgrade is not allowed at all.
      - Allowed cross-upgrades:
         - standard -> custom: no.
         - custom -> standard: no.
   - (b) ("any") Cross-upgrade is allowed in any direction.
      - Allowed cross-upgrades:
         - standard -> custom: yes.
         - custom -> standard: yes.
   - (c) ("to_custom") Cross-upgrade is allowed from standard-fw to
     custom-fw only.
      - Allowed cross-upgrades:
         - standard -> custom: yes.
         - custom -> standard: no.

Depending on the kind of cross-upgrade limitations, the custom product ID
is constructed from the base product ID and customer ID in one of the
following ways:
   - For (a) ("not_allowed"): {customer ID}__{base product ID}.
   - For (b) ("any") and (c) ("to_custom"): {base product ID}_{customer
     ID}.

NOTE: The use of (c) ("to_custom") is typically not recommended.

NOTE: For most projects, (a) ("not_allowed") is the most appropriate
option.

Secure firmware

In some cases, it may be desired to protect the STB from the access inside
the STB by advanced (or malicious) users. For example, it may be required
if the digital rights owner / DRM vendor requires this.

Even in the standard firmware, there are no such direct ways (e.g. telnet
access to the STB is disabled by default), but advanced/malicious users can
potentially find a way to get the access inside the STB, e.g. by
installing/launching a special plugin or DSF file on the STB.

To protect the STB from this, the custom firmware should be made secure,
which may include some or all of the following:

1) Use cross-upgrade limitation kind "not_allowed", to ensure that end
   users will not be able to install a standard retail firmware (or some
   other custom firmware) on top of your custom firmware.

2) Disable launching arbitrary DSF service files:
   - Put "service_file_enabled = signed" setting into
     /firmware/config/ro_config.properties file.

3) Disable installing and launching arbitrary 3-party plugins:
   - Put "external_plugins_enabled = signed" setting into
     /firmware/config/ro_config.properties file.

4) If the custom firmware includes telnet service (NOTE: generally not
   recommended, enabling SSH access is recommended instead), or if a
   particular STB model has UART connector/pins available and it is desired
   to protect this UART port, set a custom root password:
   - Include a custom boot script into the firmware
     (/firmware/config/start.sh), and put the following code into this
     script in order to install a custom root password into /etc/shadow
     file:
      - sed -i 's;^root::;root:@@HASH@@;' /etc/shadow
   - Here, @@HASH@@ string should be replaced with an actual hash, which
     can be obtained using the following commands performed inside the STB:
      - passwd root
      - grep "^root:" /etc/shadow | awk -F: '{print $2}'

5) If the custom firmware is built for Dune HD TV-101 model (discontinued),
   request and use a special "secure" base firmware, which ensures that
   only specially signed firmware images can be installed and that
   cross-upgrade limitations can not be bypassed. For all newer Dune HD STB
   models, this is not needed (all firmware images are signed this way by
   default).

Conditional enabling of media-player functionality

In some cases, it may be desired to enable media-player functionality of
Dune HD STB conditionally, depending on some factors (e.g. depending on the
whether the user account in the billing of the operator is not blocked). In
particular, this may be useful when an operator sells the STBs with a
discount, or provides STBs to end users for free (and requires end users to
pay for the subscription to the IPTV/VOD service only).

If the custom firmware is configured to automatically boot some custom HTML
or SVG application (via /firmware/config/stb_home mechanism), it is enough
to ensure the following:
   - The application must not allow the user to launch the native Dune UI
     (except maybe Setup or Network Setup UI screens, which can be launched
     separately from the the rest of the native Dune UI) unless the
     application checks that this should be allowed.
   - Put "native_ui_by_hotkey_in_standby_enabled = no" setting into
     /firmware/config/ro_config.properties file.

If the custom firmware is based on the native Dune UI (or if it is desired
to have the native Dune UI freely accessible w/o any limitations), another
approach can be used -- disabling the media-player functionality by
default, and enabling it only after the custom firmware / custom
application ensures that the user should be permitted to do it. Here,
media-player functionality means the possibility to launch any media
playback via native Dune UI or launch any application via native Dune UI.
To use this approach:
   - Put "media_player = no" into
     /firmware/config/media_player_config.properties
   - In the custom firmware / custom application check if the user is
     permitted to use media-player functionality.
   - If the user is not permitted, do nothing. As a result, media-player
     functionality will be disabled.
   - If the user is permitted, put "media_player = yes" into
     /tmp/run/media_player_config.properties. As a result, media-player
     functionality will be enabled.

Whenever conditional enabling of media-player functionality is used, it is
typically needed also to make the firmware "secure" in order to ensure
that advanced/malicious users will not be able to get inside the STB and
find a way to bypass this restriction (see "Secure firmware" section for
more information).

Using Dune Firmware Build service

Dune HD partners/customers can be allowed to create custom firmware images
on their own (w/o manual processing on the Dune HD side), using Dune HD
Firmware Build service ("DFB").

A special account is required to use DFB service.

See here for more information about DFB service:
   http://files.dune-hd.com/sdk/doc/html/dfb.html

Sending firmware customization request to Dune HD

Send the request to your Dune HD contacts by e-mail.

Include the following information into the request:
   - Dune HD model (or list of models).
   - Base firmware (for each model).
   - Customer ID.
   - Cross-upgrade limitations.
   - Boot logo picture.
   - Changes in one of the following forms:
      - (a) Custom "tango" filesystem image (for each model).
      - (b) Detailed list of all needed changes (relative to the base
        firmware) and all the corresponding files (plugins, skins,
        index.html, etc).

If you provide the specification of the required changes as custom "tango"
filesystem image, please fully test this custom "tango" filesystem image in
advance on your side (ensure that after writing this custom image into the
flash memory of the STB, it works fully correctly in all required use
cases).

If you provide the description of the required changes in other forms, in
many cases, one or several rounds of requirements
clarification/negotiations (and sometimes intermediate firmware releases)
may be required to order to create a clear specification and create the
custom firmware according to it.

Depending on a particular requirements and depending on how much
preparation work is to be done on Dune HD side, the overall firmware
customization process may require a considerable amount of R&D work from
Dune HD side.

In some cases, the requested changes can not be implemented using the
available firmware customization options on top of an existing base
firmware, and changes in the base firmware may be required. Implementing
changes in the base firmware would often require a significant amount of
R&D work from Dune HD side.

To minimize the dependency on the available Dune HD's R&D resources, it is
recommended to do as much preparation work as possible on the customer's
side, and, whenever possible, fit into already available firmware
customization options.