diff --git a/dts/bindings/sensor/zephyr,sensing-sensor.yaml b/dts/bindings/sensor/zephyr,sensing-sensor.yaml index 6b78dbdec0a..e0b8aae492d 100644 --- a/dts/bindings/sensor/zephyr,sensing-sensor.yaml +++ b/dts/bindings/sensor/zephyr,sensing-sensor.yaml @@ -7,8 +7,8 @@ description: Sensing subsystem sensor common properties bindings. include: sensor-device.yaml properties: - sensor-type: - type: int + sensor-types: + type: array required: true description: sensor type id (follow HID spec definition) @@ -24,6 +24,10 @@ properties: type: phandles description: sensor reporters + reporters-index: + type: array + description: the index in sensor-types of reporter if the reporter support multiple sensor-types + stream-mode: type: boolean description: sensor works on stream mode or poll mode diff --git a/include/zephyr/sensing/sensing_sensor.h b/include/zephyr/sensing/sensing_sensor.h index 85f0db5a2a8..f1515c02574 100644 --- a/include/zephyr/sensing/sensing_sensor.h +++ b/include/zephyr/sensing/sensing_sensor.h @@ -112,82 +112,78 @@ struct sensing_sensor { struct sensing_connection *conns; }; -#define PHANDLE_DEVICE_BY_IDX(idx, node, prop) \ - DEVICE_DT_GET(DT_PHANDLE_BY_IDX(node, prop, idx)) +#define SENSING_SENSOR_INFO_NAME(node, idx) \ + _CONCAT(_CONCAT(__sensing_sensor_info_, idx), DEVICE_DT_NAME_GET(node)) -#define PHANDLE_DEVICE_LIST(node, prop) \ -{ \ - LISTIFY(DT_PROP_LEN_OR(node, prop, 0), \ - PHANDLE_DEVICE_BY_IDX, \ - (,), \ - node, \ - prop) \ -} - -#define SENSING_SENSOR_INFO_NAME(node) \ - _CONCAT(__sensing_sensor_info_, DEVICE_DT_NAME_GET(node)) - -#define SENSING_SENSOR_INFO_DEFINE(node) \ +#define SENSING_SENSOR_INFO_DEFINE(node, idx) \ const static STRUCT_SECTION_ITERABLE(sensing_sensor_info, \ - SENSING_SENSOR_INFO_NAME(node)) = { \ - .type = DT_PROP(node, sensor_type), \ + SENSING_SENSOR_INFO_NAME(node, idx)) = { \ + .type = DT_PROP_BY_IDX(node, sensor_types, idx), \ .name = DT_NODE_FULL_NAME(node), \ .friendly_name = DT_PROP(node, friendly_name), \ .vendor = DT_NODE_VENDOR_OR(node, NULL), \ .model = DT_NODE_MODEL_OR(node, NULL), \ - .minimal_interval = DT_PROP(node, minimal_interval), \ + .minimal_interval = DT_PROP(node, minimal_interval),\ }; -#define SENSING_CONNECTIONS_NAME(node) \ - _CONCAT(__sensing_connections, DEVICE_DT_NAME_GET(node)) +#define SENSING_CONNECTIONS_NAME(node, idx) \ + _CONCAT(_CONCAT(__sensing_connections_, idx), DEVICE_DT_NAME_GET(node)) + +#define SENSING_SENSOR_SOURCE_NAME(idx, node) \ + SENSING_SENSOR_NAME(DT_PHANDLE_BY_IDX(node, reporters, idx), \ + DT_PROP_BY_IDX(node, reporters_index, idx)) #define SENSING_SENSOR_SOURCE_EXTERN(idx, node) \ -extern struct sensing_sensor SENSING_SENSOR_NAME(DT_PHANDLE_BY_IDX(node, reporters, idx)); +extern struct sensing_sensor SENSING_SENSOR_SOURCE_NAME(idx, node); \ -#define SENSING_CONNECTION_INITIALIZER(source_node, cb_list_ptr) \ +#define SENSING_CONNECTION_INITIALIZER(source_name, cb_list_ptr) \ { \ .callback_list = *cb_list_ptr, \ - .source = &SENSING_SENSOR_NAME(source_node), \ + .source = &source_name, \ } -#define SENSING_CONNECTION_DEFINE(idx, node, cb_list_ptr) \ - SENSING_CONNECTION_INITIALIZER(DT_PHANDLE_BY_IDX(node, reporters, idx), cb_list_ptr) +#define SENSING_CONNECTION_DEFINE(idx, node, cb_list_ptr) \ + SENSING_CONNECTION_INITIALIZER(SENSING_SENSOR_SOURCE_NAME(idx, node), \ + cb_list_ptr) -#define SENSING_CONNECTIONS_DEFINE(node, num, cb_list_ptr) \ +#define SENSING_CONNECTIONS_DEFINE(node, idx, num, cb_list_ptr) \ LISTIFY(num, SENSING_SENSOR_SOURCE_EXTERN, \ (), node) \ static struct sensing_connection \ - SENSING_CONNECTIONS_NAME(node)[(num)] = { \ + SENSING_CONNECTIONS_NAME(node, idx)[(num)] = { \ LISTIFY(num, SENSING_CONNECTION_DEFINE, \ (,), node, cb_list_ptr) \ }; -#define SENSING_SENSOR_IODEV_NAME(node) \ - _CONCAT(__sensing_iodev_, DEVICE_DT_NAME_GET(node)) +#define SENSING_SENSOR_IODEV_NAME(node, idx) \ + _CONCAT(_CONCAT(__sensing_iodev_, idx), DEVICE_DT_NAME_GET(node)) -#define SENSING_SENSOR_IODEV_DEFINE(node) \ +#define SENSING_SENSOR_IODEV_DEFINE(node, idx) \ COND_CODE_1(DT_PROP(node, stream_mode), \ - (SENSOR_DT_STREAM_IODEV(SENSING_SENSOR_IODEV_NAME(node), node)), \ - (SENSOR_DT_READ_IODEV(SENSING_SENSOR_IODEV_NAME(node), node))); + (SENSOR_DT_STREAM_IODEV(SENSING_SENSOR_IODEV_NAME(node, idx), node)), \ + (SENSOR_DT_READ_IODEV(SENSING_SENSOR_IODEV_NAME(node, idx), node))); -#define SENSING_SENSOR_NAME(node) \ - _CONCAT(__sensing_sensor_, DEVICE_DT_NAME_GET(node)) +#define SENSING_SENSOR_NAME(node, idx) \ + _CONCAT(_CONCAT(__sensing_sensor_, idx), DEVICE_DT_NAME_GET(node)) -#define SENSING_SENSOR_DEFINE(node, reg_ptr, cb_list_ptr) \ - SENSING_SENSOR_INFO_DEFINE(node) \ - SENSING_CONNECTIONS_DEFINE(node, \ +#define SENSING_SENSOR_DEFINE(node, prop, idx, reg_ptr, cb_list_ptr) \ + SENSING_SENSOR_INFO_DEFINE(node, idx) \ + SENSING_CONNECTIONS_DEFINE(node, idx, \ DT_PROP_LEN_OR(node, reporters, 0), cb_list_ptr)\ - SENSING_SENSOR_IODEV_DEFINE(node) \ + SENSING_SENSOR_IODEV_DEFINE(node, idx) \ STRUCT_SECTION_ITERABLE(sensing_sensor, \ - SENSING_SENSOR_NAME(node)) = { \ + SENSING_SENSOR_NAME(node, idx)) = { \ .dev = DEVICE_DT_GET(node), \ - .info = &SENSING_SENSOR_INFO_NAME(node), \ + .info = &SENSING_SENSOR_INFO_NAME(node, idx), \ .register_info = reg_ptr, \ .reporter_num = DT_PROP_LEN_OR(node, reporters, 0), \ - .conns = SENSING_CONNECTIONS_NAME(node), \ - .iodev = &SENSING_SENSOR_IODEV_NAME(node), \ + .conns = SENSING_CONNECTIONS_NAME(node, idx), \ + .iodev = &SENSING_SENSOR_IODEV_NAME(node, idx), \ }; +#define SENSING_SENSORS_DEFINE(node, reg_ptr, cb_list_ptr) \ + DT_FOREACH_PROP_ELEM_VARGS(node, sensor_types, \ + SENSING_SENSOR_DEFINE, reg_ptr, cb_list_ptr) /** * @brief Like SENSOR_DEVICE_DT_DEFINE() with sensing specifics. * @@ -217,7 +213,7 @@ extern struct sensing_sensor SENSING_SENSOR_NAME(DT_PHANDLE_BY_IDX(node, reporte * @param api_ptr Provides an initial pointer to the API function struct used * by the driver. Can be NULL. */ -#define SENSING_SENSOR_DT_DEFINE(node_id, reg_ptr, cb_list_ptr, \ +#define SENSING_SENSORS_DT_DEFINE(node_id, reg_ptr, cb_list_ptr, \ init_fn, pm_device, \ data_ptr, cfg_ptr, level, prio, \ api_ptr, ...) \ @@ -225,19 +221,19 @@ extern struct sensing_sensor SENSING_SENSOR_NAME(DT_PHANDLE_BY_IDX(node, reporte data_ptr, cfg_ptr, level, prio, \ api_ptr, __VA_ARGS__); \ \ - SENSING_SENSOR_DEFINE(node_id, reg_ptr, cb_list_ptr); + SENSING_SENSORS_DEFINE(node_id, reg_ptr, cb_list_ptr); /** - * @brief Like SENSING_SENSOR_DT_DEFINE() for an instance of a DT_DRV_COMPAT + * @brief Like SENSING_SENSORS_DT_DEFINE() for an instance of a DT_DRV_COMPAT * compatible * * @param inst instance number. This is replaced by - * DT_DRV_COMPAT(inst) in the call to SENSING_SENSOR_DT_DEFINE(). + * DT_DRV_COMPAT(inst) in the call to SENSING_SENSORS_DT_DEFINE(). * - * @param ... other parameters as expected by SENSING_SENSOR_DT_DEFINE(). + * @param ... other parameters as expected by SENSING_SENSORS_DT_DEFINE(). */ -#define SENSING_SENSOR_DT_INST_DEFINE(inst, reg_ptr, cb_list_ptr, ...) \ - SENSING_SENSOR_DT_DEFINE(DT_DRV_INST(inst), reg_ptr, \ +#define SENSING_SENSORS_DT_INST_DEFINE(inst, reg_ptr, cb_list_ptr, ...) \ + SENSING_SENSORS_DT_DEFINE(DT_DRV_INST(inst), reg_ptr, \ cb_list_ptr, __VA_ARGS__) /** diff --git a/samples/subsys/sensing/simple/boards/native_sim.overlay b/samples/subsys/sensing/simple/boards/native_sim.overlay index 4f51532424f..73a81b81f64 100644 --- a/samples/subsys/sensing/simple/boards/native_sim.overlay +++ b/samples/subsys/sensing/simple/boards/native_sim.overlay @@ -4,6 +4,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +#include + &i2c0 { bmi160_i2c: bmi@68 { compatible = "bosch,bmi160"; @@ -24,20 +26,20 @@ compatible = "zephyr,sensing"; status = "okay"; - base_accel: base-accel { + base_accel_gyro: base-accel-gyro { compatible = "zephyr,sensing-phy-3d-sensor"; status = "okay"; - sensor-type = <0x73>; - friendly-name = "Base Accelerometer Sensor"; + sensor-types = ; + friendly-name = "Base Accel Gyro Sensor"; minimal-interval = <625>; underlying-device = <&bmi160_i2c>; }; - lid_accel: lid-accel { + lid_accel_gyro: lid-accel-gyro { compatible = "zephyr,sensing-phy-3d-sensor"; status = "okay"; - sensor-type = <0x73>; - friendly-name = "Lid Accelerometer Sensor"; + sensor-types = ; + friendly-name = "Lid Accel Gyro Sensor"; minimal-interval = <625>; underlying-device = <&bmi160_spi>; }; @@ -45,9 +47,10 @@ hinge_angle: hinge-angle { compatible = "zephyr,sensing-hinge-angle"; status = "okay"; - sensor-type = <0x20B>; + sensor-types = ; friendly-name = "Hinge Angle Sensor"; - reporters = <&base_accel &lid_accel>; + reporters = <&base_accel_gyro &lid_accel_gyro>; + reporters-index = <0 0>; minimal-interval = <100000>; stream-mode; }; diff --git a/samples/subsys/sensing/simple/src/main.c b/samples/subsys/sensing/simple/src/main.c index 277517bd307..b57c65c718c 100644 --- a/samples/subsys/sensing/simple/src/main.c +++ b/samples/subsys/sensing/simple/src/main.c @@ -43,20 +43,17 @@ int main(void) const struct sensing_callback_list base_acc_cb_list = { .on_data_event = &acc_data_event_callback, }; - const struct sensing_callback_list lid_acc_cb_list = { - .on_data_event = &acc_data_event_callback, - }; const struct sensing_callback_list hinge_angle_cb_list = { .on_data_event = &hinge_angle_data_event_callback, }; const struct sensing_sensor_info *info; sensing_sensor_handle_t base_acc; - sensing_sensor_handle_t lid_acc; sensing_sensor_handle_t hinge_angle; struct sensing_sensor_config base_acc_config; - struct sensing_sensor_config lid_acc_config; struct sensing_sensor_config hinge_angle_config; - const struct sensing_sensor_info *tmp_sensor_info; + const struct sensing_sensor_info *tmp_sensor_info = NULL; + const struct sensing_sensor_info *accle_info = NULL; + const struct sensing_sensor_info *hinge_info = NULL; int ret, i, num = 0; ret = sensing_get_sensors(&num, &info); @@ -71,25 +68,27 @@ int main(void) info[i].name, info[i].friendly_name, info[i].type); + switch (info[i].type) { + case SENSING_SENSOR_TYPE_MOTION_ACCELEROMETER_3D: + accle_info = &info[i]; + break; + case SENSING_SENSOR_TYPE_MOTION_HINGE_ANGLE: + hinge_info = &info[i]; + break; + default: + break; + } } LOG_INF("sensing subsystem run successfully"); - ret = sensing_open_sensor(&info[0], &base_acc_cb_list, &base_acc); + ret = sensing_open_sensor(accle_info, &base_acc_cb_list, &base_acc); if (ret) { LOG_ERR("sensing_open_sensor, type:0x%x index:0 error:%d", SENSING_SENSOR_TYPE_MOTION_ACCELEROMETER_3D, ret); } - ret = sensing_open_sensor_by_dt(DEVICE_DT_GET(DT_NODELABEL(lid_accel)), - &lid_acc_cb_list, - &lid_acc); - if (ret) { - LOG_ERR("sensing_open_sensor_by_dt, type:0x%x index:1 error:%d", - SENSING_SENSOR_TYPE_MOTION_ACCELEROMETER_3D, ret); - } - ret = sensing_open_sensor_by_dt(DEVICE_DT_GET(DT_NODELABEL(hinge_angle)), - &hinge_angle_cb_list, + ret = sensing_open_sensor(hinge_info, &hinge_angle_cb_list, &hinge_angle); if (ret) { LOG_ERR("sensing_open_sensor_by_type, type:0x%x index:0 error:%d", @@ -104,13 +103,6 @@ int main(void) LOG_ERR("base_acc sensing_set_interval error:%d\n", ret); } - lid_acc_config.attri = SENSING_SENSOR_ATTRIBUTE_INTERVAL; - lid_acc_config.interval = 100 * USEC_PER_MSEC; - ret = sensing_set_config(lid_acc, &lid_acc_config, 1); - if (ret) { - LOG_ERR("lid_acc sensing_set_interval error:%d\n", ret); - } - tmp_sensor_info = sensing_get_sensor_info(hinge_angle); hinge_angle_config.attri = SENSING_SENSOR_ATTRIBUTE_INTERVAL; hinge_angle_config.interval = tmp_sensor_info->minimal_interval; @@ -120,7 +112,6 @@ int main(void) } memset(&base_acc_config, 0x00, sizeof(struct sensing_sensor_config)); - memset(&lid_acc_config, 0x00, sizeof(struct sensing_sensor_config)); memset(&hinge_angle_config, 0x00, sizeof(struct sensing_sensor_config)); /* get base acc, lid acc, hinge sensor interval */ @@ -130,12 +121,6 @@ int main(void) LOG_ERR("base_acc sensing_get_interval error:%d\n", ret); } - lid_acc_config.attri = SENSING_SENSOR_ATTRIBUTE_INTERVAL; - ret = sensing_get_config(lid_acc, &lid_acc_config, 1); - if (ret) { - LOG_ERR("lid_acc sensing_get_interval error:%d\n", ret); - } - hinge_angle_config.attri = SENSING_SENSOR_ATTRIBUTE_INTERVAL; ret = sensing_get_config(hinge_angle, &hinge_angle_config, 1); if (ret) { @@ -151,14 +136,6 @@ int main(void) LOG_ERR("base_acc sensing_set_sensitivity error:%d\n", ret); } - lid_acc_config.attri = SENSING_SENSOR_ATTRIBUTE_SENSITIVITY; - lid_acc_config.data_field = SENSING_SENSITIVITY_INDEX_ALL; - lid_acc_config.sensitivity = 0; - ret = sensing_set_config(lid_acc, &lid_acc_config, 1); - if (ret) { - LOG_ERR("lid_acc sensing_set_sensitivity error:%d\n", ret); - } - hinge_angle_config.attri = SENSING_SENSOR_ATTRIBUTE_SENSITIVITY; hinge_angle_config.data_field = SENSING_SENSITIVITY_INDEX_ALL; hinge_angle_config.sensitivity = 1; @@ -168,7 +145,6 @@ int main(void) } memset(&base_acc_config, 0x00, sizeof(struct sensing_sensor_config)); - memset(&lid_acc_config, 0x00, sizeof(struct sensing_sensor_config)); memset(&hinge_angle_config, 0x00, sizeof(struct sensing_sensor_config)); /* get base acc, lid acc, hinge sensor sensitivity */ @@ -179,13 +155,6 @@ int main(void) LOG_ERR("base_acc sensing_get_sensitivity error:%d\n", ret); } - lid_acc_config.attri = SENSING_SENSOR_ATTRIBUTE_SENSITIVITY; - lid_acc_config.data_field = SENSING_SENSITIVITY_INDEX_ALL; - ret = sensing_get_config(lid_acc, &lid_acc_config, 1); - if (ret) { - LOG_ERR("lid_acc sensing_get_sensitivity error:%d\n", ret); - } - hinge_angle_config.attri = SENSING_SENSOR_ATTRIBUTE_SENSITIVITY; hinge_angle_config.data_field = SENSING_SENSITIVITY_INDEX_ALL; ret = sensing_get_config(hinge_angle, &hinge_angle_config, 1); @@ -193,10 +162,5 @@ int main(void) LOG_ERR("hinge_angle sensing_get_sensitivity error:%d\n", ret); } - ret = sensing_close_sensor(&lid_acc); - if (ret) { - LOG_ERR("sensing_close_sensor:%p error:%d", lid_acc, ret); - } - return 0; } diff --git a/subsys/sensing/sensor/hinge_angle/hinge_angle.c b/subsys/sensing/sensor/hinge_angle/hinge_angle.c index 9df92f5927b..9d9dc70cef7 100644 --- a/subsys/sensing/sensor/hinge_angle/hinge_angle.c +++ b/subsys/sensing/sensor/hinge_angle/hinge_angle.c @@ -157,7 +157,7 @@ static void hinge_reporter_on_data_event(sensing_sensor_handle_t handle, .on_data_event = hinge_reporter_on_data_event, \ .context = &_CONCAT(hinge_ctx, _inst), \ }; \ - SENSING_SENSOR_DT_INST_DEFINE(_inst, &hinge_reg, \ + SENSING_SENSORS_DT_INST_DEFINE(_inst, &hinge_reg, \ &_CONCAT(hinge_cb, _inst), \ &hinge_init, NULL, \ &_CONCAT(hinge_ctx, _inst), NULL, \ diff --git a/subsys/sensing/sensor/phy_3d_sensor/phy_3d_sensor.c b/subsys/sensing/sensor/phy_3d_sensor/phy_3d_sensor.c index d721836f91b..1a725a5bc01 100644 --- a/subsys/sensing/sensor/phy_3d_sensor/phy_3d_sensor.c +++ b/subsys/sensing/sensor/phy_3d_sensor/phy_3d_sensor.c @@ -4,6 +4,7 @@ * SPDX-License-Identifier: Apache-2.0 */ +#include "zephyr/devicetree.h" #define DT_DRV_COMPAT zephyr_sensing_phy_3d_sensor #include @@ -250,9 +251,9 @@ static const struct sensing_sensor_register_info phy_3d_sensor_reg = { .hw_dev = DEVICE_DT_GET( \ DT_PHANDLE(DT_DRV_INST(_inst), \ underlying_device)), \ - .sensor_type = DT_PROP(DT_DRV_INST(_inst), sensor_type),\ + .sensor_type = DT_PROP_BY_IDX(DT_DRV_INST(_inst), sensor_types, 0),\ }; \ - SENSING_SENSOR_DT_INST_DEFINE(_inst, &phy_3d_sensor_reg, NULL, \ + SENSING_SENSORS_DT_INST_DEFINE(_inst, &phy_3d_sensor_reg, NULL, \ &phy_3d_sensor_init, NULL, \ &_CONCAT(data, _inst), &_CONCAT(cfg, _inst), \ POST_KERNEL, CONFIG_SENSOR_INIT_PRIORITY, \