# Architecture Source: [https://docs.qualcomm.com/doc/80-70014-7/topic/architecture.html](https://docs.qualcomm.com/doc/80-70014-7/topic/architecture.html) Note: Source code of the low-power processor (aDSP), including the QSH framework is available only for the Authorized users. To upgrade your access, go to: [www.qualcomm.com/support/working-with-qualcomm](https://www.qualcomm.com/support/working-with-qualcomm). Note: To continue reading about the APIs and/or set up sensor information, skip directly to [Interfaces](https://docs.qualcomm.com/bundle/publicresource/topics/80-70014-7/qsh_api_reference.html). The QSH synonymous with the Qualcomm® Snapdragon™ sensors core (SSC), offers a unified event-driven framework for drivers and algorithms. The QSH supports the same set of APIs for both the hardware-based and software-based sensors. Additionally, the QSH supports asynchronous bus transfer and is easily extendable for new or custom driver features. The QSH consists of various components that include the QSH client APIs, sensor APIs, a core framework, pre-implemented platform sensors, vendor-implemented sensors, and the test modules. It serves external clients and provides a simple interface to access the sensor data. Figure : QSH architecture Page-1 Qualcomm Sensing Hub Qualcomm Sensing Hub Client Manager Client Manager Client Application Client Application QSH Client API QSH Client API Application processor Application processor Low power processor Low power processor Hardware Based Hardware Based Sensor Drivers Sensor Drivers Software Based Software Based Sensors Sensors Serial Buses Serial Buses Platform Platform Sensors Sensors Service Service Manager Manager Linux OS Linux OS QuRT QuRT OS OS Utilities Utilities QSH Sensor API QSH Sensor API Sensor Hardware Sensor Hardware Accelerometer Accelerometer Gyroscope Gyroscope Magnetometer Magnetometer I3C I3C SPI SPI I2C I2C UART UART ALS/Prox ALS/Prox Other sensors Other sensors Third-party Third-party Upstream Upstream Qualcomm Qualcomm Hardware Hardware The following table lists the QSH terminology to understand the QSH framework and its usage. Table : QSH terminology | **Item** | **Description** | | --- | --- | | Sensor | | | Sensor instance | | | Sensor unique identifier (SUID) | A unique 128‑bit ID for each sensor | | Service | A module that provides a synchronous interface for common
utilities | | Data stream | A unique connection between a client and data source | | Request | A configuration message sent by a client to a sensor (see
`sns_request.h` file) | | Event | Asynchronous output data message generated by a sensor instance
(see `sns_sensor_event.h` file) | | Nanopb | Nanopb is a small code-size protocol buffer implemented in ANSI
C | The following resources give an in-depth information on the QSH architecture: - **Application processor software modules** - **Application processor**: The block contains the *application main() or entry function* that interacts with the QSH client APIs on the application processor side. - **QSH client APIs**: The block offers high-level APIs to access services offered by the QSH. It simplifies application development by abstracting system complexities and enables it to focus on the application logic. For more information, see [Interfaces](https://docs.qualcomm.com/bundle/publicresource/topics/80-70014-7/qsh_api_reference.html). - **Low-power processor software modules** - **Client manager**: The block is in charge of all communications of the low-power processor with the application processor. The client manager is responsible for the following: - Translates incoming requests: The client manager takes incoming requests and translates them into a format that the QSH can understand. - Translates outgoing indications: When the client manager receives event messages from the QSH, the client manager translates these event messages into outgoing indications in a format that can be understood outside the QSH. - Guarantees batching options: If a client specifies certain batching (store/accumulate locally) options, then the client manager ensures that the batching options are met. This means it checks that the data is grouped and sent in the way that the client has specified. - **Service manager**: QSH offers synchronous services through its service manager. The sensor and sensor instance APIs use a callback to connect to this service manager. The services available in the QSH, also referred as QSH services, are listed in the `adsp_proc/qsh_platform/inc/sns_service.h` file. The following table describes the key QSH services that are essential for device drivers. Table : QSH services | QSH service | Description | | --- | --- | | Stream service | | | Attribute service | | | Diagnostic service | | | Event service | | | Power rail service | | | Synchronous COM port (SCP) service | | | GPIO service | | | Island service | | | File system service | | - **Platform sensor**: QSH provides some built-in sensors for platform or hardware-specific abstraction that can be used by other sensors and sensor instances. The following table describes the platform sensors. Table : Platform sensors | Platform sensor | Description | | --- | --- | | Registry sensor | | | Timer sensor | | | Interrupt sensor | | | Asynchronous COM port (ASCP) sensor |


Note: The ASCP sensor is typically used by the physical
sensor drivers to read large FIFO. | | SUID lookup sensor | | | Test sensor | A test sensor is available in the
`adsp_proc/qsh_platform/sensors/test`
directory to customize and run sensor-specific use
cases. | - **QSH utilities**: QSH provides several helper utilities for sensors and sensor instances. For all available utilities, see `adsp_proc/qsh_platform/inc/utils` directory. The following table describes the key utilities. Table : QSH utilities | QSH utility | Description | | --- | --- | | Nanopb encode/decode | | | Sensor utils | | | Attribute utils | | | Memory, math, and printf utils. | | ## Communication between sensors Source: [https://docs.qualcomm.com/doc/80-70014-7/topic/architecture.html](https://docs.qualcomm.com/doc/80-70014-7/topic/architecture.html) Every algorithm and sensor driver within the QSH framework, is referred to as a sensor with the standard QSH APIs. Information exchange across these sensors is necessary for any real use case. The following resources describe about the communication between these sensors. All communication to, from, and among the sensors is performed through the request and event messages over data streams. Message payloads are defined in the protocol buffer format, using the nanopb generator, encoder, and decoder. Message payload length, message ID, and timestamp (in the case of events) are communicated within metadata managed by the QSH framework. Figure : Sensor communication Page-1 PB Encode/Decode PB Encode/Decode PB Encode/Decode PB Encode/Decode Request Request Event Event Data Client Data Client Data Source Data Source Data Stream Data Stream Third-party Third-party Request messages are sent to enable, disable, and/or reconfigure a sensor. Request messages are always addressed to a specific SUID. After the target sensor receives the request message, it sends the request to the sensor instance for proper handling. Sensor instances send event messages asynchronously to their registered clients, which may be other sensors or sensor instances. ### Sensor and sensor instances - Sensors are producers and/or consumers of asynchronous data - Each sensor can have one or more sensor instances - Each sensor instance operates with a specific configuration - Any request to a sensor for data, results in the creation of a sensor instance or sharing of an existing sensor instance - Sensor instances are created on-demand, as determined by the sensor - Sensors fully manage the lifecycle and configuration of their corresponding instances and are responsible for sending configuration updates and initial state events to their clients - Vendors should serve all client requests with as few sensor instances as possible - A stream of data generated by a sensor instance is sent to all the active clients - Multiple sensors can share and configure a single sensor instance ‒ this mode of operation is typically for a combo driver for hardware sensors. Here, the sensors represent the supported data types, and the sensor instance is the sole module that communicates and configures the hardware. ## Nanopb protocol buffer in QSH Source: [https://docs.qualcomm.com/doc/80-70014-7/topic/architecture.html](https://docs.qualcomm.com/doc/80-70014-7/topic/architecture.html) The QSH uses nanopb protocol buffer for: - All the request and event messages exchanged between the sensors - A sensor/sensor instance must encode the payload (if present) for all requests it sends to its dependants. - A sensor/sensor instance must decode the payload (if present) for all requests it receives. - A sensor/sensor instance must encode the payload (if present) for all events it publishes. - A sensor/sensor instance must decode the payload (if present) for all events it receives from its dependants. - Some requests/events do not have a message body. In this case, decoding/encoding the payload is not expected. Such messages are processed by their message ID. - Representing the attribute data - All attribute values are in the nanopb-encoded format - Diag log packet payload - All payloads in the diag log packets are in the nanopb-encoded format For more information on Google protocol buffers and nanopb respectively, see [Protocol-buffers](https://developers.google.com/protocol-buffers/) and [nanopb](https://jpa.kapsi.fi/nanopb/). ## Sensor API messages Source: [https://docs.qualcomm.com/doc/80-70014-7/topic/architecture.html](https://docs.qualcomm.com/doc/80-70014-7/topic/architecture.html) The following API messages are used for communication between sensors: - The `.proto`files contain the following elements for communication between sensors: - Protocol buffer message definitions - Documentation - The following table lists the standard message definitions in the `/build-qcom-wayland/workspace/sources/sensinghub/sensing-hub/apis/proto/sns_std_*.proto` file: Table : Standard proto files | File | Description | | --- | --- | | `sns_std.proto` | This file includes standard definitions, such as a message
ID, request message, batching specification, an attribute
request and event, and an error event. | | `sns_std_sensor.proto` | This file includes definitions, such as message IDs for
request and event APIs of standard sensors, streaming and event
messages, sensor sample status types, standard attribute IDs,
common attribute types, and a physical sensor configuration
event message. | | `sns_std_type.proto` | This file includes common API-type definitions, such as SUID
messages, attribute events and value messages, and common error
types. | | `sns_std_event_gated_sensor.proto` | This file includes the API for event gated sensors,
encompassing the configuration message ID and API
documentation. | - Physical sensor-specific API definitions and documentation are present in the sensor-specific `.proto` files. For example, `sns_accel.proto`, `sns_proximity.proto` and `sns_motion_detect.proto`. - Platform sensor API definitions and documentation are present in the `adsp_proc/qsh_platform/api/` directory. For example, `sns_timer.proto`, `sns_interrupt.proto`, and `sns_async_com_port.proto`. - Framework-related APIs for SUID, registry, and diag are defined in the following proto files: - `sns_suid.proto` - `sns_registry.proto` - `sns_diag.proto` Last Published: Jul 12, 2024 [Previous Topic Features](https://docs.qualcomm.com/bundle/publicresource/80-70014-7/topics/supported_features.md) [Next Topic Interfaces](https://docs.qualcomm.com/bundle/publicresource/80-70014-7/topics/qsh_api_reference.md)