summaryrefslogtreecommitdiff
path: root/components/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'components/drivers')
-rw-r--r--components/drivers/serial/serial_tty.c63
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);