initramfs (ARM) 中的控制台设置

initramfs (ARM) 中的控制台设置

我正在将基于 picozed 的平台的嵌入式系统从 Xilinx-v2013.4(3.12 内核)移植到 Xilinx-v2016.2(4.4 内核)。以前的版本仍然使用初始 RAM 磁盘 (initrd),而新版本则使用初始 RAM fs (initramfs)。

启动时,控制台通过 USB 连接器上的串行接口给出。我希望它是 ttyPS0。此时,我已经不知道“console-ttyPS0”这个关系是如何完成的!?它是否来自设备树(我没有看到任何提及 ttyPS0 的内容)?在以前的版本中(在 RAM 磁盘中),它甚至没有在“init”脚本中配置,也没有在“mdev”配置文件中配置。

引导进程正在运行,然后挂起。这是输出:

Starting kernel ...

Uncompressing Linux... done, booting the kernel.
Booting Linux on physical CPU 0x0
Linux version 4.4.0-test (pierrett@build0109-linux) (gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-23) ) #1 SMP PREEMPT Thu Aug 18 12:10:52 CEST 2016
CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=18c5387d
CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
Machine model: zynq
bootconsole [earlycon0] enabled
cma: Reserved 16 MiB at 0x3dc00000
Memory policy: Data cache writealloc
PERCPU: Embedded 12 pages/cpu @ef7d2000 s18240 r8192 d22720 u49152
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 260608
Kernel command line: bootargs=console=ttyPS0,115200 root=/dev/ram initrd=0x8000000 rw earlyprintk rootwait
PID hash table entries: 4096 (order: 2, 16384 bytes)
Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)
Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)
Memory: 1009532K/1048576K available (4456K kernel code, 213K rwdata, 1564K rodata, 240K init, 193K bss, 22660K reserved, 16384K cma-reserved, 238976K highmem)
Virtual kernel memory layout:
    vector  : 0xffff0000 - 0xffff1000   (   4 kB)
    fixmap  : 0xffc00000 - 0xfff00000   (3072 kB)
    vmalloc : 0xf0800000 - 0xff800000   ( 240 MB)
    lowmem  : 0xc0000000 - 0xf0000000   ( 768 MB)
    pkmap   : 0xbfe00000 - 0xc0000000   (   2 MB)
    modules : 0xbf000000 - 0xbfe00000   (  14 MB)
      .text : 0xc0008000 - 0xc05e949c   (6022 kB)
      .init : 0xc05ea000 - 0xc0626000   ( 240 kB)
      .data : 0xc0626000 - 0xc065b450   ( 214 kB)
       .bss : 0xc065b450 - 0xc068bb54   ( 194 kB)
Preemptible hierarchical RCU implementation.
        Build-time adjustment of leaf fanout to 32.
        RCU restricting CPUs from NR_CPUS=4 to nr_cpu_ids=2.
RCU: Adjusting geometry for rcu_fanout_leaf=32, nr_cpu_ids=2
NR_IRQS:16 nr_irqs:16 16
ps7-slcr mapped to f0802000
L2C: platform modifies aux control register: 0x72360000 -> 0x72760000
L2C: DT/platform modifies aux control register: 0x72360000 -> 0x72760000
L2C-310 erratum 769419 enabled
L2C-310 enabling early BRESP for Cortex-A9
L2C-310 full line of zeros enabled for Cortex-A9
L2C-310 ID prefetch enabled, offset 1 lines
L2C-310 dynamic clock gating enabled, standby mode enabled
L2C-310 cache controller enabled, 8 ways, 512 kB
L2C-310: CACHE_ID 0x410000c8, AUX_CTRL 0x76760001
zynq_clock_init: clkc starts at f0802100
Zynq clock init
sched_clock: 64 bits at 333MHz, resolution 3ns, wraps every 4398046511103ns
clocksource: arm_global_timer: mask: 0xffffffffffffffff max_cycles: 0x4ce07af025, max_idle_ns: 440795209040 ns
clocksource: ttc_clocksource: mask: 0xffff max_cycles: 0xffff, max_idle_ns: 537538477 ns
ps7-ttc #0 at f080a000, irq=18
Console: colour dummy device 80x30
console [tty0] enabled
bootconsole [earlycon0] disabled

我的感觉是问题来自于控制台的错误设置。在启动日志中,我们可以注意到启动参数中的“tty0”已启用,我希望控制台位于 ttyPS0 上。

任何人都可以解释如何在启动时设置正确的控制台吗?

附加信息 :

  • 设备树串行配置:
ps7_uart_1: 串行@e0001000 {
 时钟名称=“ref_clk”,“aper_clk”;
 时钟=<0x2 0x18 0x2 0x29>;
 兼容=“xlnx,xuartps”;
 当前速度=<115200>;
 device_type =“串行”;
 中断父级 = <&ps7_scugic_0>;
 中断=<0x0 0x32 0x4>;
 端口号 = <0x0>;
 reg = <0xe0001000 0x1000>;
 xlnx,有调制解调器= <0x0>;
};
  • 启动参数:
控制台=ttyPS0,115200 root=/dev/ram initrd=0x8000000 rw Earlyprintk rootwait
  • 内核串行配置:
