368 lines
14 KiB
ReStructuredText
368 lines
14 KiB
ReStructuredText
:orphan:
|
|
|
|
.. _intel_adsp_generic:
|
|
|
|
Intel ADSP cAVS and ACE
|
|
#######################
|
|
|
|
Intel's Audio and Digital Signal Processing (ADSP) hardware offerings
|
|
include the Converged Audio Voice Speech (cAVS) series and its successor,
|
|
the Audio and Context Engine (ACE). These Xtensa-based ADSPs can be integrated
|
|
into a variety of Intel products. The below table lists (some of) the Intel
|
|
microprocessor(s) that each version of the Intel ADSP is compatible with.
|
|
|
|
+----------+-----------------------------+
|
|
| ADSP | Microprocessor |
|
|
+==========+=============================+
|
|
| cAVS 1.5 | Apollo Lake |
|
|
+----------+-----------------------------+
|
|
| cAVS 1.8 | Whiskey Lake |
|
|
+----------+-----------------------------+
|
|
| cAVS 2.5 | Tiger Lake |
|
|
+----------+-----------------------------+
|
|
| ACE 1.5 | Meteor Lake |
|
|
+----------+-----------------------------+
|
|
|
|
Intel open-sources firmware for its ADSP hardware under the Sound Open Firmware
|
|
(`SOF`_) project. SOF can be built with either Zephyr or Cadence's proprietary
|
|
Xtensa OS (XTOS) and run on a variety of Intel and non-Intel platforms.
|
|
|
|
The Intel `UP Xtreme`_ product line has the publicly
|
|
available reference boards for Zephyr's Intel ADSP support. This guide uses the
|
|
`UP Xtreme i11-0001 series`_ (:ref:`intel_adsp_cavs25`) board as an example.
|
|
However, the instructions are generic and will work on other boards unless
|
|
otherwise stated. You will be referred to the documentation for your specific
|
|
board in these cases.
|
|
|
|
System requirements
|
|
*******************
|
|
|
|
Setting Up Target Board
|
|
-----------------------
|
|
|
|
You can only flash Zephyr to the ADSP by using Zephyr's Python tool in a Linux
|
|
host running on the board's main CPU. It is possible (and recommended) for users
|
|
to build the binary locally on their development machine and flash remotely,
|
|
but the board itself must be capable of running the Python script that receives
|
|
the binary sent over the network by West and flashes it. You should install a
|
|
version of Linux that supports or comes with the current version of Python that
|
|
Zephyr requires. Consider using Ubuntu 20.04, which comes with Python 3.8
|
|
installed.
|
|
|
|
Note that if you plan to use SOF on your board, you will need to build and
|
|
install the modified Linux SOF kernel instead of the default kernel. It is
|
|
recommended you follow the `SOF instructions`_ to build and run SOF on Zephyr.
|
|
|
|
UP Xtreme users can refer to the `UP Community wiki`_ for help installing a
|
|
Linux operating system on their board.
|
|
|
|
Signing Tool
|
|
------------
|
|
|
|
As firmware binary signing is mandatory on Intel products from Skylake onwards,
|
|
you will also need to set up the SOF rimage signing tool and key.
|
|
|
|
.. code-block:: shell
|
|
|
|
cd zephyrproject/modules/audio/sof/
|
|
git clone https://github.com/thesofproject/rimage --recurse-submodules
|
|
cd rimage
|
|
|
|
Follow the instructions in the rimage :file:`README.md` to build the tool on
|
|
your system. You can either copy the executable to a directory in your PATH or
|
|
use ``west config rimage.path /path/to/rimage-build/rimage``; see more details
|
|
in the output of ``west sign -h``. Running directly from the build directory
|
|
makes you less likely to use an obsolete rimage version by mistake.
|
|
|
|
Until https://github.com/zephyrproject-rtos/zephyr/issues/58212 gets
|
|
implemented, you must manually and regularly update and rebuild rimage.
|
|
|
|
The SOF project does not require this manual step because its west manifest
|
|
automatically downloads and builds a specific rimage version validated with
|
|
matching SOF sources. An indirect Zephyr -> SOF -> rimage dependency chain is
|
|
unfortunately not appropriate because unlike rimage, SOF is *not* required to
|
|
run Zephyr on cAVS/ACE hardware.
|
|
|
|
Until https://github.com/thesofproject/sof/issues/7270 is implemented,
|
|
platform-specific configuration files are also located in the rimage
|
|
repository, more specifically in the ``rimage/config/`` subdirectory; this is
|
|
another reason to update rimage regularly. If you cloned rimage in a location
|
|
different from above (not recommended) then you must also run ``west config
|
|
build.cmake-args -- -DRIMAGE_CONFIG_PATH=/path/to/source/rimage/config``.
|
|
|
|
|
|
Xtensa Toolchain (Optional)
|
|
---------------------------
|
|
|
|
The Zephyr SDK provides GCC-based toolchains necessary to build Zephyr for
|
|
the cAVS and ACE boards. However, users seeking greater levels of optimization
|
|
may desire to build with the proprietary Xtensa toolchain distributed by
|
|
`Cadence`_ instead. The following instructions assume you have purchased and
|
|
installed the toolchain(s) and core(s) for your board following their
|
|
instructions.
|
|
|
|
First, make sure to set the ``$HOME/.flexlmrc`` file or
|
|
``XTENSAD_LICENSE_FILE`` variable as instructed by Cadence.
|
|
Next, set the following environment variables:
|
|
|
|
.. code-block:: shell
|
|
|
|
export XTENSA_TOOLCHAIN_PATH=$HOME/xtensa/XtDevTools/install/tools
|
|
export XTENSA_BUILDS_DIR=$XTENSA_TOOLCHAIN_PATH/../builds
|
|
export ZEPHYR_TOOLCHAIN_VARIANT=xcc
|
|
export TOOLCHAIN_VER=RG-2017.8-linux
|
|
export XTENSA_CORE=cavs2x_LX6HiFi3_2017_8
|
|
|
|
The bottom three variables are specific to each version of cAVS / ACE; refer to
|
|
your board's documentation for their values.
|
|
|
|
Programming and Debugging
|
|
*************************
|
|
|
|
Building
|
|
--------
|
|
|
|
Build as usual.
|
|
|
|
.. zephyr-app-commands::
|
|
:zephyr-app: samples/hello_world
|
|
:board: intel_adsp_cavs25
|
|
:goals: build
|
|
|
|
Signing
|
|
-------
|
|
|
|
``west build`` tries to sign the binary at the end of the build. If you need
|
|
to sign the binary yourself, you can invoke ``west sign`` directly. Read the
|
|
``west`` logs to find the ``west sign`` invocation; you can copy and modify
|
|
the command logged for your own purposes. Run ``west sign -h`` for more
|
|
details.
|
|
|
|
The build tries to provide as many default rimage parameters are possible. If
|
|
needed, there are several ways to override them depending on your specific
|
|
situation and use case. They're often not mutually exclusive but to avoid
|
|
undocumented rimage precedence rules it's best to use only one way at a time.
|
|
|
|
- For local, interactive use prefer ``rimage.extra-args`` in west config, see
|
|
``west sign -h``. The WEST_CONFIG_LOCAL environment variable can point at a
|
|
different west configuration file if needed.
|
|
|
|
- You can add or overwrite a ``$platform.toml`` file(s) in your
|
|
``rimage/config/`` directory
|
|
|
|
- For board-specific needs you can define WEST_SIGN_OPTS in
|
|
``boards/my/board/board.cmake``, see example in
|
|
``soc/xtensa/intel_adsp/common/CMakeLists.txt``
|
|
|
|
For backwards compatibility reasons, you can also pass rimage parameters like
|
|
the path to the tool binary as arguments to
|
|
``west flash`` if the flash target exists for your board. To see a list
|
|
of all arguments to the Intel ADSP runner, run the following after you have
|
|
built the binary. There are multiple arguments related to signing, including a
|
|
key argument.
|
|
|
|
.. code-block:: console
|
|
|
|
west flash --context
|
|
|
|
Remote Flashing to cAVS-based ADSP
|
|
----------------------------------
|
|
|
|
As mentioned previously, the recommended way to run and monitor the output of
|
|
Zephyr on cAVS boards is remotely. The Linux host on the main CPU may freeze up
|
|
and need to be restarted if a flash or runtime error occurs on the ADSP. From
|
|
this point onward, we will refer to the board as the "remote host" and your
|
|
development machine as the "local host".
|
|
|
|
Copy the below scripts to the cAVS board.
|
|
:zephyr_file:`soc/xtensa/intel_adsp/tools/remote-fw-service.py` will receive
|
|
the binary sent over the network by West and invoke
|
|
:zephyr_file:`soc/xtensa/intel_adsp/tools/cavstool.py` (referred to as the
|
|
"cAVS tool"), which performs the flash and captures the log. Start
|
|
:file:`remote-fw-service.py`.
|
|
|
|
.. code-block:: console
|
|
|
|
scp -r $ZEPHYR_BASE/soc/xtensa/intel_adsp/tools/cavstool.py username@remotehostname
|
|
scp -r $ZEPHYR_BASE/soc/xtensa/intel_adsp/tools/remote-fw-service.py username@remotehostname
|
|
ssh username@remotehostname
|
|
sudo ./remote-fw-service.py
|
|
|
|
:file:`remote-fw-service.py` uses ports 9999 and 10000 on the remote host to
|
|
communicate. It forwards logs collected by :file:`cavstool.py` on port 9999
|
|
(referred to as its "log port") and services requests on port 10000
|
|
(its "requests port"). When you run West or Twister on your local host,
|
|
it sends requests using the :zephyr_file:`soc/xtensa/intel_adsp/tools/cavstool_client.py`
|
|
script (referred to as "cAVS tool client"). It also uses ports 9999 and 10000 on
|
|
your local host, so be sure those ports are free.
|
|
|
|
Flashing with West is simple.
|
|
|
|
.. code-block:: console
|
|
|
|
west flash --remote-host remotehostname --pty remotehostname
|
|
|
|
Running tests with Twister is slightly more complicated.
|
|
|
|
.. code-block:: console
|
|
|
|
twister -p intel_adsp_cavs25 --device-testing --device-serial-pty="$ZEPHYR_BASE/soc/xtensa/intel_adsp/tools/cavstool_client.py,-s,remotehostname,-l" --west-flash="--remote-host=remotehostname" -T samples/hello_world
|
|
|
|
If your network is set up such that the TCP connection from
|
|
:file:`cavstool_client.py` to :file:`remote-fw-service.py` is forwarded through
|
|
an intermediate host, you may need to tell :file:`cavstool_client.py` to connect
|
|
to different ports as well as a different hostname. You can do this by appending
|
|
the port numbers to the intermediate host name.
|
|
|
|
.. code-block:: console
|
|
|
|
west flash --remote-host intermediatehost:reqport --pty remotehostname:logport
|
|
twister -p intel_adsp_cavs25 --device-testing --device-serial-pty="$ZEPHYR_BASE/soc/xtensa/intel_adsp/tools/cavstool_client.py,-s,remotehostname:logport,-l" --west-flash="--remote-host=remotehostname:reqport" -T samples/hello_world
|
|
|
|
You can also save this information to a hardware map file and pass that to
|
|
Twister.
|
|
|
|
.. code-block:: console
|
|
|
|
twister -p intel_adsp_cavs25 --hardware-map cavs.map --device-testing -T samples/hello_world
|
|
|
|
Here's a sample ``cavs.map``:
|
|
|
|
.. code-block:: console
|
|
|
|
- connected: true
|
|
id: None
|
|
platform: intel_adsp_cavs25
|
|
product: None
|
|
runner: intel_adsp
|
|
serial_pty: "/home/zephyrus/zephyrproject/zephyr/soc/xtensa/intel_adsp/tools/cavstool_client.py,-s,remotehostname:logport,-l"
|
|
runner_params:
|
|
- --remote-host=remotehostname:reqport
|
|
|
|
Any of the arguments you would pass to Twister or West, you can pass with the
|
|
hardware map. As mentioned previously, you can see the Intel ADSP runner
|
|
arguments by passing the ``--context`` flag while flashing with West.
|
|
|
|
Refer to :ref:`twister_script` for more information on hardware maps.
|
|
|
|
Local Flashing to cAVS-based ADSP
|
|
---------------------------------
|
|
|
|
You can also directly flash the signed binary with the cAVS tool on the board.
|
|
This may be useful for debugging.
|
|
|
|
.. code-block:: console
|
|
|
|
sudo ./cavstool.py zephyr.ri
|
|
|
|
You should see the following at the end of the log if you are successful:
|
|
|
|
.. code-block:: console
|
|
|
|
***** Booting Zephyr OS vx.x.x-xxx-gxxxxxxxxxxxx *****
|
|
Hello World! intel_adsp_cavs25
|
|
|
|
Flashing to ACE-based ADSP
|
|
--------------------------
|
|
|
|
Flashing is not yet supported for platforms with ACE-based ADSP, as these
|
|
platforms are not yet publicly available.
|
|
|
|
Debugging
|
|
---------
|
|
|
|
As Zephyr doesn't (yet) support GDB for the Intel ADSP platforms, users are
|
|
recommended to take advantage of Zephyr's built-in :ref:`coredump` and
|
|
:ref:`logging_api` features.
|
|
|
|
Troubleshooting
|
|
***************
|
|
|
|
You can pass verbose flags directly to the Intel ADSP scripts:
|
|
|
|
.. code-block:: console
|
|
|
|
sudo ./remote-fw-service.py -v
|
|
sudo ./cavstool.py zephyr.ri -v
|
|
|
|
To see a list of their arguments:
|
|
|
|
.. code-block:: console
|
|
|
|
sudo ./remote-fw-service.py --help
|
|
sudo ./cavstool.py --help
|
|
|
|
If flashing fails at ``west sign`` with errors related to unparsed keys, try
|
|
reinstalling the latest version of the signing tool. For example:
|
|
|
|
.. code-block:: shell
|
|
|
|
error: 1 unparsed keys left in 'adsp'
|
|
error: 1 unparsed arrays left in 'adsp'
|
|
|
|
If you get an "Address already in use" error when starting
|
|
:file:`remote-fw-service.py` on the board, you may have another instance of the
|
|
script running. Kill it.
|
|
|
|
.. code-block:: console
|
|
|
|
$ sudo netstat -peanut | grep 9999
|
|
tcp 0 0 0.0.0.0:9999 0.0.0.0:* LISTEN 0 289788 14795/python3
|
|
$ sudo kill 14795
|
|
|
|
If West or Twister successfully sign and establish TCP connections
|
|
with :file:`remote-fw-service.py` but hang with no output afterwards,
|
|
there are two possibilities: either :file:`remote-fw-service.py` failed
|
|
to communicate, or :file:`cavstool.py` failed to flash. Log into
|
|
the remote host and check the output of :file:`remote-fw-service.py`.
|
|
|
|
If a message about "incorrect communication" appears, you mixed up the port
|
|
numbers for logging and requests in your command or hardware map. Switch them
|
|
and try again.
|
|
|
|
.. code-block:: shell
|
|
|
|
ERROR:remote-fw:incorrect monitor communication!
|
|
|
|
If a "load failed" message appears, that means the flash failed. Examine the
|
|
log of ``west flash`` and carefully check that the arguments to ``west sign``
|
|
are correct.
|
|
|
|
.. code-block:: console
|
|
|
|
WARNING:cavs-fw:Load failed? FW_STATUS = 0x81000012
|
|
INFO:cavs-fw:cAVS firmware load complete
|
|
--
|
|
|
|
Sometimes a flash failure or network miscommunication corrupts the state of
|
|
the ADSP or :file:`remote-fw-service.py`. If you are unable to identify a
|
|
cause of repeated failures, try restarting the scripts and / or power cycling
|
|
your board to reset the state.
|
|
|
|
Users - particularly, users of the Xtensa toolchain - should also consider
|
|
clearing their Zephyr cache, as caching issues can occur from time to time.
|
|
Delete the cache as well as any applicable build directories and start from
|
|
scratch. You can try using the "pristine" option of West first, if you like.
|
|
|
|
.. code-block:: console
|
|
|
|
rm -rf build twister-out*
|
|
rm -rf ~/.ccache ~/.cache/zephyr
|
|
|
|
Xtensa toolchain users can get more detailed logs from the license server by
|
|
exporting ``FLEXLM_DIAGNOSTICS=3``.
|
|
|
|
.. _SOF: https://thesofproject.github.io/latest/index.html
|
|
|
|
.. _Chromebooks: https://www.hp.com/us-en/shop/pdp/hp-chromebook-x360-14c-cc0047nr
|
|
|
|
.. _UP Xtreme: https://up-board.org/up-xtreme/
|
|
|
|
.. _UP Xtreme i11-0001 series: https://up-shop.org/up-xtreme-i11-boards-0001-series.html
|
|
|
|
.. _SOF instructions: https://thesofproject.github.io/latest/getting_started/build-guide/build-with-zephyr.html
|
|
|
|
.. _UP Community wiki: https://github.com/up-board/up-community/wiki/Ubuntu
|
|
|
|
.. _Cadence: https://www.cadence.com/en_US/home/tools/ip/tensilica-ip.html
|