When the system has multiple serial devices, Plymouth will only enter text mode
On the arm platform, there are two consoles in the "/sys/class/tty/console/active" directory, TTYAMA0 and TTY1.
static bool
add_consoles_from_file (ply_device_manager_t *manager,
const char *path)
{
……
while (remaining_file_contents < contents + contents_length) {
char *console;
size_t console_length;
const char *console_device;
ply_terminal_t *terminal;
/* Advance past any leading whitespace */
remaining_file_contents += strspn (remaining_file_contents, " \n\t\v");
if (*remaining_file_contents == '\0')
/* There's nothing left after the whitespace, we're done */
break;
……
console_length = strcspn (remaining_file_contents, " \n\t\v");
console = strndup (remaining_file_contents, console_length);
terminal = get_terminal (manager, console);
console_device = ply_terminal_get_name (terminal);
free (console);
ply_trace ("console %s found!", console_device);
if (terminal != manager->local_console_terminal)
has_serial_consoles = true;
……
}
add_consoles_from_file() will return "has_serial_consoles = true". In this way, create_devices_from_terminals() will also return "true". As follows:
static bool
create_devices_from_terminals (ply_device_manager_t *manager)
{
……
if (manager->flags & PLY_DEVICE_MANAGER_FLAGS_IGNORE_SERIAL_CONSOLES) {
……
} else {
has_serial_consoles = add_consoles_from_file (manager, "/sys/class/tty/console/active");
}
if (has_serial_consoles) {
ply_trace ("serial consoles detected, managing them with details forced");
manager->serial_consoles_detected = true;
ply_hashtable_foreach (manager->terminals,
(ply_hashtable_foreach_func_t *)
create_devices_for_terminal,
manager);
return true;
}
return false;
}
void
ply_device_manager_watch_devices (ply_device_manager_t *manager,
double device_timeout,
ply_keyboard_added_handler_t keyboard_added_handler,
ply_keyboard_removed_handler_t keyboard_removed_handler,
ply_pixel_display_added_handler_t pixel_display_added_handler,
ply_pixel_display_removed_handler_t pixel_display_removed_handler,
ply_text_display_added_handler_t text_display_added_handler,
ply_text_display_removed_handler_t text_display_removed_handler,
void *data)
{
bool done_with_initial_devices_setup;
manager->keyboard_added_handler = keyboard_added_handler;
manager->keyboard_removed_handler = keyboard_removed_handler;
manager->pixel_display_added_handler = pixel_display_added_handler;
manager->pixel_display_removed_handler = pixel_display_removed_handler;
manager->text_display_added_handler = text_display_added_handler;
manager->text_display_removed_handler = text_display_removed_handler;
manager->event_handler_data = data;
/* Try to create devices for each serial device right away, if possible
*/
done_with_initial_devices_setup = create_devices_from_terminals (manager);
if (done_with_initial_devices_setup)
return;
if ((manager->flags & PLY_DEVICE_MANAGER_FLAGS_SKIP_RENDERERS)) {
ply_trace ("Creating non-graphical devices, since renderers are being explicitly skipped");
create_non_graphical_devices (manager);
return;
}
if ((manager->flags & PLY_DEVICE_MANAGER_FLAGS_IGNORE_UDEV)) {
ply_trace ("udev support disabled, creating fallback devices");
create_fallback_devices (manager);
return;
}
#ifdef HAVE_UDEV
watch_for_udev_events (manager);
create_devices_for_subsystem (manager, SUBSYSTEM_DRM);
ply_event_loop_watch_for_timeout (manager->loop,
device_timeout,
(ply_event_loop_timeout_handler_t)
create_devices_from_udev, manager);
#endif
}
Finally, in ply_device_manager_watch_devices (), done_with_initial_devices_setup = true, and then the function "return" ends. The following udev code will never be executed,The following udev code will never be executed. Plymouth can only enter text mode. Is this a bug? In other words, there are other considerations that lead to this design. Or, the code can be modified as follows:
void
ply_device_manager_watch_devices (ply_device_manager_t *manager,
double device_timeout,
ply_keyboard_added_handler_t keyboard_added_handler,
ply_keyboard_removed_handler_t keyboard_removed_handler,
ply_pixel_display_added_handler_t pixel_display_added_handler,
ply_pixel_display_removed_handler_t pixel_display_removed_handler,
ply_text_display_added_handler_t text_display_added_handler,
ply_text_display_removed_handler_t text_display_removed_handler,
void *data)
{
bool done_with_initial_devices_setup;
manager->keyboard_added_handler = keyboard_added_handler;
manager->keyboard_removed_handler = keyboard_removed_handler;
manager->pixel_display_added_handler = pixel_display_added_handler;
manager->pixel_display_removed_handler = pixel_display_removed_handler;
manager->text_display_added_handler = text_display_added_handler;
manager->text_display_removed_handler = text_display_removed_handler;
manager->event_handler_data = data;
/* Try to create devices for each serial device right away, if possible
*/
done_with_initial_devices_setup = create_devices_from_terminals (manager);
/* Delete this piece of code
if (done_with_initial_devices_setup)
return;*/
if ((manager->flags & PLY_DEVICE_MANAGER_FLAGS_SKIP_RENDERERS)) {
ply_trace ("Creating non-graphical devices, since renderers are being explicitly skipped");
create_non_graphical_devices (manager);
return;
}
if ((manager->flags & PLY_DEVICE_MANAGER_FLAGS_IGNORE_UDEV)) {
ply_trace ("udev support disabled, creating fallback devices");
create_fallback_devices (manager);
return;
}
#ifdef HAVE_UDEV
watch_for_udev_events (manager);
create_devices_for_subsystem (manager, SUBSYSTEM_DRM);
ply_event_loop_watch_for_timeout (manager->loop,
device_timeout,
(ply_event_loop_timeout_handler_t)
create_devices_from_udev, manager);
#endif
}