[ERD][APR-103] chub: support active sensor
authorBoyoung <eric.by.kim@samsung.com>
Thu, 6 Dec 2018 14:32:26 +0000 (23:32 +0900)
committerhskang <hs1218.kang@samsung.com>
Sun, 21 Apr 2019 09:09:04 +0000 (18:09 +0900)
Change-Id: I87143d7dcd7685061e60f4989192e34f6e5eb2eb
Signed-off-by: Boojin Kim <boojin.kim@samsung.com>
drivers/staging/nanohub/chub.c
drivers/staging/nanohub/chub_dbg.c
drivers/staging/nanohub/chub_ipc.c
drivers/staging/nanohub/chub_ipc.h
drivers/staging/nanohub/main.c

index 1cdb44303189ab04ed324085889a8ebc979f0544..d77fa8fb9c6bc6a744684a8d8bda3fb69aa7df8a 100644 (file)
@@ -778,7 +778,7 @@ int contexthub_ipc_write_event(struct contexthub_ipc_info *ipc,
        }
 
        if (need_ipc) {
-               if (contexthub_get_token(ipc)) {
+               if (contexthub_get_token(ipc) || (atomic_read(&ipc->chub_status) != CHUB_ST_RUN)) {
                        dev_warn(ipc->dev, "%s event:%d/%d fails chub isn't active, status:%d, inreset:%d\n",
                                __func__, event, MAILBOX_EVT_MAX, atomic_read(&ipc->chub_status), atomic_read(&ipc->in_reset));
                        return -EINVAL;
@@ -853,18 +853,18 @@ int contexthub_poweron(struct contexthub_ipc_info *ipc)
                        dev_warn(dev, "fails to download kernel\n");
                        return ret;
                }
+
                ret = contexthub_ipc_write_event(ipc, MAILBOX_EVT_POWER_ON);
                if (ret) {
                        dev_warn(dev, "fails to poweron\n");
                        return ret;
                }
-
                if (atomic_read(&ipc->chub_status) == CHUB_ST_RUN)
                        dev_info(dev, "contexthub power-on");
                else if (ipc->sel_os == true)
                        dev_warn(dev, "contexthub failed to power-on");
        } else {
-               ret = -EINVAL;
+               dev_info(dev, "%s: already power-on, status: %d", __func__, atomic_read(&ipc->chub_status));
        }
        return ret;
 }
