본문 바로가기
myCortex

Stellaris chip의 JTAG lock-up

by irmus 2008. 10. 16.
Luminary Micro에서도 강조하고 있고, 칩셋 data sheet에도 몇번에 걸쳐 나오는 내용이기는 하지만, 한번 더 강조해도 빠질것 아닌 내용이기에 한번 정리해보도록 하자.

Stellaris 칩에 있는 다섯개의 JTAG 관련 신호와 multiplexing 되어있는 GPIO를 사용할 때나 clock 설정을 변경할 때에는 주의해야 한다.

다섯개의 JTAG 신호는 TRST, TCK, TMS, TDI, TDO를 말하며, PC0~PC3, PB7 핀을 사용하고 있다. 이들 핀을 사용할 때에는 lock-up에 빠졌을 때 복구할 수 있는 안전장치 혹은 리셋 시점으로부터 시간 딜레이를 필요로 한다. 전원 리셋이후 Cortex-M3 코어는 플래쉬 메모리에 저장된 프로그램을 읽어 실행한다. 그와 동시에 JTAG 관련 초기화 작업이 일어난다. 만일 플래쉬 메모리에 저장된 프로그램의 처음 앞부분에서 이들 다섯 핀의 설정을 바꾸는 작업을 하게 된다면 JTAG이 초기화 되지 못하는 상황에 빠지게 된다. 이를 JTAG lock-up이라 부르고 있다.
특히 PB7은 온전한 8비트 버스 형태로 디자인 하기 위해 사용하는 경우가 종종 있는것 같다.

간단하게 생각하면 하나의 핀을 JTAG목적으로도 쓰고 사용자가 쓰고싶은 다른 목적으로도 쓸려고 할 때 쫑나는 상황에서 사용자가 프로그래밍 해 놓은 코드 때문에 JTAG 초기화가 안되는 문제이다. 궁극적인 내장 플래쉬 메모리 퓨징 수단인 JTAG이 사용불가능하게 되므로 더이상 프로그램을 퓨징할 수 없는, 즉 프로세서 칩을 버려야 하는 상황이 되어 버린다.

이를 방지하기 위해서는 PC0~PC3이나 PB7을 가급적 사용하지 않는 것이 가장 안전하다. 물론 이 경우에도 Port B와 Port C의 레지스터들을 직접 write하다가 잘못해서 해당 핀의 direction 같은 설정값들을 건드려버리면 문제는 똑같이 발생한다. 그러니 이 문제를 피하고 싶다면 해당 핀을 사용하지 말것레지스터에 직접 접근하는 대신 DriverLib 함수들을 사용하는 것이 같이 이루어 져야 한다.

하지만 한두개도 아니고 무려 다섯개나 되는 IO를 포기하는 것은 문제가 있다. IO가 모자란 경우와 같이 해당 핀들을 꼭 사용해야 하는 경우라면 다음 내용들을 지키도록 하자.
  1. H/W적으로 pull-down 시키지 않는다. JTAG이동작하기 위해서는 해당 핀들이 pull-up 되어 있어야 할 필요가 있다. 실제로 myCortex 보드들에는 내장 pull-up resistor 외에도 외부에 별도의 저항을 달아둬서 안정성을 좀 더 높이고 있다. 만일 직접 PCB를 떠서 사용하는 경우에는 외부 풀다운 저항이 없어야 할 것이다.
  2. 리셋 후 JTAG이 초기화 될 때 까지는 해당 핀들의 설정을 건드리지 않는다. 리셋 후 약간의 딜레이가 있고 그동안 JTAG이 정상적으로 초기화 된다면 그 후에는 JTAG이 우선권을 잡으면서 플래쉬에 퓨징된 프로그램(다섯 핀들을 다른 용도로 사용하기 위해 설정을 바꾸는 코드가 들어있는)이 실행되는 것을 멈출 수 있다. 하지만 시간이 얼마나 필요한지는 미지수. 
  3. 혹시 모를 lock-up 상황에 대비해 탈출 코드를 넣어둔다. 예를 들어 마치 부트로더에서 그러는 것 처럼 부팅 시 어떤 핀의 상태를 확인해서 일반 동작모드로 갈 것인지, JTAG 대기 모드로 갈 것인지 선택하는 것 같은 탈출 코드가 있으면 안심할 수 있다.


JTAG lock-up으로 흐르는 또다른 흔한 실수 한가지는 클럭 셋팅을 엉뚱하게 하는 것이다. SysCtlClockSet() 함수는 아무 인자나 넣어서 막 호출해서는 안된다. 정해진 조합이 있고 이 조합을 벗어났을 때 lock-up에 빠질 수 있다. JTAG 관련 IO핀들과 비슷한 이유다. JTAG이 붙기도 전에 clock이 엉뚱하게 폭주해버리면 JTAG이 붙을 수 없는 것이다. 아무 값이나 찔러보기 전에 데이터시트를 꼭 읽어볼 것을 추천.





만약 자신의 보드가 이미 lock-up 되었다면 어떻게 해야 하는가?
  • Fury class라면 LM Flash Programmer의 unlock utility를 이용해서 lock-up을 풀 수 있다.
  • Sandstorm class라면 revision C인 경우에 한해서 같은 방법으로 풀 수 있다.
간단하게 테스트해 본 결과 myCortex-LM8962는 unlock 시킬 수 있는 반면 myCortex-LMx08들은 unlock이 불가능했다. 즉 더이상 사용할 수 없다. 초기 모델이다 보니 칩 제조사에서도 생각지 못했던 부분인듯...
자세한 unlock 방법은 myCortex FAQ 참조.