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>; 註冊=<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
找到解決方案!
- 在設備樹(在所選部分)中添加標準輸出的定義:
linux,stdout-path = "serial0:115200n8";
serial0 指向我的串列介面
- 在核心配置中取消設置虛擬終端控制台(為了避免這種驅動程序的一種優先級):
CONFIG_VT=y # CONFIG_VT_CONSOLE 未設置
@Rui F Ribeiro 和 @Josh Benson,感謝您的支持。
問候
我在您的 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 電纜。
由於我正在使用帶有 sysV 而不是 systemd 的 ArmBian/Debian,因此也在
/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