index fa8d0f64187f6ac5a408bef5d4447d9e51b90563..566563a79d870aa15e8f5b4b88e1b118693b10d8 100644 (file)
@@ -110,7 +110,6 @@ static void chub_dbg_dump_ram(struct contexthub_ipc_info *ipc, enum chub_err_typ
                p_dbg_dump->time = sched_clock();
                p_dbg_dump->reason = reason;
 
-               ipc_dump();
                /* dump SRAM to reserved DRAM */
                memcpy_fromio(&p_dbg_dump->sram[p_dbg_dump->sram_start],
                              ipc_get_base(IPC_REG_DUMP),
index 7ffc3124867b663d245044d24ea60d5a980463dc..bcc67196dc0032f9a6b6541d9da0fc20aa6b224f 100644 (file)
@@ -74,6 +74,51 @@ void content_disassemble(struct ipc_content *content, enum ipc_region act)
 }
 #endif
 
+#define SENSORMAP_MAGIC        "SensorMap"
+#define MAX_ACTIVE_SENSOR_NUM (10)
+
+bool ipc_have_sensor_info(struct sensor_map *sensor_map)
+{
+       if (sensor_map)
+               if(!strncmp(SENSORMAP_MAGIC, sensor_map->magic, sizeof(SENSORMAP_MAGIC)))
+                       return true;
+       return false;
+}
+
+void ipc_set_sensor_id(enum sensor_type type, enum vendor_sensor_list_id id)
+{
+       struct sensor_map *ipc_sensor_map = ipc_get_base(IPC_REG_IPC_SENSORINFO);
+
+       if (ipc_have_sensor_info(ipc_sensor_map)) {
+               ipc_sensor_map->active_sensor_list[type] = id;
+               ipc_sensor_map->index++;
+       }
+}
+
+void *ipc_get_sensor_base(void)
+{
+       struct sensor_map *ipc_sensor_map = ipc_get_base(IPC_REG_IPC_SENSORINFO);
+
+       if (ipc_have_sensor_info(ipc_sensor_map))
+               return &ipc_sensor_map->active_sensor_list[0];
+
+       CSP_PRINTF_INFO("%s: fails to get ipc_sensor_map:%p, magic:%s\n",
+               __func__, ipc_sensor_map, ipc_sensor_map ? ipc_sensor_map->magic : NULL);
+       return NULL;
+}
+
+enum vendor_sensor_list_id ipc_get_sensor_id(enum sensor_type type)
+{
+       struct sensor_map *ipc_sensor_map = ipc_get_base(IPC_REG_IPC_SENSORINFO);
+
+       if (ipc_have_sensor_info(ipc_sensor_map) && (type < SENSOR_TYPE_MAX))
+               return (enum vendor_sensor_list_id)ipc_sensor_map->active_sensor_list[type];
+
+       CSP_PRINTF_INFO("%s: fails to get ipc_sensor_map:%p, type:%d, magic:%s\n",
+               __func__, ipc_sensor_map, type, ipc_sensor_map ? ipc_sensor_map->magic : NULL);
+       return sensor_list_no_active;
+}
+
 /* ipc address control functions */
 void ipc_set_base(void *addr)
 {
@@ -231,6 +276,16 @@ void *ipc_get_chub_map(void)
                        NAME_PREFIX, __func__,
                        ipc_addr[IPC_REG_PERSISTBUF].base, ipc_addr[IPC_REG_PERSISTBUF].offset, map->ipc_end);
 
+       ipc_addr[IPC_REG_IPC_SENSORINFO].base = &ipc_map->sensormap;
+       ipc_addr[IPC_REG_IPC_SENSORINFO].offset = sizeof(u8) * SENSOR_TYPE_MAX;
+#ifdef SEOS
+       if (!ipc_have_sensor_info(&ipc_map->sensormap)) {
+               CSP_PRINTF_INFO("%s: ipc set sensormap and maic: :%p\n", __func__, &ipc_map->sensormap);
+               memset(&ipc_map->sensormap, 0, sizeof(struct sensor_map));
+               strcpy(&ipc_map->sensormap.magic[0], SENSORMAP_MAGIC);
+       }
+#endif
+
        CSP_PRINTF_INFO
            ("%s: contexthub map information(v%u)\n bl(%p %d)\n os(%p %d)\n ipc(%p %d)\n ram(%p %d)\n shared(%p %d)\n dump(%p %d)\n",
             NAME_PREFIX, map->ipc_version,
@@ -242,12 +297,13 @@ void *ipc_get_chub_map(void)
             ipc_addr[IPC_REG_DUMP].base, ipc_addr[IPC_REG_DUMP].offset);
 
        CSP_PRINTF_INFO
-               ("%s: ipc_map information\n ipc(%p %d)\n data_c2a(%p %d)\n data_a2c(%p %d)\n evt_c2a(%p %d)\n evt_a2c(%p %d)\n log(%p %d)\n persistbuf(%p %d)\n",
+               ("%s: ipc_map information\n ipc(%p %d)\n data_c2a(%p %d)\n data_a2c(%p %d)\n evt_c2a(%p %d)\n evt_a2c(%p %d)\n sensormap(%p %d) \n log(%p %d)\n persistbuf(%p %d)\n",
                NAME_PREFIX, ipc_get_base(IPC_REG_IPC), ipc_get_offset(IPC_REG_IPC),
                ipc_get_base(IPC_REG_IPC_C2A), ipc_get_offset(IPC_REG_IPC_C2A),
                ipc_get_base(IPC_REG_IPC_A2C), ipc_get_offset(IPC_REG_IPC_A2C),
                ipc_get_base(IPC_REG_IPC_EVT_C2A), ipc_get_offset(IPC_REG_IPC_EVT_C2A),
                ipc_get_base(IPC_REG_IPC_EVT_A2C), ipc_get_offset(IPC_REG_IPC_EVT_A2C),
+               ipc_get_base(IPC_REG_IPC_SENSORINFO), ipc_get_offset(IPC_REG_IPC_SENSORINFO),
                ipc_get_base(IPC_REG_LOG), ipc_get_offset(IPC_REG_LOG),
                ipc_get_base(IPC_REG_PERSISTBUF), ipc_get_offset(IPC_REG_PERSISTBUF));
 
index bbb11a22b7e74db930b378115d205c6b02829f33..5c11b3ec1a0dc1398ea9207e1fc3ec08a9aaa51d 100644 (file)
 #endif
 #endif
 
-#ifdef LOWLEVEL_DEBUG
-#define DEBUG_PRINT(lv, fmt, ...)      \
-       ((DEBUG_LEVEL == (0)) ? (CSP_PRINTF_INFO(fmt, ##__VA_ARGS__)) : \
-       ((DEBUG_LEVEL == (lv)) ? (CSP_PRINTF_INFO(fmt, ##__VA_ARGS__)) : (NULL)))
-#else
-#define DEBUG_PRINT(level, fmt, ...)
-#endif
+#define SENSOR_NAME_SIZE (32)
 
 /* contexthub bootargs */
 #define BL_OFFSET              (0x0)
@@ -84,6 +78,9 @@
 #define KERNEL_LOG_ON          (0x1)
 #define KERNEL_LOG_OFF         (0x0)
 
+#define AP_WAKE             (0x1)
+#define AP_SLEEP            (0x2)
+
 #define READY_TO_GO 99
 #define MAILBOX_REQUEST_KLOG_ON (0x1)
 #define MAILBOX_REQUEST_KLOG_OFF (0x2)
@@ -212,6 +209,7 @@ enum ipc_region {
        IPC_REG_IPC_EVT_C2A_CTRL,
        IPC_REG_IPC_A2C,
        IPC_REG_IPC_C2A,
+       IPC_REG_IPC_SENSORINFO,
        IPC_REG_SHARED,
        IPC_REG_RAM,
        IPC_REG_LOG,
@@ -353,6 +351,73 @@ struct ipc_buf {
 #endif
 };
 
+/* sensor list and id sync with chre sensorhal */
+enum vendor_sensor_list_id {
+       sensor_list_no_active,
+       sensor_list_rpr051_prox,
+       sensor_list_rpr051_ligth,
+       sensor_list_bmi160_accel,
+       sensor_list_bmi160_accel_ucal,
+       sensor_list_bmi160_gyro,
+       sensor_list_bmi160_gyro_ucal,
+       sensor_list_stlis3mdl_mag,
+       sensor_list_stlis3mdl_mag_ucal,
+       sensor_list_bmp280_press,
+       sensor_list_max,
+};
+
+enum sensor_type {
+    SENSOR_TYPE_META_DATA = 0,
+    SENSOR_TYPE_ACCELEROMETER = 1,
+    SENSOR_TYPE_MAGNETIC_FIELD = 2,
+    SENSOR_TYPE_ORIENTATION = 3,
+    SENSOR_TYPE_GYROSCOPE = 4,
+    SENSOR_TYPE_LIGHT = 5,
+    SENSOR_TYPE_PRESSURE = 6,
+    SENSOR_TYPE_TEMPERATURE = 7,
+    SENSOR_TYPE_PROXIMITY = 8,
+    SENSOR_TYPE_GRAVITY = 9,
+    SENSOR_TYPE_LINEAR_ACCELERATION = 10,
+    SENSOR_TYPE_ROTATION_VECTOR = 11,
+    SENSOR_TYPE_RELATIVE_HUMIDITY = 12,
+    SENSOR_TYPE_AMBIENT_TEMPERATURE = 13,
+    SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED = 14,
+    SENSOR_TYPE_GAME_ROTATION_VECTOR = 15,
+    SENSOR_TYPE_GYROSCOPE_UNCALIBRATED = 16,
+    SENSOR_TYPE_SIGNIFICANT_MOTION = 17,
+    SENSOR_TYPE_STEP_DETECTOR = 18,
+    SENSOR_TYPE_STEP_COUNTER = 19,
+    SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR = 20,
+    SENSOR_TYPE_HEART_RATE = 21,
+    SENSOR_TYPE_TILT_DETECTOR = 22,
+    SENSOR_TYPE_WAKE_GESTURE = 23,
+    SENSOR_TYPE_GLANCE_GESTURE = 24,
+    SENSOR_TYPE_PICK_UP_GESTURE = 25,
+    SENSOR_TYPE_WRIST_TILT_GESTURE = 26,
+    SENSOR_TYPE_DEVICE_ORIENTATION = 27,
+    SENSOR_TYPE_POSE_6DOF = 28,
+    SENSOR_TYPE_STATIONARY_DETECT = 29,
+    SENSOR_TYPE_MOTION_DETECT = 30,
+    SENSOR_TYPE_HEART_BEAT = 31,
+    SENSOR_TYPE_DYNAMIC_SENSOR_META = 32,
+    SENSOR_TYPE_ADDITIONAL_INFO = 33,
+    SENSOR_TYPE_LOW_LATENCY_OFFBODY_DETECT = 34,
+    SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED = 35,
+    SENSOR_TYPE_MAX,
+};
+
+struct sensor_info {
+       bool active;
+       int type;
+       enum vendor_sensor_list_id id;
+};
+
+struct sensor_map {
+       char magic[16];
+       int index;
+       u8 active_sensor_list[SENSOR_TYPE_MAX];
+};
+
 struct ipc_debug {
        u32 event;
        u32 val[IPC_DATA_MAX];
@@ -362,6 +427,7 @@ struct ipc_map_area {
        struct ipc_buf data[IPC_DATA_MAX];
        struct ipc_evt evt[IPC_EVT_MAX];
        struct ipc_debug dbg;
+       struct sensor_map sensormap;
        struct ipc_logbuf logbuf;
 };
 
@@ -417,6 +483,11 @@ struct ipc_map_area {
 #define IPC_HW_SET_MCUCTL(base, val) \
        __raw_write32((val), (base) + REG_MAILBOX_MCUCTL)
 
+bool ipc_have_sensor_info(struct sensor_map *sensor_map);
+void ipc_set_sensor_id(enum sensor_type type, enum vendor_sensor_list_id id);
+enum vendor_sensor_list_id ipc_get_sensor_id(enum sensor_type type);
+void *ipc_get_sensor_base(void);
+
 /* channel ctrl functions */
 void ipc_print_channel(void);
 int ipc_check_valid(void);
index dd626e6c87847673d9ff77dfe82916918015f766..1d17bd83df745231ec058831ee8e7a6c7b0ed7e0 100644 (file)
@@ -1144,6 +1144,29 @@ static ssize_t chub_chipid_store(struct device *dev,
        }
 }
 
+static ssize_t chub_sensortype_store(struct device *dev,
+                             struct device_attribute *attr,
+                             const char *buf, size_t count)
+{
+       return 0;
+}
+
+static ssize_t chub_sensortype_show(struct device *dev,
+                            struct device_attribute *attr, char *buf)
+{
+       struct sensor_map *sensor_map = ipc_get_base(IPC_REG_IPC_SENSORINFO);
+
+       dev_err(dev, "%s: cann't get sensorinfo: %p\n", __func__, sensor_map);
+       if (ipc_have_sensor_info(sensor_map)) {
+               memcpy(buf, ipc_get_sensor_base(), ipc_get_offset(IPC_REG_IPC_SENSORINFO));
+               return ipc_get_offset(IPC_REG_IPC_SENSORINFO);
+       }
+
+       dev_err(dev, "%s: fails to get sensorinfo:%p, magic:%s\n",
+       __func__, sensor_map, sensor_map ? sensor_map->magic : NULL);
+       return 0;
+}
+
 void nanohub_add_dump_request(struct nanohub_data *data)
 {
        struct nanohub_io *io = &data->io[ID_NANOHUB_SENSOR];
@@ -1182,6 +1205,7 @@ static struct device_attribute attributes[] = {
 #endif
 #ifdef CONFIG_NANOHUB_MAILBOX
        __ATTR(chipid, 0664, chub_chipid_show, chub_chipid_store),
+       __ATTR(sensortype, 0775, chub_sensortype_show, chub_sensortype_store),
 #endif
 };