| .. _module-pw_chre: |
| |
| ======= |
| pw_chre |
| ======= |
| .. pigweed-module:: |
| :name: pw_chre |
| |
| The `Context Hub Runtime Environment <https://source.android.com/docs/core/interaction/contexthub>`_ |
| (CHRE) is Android's platform for developing always-on applications called |
| nanoapps. These nanoapps run on a vendor-specific processor which is more power |
| efficient. Nanoapps use the CHRE API, which is standardized across platforms, |
| allowing them to be code-compatible across devices. |
| |
| This module implements a Pigweed backend to CHRE. In order to use this module, |
| ``dir_pw_third_party_chre`` must point to the directory to the CHRE library. |
| |
| ----------- |
| Get started |
| ----------- |
| |
| To integrate ``pw_chre`` with your project: |
| |
| - Call the initialization functions and start the event loop. |
| - Handle messages from the application processor and connect them through to |
| the CHRE runtime. |
| - Implement the functions in ``pw_chre/host_link``. This is how CHRE sends |
| messages to the application processor. |
| |
| |
| ``$pw_chre:chre_example`` runs the CHRE environment using ``pw_system``. |
| This also loads several static example nanoapps from the CHRE codebase by |
| compiling them into the executable. This can be a helpful reference. |
| |
| CHRE is implemented using the following Pigweed modules for functionality: |
| |
| - ``pw_chrono:system_timer``: implements getting monotonic time |
| - ``pw_log``: implements logging to the application processor |
| - ``pw_assert``: implements crash handling |
| - ``pw_sync``: implements mutual exclusion primitives |
| - ``malloc/free``: implements virtual memory allocation |
| (This may be eventually replaced with a pigweed module) |
| |
| ---------------------- |
| Current implementation |
| ---------------------- |
| |
| As mentioned at the top of this document, ``pw_chre`` is extremely experimental. |
| Only a few parts of CHRE have been tested. There are likely to be bugs and |
| unimplemented behavior. The lists below track the current state and will |
| be updated as things change. |
| |
| Supported and tested behavior: |
| |
| - Loading static nanoapps. |
| - The following sample nanoapps have been run: |
| - hello_world |
| - debug_dump_world |
| - timer_world |
| - unload_tester |
| - message_world |
| - spammer |
| - Logging from a nanoapp. |
| - Allocating memory (although it uses malloc/free). |
| - Sending messages to/from the AP. |
| |
| Features not implemented, but likely to be implemented in the future: |
| |
| - Context Hub Qualification Test Suite (CHQTS). |
| - Some simulated PALS for testing (based off of CHRE's linux simulated PALs). |
| - Power Management APIs, e.g: waking the host AP and flushing messages. |
| - Instructions around implementing a PAL. |
| - Instructions around building and testing a nanoapp. |
| - Dynamically loading nanoapps. |
| |
| Features that would be nice to have: |
| |
| - A plug-and-play implementation of AP <-> MCU flatbuffer message communication. |
| - Pigweed defined facades for each PAL. |
| - PAL implementations using Pigweed functionality (i.e: implementing bluetooth |
| via ``pw_bluetooth``). |
| - Pigweed defined facades for core CHRE functionality, such as clock selection, |
| memory management, cache management. |
| - A protobuf implementation of CHRE's flatbuffer API. |
| - Cmake and Bazel build system integration. |
| |
| ------------- |
| API reference |
| ------------- |
| .. doxygennamespace:: pw::chre |
| :members: |
| |
| ------------- |
| Porting Guide |
| ------------- |
| The ``pw_chre`` module has completed the steps outlined for `creating a new CHRE platform`_ . |
| |
| .. _Creating a new CHRE platform: https://android.googlesource.com/platform/system/chre/+/refs/heads/main/doc/porting_guide.md#recommended-steps-for-porting-chre |
| |
| The ``pw_chre`` module still needs to be configured correctly on a new platform. |
| You ``pw_chre`` user is responsible for: |
| |
| - Starting a thread for CHRE's event loop and calling the correct APIs. |
| - Forwarding messages to/from the Application Processor (AP). |
| |
| ----------------------------- |
| Adding Optional Feature Areas |
| ----------------------------- |
| However, ``pw_chre`` users will likely want to implement their own |
| Platform Abstraction Layers (PALs). For more information see this |
| `implementation guide <https://android.googlesource.com/platform/system/chre/+/refs/heads/main/doc/porting_guide.md#implementing-optional-feature-areas-e_g_pals>`_. |
| |
| .. list-table:: List of PALs |
| :widths: 1 1 |
| :header-rows: 1 |
| |
| * - PAL Name |
| - Pigweed implementation available |
| * - Audio |
| - ❌ |
| * - Bluetooth |
| - ❌ |
| * - GNSS |
| - ❌ |
| * - Sensor |
| - ❌ |
| * - Wifi |
| - ❌ |
| * - WWAN |
| - ❌ |
| |
| |
| For more information on a specific PAL see |
| `the PAL headers <https://cs.android.com/android/platform/superproject/+/main:system/chre/pal/include/chre/pal/>`_ |
| or the `Linux reference PAL implementations <https://cs.android.com/android/platform/superproject/+/main:system/chre/platform/linux/>`_. |