diff options
Diffstat (limited to 'components/drivers')
| -rw-r--r-- | components/drivers/serial/serial_tty.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/components/drivers/serial/serial_tty.c b/components/drivers/serial/serial_tty.c index 36692a9300..f75123eba2 100644 --- a/components/drivers/serial/serial_tty.c +++ b/components/drivers/serial/serial_tty.c @@ -404,3 +404,66 @@ static int _tty_workqueue_init(void) return RT_EOK; } INIT_PREV_EXPORT(_tty_workqueue_init); + +static rt_err_t _match_tty_iter(struct rt_object *obj, void *data) +{ + rt_device_t target = *(rt_device_t *)data; + rt_device_t device = rt_container_of(obj, struct rt_device, parent); + if (device->type == RT_Device_Class_Char) + { + lwp_tty_t tp; + if (rt_strncmp(obj->name, "tty"TTY_NAME_PREFIX, + sizeof("tty"TTY_NAME_PREFIX) - 1) == 0) + { + struct serial_tty_context *softc; + + tp = rt_container_of(device, struct lwp_tty, parent); + softc = tty_softc(tp); + + if (&softc->parent->parent == target) + { + /* matched, early return */ + *(rt_device_t *)data = device; + return 1; + } + } + } + + return RT_EOK; +} + +/** + * @brief The default console is only a backup device with lowest priority. + * It's always recommended to scratch the console from the boot arguments. + * And dont forget to register the device with a higher priority. + */ +static int _default_console_setup(void) +{ + rt_err_t rc; + rt_device_t bakdev; + rt_device_t ttydev; + + bakdev = rt_console_get_device(); + if (!bakdev) + { + return -RT_ENOENT; + } + + ttydev = bakdev; + rt_object_for_each(RT_Object_Class_Device, _match_tty_iter, &ttydev); + + if (ttydev != bakdev) + { + LOG_I("Using /dev/%.*s as default console", RT_NAME_MAX, ttydev->parent.name); + lwp_console_register_backend(ttydev, LWP_CONSOLE_LOWEST_PRIOR); + rc = RT_EOK; + } + else + { + rc = -RT_EINVAL; + } + + return rc; +} + +INIT_COMPONENT_EXPORT(_default_console_setup); |
