mirror of
https://github.com/apache/nuttx.git
synced 2026-08-01 20:28:58 +00:00
arch/arm/ameba: add CMake build support for RTL8721Dx and RTL8720F
Both Ameba WHC boards (pke8721daf, rtl8720f_evb) previously built only via the
make build; the board CMakeLists fell back to a FATAL_ERROR. Wire up the full
vendor-SDK machinery for CMake so `cmake --build` produces the same flashable
nuttx.bin as make, with no change to any shared/arch-common file:
- tools/ameba/env.sh: source it once before cmake. It resolves/auto-fetches
the ameba-rtos SDK + its pinned asdk toolchain (reusing the same helper
scripts the make build uses) and puts the toolchain on PATH, so cmake's
normal compiler probe finds it -- exactly like every other NuttX board's
toolchain. No per-chip hook is added to the shared arch Toolchain.cmake.
- common/ameba/cmake/ameba_sdk.cmake: resolve AMEBA_SDK + asdk dir from that
environment (fall back to the in-tree checkout) and sanity-check the
compiler; included by each arch chip CMakeLists before its SDK-relative
source lists.
- common/ameba/cmake/ameba_board.cmake: the shared mechanism -- autoconf,
libameba_fwlib.a / libameba_wifi.a compiled with the isolated SDK include
set, the image2 linker script, the image2 link flags + EXTRA_LIBS, nuttx.bin
packaging and the flash target. Per-IC inputs are set by each arch chip
CMakeLists.
- common/ameba/tools/{ameba_gen_ldscript,ameba_package,ameba_flash}.sh:
shared shell steps used by both the make and cmake paths so the two produce
identical output; tools/ameba/Config.mk now flashes via ameba_flash.sh too.
- Fix a latent rtl8720f CMakeLists source list bug (ameba_ipc.c was missing
for the WiFi / flash-fs configs).
The make build is unchanged (it still auto-fetches everything, so sourcing
env.sh is optional there and required only for cmake). Verified on hardware:
both boards build, flash and boot with WiFi over the CMake path.
Assisted-by: Claude Code:claude-opus-4-8
Signed-off-by: raul_chen <raul_chen@realsil.com.cn>
This commit is contained in:
parent
e35129b98d
commit
541e9d13a2
18 changed files with 1292 additions and 207 deletions
|
|
@ -40,6 +40,10 @@ This NuttX port does not wire any user buttons or LEDs.
|
|||
Configurations
|
||||
==============
|
||||
|
||||
Build and flash any of these per the :doc:`RTL8720F build instructions
|
||||
<../../index>`; for the CMake build, source ``. tools/ameba/env.sh
|
||||
rtl8720f_evb`` first (the make build needs no sourcing).
|
||||
|
||||
.. code:: console
|
||||
|
||||
$ ./tools/configure.sh rtl8720f_evb:<config-name>
|
||||
|
|
@ -71,50 +75,6 @@ SoftAP (become an access point, with a DHCP server for clients)::
|
|||
|
||||
Stop the SoftAP with ``wapi essid wlan0 <ssid> 0``.
|
||||
|
||||
Building and Flashing
|
||||
=====================
|
||||
|
||||
The build auto-fetches the Realtek ``ameba-rtos`` SDK on first use and a
|
||||
Realtek ``arm-none-eabi`` toolchain must be on ``PATH``; see the
|
||||
:doc:`chip documentation <../../index>` for both.
|
||||
|
||||
.. code:: console
|
||||
|
||||
$ ./tools/configure.sh rtl8720f_evb:nsh
|
||||
$ make
|
||||
|
||||
This produces ``nuttx.bin`` in the top-level build directory: the NuttX
|
||||
application image, which also bundles the prebuilt Wi-Fi firmware. The
|
||||
bootloader ``boot.bin`` is a prebuilt binary kept under the board's
|
||||
``prebuilt/`` directory; ``make flash`` writes both at the flash offsets
|
||||
taken from the generated flash layout, so no offsets are entered by hand.
|
||||
|
||||
After a successful build, flash via one of these methods:
|
||||
|
||||
**CLI (Linux/macOS)** — connect a USB-UART adapter (PL2303) and use the
|
||||
built-in ``make flash`` target:
|
||||
|
||||
.. code:: console
|
||||
|
||||
$ make flash AMEBA_PORT=/dev/ttyUSB0
|
||||
|
||||
The baud rate defaults to 1500000; override with ``AMEBA_BAUD`` if needed.
|
||||
|
||||
**GUI (Windows)** — use the Realtek AmebaImageTool (``AmebaImageTool.exe``
|
||||
under ``tools/ameba/ImageTool/`` in the SDK tree) to select ``boot.bin`` (from
|
||||
the board's ``prebuilt/`` directory) and ``nuttx.bin``.
|
||||
|
||||
See the `Realtek Ameba ImageTool guide
|
||||
<https://aiot.realmcu.com/en/latest/tools/image_tool/index.html>`_ for the
|
||||
Windows GUI tool and download-mode entry (hold the download button /
|
||||
power-cycle with the ``UART_LOG_TX`` line asserted).
|
||||
|
||||
**Serial console** — after flashing, connect to the LOG-UART at 1500000 8N1::
|
||||
|
||||
$ picocom -b 1500000 /dev/ttyUSB0
|
||||
|
||||
Other tools: ``screen /dev/ttyUSB0 1500000`` or ``minicom -b 1500000 -D /dev/ttyUSB0``.
|
||||
|
||||
License Exceptions
|
||||
==================
|
||||
|
||||
|
|
|
|||
|
|
@ -40,24 +40,93 @@ NOR accessed through the SDK XIP path. The exact flash / PSRAM size depends on
|
|||
the part number — for example the RTL8720FBF has 4 MB of NOR flash and no
|
||||
PSRAM.
|
||||
|
||||
Vendor SDK Dependency
|
||||
Vendor SDK and Toolchain
|
||||
========================
|
||||
|
||||
The build depends on Realtek's open ``ameba-rtos`` SDK and its matching
|
||||
``arm-none-eabi`` toolchain (from the Realtek asdk release), neither of which is
|
||||
part of the NuttX tree. The SDK provides the Wi-Fi / Bluetooth firmware and the
|
||||
low-level chip libraries; NuttX links its own libc / libm and reuses the SDK's
|
||||
``app_start()`` as the image entry point.
|
||||
|
||||
Both are fetched automatically — there is nothing to install by hand:
|
||||
|
||||
- **make** fetches them on the first ``make`` (from its ``PREBUILD`` step).
|
||||
- **CMake** fetches them when you source ``. tools/ameba/env.sh <board>``, which
|
||||
must run before ``cmake`` (CMake probes the compiler at configure time). The
|
||||
make build resolves everything on demand, so it needs no sourcing.
|
||||
|
||||
The SDK is a shallow ``git clone`` of the pinned revision of
|
||||
``https://github.com/Ameba-AIoT/ameba-rtos.git`` into
|
||||
``arch/arm/src/common/ameba/ameba-rtos`` (git-ignored) and is built unmodified;
|
||||
export ``AMEBA_SDK`` to use a local checkout instead. The asdk version is
|
||||
pinned **per IC** by the SDK, so different Ameba ICs may use different toolchain
|
||||
versions — the build selects the matching one automatically.
|
||||
|
||||
Building and Flashing
|
||||
=====================
|
||||
|
||||
The build depends on Realtek's open ``ameba-rtos`` SDK, which is **not** part
|
||||
of the NuttX tree. It provides the Wi-Fi / Bluetooth firmware and the
|
||||
low-level chip libraries. The first build auto-fetches the pinned revision (a
|
||||
shallow ``git clone`` of ``https://github.com/Ameba-AIoT/ameba-rtos.git``) into
|
||||
``arch/arm/src/common/ameba/ameba-rtos`` (git-ignored) and builds against it
|
||||
unmodified. To use a local checkout instead of auto-fetching, export
|
||||
``AMEBA_SDK`` to its path.
|
||||
Replace ``<board>`` below with an actual board (e.g. ``rtl8720f_evb``) and
|
||||
``<config>`` with one of its configurations. The first build fetches the SDK
|
||||
and toolchain (see `Vendor SDK and Toolchain`_).
|
||||
|
||||
Toolchain
|
||||
=========
|
||||
With make
|
||||
---------
|
||||
|
||||
A matching Realtek ARM toolchain (``arm-none-eabi`` from the Realtek asdk
|
||||
release) is required and is fetched automatically by the board build. NuttX
|
||||
links its own libc / libm and reuses the SDK's ``app_start()`` as the image
|
||||
entry point.
|
||||
.. code:: console
|
||||
|
||||
$ ./tools/configure.sh <board>:<config>
|
||||
$ make
|
||||
|
||||
With CMake
|
||||
----------
|
||||
|
||||
CMake probes the compiler at configure time, so source the Ameba environment
|
||||
once first, **passing the board** so the asdk version that IC pins is on
|
||||
``PATH``:
|
||||
|
||||
.. code:: console
|
||||
|
||||
$ . tools/ameba/env.sh <board>
|
||||
$ cmake -B build -DBOARD_CONFIG=<board>:<config> -GNinja
|
||||
$ cmake --build build
|
||||
|
||||
make writes ``nuttx.bin`` to the top-level directory; CMake writes it under
|
||||
``build/``. The bootloader ``boot.bin`` is a prebuilt binary under the board's
|
||||
``prebuilt/`` directory; the flash step writes both at the offsets taken from
|
||||
the generated flash layout, so none are entered by hand.
|
||||
|
||||
Flashing
|
||||
--------
|
||||
|
||||
**CLI (Linux/macOS)** — connect a USB-UART adapter and use the built-in flash
|
||||
target (the baud defaults to 1500000; override with ``AMEBA_BAUD``)::
|
||||
|
||||
$ make flash AMEBA_PORT=/dev/ttyUSB0 # make build
|
||||
$ AMEBA_PORT=/dev/ttyUSB0 cmake --build build --target flash # CMake build
|
||||
|
||||
**GUI (Windows)** — use the Realtek AmebaImageTool (``AmebaImageTool.exe`` under
|
||||
``tools/ameba/ImageTool/`` in the SDK tree) to select ``boot.bin`` (from the
|
||||
board's ``prebuilt/`` directory) and ``nuttx.bin``. See the `Realtek Ameba
|
||||
ImageTool guide <https://aiot.realmcu.com/en/latest/tools/image_tool/index.html>`_
|
||||
for the Windows GUI tool and download-mode entry (hold the download button /
|
||||
power-cycle with the ``UART_LOG_TX`` line asserted).
|
||||
|
||||
**Serial console** — after flashing, connect to the LOG-UART at 1500000 8N1::
|
||||
|
||||
$ picocom -b 1500000 /dev/ttyUSB0
|
||||
|
||||
Configuration
|
||||
=============
|
||||
|
||||
The build-time options are the same for make and CMake (both edit the one
|
||||
Kconfig for the selected board); only the command that launches the menuconfig
|
||||
UI differs:
|
||||
|
||||
.. code:: console
|
||||
|
||||
$ make menuconfig # make build
|
||||
$ cmake --build build -t menuconfig # CMake build
|
||||
|
||||
Supported Features
|
||||
==================
|
||||
|
|
|
|||
|
|
@ -42,6 +42,10 @@ This NuttX port does not wire any user buttons or LEDs.
|
|||
Configurations
|
||||
==============
|
||||
|
||||
Build and flash any of these per the :doc:`RTL8721Dx build instructions
|
||||
<../../index>`; for the CMake build, source ``. tools/ameba/env.sh
|
||||
pke8721daf`` first (the make build needs no sourcing).
|
||||
|
||||
.. code:: console
|
||||
|
||||
$ ./tools/configure.sh pke8721daf:<config-name>
|
||||
|
|
@ -73,50 +77,6 @@ SoftAP (become an access point, with a DHCP server for clients)::
|
|||
|
||||
Stop the SoftAP with ``wapi essid wlan0 <ssid> 0``.
|
||||
|
||||
Building and Flashing
|
||||
=====================
|
||||
|
||||
The build auto-fetches the Realtek ``ameba-rtos`` SDK on first use and a
|
||||
Realtek ``arm-none-eabi`` toolchain must be on ``PATH``; see the
|
||||
:doc:`chip documentation <../../index>` for both.
|
||||
|
||||
.. code:: console
|
||||
|
||||
$ ./tools/configure.sh pke8721daf:nsh
|
||||
$ make
|
||||
|
||||
This produces ``nuttx.bin`` in the top-level build directory: the NuttX
|
||||
application image, which also bundles the prebuilt Wi-Fi firmware. The
|
||||
bootloader ``boot.bin`` is a prebuilt binary kept under the board's
|
||||
``prebuilt/`` directory; ``make flash`` writes both at the flash offsets
|
||||
taken from the generated flash layout, so no offsets are entered by hand.
|
||||
|
||||
After a successful build, flash via one of these methods:
|
||||
|
||||
**CLI (Linux/macOS)** — connect a USB-UART adapter (PL2303) and use the
|
||||
built-in ``make flash`` target:
|
||||
|
||||
.. code:: console
|
||||
|
||||
$ make flash AMEBA_PORT=/dev/ttyUSB0
|
||||
|
||||
The baud rate defaults to 1500000; override with ``AMEBA_BAUD`` if needed.
|
||||
|
||||
**GUI (Windows)** — use the Realtek AmebaImageTool (``AmebaImageTool.exe``
|
||||
under ``tools/ameba/ImageTool/`` in the SDK tree) to select ``boot.bin`` (from
|
||||
the board's ``prebuilt/`` directory) and ``nuttx.bin``.
|
||||
|
||||
See the `Realtek Ameba ImageTool guide
|
||||
<https://aiot.realmcu.com/en/latest/tools/image_tool/index.html>`_ for the
|
||||
Windows GUI tool and download-mode entry (hold the download button /
|
||||
power-cycle with the ``UART_LOG_TX`` line asserted).
|
||||
|
||||
**Serial console** — after flashing, connect to the LOG-UART at 1500000 8N1::
|
||||
|
||||
$ picocom -b 1500000 /dev/ttyUSB0
|
||||
|
||||
Other tools: ``screen /dev/ttyUSB0 1500000`` or ``minicom -b 1500000 -D /dev/ttyUSB0``.
|
||||
|
||||
License Exceptions
|
||||
==================
|
||||
|
||||
|
|
|
|||
|
|
@ -41,24 +41,93 @@ NOR accessed through the SDK XIP path. The exact flash / PSRAM size depends on
|
|||
the part number — for example the RTL8721DAF has 4 MB of NOR flash and no
|
||||
PSRAM.
|
||||
|
||||
Vendor SDK Dependency
|
||||
Vendor SDK and Toolchain
|
||||
========================
|
||||
|
||||
The build depends on Realtek's open ``ameba-rtos`` SDK and its matching
|
||||
``arm-none-eabi`` toolchain (from the Realtek asdk release), neither of which is
|
||||
part of the NuttX tree. The SDK provides the Wi-Fi / Bluetooth firmware and the
|
||||
low-level chip libraries; NuttX links its own libc / libm and reuses the SDK's
|
||||
``app_start()`` as the image entry point.
|
||||
|
||||
Both are fetched automatically — there is nothing to install by hand:
|
||||
|
||||
- **make** fetches them on the first ``make`` (from its ``PREBUILD`` step).
|
||||
- **CMake** fetches them when you source ``. tools/ameba/env.sh <board>``, which
|
||||
must run before ``cmake`` (CMake probes the compiler at configure time). The
|
||||
make build resolves everything on demand, so it needs no sourcing.
|
||||
|
||||
The SDK is a shallow ``git clone`` of the pinned revision of
|
||||
``https://github.com/Ameba-AIoT/ameba-rtos.git`` into
|
||||
``arch/arm/src/common/ameba/ameba-rtos`` (git-ignored) and is built unmodified;
|
||||
export ``AMEBA_SDK`` to use a local checkout instead. The asdk version is
|
||||
pinned **per IC** by the SDK, so different Ameba ICs may use different toolchain
|
||||
versions — the build selects the matching one automatically.
|
||||
|
||||
Building and Flashing
|
||||
=====================
|
||||
|
||||
The build depends on Realtek's open ``ameba-rtos`` SDK, which is **not** part
|
||||
of the NuttX tree. It provides the Wi-Fi / Bluetooth firmware and the
|
||||
low-level chip libraries. The first build auto-fetches the pinned revision (a
|
||||
shallow ``git clone`` of ``https://github.com/Ameba-AIoT/ameba-rtos.git``) into
|
||||
``arch/arm/src/common/ameba/ameba-rtos`` (git-ignored) and builds against it
|
||||
unmodified. To use a local checkout instead of auto-fetching, export
|
||||
``AMEBA_SDK`` to its path.
|
||||
Replace ``<board>`` below with an actual board (e.g. ``pke8721daf``) and
|
||||
``<config>`` with one of its configurations. The first build fetches the SDK
|
||||
and toolchain (see `Vendor SDK and Toolchain`_).
|
||||
|
||||
Toolchain
|
||||
=========
|
||||
With make
|
||||
---------
|
||||
|
||||
A matching Realtek ARM toolchain (``arm-none-eabi`` from the Realtek asdk
|
||||
release) is required and is fetched automatically by the board build. NuttX
|
||||
links its own libc / libm and reuses the SDK's ``app_start()`` as the image
|
||||
entry point.
|
||||
.. code:: console
|
||||
|
||||
$ ./tools/configure.sh <board>:<config>
|
||||
$ make
|
||||
|
||||
With CMake
|
||||
----------
|
||||
|
||||
CMake probes the compiler at configure time, so source the Ameba environment
|
||||
once first, **passing the board** so the asdk version that IC pins is on
|
||||
``PATH``:
|
||||
|
||||
.. code:: console
|
||||
|
||||
$ . tools/ameba/env.sh <board>
|
||||
$ cmake -B build -DBOARD_CONFIG=<board>:<config> -GNinja
|
||||
$ cmake --build build
|
||||
|
||||
make writes ``nuttx.bin`` to the top-level directory; CMake writes it under
|
||||
``build/``. The bootloader ``boot.bin`` is a prebuilt binary under the board's
|
||||
``prebuilt/`` directory; the flash step writes both at the offsets taken from
|
||||
the generated flash layout, so none are entered by hand.
|
||||
|
||||
Flashing
|
||||
--------
|
||||
|
||||
**CLI (Linux/macOS)** — connect a USB-UART adapter and use the built-in flash
|
||||
target (the baud defaults to 1500000; override with ``AMEBA_BAUD``)::
|
||||
|
||||
$ make flash AMEBA_PORT=/dev/ttyUSB0 # make build
|
||||
$ AMEBA_PORT=/dev/ttyUSB0 cmake --build build --target flash # CMake build
|
||||
|
||||
**GUI (Windows)** — use the Realtek AmebaImageTool (``AmebaImageTool.exe`` under
|
||||
``tools/ameba/ImageTool/`` in the SDK tree) to select ``boot.bin`` (from the
|
||||
board's ``prebuilt/`` directory) and ``nuttx.bin``. See the `Realtek Ameba
|
||||
ImageTool guide <https://aiot.realmcu.com/en/latest/tools/image_tool/index.html>`_
|
||||
for the Windows GUI tool and download-mode entry (hold the download button /
|
||||
power-cycle with the ``UART_LOG_TX`` line asserted).
|
||||
|
||||
**Serial console** — after flashing, connect to the LOG-UART at 1500000 8N1::
|
||||
|
||||
$ picocom -b 1500000 /dev/ttyUSB0
|
||||
|
||||
Configuration
|
||||
=============
|
||||
|
||||
The build-time options are the same for make and CMake (both edit the one
|
||||
Kconfig for the selected board); only the command that launches the menuconfig
|
||||
UI differs:
|
||||
|
||||
.. code:: console
|
||||
|
||||
$ make menuconfig # make build
|
||||
$ cmake --build build -t menuconfig # CMake build
|
||||
|
||||
Supported Features
|
||||
==================
|
||||
|
|
|
|||
314
arch/arm/src/common/ameba/cmake/ameba_board.cmake
Normal file
314
arch/arm/src/common/ameba/cmake/ameba_board.cmake
Normal file
|
|
@ -0,0 +1,314 @@
|
|||
# ##############################################################################
|
||||
# arch/arm/src/common/ameba/cmake/ameba_board.cmake
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more contributor
|
||||
# license agreements. See the NOTICE file distributed with this work for
|
||||
# additional information regarding copyright ownership. The ASF licenses this
|
||||
# file to you under the Apache License, Version 2.0 (the "License"); you may not
|
||||
# use this file except in compliance with the License. You may obtain a copy of
|
||||
# the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations under
|
||||
# the License.
|
||||
#
|
||||
# ##############################################################################
|
||||
|
||||
# CMake counterpart of the make-side arch/.../<ic>/ameba_board.mk: the shared
|
||||
# vendor-SDK build machinery for every Ameba IC. The per-IC arch CMakeLists.txt
|
||||
# sets the differing inputs (SoC subdir, source/include lists, AP project name)
|
||||
# then include()s this file, exactly as each board's scripts/Make.defs
|
||||
# include()s ameba_board.mk. Every mechanism below mirrors a section of
|
||||
# ameba_board.mk; see that file for the detailed rationale and for the inputs
|
||||
# each arch chip CMakeLists.txt is expected to set.
|
||||
|
||||
set(AMEBA_COMMON_DIR ${CMAKE_CURRENT_LIST_DIR}/..)
|
||||
set(AMEBA_TOOLS_DIR ${AMEBA_COMMON_DIR}/tools)
|
||||
|
||||
# AMEBA_SDK / AMEBA_TOOLCHAIN_DIR are resolved (and the compiler sanity-checked)
|
||||
# by ameba_sdk.cmake, which the arch chip CMakeLists includes before its
|
||||
# SDK-relative source lists; include it here too (no-op if already done) so this
|
||||
# file is self-contained.
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/ameba_sdk.cmake)
|
||||
|
||||
# The IC arch chip dir (the includer's dir) holds IC-specific sources such as
|
||||
# ameba_app_start.c, referenced by AMEBA_FWLIB_SRCS via ${AMEBA_CHIP_DIR}.
|
||||
set(AMEBA_CHIP_DIR ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
|
||||
# SDK sub-trees + the board-local (gitignored) staging area, mirroring the make
|
||||
# variables of the same name. Generated artefacts (autoconf, the two .a, the
|
||||
# combined ld script) go under the board prebuilt/ dir, shared with the make
|
||||
# build's staging.
|
||||
set(AMEBA_SOC ${AMEBA_SDK}/component/soc/${AMEBA_SOC_NAME})
|
||||
set(AMEBA_PROJ ${AMEBA_SOC}/project)
|
||||
set(AMEBA_KM4_PROJ ${AMEBA_PROJ}/${AMEBA_KM_PROJ})
|
||||
set(AMEBA_SOC_LIB ${AMEBA_KM4_PROJ}/lib/soc)
|
||||
|
||||
set(AMEBA_PREBUILT ${NUTTX_BOARD_DIR}/prebuilt)
|
||||
set(AMEBA_PREBUILT_LIBS ${AMEBA_PREBUILT}/libs)
|
||||
set(AMEBA_AUTOCONF ${AMEBA_PREBUILT}/platform_autoconf.h)
|
||||
|
||||
file(MAKE_DIRECTORY ${AMEBA_PREBUILT_LIBS})
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# #3 platform_autoconf.h -- regenerated from the SDK menuconfig (single source
|
||||
# of truth for the flash layout + feature switches). Done at CONFIGURE time so
|
||||
# the VFS1 geometry can be read back and injected into ameba_flash_mtd.c, and so
|
||||
# it exists before the ld-script preprocess / WiFi force-include below.
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
# Provision the SDK dev environment (prebuilts + python venv) the autoconf /
|
||||
# packaging steps need -- idempotent, mirrors the make PREBUILD's setup call.
|
||||
execute_process(COMMAND sh ${AMEBA_TOOLS_DIR}/ameba_setup_env.sh ${AMEBA_SDK}
|
||||
${AMEBA_TOOLCHAIN_DIR} RESULT_VARIABLE _rc)
|
||||
if(NOT _rc EQUAL 0)
|
||||
message(FATAL_ERROR "ameba_setup_env.sh failed (rc=${_rc})")
|
||||
endif()
|
||||
|
||||
message(STATUS "ameba: generating platform_autoconf.h from SDK menuconfig")
|
||||
execute_process(
|
||||
COMMAND sh ${AMEBA_TOOLS_DIR}/ameba_gen_autoconf.sh ${AMEBA_SDK}
|
||||
${AMEBA_PY_SOC} ${AMEBA_AP_PROJECT} ${AMEBA_AUTOCONF}
|
||||
RESULT_VARIABLE _rc)
|
||||
if(NOT _rc EQUAL 0)
|
||||
message(FATAL_ERROR "ameba_gen_autoconf.sh failed (rc=${_rc})")
|
||||
endif()
|
||||
|
||||
# VFS1 data-partition geometry -> neutral -D macros on ameba_flash_mtd.c only (a
|
||||
# NuttX C file must not force-include the SDK autoconf). Mirrors the make
|
||||
# CFLAGS derivation. ameba_flash_mtd.c falls back to the vendor default if
|
||||
# absent.
|
||||
if(AMEBA_CFG_FLASHFS AND EXISTS ${AMEBA_AUTOCONF})
|
||||
file(STRINGS ${AMEBA_AUTOCONF} _l REGEX "CONFIG_FLASH_VFS1_OFFSET")
|
||||
if(_l)
|
||||
list(GET _l 0 _l0)
|
||||
string(REGEX REPLACE ".*CONFIG_FLASH_VFS1_OFFSET[ \t]+([0-9xXa-fA-F]+).*"
|
||||
"\\1" _vfs1_off "${_l0}")
|
||||
endif()
|
||||
file(STRINGS ${AMEBA_AUTOCONF} _l REGEX "CONFIG_FLASH_VFS1_SIZE")
|
||||
if(_l)
|
||||
list(GET _l 0 _l0)
|
||||
string(REGEX REPLACE ".*CONFIG_FLASH_VFS1_SIZE[ \t]+([0-9xXa-fA-F]+).*"
|
||||
"\\1" _vfs1_size "${_l0}")
|
||||
endif()
|
||||
set(_flash_defs)
|
||||
if(_vfs1_off)
|
||||
list(APPEND _flash_defs AMEBA_FLASH_VFS1_OFFSET_XIP=${_vfs1_off})
|
||||
endif()
|
||||
if(_vfs1_size)
|
||||
list(APPEND _flash_defs AMEBA_FLASH_VFS1_SIZE_CFG=${_vfs1_size})
|
||||
endif()
|
||||
if(_flash_defs)
|
||||
set_property(
|
||||
SOURCE ${AMEBA_COMMON_DIR}/ameba_flash_mtd.c
|
||||
APPEND
|
||||
PROPERTY COMPILE_DEFINITIONS ${_flash_defs})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# #4 libameba_fwlib.a / libameba_wifi.a
|
||||
#
|
||||
# Compiled from SDK source with an ISOLATED flag+include set (the SDK headers
|
||||
# clash with NuttX's), so -- exactly like the make PREBUILD -- each source is
|
||||
# compiled by a bare custom-command invocation using NUTTX_EXTRA_FLAGS (the
|
||||
# toolchain cpu/opt flags, WITHOUT NuttX's include dirs) plus the SDK include
|
||||
# set, then archived. add_library() is deliberately NOT used: it would inherit
|
||||
# the directory's NuttX include_directories() and pull in clashing headers.
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
# ~~~
|
||||
# ameba_build_lib(<lib_path> <obj_subdir> <srcs-var> <inc-var>)
|
||||
# Compile each source in <srcs-var> to an object under <obj_subdir> with the
|
||||
# isolated flags, then archive them all into <lib_path>. Returns via the
|
||||
# caller-supplied variable the target name to depend on.
|
||||
# ~~~
|
||||
function(ameba_build_lib lib obj_subdir srcs_var inc_var out_target)
|
||||
set(_objdir ${AMEBA_PREBUILT_LIBS}/${obj_subdir})
|
||||
file(MAKE_DIRECTORY ${_objdir})
|
||||
set(_objs)
|
||||
foreach(_src ${${srcs_var}})
|
||||
get_filename_component(_base ${_src} NAME_WE)
|
||||
set(_obj ${_objdir}/${_base}.o)
|
||||
add_custom_command(
|
||||
OUTPUT ${_obj}
|
||||
COMMAND ${CMAKE_C_COMPILER} ${NUTTX_EXTRA_FLAGS} -Os -ffunction-sections
|
||||
-fdata-sections ${${inc_var}} -c ${_src} -o ${_obj}
|
||||
DEPENDS ${_src} ${AMEBA_AUTOCONF}
|
||||
COMMAND_EXPAND_LISTS
|
||||
COMMENT "CC (ameba ${obj_subdir}) ${_base}.o")
|
||||
list(APPEND _objs ${_obj})
|
||||
endforeach()
|
||||
add_custom_command(
|
||||
OUTPUT ${lib}
|
||||
COMMAND ${CMAKE_AR} crs ${lib} ${_objs}
|
||||
DEPENDS ${_objs}
|
||||
COMMENT "AR ${lib}")
|
||||
get_filename_component(_libname ${lib} NAME_WE)
|
||||
add_custom_target(${_libname}_target DEPENDS ${lib})
|
||||
set(${out_target}
|
||||
${_libname}_target
|
||||
PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
set(AMEBA_FWLIB_A ${AMEBA_PREBUILT_LIBS}/libameba_fwlib.a)
|
||||
ameba_build_lib(${AMEBA_FWLIB_A} fwlib_obj AMEBA_FWLIB_SRCS AMEBA_FWLIB_INC
|
||||
_fwlib_target)
|
||||
add_dependencies(nuttx ${_fwlib_target})
|
||||
|
||||
set(AMEBA_EXTRA_LIBS ${AMEBA_FWLIB_A})
|
||||
|
||||
# chipinfo / pmc ship pre-compiled inside the SDK source tree.
|
||||
list(APPEND AMEBA_EXTRA_LIBS ${AMEBA_SOC_LIB}/lib_chipinfo.a
|
||||
${AMEBA_SOC_LIB}/lib_pmc.a)
|
||||
|
||||
if(AMEBA_CFG_WIFI)
|
||||
set(AMEBA_WIFI_A ${AMEBA_PREBUILT_LIBS}/libameba_wifi.a)
|
||||
ameba_build_lib(${AMEBA_WIFI_A} wifi_obj AMEBA_WIFI_SRCS AMEBA_WIFI_INC
|
||||
_wifi_target)
|
||||
add_dependencies(nuttx ${_wifi_target})
|
||||
|
||||
# KM4-side host WiFi control libs from the pinned SDK. The exact set is
|
||||
# IC-specific (e.g. lib_coex is an AP-side lib on RTL8721Dx but NP-side on
|
||||
# RTL8720F), so the arch chip CMakeLists provides it via AMEBA_WIFI_APP_LIBS.
|
||||
list(APPEND AMEBA_EXTRA_LIBS ${AMEBA_WIFI_APP_LIBS} ${AMEBA_WIFI_A})
|
||||
endif()
|
||||
|
||||
# crtbegin.o / crtend.o (asdk gcc runtime) -- positional objects appended inside
|
||||
# the link group; -lm / -lstdc++ name-spec libs (C++ static-init + math). The
|
||||
# cpu flags MUST be passed so gcc returns the multilib-correct crt objects (the
|
||||
# hard-float / cortex-m33 variant), else the link fails on a VFP/arch mismatch.
|
||||
execute_process(
|
||||
COMMAND ${CMAKE_C_COMPILER} ${NUTTX_EXTRA_FLAGS} -print-file-name=crtbegin.o
|
||||
OUTPUT_VARIABLE _crtbegin
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
execute_process(
|
||||
COMMAND ${CMAKE_C_COMPILER} ${NUTTX_EXTRA_FLAGS} -print-file-name=crtend.o
|
||||
OUTPUT_VARIABLE _crtend
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
list(APPEND AMEBA_EXTRA_LIBS ${_crtbegin} ${_crtend} -lm -lstdc++)
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# #5 ld.script.gen -- combined image2 linker script (see ameba_gen_ldscript.sh).
|
||||
#
|
||||
# Generated at CONFIGURE time (like the autoconf above), NOT via a build-time
|
||||
# custom command: the top-level CMakeLists consumes LD_SCRIPT to build its cpp
|
||||
# ".tmp" preprocessing target in a different directory scope, and the Makefiles
|
||||
# generator cannot resolve a cross-directory add_custom_command OUTPUT as that
|
||||
# target's dependency ("No rule to make target ld.script.gen"). Producing it as
|
||||
# a real file up front sidesteps that -- its inputs (the SDK ld sources + the
|
||||
# config-derived autoconf) are all already present at configure time.
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
set(AMEBA_KM4_LD ${AMEBA_KM4_PROJ}/ld)
|
||||
set(AMEBA_IMG2_LD ${AMEBA_KM4_LD}/ameba_img2_all.ld)
|
||||
set(AMEBA_ROM_LD ${AMEBA_KM4_LD}/ameba_rom_symbol_acut_s.ld)
|
||||
set(GENLDSCRIPT ${AMEBA_PREBUILT}/ld.script.gen)
|
||||
|
||||
message(
|
||||
STATUS "ameba: generating ld.script.gen (AP ${AMEBA_AP_PROJECT} image2)")
|
||||
execute_process(
|
||||
COMMAND
|
||||
sh ${AMEBA_TOOLS_DIR}/ameba_gen_ldscript.sh ${CMAKE_C_COMPILER}
|
||||
${AMEBA_IMG2_LD} ${AMEBA_ROM_LD} ${AMEBA_AUTOCONF} ${AMEBA_PREBUILT}
|
||||
${AMEBA_AP_PROJECT} ${GENLDSCRIPT}
|
||||
RESULT_VARIABLE _rc)
|
||||
if(NOT _rc EQUAL 0)
|
||||
message(FATAL_ERROR "ameba_gen_ldscript.sh failed (rc=${_rc})")
|
||||
endif()
|
||||
|
||||
set_property(GLOBAL PROPERTY LD_SCRIPT ${GENLDSCRIPT})
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# #6 Link flags + EXTRA_LIBS (reproducing link_img2.sh). The libs are appended
|
||||
# to the `nuttx` target so they land inside the top-level --start-group/
|
||||
# --end-group, resolving against each other and the NuttX libs; --gc-sections
|
||||
# drops everything unreferenced.
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
target_link_options(
|
||||
nuttx
|
||||
PRIVATE
|
||||
-Wl,-u,app_start
|
||||
-Wl,-e,app_start
|
||||
-Wl,--gc-sections
|
||||
-Wl,--no-enum-size-warning
|
||||
-Wl,--warn-common
|
||||
-Wl,--build-id=none
|
||||
-Wl,--cref
|
||||
-Wl,--defsym=_sbss=__bss_start__
|
||||
-Wl,--defsym=_ebss=__bss_end__
|
||||
-Wl,--defsym=_sdata=__sram_image2_start__
|
||||
-Wl,--defsym=_edata=__sram_image2_start__
|
||||
-Wl,--defsym=_eronly=__sram_image2_start__
|
||||
-Wl,-Map=${CMAKE_BINARY_DIR}/nuttx.map
|
||||
${AMEBA_EXTRA_LINK_OPTIONS})
|
||||
|
||||
# Append to NUTTX_EXTRA_LIBRARIES (not target_link_libraries): the top-level
|
||||
# link places this property INSIDE the --start-group/--end-group, so the SDK
|
||||
# archives resolve against each other and the NuttX libs. A plain
|
||||
# target_link_libraries here would land them before the group and leave the
|
||||
# cross-references (FLASH_*, IPC_*, ameba_wifi_*) undefined.
|
||||
set_property(GLOBAL APPEND PROPERTY NUTTX_EXTRA_LIBRARIES ${AMEBA_EXTRA_LIBS})
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# #7 POSTBUILD -- package the linked image2 into a flashable nuttx.bin. Wired
|
||||
# here (shared) so both boards on this IC get it; the whole recipe lives in
|
||||
# ameba_package.sh, invoked after `nuttx` is linked.
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
if(EXISTS ${AMEBA_TOOLS_DIR}/ameba_package.sh)
|
||||
add_custom_target(
|
||||
nuttx_post_build
|
||||
DEPENDS nuttx
|
||||
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
||||
COMMENT "PACK nuttx.bin (Ameba AP + NP image2)")
|
||||
add_custom_command(
|
||||
TARGET nuttx_post_build
|
||||
POST_BUILD
|
||||
COMMAND
|
||||
${CMAKE_COMMAND} -E env
|
||||
"AMEBA_FLASH_HINT=AMEBA_PORT=/dev/ttyUSB0 cmake --build ${CMAKE_BINARY_DIR} --target flash"
|
||||
sh ${AMEBA_TOOLS_DIR}/ameba_package.sh ${AMEBA_SDK} ${AMEBA_PY_SOC}
|
||||
${AMEBA_SOC_NAME} ${AMEBA_PREBUILT} ${AMEBA_AP_PROJECT} ${AMEBA_KM_PROJ}
|
||||
${AMEBA_NP_TARGET} ${AMEBA_TOOLCHAIN_DIR} ${CMAKE_BINARY_DIR}/nuttx
|
||||
${CMAKE_BINARY_DIR}/nuttx.bin
|
||||
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
||||
# USES_TERMINAL -> Ninja "console" pool: stream the (long) SDK NP-build +
|
||||
# packaging output live instead of buffering it until the step finishes.
|
||||
USES_TERMINAL COMMAND_EXPAND_LISTS)
|
||||
endif()
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# `flash` target -- download boot.bin + nuttx.bin over serial (shared script).
|
||||
# The serial port + baud come from the environment at build time, so no
|
||||
# reconfigure is needed: AMEBA_PORT=/dev/ttyUSB0 [AMEBA_BAUD=1500000] cmake
|
||||
# --build <dir> --target flash AMEBA_FLASH_PROFILE names the SDK .rdev
|
||||
# flash-loader profile for this IC.
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
# The SDK flash-loader profile base name matches the public SoC id on both ICs
|
||||
# (RTL8721Dx.rdev / RTL8720F.rdev); default to it unless the arch overrides.
|
||||
if(NOT DEFINED AMEBA_FLASH_PROFILE)
|
||||
set(AMEBA_FLASH_PROFILE ${AMEBA_PY_SOC})
|
||||
endif()
|
||||
|
||||
if(AMEBA_FLASH_PROFILE AND NOT TARGET flash)
|
||||
add_custom_target(
|
||||
flash
|
||||
DEPENDS nuttx_post_build
|
||||
COMMAND
|
||||
${CMAKE_COMMAND} -E env sh ${AMEBA_TOOLS_DIR}/ameba_flash.sh ${AMEBA_SDK}
|
||||
${AMEBA_FLASH_PROFILE} ${AMEBA_AUTOCONF} ${AMEBA_PREBUILT}
|
||||
${CMAKE_BINARY_DIR}/nuttx.bin
|
||||
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
||||
USES_TERMINAL VERBATIM
|
||||
COMMENT "Flashing Ameba ${AMEBA_PY_SOC} over ${AMEBA_PORT} (AMEBA_PORT env)"
|
||||
)
|
||||
endif()
|
||||
64
arch/arm/src/common/ameba/cmake/ameba_sdk.cmake
Normal file
64
arch/arm/src/common/ameba/cmake/ameba_sdk.cmake
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
# ##############################################################################
|
||||
# arch/arm/src/common/ameba/cmake/ameba_sdk.cmake
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more contributor
|
||||
# license agreements. See the NOTICE file distributed with this work for
|
||||
# additional information regarding copyright ownership. The ASF licenses this
|
||||
# file to you under the Apache License, Version 2.0 (the "License"); you may not
|
||||
# use this file except in compliance with the License. You may obtain a copy of
|
||||
# the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations under
|
||||
# the License.
|
||||
#
|
||||
# ##############################################################################
|
||||
|
||||
# Resolve the ameba-rtos SDK checkout + asdk toolchain dir for the CMake build,
|
||||
# and sanity-check the compiler. The SDK + asdk toolchain are provisioned by `.
|
||||
# tools/ameba/env.sh` before cmake, which puts the compiler on PATH for the
|
||||
# standard probe -- this is why no per-chip hook is needed in the shared arch
|
||||
# Toolchain.cmake. Included by the arch chip CMakeLists BEFORE it builds the
|
||||
# SDK-relative source/include lists, so AMEBA_SDK is available to them.
|
||||
|
||||
include_guard(GLOBAL)
|
||||
|
||||
set(_ameba_common_dir ${CMAKE_CURRENT_LIST_DIR}/..)
|
||||
|
||||
# AMEBA_SDK: prefer the environment (set by env.sh / an external checkout), fall
|
||||
# back to the shared in-tree checkout.
|
||||
if(DEFINED ENV{AMEBA_SDK} AND EXISTS "$ENV{AMEBA_SDK}/component/soc")
|
||||
set(AMEBA_SDK $ENV{AMEBA_SDK})
|
||||
elseif(EXISTS "${_ameba_common_dir}/ameba-rtos/component/soc")
|
||||
set(AMEBA_SDK ${_ameba_common_dir}/ameba-rtos)
|
||||
else()
|
||||
message(
|
||||
FATAL_ERROR
|
||||
"ameba-rtos SDK not found. Source the build environment first:\n"
|
||||
" . tools/ameba/env.sh\n" "then re-run cmake.")
|
||||
endif()
|
||||
get_filename_component(AMEBA_SDK ${AMEBA_SDK} ABSOLUTE)
|
||||
|
||||
# asdk install root (only needed by the packaging step); matches env.sh.
|
||||
if(DEFINED ENV{AMEBA_TOOLCHAIN_DIR} AND NOT "$ENV{AMEBA_TOOLCHAIN_DIR}"
|
||||
STREQUAL "")
|
||||
set(AMEBA_TOOLCHAIN_DIR $ENV{AMEBA_TOOLCHAIN_DIR})
|
||||
else()
|
||||
set(AMEBA_TOOLCHAIN_DIR $ENV{HOME}/rtk-toolchain)
|
||||
endif()
|
||||
|
||||
# The compiler must be the SDK-pinned asdk toolchain (put on PATH by env.sh); a
|
||||
# stray arm-none-eabi-gcc would not match the SDK's prebuilt archives.
|
||||
if(NOT "${CMAKE_C_COMPILER}" MATCHES "${AMEBA_TOOLCHAIN_DIR}")
|
||||
message(
|
||||
FATAL_ERROR
|
||||
"C compiler '${CMAKE_C_COMPILER}' is not the ameba asdk toolchain.\n"
|
||||
"Source the build environment before configuring:\n"
|
||||
" . tools/ameba/env.sh")
|
||||
endif()
|
||||
|
|
@ -49,7 +49,10 @@ if [ ! -d "$DEST/component/soc" ]; then
|
|||
# init + fetch <sha> is used to land an arbitrary pinned commit.)
|
||||
git init --quiet "$DEST"
|
||||
git -C "$DEST" remote add origin "$URL"
|
||||
git -C "$DEST" fetch --quiet --depth 1 origin "$VERSION"
|
||||
# --progress (not --quiet): the shallow fetch still pulls hundreds of MB, so
|
||||
# show git's "Receiving objects" bar -- otherwise it looks hung. --progress
|
||||
# forces the bar even when stderr is not a TTY (e.g. CI logs).
|
||||
git -C "$DEST" fetch --progress --depth 1 origin "$VERSION"
|
||||
git -C "$DEST" checkout --quiet FETCH_HEAD
|
||||
|
||||
# Apply the NuttX build patches on top of the pinned commit. Done only on a
|
||||
|
|
|
|||
95
arch/arm/src/common/ameba/tools/ameba_flash.sh
Executable file
95
arch/arm/src/common/ameba/tools/ameba_flash.sh
Executable file
|
|
@ -0,0 +1,95 @@
|
|||
#!/bin/sh
|
||||
############################################################################
|
||||
# arch/arm/src/common/ameba/tools/ameba_flash.sh
|
||||
#
|
||||
# Download the built Ameba images to the chip over serial, via the SDK's
|
||||
# AmebaFlash.py. This is the single implementation shared by the make `flash`
|
||||
# target (tools/ameba/Config.mk) and the cmake `flash` target
|
||||
# (common/ameba/cmake/ameba_board.cmake), so both flash identically.
|
||||
#
|
||||
# Two images are written, each at its own flash offset:
|
||||
# boot.bin (SDK bootloader, prebuilt) @ CONFIG_FLASH_BOOT_OFFSET
|
||||
# nuttx.bin (AP+NP application image) @ CONFIG_FLASH_(APP_)OTA1_OFFSET
|
||||
#
|
||||
# The offsets are NOT hardcoded: they are read from the config-derived
|
||||
# platform_autoconf.h, so a flash-layout change is tracked automatically. The
|
||||
# app-slot macro is CONFIG_FLASH_APP_OTA1_OFFSET on some ICs (RTL8720F) and
|
||||
# CONFIG_FLASH_OTA1_OFFSET on others (RTL8721Dx); match either.
|
||||
#
|
||||
# Usage: ameba_flash.sh <sdk> <profile> <autoconf> <prebuilt_dir> <nuttx_bin>
|
||||
# Serial port + baud come from the environment (so a cmake custom target can
|
||||
# forward them without a reconfigure):
|
||||
# AMEBA_PORT serial port (required, e.g. /dev/ttyUSB0)
|
||||
# AMEBA_BAUD baud rate (default 1500000)
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
set -e
|
||||
|
||||
SDK="$1"
|
||||
PROFILE_NAME="$2"
|
||||
AUTOCONF="$3"
|
||||
PREBUILT="$4"
|
||||
NUTTX_BIN="$5"
|
||||
|
||||
AMEBA_BAUD="${AMEBA_BAUD:-1500000}"
|
||||
|
||||
if [ -z "$AMEBA_PORT" ]; then
|
||||
echo "FLASH error: Missing serial port device." >&2
|
||||
echo "USAGE: AMEBA_PORT=/dev/ttyUSB0 [AMEBA_BAUD=$AMEBA_BAUD] <flash cmd>" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
BOOT_OFFSET=$(awk '$2=="CONFIG_FLASH_BOOT_OFFSET"{print $3}' "$AUTOCONF" 2>/dev/null)
|
||||
APP_OFFSET=$(awk '$2 ~ /^CONFIG_FLASH_(APP_)?OTA1_OFFSET$/{print $3}' \
|
||||
"$AUTOCONF" 2>/dev/null)
|
||||
if [ -z "$BOOT_OFFSET" ] || [ -z "$APP_OFFSET" ]; then
|
||||
echo "FLASH error: could not read flash offsets from $AUTOCONF" >&2
|
||||
echo " Build first so platform_autoconf.h is generated." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
AMEBAPY="$(cat "$SDK/.amebapy/bindir" 2>/dev/null)/python"
|
||||
[ -x "$AMEBAPY" ] || AMEBAPY="python3"
|
||||
|
||||
SCRIPT="$SDK/tools/ameba/Flash/AmebaFlash.py"
|
||||
[ -f "$SCRIPT" ] || { echo "FLASH error: AmebaFlash.py not found at $SCRIPT" >&2; exit 1; }
|
||||
|
||||
PROFILE="$SDK/tools/ameba/Flash/Devices/Profiles/$PROFILE_NAME.rdev"
|
||||
[ -f "$PROFILE" ] || { echo "FLASH error: profile not found: $PROFILE" >&2; exit 1; }
|
||||
|
||||
for spec in "$PREBUILT/boot.bin:$BOOT_OFFSET" "$NUTTX_BIN:$APP_OFFSET"; do
|
||||
IMG="${spec%:*}"
|
||||
ADDR="${spec##*:}"
|
||||
if [ ! -f "$IMG" ]; then
|
||||
echo "FLASH error: image not found: $IMG (build first)" >&2
|
||||
exit 1
|
||||
fi
|
||||
echo "FLASH: $IMG @ $ADDR"
|
||||
"$AMEBAPY" "$SCRIPT" \
|
||||
--download \
|
||||
--profile "$PROFILE" \
|
||||
--memory-type nor \
|
||||
--image "$IMG" \
|
||||
--start-address "$ADDR" \
|
||||
--port "$AMEBA_PORT" \
|
||||
--baudrate "$AMEBA_BAUD" \
|
||||
--log-level info
|
||||
done
|
||||
69
arch/arm/src/common/ameba/tools/ameba_gen_ldscript.sh
Executable file
69
arch/arm/src/common/ameba/tools/ameba_gen_ldscript.sh
Executable file
|
|
@ -0,0 +1,69 @@
|
|||
#!/bin/sh
|
||||
############################################################################
|
||||
# arch/arm/src/common/ameba/tools/ameba_gen_ldscript.sh
|
||||
#
|
||||
# Generate the combined Ameba AP image2 linker script (ld.script.gen) the
|
||||
# `nuttx` ELF is linked with, WITHOUT editing any SDK source file. This is the
|
||||
# single implementation of the three-step recipe the make PREBUILD used inline,
|
||||
# so the make and cmake builds produce a byte-identical script:
|
||||
#
|
||||
# 1. C-preprocess ameba_img2_all.ld (it #includes ameba_layout.ld and the
|
||||
# config-derived platform_autoconf.h, staged as
|
||||
# project_<proj>/platform_autoconf.h on the include path).
|
||||
# 2. Append ameba_rom_symbol_acut_s.ld (ROM symbol addresses).
|
||||
# 3. Fold NuttX's .vectors orphan section into the loadable SRAM data region
|
||||
# so the large power-of-two aligned vector table does not land in and
|
||||
# overflow the tiny fixed KM4_IMG2_ENTRY region.
|
||||
#
|
||||
# This reproduces the SDK-generated rlx8721d.ld; the SDK tree stays read-only.
|
||||
#
|
||||
# Usage: ameba_gen_ldscript.sh <cc> <img2_ld> <rom_ld> <autoconf> \
|
||||
# <prebuilt_dir> <ap_project> <out>
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
set -e
|
||||
|
||||
CC="$1"
|
||||
IMG2_LD="$2"
|
||||
ROM_LD="$3"
|
||||
AUTOCONF="$4"
|
||||
PREBUILT="$5"
|
||||
AP_PROJECT="$6"
|
||||
OUT="$7"
|
||||
|
||||
if [ -z "$CC" ] || [ -z "$IMG2_LD" ] || [ -z "$ROM_LD" ] || [ -z "$AUTOCONF" ] \
|
||||
|| [ -z "$PREBUILT" ] || [ -z "$AP_PROJECT" ] || [ -z "$OUT" ]; then
|
||||
echo "usage: ameba_gen_ldscript.sh <cc> <img2_ld> <rom_ld> <autoconf>" \
|
||||
"<prebuilt_dir> <ap_project> <out>" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Stage the autoconf where ameba_img2_all.ld's #include resolves it (-I prebuilt
|
||||
# then #include "project_<proj>/platform_autoconf.h").
|
||||
mkdir -p "$PREBUILT/project_$AP_PROJECT"
|
||||
cp "$AUTOCONF" "$PREBUILT/project_$AP_PROJECT/platform_autoconf.h"
|
||||
|
||||
# 1) preprocess, 2) append ROM symbols
|
||||
"$CC" -E -P -xc -c "$IMG2_LD" -o "$OUT" -I "$PREBUILT"
|
||||
cat "$ROM_LD" >> "$OUT"
|
||||
|
||||
# 3) fold NuttX .vectors into the loadable SRAM data region
|
||||
sed -i 's|^\([[:space:]]*\)\*(\.data\*)|\1*(.vectors*)\n\1*(.data*)|' "$OUT"
|
||||
164
arch/arm/src/common/ameba/tools/ameba_package.sh
Executable file
164
arch/arm/src/common/ameba/tools/ameba_package.sh
Executable file
|
|
@ -0,0 +1,164 @@
|
|||
#!/bin/sh
|
||||
############################################################################
|
||||
# arch/arm/src/common/ameba/tools/ameba_package.sh
|
||||
#
|
||||
# Package the linked Ameba AP image2 ELF (`nuttx`) into a flashable nuttx.bin,
|
||||
# folding the prototype package_app.sh into the NuttX build. This is the single
|
||||
# implementation of the make-side ameba_board.mk POSTBUILD, invoked from both
|
||||
# the make POSTBUILD and the cmake nuttx_post_build target so the two build
|
||||
# systems produce an identical image. Steps:
|
||||
#
|
||||
# 1. Replicate the SDK image2 postbuild prologue (copy map/axf, nm/objdump).
|
||||
# 2. (Re)build the NP (km0) image2 + boot from the pinned SDK source, fed the
|
||||
# AP disassembly so the WiFi "noused" generator keeps only referenced APIs
|
||||
# (must run AFTER the AP link -- see ameba_build_np.sh).
|
||||
# 3. Run the SDK AP (km4) image2 postbuild.cmake (axf2bin) -> km4_image2_all.bin.
|
||||
# 4. Run the SDK firmware_package postbuild.cmake combining the AP + NP image2
|
||||
# into the packed app image, copied out as nuttx.bin.
|
||||
#
|
||||
# Unlike the make build (whose parse-time toolchain.mk puts asdk on PATH), this
|
||||
# script runs in the build tool's environment, so it resolves the SDK-pinned
|
||||
# asdk toolchain + prebuilts + python venv itself and prepends them to PATH.
|
||||
#
|
||||
# Usage: ameba_package.sh <sdk> <py_soc> <soc_name> <prebuilt> <ap_project> \
|
||||
# <km_proj> <np_target> <toolchain_dir> <nuttx_elf> \
|
||||
# <out_bin>
|
||||
#
|
||||
# <np_target> NP-core image name (km0 on RTL8721Dx, km4ns on RTL8720F)
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
set -e
|
||||
|
||||
SDK="$1"
|
||||
PY_SOC="$2"
|
||||
SOC_NAME="$3"
|
||||
PREBUILT="$4"
|
||||
AP_PROJECT="$5"
|
||||
KM_PROJ="$6"
|
||||
NP_TARGET="$7"
|
||||
TCDIR="${8:-$HOME/rtk-toolchain}"
|
||||
NUTTX_ELF="$9"
|
||||
OUT_BIN="${10}"
|
||||
|
||||
TOOLS_DIR=$(CDPATH= cd "$(dirname "$0")" && pwd)
|
||||
|
||||
if [ -z "$SDK" ] || [ -z "$OUT_BIN" ]; then
|
||||
echo "usage: ameba_package.sh <sdk> <py_soc> <soc_name> <prebuilt>" \
|
||||
"<ap_project> <km_proj> <np_target> <toolchain_dir> <nuttx_elf>" \
|
||||
"<out_bin>" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "PACK: nuttx.bin (Ameba AP $AP_PROJECT image2 + NP $NP_TARGET image2)"
|
||||
|
||||
# --- Resolve the SDK-pinned asdk toolchain + prebuilts + venv onto PATH ------
|
||||
|
||||
VER=$(sed -n 's/.*v_ASDK_VER[ \t][ \t]*\([0-9.][0-9.]*\).*/\1/p' \
|
||||
"$SDK/cmake/global_define.cmake")
|
||||
TC_CMAKE="$SDK/cmake/toolchain/ameba-toolchain-asdk-$VER.cmake"
|
||||
BUILD=$(sed -n 's/.*ToolChainVerMinor[ \t][ \t]*\([0-9][0-9]*\).*/\1/p' "$TC_CMAKE")
|
||||
ASDK_BIN="$TCDIR/asdk-$VER-$BUILD/linux/newlib/bin"
|
||||
[ -d "$ASDK_BIN" ] && PATH="$ASDK_BIN:$PATH"
|
||||
|
||||
PBV=$(sed -n 's/^PREBUILTS_VERSION=//p' "$SDK/env.sh" | head -1)
|
||||
[ -n "$PBV" ] && PATH="$TCDIR/prebuilts-linux-$PBV/bin:$PATH"
|
||||
|
||||
# Provision + resolve the python interpreter the SDK cmake steps need.
|
||||
sh "$TOOLS_DIR/ameba_setup_env.sh" "$SDK" "$TCDIR"
|
||||
VENV_BIN=$(cat "$SDK/.amebapy/bindir" 2>/dev/null || true)
|
||||
[ -n "$VENV_BIN" ] && PATH="$VENV_BIN:$PATH"
|
||||
export PATH
|
||||
|
||||
CROSSDEV=arm-none-eabi-
|
||||
NM="${CROSSDEV}nm"
|
||||
OBJDUMP="${CROSSDEV}objdump"
|
||||
STRIP="${CROSSDEV}strip"
|
||||
OBJCOPY="${CROSSDEV}objcopy"
|
||||
SIZE="${CROSSDEV}size"
|
||||
CMAKE="${CMAKE:-cmake}"
|
||||
|
||||
SOC_PROJ="$SDK/component/soc/$SOC_NAME/project"
|
||||
KM4_PROJ="$SOC_PROJ/$KM_PROJ"
|
||||
PKGDIR="$PREBUILT/pkg"
|
||||
|
||||
# --- 1. image2 postbuild prologue -------------------------------------------
|
||||
|
||||
rm -rf "$PKGDIR"
|
||||
mkdir -p "$PKGDIR"
|
||||
cp "$NUTTX_ELF" "$PKGDIR/target_img2.axf"
|
||||
"$NM" "$PKGDIR/target_img2.axf" | sort > "$PKGDIR/target_img2.map"
|
||||
"$OBJDUMP" -d "$PKGDIR/target_img2.axf" > "$PKGDIR/target_img2.asm"
|
||||
|
||||
# --- 2. (re)build NP (km0) image2 from SDK source, fed the AP disassembly ----
|
||||
|
||||
sh "$TOOLS_DIR/ameba_build_np.sh" "$SDK" "$PY_SOC" "$PREBUILT" \
|
||||
"$PKGDIR/target_img2.asm" "$NP_TARGET" "$AP_PROJECT"
|
||||
|
||||
cp "$PKGDIR/target_img2.axf" "$PKGDIR/target_pure_img2.axf"
|
||||
"$STRIP" "$PKGDIR/target_pure_img2.axf"
|
||||
cp "$PREBUILT/config_km4" "$PKGDIR/.config_km4"
|
||||
cp "$PREBUILT/config_fw" "$PKGDIR/.config"
|
||||
cp "$PREBUILT/${NP_TARGET}_image2_all.bin" "$PKGDIR/${NP_TARGET}_image2_all.bin"
|
||||
printf '{\n "soc": {\n "name": "%s"\n }\n}\n' "$PY_SOC" \
|
||||
> "$PKGDIR/soc_info.json"
|
||||
|
||||
# --- 3. AP (km4) image2 axf2bin -> km4_image2_all.bin -----------------------
|
||||
|
||||
TARGET_SOC="$PY_SOC" "$CMAKE" \
|
||||
-Dc_BASEDIR="$SDK" \
|
||||
-Dc_CMAKE_FILES_DIR="$SDK/cmake" \
|
||||
-Dc_SOC_PROJECT_DIR="$SOC_PROJ" \
|
||||
-Dc_MCU_PROJECT_DIR="$KM4_PROJ" \
|
||||
-Dc_MCU_PROJECT_NAME="$AP_PROJECT" \
|
||||
-Dc_MCU_KCONFIG_FILE="$PKGDIR/.config_km4" \
|
||||
-Dc_SDK_IMAGE_TARGET_DIR="$PKGDIR" \
|
||||
-DKM4_BUILDDIR= \
|
||||
-DFINAL_IMAGE_DIR="$PKGDIR" \
|
||||
-DBUILD_TYPE=NONE -DANALYZE_MP_IMG=0 -DDAILY_BUILD=0 \
|
||||
-DEXTERN_DIR="$PKGDIR" -DCODE_ANALYZE_RETRY= \
|
||||
-DIMAGESCRIPTDIR="$SDK/tools/image_scripts" \
|
||||
-DCMAKE_SIZE="$SIZE" -DCMAKE_OBJCOPY="$OBJCOPY" \
|
||||
-P "$KM4_PROJ/make/image2/postbuild.cmake"
|
||||
|
||||
# --- 4. firmware_package: combine AP + NP image2 -> app.bin -> nuttx.bin -----
|
||||
|
||||
TARGET_SOC="$PY_SOC" "$CMAKE" \
|
||||
-Dc_BASEDIR="$SDK" \
|
||||
-Dc_CMAKE_FILES_DIR="$SDK/cmake" \
|
||||
-Dc_MCU_KCONFIG_FILE="$PKGDIR/.config" \
|
||||
-Dc_SOC_PROJECT_DIR="$SOC_PROJ" \
|
||||
-Dc_SDK_IMAGE_TARGET_DIR= \
|
||||
-Dc_IMAGE_OUTPUT_DIR="$PKGDIR" \
|
||||
-Dc_APP_BINARY_NAME=app.bin \
|
||||
-Dc_IMAGE1_ALL_FILES= \
|
||||
-Dc_IMAGE2_ALL_FILES="$PKGDIR/${NP_TARGET}_image2_all.bin;$PKGDIR/${AP_PROJECT}_image2_all.bin" \
|
||||
-Dc_IMAGE3_ALL_FILES= \
|
||||
-DFINAL_IMAGE_DIR="$PKGDIR" \
|
||||
-DANALYZE_MP_IMG=0 -DEXTERN_DIR="$PKGDIR" \
|
||||
-P "$SOC_PROJ/postbuild.cmake"
|
||||
|
||||
cp "$PKGDIR/app.bin" "$OUT_BIN"
|
||||
echo "PACK: wrote $OUT_BIN"
|
||||
# Flash hint is caller-supplied (AMEBA_FLASH_HINT) so the make and cmake build
|
||||
# paths each print their own flash command; printed only when provided.
|
||||
if [ -n "$AMEBA_FLASH_HINT" ]; then
|
||||
echo " Flash with: $AMEBA_FLASH_HINT"
|
||||
fi
|
||||
|
|
@ -29,6 +29,12 @@ set(AMEBA_COMMON ${CMAKE_CURRENT_LIST_DIR}/../common/ameba)
|
|||
|
||||
list(APPEND SRCS ${AMEBA_COMMON}/ameba_os_wrap.c)
|
||||
|
||||
# km4tz<->km4ns IPC bring-up: needed by the SDK flash erase/program path
|
||||
# (inter-core XIP pause) AND by WiFi, so compile it whenever either is enabled.
|
||||
if(CONFIG_RTL8720F_WIFI OR CONFIG_RTL8720F_FLASH_FS)
|
||||
list(APPEND SRCS ameba_ipc.c)
|
||||
endif()
|
||||
|
||||
if(CONFIG_RTL8720F_WIFI)
|
||||
list(APPEND SRCS ameba_wifi_init.c ${AMEBA_COMMON}/ameba_kv.c)
|
||||
if(CONFIG_NET)
|
||||
|
|
@ -42,3 +48,136 @@ endif()
|
|||
|
||||
target_include_directories(arch PRIVATE ${AMEBA_COMMON})
|
||||
target_sources(arch PRIVATE ${SRCS})
|
||||
|
||||
# ##############################################################################
|
||||
# Vendor-SDK build machinery (shared mechanism in common/ameba/cmake). This
|
||||
# IC's differing inputs are set here (RTL8720F: km4tz AP core, km4ns NP core).
|
||||
# ##############################################################################
|
||||
|
||||
set(AMEBA_SOC_NAME RTL8720F)
|
||||
set(AMEBA_PY_SOC RTL8720F)
|
||||
set(AMEBA_AP_PROJECT km4tz)
|
||||
set(AMEBA_KM_PROJ project_km4tz)
|
||||
set(AMEBA_NP_TARGET km4ns)
|
||||
set(AMEBA_CFG_WIFI ${CONFIG_RTL8720F_WIFI})
|
||||
set(AMEBA_CFG_FLASHFS ${CONFIG_RTL8720F_FLASH_FS})
|
||||
|
||||
# Resolve AMEBA_SDK / asdk toolchain (provisioned by `. tools/ameba/env.sh`)
|
||||
# before the SDK-relative source lists below reference it.
|
||||
include(${AMEBA_COMMON}/cmake/ameba_sdk.cmake)
|
||||
|
||||
set(AMEBA_SOC ${AMEBA_SDK}/component/soc/${AMEBA_SOC_NAME})
|
||||
set(AMEBA_PREBUILT ${NUTTX_BOARD_DIR}/prebuilt)
|
||||
set(AMEBA_WIFI_DIR ${AMEBA_COMMON}/wifi)
|
||||
|
||||
# fwlib register-layer sources compiled into libameba_fwlib.a, plus the
|
||||
# NuttX-owned image2 entry (ameba_app_start.c, IC-specific).
|
||||
set(AMEBA_FWLIB_SRCS
|
||||
${AMEBA_SOC}/fwlib/ram_common/ameba_arch.c
|
||||
${AMEBA_SOC}/fwlib/ram_common/ameba_loguart.c
|
||||
${AMEBA_SOC}/fwlib/ram_common/ameba_ipc_api.c
|
||||
${AMEBA_SOC}/fwlib/ram_common/ameba_ipc_ram.c
|
||||
${AMEBA_SOC}/fwlib/ram_common/ameba_clk.c
|
||||
${AMEBA_SOC}/fwlib/ram_common/ameba_pmctimer.c
|
||||
${AMEBA_SOC}/fwlib/ram_common/ameba_pmu.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/ameba_app_start.c
|
||||
${AMEBA_SOC}/fwlib/ram_common/ameba_mpu_ram.c
|
||||
${AMEBA_SOC}/fwlib/ram_km4tz/ameba_data_flashclk.c
|
||||
${AMEBA_SOC}/fwlib/ram_km4tz/ameba_flashclk.c
|
||||
${AMEBA_SOC}/fwlib/ram_km4tz/ameba_pinmap.c
|
||||
${AMEBA_SDK}/component/soc/usrcfg/${AMEBA_SOC_NAME}/ameba_flashcfg.c
|
||||
${AMEBA_SDK}/component/soc/usrcfg/${AMEBA_SOC_NAME}/ameba_pinmapcfg.c)
|
||||
|
||||
if(CONFIG_RTL8720F_FLASH_FS)
|
||||
list(APPEND AMEBA_FWLIB_SRCS ${AMEBA_SOC}/fwlib/ram_common/ameba_flash_ram.c)
|
||||
endif()
|
||||
|
||||
# Silence a couple of warnings the vendored SDK sources trip under NuttX's
|
||||
# warning set, scoped to this fwlib compile only (never relaxing NuttX's own):
|
||||
# -Wno-int-conversion: the SDK passes NULL to irq_register()'s u32 "Data"
|
||||
# (interrupt context) argument in many places -- an intentional idiom.
|
||||
# -Wno-shadow: SDK swlib/log.c shadows a file-scope global with a parameter.
|
||||
set(AMEBA_FWLIB_INC
|
||||
-Wno-int-conversion
|
||||
-Wno-shadow
|
||||
-I${AMEBA_COMMON}/sdk_shim
|
||||
-I${AMEBA_SOC}/fwlib/include
|
||||
-I${AMEBA_SOC}/fwlib/include/rom
|
||||
-I${AMEBA_SOC}/swlib
|
||||
-I${AMEBA_SOC}/hal/include
|
||||
-I${AMEBA_SOC}/hal/src
|
||||
-I${AMEBA_SDK}/component/soc/common/include
|
||||
-I${AMEBA_SDK}/component/soc/common/include/cmsis
|
||||
-I${AMEBA_SOC}/app/monitor/include
|
||||
-I${AMEBA_SDK}/component/soc/usrcfg/${AMEBA_SOC_NAME}/include
|
||||
-I${AMEBA_SDK}/component/soc/usrcfg/common
|
||||
-I${AMEBA_SOC}/misc
|
||||
-I${AMEBA_SDK}/component/os/os_wrapper/include
|
||||
-I${AMEBA_SDK}/component/ssl/mbedtls-3.6.5/include
|
||||
-I${AMEBA_SDK}/component/soc/common/crashdump/include
|
||||
-I${AMEBA_PREBUILT})
|
||||
|
||||
# Host WiFi glue -> libameba_wifi.a (identical source/include set to the other
|
||||
# Ameba ICs; shim include first, SDK autoconf force-included).
|
||||
set(AMEBA_WIFI_SRCS
|
||||
${AMEBA_SDK}/component/soc/usrcfg/${AMEBA_SOC_NAME}/ameba_wificfg.c
|
||||
${AMEBA_SDK}/component/wifi/common/rtw_task_size.c
|
||||
${AMEBA_SDK}/component/wifi/common/rtw_event.c
|
||||
${AMEBA_SDK}/component/soc/common/diagnose/ameba_diagnose_none.c
|
||||
${AMEBA_SDK}/component/wifi/wpa_supplicant/wpa_supplicant/wifi_p2p_disable.c
|
||||
${AMEBA_WIFI_DIR}/ameba_wifi_depend.c
|
||||
${AMEBA_WIFI_DIR}/ameba_wifi.c)
|
||||
|
||||
set(AMEBA_WIFI_INC
|
||||
-include
|
||||
${AMEBA_PREBUILT}/platform_autoconf.h
|
||||
-include
|
||||
${AMEBA_WIFI_DIR}/include/ameba_lwip_off.h
|
||||
-I${AMEBA_WIFI_DIR}/include
|
||||
-I${AMEBA_WIFI_DIR}/..
|
||||
-I${AMEBA_SDK}/component/wifi/api
|
||||
-I${AMEBA_SDK}/component/wifi/common
|
||||
-I${AMEBA_SDK}/component/wifi/driver/include
|
||||
-I${AMEBA_SDK}/component/wifi/driver/intf
|
||||
-I${AMEBA_SDK}/component/wifi/whc
|
||||
-I${AMEBA_SDK}/component/wifi/whc/whc_host_rtos
|
||||
-I${AMEBA_SDK}/component/wifi/whc/whc_host_rtos/ipc
|
||||
-I${AMEBA_SDK}/component/at_cmd
|
||||
-I${AMEBA_SDK}/component/wifi/wpa_supplicant/wpa_supplicant
|
||||
-I${AMEBA_SDK}/component/wifi/wpa_supplicant/wpa_lite
|
||||
-I${AMEBA_SDK}/component/wifi/wpa_supplicant/wpa_lite/rom
|
||||
-I${AMEBA_SDK}/component/wifi/wpa_supplicant/src
|
||||
-I${AMEBA_SDK}/component/wifi/wpa_supplicant/src/utils
|
||||
-I${AMEBA_SDK}/component/wifi/rtk_app/wifi_auto_reconnect
|
||||
-I${AMEBA_SDK}/component/network
|
||||
-I${AMEBA_SDK}/component/soc/common/diagnose
|
||||
-I${AMEBA_SOC}/app/monitor/include
|
||||
-I${AMEBA_SOC}/fwlib/include
|
||||
-I${AMEBA_SOC}/fwlib/include/rom
|
||||
-I${AMEBA_SOC}/swlib
|
||||
-I${AMEBA_SOC}/hal/include
|
||||
-I${AMEBA_SOC}/misc
|
||||
-I${AMEBA_SDK}/component/soc/common/include
|
||||
-I${AMEBA_SDK}/component/soc/common/include/cmsis
|
||||
-I${AMEBA_SDK}/component/os/os_wrapper/include
|
||||
-I${AMEBA_SDK}/component/soc/usrcfg/${AMEBA_SOC_NAME}/include
|
||||
-I${AMEBA_SDK}/component/soc/usrcfg/common
|
||||
-I${AMEBA_SDK}/component/ssl/mbedtls-3.6.5/include
|
||||
-I${AMEBA_PREBUILT})
|
||||
|
||||
# KM4TZ-side host WiFi control libs. Unlike RTL8721Dx, lib_coex.a is NP-side
|
||||
# (km4ns) on RTL8720F and is NOT linked into the AP image.
|
||||
set(_ameba_app_lib ${AMEBA_SOC}/project/${AMEBA_KM_PROJ}/lib/application)
|
||||
set(AMEBA_WIFI_APP_LIBS
|
||||
${_ameba_app_lib}/lib_wifi_whc_ap.a ${_ameba_app_lib}/lib_wifi_rtk_app.a
|
||||
${_ameba_app_lib}/lib_wifi_com_sec.a ${_ameba_app_lib}/lib_wpa_lite.a)
|
||||
|
||||
# RTL8720F pulls the ROM symbol implementations from lib_rom.a via a
|
||||
# whole-archive link (TrustZone off in this config -> lib_rom.a, not
|
||||
# lib_rom_tz.a), in addition to the ROM symbol addresses appended to the
|
||||
# generated ld script.
|
||||
set(_ameba_soc_lib ${AMEBA_SOC}/project/${AMEBA_KM_PROJ}/lib/soc)
|
||||
set(AMEBA_EXTRA_LINK_OPTIONS -Wl,--whole-archive ${_ameba_soc_lib}/lib_rom.a
|
||||
-Wl,--no-whole-archive)
|
||||
|
||||
include(${AMEBA_COMMON}/cmake/ameba_board.cmake)
|
||||
|
|
|
|||
|
|
@ -42,3 +42,136 @@ endif()
|
|||
|
||||
target_include_directories(arch PRIVATE ${AMEBA_COMMON})
|
||||
target_sources(arch PRIVATE ${SRCS})
|
||||
|
||||
# ##############################################################################
|
||||
# Vendor-SDK build machinery (SDK libs, image2 ld script, link flags, nuttx.bin
|
||||
# packaging). This IC's differing inputs are set here; the shared mechanism
|
||||
# lives in common/ameba/cmake/ameba_board.cmake (mirrors the make-side split
|
||||
# between arch/.../rtl8721dx/Make.defs + ameba_board.mk and its board wrapper).
|
||||
# ##############################################################################
|
||||
|
||||
# Per-IC identifiers (see the make ameba_board.mk of the same names).
|
||||
set(AMEBA_SOC_NAME amebadplus)
|
||||
set(AMEBA_PY_SOC RTL8721Dx)
|
||||
set(AMEBA_AP_PROJECT km4)
|
||||
set(AMEBA_KM_PROJ project_km4)
|
||||
set(AMEBA_NP_TARGET km0)
|
||||
set(AMEBA_CFG_WIFI ${CONFIG_RTL8721DX_WIFI})
|
||||
set(AMEBA_CFG_FLASHFS ${CONFIG_RTL8721DX_FLASH_FS})
|
||||
|
||||
# Resolve AMEBA_SDK / asdk toolchain (provisioned by `. tools/ameba/env.sh`)
|
||||
# before the SDK-relative source lists below reference it.
|
||||
include(${AMEBA_COMMON}/cmake/ameba_sdk.cmake)
|
||||
|
||||
set(AMEBA_SOC ${AMEBA_SDK}/component/soc/${AMEBA_SOC_NAME})
|
||||
set(AMEBA_PREBUILT ${NUTTX_BOARD_DIR}/prebuilt)
|
||||
set(AMEBA_WIFI_DIR ${AMEBA_COMMON}/wifi)
|
||||
|
||||
# fwlib register-layer sources compiled from SDK source into libameba_fwlib.a,
|
||||
# plus the NuttX-owned image2 entry (ameba_app_start.c, IC-specific).
|
||||
set(AMEBA_FWLIB_SRCS
|
||||
${AMEBA_SOC}/fwlib/ram_common/ameba_arch.c
|
||||
${AMEBA_SOC}/fwlib/ram_common/ameba_loguart.c
|
||||
${AMEBA_SOC}/fwlib/ram_common/ameba_ipc_api.c
|
||||
${AMEBA_SOC}/fwlib/ram_common/ameba_ipc_ram.c
|
||||
${AMEBA_SOC}/misc/ameba_pmu.c
|
||||
${AMEBA_SOC}/swlib/log.c
|
||||
${AMEBA_SOC}/swlib/sscanf_minimal.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/ameba_app_start.c
|
||||
${AMEBA_SOC}/fwlib/ram_common/ameba_mpu_ram.c
|
||||
${AMEBA_SOC}/fwlib/ram_common/ameba_bor.c
|
||||
${AMEBA_SOC}/fwlib/ram_common/ameba_reset.c
|
||||
${AMEBA_SOC}/fwlib/ram_common/ameba_clk.c
|
||||
${AMEBA_SOC}/fwlib/ram_common/ameba_rtc_io.c
|
||||
${AMEBA_SOC}/fwlib/ram_common/ameba_adc.c
|
||||
${AMEBA_SOC}/fwlib/ram_km4/ameba_data_flashclk.c)
|
||||
|
||||
if(CONFIG_RTL8721DX_FLASH_FS)
|
||||
list(APPEND AMEBA_FWLIB_SRCS ${AMEBA_SOC}/fwlib/ram_common/ameba_flash_ram.c)
|
||||
endif()
|
||||
|
||||
# Silence a couple of warnings the vendored SDK sources trip under NuttX's
|
||||
# warning set, scoped to this fwlib compile only (never relaxing NuttX's own):
|
||||
# -Wno-int-conversion: the SDK passes NULL to irq_register()'s u32 "Data"
|
||||
# (interrupt context) argument in many places -- an intentional idiom.
|
||||
# -Wno-shadow: SDK swlib/log.c shadows a file-scope global with a parameter.
|
||||
set(AMEBA_FWLIB_INC
|
||||
-Wno-int-conversion
|
||||
-Wno-shadow
|
||||
-mcmse
|
||||
-I${AMEBA_COMMON}/sdk_shim
|
||||
-I${AMEBA_SOC}/fwlib/include
|
||||
-I${AMEBA_SOC}/fwlib/include/rom
|
||||
-I${AMEBA_SOC}/swlib
|
||||
-I${AMEBA_SOC}/hal/include
|
||||
-I${AMEBA_SOC}/hal/src
|
||||
-I${AMEBA_SDK}/component/soc/common/include
|
||||
-I${AMEBA_SDK}/component/soc/common/include/cmsis
|
||||
-I${AMEBA_SOC}/app/monitor/include
|
||||
-I${AMEBA_SDK}/component/soc/usrcfg/${AMEBA_SOC_NAME}/include
|
||||
-I${AMEBA_SDK}/component/soc/usrcfg/common
|
||||
-I${AMEBA_SOC}/misc
|
||||
-I${AMEBA_SDK}/component/os/os_wrapper/include
|
||||
-I${AMEBA_SDK}/component/soc/common/crashdump/include
|
||||
-I${AMEBA_PREBUILT})
|
||||
|
||||
# Host WiFi glue -> libameba_wifi.a (built with the vendor WiFi include set; the
|
||||
# shim include dir comes FIRST so its <lwip_netconf.h> shadows the SDK's, and
|
||||
# the SDK autoconf is force-included so every source sees the vendor WiFi config
|
||||
# macros).
|
||||
set(AMEBA_WIFI_SRCS
|
||||
${AMEBA_SDK}/component/soc/usrcfg/${AMEBA_SOC_NAME}/ameba_wificfg.c
|
||||
${AMEBA_SDK}/component/wifi/common/rtw_task_size.c
|
||||
${AMEBA_SDK}/component/wifi/common/rtw_event.c
|
||||
${AMEBA_SDK}/component/soc/common/diagnose/ameba_diagnose_none.c
|
||||
${AMEBA_SDK}/component/wifi/wpa_supplicant/wpa_supplicant/wifi_p2p_disable.c
|
||||
${AMEBA_WIFI_DIR}/ameba_wifi_depend.c
|
||||
${AMEBA_WIFI_DIR}/ameba_wifi.c)
|
||||
|
||||
set(AMEBA_WIFI_INC
|
||||
-include
|
||||
${AMEBA_PREBUILT}/platform_autoconf.h
|
||||
-include
|
||||
${AMEBA_WIFI_DIR}/include/ameba_lwip_off.h
|
||||
-I${AMEBA_WIFI_DIR}/include
|
||||
-I${AMEBA_WIFI_DIR}/..
|
||||
-I${AMEBA_SDK}/component/wifi/api
|
||||
-I${AMEBA_SDK}/component/wifi/common
|
||||
-I${AMEBA_SDK}/component/wifi/driver/include
|
||||
-I${AMEBA_SDK}/component/wifi/driver/intf
|
||||
-I${AMEBA_SDK}/component/wifi/whc
|
||||
-I${AMEBA_SDK}/component/wifi/whc/whc_host_rtos
|
||||
-I${AMEBA_SDK}/component/wifi/whc/whc_host_rtos/ipc
|
||||
-I${AMEBA_SDK}/component/at_cmd
|
||||
-I${AMEBA_SDK}/component/wifi/wpa_supplicant/wpa_supplicant
|
||||
-I${AMEBA_SDK}/component/wifi/wpa_supplicant/wpa_lite
|
||||
-I${AMEBA_SDK}/component/wifi/wpa_supplicant/wpa_lite/rom
|
||||
-I${AMEBA_SDK}/component/wifi/wpa_supplicant/src
|
||||
-I${AMEBA_SDK}/component/wifi/wpa_supplicant/src/utils
|
||||
-I${AMEBA_SDK}/component/wifi/rtk_app/wifi_auto_reconnect
|
||||
-I${AMEBA_SDK}/component/network
|
||||
-I${AMEBA_SDK}/component/soc/common/diagnose
|
||||
-I${AMEBA_SOC}/app/monitor/include
|
||||
-I${AMEBA_SOC}/fwlib/include
|
||||
-I${AMEBA_SOC}/fwlib/include/rom
|
||||
-I${AMEBA_SOC}/swlib
|
||||
-I${AMEBA_SOC}/hal/include
|
||||
-I${AMEBA_SOC}/misc
|
||||
-I${AMEBA_SDK}/component/soc/common/include
|
||||
-I${AMEBA_SDK}/component/soc/common/include/cmsis
|
||||
-I${AMEBA_SDK}/component/os/os_wrapper/include
|
||||
-I${AMEBA_SDK}/component/soc/usrcfg/${AMEBA_SOC_NAME}/include
|
||||
-I${AMEBA_SDK}/component/soc/usrcfg/common
|
||||
-I${AMEBA_SDK}/component/ssl/mbedtls-3.6.5/include
|
||||
-I${AMEBA_PREBUILT})
|
||||
|
||||
# KM4-side host WiFi control libs from the pinned SDK (STA-PSK reduced set).
|
||||
# lib_coex.a is an AP-side lib on RTL8721Dx (contrast RTL8720F, where it is
|
||||
# NP-side and not linked here).
|
||||
set(_ameba_app_lib ${AMEBA_SOC}/project/${AMEBA_KM_PROJ}/lib/application)
|
||||
set(AMEBA_WIFI_APP_LIBS
|
||||
${_ameba_app_lib}/lib_wifi_whc_ap.a ${_ameba_app_lib}/lib_wifi_rtk_app.a
|
||||
${_ameba_app_lib}/lib_wifi_com_sec.a ${_ameba_app_lib}/lib_wpa_lite.a
|
||||
${_ameba_app_lib}/lib_coex.a)
|
||||
|
||||
include(${AMEBA_COMMON}/cmake/ameba_board.cmake)
|
||||
|
|
|
|||
|
|
@ -20,17 +20,9 @@
|
|||
#
|
||||
# ##############################################################################
|
||||
|
||||
# The RTL8720F (Ameba WHC) port currently builds via the make-based build only.
|
||||
# The CMake path does not yet wire up the vendor-SDK machinery (SDK fetch,
|
||||
# libameba_fwlib.a/libameba_wifi.a, the image2 entry ameba_app_start.c, the SDK
|
||||
# image2 linker-script generation, the NP-image build and the nuttx.bin
|
||||
# packaging) that boards/.../scripts/Make.defs -> arch/.../ameba_board.mk
|
||||
# provides, so a CMake configure would not produce a flashable image. Fail fast
|
||||
# with a clear message instead of half-building.
|
||||
message(
|
||||
FATAL_ERROR
|
||||
"rtl8720f_evb (RTL8720F, Ameba WHC) currently supports the make build "
|
||||
"only; CMake is not yet supported. Build with:\n"
|
||||
" ./tools/configure.sh rtl8720f_evb:nsh && make")
|
||||
# The vendor-SDK build machinery (SDK libs, image2 ld script, link flags and the
|
||||
# nuttx.bin packaging POSTBUILD / nuttx_post_build target) is wired up from the
|
||||
# shared arch/arm/src/common/ameba/cmake/ameba_board.cmake, included by this
|
||||
# IC's arch CMakeLists. Nothing IC- or board-specific is needed here.
|
||||
|
||||
add_subdirectory(src)
|
||||
|
|
|
|||
|
|
@ -24,4 +24,5 @@ set(SRCS rtl8720f_boot.c rtl8720f_bringup.c)
|
|||
|
||||
target_sources(board PRIVATE ${SRCS})
|
||||
|
||||
set_property(GLOBAL PROPERTY LD_SCRIPT "${NUTTX_BOARD_DIR}/scripts/ld.script")
|
||||
# LD_SCRIPT is not set here: the Ameba image2 linker script is generated
|
||||
# (prebuilt/ld.script.gen) and published by the shared ameba_board.cmake.
|
||||
|
|
|
|||
|
|
@ -20,17 +20,9 @@
|
|||
#
|
||||
# ##############################################################################
|
||||
|
||||
# The RTL8721Dx (Ameba WHC) port currently builds via the make-based build only.
|
||||
# The CMake path does not yet wire up the vendor-SDK machinery (SDK fetch,
|
||||
# libameba_fwlib.a/libameba_wifi.a, the image2 entry ameba_app_start.c, the SDK
|
||||
# image2 linker-script generation, the NP-image build and the nuttx.bin
|
||||
# packaging) that boards/.../scripts/Make.defs -> arch/.../ameba_board.mk
|
||||
# provides, so a CMake configure would not produce a flashable image. Fail fast
|
||||
# with a clear message instead of half-building.
|
||||
message(
|
||||
FATAL_ERROR
|
||||
"pke8721daf (RTL8721Dx, Ameba WHC) currently supports the make build "
|
||||
"only; CMake is not yet supported. Build with:\n"
|
||||
" ./tools/configure.sh pke8721daf:nsh && make")
|
||||
# The vendor-SDK build machinery (SDK libs, image2 ld script, link flags and the
|
||||
# nuttx.bin packaging POSTBUILD / nuttx_post_build target) is wired up from the
|
||||
# shared arch/arm/src/common/ameba/cmake/ameba_board.cmake, included by this
|
||||
# IC's arch CMakeLists. Nothing IC- or board-specific is needed here.
|
||||
|
||||
add_subdirectory(src)
|
||||
|
|
|
|||
|
|
@ -24,4 +24,5 @@ set(SRCS rtl8721dx_boot.c rtl8721dx_bringup.c)
|
|||
|
||||
target_sources(board PRIVATE ${SRCS})
|
||||
|
||||
set_property(GLOBAL PROPERTY LD_SCRIPT "${NUTTX_BOARD_DIR}/scripts/ld.script")
|
||||
# LD_SCRIPT is not set here: the Ameba image2 linker script is generated
|
||||
# (prebuilt/ld.script.gen) and published by the shared ameba_board.cmake.
|
||||
|
|
|
|||
|
|
@ -40,72 +40,17 @@
|
|||
|
||||
AMEBA_BAUD ?= 1500000
|
||||
|
||||
# Flash offsets are NOT hardcoded here: they are read from the SDK flash
|
||||
# layout, surfaced in the regenerated platform_autoconf.h (AMEBA_AUTOCONF)
|
||||
# on every build. This way a layout change (e.g. a bigger boot region that
|
||||
# pushes the app offset) is tracked automatically -- the .rdev profile only
|
||||
# supplies the on-chip flash-loader firmware, not the image placement.
|
||||
|
||||
# The app-slot macro is spelled CONFIG_FLASH_APP_OTA1_OFFSET on some ICs
|
||||
# (e.g. RTL8720F) and CONFIG_FLASH_OTA1_OFFSET on others (e.g. RTL8721Dx);
|
||||
# match either. boot is CONFIG_FLASH_BOOT_OFFSET on all.
|
||||
|
||||
AMEBA_BOOT_OFFSET = $(strip $(shell awk '$$2=="CONFIG_FLASH_BOOT_OFFSET"{print $$3}' $(AMEBA_AUTOCONF) 2>/dev/null))
|
||||
AMEBA_APP_OFFSET = $(strip $(shell awk '$$2 ~ /^CONFIG_FLASH_(APP_)?OTA1_OFFSET$$/{print $$3}' $(AMEBA_AUTOCONF) 2>/dev/null))
|
||||
|
||||
# FLASH -- Download the built images via the SDK's AmebaFlash.py
|
||||
#
|
||||
# Two images are written, each at its own offset:
|
||||
# boot.bin (SDK bootloader, prebuilt) @ CONFIG_FLASH_BOOT_OFFSET
|
||||
# nuttx.bin (AP+NP application image) @ CONFIG_FLASH_APP_OTA1_OFFSET
|
||||
# boot.bin stays in the board prebuilt/ dir; only nuttx.bin lives in $(TOPDIR).
|
||||
# FLASH -- Download boot.bin + nuttx.bin via the SDK's AmebaFlash.py. The whole
|
||||
# recipe (flash-offset lookup from the regenerated platform_autoconf.h, python /
|
||||
# .rdev-profile resolution, the two AmebaFlash.py downloads) lives in the shared
|
||||
# ameba_flash.sh, used by BOTH the make and cmake `flash` paths so they flash
|
||||
# identically. Serial port + baud are passed to it through the environment.
|
||||
|
||||
define FLASH
|
||||
$(Q) if [ -z "$(AMEBA_PORT)" ]; then \
|
||||
echo "FLASH error: Missing serial port device argument."; \
|
||||
echo "USAGE: make flash AMEBA_PORT=/dev/ttyUSB0 [ AMEBA_BAUD=$(AMEBA_BAUD) ]"; \
|
||||
exit 1; \
|
||||
fi
|
||||
$(Q) if [ -z "$(AMEBA_BOOT_OFFSET)" ] || [ -z "$(AMEBA_APP_OFFSET)" ]; then \
|
||||
echo "FLASH error: could not read flash offsets from"; \
|
||||
echo " $(AMEBA_AUTOCONF)"; \
|
||||
echo " Run make first so platform_autoconf.h is generated."; \
|
||||
exit 1; \
|
||||
fi
|
||||
$(Q) AMEBAPY="$$(cat $(AMEBA_SDK)/.amebapy/bindir 2>/dev/null)/python"; \
|
||||
if [ ! -x "$$AMEBAPY" ]; then \
|
||||
AMEBAPY="python3"; \
|
||||
fi; \
|
||||
SCRIPT="$(AMEBA_SDK)/tools/ameba/Flash/AmebaFlash.py"; \
|
||||
if [ ! -f "$$SCRIPT" ]; then \
|
||||
echo "FLASH error: AmebaFlash.py not found at $$SCRIPT"; \
|
||||
echo " Has the ameba-rtos SDK been fetched? Run make first."; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
PROFILE="$(AMEBA_SDK)/tools/ameba/Flash/Devices/Profiles/$(AMEBA_FLASH_PROFILE).rdev"; \
|
||||
if [ ! -f "$$PROFILE" ]; then \
|
||||
echo "FLASH error: profile not found: $$PROFILE"; \
|
||||
echo " Set AMEBA_FLASH_PROFILE in the board's Make.defs."; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
for spec in "$(AMEBA_PREBUILT)/boot.bin:$(AMEBA_BOOT_OFFSET)" \
|
||||
"$(TOPDIR)/nuttx.bin:$(AMEBA_APP_OFFSET)"; do \
|
||||
IMG="$${spec%:*}"; ADDR="$${spec##*:}"; \
|
||||
if [ ! -f "$$IMG" ]; then \
|
||||
echo "FLASH error: image not found: $$IMG (run make first)"; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
echo "FLASH: $$IMG @ $$ADDR"; \
|
||||
$$AMEBAPY "$$SCRIPT" \
|
||||
--download \
|
||||
--profile "$$PROFILE" \
|
||||
--memory-type nor \
|
||||
--image "$$IMG" \
|
||||
--start-address "$$ADDR" \
|
||||
--port "$(AMEBA_PORT)" \
|
||||
--baudrate "$(or $(AMEBA_BAUD),1500000)" \
|
||||
--log-level info || exit 1; \
|
||||
done
|
||||
$(Q) AMEBA_PORT="$(AMEBA_PORT)" AMEBA_BAUD="$(AMEBA_BAUD)" \
|
||||
$(AMEBA_COMMON_DIR)$(DELIM)tools$(DELIM)ameba_flash.sh \
|
||||
$(AMEBA_SDK) $(AMEBA_FLASH_PROFILE) $(AMEBA_AUTOCONF) \
|
||||
$(AMEBA_PREBUILT) $(TOPDIR)$(DELIM)nuttx.bin
|
||||
endef
|
||||
|
||||
# ameba_menuconfig -- edit the vendor SDK menuconfig for this board using the
|
||||
|
|
|
|||
115
tools/ameba/env.sh
Executable file
115
tools/ameba/env.sh
Executable file
|
|
@ -0,0 +1,115 @@
|
|||
#!/bin/sh
|
||||
############################################################################
|
||||
# tools/ameba/env.sh
|
||||
#
|
||||
# Source this before building the Realtek Ameba (RTL872x) boards:
|
||||
#
|
||||
# . tools/ameba/env.sh
|
||||
# cmake -B build -DBOARD_CONFIG=pke8721daf:nsh -GNinja && cmake --build build
|
||||
# -- or --
|
||||
# ./tools/configure.sh pke8721daf:nsh && make
|
||||
#
|
||||
# It resolves everything the build needs and exports it into the current shell,
|
||||
# reusing the same helper scripts the make build already uses (so make and cmake
|
||||
# share one setup path):
|
||||
#
|
||||
# 1. AMEBA_SDK -- the ameba-rtos SDK checkout (external $AMEBA_SDK if valid,
|
||||
# else the shared in-tree one, fetched on demand).
|
||||
# 2. asdk toolchain -- the SDK-pinned arm-none-eabi (asdk) compiler, fetched if
|
||||
# absent and prepended to PATH. This is why CMake works with
|
||||
# no per-chip toolchain hook: the compiler is simply on PATH
|
||||
# before `cmake` probes it, exactly like every other board.
|
||||
# 3. prebuilts + venv -- ninja/cmake bundle + the SDK python venv, prepended to
|
||||
# PATH for the image packaging steps.
|
||||
#
|
||||
# The make build does NOT require sourcing this (its Make.defs still auto-fetches
|
||||
# everything); it is optional there and REQUIRED for the CMake build.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
# --- Must be sourced (it exports into the caller's shell) ------------------
|
||||
|
||||
_ameba_self="${BASH_SOURCE:-${ZSH_VERSION:+${(%):-%x}}}"
|
||||
[ -n "$_ameba_self" ] || _ameba_self="$0"
|
||||
case "$0" in
|
||||
*env.sh)
|
||||
echo "ameba env.sh: source it, do not execute -- '. tools/ameba/env.sh'" >&2
|
||||
exit 1 ;;
|
||||
esac
|
||||
|
||||
_ameba_here="$(CDPATH= cd "$(dirname "$_ameba_self")" && pwd)"
|
||||
AMEBA_NUTTX="$(CDPATH= cd "$_ameba_here/../.." && pwd)"
|
||||
AMEBA_COMMON="$AMEBA_NUTTX/arch/arm/src/common/ameba"
|
||||
AMEBA_TOOLS="$AMEBA_COMMON/tools"
|
||||
AMEBA_TOOLCHAIN_DIR="${AMEBA_TOOLCHAIN_DIR:-$HOME/rtk-toolchain}"
|
||||
|
||||
# --- 1. Resolve / fetch the SDK (pin comes from ameba_sdk.mk, single source) --
|
||||
|
||||
if [ -n "$AMEBA_SDK" ] && [ -d "$AMEBA_SDK/component/soc" ]; then
|
||||
: # external checkout, use as-is
|
||||
else
|
||||
AMEBA_SDK="$AMEBA_COMMON/ameba-rtos"
|
||||
if [ ! -d "$AMEBA_SDK/component/soc" ]; then
|
||||
_url=$(sed -n 's/^[[:space:]]*AMEBA_SDK_URL[[:space:]]*=[[:space:]]*\([^[:space:]]*\).*/\1/p' \
|
||||
"$AMEBA_COMMON/ameba_sdk.mk" | head -1)
|
||||
_ver=$(sed -n 's/^[[:space:]]*AMEBA_SDK_VERSION[[:space:]]*=[[:space:]]*\([0-9a-fA-F]*\).*/\1/p' \
|
||||
"$AMEBA_COMMON/ameba_sdk.mk" | head -1)
|
||||
sh "$AMEBA_TOOLS/ameba_fetch_sdk.sh" "$_url" "$_ver" "$AMEBA_SDK" || return 1 2>/dev/null || exit 1
|
||||
fi
|
||||
fi
|
||||
export AMEBA_SDK
|
||||
export AMEBA_TOOLCHAIN_DIR
|
||||
|
||||
# --- 2. asdk toolchain: fetch if absent, prepend to PATH, pin GCCVER ---------
|
||||
|
||||
sh "$AMEBA_TOOLS/ameba_fetch_toolchain.sh" "$AMEBA_SDK" "$AMEBA_TOOLCHAIN_DIR" \
|
||||
|| return 1 2>/dev/null || exit 1
|
||||
|
||||
_ver=$(sed -n 's/.*v_ASDK_VER[ \t][ \t]*\([0-9.][0-9.]*\).*/\1/p' \
|
||||
"$AMEBA_SDK/cmake/global_define.cmake")
|
||||
_build=$(sed -n 's/.*ToolChainVerMinor[ \t][ \t]*\([0-9][0-9]*\).*/\1/p' \
|
||||
"$AMEBA_SDK/cmake/toolchain/ameba-toolchain-asdk-$_ver.cmake")
|
||||
_asdk_bin="$AMEBA_TOOLCHAIN_DIR/asdk-$_ver-$_build/linux/newlib/bin"
|
||||
export GCCVER="${_ver%%.*}"
|
||||
|
||||
# --- 3. prebuilts (ninja/cmake) + python venv (SDK env) ----------------------
|
||||
|
||||
sh "$AMEBA_TOOLS/ameba_setup_env.sh" "$AMEBA_SDK" "$AMEBA_TOOLCHAIN_DIR" \
|
||||
|| return 1 2>/dev/null || exit 1
|
||||
|
||||
_pbv=$(sed -n 's/^PREBUILTS_VERSION=//p' "$AMEBA_SDK/env.sh" | head -1)
|
||||
_prebuilts_bin="$AMEBA_TOOLCHAIN_DIR/prebuilts-linux-$_pbv/bin"
|
||||
_venv_bin="$(cat "$AMEBA_SDK/.amebapy/bindir" 2>/dev/null)"
|
||||
|
||||
# --- 4. Prepend to PATH (idempotent) -----------------------------------------
|
||||
|
||||
for _d in "$_venv_bin" "$_prebuilts_bin" "$_asdk_bin"; do
|
||||
[ -n "$_d" ] || continue
|
||||
case ":$PATH:" in
|
||||
*":$_d:"*) ;;
|
||||
*) PATH="$_d:$PATH" ;;
|
||||
esac
|
||||
done
|
||||
export PATH
|
||||
|
||||
echo "ameba: environment ready"
|
||||
echo " AMEBA_SDK = $AMEBA_SDK"
|
||||
echo " asdk = $_asdk_bin"
|
||||
echo " now build with cmake (source once) or make"
|
||||
Loading…
Add table
Add a link
Reference in a new issue