JTAG와 Arm 코어 디버깅 이해: ADI와 SWD 설명
이 기사는 JTAG가 ARM 코어 장치에 어떻게 통합되는지 신비화를 풀며, Arm 디버그 인터페이스(ADI)와 시리얼 와이어 디버그(SWD) 프로토콜에 초점을 맞춥니다.
이 시리즈의 이전 게시물에서는 IEEE 1149.1 표준, 테스트 액세스 포트(TAP) 컨트롤러, TAP 상태 머신을 탐구했습니다. 또한 일반적인 JTAG 핀아웃, 커넥터, 시장에서 사용 가능한 다양한 디버그 프로브를 검토했습니다.
여기서는 ARM 생태계로 초점을 옮겨, 유비쿼터스 ARM 코어 프로세서가 ADI와 그 2선식 SWD 변형을 통해 JTAG를 어떻게 구현하는지 자세히 설명합니다.
ARM이란 무엇인가?
ARM은 프로세서 아키텍처와 마이크로프로세서 및 마이크로컨트롤러 인터페이스를 정의하는 방대한 지적 재산 포트폴리오를 나타냅니다. 소비자 PC가 일반적으로 x86을 사용하는 반면, 임베디드 시스템은 거의 전적으로 ARM 코어에 의존합니다.
코어 지적 재산은 STMicroelectronics, NXP 등과 같은 실리콘 제조사에게 라이선스되며, 이들은 주변 기능(I²C, SPI, ADC/DAC, USB 등)을 추가합니다. ARM 아키텍처는 버전화됩니다(ARMv2, ARMv6, ARMv7, ARMv8 등), 코어는 ARMx(예: ARM7)로 브랜딩되거나, 더 최근에는 애플리케이션, 실시간, 마이크로컨트롤러 용례로 Cortex-A/R/M 시리즈로 브랜딩됩니다. 아키텍처 버전화는 Cortex 접미사를 따라 ARMv7-A 또는 ARMv6-M 같은 이름을 생성합니다.
ARM의 디버깅은 CoreSight 아키텍처에 의해 관리되며, 이는 Arm 디버그 인터페이스(ADI), 임베디드 트레이스 매크로셀(ETM), 고속 시리얼 트레이스 포트(HSSTP), 프로그램 흐름 트레이스를 포함합니다. ADI는 디버깅의 기초를 제공하며, JTAG 인터페이스와 시리얼 와이어 디버그(SWD) 대안을 모두 제공합니다.
Arm 디버그 인터페이스(ADI) 개요
ADI 사양은 호스트 디버거와 하나 이상의 ARM 장치 간의 하드웨어 및 논리적 인터페이스를 정의합니다. 대부분의 현대 프로세서는 ADIv5(Arm IHI0031E)를 지원하며, ADIv6(Arm IHI0074C)가 점진적으로 채택되고 있습니다. 여기서는 ADIv5에 초점을 맞춥니다.
ADI는 디버그 포트(DP)와 하나 이상의 액세스 포트(AP)로 구성된 디버그 액세스 포트(DAP)를 도입합니다. DP는 물리적 연결(JTAG 또는 SWD)을 관리하고 내장 레지스터를 포함하며, AP는 디버그 레지스터, 트레이스 포트, ROM 테이블, 시스템 메모리와 같은 시스템 리소스에 대한 접근을 제공합니다.
ADI는 두 가지 DP 유형을 지원합니다: JTAG-DP와 SWD-DP. AP는 세 가지 종류가 있습니다: MEM-AP(메모리 매핑 접근), JTAG-AP(전체 디버그 유닛 스캔), 벤더별 AP. MEM-AP가 가장 일반적입니다.
JTAG 맥락에서 ADIv5는 명령어 코드(예: EXTEST, SAMPLE, PRELOAD, INTEST, CLAMP, HIGHZ, ABORT, DPACC, APACC, IDCODE, BYPASS)와 데이터 레지스터(ABORT, DPACC, APACC, IDCODE, BYPASS) 세트를 제공합니다. 특히 DPACC와 APACC는 디버거가 DP 및 AP 레지스터에 각각 명령을 발행할 수 있게 합니다.
일반적인 DP 레지스터에는 다음이 포함됩니다:
- CTRL/STAT – DP 상태 제어 및 보고.
- DLCR – 데이터 링크 제어, 링크 모드 설정.
- DLPIDR – 데이터 링크 프로토콜 ID, 프로토콜 버전 표시.
- DPIDR – 디버그 포트 식별.
- EVENTSTAT – 외부 디버거에 이벤트 신호.
- RDBUFF – DP 작업을 위한 읽기 버퍼.
- SELECT – AP 및 레지스터 뱅크 선택.
- TARGETID – 단일 장치만 연결된 경우 타겟 식별.
MEM-AP 레지스터에는 다음이 포함됩니다:
- CSW (0x00) – 제어/상태 워드.
- TAR (0x04) – 전송 주소 레지스터.
- DRW (0x0C) – 데이터 읽기/쓰기 레지스터.
- BD0–BD3 (0x10–0x1C) – 뱅크 데이터 레지스터.
- CFG (0xF4) – 구성.
- BASE (0xF8) – 디베이스 베이스 주소.
- IDR (0xFC) – 식별 레지스터.
그림 1은 ADI 배선과 레지스터 맵을 보여줍니다(간결성을 위해 모든 레지스터는 표시되지 않음).

