요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.
1. 요약·해설
원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.
2. 영어 원문 전체
번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.
원문 전체 펼치기
.. SPDX-License-Identifier: GPL-2.0
============
Early Printk
============
Mini-HOWTO for using the earlyprintk=dbgp boot option with a
USB2 Debug port key and a debug cable, on x86 systems.
You need two computers, the 'USB debug key' special gadget and
two USB cables, connected like this::
[host/target] <-------> [USB debug key] <-------> [client/console]
Hardware requirements
=====================
a) Host/target system needs to have USB debug port capability.
You can check this capability by looking at a 'Debug port' bit in
the lspci -vvv output::
# lspci -vvv
...
00:1d.7 USB Controller: Intel Corporation 82801H (ICH8 Family) USB2 EHCI Controller #1 (rev 03) (prog-if 20 [EHCI])
Subsystem: Lenovo ThinkPad T61
Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0
Interrupt: pin D routed to IRQ 19
Region 0: Memory at fe227000 (32-bit, non-prefetchable) [size=1K]
Capabilities: [50] Power Management version 2
Flags: PMEClk- DSI- D1- D2- AuxCurrent=375mA PME(D0+,D1-,D2-,D3hot+,D3cold+)
Status: D0 PME-Enable- DSel=0 DScale=0 PME+
Capabilities: [58] Debug port: BAR=1 offset=00a0
^^^^^^^^^^^ <==================== [ HERE ]
Kernel driver in use: ehci_hcd
Kernel modules: ehci-hcd
...
.. note::
If your system does not list a debug port capability then you probably
won't be able to use the USB debug key.
b) You also need a NetChip USB debug cable/key:
http://www.plxtech.com/products/NET2000/NET20DC/default.asp
This is a small blue plastic connector with two USB connections;
it draws power from its USB connections.
c) You need a second client/console system with a high speed USB 2.0 port.
d) The NetChip device must be plugged directly into the physical
debug port on the "host/target" system. You cannot use a USB hub in
between the physical debug port and the "host/target" system.
The EHCI debug controller is bound to a specific physical USB
port and the NetChip device will only work as an early printk
device in this port. The EHCI host controllers are electrically
wired such that the EHCI debug controller is hooked up to the
first physical port and there is no way to change this via software.
You can find the physical port through experimentation by trying
each physical port on the system and rebooting. Or you can try
and use lsusb or look at the kernel info messages emitted by the
usb stack when you plug a usb device into various ports on the
"host/target" system.
Some hardware vendors do not expose the usb debug port with a
physical connector and if you find such a device send a complaint
to the hardware vendor, because there is no reason not to wire
this port into one of the physically accessible ports.
e) It is also important to note, that many versions of the NetChip
device require the "client/console" system to be plugged into the
right hand side of the device (with the product logo facing up and
readable left to right). The reason being is that the 5 volt
power supply is taken from only one side of the device and it
must be the side that does not get rebooted.
Software requirements
=====================
a) On the host/target system:
You need to enable the following kernel config option::
CONFIG_EARLY_PRINTK_DBGP=y
And you need to add the boot command line: "earlyprintk=dbgp".
.. note::
If you are using Grub, append it to the 'kernel' line in
/etc/grub.conf. If you are using Grub2 on a BIOS firmware system,
append it to the 'linux' line in /boot/grub2/grub.cfg. If you are
using Grub2 on an EFI firmware system, append it to the 'linux'
or 'linuxefi' line in /boot/grub2/grub.cfg or
/boot/efi/EFI/<distro>/grub.cfg.
On systems with more than one EHCI debug controller you must
specify the correct EHCI debug controller number. The ordering
comes from the PCI bus enumeration of the EHCI controllers. The
default with no number argument is "0" or the first EHCI debug
controller. To use the second EHCI debug controller, you would
use the command line: "earlyprintk=dbgp1"
.. note::
normally earlyprintk console gets turned off once the
regular console is alive - use "earlyprintk=dbgp,keep" to keep
this channel open beyond early bootup. This can be useful for
debugging crashes under Xorg, etc.
b) On the client/console system:
You should enable the following kernel config option::
CONFIG_USB_SERIAL_DEBUG=y
On the next bootup with the modified kernel you should
get a /dev/ttyUSBx device(s).
Now this channel of kernel messages is ready to be used: start
your favorite terminal emulator (minicom, etc.) and set
it up to use /dev/ttyUSB0 - or use a raw 'cat /dev/ttyUSBx' to
see the raw output.
c) On Nvidia Southbridge based systems: the kernel will try to probe
and find out which port has a debug device connected.
Testing
=======
You can test the output by using earlyprintk=dbgp,keep and provoking
kernel messages on the host/target system. You can provoke a harmless
kernel message by for example doing::
echo h > /proc/sysrq-trigger
On the host/target system you should see this help line in "dmesg" output::
SysRq : HELP : loglevel(0-9) reBoot Crashdump terminate-all-tasks(E) memory-full-oom-kill(F) kill-all-tasks(I) saK show-backtrace-all-active-cpus(L) show-memory-usage(M) nice-all-RT-tasks(N) powerOff show-registers(P) show-all-timers(Q) unRaw Sync show-task-states(T) Unmount show-blocked-tasks(W) dump-ftrace-buffer(Z)
On the client/console system do::
cat /dev/ttyUSB0
And you should see the help line above displayed shortly after you've
provoked it on the host system.
If it does not work then please ask about it on the [email protected]
mailing list or contact the x86 maintainers.
3. 한국어 전문 번역
영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.
USB2 debug-port early printk 구성
1-14이 `GPL-2.0` mini-HOWTO는 x86 system에서 USB2 Debug Port key와 debug cable로 `earlyprintk=dbgp` boot option을 사용하는 방법을 설명합니다. computer 두 대, special USB debug key, USB cable 두 개가 필요합니다.
원문의 단일 ASCII 연결도를 동일한 양방향 link 구조로 다시 그렸습니다.
hardware requirement와 physical port
15-80host/target system은 USB debug-port capability가 있어야 합니다. `lspci -vvv` output에서 `Debug port` bit를 확인할 수 있으며 다음 예에서는 EHCI controller의 `Capabilities: [58] Debug port: BAR=1 offset=00a0` line이 capability를 나타냅니다.
# lspci -vvv
...
00:1d.7 USB Controller: Intel Corporation 82801H (ICH8 Family) USB2 EHCI Controller #1 (rev 03) (prog-if 20 [EHCI])
Subsystem: Lenovo ThinkPad T61
Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0
Interrupt: pin D routed to IRQ 19
Region 0: Memory at fe227000 (32-bit, non-prefetchable) [size=1K]
Capabilities: [50] Power Management version 2
Flags: PMEClk- DSI- D1- D2- AuxCurrent=375mA PME(D0+,D1-,D2-,D3hot+,D3cold+)
Status: D0 PME-Enable- DSel=0 DScale=0 PME+
Capabilities: [58] Debug port: BAR=1 offset=00a0
^^^^^^^^^^^ <==================== [ HERE ]
Kernel driver in use: ehci_hcd
Kernel modules: ehci-hcd
...
system이 debug-port capability를 나열하지 않으면 USB debug key를 사용할 수 없을 가능성이 큽니다.
NetChip USB debug cable/key도 필요합니다. 원문이 가리키는 제품 URL은 `http://www.plxtech.com/products/NET2000/NET20DC/default.asp`입니다. USB connection 두 개가 달린 작은 파란 connector이며 USB에서 power를 얻습니다. client/console system에는 high-speed USB 2.0 port가 필요합니다.
NetChip device는 host/target의 실제 physical debug port에 직접 연결해야 하며 중간에 USB hub를 둘 수 없습니다. EHCI debug controller는 특정 physical USB port에 고정되어 그 port에서만 early-printk device로 동작합니다. EHCI host-controller wiring상 보통 first physical port에 연결되고 software로 바꿀 수 없습니다.
정확한 port는 각 physical port에 연결해 reboot하며 실험하거나, `lsusb` 및 여러 port에 device를 꽂을 때 USB stack이 출력하는 kernel message로 찾을 수 있습니다. 일부 vendor는 debug port를 외부 connector에 연결하지 않는데 기술적 이유가 없으므로 이런 hardware는 vendor에 문제를 제기해야 합니다.
많은 NetChip version은 제품 logo가 위를 향하고 왼쪽에서 오른쪽으로 읽히는 상태에서 client/console을 device 오른쪽에 연결해야 합니다. 5 V power가 한쪽에서만 오며 reboot되지 않는 쪽이어야 하기 때문입니다.
host와 console software 설정
81-129host/target kernel에서는 다음 config를 enable합니다.
CONFIG_EARLY_PRINTK_DBGP=y
boot command line에 `earlyprintk=dbgp`를 추가합니다. GRUB은 `/etc/grub.conf`의 `kernel` line, BIOS firmware의 GRUB2는 `/boot/grub2/grub.cfg`의 `linux` line, EFI firmware의 GRUB2는 `/boot/grub2/grub.cfg` 또는 `/boot/efi/EFI/<distro>/grub.cfg`의 `linux`나 `linuxefi` line에 붙입니다.
EHCI debug controller가 여러 개면 PCI bus enumeration 순서의 controller number를 지정합니다. number가 없으면 `0`, 즉 첫 controller입니다. 둘째 controller에는 `earlyprintk=dbgp1`을 사용합니다. regular console이 살아나면 earlyprintk console은 보통 꺼지며 Xorg crash 같은 이후 문제까지 보려면 `earlyprintk=dbgp,keep`으로 channel을 유지합니다.
client/console kernel에서는 다음 config를 enable합니다.
CONFIG_USB_SERIAL_DEBUG=y
수정 kernel로 boot하면 `/dev/ttyUSBx` device가 생깁니다. minicom 같은 terminal emulator를 `/dev/ttyUSB0`에 연결하거나 `cat /dev/ttyUSBx`로 raw output을 봅니다. Nvidia Southbridge system에서는 kernel이 debug device가 연결된 port를 probe해 찾습니다.
SysRq로 channel 시험
130-151`earlyprintk=dbgp,keep`을 사용하고 host/target에서 harmless kernel message를 발생시켜 output을 시험할 수 있습니다.
echo h > /proc/sysrq-trigger
host/target의 `dmesg`에는 다음 SysRq help line이 나타나야 합니다.
SysRq : HELP : loglevel(0-9) reBoot Crashdump terminate-all-tasks(E) memory-full-oom-kill(F) kill-all-tasks(I) saK show-backtrace-all-active-cpus(L) show-memory-usage(M) nice-all-RT-tasks(N) powerOff show-registers(P) show-all-timers(Q) unRaw Sync show-task-states(T) Unmount show-blocked-tasks(W) dump-ftrace-buffer(Z)
client/console에서는 다음 command를 실행합니다.
cat /dev/ttyUSB0
host에서 message를 발생시킨 직후 console에도 같은 help line이 보여야 합니다. 동작하지 않으면 `[email protected]` mailing list 또는 x86 maintainer에게 문의합니다.
요약과 해설
earlyprintk.rst:1-151host/target의 EHCI physical debug port와 client/console을 NetChip USB debug key로 직접 연결하고, 양쪽 kernel에 각각 `CONFIG_EARLY_PRINTK_DBGP`, `CONFIG_USB_SERIAL_DEBUG`를 enable합니다.
host는 `earlyprintk=dbgp[,keep]`, console은 `/dev/ttyUSBx`를 사용합니다. EHCI debug controller는 특정 physical port에 고정되므로 hub를 거치지 말고 `lspci`, `lsusb`, reboot 실험으로 port와 controller number를 확인합니다.