이 매뉴얼은 JK전자(JK Electronics) 에 의해서 수정, 작성 되었고 소유권 또한
JK전자(JK Electronics)
의 것입니다. 소유권자의 허가를 받지 않고 무단으로 수정, 삭제하거나 배포 할 수 없습니다.

 

 

ARM JTAG 다운로드 에이젠트(Flash Agent) 개발 가이드


 
* Update history

- 2012.3.26 : 초기 Release


 
1. Introduction
2. Flash Agent & ARMJTAG Script
3. Flash Download Script
4. Algorithm


   
 
1. Introduction

개발자들이 다양한 Flash Memory 에 대해서 다운로드 코드를 개발할 시에 최대한의 편의와 Flexibility 를 제공하고자 노력하였습니다.
이러한 기능은 마이크로컨트롤러 급의 Flash 가 내장된 프로세서는 물론이고 마이크로프로세서 외부에 연결되는 각종 NOR, NAND, OneNAND 등의 Flash 메모리 또한 손쉽게 Read, Write 하여 다운로드 할 수 있게 하는 강력한 기능을 만들어줍니다. 이 기능을 위해서는 ARMJTAG Commander Tool 과 Target 에서 실행되는 Flash Agent 가 필 요합니다. Flash Agent 는 실제 Target 의 RAM 에 Load 되고 실행되어 PC 의 ARMJTAG Commander 와 연동하며 Target 에 이미지를 다운로드하는 프로그램입니다. 이 문서는
Flash Agent (Flash Agent 와 ARMJTAG Commander 의 Flash 다운로드 알고리즘) 를 어떻게 만드는지에 대해서 설명 합니다.

2. Flash Agent & ARMJTAG Script
Flash Agent 는 Target 의 RAM 상에서 실행되면서 Target 의 Flash 를 Erase 하고 Program 하는 기능을 수행하는 프로그램입니다.
ARMJTAG 에서 Flash 를 Program 하기 위해서 이 Flash Agent 를 이용합니다. 각종 프로세서와 메모리에 따른 Flash Agent 는 PASCOMLAB & JK 전자 에서 지원합니다.
더 나아가 개발자들은 각종 Flash Agent 를 수정, 보완, 개발하여 Target 에 더욱 최적화된 기능을 만들 수 있습니다. ARMJTAG Script 는 Commander(JICECommander) 를 통해서 실행되며 ARMJTAG 와 Target 을 제어하게 됩니다.

JICEEditor(일반 텍스트 에디터를 사용해도 됨) 에서 다운로드용 스크립트를 작성해서 JICECommander 에러 Load 하여 실행 시키는 구조 입니다.



ARMJTAG Script 는 아래와 같은 일을 순차적으로 수행하여 Target 의 Flash 에 이미지를 다운로드하게 됩니다.
1th : target stop
2th : Target Enable(각종 register 초기값 설정)
3th : Flash Agent 를 Target 의 RAM 에 다운로드
4th : Flash Agent 의 agentend address 위치에 Breakpoint 설정
(IAR 컴파일러로 만들어진 CORTEX-M 코어 Flash Agent 는 제외되는 과정)
5th : Flash Agent 를 실행하고 이미지를 Flash 에 다운로드

3. Flash Download Script

Flash Agent 를 만들 때 아래와 같은 Script 가 필요합니다.

(실제 Script 예)

target.stop

;initial registers setting
;cp.mmu.off
;mem.write 0xXXXXXXXX %32 0xXXXXXXXX

mem.load "C:\STR911FAW44_Data\DebugRel\JICE_FlashAgent.bin" 0x04000000

;set breakpoint for JICE to chek parameters

bp.set.symbol agentend

;configure agent information :
;agent start addr(0x04000000), prarmeter start add(0x04002000), flash buffer size(0x1000)

flash.agent 0x04000000 0x04002000 0x1000
;erase flash memory
flash.erase

print "Down binary : STR911FAW44 flash start address 0x00000000"
flash.program "C:\examples\STR9_M\user\Debug\Exe\Uart.bin" 0x00000000

명령어만을 보면 아래와 같이 간추려집니다.

target.stop
(initial registers setting)
mem.load “file location-bin file format” <address >
bp.set.symbol agentend
flash.agent <address1> <address2> <address3>
flash.erase
flash.program “file location-bin file format” <address>


Flash Download Script 는 항상 동일하게 위 명령어 포멧을 가집니다. Core 와 Flash 에 따라서 달라지는 것은 Flash Agent 입니다.
(단 CORTEX-M Core 에서는 bp.set.symbol agentend 명령어는 Script 에서 제외 하여야 합니다.)

아래와 같은 컴파일러를 이용하여 Flash Agent 를 지원합니다.

