You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

368 lines
13 KiB

// Copyright (C) 2017 The Android Open Source Project
//
// Licensed 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.
namespace chre.fbs;
/// Represents a message sent to/from a nanoapp from/to a client on the host
table NanoappMessage {
app_id:ulong = 0;
message_type:uint = 0;
/// Identifies the host-side endpoint on the host that sent or should receive
/// this message. The default value is a special value defined in the HAL and
/// elsewhere that indicates that the endpoint is unspecified.
host_endpoint:ushort = 0xfffe;
/// Vector containing arbitrary application-specific message data
message:[ubyte] (required);
/// List of Android permissions that cover the contents of a message from a
/// nanoapp to the host.
/// These permissions are used to record and attribute access to
/// permissions-controlled resources.
message_permissions:uint;
/// List of Android permissions declared by the nanoapp / granted to the host.
/// For messages from a nanoaapp to the host, this must be a superset of
/// message_permissions.
permissions:uint;
}
table HubInfoRequest {}
table HubInfoResponse {
/// The name of the hub. Nominally a UTF-8 string, but note that we're not
/// using the built-in "string" data type from FlatBuffers here, because the
/// generated C++ uses std::string which is not well-supported in CHRE. This
/// applies for vendor and toolchain as well.
name:[byte];
vendor:[byte];
toolchain:[byte];
/// Legacy platform version reported in the HAL; semantics not strictly
/// defined
platform_version:uint;
/// Toolchain version reported in the HAL; semantics not strictly defined
toolchain_version:uint;
peak_mips:float;
stopped_power:float;
sleep_power:float;
peak_power:float;
/// Maximum size message that can be sent to a nanoapp
max_msg_len:uint;
/// @see chreGetPlatformId()
platform_id:ulong;
/// @see chreGetVersion()
chre_platform_version:uint;
// TODO: list of connected sensors
}
table NanoappListRequest {}
table NanoappListEntry {
app_id:ulong;
version:uint;
enabled:bool = true;
/// Whether the nanoapp is a pre-loaded "system" nanoapp, i.e. one that should
/// not show up in the list of nanoapps in the context hub HAL. System
/// nanoapps are typically used to leverage CHRE for some device functionality
/// and do not interact via the context hub HAL.
is_system:bool = false;
/// Nanoapp permissions, if supported. Nanoapp permissions are required on
/// CHRE API v1.5+, and are defined in chre/util/system/napp_permissions.h
permissions:uint;
// TODO: memory usage
}
table NanoappListResponse {
nanoapps:[NanoappListEntry] (required);
}
/// Represents a request for loading a nanoapp.
/// The nanaopp can either be requested to be loaded via a file or via a buffer.
/// For loading via a file, the following steps will be taken:
/// 1. The loader sends a LoadNanoappRequest message to CHRE. app_binary must
/// be set for legacy purposes, but should be empty. Additionally,
/// fragment_id and total_app_size are unused in this request. The loading
/// that happens as part of this request is serialized, but asynchronous
/// meaning that load requests will be processed in the order they are sent
/// but multiple requests can be outstanding at any given time.
/// 2. CHRE stores the filename and waits until its event loop is able to
/// process the request.
/// 3. Once ready, the nanoapp will be loaded from the file specified in the
/// original request and will send a callback indicating the
/// completion/failure of the request.
/// For loading via a buffer, loading may optionally be fragmented into multiple
/// sequential requests, which will follow the following steps:
/// 1. The loader sends a LoadNanoappRequest message to CHRE. If the request
/// is fragmented, then the fields fragment_id and total_app_size must
/// be defined. Once the first fragment is sent to CHRE, all subsequent
/// fragments must be delivered before a new LoadNanoappRequest can be
/// issued. If a new request is received while a current request has
/// outstanding fragments, the current request will be overridden with the
/// new one.
/// 2. CHRE preallocates the required amount of memory, and loads app_binary,
/// appending to already loaded fragments as appropriate.
/// 3. If the request is fragmented, then the requestor must sequentially send
/// multiple LoadNanoappRequest with incremental nanoapp binary fragments.
/// CHRE will respond with LoadNanoappResponse for each request. For
/// requests starting from the second fragment, all fields except
/// fragment_id and app_binary should be ignored by CHRE.
///
/// Once the LoadNanoappRepsonse for the last fragment is received
/// by the HAL, the HAL client will receive a callback indicating the
/// completion/failure of a load request.
///
/// If any request fragment is lost, then the entire load request will be
/// considered to have failed. If the request times out (e.g. the requestor
/// process crashes), then the load request will be cancelled at CHRE and fail.
table LoadNanoappRequest {
transaction_id:uint;
app_id:ulong;
app_version:uint;
target_api_version:uint;
app_binary:[ubyte] (required);
/// Fields that are relevant for fragmented loading
/// The framgent count starts at 1 and should end at the total number of
/// fragments. For clients that do not support fragmented loading, the
/// default behavior should be to assume one fragment.
fragment_id:uint = 0;
total_app_size:uint;
/// Null-terminated ASCII string containing the file name that contains the
/// app binary to be loaded.
app_binary_file_name:[byte];
/// The nanoapp flag values from the nanoapp header defined in
/// build/build_template.mk. Refer to that file for more details.
app_flags:uint;
/// If true and fragmented loading is requested, the LoadNanoappResponse
/// for the last fragment will be sent after the fragment was confirmed
/// to be placed in memory and no additional response will be sent after
/// the nanoapp is linked and started in the framework.
respond_before_start:bool;
}
table LoadNanoappResponse {
transaction_id:uint;
/// Denotes whether a load request succeeded or failed.
/// If any fragment of a load request fails, the entire load request for
/// the same transaction will fail.
success:bool;
/// The fragment count of the load reponse is for.
fragment_id:uint = 0;
// TODO: detailed error code?
}
table UnloadNanoappRequest {
transaction_id:uint;
app_id:ulong;
/// Set to true to allow this request to unload nanoapps identified as "system
/// nanoapps", i.e. ones with is_system set to true in NanoappListResponse.
allow_system_nanoapp_unload:bool;
}
table UnloadNanoappResponse {
transaction_id:uint;
success:bool;
}
/// Represents log messages from CHRE.
table LogMessage {
/// A buffer containing formatted log data. A flat array is used here to avoid
/// overhead in serializing and deserializing. The format is as follows:
///
/// uint8_t - log level (1 = error, 2 = warning,
/// 3 = info, 4 = debug)
/// uint64_t, little-endian - timestamp in nanoseconds
/// char[] - message to log
/// char, \0 - null-terminator
///
/// This pattern repeats until the end of the buffer for multiple log
/// messages. The last byte will always be a null-terminator. There are no
/// padding bytes between these fields. Treat this like a packed struct and be
/// cautious with unaligned access when reading/writing this buffer.
buffer:[byte];
}
/// Represents a message sent to CHRE to indicate AP timestamp for time sync
table TimeSyncMessage {
/// Offset between AP and CHRE timestamp
offset:long;
}
/// A request to gather and return debugging information. Only one debug dump
/// session can be active at a time. Upon accepting a request, zero or more
/// DebugDumpData messages are generated, followed by a DebugDumpResponse
/// indicating the completion of the operation.
table DebugDumpRequest {}
table DebugDumpData {
/// Null-terminated ASCII string containing debugging information
debug_str:[byte];
}
table DebugDumpResponse {
/// true if the request was accepted and a dump was performed, false if it was
/// rejected or failed to complete for some reason
success:bool;
/// The number of DebugDumpData messages sent in this session
data_count:uint;
}
/// A request from CHRE for host to initiate a time sync message
/// (system feature, platform-specific - not all platforms necessarily use this)
table TimeSyncRequest {}
/// Request from CHRE to enable direct access to data from the low-power
/// microphone. On some systems, coordination via the AP (e.g. with
/// SoundTrigger HAL) is needed to ensure this capability is powered up when
/// CHRE needs it. The host does not send a response.
table LowPowerMicAccessRequest {}
/// Notification from CHRE that it no longer needs direct access to low-power
/// microphone data.
table LowPowerMicAccessRelease {}
/// An enum describing the setting type.
enum Setting : byte {
LOCATION = 0,
WIFI_AVAILABLE,
AIRPLANE_MODE,
MICROPHONE,
}
/// An enum describing the state of a setting.
enum SettingState : byte {
DISABLED = 0,
ENABLED,
}
/// Notification from the host that a system setting has changed
table SettingChangeMessage {
/// The setting that has changed
setting:Setting = LOCATION;
/// The new setting value
state:SettingState = DISABLED;
}
/// Represents V2 log messages from CHRE.
table LogMessageV2 {
/// A buffer containing formatted log data. A flat array is used here to avoid
/// overhead in serializing and deserializing. The format is as follows:
///
/// uint8_t - LogBuffer log level (1 = error, 2 = warn,
/// 3 = info, 4 = debug,
/// 5 = verbose)
/// uint32_t, little-endian - timestamp in milliseconds
/// char[] - message to log
/// char, \0 - null-terminator
///
/// This pattern repeats until the end of the buffer for multiple log
/// messages. The last byte will always be a null-terminator. There are no
/// padding bytes between these fields. Treat this like a packed struct and be
/// cautious with unaligned access when reading/writing this buffer.
buffer:[byte];
/// The number of logs dropped since CHRE started
num_logs_dropped:uint;
}
// A request to perform basic internal self-test in CHRE. The test to be performed
// is platform-dependent, and can be used to check if the system is functioning
// properly. This message should be used for debugging/testing.
table SelfTestRequest {}
table SelfTestResponse {
// True if the self-test succeeded.
success:bool;
}
/// A union that joins together all possible messages. Note that in FlatBuffers,
/// unions have an implicit type
union ChreMessage {
NanoappMessage,
HubInfoRequest,
HubInfoResponse,
NanoappListRequest,
NanoappListResponse,
LoadNanoappRequest,
LoadNanoappResponse,
UnloadNanoappRequest,
UnloadNanoappResponse,
LogMessage,
TimeSyncMessage,
DebugDumpRequest,
DebugDumpData,
DebugDumpResponse,
TimeSyncRequest,
LowPowerMicAccessRequest,
LowPowerMicAccessRelease,
SettingChangeMessage,
LogMessageV2,
SelfTestRequest,
SelfTestResponse,
}
struct HostAddress {
client_id:ushort;
}
/// The top-level container that encapsulates all possible messages. Note that
/// per FlatBuffers requirements, we can't use a union as the top-level
/// structure (root type), so we must wrap it in a table.
table MessageContainer {
message:ChreMessage (required);
/// The originating or destination client ID on the host side, used to direct
/// responses only to the client that sent the request. Although initially
/// populated by the requesting client, this is enforced to be the correct
/// value by the entity guarding access to CHRE.
/// This is wrapped in a struct to ensure that it is always included when
/// encoding the message, so it can be mutated by the host daemon.
host_addr:HostAddress (required);
}
root_type MessageContainer;