====== TRACE32 를 이용한 Flash 사용하기 ====== 여기서는 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 가 수행되었다. ---- {{indexmenu>:#1|skipns=/^(wiki|etc|diary|playground)$/ skipfile=/^(todays|about|guestbook)$/ nsort rsort}} ----