ADS1.2 (CodeWarrior for ARM Developer Suite)
IAR Embedded Workbench
CodeSourcery ARM-NONE-EABI-GCC
Keil uVision4


3.1 target.stop
위 명령어는 Core 를 Stop 시키기 위해서 사용됩니다.
Commander 를 실행하게되면 기본적으로 Core 를 Stop 시키게 되므로 위 명령어는 생략 가능합니다.

3.2 initial register setting
Target 을 enable 하기 위해서 필요한 register 를 설정합니다. Clock, 전원, Memory interface 등 관련한 register 값 들을 찾아서 설정해야 합니다.

예 :
cp.mmu.off ; for virtual address disable.
mem.write 0xXXXXXXXX %32 0xXXXXXXXX


위에서 cp.mmu.off 는 MMU 를 가진 Core (예 : ARM926EJ-S, ARM1176JZF-S, CORTEX-A8 등) 에서 MMU 가 Enable 되어 있을 시에 마이크로프로세서의 HW Register
Address 에 접근할 때 Physical Address 로 접근하기 위해서 필요한 명령입니다.

3.3 mem.load “file location-bin file format” <address >
위 명령어는 Flash Agent 를 RAM 에 다운로드 하기위해서 사용됩니다. 이어지는 “ “ 위치에는 Flash Agent Binary 위치를, 이어지는 HEX 포멧 숫자는 Binary 가 Load 될 RAM 시작 번지를 의미합니다.

예 :
mem.load "C:\STR911FAW44_Data\DebugRel\STR9_FlashAgent.bin" 0x04000000

3.4 bp.set.symbol agentend
Flash Agent 를 개발할 때 아래와 같이 코드의 마지막 실행 지점에 아래와 같은 symbol 을 표시해줌으로써 JTAG 장비가 Break Point 를 설정하고 Core 를 Stop 시켜서 Flash Agent 가 모두 실행되었음을 알고 Parameter 등을 다시 설정하여 다음 일을 진행할 수 있도록 하기위해서 사용됩니다.

예 :
Script 상에서는 아래와 같이 사용합니다.
bp.set.symbol agentend

Flash Agent 소스에는 아래와 같이 구현되어 있어야 합니다. (컴파일러에 따라 문법에 차이가 있으니 주의가 필요합니다.)
agentend DCD 0xEEDEEEDE (ARM ADS 컴파일러에서 사용 시)
agentend: DCD 0xEEDEEEDE (IAR EWARM 컴파일러에서 사용 시)

● ARM ADS 컴파일러 사용 시 :

armjtag

● IAR EWARM 컴파일러 사용 시 :

armjtag

참고
CORTEX-M 코어 는 Flash Agent Assembly 코드에 이 코드를 집어넣지 않습니다.
Cortex-M 코어는 별도로 Assembly 작성이 필요 없으므로 이 명령어를 사용할 필요가 없습니다.
또한 다운로드 Script 파일에도 bp.set,symbol agentend 명령을 집어넣지 않습니다.

참고
bp.set.symbol agentend 명령을 사용하지 않게 되면 Flash Agent 다운로드, 실행 후 ARMJTAG는 무한 루프 코드 실행을 하게 되어서
1) Commander 에서 STOP 버튼을 통해서 강제로 Stop 시키거나

armjtag

2) Commander 를 종료 시키지 않는 한
계속 JTAG장비는 는 계속 RUN 상태에 있게 되며 Flash 다운로드 기능을 수행할 수 없게 됩니다.

3.5 flash.agent <address1> <address2> <address3>

Flash Agent 정보를 JICECommander 에 알려주기 위해서 사용됩니다. 뒤에 3개의 HEX 포멧 숫자가 이어집니다.
첫 번째 parameter <address1> 는 Load 된 Flash Agent 의 RAM 의 start address 입니다. 앞의 mem.load 에서 사용한 address 와 동일한 값을 사용하면 됩니다.
두 번째 parameter <address2> 는 Flash Agent parameter 영역의 시작 address 입니다.
세 번째 parameter <address3> 는 Flash buffer size 입니다. 보통은 0x1000 을 사용하면 됩니다.

3.5.1 Flash Agent Parameter

flash.agent 명령어를 완전히 이해하려면 Flash Agent Parameter 에 대한 설명이 필요합니다.


armjtag

flash.agent 명령에서 두 번째에 붙는 수, 즉 Flash Agent parameter 영역의 시작 address가 위 parameter 들이 위치하는 시작 address 가 됩니다.
즉,
flash.agent 0xXXXXXXXX 0x04002000 0x1000

이라면 Target 의 RAM 상에 아래와 같이 Parameter 값들과 Binary Data 가 위치 한다는것 을 의미합니다.

