<< 이솝보드로 AXD 와 H-JTAG 으로 펌웨어 프로그래밍 하기 >>
07.05.23 ~ 24 이재명 (이솝 아이디 : kerneld)
0. 이 문서의 목적 및 알림
고가의 JTAG 디버거 없이 훌륭한 디버깅 환경을 구축하고
실제로 펌웨어를 이솝보드에 올려 테스트 해볼수 있도록 합니다.
또한 윤광윤님의 도움으로 위글러 호환 JTAG 없이 이솝보드와 함께 들어있는
Byte Blaster MV 로도 가능하게 되었고 안정적으로 플래시에 다운로드가 가능하게 되었습니다.
윤광윤님께 감사의 말씀 드립니다. ^-^
1. 준비물
- S3C2440 용 모니터 프로그램 소스
http://manager3.dothost.co.kr/bbs/zboard.php?id=OHM_Co_Data&page=1
&sn1=&divpage=1&sn=off&ss=on&sc=off&select_arrange=headnum&desc=asc&no=328
위 링크에서 소스를 받으면 Mon2440 디렉토리가 있는데 그것이 S3C2440 용 모니터프로그램으로
삼성전자에서 제작한 것입니다.
아무 수정없이 이솝보드에 올려보니 잘 돌아가서 이걸 기준으로 펌웨어 접근을 하면 쉬울듯 하네요.
펌웨어 공부하기에 딱 좋은 소스인것 같습니다.
- ADS 1.2 (ARM Develop Suite v1.2)
AXD (디버거) 또한 설치 됩니다.
- H-JTAG 0.4.4 또는 그 상위 버전
http://www.hjtag.com
위 홈피에서 최신 버전을 받습니다.
MULTI-ICE, TRACE32, OPENice 등과 같은 고가의 JTAG 디버거가 하는 일을 소프트웨어로 가능하게
하는 프로그램이라고 생각하시면 됩니다.
- Byte Blaster MV
이솝 3차 보드와 함께 들어있는 JTAG 동글 입니다.
- 터미널 프로그램
윈도우즈에 기본 설치되는 하이퍼터미널도 무관하지만 SecureCRT 프로그램을 강추합니다.
2. 준비물들들 모두 설치하고 연결 합니다.
3. AXD 로 실제 디버깅을 해보자
3.1. 모니터 프로그램 컴파일
CodeWarrior for ARM Developer Suite (ADS 1.2 에 포함되어 있슴) 를 실행 시키고
모니터 프로그램의 프로젝트 파일(Mon2440.mcp) 을 오픈 합니다.
Edit -> DebugRel Settings -> Linker -> ARM Linker 를 선택하면
우측에 RO Base 가 0x0, RW Base 가 0x33ff0000 로 되어 있습니다.
이 설정은 컴파일된 바이너리 이미지를 플래시에 구울때 설정이고
우리는 AXD 로 이미지를 SDRAM 에 올려서 테스트를 할 것이므로 RO Base 를
SDRAM 시작 번지인 0x30000000 으로 변경 합니다.
OK 눌르시고
Project -> Make 를 하여 새로운 이미지를 생성 합니다.
(당연한 이야기겠지만 플래시에 구우신다면 RO Base 를 0x0 로 바꿔주셔야 합니다.
RW Base 는 놔두시구요.)
현재 타겟이 DebugRel 으로 되어 있기 때문에
모니터 프로그램 소스 디렉토리Mon2440_DataDebugRel 디렉토리에 컴파일된 이미지들이
생성 됩니다.
Mon2440.axf 과 uMon2440.bin 이 생성 되는데
axf 는 AXD 에서 사용 할 수 있는 디버깅 정보가 포함된 이미지 파일이고
bin 은 디버깅 정보가 빠진 이미지 파일 입니다.
여기까지 이미지를 만들었으니 AXD 를 사용하기 위해 H-JTAG 을 실행합니다.
3.2. H-JTAG 설정
Settings -> JTAG Settings 를 선택하시고 Byte Blaster MV 를 사용하기 위해서
아래와 같이 설정 합니다.
(위글러 호환 JTAG 동글 있으신 분은 Wiggler 만 선택하시고 OK 누릅니다.)
Jtag Selection : User Defined
nTRST output inverted : 체크 해제
TMS : Pin3 D1
TCK : Pin2 D0
TDI : Pin8 D6
TDO : Pin11 Busy
nTRST : Pin4 D2
nSRST : NO SYS RST
설정 하시고 OK 누른 다음에..
위쪽 툴바에서 돋보기를 눌렀을 때 ARM920T 가 제대로 나오는지 확인 하시고
(혹시 안되시는 분들은 sjf2440 툴로 이솝 u-boot 이미지를 구우신 후 해보시기 바랍니다.)
(저도 처음엔 안되었는데 이상하게 sjf2440 으로 이미지 구운 후로는 잘되네요.)
(당연히 giveio.sys 는 설치되어 있어야 합니다. giveio.sys 설치 방법은)
(이솝 홈페이지 -> Download -> 2. JTAG flash write software with documentation )
(다운 받아 압축을 풀면 giveio.sys 설치 문서 PDF 파일이 있습니다. 이것을 참고 하시면 됩니다.)
Script -> Auto Init 을 반드시 체그 해줍니다!!
(이것 체크 안하시면 AXD 제대로 안되고 H-Flash 도 안됩니다.)
이제 Init Script 를 설정 해야되는데요
아래 내용을 [원하시는 파일이름.his] 로 만들어 줍니다. 물론 앞에 탭 문자는 제거 하셔야 합니다.
DisMMU+++
Delay+++10
Setmem+32-Bit+0x48000000+0x2045550
Setmem+32-Bit+0x48000004+0x700
Setmem+32-Bit+0x48000008+0x700
Setmem+32-Bit+0x4800000C+0x700
Setmem+32-Bit+0x48000010+0x700
Setmem+32-Bit+0x48000014+0x700
Setmem+32-Bit+0x48000018+0x700
Setmem+32-Bit+0x4800001C+0x18005
Setmem+32-Bit+0x48000020+0x700
Setmem+32-Bit+0x48000024+0x8D0459
Setmem+32-Bit+0x48000028+0x32
Setmem+32-Bit+0x4800002C+0x30
Setmem+32-Bit+0x48000030+0x30
그리고 이것을 Script -> Init Script -> Load 에서 선택하시면 됩니다.
위 내용은 메모리 컨트롤 레지스터들의 값을 초기화 해주는 것입니다.
Setmem 은 AXD 에서 사용하는 명령어인데 DisMMU, Delay 는 잘 모르겠네요.
BWSCON, BANKCON0 ~ MRSRB7 까지 값을 설정 합니다.
자세한 내용은 S3C2440A 데이터시트(이솝 홈페이지에서 다운로드 가능)를 참고하세요.
마지막으로 OK 누르시면 H-JTAG 에서 할 일은 끝났습니다.
3.3. 터미널 프로그램 실행
AXD 실행에 앞서 실행 결과를 보기 위하여 터미널 프로그램을 아래와 같은 설정으로
실행 합니다.
Port : 이솝과 연결되어 있는 COM 포트 번호
Baud rate : 115200
Data bits : 8
Parity : None
Stop bits : 1
3.4. AXD 설정 및 실제 디버깅
AXD 를 실행하고
Options -> Configure Target.. 을 선택 합니다.
우측에 ADD 버튼을 클릭 하고 H-JTAG 이 설치된 디렉토리로 이동 합니다.
(기본은 C:Program FilesH-JTAG)
여기에 H-JTAG.dll 를 선택하시고 열기 버튼을 누릅니다.
OK 를 누르시면 이제 모든 준비는 끝났습니다!
실제 컴파일된 이미지를 올릴 차례입니다.
axf 파일을 이솝 메모리에 올릴수 있는데 방법은 아래와 같습니다.
File -> Load Image...
모니터 프로그램의 컴파일된 이미지(Mon2440.axf) 를 선택 합니다.
(참고로 AXD 에서 AXF 뿐만 아니라 ELF 파일도 디버깅 할수 있습니다.)
로딩에 성공 했으면 스타트업 코드(어셈블리어로 된) 가 보일 것이고
화면 위 툴바중 플레이 버튼 처럼 생긴 버튼이 있습니다. 이 버튼을 누르시거나
Execute -> Go
를 선택 하셔도 됩니다.
Go 를 한번 눌렀을 때 아래 소스에서 멈추는데
void Main(void)
{
한번 더 누르면 터미널에 글자들이 뜨면서 실행이 됩니다.
Go 버튼을 기준으로 버튼이 아래와 같이 배열 되어 있습니다.
Go Stop Step In Step Step Out Run to Cursor
Go 버튼은 그냥 주욱 실행하는 것이고
Step 으로 시작하는 것들은 한줄한줄 실행 한다거나 한 블록을 실행 하는 등의 기능을 가지고
Run to Cursor 는 커서 위치까지 실행하고 멈춥니다.
이제 상태 값들을 살펴 봐야 할텐데요.
Processor Views -> Registers 를 선택하면 현재 상태의 레지스터 값을 확인할 수 있습니다.
메모리 값도 확인해 보시고 브래이크포인트도 걸어보시기 바랍니다.
코드 한줄한줄 실행하면서 레지스터 값을 확인하는 즐거움을 여러분들도 느껴 보셨으면 좋겠네요.
사용해보시면 감이 오실겁니다.
4. 테스트 완료한 이미지를 NOR 플래시에 굽기
H-JTAG 을 설치하시면 H-Flasher 라는 프로그램이 같이 설치되는데
SJF2440 프로그램과 같이 이미지를 플래시에 구울수 있는 프로그램 입니다.
일단 모니터프로그램 프로젝트 파일(Mon2440.mcp)을 여시고
RO Base 를 0x0 로 바꾸고 컴파일을 다시 합니다.
0x0 는 NOR 플래시의 시작 위치이고 이솝 보드가 켜지자 마자
올린 이미지를 실행 하기 위해서 0x0 로 RO Base 를 지정해 줍니다.
일단 아래 내용을 [원하시는 파일이름.hfc] 로 만듭니다. 당연히 탭 문자는 제거하시구요.
FLASH SECTION:
AMD
AM29LV160DB
MEMORY SECTION:
16
0x0
0x30000000
SCRIPT SECTION:
DisMMU+++
Delay+++10
Setmem+32-Bit+0x48000000+0x2045550
Setmem+32-Bit+0x48000004+0x700
Setmem+32-Bit+0x48000008+0x700
Setmem+32-Bit+0x4800000C+0x700
Setmem+32-Bit+0x48000010+0x700
Setmem+32-Bit+0x48000014+0x700
Setmem+32-Bit+0x48000018+0x700
Setmem+32-Bit+0x4800001C+0x18005
Setmem+32-Bit+0x48000020+0x700
Setmem+32-Bit+0x48000024+0x8D0459
Setmem+32-Bit+0x48000028+0x32
Setmem+32-Bit+0x4800002C+0x30
Setmem+32-Bit+0x48000030+0x30
위 설정은 NOR 플래시 메모리 선택, 메모리 시작 번지, 초기화 스크립트 등등을
설정 하는 겁니다.
이제 H-JTAG 을 띄운 상태에서 H-Flasher 를 실행 시킵니다.
화면 위에 Load 버튼을 누르고 위에서 저장한 hfc 파일을 선택합니다.
그러면
Flash Selection, Memory Config, Init Script 의 설정이 모두 되어 있음을
확인하실 수 있습니다.
특히 Init Script 를 위와 같이 설정하니 예전에는 구울때 에러가 너무 많이 발생했는데
빠르고 에러없이 잘 되었습니다.
이제 Programming 을 선택하여 이미지를 굽는 일만 남았습니다.
Check 버튼을 눌렀을 때 제대로 선택한 것이 나오는지 확인하시고
(만약에 무슨 드라이버를 다운로드 못받겠다는 에러 나오시면
H-JTAG 에서 Auto Init 체크를 해주시면 됩니다.)
Type 을 Plain Binary Format 을 선택하고
Src File 에서 ... 버튼을 눌러서 모니터프로그램 bin 이미지 (uMon2440.bin) 를
선택 합니다.
Dst Addr 에는 0x0 를 입력해서 NOR 플래시에 구워질수 있도록 하구요.
마지막으로 Program 버튼을 누르면 0x0 번지에 구워집니다~
NOR 플래시에 잘 구워졌다면 이솝보드의 전원을 껏다 켜봅니다.
터미널 프로그램에서 메시지가 잘 나오는지 확인해봅니다.
U-Boot 이미지도 잘 올라갑니다.
5. 마무리
위 정보를 알기까지 도움을 주신 고현철님, 윤덕배님께 감사 드리며
저와 같은 삽질을 하지 마시라고 글을 남깁니다.
그리고 Init Script 및 JTAG 동글 핀 설정은 윤광윤님께서 도와주셨습니다.
너무 감사드립니다~ 덕분에 정말 쓸만하게 되었습니다. ^-^
이쪽 자료가 aesop에도 올라오다니, aesop의 기쁨입니다....
저야 전혀 한일은 없고, 주로 덕배님 자료를 많이 참조하셨고,
본인의 노력이 절대적인걸로 보여집니다.
정말 수고하셨고, 자료 감사합니다....