Part 1
요약·해설
GPIO interrupt route, LED·button·CAN·I2C pin, payload별 message buffer 한도, FS26와 TRACE32 option을 설명합니다.
S32K344 · 160 MHz lock-step M7
6x CAN FD · payload별 MB 제한
FS26 SBC · ECC flash/RAM
Part 2
접을 수 있는 영어 원문 전체
영어 원문 전체 펼치기
8DBB198C96FB5BA500C472C7CCC3FEAF78299885C1F6C24FAD6C76E49DA00C6F
.. _mr_canhubk3:
NXP MR-CANHUBK3
###############
Overview
********
`NXP MR-CANHUBK3`_ is an evaluation board for mobile robotics applications such
as autonomous mobile robots (AMR) and automated guided vehicles (AGV). It
features an `NXP S32K344`_ general-purpose automotive microcontroller based on
an Arm Cortex-M7 core (Lock-Step).
.. image:: ../../../../../../../boards/nxp/mr_canhubk3/doc/img/mr_canhubk3_top.jpg
:align: center
:alt: NXP MR-CANHUBK3 (TOP)
Hardware
********
- NXP S32K344
- Arm Cortex-M7 (Lock-Step), 160 MHz (Max.)
- 4 MB of program flash, with ECC
- 320 KB RAM, with ECC
- Ethernet 100 Mbps, CAN FD, FlexIO, QSPI
- 12-bit 1 Msps ADC, 16-bit eMIOS timer
- `NXP FS26 Safety System Basis Chip`_
- Interfaces:
- Console UART
- 6x CAN FD
- 100Base-T1 Ethernet
- JST-GH connectors and I/O headers for I2C, SPI, GPIO,
PWM, etc.
More information about the hardware and design resources can be found at
`NXP MR-CANHUBK3`_ website.
Supported Features
==================
The ``mr_canhubk3`` board configuration supports the following hardware features:
============ ========== ================================
Interface Controller Driver/Component
============ ========== ================================
SIUL2 on-chip | pinctrl
| gpio
| external interrupt controller
WKPU on-chip interrupt controller
LPUART on-chip serial
QSPI on-chip flash
FLEXCAN on-chip can
LPI2C on-chip i2c
ADC SAR on-chip adc
LPSPI on-chip spi
WDT FS26 SBC watchdog
EMAC on-chip ethernet
mdio
eMIOS on-chip pwm
EDMA on-chip dma
FLEXIO PWM on-chip pwm
============ ========== ================================
The default configuration can be found in the Kconfig file
:zephyr_file:`boards/nxp/mr_canhubk3/mr_canhubk3_defconfig`.
Connections and IOs
===================
Each GPIO port is divided into two banks: low bank, from pin 0 to 15, and high
bank, from pin 16 to 31. For example, ``PTA2`` is the pin 2 of ``gpioa_l`` (low
bank), and ``PTA20`` is the pin 4 of ``gpioa_h`` (high bank).
The GPIO controller provides the option to route external input pad interrupts
to either the SIUL2 EIRQ or WKPU interrupt controllers, as supported by the SoC.
By default, GPIO interrupts are routed to SIUL2 EIRQ interrupt controller,
unless they are explicity configured to be directed to the WKPU interrupt
controller, as outlined in :zephyr_file:`dts/bindings/gpio/nxp,s32-gpio.yaml`.
To find information about which GPIOs are compatible with each interrupt
controller, refer to the device reference manual.
.. note::
It is important to highlight that the current board configuration lacks
support for wake-up events and power-management features. WKPU functionality
is restricted solely to serving as an interrupt controller.
LEDs
----
The MR-CANHUBK3 board has one user RGB LED:
======================= ===== ===== ===================================
Devicetree node Color Pin Pin Functions
======================= ===== ===== ===================================
led0 / user_led1_red Red PTE14 FXIO D7 / EMIOS0 CH19
led1 / user_led1_green Green PTA27 FXIO D5 / EMIOS1 CH10 / EMIOS2 CH10
led2 / user_led1_blue Blue PTE12 FXIO D8 / EMIOS1 CH5
======================= ===== ===== ===================================
In addition to the RGB LED, the MR-CANHUBK3 board has six red LEDs, each located
next to one of the CAN connectors:
======================= ===== ===== ===================================
Devicetree node Color Pin Pin Functions
======================= ===== ===== ===================================
can_led0 Red PTC18 FXIO D6 / FXIO D12 / EMIOS2 CH12
can_led1 Red PTE5 FXIO D7 / EMIOS1 CH5 / EMIOS0 CH 19
can_led2 Red PTD20 EMIOS1 CH17 / EMIOS2 CH0
can_led3 Red PTB24 FXIO D5 / EMIOS1 CH20 / EMIOS2 CH20
can_led4 Red PTB26 FXIO D7 / EMIOS1 CH22 / EMIOS2 CH22
can_led5 Red PTD31 FXIO D6 / EMIOS2 CH22
======================= ===== ===== ===================================
The user can control the LEDs in any way. An output of ``0`` illuminates the LED.
Buttons
-------
The MR-CANHUBK3 board has two user buttons:
======================= ===== ===== ==============
Devicetree node Label Pin Pin Functions
======================= ===== ===== ==============
sw0 / user_button_1 SW1 PTD15 EIRQ31
sw0 / user_button_2 SW2 PTA25 EIRQ5 / WKPU34
======================= ===== ===== ==============
System Clock
============
The Arm Cortex-M7 (Lock-Step) are configured to run at 160 MHz.
Serial Console
==============
By default, the serial console is provided through ``lpuart2`` on the 7-pin
DCD-LZ debug connector ``P6``.
========= ===== ============
Connector Pin Pin Function
========= ===== ============
P6.2 PTA9 LPUART2_TX
P6.3 PTA8 LPUART2_RX
========= ===== ============
CAN
===
CAN is provided through FLEXCAN interface with 6 instances.
=============== ======= =============== =============
Devicetree node Pin Pin Function Bus Connector
=============== ======= =============== =============
flexcan0 | PTA6 | PTA6_CAN0_RX P12/P13
| PTA7 | PTA7_CAN0_TX
flexcan1 | PTC9 | PTC9_CAN0_RX P14/P15
| PTC8 | PTC8_CAN0_TX
flexcan2 | PTE25 | PTE25_CAN0_RX P16/P17
| PTE24 | PTE24_CAN0_TX
flexcan3 | PTC29 | PTC29_CAN0_RX P18/019
| PTC28 | PTC28_CAN0_TX
flexcan4 | PTC31 | PTC31_CAN0_RX P20/P21
| PTC30 | PTC30_CAN0_TX
flexcan5 | PTC11 | PTC11_CAN0_RX P22/P23
| PTC10 | PTC10_CAN0_TX
=============== ======= =============== =============
.. note::
There is limitation by HAL SDK, so CAN only has support maximum 64 message buffers (MBs)
and support maximum 32 message buffers for concurrent active instances with 8 bytes
payload. We need to pay attention to configuration options:
1. :kconfig:option:`CONFIG_CAN_MAX_MB` must be less or equal than the
maximum number of message buffers that is according to the table below.
2. :kconfig:option:`CONFIG_CAN_MAX_FILTER` must be less or equal than
:kconfig:option:`CONFIG_CAN_MAX_MB`.
=============== ========== ================ ================
Devicetree node Payload Hardware support Software support
=============== ========== ================ ================
flexcan0 | 8 bytes | 96 MBs | 64 MBs
| 16 bytes | 63 MBs | 42 MBs
| 32 bytes | 36 MBs | 24 MBs
| 64 bytes | 21 MBs | 14 MBs
flexcan1 | 8 bytes | 64 MBs | 64 MBs
| 16 bytes | 42 MBs | 42 MBs
| 32 bytes | 24 MBs | 24 MBs
| 64 bytes | 14 MBs | 14 MBs
flexcan2 | 8 bytes | 64 MBs | 64 MBs
| 16 bytes | 42 MBs | 42 MBs
| 32 bytes | 24 MBs | 24 MBs
| 64 bytes | 14 MBs | 14 MBs
flexcan3 | 8 bytes | 32 MBs | 32 MBs
| 16 bytes | 21 MBs | 21 MBs
| 32 bytes | 12 MBs | 12 MBs
| 64 bytes | 7 MBs | 7 MBs
flexcan4 | 8 bytes | 32 MBs | 32 MBs
| 16 bytes | 21 MBs | 21 MBs
| 32 bytes | 12 MBs | 12 MBs
| 64 bytes | 7 MBs | 7 MBs
flexcan5 | 8 bytes | 32 MBs | 32 MBs
| 16 bytes | 21 MBs | 21 MBs
| 32 bytes | 12 MBs | 12 MBs
| 64 bytes | 7 MBs | 7 MBs
=============== ========== ================ ================
.. note::
A CAN bus usually requires 120 Ohm termination at both ends of the bus. This may be
accomplished using one of the included CAN termination boards. For more details, refer
to the section ``6.3 CAN Connectors`` in the Hardware User Manual of `NXP MR-CANHUBK3`_.
I2C
===
I2C is provided through LPI2C interface with 2 instances ``lpi2c0`` and ``lpi2c1``
on corresponding connectors ``P4``, ``P3``.
========= ===== ============
Connector Pin Pin Function
========= ===== ============
P3.2 PTD9 LPI2C1_SCL
P3.3 PTD8 LPI2C1_SDA
P4.3 PTD14 LPI2C0_SCL
P4.4 PTD13 LPI2C0_SDA
========= ===== ============
The accompanying display board can be connected to ``lpi2c0`` via connector ``P4``.
ADC
===
ADC is provided through ADC SAR controller with 3 instances. ADC channels are divided into
3 groups (precision, standard and external).
.. note::
All channels of an instance only run on 1 group channel at the same time.
FS26 SBC Watchdog
=================
On normal operation after the board is powered on, there is a window of 256 ms
on which the FS26 watchdog must be serviced with a good token refresh, otherwise
the watchdog will signal a reset to the MCU. This board configuration enables
the FS26 watchdog driver that handles this initialization.
.. note::
The FS26 can also be started in debug mode (watchdog disabled) following
these steps:
1. Power off the board.
2. Remove the jumper ``JP1`` (pins 1-2 open), which is connected by default.
3. Power on the board.
4. Reconnect the jumper ``JP1`` (pins 1-2 shorted).
External Flash
==============
The on-board MX25L6433F 64M-bit multi-I/O Serial NOR Flash memory is connected
to the QSPI controller port A1. This board configuration selects it as the
default flash controller.
Ethernet
========
This board has a single instance of Ethernet Media Access Controller (EMAC)
interfacing with a `NXP TJA1103`_ 100Base-T1 Ethernet PHY. Currently, there is
limited driver for this PHY that allows for overiding the default pin strapping configuration for
the PHY (RMII, master, autonomous mode enabled, polarity correction enabled)
to slave mode.
The 100Base-T1 signals are available in connector ``P9`` and can be converted to
100Base-T using a Ethernet media converter such as `RDDRONE-T1ADAPT`_.
Programming and Debugging
*************************
Applications for the ``mr_canhubk3`` board can be built in the usual way as
documented in :ref:`build_an_application`.
This board configuration supports `Lauterbach TRACE32`_, `SEGGER J-Link`_ and `pyOCD`_
West runners for flashing and debugging applications. Follow the steps described
in :ref:`lauterbach-trace32-debug-host-tools`, :ref:`jlink-debug-host-tools` and
:ref:`pyocd-debug-host-tools`,
to setup the flash and debug host tools for these runners, respectively. The
default runner is J-Link.
Flashing
========
Run the ``west flash`` command to flash the application using SEGGER J-Link.
Alternatively, run ``west flash -r trace32`` to use Lauterbach TRACE32, or
``west flash -r pyocd``` to use pyOCD.
The Lauterbach TRACE32 runner supports additional options that can be passed
through command line:
.. code-block:: console
west flash -r trace32 --startup-args elfFile=<elf_path> loadTo=<flash/sram>
eraseFlash=<yes/no> verifyFlash=<yes/no>
Where:
- ``<elf_path>`` is the path to the Zephyr application ELF in the output
directory
- ``loadTo=flash`` loads the application to the SoC internal program flash
(:kconfig:option:`CONFIG_XIP` must be set), and ``loadTo=sram`` load the
application to SRAM. Default is ``flash``.
- ``eraseFlash=yes`` erases the whole content of SoC internal flash before the
application is downloaded to either Flash or SRAM. This routine takes time to
execute. Default is ``no``.
- ``verifyFlash=yes`` verify the SoC internal flash content after programming
(use together with ``loadTo=flash``). Default is ``no``.
For example, to erase and verify flash content:
.. code-block:: console
west flash -r trace32 --startup-args elfFile=build/zephyr/zephyr.elf loadTo=flash eraseFlash=yes verifyFlash=yes
Debugging
=========
Run the ``west debug`` command to start a GDB session using SEGGER J-Link.
Alternatively, run ``west debug -r trace32`` or ``west debug -r pyocd``
to launch the Lauterbach TRACE32 or pyOCD software debugging interface respectively.
References
**********
.. target-notes::
.. _NXP MR-CANHUBK3:
https://www.nxp.com/design/development-boards/automotive-development-platforms/s32k-mcu-platforms/s32k344-evaluation-board-for-mobile-robotics-incorporating-100baset1-and-six-can-fd:MR-CANHUBK344
.. _NXP S32K344:
https://www.nxp.com/products/processors-and-microcontrollers/s32-automotive-platform/s32k-auto-general-purpose-mcus/s32k3-microcontrollers-for-automotive-general-purpose:S32K3
.. _NXP FS26 Safety System Basis Chip:
https://www.nxp.com/products/power-management/pmics-and-sbcs/safety-sbcs/safety-system-basis-chip-with-low-power-fit-for-asil-d:FS26
.. _NXP TJA1103:
https://www.nxp.com/products/interfaces/ethernet-/automotive-ethernet-phys/asil-b-compliant-100base-t1-ethernet-phy:TJA1103
.. _RDDRONE-T1ADAPT:
https://www.nxp.com/products/interfaces/ethernet-/automotive-ethernet-phys/ethernet-media-converter-for-drones-rovers-mobile-robotics-and-automotive:RDDRONE-T1ADAPT
.. _Lauterbach TRACE32:
https://www.lauterbach.com
.. _SEGGER J-Link:
https://wiki.segger.com/NXP_S32K3xx
.. _pyOCD:
https://pyocd.io/
Part 3
한국어 전문 번역
개요
NXP MR-CANHUBK3는 autonomous mobile robot(AMR), automated guided vehicle(AGV) 같은 mobile robotics application용 평가 보드입니다. Arm Cortex-M7 lock-step core 기반의 범용 차량용 MCU NXP S32K344를 사용합니다.

하드웨어
- NXP S32K344: 최대 160 MHz Arm Cortex-M7 lock-step
- ECC가 적용된 4 MB program flash와 320 KB RAM
- 100 Mbps Ethernet, CAN FD, FlexIO, QSPI
- 12-bit 1 Msps ADC와 16-bit eMIOS timer
- NXP FS26 Safety System Basis Chip
- Console UART, CAN FD 6개, 100Base-T1 Ethernet
- I2C, SPI, GPIO, PWM 등을 위한 JST-GH connector와 I/O header
지원 기능
| 인터페이스 | 컨트롤러 | 드라이버/컴포넌트 |
|---|---|---|
SIUL2 | on-chip | pinctrl; gpio; external interrupt controller |
WKPU | on-chip | interrupt controller |
LPUART | on-chip | serial |
QSPI | on-chip | flash |
FLEXCAN | on-chip | can |
LPI2C | on-chip | i2c |
ADC SAR | on-chip | adc |
LPSPI | on-chip | spi |
WDT | FS26 SBC | watchdog |
EMAC | on-chip | ethernet; mdio |
eMIOS | on-chip | pwm |
EDMA | on-chip | dma |
FLEXIO PWM | on-chip | pwm |
기본 구성은 boards/nxp/mr_canhubk3/mr_canhubk3_defconfig에 있습니다.
연결과 I/O
각 GPIO port는 pin 0~15의 low bank와 pin 16~31의 high bank로 나뉩니다. 예를 들어 PTA2는 gpioa_l의 pin 2이고, PTA20은 gpioa_h의 pin 4입니다.
GPIO controller는 외부 input pad interrupt를 SoC가 지원하는 SIUL2 EIRQ 또는 WKPU interrupt controller로 route할 수 있습니다. 명시적으로 WKPU로 지정하지 않으면 기본값은 SIUL2 EIRQ입니다. 설정 방식은 dts/bindings/gpio/nxp,s32-gpio.yaml을, controller별 호환 GPIO는 device reference manual을 참고하십시오.
LED
사용자 RGB LED의 채널은 다음과 같습니다.
| Devicetree node | 색 | 핀 | 핀 기능 |
|---|---|---|---|
led0 / user_led1_red | Red | PTE14 | FXIO D7 / EMIOS0 CH19 |
led1 / user_led1_green | Green | PTA27 | FXIO D5 / EMIOS1 CH10 / EMIOS2 CH10 |
led2 / user_led1_blue | Blue | PTE12 | FXIO D8 / EMIOS1 CH5 |
각 CAN connector 옆에는 red LED가 하나씩 있습니다.
| Devicetree node | 색 | 핀 | 핀 기능 |
|---|---|---|---|
can_led0 | Red | PTC18 | FXIO D6 / FXIO D12 / EMIOS2 CH12 |
can_led1 | Red | PTE5 | FXIO D7 / EMIOS1 CH5 / EMIOS0 CH 19 |
can_led2 | Red | PTD20 | EMIOS1 CH17 / EMIOS2 CH0 |
can_led3 | Red | PTB24 | FXIO D5 / EMIOS1 CH20 / EMIOS2 CH20 |
can_led4 | Red | PTB26 | FXIO D7 / EMIOS1 CH22 / EMIOS2 CH22 |
can_led5 | Red | PTD31 | FXIO D6 / EMIOS2 CH22 |
LED는 자유롭게 제어할 수 있으며 output 0이 LED를 켭니다.
버튼
| Devicetree node | Label | 핀 | 핀 기능 |
|---|---|---|---|
sw0 / user_button_1 | SW1 | PTD15 | EIRQ31 |
sw0 / user_button_2 | SW2 | PTA25 | EIRQ5 / WKPU34 |
시스템 클록
Arm Cortex-M7 lock-step core는 160 MHz로 동작하도록 구성됩니다.
직렬 콘솔
기본 serial console은 7-pin DCD-LZ debug connector P6의 lpuart2로 제공됩니다.
| Connector | 핀 | 핀 기능 |
|---|---|---|
P6.2 | PTA9 | LPUART2_TX |
P6.3 | PTA8 | LPUART2_RX |
CAN
CAN은 FLEXCAN interface 6개로 제공됩니다.
| Devicetree node | 핀 | 핀 기능 | Bus connector |
|---|---|---|---|
flexcan0 | PTA6PTA7 | PTA6_CAN0_RXPTA7_CAN0_TX | P12/P13 |
flexcan1 | PTC9PTC8 | PTC9_CAN0_RXPTC8_CAN0_TX | P14/P15 |
flexcan2 | PTE25PTE24 | PTE25_CAN0_RXPTE24_CAN0_TX | P16/P17 |
flexcan3 | PTC29PTC28 | PTC29_CAN0_RXPTC28_CAN0_TX | P18/019 |
flexcan4 | PTC31PTC30 | PTC31_CAN0_RXPTC30_CAN0_TX | P20/P21 |
flexcan5 | PTC11PTC10 | PTC11_CAN0_RXPTC10_CAN0_TX | P22/P23 |
| Devicetree node | Payload | Hardware support | Software support |
|---|---|---|---|
flexcan0 | 8 bytes | 96 MBs | 64 MBs |
flexcan0 | 16 bytes | 63 MBs | 42 MBs |
flexcan0 | 32 bytes | 36 MBs | 24 MBs |
flexcan0 | 64 bytes | 21 MBs | 14 MBs |
flexcan1 | 8 bytes | 64 MBs | 64 MBs |
flexcan1 | 16 bytes | 42 MBs | 42 MBs |
flexcan1 | 32 bytes | 24 MBs | 24 MBs |
flexcan1 | 64 bytes | 14 MBs | 14 MBs |
flexcan2 | 8 bytes | 64 MBs | 64 MBs |
flexcan2 | 16 bytes | 42 MBs | 42 MBs |
flexcan2 | 32 bytes | 24 MBs | 24 MBs |
flexcan2 | 64 bytes | 14 MBs | 14 MBs |
flexcan3 | 8 bytes | 32 MBs | 32 MBs |
flexcan3 | 16 bytes | 21 MBs | 21 MBs |
flexcan3 | 32 bytes | 12 MBs | 12 MBs |
flexcan3 | 64 bytes | 7 MBs | 7 MBs |
flexcan4 | 8 bytes | 32 MBs | 32 MBs |
flexcan4 | 16 bytes | 21 MBs | 21 MBs |
flexcan4 | 32 bytes | 12 MBs | 12 MBs |
flexcan4 | 64 bytes | 7 MBs | 7 MBs |
flexcan5 | 8 bytes | 32 MBs | 32 MBs |
flexcan5 | 16 bytes | 21 MBs | 21 MBs |
flexcan5 | 32 bytes | 12 MBs | 12 MBs |
flexcan5 | 64 bytes | 7 MBs | 7 MBs |
I2C
LPI2C instance lpi2c0과 lpi2c1은 각각 connector P4, P3에 연결됩니다.
| Connector | 핀 | 핀 기능 |
|---|---|---|
P3.2 | PTD9 | LPI2C1_SCL |
P3.3 | PTD8 | LPI2C1_SDA |
P4.3 | PTD14 | LPI2C0_SCL |
P4.4 | PTD13 | LPI2C0_SDA |
동반 display board는 P4를 통해 lpi2c0에 연결할 수 있습니다.
ADC
ADC는 ADC SAR controller instance 3개로 제공되며 channel은 precision, standard, external의 세 group으로 나뉩니다.
FS26 SBC watchdog
보드 전원을 켠 뒤 정상 동작에서는 256 ms window 안에 올바른 token refresh로 FS26 watchdog을 service해야 합니다. 그렇지 않으면 watchdog이 MCU reset을 발생시킵니다. 이 board configuration은 초기화를 처리하는 FS26 watchdog driver를 활성화합니다.
Watchdog을 끈 FS26 debug mode는 다음 순서로 시작합니다.
- 보드 전원을 끕니다.
- 기본 연결된
JP1jumper를 제거해 pin 1-2를 open합니다. - 보드 전원을 켭니다.
JP1jumper를 다시 연결해 pin 1-2를 short합니다.
외부 flash
On-board MX25L6433F 64-Mbit multi-I/O Serial NOR Flash는 QSPI controller port A1에 연결되며 이 board configuration의 기본 flash controller로 선택됩니다.
Ethernet
EMAC instance 하나가 NXP TJA1103 100Base-T1 Ethernet PHY와 연결됩니다. 현재의 제한된 PHY driver는 기본 pin strapping 설정인 RMII, master, autonomous mode, polarity correction enabled를 slave mode로 override할 수 있습니다.
100Base-T1 signal은 connector P9에서 사용할 수 있으며 RDDRONE-T1ADAPT 같은 Ethernet media converter로 100Base-T로 변환할 수 있습니다.
프로그래밍과 디버깅
mr_canhubk3 application은 일반적인 방식으로 build합니다. Flash와 debug runner로 Lauterbach TRACE32, SEGGER J-Link, pyOCD를 지원하며 기본 runner는 J-Link입니다.
플래시
west flash는 SEGGER J-Link를 사용합니다. TRACE32는 west flash -r trace32, pyOCD는 west flash -r pyocd로 선택합니다. TRACE32 runner에는 다음 추가 option을 전달할 수 있습니다.
west flash -r trace32 --startup-args elfFile=<elf_path> loadTo=<flash/sram>
eraseFlash=<yes/no> verifyFlash=<yes/no>
<elf_path>: output directory의 Zephyr application ELF 경로loadTo=flash: SoC 내부 program flash에 load하며CONFIG_XIP가 필요합니다.loadTo=sram은 SRAM에 load합니다. 기본값은flash입니다.eraseFlash=yes: Flash 또는 SRAM에 download하기 전에 SoC 내부 flash 전체를 지웁니다. 시간이 걸리며 기본값은no입니다.verifyFlash=yes: programming 뒤 내부 flash 내용을 검증합니다.loadTo=flash와 함께 사용하며 기본값은no입니다.
Flash 전체를 지우고 기록 결과를 검증하는 예는 다음과 같습니다.
west flash -r trace32 --startup-args elfFile=build/zephyr/zephyr.elf loadTo=flash eraseFlash=yes verifyFlash=yes
디버깅
west debug는 SEGGER J-Link로 GDB session을 시작합니다. TRACE32는 west debug -r trace32, pyOCD는 west debug -r pyocd를 사용합니다.
참고 자료
Source
출처
영어 원문에는 문단, 문서 지시문, 표, 코드, 코드 심벌, 경로를 그대로 보존했습니다.