Linux Audio

Check our new training course

Embedded Linux Audio

Check our new training course
with Creative Commons CC-BY-SA
lecture materials

Bootlin logo

Elixir Cross Referencer

Loading...
/*
 * Copyright (c) 2022 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file
 * @brief EFI console driver
 *
 * @details EFI console driver.
 * Hooks into the printk and fputc (for printf) modules.
 */

#include <stdio.h>
#include <zephyr/device.h>
#include <zephyr/init.h>
#include <zephyr/sys/printk.h>


extern int efi_console_putchar(int c);

#if defined(CONFIG_PRINTK) || defined(CONFIG_STDOUT_CONSOLE)
/**
 *
 * @brief Output one character to EFI console
 *
 * Outputs both line feed and carriage return in the case of a '\n'.
 *
 * @param c Character to output
 *
 * @return The character passed as input.
 */

static int console_out(int c)
{
	return efi_console_putchar(c);
}

#endif

#if defined(CONFIG_STDOUT_CONSOLE)
extern void __stdout_hook_install(int (*hook)(int));
#endif

#if defined(CONFIG_PRINTK)
extern void __printk_hook_install(int (*fn)(int));
#endif

/**
 * @brief Install printk/stdout hook for EFI console output
 */

static void efi_console_hook_install(void)
{
#if defined(CONFIG_STDOUT_CONSOLE)
	__stdout_hook_install(console_out);
#endif
#if defined(CONFIG_PRINTK)
	__printk_hook_install(console_out);
#endif
}

/**
 * @brief Initialize one EFI as the console port
 *
 * @return 0 if successful, otherwise failed.
 */
static int efi_console_init(const struct device *arg)
{

	ARG_UNUSED(arg);

	efi_console_hook_install();

	return 0;
}

/* EFI console initializes */
SYS_INIT(efi_console_init,
	PRE_KERNEL_1,
	0);