【问题标题】:How to use early printk functionality for ARM64?如何为 ARM64 使用早期的 printk 功能?
【发布时间】:2017-08-15 11:29:32
【问题描述】:

我正在尝试将early printk 用于arm64 架构,但没有这样的功能。arm64 中有一个名为earlycon 的东西代替了earlyprintk,但我不知道它的用法。在初始化真正的控制台之前,我需要将消息打印到串行控制台。有没有办法在arm64 中使用earlycon 做到这一点。我向kernel 3.18 应用了一个名为arm64: Add simple earlyprintk support 的补丁,但没有成功应用。 arm64 中使用了什么而不是 printch?

【问题讨论】:

标签: linux linux-kernel arm linux-device-driver arm64


【解决方案1】:

可以使用设备树选择的节点或使用引导参数链接功能性 uart 驱动程序。

在了解如何使用它之前,您应该检查平台 UART 驱动程序是否支持 EARLYCON。比如直接从owl-uart.c复制过来

static int __init
owl_uart_early_console_setup(struct earlycon_device *device, const char *opt)
{
    if (!device->port.membase)
        return -ENODEV;

    device->con->write = owl_uart_early_console_write;

    return 0;
}
OF_EARLYCON_DECLARE(owl, "actions,owl-uart",
            owl_uart_early_console_setup);

在这里您可以看到 UART 驱动程序注册了它的早期控制台功能,该功能将由 ARCH 初始化代码(在 start_kernel 之前运行)调用。

两个选项,

  • 使用 DTS 条目:在所选节点中使用“stdout-path”选项来指定要使用的串行/uart 驱动程序

    uart3: serial@e0126000 {
        compatible = "actions,s900-uart", "actions,owl-uart";
        reg = <0x0 0xe0126000 0x0 0x2000>;
        interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
        status = "okay";
    };
    
    aliases {
            serial3 = &uart3;
    };
    
    chosen {
            stdout-path = "serial3:115200n8";
    };
    

同样,该示例适用于来自 here 的 Actions SoC。有了这个条目,需要从 u-boot 或使用相同的选择节点“bootargs”选项将 bootargs 指定为“earlycon”。

  • 另一种方法是使用“earlycon”作为引导参数明确指定驱动程序名称,如 earlyprink。 earlycon=owl-uart,e0126000 将要求内核使用 UART 驱动程序中的earylconsole 定义,并使用基地址进行虚拟和物理地址映射。

您可以找到更多详细信息here。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多