그림 1. Arm 디버그 인터페이스 다이어그램, 연결 요약. 모든 DP/AP 레지스터가 묘사되지는 않음.
시리얼 와이어 디버그 (SWD)
SWD는 핀 수가 제한된 장치를 위해 설계된 ARM의 2선식 JTAG 대안입니다. 많은 Cortex-M 마이크로컨트롤러가 전체 JTAG 대신 SWD를 사용하여 핀을 절약합니다.
SWD는 JTAG TDI/TDO 쌍을 단일 양방향 SWDIO 핀으로 대체하고, TMS 핀을 제거하며, 클록을 유지합니다(재라벨링된 SWCLK). SWD는 TAP 상태 머신을 생략하므로, 명령이 SWDIO를 통해 직렬로 전송된 다음 같은 핀이 데이터 전송에 사용됩니다.
통신은 패킷 요청, 확인 응답, 데이터 전송의 세 단계로 진행됩니다. 패리티 비트가 전체에서 사용됩니다. 시퀀스는 시작 비트(HIGH), AP/DP 비트, RnW 비트, 주소 비트, 패리티, 정지 비트(LOW), 파크 비트로 시작합니다. 요청 후 타겟은 3비트 ACK로 응답합니다. 쓰기의 경우 호스트가 32비트 데이터(최하위 비트 우선)와 패리티 비트를 전송하고, 읽기의 경우 타겟이 32비트 데이터를 호스트로 다시 구동합니다.
그림 2는 읽기 및 쓰기 작업의 타이밍 다이어그램을 보여줍니다.

그림 2. 시리얼 와이어 디버그 읽기 및 쓰기 작업의 타이밍 다이어그램. 클릭하여 확대.
두 가지 SWD 버전이 존재합니다: SWDv1(포인트-투-포인트)과 SWDv2(단일 호스트, 다중 타겟). 버전 2는 사소한 예외를 제외하고 버전 1과 크게 역호환됩니다.
기타 축소 핀 JTAG 변형
SWD 외에도, IEEE 1149.7 표준은 2선식 JTAG 인터페이스를 정의합니다. 추가 IEEE 1149.x 표준(아날로그 바운더리 스캔용 1149.4, 고급 디지털 네트워크용 1149.6)은 아날로그 바운더리 스캔 및 차동 AC 커플링 라인과 같은 확장 기능을 제공합니다.
업데이트된 표준은 IEEE 표준 협회 웹사이트에서 찾을 수 있습니다.
결론
JTAG의 기원을 추적하고, 물리적 구현을 검토했으며, ARM 코어 프로세서가 ADI와 SWD 프로토콜을 통해 JTAG을 어떻게 적응시키는지 탐구했습니다. 이 지식을 무기로 엔지니어는 하드웨어 제약에 적합한 인터페이스를 선택하며 임베디드 장치를 자신 있게 디버깅하고 프로그래밍할 수 있습니다.