}
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;
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;
}
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),
}
#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)
{
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,
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));
#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)
#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)
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,
#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];
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;
};
#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);
}
}
+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];
#endif
#ifdef CONFIG_NANOHUB_MAILBOX
__ATTR(chipid, 0664, chub_chipid_show, chub_chipid_store),
+ __ATTR(sensortype, 0775, chub_sensortype_show, chub_sensortype_store),
#endif
};