You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by st...@apache.org on 2016/09/14 00:40:49 UTC
incubator-mynewt-core git commit: add power management apis to the OS,
both driver implementations and BSP power states
Repository: incubator-mynewt-core
Updated Branches:
refs/heads/sterly_refactor a1d31defe -> e02f6678a
add power management apis to the OS, both driver implementations and BSP power states
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/e02f6678
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/e02f6678
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/e02f6678
Branch: refs/heads/sterly_refactor
Commit: e02f6678a022dc89a1e9ae36397ecc01cf497a61
Parents: a1d31de
Author: Sterling Hughes <st...@apache.org>
Authored: Tue Sep 13 17:37:46 2016 -0700
Committer: Sterling Hughes <st...@apache.org>
Committed: Tue Sep 13 17:37:46 2016 -0700
----------------------------------------------------------------------
drivers/adc/adc_nrf52/src/adc_nrf52.c | 4 +-
drivers/uart/uart_hal/src/uart_hal.c | 2 +-
hw/bsp/arduino_primo_nrf52/src/hal_bsp.c | 6 ++
hw/bsp/bmd300eval/src/hal_bsp.c | 8 ++-
hw/bsp/native/src/hal_bsp.c | 8 ++-
hw/bsp/nrf51-arduino_101/src/hal_bsp.c | 6 ++
hw/bsp/nrf51-blenano/src/hal_bsp.c | 8 ++-
hw/bsp/nrf51dk-16kbram/src/hal_bsp.c | 8 ++-
hw/bsp/nrf51dk/src/hal_bsp.c | 6 ++
hw/bsp/nrf52dk/src/hal_bsp.c | 6 ++
hw/bsp/nrf52pdk/src/hal_bsp.c | 6 ++
hw/bsp/olimex_stm32-e407_devboard/src/hal_bsp.c | 6 ++
hw/hal/include/hal/hal_bsp.h | 9 +++
libs/os/include/os/os.h | 3 +-
libs/os/include/os/os_dev.h | 38 ++++++++--
libs/os/src/os_dev.c | 73 ++++++++++++++++++--
16 files changed, 177 insertions(+), 20 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e02f6678/drivers/adc/adc_nrf52/src/adc_nrf52.c
----------------------------------------------------------------------
diff --git a/drivers/adc/adc_nrf52/src/adc_nrf52.c b/drivers/adc/adc_nrf52/src/adc_nrf52.c
index 2d8cb3b..d167175 100644
--- a/drivers/adc/adc_nrf52/src/adc_nrf52.c
+++ b/drivers/adc/adc_nrf52/src/adc_nrf52.c
@@ -107,9 +107,9 @@ nrf52_adc_open(struct os_dev *odev, uint32_t wait, void *arg)
}
}
- if (odev->od_status & OS_DEV_STATUS_OPEN) {
+ if (odev->od_flags & OS_DEV_F_STATUS_OPEN) {
os_mutex_release(&dev->ad_lock);
- rc = -1;
+ rc = OS_EBUSY;
goto err;
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e02f6678/drivers/uart/uart_hal/src/uart_hal.c
----------------------------------------------------------------------
diff --git a/drivers/uart/uart_hal/src/uart_hal.c b/drivers/uart/uart_hal/src/uart_hal.c
index 7244240..5617f6b 100644
--- a/drivers/uart/uart_hal/src/uart_hal.c
+++ b/drivers/uart/uart_hal/src/uart_hal.c
@@ -77,7 +77,7 @@ uart_hal_open(struct os_dev *odev, uint32_t wait, void *arg)
if (!uc) {
return OS_EINVAL;
}
- if (odev->od_status & OS_DEV_STATUS_OPEN) {
+ if (odev->od_flags & OS_DEV_F_STATUS_OPEN) {
return OS_EBUSY;
}
hal_uart_init_cbs(priv->unit, uc->uc_tx_char, uc->uc_tx_done,
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e02f6678/hw/bsp/arduino_primo_nrf52/src/hal_bsp.c
----------------------------------------------------------------------
diff --git a/hw/bsp/arduino_primo_nrf52/src/hal_bsp.c b/hw/bsp/arduino_primo_nrf52/src/hal_bsp.c
index 56501ac..90f3883 100644
--- a/hw/bsp/arduino_primo_nrf52/src/hal_bsp.c
+++ b/hw/bsp/arduino_primo_nrf52/src/hal_bsp.c
@@ -61,3 +61,9 @@ bsp_get_refmv(void *cfgdata)
{
return (2800);
}
+
+int
+hal_bsp_power_state(int state)
+{
+ return (0);
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e02f6678/hw/bsp/bmd300eval/src/hal_bsp.c
----------------------------------------------------------------------
diff --git a/hw/bsp/bmd300eval/src/hal_bsp.c b/hw/bsp/bmd300eval/src/hal_bsp.c
index 0ac5ca8..ae55a00 100644
--- a/hw/bsp/bmd300eval/src/hal_bsp.c
+++ b/hw/bsp/bmd300eval/src/hal_bsp.c
@@ -6,7 +6,7 @@
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
@@ -65,3 +65,9 @@ bsp_core_dump(int *area_cnt)
*area_cnt = sizeof(dump_cfg) / sizeof(dump_cfg[0]);
return dump_cfg;
}
+
+int
+hal_bsp_power_state(int state)
+{
+ return (0);
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e02f6678/hw/bsp/native/src/hal_bsp.c
----------------------------------------------------------------------
diff --git a/hw/bsp/native/src/hal_bsp.c b/hw/bsp/native/src/hal_bsp.c
index d65ac11..cabca3d 100644
--- a/hw/bsp/native/src/hal_bsp.c
+++ b/hw/bsp/native/src/hal_bsp.c
@@ -6,7 +6,7 @@
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
@@ -41,3 +41,9 @@ bsp_flash_dev(uint8_t id)
}
return &native_flash_dev;
}
+
+int
+hal_bsp_power_state(int state)
+{
+ return (0);
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e02f6678/hw/bsp/nrf51-arduino_101/src/hal_bsp.c
----------------------------------------------------------------------
diff --git a/hw/bsp/nrf51-arduino_101/src/hal_bsp.c b/hw/bsp/nrf51-arduino_101/src/hal_bsp.c
index 22c54a4..f6af3f6 100644
--- a/hw/bsp/nrf51-arduino_101/src/hal_bsp.c
+++ b/hw/bsp/nrf51-arduino_101/src/hal_bsp.c
@@ -64,3 +64,9 @@ bsp_core_dump(int *area_cnt)
*area_cnt = sizeof(dump_cfg) / sizeof(dump_cfg[0]);
return dump_cfg;
}
+
+int
+hal_bsp_power_state(int state)
+{
+ return (0);
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e02f6678/hw/bsp/nrf51-blenano/src/hal_bsp.c
----------------------------------------------------------------------
diff --git a/hw/bsp/nrf51-blenano/src/hal_bsp.c b/hw/bsp/nrf51-blenano/src/hal_bsp.c
index ee84922..61fb8b5 100644
--- a/hw/bsp/nrf51-blenano/src/hal_bsp.c
+++ b/hw/bsp/nrf51-blenano/src/hal_bsp.c
@@ -6,7 +6,7 @@
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
@@ -32,3 +32,9 @@ bsp_flash_dev(uint8_t id)
}
return &nrf51_flash_dev;
}
+
+int
+hal_bsp_power_state(int state)
+{
+ return (0);
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e02f6678/hw/bsp/nrf51dk-16kbram/src/hal_bsp.c
----------------------------------------------------------------------
diff --git a/hw/bsp/nrf51dk-16kbram/src/hal_bsp.c b/hw/bsp/nrf51dk-16kbram/src/hal_bsp.c
index 1558cd7..05883ad 100644
--- a/hw/bsp/nrf51dk-16kbram/src/hal_bsp.c
+++ b/hw/bsp/nrf51dk-16kbram/src/hal_bsp.c
@@ -6,7 +6,7 @@
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
@@ -77,3 +77,9 @@ bsp_hal_init(void)
OS_DEV_INIT_PRIMARY, 0, uart_hal_init, (void *)&uart_cfg);
assert(rc == 0);
}
+
+int
+hal_bsp_power_state(int state)
+{
+ return (0);
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e02f6678/hw/bsp/nrf51dk/src/hal_bsp.c
----------------------------------------------------------------------
diff --git a/hw/bsp/nrf51dk/src/hal_bsp.c b/hw/bsp/nrf51dk/src/hal_bsp.c
index 83d9bee..538d007 100644
--- a/hw/bsp/nrf51dk/src/hal_bsp.c
+++ b/hw/bsp/nrf51dk/src/hal_bsp.c
@@ -91,3 +91,9 @@ bsp_get_refmv(void *cfgdata)
return refmv;
}
+
+int
+hal_bsp_power_state(int state)
+{
+ return (0);
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e02f6678/hw/bsp/nrf52dk/src/hal_bsp.c
----------------------------------------------------------------------
diff --git a/hw/bsp/nrf52dk/src/hal_bsp.c b/hw/bsp/nrf52dk/src/hal_bsp.c
index 9446b45..242c862 100644
--- a/hw/bsp/nrf52dk/src/hal_bsp.c
+++ b/hw/bsp/nrf52dk/src/hal_bsp.c
@@ -57,3 +57,9 @@ bsp_get_refmv(void *cfgdata)
{
return (2800);
}
+
+int
+hal_bsp_power_state(int state)
+{
+ return (0);
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e02f6678/hw/bsp/nrf52pdk/src/hal_bsp.c
----------------------------------------------------------------------
diff --git a/hw/bsp/nrf52pdk/src/hal_bsp.c b/hw/bsp/nrf52pdk/src/hal_bsp.c
index 5a0ecdc..739e880 100644
--- a/hw/bsp/nrf52pdk/src/hal_bsp.c
+++ b/hw/bsp/nrf52pdk/src/hal_bsp.c
@@ -78,3 +78,9 @@ bsp_hal_init(void)
OS_DEV_INIT_PRIMARY, 0, uart_hal_init, (void *)&uart_cfg);
assert(rc == 0);
}
+
+int
+hal_bsp_power_state(int state)
+{
+ return (0);
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e02f6678/hw/bsp/olimex_stm32-e407_devboard/src/hal_bsp.c
----------------------------------------------------------------------
diff --git a/hw/bsp/olimex_stm32-e407_devboard/src/hal_bsp.c b/hw/bsp/olimex_stm32-e407_devboard/src/hal_bsp.c
index c0020e0..45f6dd8 100644
--- a/hw/bsp/olimex_stm32-e407_devboard/src/hal_bsp.c
+++ b/hw/bsp/olimex_stm32-e407_devboard/src/hal_bsp.c
@@ -75,3 +75,9 @@ bsp_core_dump(int *area_cnt)
*area_cnt = sizeof(dump_cfg) / sizeof(dump_cfg[0]);
return dump_cfg;
}
+
+int
+hal_bsp_power_state(int state)
+{
+ return (0);
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e02f6678/hw/hal/include/hal/hal_bsp.h
----------------------------------------------------------------------
diff --git a/hw/hal/include/hal/hal_bsp.h b/hw/hal/include/hal/hal_bsp.h
index c5d0ba1..0b4a39c 100644
--- a/hw/hal/include/hal/hal_bsp.h
+++ b/hw/hal/include/hal/hal_bsp.h
@@ -69,6 +69,15 @@ int bsp_hw_id(uint8_t *id, int max_len);
struct adc_dev;
uint16_t bsp_get_refmv(void *cfgdata);
+#define HAL_BSP_POWER_ON (1)
+#define HAL_BSP_POWER_WFI (2)
+#define HAL_BSP_POWER_SLEEP (3)
+#define HAL_BSP_POWER_DEEP_SLEEP (4)
+#define HAL_BSP_POWER_OFF (5)
+#define HAL_BSP_POWER_PERUSER (128)
+
+int hal_bsp_power_state(int state);
+
#ifdef __cplusplus
}
#endif
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e02f6678/libs/os/include/os/os.h
----------------------------------------------------------------------
diff --git a/libs/os/include/os/os.h b/libs/os/include/os/os.h
index a8dbd5c..5b64159 100644
--- a/libs/os/include/os/os.h
+++ b/libs/os/include/os/os.h
@@ -6,7 +6,7 @@
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
@@ -68,6 +68,7 @@ enum os_error {
OS_NOT_STARTED = 9, /* Operating must be started to call this function, but isn't */
OS_ENOENT = 10, /* No such thing */
OS_EBUSY = 11, /* Resource busy */
+ OS_ERROR = 12, /* Generic Error */
};
#define OS_WAIT_FOREVER (-1)
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e02f6678/libs/os/include/os/os_dev.h
----------------------------------------------------------------------
diff --git a/libs/os/include/os/os_dev.h b/libs/os/include/os/os_dev.h
index 7cffd5e..be2123d 100644
--- a/libs/os/include/os/os_dev.h
+++ b/libs/os/include/os/os_dev.h
@@ -44,18 +44,22 @@ struct os_dev;
* Device status, so functions can ensure device is called in a
* consistent state.
*/
-#define OS_DEV_STATUS_BASE (1 << 0)
-#define OS_DEV_STATUS_INITING (1 << 1)
-#define OS_DEV_STATUS_READY (1 << 2)
-#define OS_DEV_STATUS_OPEN (1 << 3)
+#define OS_DEV_F_STATUS_READY (1 << 0)
+#define OS_DEV_F_STATUS_OPEN (1 << 1)
+#define OS_DEV_F_STATUS_SUSPENDED (1 << 2)
+#define OS_DEV_F_INIT_CRITICAL (1 << 3)
typedef int (*os_dev_init_func_t)(struct os_dev *, void *);
typedef int (*os_dev_open_func_t)(struct os_dev *, uint32_t,
void *);
+typedef int (*os_dev_suspend_func_t)(struct os_dev *, os_time_t, int);
+typedef int (*os_dev_resume_func_t)(struct os_dev *);
typedef int (*os_dev_close_func_t)(struct os_dev *);
struct os_dev_handlers {
os_dev_open_func_t od_open;
+ os_dev_suspend_func_t od_suspend;
+ os_dev_resume_func_t od_resume;
os_dev_close_func_t od_close;
};
@@ -68,8 +72,8 @@ struct os_dev {
void *od_init_arg;
uint8_t od_stage;
uint8_t od_priority;
- uint8_t od_init_flags;
- uint8_t od_status;
+ uint8_t od_open_ref;
+ uint8_t od_flags;
char *od_name;
STAILQ_ENTRY(os_dev) od_next;
};
@@ -78,9 +82,31 @@ struct os_dev {
(__dev)->od_handlers.od_open = (__open); \
(__dev)->od_handlers.od_close = (__close);
+static inline int
+os_dev_suspend(struct os_dev *dev, os_time_t suspend_t, uint8_t force)
+{
+ if (dev->od_handlers.od_suspend == NULL) {
+ return (0);
+ } else {
+ return (dev->od_handlers.od_suspend(dev, suspend_t, force));
+ }
+}
+
+static inline int
+os_dev_resume(struct os_dev *dev)
+{
+ if (dev->od_handlers.od_resume == NULL) {
+ return (0);
+ } else {
+ return (dev->od_handlers.od_resume(dev));
+ }
+}
+
int os_dev_create(struct os_dev *dev, char *name, uint8_t stage,
uint8_t priority, os_dev_init_func_t od_init, void *arg);
int os_dev_initialize_all(uint8_t stage);
+int os_dev_suspend_all(os_time_t, uint8_t);
+int os_dev_resume_all(void);
struct os_dev *os_dev_open(char *devname, uint32_t timo, void *arg);
int os_dev_close(struct os_dev *dev);
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e02f6678/libs/os/src/os_dev.c
----------------------------------------------------------------------
diff --git a/libs/os/src/os_dev.c b/libs/os/src/os_dev.c
index 7c9a935..fbd70b8 100644
--- a/libs/os/src/os_dev.c
+++ b/libs/os/src/os_dev.c
@@ -34,7 +34,8 @@ os_dev_init(struct os_dev *dev, char *name, uint8_t stage,
dev->od_stage = stage;
dev->od_priority = priority;
/* assume these are set after the fact. */
- dev->od_init_flags = 0;
+ dev->od_flags = 0;
+ dev->od_open_ref = 0;
dev->od_init = od_init;
dev->od_init_arg = arg;
memset(&dev->od_handlers, 0, sizeof(dev->od_handlers));
@@ -137,11 +138,11 @@ os_dev_initialize_all(uint8_t stage)
if (dev->od_stage == stage) {
rc = dev->od_init(dev, dev->od_init_arg);
if (rc != 0) {
- if (dev->od_init_flags & OS_DEV_INIT_F_CRITICAL) {
+ if (dev->od_flags & OS_DEV_F_INIT_CRITICAL) {
goto err;
}
} else {
- dev->od_status |= OS_DEV_STATUS_READY;
+ dev->od_flags |= OS_DEV_F_STATUS_READY;
}
}
}
@@ -152,6 +153,57 @@ err:
}
/**
+ * Suspend all devices.
+ *
+ * @param dev The device to suspend
+ * @param suspend_t The number of ticks to suspend this device for
+ * @param force Whether or not to force suspending the device
+ *
+ * @return 0 on success, or a non-zero error code if one of the devices
+ * returned it.
+ */
+int
+os_dev_suspend_all(os_time_t suspend_t, uint8_t force)
+{
+ struct os_dev *dev;
+ int suspend_failure;
+ int rc;
+
+ suspend_failure = 0;
+ STAILQ_FOREACH(dev, &g_os_dev_list, od_next) {
+ rc = os_dev_suspend(dev, suspend_t, force);
+ if (rc != 0) {
+ suspend_failure = OS_ERROR;
+ }
+ }
+
+ return (suspend_failure);
+}
+
+/**
+ * Resume all the devices that were suspended.
+ *
+ * @return 0 on success, -1 if any of the devices have failed to resume.
+ */
+int
+os_dev_resume_all(void)
+{
+ struct os_dev *dev;
+ int rc;
+
+ STAILQ_FOREACH(dev, &g_os_dev_list, od_next) {
+ rc = os_dev_resume(dev);
+ if (rc != 0) {
+ goto err;
+ }
+ }
+
+ return (0);
+err:
+ return (rc);
+}
+
+/**
* Lookup a device by name, internal function only.
*
* @param name The name of the device to look up.
@@ -185,6 +237,7 @@ struct os_dev *
os_dev_open(char *devname, uint32_t timo, void *arg)
{
struct os_dev *dev;
+ os_sr_t sr;
int rc;
dev = os_dev_lookup(devname);
@@ -193,7 +246,7 @@ os_dev_open(char *devname, uint32_t timo, void *arg)
}
/* Device is not ready to be opened. */
- if ((dev->od_status & OS_DEV_STATUS_READY) == 0) {
+ if ((dev->od_flags & OS_DEV_F_STATUS_READY) == 0) {
return (NULL);
}
@@ -204,7 +257,10 @@ os_dev_open(char *devname, uint32_t timo, void *arg)
}
}
- dev->od_status |= OS_DEV_STATUS_OPEN;
+ OS_ENTER_CRITICAL(sr);
+ ++dev->od_open_ref;
+ dev->od_flags |= OS_DEV_F_STATUS_OPEN;
+ OS_EXIT_CRITICAL(sr);
return (dev);
err:
@@ -222,6 +278,7 @@ int
os_dev_close(struct os_dev *dev)
{
int rc;
+ os_sr_t sr;
if (dev->od_handlers.od_close) {
rc = dev->od_handlers.od_close(dev);
@@ -230,7 +287,11 @@ os_dev_close(struct os_dev *dev)
}
}
- dev->od_status &= ~OS_DEV_STATUS_OPEN;
+ OS_ENTER_CRITICAL(sr);
+ if (--dev->od_open_ref == 0) {
+ dev->od_flags &= ~OS_DEV_F_STATUS_OPEN;
+ }
+ OS_EXIT_CRITICAL(sr);
return (0);
err: