boards/mtk_adsp: Add a doc page
Simple docs for this board family. Not a lot of complexity currently. Signed-off-by: Andy Ross <andyross@google.com>
This commit is contained in:
parent
5364783ba1
commit
2b8d542815
1 changed files with 166 additions and 0 deletions
166
boards/mediatek/index.rst
Normal file
166
boards/mediatek/index.rst
Normal file
|
@ -0,0 +1,166 @@
|
|||
.. _boards-mtk_adsp:
|
||||
|
||||
Mediatek Audio DSPs
|
||||
###################
|
||||
|
||||
Zephyr can be built and run on the Audio DSPs included in various
|
||||
members of the Mediatek MT8xxx series of ARM SOCs used in Chromebooks
|
||||
from various manufacturers.
|
||||
|
||||
Two of these DSPs are in the market already, implemented via the
|
||||
MT8195 ("Kompanio 1380") and MT8186 ("Kompanio 520") SOCs.
|
||||
Development has been done on and validation performed on at least
|
||||
these devices, though more exist:
|
||||
|
||||
====== ============= =================================== =================
|
||||
SOC Product Name Example Device ChromeOS Codename
|
||||
====== ============= =================================== =================
|
||||
MT8195 Kompanio 1380 HP Chromebook x360 13b dojo
|
||||
MT8186 Kompanio 520 Lenovo 300e Yoga Chromebook Gen 4 steelix
|
||||
====== ============= =================================== =================
|
||||
|
||||
Hardware
|
||||
********
|
||||
|
||||
These devices are Xtensa DSP cores, very similar to the Intel ADSP
|
||||
series in concept (with the notable difference that these are all
|
||||
single-core devices, no parallel SMP is available, but at the same
|
||||
time there are fewer worries about the incoherent cache).
|
||||
|
||||
Their memory space is split between dedicated, fast SRAM and ~16MB of
|
||||
much slower system DRAM. Zephyr currently loads and links into the
|
||||
DRAM area, a convention it inherits from SOF (these devices have
|
||||
comparatively large caches which are used for all accesses, unlike
|
||||
with intel_adsp). SRAM is used for interrupt vectors and stacks,
|
||||
currently.
|
||||
|
||||
There is comparatively little on-device hardware. The architecture is
|
||||
that interaction with the off-chip audio hardware (e.g. I2S codecs,
|
||||
DMIC inputs, etc...) is managed by the host kernel. The DSP receives
|
||||
its data via a single array of custom DMA controllers.
|
||||
|
||||
Beyond that the Zephyr-visible hardware is limited to a bounty of
|
||||
timer devices (of which Zephyr uses two), and a "mailbox"
|
||||
bidirectional interrupt source it uses to communicate with the host
|
||||
kernel.
|
||||
|
||||
Programming and Debugging
|
||||
*************************
|
||||
|
||||
These devices work entirely in RAM, so there is no "flash" process as
|
||||
such. Their memory state is initialized by the host Linux
|
||||
environment. This process works under the control of a
|
||||
``mtk_adsp_load.py`` python script, which has no dependencies outside
|
||||
the standard library and can be run (as root, of course) on any
|
||||
reasonably compatible Linux environment with a Python 3.8 or later
|
||||
interpreter. A chromebook in development mode with the dev packages
|
||||
installed works great. See the ChromiumOS developer library for more
|
||||
detail:
|
||||
|
||||
* `Developer mode <https://www.chromium.org/chromium-os/developer-library/guides/device/developer-mode/>`__
|
||||
* `Dev-Install: Installing Developer and Test packages onto a Chrome OS device <https://www.chromium.org/chromium-os/developer-library/guides/device/install-software-on-base-images/>`__
|
||||
|
||||
Once you have the device set up, the process is as simple as copying
|
||||
the ``zephyr.img`` file from the build directory to the device
|
||||
(typically via ssh) and running it with the script. For example for
|
||||
my mt8186 device named "steelix":
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
user@dev_host:~$ west build -b mt8186//adsp samples/hello_world
|
||||
...
|
||||
... # build output
|
||||
...
|
||||
user@dev_host:~$ scp build/zephyr/zephyr.img root@steelix:
|
||||
user@dev_host:~$ scp soc/mediatek/mt8xxx/mtk_adsp_load.py root@steelix:
|
||||
user@dev_host:~$ ssh steelix
|
||||
|
||||
root@steelix:~ # ./mtk_adsp_load.py load zephyr.img
|
||||
*** Booting Zephyr OS build v3.6.0-5820-gd2a89b3c089e ***
|
||||
Hello World! mt8186_adsp/mt8186_adsp
|
||||
|
||||
Debugging
|
||||
=========
|
||||
|
||||
Given the limited I/O facilities, debugging support remains limited on
|
||||
these platforms. Users with access to hardware-level debug and trace
|
||||
tools (e.g. from Cadence) will be able to use them as-is. Zephyr
|
||||
debugging itself is limited to printk/logging techniques at the
|
||||
moment. In theory a bidirectional console like winstream can be used
|
||||
with gdb_stub, which has support on Xtensa and via the SDK debuggers,
|
||||
but this is still unintegrated.
|
||||
|
||||
Toolchains
|
||||
**********
|
||||
|
||||
The MT8195 toolchain is already part of the Zephyr SDK, so builds for
|
||||
the ``mt8195//adsp`` board should work out of the box simply following
|
||||
the generic Zephyr build instructions in the Getting Started guide.
|
||||
|
||||
The MT8186 toolchain is not, and given the proliferation of Xtensa
|
||||
toolchains in the SDK may not be. The overlay files for the device
|
||||
are maintained by the SOF project, however, and building a toolchain
|
||||
yourself using crosstools-ng is not difficult or time-consuming. This
|
||||
script should work for most users:
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
#!/bin/sh
|
||||
|
||||
TC=mtk_mt818x_adsp
|
||||
|
||||
# Grab source (these are small)
|
||||
git clone https://github.com/crosstool-ng/crosstool-ng
|
||||
git clone https://github.com/thesofproject/xtensa-overlay
|
||||
|
||||
# Build ct-ng itself
|
||||
cd crosstool-ng
|
||||
./bootstrap
|
||||
./configure --enable-local
|
||||
make -j$(nproc)
|
||||
|
||||
mkdir overlays
|
||||
(cd overlays; ln -s ../../xtensa-overlay/xtensa_mt8186.tar.gz xtensa_${TC}.tar.gz)
|
||||
|
||||
# Construct a .config file
|
||||
cat >.config <<EOF
|
||||
CT_CONFIG_VERSION="3"
|
||||
CT_EXPERIMENTAL=y
|
||||
CT_OVERLAY_LOCATION="overlays"
|
||||
CT_OVERLAY_NAME="${TC}"
|
||||
CT_ARCH_XTENSA=y
|
||||
CT_XTENSA_CUSTOM=y
|
||||
CT_TARGET_VENDOR="${TC}_zephyr"
|
||||
CT_TARGET_CFLAGS="-ftls-model=local-exec"
|
||||
CT_CC_GCC_CONFIG_TLS=n
|
||||
CT_GDB_CROSS_EXTRA_CONFIG_ARRAY="--enable-xtensa-use-target-regnum --disable-xtensa-remote-g-packet"
|
||||
EOF
|
||||
|
||||
# Build
|
||||
./ct-ng olddefconfig
|
||||
./ct-ng build.$(nproc)
|
||||
|
||||
After this completes, you will find your toolchain in ``~/x-tools``
|
||||
and can use it to build by setting it as your Zephyr cross compiler:
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
export CROSS_COMPILE=$HOME/x-tools/xtensa-mtk_mt818x_adsp_zephyr-elf/bin/xtensa-mtk_mt818x_adsp_zephyr-elf-
|
||||
export ZEPHYR_TOOLCHAIN_VARIANT=cross-compile
|
||||
|
||||
Closed-source Tools
|
||||
===================
|
||||
|
||||
Zephyr can also be built by the proprietary Cadence xcc and xt-clang
|
||||
toolchains. Support for those tools is beyond the scope of this
|
||||
document, but it works similarly, by specifying your toolchain and
|
||||
core identities and paths via the environment, for example:
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
export XTENSA_TOOLS_ROOT=/path/to/XtDevTools
|
||||
export XTENSA_CORE=hifi5_7stg_I64D128
|
||||
export TOOLCHAIN_VER=RI-2021.6-linux
|
||||
export ZEPHYR_TOOLCHAIN_VARIANT=xt-clang
|
||||
export XTENSA_TOOLCHAIN_PATH=$XTENSA_TOOLS_ROOT/install/tools
|
||||
west build -b mt8186_adsp samples/hello_world
|
Loading…
Add table
Add a link
Reference in a new issue