You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ji...@apache.org on 2026/01/26 07:04:18 UTC
(nuttx) branch master updated (85ba80a90e4 -> ae85903f71d)
This is an automated email from the ASF dual-hosted git repository.
jiuzhudong pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
from 85ba80a90e4 crypto/ecc: add SPDX license identifier
new 8127c485075 drivers/sensors: sensor rpmsg add new features.
new df2709085ca drivers/sensors: using worker to broadcast advertisement message when remote core connect.
new 4dd415b6c1e drivers/sensors: sensor wakeup mode change.
new ae85903f71d drivers/sensors: wakeup mode optimization.
The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
drivers/sensors/adxl362_uorb.c | 1 +
drivers/sensors/adxl372_uorb.c | 1 +
drivers/sensors/bh1749nuc_uorb.c | 1 +
drivers/sensors/bme680_uorb.c | 1 +
drivers/sensors/bme688_uorb.c | 1 +
drivers/sensors/bmi270_uorb.c | 1 +
drivers/sensors/bmm150_uorb.c | 1 +
drivers/sensors/fs3000_uorb.c | 1 +
drivers/sensors/lsm9ds1_uorb.c | 1 +
drivers/sensors/ltr308_uorb.c | 1 +
drivers/sensors/mpu9250_uorb.c | 1 +
drivers/sensors/qmi8658_uorb.c | 1 +
drivers/sensors/sensor.c | 59 ++++++++++++++++++++++----
drivers/sensors/sensor_rpmsg.c | 89 ++++++++++++++++++++++++++++++++--------
include/nuttx/sensors/ioctl.h | 15 +++++--
include/nuttx/sensors/sensor.h | 19 +++++++++
include/nuttx/uorb.h | 5 ++-
17 files changed, 169 insertions(+), 30 deletions(-)
(nuttx) 02/04: drivers/sensors: using worker to broadcast advertisement message when remote core connect.
Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
jiuzhudong pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit df2709085cafef5f919263180fb8037311ff699f
Author: dongjiuzhu1 <do...@xiaomi.com>
AuthorDate: Mon Apr 14 10:57:54 2025 +0800
drivers/sensors: using worker to broadcast advertisement message
when remote core connect.
using worker instead of rptun thread to broadcast advertisement
message because the rptun thread can't process rx message when it
calls the ns_bound function.
And the advertisement message to remote core will generate many
the advertisement ack message from remote core, these advertisement
ack messages can't be processed at times by rptun thread.
This can cause rptun thread to block when the number of advertisement
message exceeds the number of ipc buffers between local core and
remote core.
Signed-off-by: dongjiuzhu1 <do...@xiaomi.com>
---
drivers/sensors/sensor_rpmsg.c | 32 ++++++++++++++++++++------------
1 file changed, 20 insertions(+), 12 deletions(-)
diff --git a/drivers/sensors/sensor_rpmsg.c b/drivers/sensors/sensor_rpmsg.c
index 16e97f6a2ba..4c0714ea62c 100644
--- a/drivers/sensors/sensor_rpmsg.c
+++ b/drivers/sensors/sensor_rpmsg.c
@@ -106,6 +106,7 @@ struct sensor_rpmsg_ept_s
struct list_node node;
struct rpmsg_endpoint ept;
struct work_s work;
+ struct work_s bound_work;
rmutex_t lock;
FAR void *buffer;
uint64_t expire;
@@ -1404,19 +1405,11 @@ static int sensor_rpmsg_ept_cb(FAR struct rpmsg_endpoint *ept,
return -EINVAL;
}
-static void sensor_rpmsg_device_ns_bound(FAR struct rpmsg_endpoint *ept)
+static void sensor_rpmsg_bound_worker(FAR void *arg)
{
- FAR struct sensor_rpmsg_ept_s *sre;
+ FAR struct sensor_rpmsg_ept_s *sre = arg;
FAR struct sensor_rpmsg_dev_s *dev;
- sre = container_of(ept, struct sensor_rpmsg_ept_s, ept);
-
- down_write(&g_ept_lock);
- list_add_tail(&g_eptlist, &sre->node);
- up_write(&g_ept_lock);
-
- /* Broadcast all device to ready ept */
-
down_read(&g_dev_lock);
list_for_every_entry(&g_devlist, dev,
struct sensor_rpmsg_dev_s, node)
@@ -1424,12 +1417,12 @@ static void sensor_rpmsg_device_ns_bound(FAR struct rpmsg_endpoint *ept)
sensor_rpmsg_lock(dev);
if (dev->nadvertisers > 0)
{
- sensor_rpmsg_advsub_one(dev, ept, SENSOR_RPMSG_ADVERTISE);
+ sensor_rpmsg_advsub_one(dev, &sre->ept, SENSOR_RPMSG_ADVERTISE);
}
if (dev->nsubscribers > 0)
{
- sensor_rpmsg_advsub_one(dev, ept, SENSOR_RPMSG_SUBSCRIBE);
+ sensor_rpmsg_advsub_one(dev, &sre->ept, SENSOR_RPMSG_SUBSCRIBE);
}
sensor_rpmsg_unlock(dev);
@@ -1438,6 +1431,21 @@ static void sensor_rpmsg_device_ns_bound(FAR struct rpmsg_endpoint *ept)
up_read(&g_dev_lock);
}
+static void sensor_rpmsg_device_ns_bound(FAR struct rpmsg_endpoint *ept)
+{
+ FAR struct sensor_rpmsg_ept_s *sre;
+
+ sre = container_of(ept, struct sensor_rpmsg_ept_s, ept);
+
+ down_write(&g_ept_lock);
+ list_add_tail(&g_eptlist, &sre->node);
+ up_write(&g_ept_lock);
+
+ /* Broadcast all device to ready ept in work context */
+
+ work_queue(HPWORK, &sre->bound_work, sensor_rpmsg_bound_worker, sre, 0);
+}
+
static void sensor_rpmsg_ept_release(FAR struct rpmsg_endpoint *ept)
{
FAR struct sensor_rpmsg_ept_s *sre;
(nuttx) 01/04: drivers/sensors: sensor rpmsg add new features.
Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
jiuzhudong pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 8127c485075dd4ddb88369b76eb8c9063ab64edc
Author: dongjiuzhu1 <do...@xiaomi.com>
AuthorDate: Mon Jan 13 23:25:08 2025 +0800
drivers/sensors: sensor rpmsg add new features.
support set_nonwakeup ops for sensor driver to save power
Signed-off-by: dongjiuzhu1 <do...@xiaomi.com>
Signed-off-by: likun17 <li...@xiaomi.com>
---
drivers/sensors/adxl362_uorb.c | 1 +
drivers/sensors/adxl372_uorb.c | 1 +
drivers/sensors/bh1749nuc_uorb.c | 1 +
drivers/sensors/bme680_uorb.c | 1 +
drivers/sensors/bme688_uorb.c | 1 +
drivers/sensors/bmi270_uorb.c | 1 +
drivers/sensors/bmm150_uorb.c | 1 +
drivers/sensors/fs3000_uorb.c | 1 +
drivers/sensors/lsm9ds1_uorb.c | 1 +
drivers/sensors/ltr308_uorb.c | 1 +
drivers/sensors/mpu9250_uorb.c | 1 +
drivers/sensors/qmi8658_uorb.c | 1 +
drivers/sensors/sensor.c | 58 +++++++++++++++++++++++++++++++++-------
drivers/sensors/sensor_rpmsg.c | 57 ++++++++++++++++++++++++++++++++++++---
include/nuttx/sensors/ioctl.h | 15 ++++++++---
include/nuttx/sensors/sensor.h | 19 +++++++++++++
include/nuttx/uorb.h | 5 +++-
17 files changed, 148 insertions(+), 18 deletions(-)
diff --git a/drivers/sensors/adxl362_uorb.c b/drivers/sensors/adxl362_uorb.c
index dbb7ad628e4..11af01e5533 100644
--- a/drivers/sensors/adxl362_uorb.c
+++ b/drivers/sensors/adxl362_uorb.c
@@ -164,6 +164,7 @@ static const struct sensor_ops_s g_adxl362_accel_ops =
NULL, /* set_calibvalue */
NULL, /* calibrate */
NULL, /* get_info */
+ NULL, /* set_nonwakeup */
NULL, /* control */
};
diff --git a/drivers/sensors/adxl372_uorb.c b/drivers/sensors/adxl372_uorb.c
index 460d4a9c642..3e22e702472 100644
--- a/drivers/sensors/adxl372_uorb.c
+++ b/drivers/sensors/adxl372_uorb.c
@@ -112,6 +112,7 @@ static const struct sensor_ops_s g_adxl372_accel_ops =
NULL, /* set_calibvalue */
NULL, /* calibrate */
NULL /* get_info */
+ NULL, /* set_nonwakeup */
NULL /* control */
};
diff --git a/drivers/sensors/bh1749nuc_uorb.c b/drivers/sensors/bh1749nuc_uorb.c
index 4ccaeaa186c..215a9982e45 100644
--- a/drivers/sensors/bh1749nuc_uorb.c
+++ b/drivers/sensors/bh1749nuc_uorb.c
@@ -113,6 +113,7 @@ static const struct sensor_ops_s g_bh1749nuc_sensor_ops =
NULL, /* set_calibvalue */
NULL, /* calibrate */
NULL, /* get_info */
+ NULL, /* set_nonwakeup */
bh1749nuc_control
};
diff --git a/drivers/sensors/bme680_uorb.c b/drivers/sensors/bme680_uorb.c
index f23d2ea849e..512f517c634 100644
--- a/drivers/sensors/bme680_uorb.c
+++ b/drivers/sensors/bme680_uorb.c
@@ -430,6 +430,7 @@ static const struct sensor_ops_s g_sensor_ops =
NULL, /* set_calibvalue */
bme680_calibrate, /* calibrate */
NULL, /* get_info */
+ NULL, /* set_nonwakeup */
bme680_control /* control */
};
diff --git a/drivers/sensors/bme688_uorb.c b/drivers/sensors/bme688_uorb.c
index 8b41137b678..741db1c44e4 100644
--- a/drivers/sensors/bme688_uorb.c
+++ b/drivers/sensors/bme688_uorb.c
@@ -383,6 +383,7 @@ static const struct sensor_ops_s g_sensor_ops =
NULL, /* set_calibvalue */
bme688_calibrate, /* calibrate */
NULL, /* get_info */
+ NULL, /* set_nonwakeup */
bme688_control /* control */
};
diff --git a/drivers/sensors/bmi270_uorb.c b/drivers/sensors/bmi270_uorb.c
index 91405043710..fbc76c8d93c 100644
--- a/drivers/sensors/bmi270_uorb.c
+++ b/drivers/sensors/bmi270_uorb.c
@@ -133,6 +133,7 @@ static const struct sensor_ops_s g_sensor_ops =
NULL, /* set_calibvalue */
NULL, /* calibrate */
NULL, /* get_info */
+ NULL, /* set_nonwakeup */
bmi270_control
};
diff --git a/drivers/sensors/bmm150_uorb.c b/drivers/sensors/bmm150_uorb.c
index 09fda966f9d..ca55aa741a5 100644
--- a/drivers/sensors/bmm150_uorb.c
+++ b/drivers/sensors/bmm150_uorb.c
@@ -188,6 +188,7 @@ static const struct sensor_ops_s g_bmm150_sensor_ops =
NULL, /* set_calibvalue */
NULL, /* calibrate */
NULL, /* get_info */
+ NULL, /* set_nonwakeup */
NULL, /* control */
};
diff --git a/drivers/sensors/fs3000_uorb.c b/drivers/sensors/fs3000_uorb.c
index 47135003799..f5f6e856d85 100644
--- a/drivers/sensors/fs3000_uorb.c
+++ b/drivers/sensors/fs3000_uorb.c
@@ -81,6 +81,7 @@ static const struct sensor_ops_s g_sensor_ops =
NULL, /* set_calibvalue */
NULL, /* calibrate */
NULL, /* get_info */
+ NULL, /* set_nonwakeup */
NULL /* control */
};
diff --git a/drivers/sensors/lsm9ds1_uorb.c b/drivers/sensors/lsm9ds1_uorb.c
index 70ac95191b8..a3e7d8281f3 100644
--- a/drivers/sensors/lsm9ds1_uorb.c
+++ b/drivers/sensors/lsm9ds1_uorb.c
@@ -136,6 +136,7 @@ static const struct sensor_ops_s g_sensor_ops =
NULL, /* set_calibvalue */
NULL, /* calibrate */
NULL, /* get_info */
+ NULL, /* set_nonwakeup */
.control = lsm9ds1_control
};
diff --git a/drivers/sensors/ltr308_uorb.c b/drivers/sensors/ltr308_uorb.c
index 90d52d6a1fc..261efe2c67e 100644
--- a/drivers/sensors/ltr308_uorb.c
+++ b/drivers/sensors/ltr308_uorb.c
@@ -103,6 +103,7 @@ static const struct sensor_ops_s g_sensor_ops =
NULL, /* set_calibvalue */
ltr308_calibrate, /* calibrate */
NULL, /* get_info */
+ NULL, /* set_nonwakeup */
NULL /* control */
};
diff --git a/drivers/sensors/mpu9250_uorb.c b/drivers/sensors/mpu9250_uorb.c
index e5bbe22f018..da19d64a95d 100644
--- a/drivers/sensors/mpu9250_uorb.c
+++ b/drivers/sensors/mpu9250_uorb.c
@@ -381,6 +381,7 @@ static const struct sensor_ops_s g_mpu9250_ops =
NULL, /* set_calibvalue */
NULL, /* calibrate */
NULL, /* get_info */
+ NULL, /* set_nonwakeup */
mpu9250_control /* control */
};
diff --git a/drivers/sensors/qmi8658_uorb.c b/drivers/sensors/qmi8658_uorb.c
index 3d091f63f51..1cfddaaa586 100644
--- a/drivers/sensors/qmi8658_uorb.c
+++ b/drivers/sensors/qmi8658_uorb.c
@@ -358,6 +358,7 @@ static const struct sensor_ops_s g_sensor_ops =
NULL, /* set_calibvalue */
NULL, /* calibrate */
NULL, /* get_info */
+ NULL, /* set_nonwakeup */
NULL, /* control */
};
diff --git a/drivers/sensors/sensor.c b/drivers/sensors/sensor.c
index d23c83b54a6..46e33ca7bf9 100644
--- a/drivers/sensors/sensor.c
+++ b/drivers/sensors/sensor.c
@@ -440,6 +440,42 @@ update:
return ret;
}
+static void sensor_update_nonwakeup(FAR struct file *filep,
+ FAR struct sensor_upperhalf_s *upper,
+ FAR struct sensor_user_s *user,
+ bool nonwakeup)
+{
+ FAR struct sensor_lowerhalf_s *lower = upper->lower;
+
+ if (nonwakeup == user->state.nonwakeup)
+ {
+ return;
+ }
+
+ user->state.nonwakeup = nonwakeup;
+ nxrmutex_lock(&upper->lock);
+ list_for_every_entry(&upper->userlist, user, struct sensor_user_s,
+ node)
+ {
+ if (!user->state.nonwakeup)
+ {
+ nonwakeup = false;
+ break;
+ }
+ }
+
+ if (nonwakeup != upper->state.nonwakeup)
+ {
+ upper->state.nonwakeup = nonwakeup;
+ if (lower->ops->set_nonwakeup)
+ {
+ lower->ops->set_nonwakeup(lower, filep, nonwakeup);
+ }
+ }
+
+ nxrmutex_unlock(&upper->lock);
+}
+
static void sensor_generate_timing(FAR struct sensor_upperhalf_s *upper,
unsigned long nums)
{
@@ -716,6 +752,7 @@ static int sensor_open(FAR struct file *filep)
user->state.esize = upper->state.esize;
nxsem_init(&user->buffersem, 0, 0);
list_add_tail(&upper->userlist, &user->node);
+ sensor_update_nonwakeup(filep, upper, user, false);
/* The new user generation, notify to other users */
@@ -745,15 +782,15 @@ static int sensor_close(FAR struct file *filep)
FAR struct sensor_user_s *user = filep->f_priv;
int ret = 0;
+ sensor_update_interval(filep, upper, user, UINT32_MAX);
+ sensor_update_latency(filep, upper, user, UINT32_MAX);
+ sensor_update_nonwakeup(filep, upper, user, false);
+
nxrmutex_lock(&upper->lock);
+
if ((filep->f_oflags & O_DIRECT) == 0 && lower->ops->close)
{
- ret = lower->ops->close(lower, filep);
- if (ret < 0)
- {
- nxrmutex_unlock(&upper->lock);
- return ret;
- }
+ lower->ops->close(lower, filep);
}
/* Using the O_DIRECT flag will prevent cross-core operations,
@@ -782,9 +819,6 @@ static int sensor_close(FAR struct file *filep)
sensor_pollnotify(upper, POLLPRI, SENSOR_ROLE_WR);
nxrmutex_unlock(&upper->lock);
- sensor_update_latency(filep, upper, user, UINT32_MAX);
- sensor_update_interval(filep, upper, user, UINT32_MAX);
-
kmm_free(user);
return ret;
}
@@ -960,6 +994,12 @@ static int sensor_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
}
break;
+ case SNIOC_SET_NONWAKEUP:
+ {
+ sensor_update_nonwakeup(filep, upper, user, (bool)arg);
+ }
+ break;
+
case SNIOC_SET_BUFFER_NUMBER:
{
nxrmutex_lock(&upper->lock);
diff --git a/drivers/sensors/sensor_rpmsg.c b/drivers/sensors/sensor_rpmsg.c
index 63032e68a90..16e97f6a2ba 100644
--- a/drivers/sensors/sensor_rpmsg.c
+++ b/drivers/sensors/sensor_rpmsg.c
@@ -105,7 +105,6 @@ struct sensor_rpmsg_ept_s
{
struct list_node node;
struct rpmsg_endpoint ept;
- FAR struct rpmsg_device *rdev;
struct work_s work;
rmutex_t lock;
FAR void *buffer;
@@ -123,6 +122,7 @@ struct sensor_rpmsg_stub_s
uint64_t cookie;
struct file file;
bool flushing;
+ bool nonwakeup;
};
/* This structure describes the proxy info about remote advertisers. */
@@ -227,6 +227,9 @@ static int sensor_rpmsg_calibrate(FAR struct sensor_lowerhalf_s *lower,
static int sensor_rpmsg_get_info(FAR struct sensor_lowerhalf_s *lower,
FAR struct file *filep,
FAR struct sensor_device_info_s *info);
+static int sensor_rpmsg_set_nonwakeup(FAR struct sensor_lowerhalf_s *lower,
+ FAR struct file *filep,
+ bool nonwakeup);
static int sensor_rpmsg_control(FAR struct sensor_lowerhalf_s *lower,
FAR struct file *filep,
int cmd, unsigned long arg);
@@ -274,6 +277,7 @@ static const struct sensor_ops_s g_sensor_rpmsg_ops =
.set_calibvalue = sensor_rpmsg_set_calibvalue,
.calibrate = sensor_rpmsg_calibrate,
.get_info = sensor_rpmsg_get_info,
+ .set_nonwakeup = sensor_rpmsg_set_nonwakeup,
.control = sensor_rpmsg_control
};
@@ -793,7 +797,7 @@ static int sensor_rpmsg_flush(FAR struct sensor_lowerhalf_s *lower,
return -ENOTSUP;
}
- else if (!(filep->f_oflags & SENSOR_REMOTE))
+ else
{
ret = sensor_rpmsg_ioctl(dev, SNIOC_FLUSH, 0, 0, true);
}
@@ -801,6 +805,38 @@ static int sensor_rpmsg_flush(FAR struct sensor_lowerhalf_s *lower,
return ret;
}
+static int sensor_rpmsg_set_nonwakeup(FAR struct sensor_lowerhalf_s *lower,
+ FAR struct file *filep,
+ bool nonwakeup)
+{
+ FAR struct sensor_rpmsg_dev_s *dev = lower->priv;
+ FAR struct sensor_lowerhalf_s *drv = dev->drv;
+ int ret = -ENOTTY;
+
+ if (drv->ops->set_nonwakeup)
+ {
+ ret = drv->ops->set_nonwakeup(drv, filep, nonwakeup);
+ }
+ else if ((filep->f_oflags & SENSOR_REMOTE) ||
+ dev->nadvertisers > 0)
+ {
+ /* If the driver (drv) does not support the nonwakeup operation,
+ * and the caller is a remote invocation or the current device
+ * is an advertiser, then you can still consider the nonwakeup
+ * operation as unsupported and therefore return ENOTSUP
+ */
+
+ return -ENOTSUP;
+ }
+ else
+ {
+ ret = sensor_rpmsg_ioctl(dev, SNIOC_SET_NONWAKEUP,
+ nonwakeup, 0, true);
+ }
+
+ return ret;
+}
+
static int sensor_rpmsg_get_info(FAR struct sensor_lowerhalf_s *lower,
FAR struct file *filep,
FAR struct sensor_device_info_s *info)
@@ -879,6 +915,16 @@ static void sensor_rpmsg_push_event_one(FAR struct sensor_rpmsg_dev_s *dev,
bool updated;
int ret;
+ /* If stub is non wakeup and remote cpu is sleep, don't send data
+ * to remote
+ */
+
+ sre = container_of(stub->ept, struct sensor_rpmsg_ept_s, ept);
+ if (stub->nonwakeup && !rpmsg_is_running(sre->ept.rdev))
+ {
+ return;
+ }
+
/* Get state of device to do send data with timeout */
ret = file_ioctl(&stub->file, SNIOC_GET_USTATE, &state);
@@ -892,7 +938,6 @@ static void sensor_rpmsg_push_event_one(FAR struct sensor_rpmsg_dev_s *dev,
state.interval = 0;
}
- sre = container_of(stub->ept, struct sensor_rpmsg_ept_s, ept);
nxrmutex_lock(&sre->lock);
/* Cancel work to fill new data to buffer */
@@ -1301,6 +1346,11 @@ static int sensor_rpmsg_ioctl_handler(FAR struct rpmsg_endpoint *ept,
stub->flushing = true;
}
+ if (msg->request == SNIOC_SET_NONWAKEUP)
+ {
+ stub->nonwakeup = arg;
+ }
+
if (msg->cookie)
{
msg->command = SENSOR_RPMSG_IOCTL_ACK;
@@ -1454,7 +1504,6 @@ static void sensor_rpmsg_device_created(FAR struct rpmsg_device *rdev,
return;
}
- sre->rdev = rdev;
sre->ept.priv = sre;
nxrmutex_init(&sre->lock);
sre->ept.ns_bound_cb = sensor_rpmsg_device_ns_bound;
diff --git a/include/nuttx/sensors/ioctl.h b/include/nuttx/sensors/ioctl.h
index 9bb198c2902..5cc397f76de 100644
--- a/include/nuttx/sensors/ioctl.h
+++ b/include/nuttx/sensors/ioctl.h
@@ -435,27 +435,27 @@
* Argument: Heater configuration.
*/
-#define SNIOC_HEAT _SNIOC(0x009B)
+#define SNIOC_HEAT _SNIOC(0x009B)
/* Command: SNIOC_GET_INFO
* Description: Get device information.
* Argument: This is the device info pointer.
*/
-#define SNIOC_GET_INFO _SNIOC(0x009B)
+#define SNIOC_GET_INFO _SNIOC(0x009C)
/* Command: SNIOC_FLUSH
* Description: Flush sensor hardware fifo buffer.
*/
-#define SNIOC_FLUSH _SNIOC(0x009C)
+#define SNIOC_FLUSH _SNIOC(0x009D)
/* Command: SNIOC_GET_EVENTS
* Description: Get events of the sensor device.
* Argument: The events pointer, (unsigned int *)
*/
-#define SNIOC_GET_EVENTS _SNIOC(0x009D)
+#define SNIOC_GET_EVENTS _SNIOC(0x009E)
/* Command: SNIOC_SET_THERMO
* Description: Set the thermocouple type.
@@ -502,6 +502,13 @@
#define SNIOC_COLD_START _SNIOC(0X00A7)
#define SNIOC_FULL_COLD_START _SNIOC(0X00A8)
+/* Command: SNIOC_SET_NONWAKEUP
+ * Description: Set non-wakeup flag for user.
+ * Argument: True is non-wakeup, false is wakeup.
+ */
+
+#define SNIOC_SET_NONWAKEUP _SNIOC(0x00A9)
+
/****************************************************************************
* Public types
****************************************************************************/
diff --git a/include/nuttx/sensors/sensor.h b/include/nuttx/sensors/sensor.h
index 899ecdf811e..c4e275bd15a 100644
--- a/include/nuttx/sensors/sensor.h
+++ b/include/nuttx/sensors/sensor.h
@@ -478,6 +478,25 @@ struct sensor_ops_s
FAR struct file *filep,
FAR struct sensor_device_info_s *info);
+ /**************************************************************************
+ * Name: set_nonwakeup
+ *
+ * With this method, the user can disable wakeup capacity for the sensor
+ * when data or fifo ready to avoid wakeup cpu, and save power.
+ *
+ * Input Parameters:
+ * lower - The instance of lower half sensor driver.
+ * filep - The pointer of file, represents each user using sensor.
+ * nonwakeup - true(nonwakeup) and false(wakeup)
+ *
+ * Returned Value:
+ * Zero (OK) on success; a negated errno value on failure.
+ *
+ **************************************************************************/
+
+ CODE int (*set_nonwakeup)(FAR struct sensor_lowerhalf_s *lower,
+ FAR struct file *filep, bool nonwakeup);
+
/**************************************************************************
* Name: control
*
diff --git a/include/nuttx/uorb.h b/include/nuttx/uorb.h
index cd768145e64..0b04e08b324 100644
--- a/include/nuttx/uorb.h
+++ b/include/nuttx/uorb.h
@@ -475,6 +475,7 @@
/* GNSS Geofence */
#define SENSOR_TYPE_GNSS_GEOFENCE 52
+
/* Velocity Sensor
* A sensor of this type measures the velocity as it is moving.
* The default unit velocity is meter by seconds m/s (SI).
@@ -1207,6 +1208,7 @@ struct sensor_state_s
uint32_t nsubscribers; /* The number of subscribers */
uint32_t nadvertisers; /* The number of advertisers */
uint32_t generation; /* The recent generation of circular buffer */
+ uint32_t nonwakeup; /* The non wakeup state of sensor device */
uint64_t priv; /* The pointer to private data of userspace user */
};
@@ -1217,7 +1219,8 @@ struct sensor_ustate_s
uint32_t esize; /* The element size of circular buffer */
uint32_t latency; /* The batch latency for user, in us */
uint32_t interval; /* The subscription interval for user, in us */
- uint64_t generation; /* The recent generation of circular buffer */
+ uint32_t nonwakeup; /* The non wakeup state of sensor user */
+ uint32_t generation; /* The recent generation of circular buffer */
};
/* This structure describes the context custom ioctl for device */
(nuttx) 04/04: drivers/sensors: wakeup mode optimization.
Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
jiuzhudong pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit ae85903f71d9b0f0aac62f93f5910fb5c4760606
Author: dongjiuzhu1 <do...@xiaomi.com>
AuthorDate: Thu May 15 12:30:49 2025 +0800
drivers/sensors: wakeup mode optimization.
set nonwakeup mode as initialize state.
Signed-off-by: dongjiuzhu1 <do...@xiaomi.com>
---
drivers/sensors/sensor.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/sensors/sensor.c b/drivers/sensors/sensor.c
index 2b2079d45c2..9c54f12095c 100644
--- a/drivers/sensors/sensor.c
+++ b/drivers/sensors/sensor.c
@@ -750,9 +750,9 @@ static int sensor_open(FAR struct file *filep)
user->state.interval = UINT32_MAX;
user->state.esize = upper->state.esize;
+ user->state.nonwakeup = true;
nxsem_init(&user->buffersem, 0, 0);
list_add_tail(&upper->userlist, &user->node);
- sensor_update_nonwakeup(filep, upper, user, true);
/* The new user generation, notify to other users */
@@ -1415,6 +1415,7 @@ int sensor_custom_register(FAR struct sensor_lowerhalf_s *lower,
list_initialize(&upper->userlist);
upper->state.esize = esize;
upper->state.min_interval = UINT32_MAX;
+ upper->state.nonwakeup = true;
if (lower->ops->activate)
{
upper->state.nadvertisers = 1;
(nuttx) 03/04: drivers/sensors: sensor wakeup mode change.
Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
jiuzhudong pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 4dd415b6c1e1ae3a8bc959d6de755f02cf622f0c
Author: dongjiuzhu1 <do...@xiaomi.com>
AuthorDate: Fri May 9 12:25:24 2025 +0800
drivers/sensors: sensor wakeup mode change.
change non-wakeup as default mode.
Signed-off-by: dongjiuzhu1 <do...@xiaomi.com>
---
drivers/sensors/sensor.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/sensors/sensor.c b/drivers/sensors/sensor.c
index 46e33ca7bf9..2b2079d45c2 100644
--- a/drivers/sensors/sensor.c
+++ b/drivers/sensors/sensor.c
@@ -752,7 +752,7 @@ static int sensor_open(FAR struct file *filep)
user->state.esize = upper->state.esize;
nxsem_init(&user->buffersem, 0, 0);
list_add_tail(&upper->userlist, &user->node);
- sensor_update_nonwakeup(filep, upper, user, false);
+ sensor_update_nonwakeup(filep, upper, user, true);
/* The new user generation, notify to other users */
@@ -784,7 +784,7 @@ static int sensor_close(FAR struct file *filep)
sensor_update_interval(filep, upper, user, UINT32_MAX);
sensor_update_latency(filep, upper, user, UINT32_MAX);
- sensor_update_nonwakeup(filep, upper, user, false);
+ sensor_update_nonwakeup(filep, upper, user, true);
nxrmutex_lock(&upper->lock);