Repository: incubator-mynewt-core Updated Branches: refs/heads/develop 0fc206fb9 -> e343a7bbd
os; move call to os_dev_initialize() to take place from within sysinit. If device gets created after OS is started, call it's init routine immediatelly. 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/fc601297 Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/fc601297 Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/fc601297 Branch: refs/heads/develop Commit: fc601297ce3205b6d1ec40b285eba281aec98415 Parents: 0fc206f Author: Marko Kiiskila <[email protected]> Authored: Thu Jan 26 10:07:23 2017 -0800 Committer: Marko Kiiskila <[email protected]> Committed: Thu Jan 26 10:07:23 2017 -0800 ---------------------------------------------------------------------- kernel/os/src/os.c | 8 +++++--- kernel/os/src/os_dev.c | 44 +++++++++++++++++++++++++++++++++----------- 2 files changed, 38 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/fc601297/kernel/os/src/os.c ---------------------------------------------------------------------- diff --git a/kernel/os/src/os.c b/kernel/os/src/os.c index edbadbc..754dcea 100644 --- a/kernel/os/src/os.c +++ b/kernel/os/src/os.c @@ -208,9 +208,6 @@ os_start(void) #if MYNEWT_VAL(OS_SCHEDULING) os_error_t err; - err = os_dev_initialize_all(OS_DEV_INIT_KERNEL); - assert(err == OS_OK); - /* Enable the watchdog prior to starting the OS */ hal_watchdog_enable(); @@ -224,9 +221,14 @@ os_start(void) void os_pkg_init(void) { + os_error_t err; + /* Ensure this function only gets called by sysinit. */ SYSINIT_ASSERT_ACTIVE(); + err = os_dev_initialize_all(OS_DEV_INIT_KERNEL); + assert(err == OS_OK); + os_msys_init(); } http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/fc601297/kernel/os/src/os_dev.c ---------------------------------------------------------------------- diff --git a/kernel/os/src/os_dev.c b/kernel/os/src/os_dev.c index fafb6cc..139fe13 100644 --- a/kernel/os/src/os_dev.c +++ b/kernel/os/src/os_dev.c @@ -91,6 +91,32 @@ os_dev_add(struct os_dev *dev) return (0); } +/** + * Call device initialize routine, and mark it ready. This is a private + * function. + * + * @param dev The device to initialize. + * + * @return 0 on success, non-zero on failure. + */ +static int +os_dev_initialize(struct os_dev *dev) +{ + int rc; + + rc = dev->od_init(dev, dev->od_init_arg); + if (rc != 0) { + if (dev->od_flags & OS_DEV_F_INIT_CRITICAL) { + goto err; + } + } else { + dev->od_flags |= OS_DEV_F_STATUS_READY; + } + return 0; +err: + return rc; +} + /** * Create a new device in the kernel. @@ -122,7 +148,9 @@ os_dev_create(struct os_dev *dev, char *name, uint8_t stage, goto err; } - return (0); + if (g_os_started) { + rc = os_dev_initialize(dev); + } err: return (rc); } @@ -138,23 +166,17 @@ int os_dev_initialize_all(uint8_t stage) { struct os_dev *dev; - int rc; + int rc = 0; STAILQ_FOREACH(dev, &g_os_dev_list, od_next) { if (dev->od_stage == stage) { - rc = dev->od_init(dev, dev->od_init_arg); - if (rc != 0) { - if (dev->od_flags & OS_DEV_F_INIT_CRITICAL) { - goto err; - } - } else { - dev->od_flags |= OS_DEV_F_STATUS_READY; + rc = os_dev_initialize(dev); + if (rc) { + break; } } } - return (0); -err: return (rc); }