#
# 串口驱动
# CONFIG_SERIAL_EARLYCON=y
# CONFIG_SERIAL_8250 未设置
#
# 非8250串口支持
#
# CONFIG_SERIAL_AMBA_PL010 未设置
# CONFIG_SERIAL_AMBA_PL011 未设置
# CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST 未设置
# CONFIG_SERIAL_MAX3100 未设置
# CONFIG_SERIAL_MAX310X 未设置
CONFIG_SERIAL_UARTLITE=m
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
# CONFIG_SERIAL_JSM 未设置
# CONFIG_SERIAL_SCCNXP 未设置
# CONFIG_SERIAL_SC16IS7XX 未设置
# CONFIG_SERIAL_BCM63XX 未设置
# CONFIG_SERIAL_ALTERA_JTAGUART 未设置
# CONFIG_SERIAL_ALTERA_UART 未设置
# CONFIG_SERIAL_IFX6X60 未设置
CONFIG_SERIAL_XILINX_PS_UART=y
CONFIG_SERIAL_XILINX_PS_UART_CONSOLE=y
# CONFIG_SERIAL_ARC 未设置
# CONFIG_SERIAL_RP2 未设置
# CONFIG_SERIAL_FSL_LPUART 未设置
# CONFIG_SERIAL_CONEXANT_DIGICOLOR 未设置
# CONFIG_SERIAL_ST_ASC 未设置
# CONFIG_SERIAL_STM32 未设置
# CONFIG_TTY_PRINTK 未设置
# CONFIG_HVC_DCC 未设置
# CONFIG_VIRTIO_CONSOLE 未设置
# CONFIG_IPMI_HANDLER 未设置
# CONFIG_HW_RANDOM 未设置
CONFIG_XILINX_DEVCFG=y
# CONFIG_R3964 未设置
# CONFIG_APPLICOM 未设置
# CONFIG_RAW_DRIVER 未设置
# CONFIG_TCG_TPM 未设置
CONFIG_DEVPORT=y
# CONFIG_XILLYBUS 未设置
  • “inittab”条目:

    ttyPS0::respawn:/sbin/getty -L ttyPS0 115200 vt100 # GENERIC_SERIAL

答案1

我在你的 dmesg 中没有看到 UART 线。您还需要在设备树中至少配置一个 uart。

我在这里使用的是 ARM A20、Lamobo R1,并启用了串行控制台。 (115200, 8, N, 1)

就我的具体情况而言:

来自 dmesg

[    3.456402] Serial: 8250/16550 driver, 8 ports, IRQ sharing disabled
[    3.480137] 1c28000.serial: ttyS0 at MMIO 0x1c28000 (irq = 41, base_baud = 1500000) is a U6_16550A
[    3.503990] 1c28c00.serial: ttyS1 at MMIO 0x1c28c00 (irq = 42, base_baud = 1500000) is a U6_16550A
[    3.505687] console [ttyS1] enabled
[    3.529520] 1c29c00.serial: ttyS2 at MMIO 0x1c29c00 (irq = 43, base_baud = 1500000) is a U6_16550A

我对内核的选项,在 中/boot/boot.cmd,编译为/boot/boot.scr,是:

setenv bootargs "console=ttyS1,115200n8 root=/dev/sda2 rootwait rootfstype=ext4 sunxi_ve_mem_reserve=0 sunxi_g2d_mem_reserve=0 sunxi_no_mali_mem_reserve sunxi_fb_mem_reserve=0 panic=10 enforcing=0 loglevel=1 ipv6.disable=1"

如您所见,我将串行定义为控制台,并尝试删除对 Mali 图形模式的支持/保留内存以节省资源,因为我仅在无头模式下使用 USB 转 RS232 TTL UART PL2303HX 电缆。

由于我使用 ArmBian/Debian 与 sysV 而不是 systemd,也在/etc/inittab

T0:2345:respawn:/sbin/getty -L ttyS0 115200 vt100

至于设备树

    uart0: serial@01c28000 {
        pinctrl-names = "default";
        pinctrl-0 = <&uart0_pins_a>;
        status = "okay";
    };

    uart3: serial@01c28c00 {
        pinctrl-names = "default";
        pinctrl-0 = <&uart3_pins_b>;
        status = "okay";
    };

    uart7: serial@01c29c00 {
        pinctrl-names = "default";
        pinctrl-0 = <&uart7_pins_a>;
        status = "okay";
    };

对于使用的内核编译时选项:

$zcat /proc/config.gz  | grep  8250
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_DMA=y
CONFIG_SERIAL_8250_NR_UARTS=8
CONFIG_SERIAL_8250_RUNTIME_UARTS=8
# CONFIG_SERIAL_8250_EXTENDED is not set
CONFIG_SERIAL_8250_FSL=y
CONFIG_SERIAL_8250_DW=y
# CONFIG_SERIAL_8250_EM is not set
# CONFIG_SERIAL_8250_RT288X is not set
# Non-8250 serial port support
# CONFIG_DEBUG_LL_UART_8250 is not set
CONFIG_DEBUG_LL_INCLUDE="debug/8250.S"
CONFIG_DEBUG_UART_8250=y
CONFIG_DEBUG_UART_8250_SHIFT=2
# CONFIG_DEBUG_UART_8250_WORD is not set
# CONFIG_DEBUG_UART_8250_PALMCHIP is not set
# CONFIG_DEBUG_UART_8250_FLOW_CONTROL is not set

除了这些之外,还需要:CONFIG_SERIAL_CORE_CONSOLE=y

答案2

解决方案找到了!

  • 在设备树中添加标准输出的定义(在所选部分中):
linux,stdout-path = "serial0:115200n8";

其中serial0指向我的串行接口

  • 在内核配置中取消设置虚拟终端控制台(以避免此驱动程序的某种优先级):
配置VT=y
# CONFIG_VT_CONSOLE 未设置

@Rui F Ribeiro 和@Josh Benson,感谢您的支持。

问候

相关内容