summaryrefslogtreecommitdiffstats
path: root/firmware/os/inc
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/os/inc')
-rw-r--r--firmware/os/inc/chreApi.h48
-rw-r--r--firmware/os/inc/eventnums.h21
-rw-r--r--firmware/os/inc/nanohubCommand.h1
-rw-r--r--firmware/os/inc/osApi.h6
-rw-r--r--firmware/os/inc/sensors.h2
-rw-r--r--firmware/os/inc/seos.h14
-rw-r--r--firmware/os/inc/seos_priv.h17
7 files changed, 91 insertions, 18 deletions
diff --git a/firmware/os/inc/chreApi.h b/firmware/os/inc/chreApi.h
index cf9bd499..e355ed5a 100644
--- a/firmware/os/inc/chreApi.h
+++ b/firmware/os/inc/chreApi.h
@@ -34,12 +34,17 @@ C_STATIC_ASSERT(va_list_size, sizeof(va_list) == sizeof(uint32_t));
C_STATIC_ASSERT(uintptr_size, sizeof(uintptr_t) >= sizeof(uint32_t));
//EXTERNAL API
+//level 1 indices in the CHRE table
#define SYSCALL_CHRE_MAIN 0
-#define SYSCALL_CHRE_LAST 1
+#define SYSCALL_CHRE_DRIVERS 1
+#define SYSCALL_CHRE_LAST 2 // always last. holes are allowed, but not immediately before this
+//level 2 indices in the CHRE.main table
#define SYSCALL_CHRE_MAIN_API 0
-#define SYSCALL_CHRE_MAIN_LAST 1
+#define SYSCALL_CHRE_MAIN_EVENT 1
+#define SYSCALL_CHRE_MAIN_LAST 2 // always last. holes are allowed, but not immediately before this
+//level 3 indices in the CHRE.main.api table
#define SYSCALL_CHRE_MAIN_API_GET_APP_ID 0 // (void) -> uint64_t
#define SYSCALL_CHRE_MAIN_API_GET_INST_ID 1 // (void) -> uint32_t
#define SYSCALL_CHRE_MAIN_API_LOG_OLD 2 // (enum LogLevel, const char *, uintptr_t) -> void
@@ -52,14 +57,49 @@ C_STATIC_ASSERT(uintptr_size, sizeof(uintptr_t) >= sizeof(uint32_t));
#define SYSCALL_CHRE_MAIN_API_SEND_EVENT 9 // (uint32_t, void *, chreEventCompleteFunction*, uint32_t) -> bool
#define SYSCALL_CHRE_MAIN_API_SEND_MSG 10 // (void *, uint32_t, uint32_t, chreMessageFreeFunction *) -> bool
#define SYSCALL_CHRE_MAIN_API_SENSOR_FIND_DEFAULT 11 //
-#define SYSCALL_CHRE_MAIN_API_SENSOR_GET_INFO 12 //
+#define SYSCALL_CHRE_MAIN_API_SENSOR_GET_INFO_OLD 12 //
#define SYSCALL_CHRE_MAIN_API_SENSOR_GET_STATUS 13 //
#define SYSCALL_CHRE_MAIN_API_SENSOR_CONFIG 14 //
#define SYSCALL_CHRE_MAIN_API_GET_OS_API_VERSION 15 //
#define SYSCALL_CHRE_MAIN_API_GET_OS_VERSION 16 //
#define SYSCALL_CHRE_MAIN_API_GET_PLATFORM_ID 17 //
#define SYSCALL_CHRE_MAIN_API_LOG 18 // (enum LogLevel, const char *, uintptr_t) -> void
-#define SYSCALL_CHRE_MAIN_API_LAST 19 // always last. holes are allowed, but not immediately before this
+#define SYSCALL_CHRE_MAIN_API_SENSOR_GET_INFO 19 //
+#define SYSCALL_CHRE_MAIN_API_GET_HOST_TIME_OFFSET 20 // (void) -> int64_t
+#define SYSCALL_CHRE_MAIN_API_LAST 21 // always last. holes are allowed, but not immediately before this
+
+//level 3 indices in the CHRE.main.event table
+#define SYSCALL_CHRE_MAIN_EVENT_SEND_EVENT 0 // (uint32_t, void *, chreEventCompleteFunction*, uint32_t) -> bool
+#define SYSCALL_CHRE_MAIN_EVENT_SEND_MSG 1 // (void *, size_t, uint32_t, uint16_t, chreMessageFreeFunction *) -> bool
+#define SYSCALL_CHRE_MAIN_EVENT_INFO_BY_APP_ID 2 // (uint64_t, struct chreNanoappInfo *) -> bool
+#define SYSCALL_CHRE_MAIN_EVENT_INFO_BY_INST_ID 3 // (uint32_t, struct chreNanoappInfo *) -> bool
+#define SYSCALL_CHRE_MAIN_EVENT_CFG_INFO 4 // (bool) -> void
+#define SYSCALL_CHRE_MAIN_EVENT_LAST 5 // always last. holes are allowed, but not immediately before this
+
+//level 2 indices in the CHRE.drivers table
+#define SYSCALL_CHRE_DRV_GNSS 0
+#define SYSCALL_CHRE_DRV_WIFI 1
+#define SYSCALL_CHRE_DRV_WWAN 2
+#define SYSCALL_CHRE_DRV_LAST 3 // always last. holes are allowed, but not immediately before this
+
+//level 3 indices in the CHRE.drivers.gnss table
+#define SYSCALL_CHRE_DRV_GNSS_GET_CAP 0 // (void) -> uint32_t
+#define SYSCALL_CHRE_DRV_GNSS_LOC_START_ASYNC 1 // (uint32_t, uint32_t const void *) -> bool
+#define SYSCALL_CHRE_DRV_GNSS_LOC_STOP_ASYNC 2 // (const void *) -> bool
+#define SYSCALL_CHRE_DRV_GNSS_MEAS_START_ASYNC 3 // (uint32_t, const void *) -> bool
+#define SYSCALL_CHRE_DRV_GNSS_MEAS_STOP_ASYNC 4 // (const void *) -> bool
+#define SYSCALL_CHRE_DRV_GNSS_LAST 5 // always last. holes are allowed, but not immediately before this
+
+//level 3 indices in the CHRE.drivers.wifi table
+#define SYSCALL_CHRE_DRV_WIFI_GET_CAP 0 // (void) -> uint32_t
+#define SYSCALL_CHRE_DRV_WIFI_CONF_SCAN_MON_ASYNC 1 // (bool, const void *) -> bool
+#define SYSCALL_CHRE_DRV_WIFI_REQ_SCAN_ASYNC 2 // (const struct chreWifiScanParams *, const void *) -> bool
+#define SYSCALL_CHRE_DRV_WIFI_LAST 3 // always last. holes are allowed, but not immediately before this
+
+//level 3 indices in the CHRE.drivers.wwan table
+#define SYSCALL_CHRE_DRV_WWAN_GET_CAP 0 // (void) -> uint32_t
+#define SYSCALL_CHRE_DRV_WWAN_GET_CELL_INFO_ASYNC 1 // (const void *cookie) -> bool
+#define SYSCALL_CHRE_DRV_WWAN_LAST 2 // always last. holes are allowed, but not immediately before this
//called by os entry point to export the api
void osChreApiExport(void);
diff --git a/firmware/os/inc/eventnums.h b/firmware/os/inc/eventnums.h
index 246587a3..5746433e 100644
--- a/firmware/os/inc/eventnums.h
+++ b/firmware/os/inc/eventnums.h
@@ -29,8 +29,10 @@
#define EVT_APP_TO_HOST 0x00000401 //app data to host. Type is struct HostHubRawPacket
#define EVT_MARSHALLED_SENSOR_DATA 0x00000402 //marshalled event data. Type is MarshalledUserEventData
#define EVT_RESET_REASON 0x00000403 //reset reason to host.
-#define EVT_APP_TO_SENSOR_HAL_DATA 0x00000404 // sensor driver out of band data update to sensor hal
-#define EVT_DEBUG_LOG 0x00007F01 // send message payload to Linux kernel log
+#define EVT_APP_TO_SENSOR_HAL_DATA 0x00000404 //sensor driver out of band data update to sensor hal
+#define EVT_APP_STARTED 0x00000405 //sent when a app has successfully started
+#define EVT_APP_STOPPED 0x00000406 //sent when a app has stopped
+#define EVT_DEBUG_LOG 0x00007F01 //send message payload to Linux kernel log
#define EVT_MASK 0x0000FFFF
// host-side events are 32-bit
@@ -54,9 +56,17 @@ struct HostHubRawPacket {
SET_PACKED_STRUCT_MODE_OFF
SET_PACKED_STRUCT_MODE_ON
+struct NanohubMsgChreHdrV10 {
+ uint8_t size;
+ uint32_t appEvent;
+}ATTRIBUTE_PACKED;
+SET_PACKED_STRUCT_MODE_OFF
+
+SET_PACKED_STRUCT_MODE_ON
struct NanohubMsgChreHdr {
uint8_t size;
uint32_t appEvent;
+ uint16_t endpoint;
}ATTRIBUTE_PACKED;
SET_PACKED_STRUCT_MODE_OFF
@@ -103,17 +113,18 @@ SET_PACKED_STRUCT_MODE_OFF
//for all apps
#define EVT_APP_FREE_EVT_DATA 0x000000FF //sent to an external app when its event has been marked for freeing. Data: struct AppEventFreeData
// this event is never enqueued; it goes directly to the app.
-// It notifies app that hav outstanding IO, that is is about to end;
+// It notifies app that have outstanding IO, that is is about to end;
// Expected app behavior is to not send any more events to system;
// any events sent after this point will be silently ignored by the system;
-// any outstading events will be allowed to proceed to completion. (this is SIG_STOP)
+// any outstanding events will be allowed to proceed to completion. (this is SIG_STOP)
#define EVT_APP_STOP 0x000000FE
// Internal event, with task pointer as event data;
// system ends the task unconditionally; no further checks performed (this is SIG_KILL)
#define EVT_APP_END 0x000000FD
+#define EVT_APP_BEGIN 0x000000FC
//for host comms
-#define EVT_APP_FROM_HOST 0x000000F8 //host data to an app. Type is struct HostMsgHdr
#define EVT_APP_FROM_HOST_CHRE 0x000000F9 //host data to an app. Type is struct HostMsgHdrChre
+#define EVT_APP_FROM_HOST 0x000000F8 //host data to an app. Type is struct HostMsgHdr
//for apps that use I2C
#define EVT_APP_I2C_CBK 0x000000F0 //data pointer points to struct I2cEventData
diff --git a/firmware/os/inc/nanohubCommand.h b/firmware/os/inc/nanohubCommand.h
index 0c4c5220..408cffdc 100644
--- a/firmware/os/inc/nanohubCommand.h
+++ b/firmware/os/inc/nanohubCommand.h
@@ -41,5 +41,6 @@ struct NanohubHalCommand {
const struct NanohubHalCommand *nanohubHalFindCommand(uint8_t msg);
uint64_t hostGetTime(void);
+int64_t hostGetTimeDelta(void);
#endif /* __NANOHUBCOMMAND_H */
diff --git a/firmware/os/inc/osApi.h b/firmware/os/inc/osApi.h
index 77cff48f..03f91264 100644
--- a/firmware/os/inc/osApi.h
+++ b/firmware/os/inc/osApi.h
@@ -17,11 +17,8 @@
#ifndef _OS_API_H_
#define _OS_API_H_
-#include <stdint.h>
#include <slab.h>
-#include <seos_priv.h>
-
//EXTERNAL API
//level 1 indices in the OS table
#define SYSCALL_OS_MAIN 0
@@ -127,8 +124,5 @@
//called by os entry point to export the api
void osApiExport(struct SlabAllocator *mainSlubAllocator);
-
-
-
#endif
diff --git a/firmware/os/inc/sensors.h b/firmware/os/inc/sensors.h
index 7074a258..19fd3ecc 100644
--- a/firmware/os/inc/sensors.h
+++ b/firmware/os/inc/sensors.h
@@ -281,6 +281,8 @@ bool sensorSelfTest(uint32_t sensorHandle);
bool sensorCfgData(uint32_t sensorHandle, void* cfgData);
uint32_t sensorGetCurRate(uint32_t sensorHandle);
uint64_t sensorGetCurLatency(uint32_t sensorHandle);
+uint32_t sensorGetHwRate(uint32_t sensorHandle);
+uint64_t sensorGetHwLatency(uint32_t sensorHandle);
uint32_t sensorGetReqRate(uint32_t sensorHandle);
uint64_t sensorGetReqLatency(uint32_t sensorHandle);
uint64_t sensorGetTime(void);
diff --git a/firmware/os/inc/seos.h b/firmware/os/inc/seos.h
index 7979d762..2b52b5c9 100644
--- a/firmware/os/inc/seos.h
+++ b/firmware/os/inc/seos.h
@@ -126,6 +126,12 @@ struct AppEventFreeData { //goes with EVT_APP_FREE_EVT_DATA
void* evtData;
};
+struct AppEventStartStop {
+ uint64_t appId;
+ uint32_t version;
+ uint16_t tid;
+};
+
typedef void (*OsDeferCbkF)(void *);
typedef void (*EventFreeF)(void* event);
@@ -262,11 +268,13 @@ bool osEraseShared();
bool osRetainCurrentEvent(TaggedPtr *evtFreeingInfoP); //called from any apps' event handling to retain current event. Only valid for first app that tries. evtFreeingInfoP filled by call and used to free evt later
void osFreeRetainedEvent(uint32_t evtType, void *evtData, TaggedPtr *evtFreeingInfoP);
-uint32_t osExtAppStopApps(uint64_t appId);
-uint32_t osExtAppEraseApps(uint64_t appId);
-uint32_t osExtAppStartApps(uint64_t appId);
+uint32_t osExtAppStopAppsByAppId(uint64_t appId);
+uint32_t osExtAppEraseAppsByAppId(uint64_t appId);
+uint32_t osExtAppStartAppsByAppId(uint64_t appId);
+uint32_t osExtAppStartAppsDelayed();
bool osAppIsChre(uint16_t tid);
+uint32_t osAppChreVersion(uint16_t tid);
/* Logging */
enum LogLevel {
diff --git a/firmware/os/inc/seos_priv.h b/firmware/os/inc/seos_priv.h
index e2dd7643..862d5224 100644
--- a/firmware/os/inc/seos_priv.h
+++ b/firmware/os/inc/seos_priv.h
@@ -19,6 +19,7 @@
#include <inttypes.h>
#include <seos.h>
+#include <chre.h>
#define NO_NODE (TaskIndex)(-1)
#define for_each_task(listHead, task) for (task = osTaskByIdx((listHead)->next); task; task = osTaskByIdx(task->list.next))
@@ -26,6 +27,7 @@
#define TID_TO_TASK_IDX(tid) (tid & TASK_TID_IDX_MASK)
#define FL_TASK_STOPPED 1
+#define FL_TASK_ABORTED 2
#define EVT_SUBSCRIBE_TO_EVT 0x00000000
#define EVT_UNSUBSCRIBE_TO_EVT 0x00000001
@@ -108,6 +110,8 @@ union SeosInternalSlabData {
union OsApiSlabItem osApiItem;
};
+typedef bool (*appMatchFunc)(const void *cookie, const struct AppHdr *);
+
uint8_t osTaskIndex(struct Task *task);
struct Task *osGetCurrentTask();
struct Task *osSetCurrentTask(struct Task *task);
@@ -122,6 +126,19 @@ static inline bool osTaskIsChre(const struct Task *task)
return task->app && (task->app->hdr.fwFlags & FL_APP_HDR_CHRE) != 0;
}
+static inline uint32_t osTaskChreVersion(const struct Task *task)
+{
+ if (osTaskIsChre(task)) {
+ // Apps loaded on 1.0 stored 0xFF in both rfu bytes
+ if (task->app->hdr.chreApiMajor == 0xFF && task->app->hdr.chreApiMinor == 0xFF)
+ return CHRE_API_VERSION_1_0;
+ else
+ return task->app->hdr.chreApiMajor << 24 | task->app->hdr.chreApiMinor << 16;
+ } else {
+ return 0;
+ }
+}
+
static inline void osTaskMakeNewTid(struct Task *task)
{
task->tid = ((task->tid + TASK_TID_INCREMENT) & TASK_TID_COUNTER_MASK) |