여기서는 TRACE32 를 이용해서 직접 smdk2410 보드의 Flash 에 R/W 하는 방법에 대해서 알아볼 것이다.
현재 나온 대부분의 디버깅 장비들은 타겟보드의 Flash R/W 기능을 가지고 있다. 또한 smdk2410 의 Flash 를 하려면, 할 때마다 점퍼 세팅을 해주어야 하는 불편함이 있지만, TRACE32 를 이용하면 디버깅 중에 손쉽게 Flash R/W 를 할 수 있다.
smdk2410 의 경우, 두개의 NOR Flash 가 장착되어 있다. 하나는 amd 이고 하나는 intel 계열의 flash 이다. amd flash 의 경우, boot flash 용도로 아주 작은 용량을 가지고 있다. intel flash 는 총 48MB(16MB * 3) 가 장착되어 있다. 우리가 여기서 R/W 할 flash 는 intel flash 이다.
smdk2410 은 보드의 특징상, 점퍼 세팅을 통해 2 개의 flash 중에 선택해서 사용할 수 있다. 기존의 방법대로 라면, 먼저 boot flash 인 amd flash 로 부팅하기 위해 점퍼세팅을 했겠지만, 앞에서 설명했듯이 T32 장비를 이용해서 바로 intel flash 에 R/W 할 것이기 때문에 여기서는 점퍼를 'Strata 32bit' 로 세팅한다.
여기서는 두 개의 binary 파일인 u-boot.bin 과 VPOS.bin 을 가지고 R/W 를 해볼 것이다.
준비운동 하기
먼저 작업에 들어가기에 앞서, R/W 할 flash 에 대한 data block 구조를 알아야 한다. 이것은 flash 메모리 데이터시트를 참고해야 한다.
모델명 | 28F128J3 |
Block | 128개 |
Block Size | Word 경우 : 0x10000(0x0 ~ 0xFFFF), Byte 경우 : 0x20000(0x0 ~ 0x1FFFF) |
여기서 주의해야 할 것은 smdk2410 의 intel flash 는 현재 3 개가 붙어있지만, 그 중 1 개 또는 2 개만 사용가능하다. 앞에서 점퍼 세팅을 한 'Strata 32bit' 의 경우가 2 개를 사용하는 것이고, 'Strata16bit' 의 경우는 1 개를 사용하는 것이다.
flash 를 2 개 사용하면, 1 개당 block 이 128 개 이므로 총 256 개의 block 이 있을 것으로 생각하지만, 여기서는 perallel 하게 연결되어 있다.
다시말해, 총 block 의 수는 128 개이지만, 폭이 기존의 16 개에서 32 개로 늘어난 것이다. 그래서 flash 에 access 할 때, 32bit 단위로 access 해야 한다. 또한 T32 에서 각각의 flash 모델마다 고유의 binary 파일을 지원하고 있다. Power View 설치후에 flash.pdf 파일을 참조하여, 자신의 flash 모델에 맞는 binary 파일을 지정해야 한다.
CMM 파일 작성하기
다음과 같이 flash.cmm 파일을 작성할 수 있다.
sys.cpu arm920t ----- 1 sys.u d.s 0x48000000 %l 0x2222D222 ; BWSCON ------ 2 d.s 0x48000004 %l 0x00000700 ; BANKCON0 d.s 0x48000008 %l 0x00007ff0 ; BANKCON1 d.s 0x4800000C %l 0x00000700 ; BANKCON2 d.s 0x48000010 %l 0x00001F4C ; BANKCON3 d.s 0x48000014 %l 0x00000700 ; BANKCON4 d.s 0x48000018 %l 0x00000700 ; BANKCON5 d.s 0x4800001C %l 0x00018005 ; BANKCON6 d.s 0x48000020 %l 0x00018005 ; BANKCON7 d.s 0x48000024 %l 0x008e0459 ; REFRESH d.s 0x48000028 %l 0x00000032 ; BANKSIZE d.s 0x4800002C %l 0x00000030 ; MRSRB6 d.s 0x48000030 %l 0x00000030 ; MRSRB6 flash.res ;flash.create 0x0--0x2000000 0x4000 i28f200j3 long flash.create 1. 0x0--0x1ffff 0x8000 target long ------ 3 ;flash.create 1. 0x10000--0x1ffff 0x4000 target long ;flash.create 1. 0x10000--0x1ffff 0x4000 target long flash.target 0x30000000++0xfff 0x30001000++0xfff C:\T32\demo\arm\FLASH\LONG\i28f200j3.bin ------ 4 flash.unlock 0x0--0x4ffff ------ 5 flash.erase 0x0--0x4ffff ------ 6 flash.program all d.load.b C:\DialogBox_for_flashprogramming\vpos.bin 0x0 /long ------ 7 flash.program off enddo
위의 cmm 파일에 대한 설명은 다음과 같다.
- CPU 타입을 arm920t 로 설정한다.
- SDRAM 을 초기화한다. 초기화해주는 이유는 나중에 설명할 binary 파일을 SDRAM 상에 올리기 위해서 이다.
- flash 에 wirte 할 부분의 block 의 처음과 마지막 주소를 적고, 용량을 적는다. 가장 중요한 부분이다.
- T32 에서 제공하는 flash 모델의 binary 파일을 SDRAM 영역(0x30000000) 에 사이즈만큼 올린다.
- 앞에서 지정해준 부분 만큼, block 을 unlock 한다. intel flash 의 경우에는 write 하기 전에 반드시 unlock 을 해주어야 한다.
- 지정해준 부분 만큼, block 을 erase 한다.
- flash 에 write 할 binary 파일을 지정한다. 여기서는 flash 의 첫번째 주소인 0x0 에 long(32bit) 로 write 한다.
작성한 cmm 파일을 수행해보자!! 에러가 없다면, 제대로 write 했다고 본다.
올바른 Write 확인하기
앞에서 수행도중에 에러가 발생하지 않았지만, 아직 안심하긴 이르다. 좀더 확실한 방법은 기존의 binary 파일과 실제 flash 에 쓰여진 값을 비교해보면 된다.
Power View 에서 'dump *' 명령을 실행한다. 생성되는 창에서 우리가 flash write 하는데 사용한 binary 파일을 선택한다. 그러면, binary 파일의 값이 출력되어 나온다. 역시 'dump 0x0' 를 실행하면, 현재 0x0, 즉 flash 의 첫 부분이 출력되어 나온다. 처음과 마지막 주소값을 찾아서 서로 비교해본다.
일치한다면, flash write 가 성공적으로 수행된 것이다.
해결해야 할 문제들
좀 더 폭 넓은 실험을 해야 겠지만, 같은 cmm 파일을 수행해도 어떨 때는 잘 수행되다가도, 어떨 때는 수행도중 에러메세지를 생성해냈다.
그리고, 앞에서 3번 설정하는 과정에서 0x8000 의 값이 어떤 의미를 가지는 지 아직 확실히 이해되지 못했다.
마지막으로 T32 에서 제공해주는 binary 파일을 굳이 실행하지 않더라도, flash write 하는 데는 문제가 발생하지 않았다.
또한 SDRAM 초기화를 수행하지 않아도, 에러없이 flash write 가 수행되었다.