[프로세서]

JTAG란?

Neo Park 2017. 3. 28. 16:52

JTAG란?


임베디드 제품을 만들기 위해서는 먼저 엠시유에 시리얼포트, 엘시디, 플래시 메모리, 카메라, 각종 센서를 연결시켜 하드웨어 조립을 하지요. 그런데 그 부품들이 조립만 됐다고 해서 잘 동작한다는 보장이 있을까요? 조립이 잘 됐는지 확인하기 위해서는 각각 장치의 핀에 신호가 잘 들어가는지 확인을 해 봐야겠죠? 그런데 최근에 나오는 하드웨어 장치들이 워낙 작게 만들어 지다보니 신호를 찍어 볼 핀들이 외부로 나와 있지 않고 안으로 숨여 있어요. 안으로 숨어 있으면 신호를 찍어 볼 수가 없게 되는데 하드웨어 개발자 입장에서는 매우 난처하게 된 상황이다 보니 새로운 연구가 필요하게 됐답니다. 언제부터 인지는 모르겠지만 새로운 연구그룹이 만들어졌고 결국 제이텍이라는 표준이 만들어지게 됐답니다. 그래서 제이텍 포트만 있으면 핀들이 외부로 나와 있지 않아도 확인이 가능해졌답니다.
 


 
다음으로는 사용용도에 대해 알아볼게요.

첫 번째, 디버깅용으로 사용 되요.
임베디드 시스템에서 디버거는 소프트웨어 디버거와 하드웨어 디버거로 나누어지는데, 소프트웨어 디버거는 주로 시리얼 포트로 메시지 출력해서 디버깅을 하지요. 반면 하드웨어 디버거는 제이텍이라는 포트를 통해서 디버깅을 한답니다. 두 가지의 차이점 설명 드리면, 소프트웨어 디버거는 터미널 프로그램을 통해 메시지를 출력시켜 디버깅을 하며, 하드웨어 디버거는 시피유를 브레이크(Break) 하거나 러닝(Running) 하면서 개발자가 직접 시피유를 조절하면서 디버깅을 할 수가 있기 때문에 개발자가 만든 씨 소스 레벨 디버깅이 가능합니다. 장단점을 따져본다면 먼저 소프트웨어 디버거 장점은 디버깅하기 위한 별도의 비용이 들지 않아요. 단점은 메시지를 출력하기 위해서는 소스상에서 print함수를 추가해야 하고 매번 컴파일을 해야 한다는 점과 그때마다 플래시 메모리에 다운로더를 해 줘야 하지요. 가끔 한번씩은 printf 함수를 포함하면 오히려 프로그램이 오동작을 할 경우도 있어요. 하드웨어 디버거 장점은 개발 편리성 및 개발 기간 단축을 해 주고 투자 대비 효과는 확실히 보장된답니다. 단점은 디버깅을 하기 위해서 비용이 들어가고 하드웨어 디버거 툴 사용법을 익혀야 해요. 하드웨어 디버거로 디버깅을 한다면 제이텍 포트 외에 Vref, GND,  nSRST 3개의 핀이 더 필요하고 어떤 코어냐에 따라 추가가 되기도 합니다. 제이텍 포트 5핀+3핀만 연결해서 일반적으로 14핀 또는 20으로 디버거 포트를 구성한답니다. 아래의 그림은 암 코어 기반으로 만든 제이텍 포트를 구성한 내용입니다.


 


두 번째, 플래시 다운로더용으로 사용되요.
개발자가 씨언어로 프로그램을 한 후 컴파일하고 나면 통합바이너리가 만들어지는데, 이 통합바이러리를 플래시 메모리에 다운로드하기 위해서 제이텍 포트를 많이 사용해요.
임베디드 시스템에서 가장 많이 사용되는 플래시 메모리로는 노어 플래시와 낸드 플래시 메모리인데 하드웨어 디버거 툴을 이용한다면 제이텍 포트를 통해 플래시 메모리로 통합 바이너리를 쉽게 다운로드 해 준답니다.
 
하드웨어 구성을 살펴보면서 원리를 알아보아요.


제이텍 포트는 5개 핀들로 구성 되어 있답니다. TDI는 인풋 신호를 담당하며, TDO는 아웃풋 신호, TMS는 모드 선택, TCK는 클럭, TRST는 제이텍 리셋을 해 준답니다. 이러한 핀들의 신호 조합에 의해서 개발자는 소스레벨 디버깅을 하거나 플래시 메모리에 다운로드를 하게 되지요. 인스트럭션 레지스터(Instruction Register)는 몇 비트냐에 따라서 제이텍 명령어 종류가 있다고 보시면 됩니다. 아이덴티피케이션(Identification)은 32비트로 구성되어 있고 디바이스의 정보를 얻을 수 있지요. 바이패스(Bypass)는 TDI와 TDO를 바로 연결시키고 코어가 두 개이상일 때 유용하게 사용한답니다. 바운더리 스캔 레지스터(Boundary Scan Register)는 인풋/아웃핀 검사를 한답니다.

제이텍 포트를 통해 여러 가지를 할 수 있는데 우선 제이텍 명령어들을 잘 알고 있어야 해요. 보통 하드웨어 디버거 툴이 제이텍 명령어를 대신 보내 줘서 제이텍 포트를 통해 타겟을 동작시켜 주기 때문에 개발자는 하드웨어 디버거 툴 사용법만 배우면 된답니다. 만약 하나의 엠시유에 총 300개의 핀들이 있다면 그 중에서 5+3개는 제이텍이고, 지피아오는 100개, 카메라 컨트롤러는 20개 기타 등등…  제이텍 핀들을 제외한 나머지 핀 모두에게 1비트의 값을 저장하는 바운더리 스캔 레지스터를 달아놓고 엠시유를 만들어요. 보통 때는 바운더리 레지스터의 값을 제이텍이 읽어오지는 않지만 제이텍 포트를 통해 제이텍 명령어가 들어가게 되면 레지스터의 값 모두를 읽어오게 된답니다. 하지만 레지스터의 값을 읽어오기 위해서는 해당 코어가 멈춰진 상태에서만 가능하기 때문에 반드시 코어가 멈춰진 상태로 만들어야 해요. 물론 하드웨어 디버기 툴이 다 알아서 해 주니깐 개발자들은 크게 고려하지 않아도 된답니다. 하드웨어 디버깅 툴은 시피유를 제어할 수가 있기 때문에 플래시 메모리에 직접 다운로더를 하거나 지피아오핀에 하이(High) 로우(Low) 제어해서 엘시디나 키패드를 동작시킬 수가 있답니다.