• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef CHRE_PLATFORM_SHARED_NANOAPP_SUPPORT_LIB_DSO_H_
18 #define CHRE_PLATFORM_SHARED_NANOAPP_SUPPORT_LIB_DSO_H_
19 
20 /**
21  * @file
22  * This provides the interface that the dynamic shared object (DSO) nanoapp
23  * nanoapp support library (NSL) uses to interface with the underlying CHRE
24  * implementation in a compatible manner.
25  *
26  * This header file must retain compatibility with C, and have minimal or no
27  * dependencies on other CHRE system header files, as it will be used when
28  * compiling external/dynamic nanoapps.
29  */
30 
31 #include <chre.h>
32 #include <stdint.h>
33 
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37 
38 //! Special magic value to uniquely identify the nanoapp info structure
39 #define CHRE_NSL_NANOAPP_INFO_MAGIC UINT32_C(0x50e69977)
40 
41 //! The minor version in the nanoapp info structure to determine which fields
42 //! are available to support backwards compatibility.
43 #define CHRE_NSL_NANOAPP_INFO_STRUCT_MINOR_VERSION UINT8_C(3)
44 
45 //! The symbol name expected from the nanoapp's definition of its info struct
46 #define CHRE_NSL_DSO_NANOAPP_INFO_SYMBOL_NAME "_chreNslDsoNanoappInfo"
47 
48 //! The symbol name expected from the nanoapp's definition of its unstable ID
49 //! char array
50 #define CHRE_NSL_DSO_NANOAPP_UNSTABLE_ID_SYMBOL_NAME "_chreNanoappUnstableId"
51 
52 //! Maximum length of vendor and name strings
53 #define CHRE_NSL_DSO_NANOAPP_STRING_MAX_LEN (32)
54 
55 //! @see nanoappStart()
56 typedef bool(chreNanoappStartFunction)(void);
57 
58 //! @see nanoappHandleEvent()
59 typedef void(chreNanoappHandleEventFunction)(uint32_t senderInstanceId,
60                                              uint16_t eventType,
61                                              const void *eventData);
62 
63 //! @see nanoappEnd()
64 typedef void(chreNanoappEndFunction)(void);
65 
66 /**
67  * DSO-based nanoapps must expose this struct under a symbol whose name is given
68  * by CHRE_NSL_DSO_NANOAPP_INFO_SYMBOL_NAME. When the nanoapp is loaded, dlsym()
69  * will be used to locate this symbol to register the nanoapp with the system.
70  */
71 struct chreNslNanoappInfo {
72   //! @see CHRE_NSL_NANOAPP_INFO_MAGIC
73   uint32_t magic;
74 
75   //! @see CHRE_NSL_NANOAPP_INFO_STRUCT_MINOR_VERSION
76   uint8_t structMinorVersion;
77 
78   //! Set to 1 if this nanoapp is a "system nanoapp" that should not show up in
79   //! the context hub HAL, likely because it implements some device
80   //! functionality beneath the HAL.
81   uint8_t isSystemNanoapp : 1;
82 
83   //! Set to 1 if this nanoapp runs in tightly coupled memory. This flag is only
84   //! relevant to platforms that have the ability to run nanoapps within tightly
85   //! coupled memory.
86   //!
87   //! @since minor version 1
88   uint8_t isTcmNanoapp : 1;
89 
90   //! Reserved for future use, set to 0. Assignment of this field to some use
91   //! must be accompanied by an increase of the struct minor version.
92   uint8_t reservedFlags : 6;
93   uint8_t reserved;
94 
95   //! The CHRE API version that the nanoapp was compiled against
96   uint32_t targetApiVersion;
97 
98   //! A human-friendly name of the nanoapp vendor (null-terminated string,
99   //! maximum length CHRE_NSL_DSO_NANOAPP_STRING_MAX_LEN)
100   const char *vendor;
101 
102   //! A human-friendly name for the nanoapp (null-terminated string, maximum
103   //! length CHRE_NSL_DSO_NANOAPP_STRING_MAX_LEN)
104   const char *name;
105 
106   //! Identifies the vendor (most significant 5 bytes) and application
107   uint64_t appId;
108 
109   //! Application-specific version number
110   uint32_t appVersion;
111 
112   struct {
113     chreNanoappStartFunction *start;
114     chreNanoappHandleEventFunction *handleEvent;
115     chreNanoappEndFunction *end;
116   } entryPoints;
117 
118   //! Application-specific verison string. This might contain a commit hash at
119   //! which the app was built, but is up to the app itself.
120   //!
121   //! @since minor version 2
122   const char *appVersionString;
123 
124   //! Set of permissions that determines what APIs the application is allowed to
125   //! use. See chre/util/system/napp_permissions.h for more details on what
126   //! permissions can be declared here and what their values are.
127   //!
128   //! @since minor version 3
129   uint32_t appPermissions;
130 };
131 
132 /**
133  * Defined as a placeholder to enable future functionality extension.
134  *
135  * @param apiId
136  * @param apiHandle If this function returns true, this will be set to a pointer
137  *        to the associated structure containing the API
138  *
139  * @return true if the requested API is supported, false otherwise
140  */
141 bool chreNslDsoGetApi(uint32_t apiId, void **apiHandle);
142 
143 #ifdef __cplusplus
144 }
145 #endif
146 
147 #endif  // CHRE_PLATFORM_SHARED_NANOAPP_SUPPORT_LIB_DSO_H_
148