armjtag

3.6 CORTEX-M Stack & Program Counter Setting

만약 현재 Target 의 Core 가 CORTEX-M 이라면

mem.load
flash.agent


명령 이후 Stack pointer 와 Program counter 를 설정해주어야 합니다. 아래와 같은 명령어를 이용합니다.

mem.read <address1> %32
reg.r13.write.before
mem.read <address1+4> %32
reg.pc.write.before


이때 위에서 address1 에는 flash.agent 의 첫 번째 parameter 와 동일한 값을 사용하면 됩니다.
즉 현재 flash.agent 0x04000000 0x04002000 0x1000 와 같이 사용되고 있다면 아래와 같은 명령이 필요합니다.

mem.read 0x04000000 %32
reg.r13.write.before


mem.read 0x04000004 %32
reg.pc.write.before


3.7 flash.erase

Flash.erase 는 flash agent 상에 구현하지 않고 간단한 Script 만으로도 구현가능한 Microcontroller 들이 많이 있습니다.
실제로 어떤 면에서는 이렇게 Script 만으로 erase 하는 것이 제일 만들기 편리할 경우가 많습니다.
또는 flash.erase 명령 없이 flash.program 명령 안에 erase 기능을 넣어서 수행하는 방법도 있습니다. 결국 운용하기에 편리한 방법을 사용하면 됩니다.

참고
1. script 만으로 flash erase 하는 방법의 예는 다음에 있습니다.
디버깅 Example --- ST STR91X
디버깅 Example --- TI LM3S608
디버깅 Example --- SAMSUNG S3C6410

2. flash.erase 명령 없이 flash.program 명령에 flash erase 기능을 동시에 구현한 예가 다음에 있습니다.
디버깅 Example --- ATMEL AT91SAM7S

3. flash.erase 명령을 사용한 예가 다음에 있습니다.
디버깅 Example --- SAMSUNG S3C2413
디버깅 Example --- ST STM32F103

3.8 flash.program “file location-bin file format” <address>

위 명령어는 실제 binary 를 Flash 에 다운로드 하기위해서 사용됩니다. 이어지는 “ “ 위치에는 다운로드 하고자 하는 Binary 위치를, 이어지는 HEX 포멧 숫자는 Binary 가 올라갈 Flash 시작 번지를 의미합니다.

예 :
flash.program "C:\examples\STR9_M\user\Debug\Exe\Uart.bin" 0x00000000

4. Algorithm

아래는 JICE 를 통해서 Target 의 Flash 에 다운로드 시 수행되는 과정을 나타낸 그림 입니다.

armjtag

[Notice 1]
Flash Agent 위치. Flash Agent 는 Binary Buffer 에 위치한 Binary 를 Flash Memory 에 Erase, Write 해주는 역할을 함

[Notice 2]
ARMJTAG 와 Flash Agent 간의 정보교환을 위한 Parameter (32Bytes 사이즈) 위치
(참고 : 3.5.1 Flash Agent Parameter)

[Notice 3]
Flash 에 Program 하려는 Binary 의 Buffer 위치
최종적으로 Target 의 Flash Memory 에 binary 이미지를 다운로드 하는 주체는 Target 의RAM 에서 실행되는 Flash Agent 입니다. Flash Agent 와 JICECommander 가 상호 동작하기 위해서 스크립트가 필요한 것 입니다.

1) target.stop, mem.load : 이 명령까지 실행하면 Target 의 RAM 에 Flash Agent 가 Download 되어집니다.
2) bp.set.symbol agentend : 이 명령으로 ARMJTAG 는 Flash Agent의 agentend symbol 위치에 Breakpoint 를 설정합니다.
3) flash.agent : 이 명령으로 ARMJTAG 는 Parameter 의 위치, Binary Buffer size 등을 알게 됩니다.
4) flash.erase : 이 명령으로 ARMJTAG 는 Flash 를 erase 하게 됩니다.
5) flash.program 명령을 위 그림을 참고하여 설명합니다.

일단 JICECommander 는 flash.agent 에서 정해진 Flash buffer size 만큼씩 binary 를 나눕니다. 이것이 Block 0, 1,…, Block N 으로 표시되어있습니다.
이 size 는 0x1000 이 보통이며 명령어에서는 아래 부분에 적용됩니다.
예 : flash.agent 0x00200000 0x00202000 0x1000

이후 ARMJTAG 는 이 Bolck 크기 만큼 Target RAM 의 Binary Buffer 에 Load 합니다. 다음 단계로 Flash Agent 를 실행하고 Parameter 설정 값을 참고하여
Flash Memory 에 Download 하게 됩니다. 이 과정은 Block N 횟수만큼 반복됩니다.