zephyr/boards/xtensa/intel_adsp_cavs25/doc/intel_adsp_generic.rst

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