Xilinx-v2013.4(3.12 커널)에서 Xilinx-v2016.2(4.4 커널)로 picozed 플랫폼 기반 임베디드 시스템을 포팅하고 있습니다. 이전 버전에서는 초기 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: serial@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,hasmodem=<0x0>; };
- 시작 매개변수:
console=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"
보시다시피, 저는 직렬을 콘솔로 정의하고 헤드리스 모드에서 USB-RS232 TTL UART PL2303HX 케이블만 사용하고 있기 때문에 리소스를 절약하기 위해 Mali 그래픽 모드에 대한 지원을 제거하고 메모리를 예약해 보았습니다.
systemd 대신 sysV와 함께 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
답변2
해결책을 찾았습니다!
- 장치 트리(선택한 섹션)에 표준 출력에 대한 정의를 추가합니다.
linux,stdout-path = "serial0:115200n8";
여기서 serial0은 내 직렬 인터페이스를 가리킵니다.
- 커널 구성에서 가상 터미널 콘솔을 설정 해제합니다(이 드라이버의 우선 순위를 피하기 위해):
VT=y 구성 # CONFIG_VT_CONSOLE이 설정되지 않았습니다.
@Rui F Ribeiro와 @Josh Benson의 지원에 감사드립니다.
인사