· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
SKKU2006

«  April 2025  »
 12345
6789101112
13141516171819
20212223242526
27282930 

1. u-boot porting to PXA270

1.1. 이 문서의 목적

이 문서는 김기오님의 U-boot 1.1.2 Porting Guide to PXA270을 참고하여 실제로 pxa270 보드에 u-boot를 포팅 작업을 하는 과정을 메모한 것입니다. 현재 진행중입니다.

1.2. START

  • u-boot-1.1.4의 lubbock board를 수정하여 pxa270 설정파일들을 생성.
  • boot.bin 파일 생성 성공
  • 그러나 lubbock는 pxa250을 사용하므로 내가 사용할 pxa270 SKKU보드와는 차이가 있다.
    • 메모리 맵 설정, 메모리 컨트롤러 설정, 네트워크 디바이스 설정 수정
    • 프로세서 속도가 빨라졌고 메모리 클럭도 빨라졌으므로 클럭관련 코드 수정

1.3. 2006.03.03

  • 코드를 수정하기에 앞서 하드웨어에 관한 이해가 기본되어야 함.
    • 참조 : PXA27x Processor Family Developer's Manual
    • SDRAM : K4S561632C_TL75(64MByte = 32MByte X 2)
      시작주소0xa400 0000
      크기 64MByte
      • 속도설정 : PXA270은 최대 104MHz의 메모리 클럭을 지원
      • 프로세서는 520MHz의 터보모드가 되어야 하고 시스템버스는 208MHz
      • 메모리 컨트롤러에 입력되는 클럭이 208MHz가 되어야 SDRAM클럭이 104MHz
    • 플래시 메모리
    • 프로세서의 속도
  • 설명을 봐도 무슨 소리인지 잘 모르겠지만 일단 코드수정하면서 이해하도록 한다.

1.3.1. include/configs/skku.h

  • 이 파일을 이해하기 위해 브트로더 소스에 있는 README를 읽어본다.
  • 의문점
    • 왜 커널이 로드될 주소가 0xa4008000 ~ 0xa4080000인가?
      • SDRAM의 시작주소는 0xa4000000인데 ARM계열 프로세서에서는 반드시 SDRAM의 시작 물리주소 + 0x8000으로 해야한다.
  • 수정완료

1.3.2. 초기화 코드 수정하기

  • board/skku/memsetup.S : 메모리 컨트롤러 설정.
    • SDRAM속도, 리프레시 주기, 플래시 메모리 동작 설정
  • board/skku/skku.c : 특정 보드에 맞는 하드웨어 설정
    • 커널에 넘기기 위한 부팅 파라미터의 주소 설정
    • SDRAM의 시작 주소와 크기를 설정(ARM용 리눅스커널에서는 SDRAM시작주소 + 0x100번지에)
  • board/skku/flash.c : 보드에서 사용하는 플래시 메모리의 동작에 관련된 함수들
    • u-boot에서는 flash_init, flash_erase, flash_print_info, write_buff를 공통으로 작성
    • common/flash.c & common/cmd_flash.c에서 함수 사용
  • cpu/pxa270/start.S : 프로세서의 속도설정과 SDRAM으로 부트로더 자신을 복사

  • 실행순서
    • start.S에서 memsetup.S 호출, 메모리 컨트롤러 설정
    • 부트로더 자신을 SDRAM으로 복사하고 SDRAM으로 점프.
    • lib_arm/board.c의 start_armboot함수가 실행
    • include/configs/skku.h에서 설정한 내용에 따라 나머지 하드웨어들에 대한 설정
    • 사용자의 명령 대기
    • 사용자가 커널을 로드하도록 명령
    • lib_arm/armlinux.c에 있는 do_bootm_linux함수가 호출
    • 커널 이미지를 로드하고 커널로 점프한다.

1.3.2.1. cpu/pxa270/start.S

.globl _start
_start:
    b    reset
이 부분은 파일의 시작 지점으로 물리적으로 0x00000000번지에 놓이게 된다. 0x00000000번지에는 플래쉬 메모리가 놓여 있다. 즉, _start 지점이 0x00000000 번지에 놓이게 되며, "b reset" 명령어는 0x00000000 번지에 놓이는 최조의 명령어가 된다. 이 명령어에 의해 CPU는 reset 위치로 뛴다. ".globl _start"에서 .globl은 전체 목적 파일을 링크할 때 _start 심벌을 링커,로더가 볼수 있도록 하는 역활을 한다.

    .balignl 16,0xdeadbeef
이 부분은 다음에 올 코드를 16 바이트 경계(바인더리인지 모인지, word단위로 맞추는것)에 놓고 중간에 비게 되는 부분을 4바이트 크기의 0xdeadbeef값으로 채우라는 어셈블러 지시어.
reset:
    mrs r0,cpsr      
    bic r0,r0,#0x1f
    orr r0,r0,#0xd3
    msr cpsr,r0
여기는 cpsr 레지스터의 값을 r0 레지스터로 읽어온후, r0 레지스터의 하위 다섯 비트를 이진수 00000으로 채우고 다시 하위 5 비트와 5,6,7번 비트를 이진수 11010011(0xd3) 값으로 채운후, 수정한 r0 레지스터의 값을 cpsr 레지스터에 쓰는 부분이다. 이 부분은 CPU를 SVC32 mode로 전환을 하며, IRQ와 FIQ를 끄는 역활을 한다.

1.4. 2006.03.04

  • start.S 코드 수정 완료.

1.4.1. board/skku/memsetup.S

  • u-boot가 버전업이 되면서 memsetup.S가 lowlevel_init.S로 파일명이 변경됬음. 하지만 코드의 내용은 전과 동일.
  • 코드를 그대로 따라서 수정만 하는 것이 아니라 왜 이런 식으로 설정이 되는지 이해가 필요. 일단 메뉴얼을 보고 있으나 이해가 안감.
  • 메모리를 셋팅하는데 있어서 SDRAM과 Flash의 정확한 동작원리에 대한 이해가 필요함.

1.4.1.1. Synchronous DRAM

Synchronous DRAM?
  • SDRAM은 cpu의 타이밍에 맞추어 동기화되도록 디자인된 최초의 DRAM 기술이다. SDRAM은 규격 SDRAM 코어를 바탕으로 했고, 규격 DRAM과 유사하게 작동하지만, 이들을 혁신적으로 만드는 몇가지의 구별되는 특징들을 가지고 있다.
    • Synchoronous Operation : 평범하고 Asynchronous인 DRAM과 달리 SDRAM은 마이크로프로세서의 단계별 운용을 조정하는 시스템 클럭이 SDRAM운용을 조정할 수 있게 클럭 입력이 되어있다. 이것은 메모리 콘트롤러가 언제 요청한 정보가 완료되었는가의 정확한 클럭 사이클을 알고 있다는 것을 의마한다. 이것으로 인해, 프로세서가 메모리 엑세스 동안 기다리는 것을 없애 준다.
    • 실제로 SKKU board에서도 PXA270에서 SDCLK1을 SDRAM에 공급해서 SDRAM의 속도를 조정한다.
  • SDRAM Interface
    • CLK : clock 프로세서에서 생성
    • CLK : clock enable
    • nCS : chip selector
    • A0:A12 : addresss
    • BA0:BA1 : bank address
    • DQ0:DQ15 : data
    • nRAS : Row Strobe
    • nCAS : Column Strobe
    • nWE : write enable
    • DQM : DQ input/output Mask
  • 사실 프로세서에 SDRAM 컨트롤러가 있어 복잡한 내부 동작은 알아서 처리해준다. 프로세서에는 이 SDRAM 컨트롤러를 제어하는 시스템 레지스터가 있고 이 레지스터를 조작하는 법을 알아야 한다.
1.4.1.1.1. SDRAM 어드레싱 기본원리
  • column address, row address, bank address가 (x, y, z)가 되어 직육면체의 어느 한곳(=1Byte)를 지정하게 된다. 그리고 column과 row 두 주소를 시간 차이를 두어 A0:A12 핀에다가 실어주고(이를 위해 RAS,CAS가 있다.) bank address는 2핀이니, BA0, BA1을 사용하는 것이다.
  • 동작순서는 nCS와 RAS신호를 활성화 시켜서 Row Address를 주소버스에 실어준다. 그 다음 RAS를 비활성화 시키고 CAS신호를 활성화 시키고, 읽기나 쓰기 동작에 따라서 nWE신호를 주면 되는 것이다. 결국, 원하는 특정주소를 지정하고 나면, 거기서부터 Column Address를 하나씩 증가시켜가며 데이터를 버스트하게 액세스하는 것이다.
모든 동작은 CLK의 positive edge에 동기되어 동작한다.

1.5. 2006.03.08

  • 여전히 부트로더 동작 불능. 선배가 만든 이미지를 올렸을때 정상적으로 동작하는 것으로 봐서는 역시 코딩상의 실수인듯. 문서로 되어있는 것을 그대로 보고 베끼는데도 안 된다니... 다시 한번 코드를 보면서 하드웨어 설정에 관한 이해를 하고, serial_test.S를 참조하여 부트 단계단계마다 간단한 시리얼 출력하는 코드를 집어넣어 어느 단계가 잘못되었는지 검출해야함.
  • 원래의 start.S를 start.S_로 백업해놓고 start.S를 수정함.

1.5.1. start.S 수정

  • 목표 : 맨 처음에 일단 시리얼을 설정하고 시리얼 출력을 이용해서 각 단계단계를 확인한다.

1.6. 2006.03.10

  • 충격 : FFUART를 사용하기 위해선 GPIO를 설정해야 하는데 그냥 무턱대고 FFUART만 설정하고 왜 시리얼이 안 나오나 하고 있었음.

1.7. 2006.03.15

  • u-boot 동작 성공. 일단 커널은 올리지 않고 그전까지의 동작은 시리얼을 통해서 확인했습니다.
  • 동작을 안 했던 원인은
    • 일단 u-boot 1.1.2 porting guide to pxa270 문서상에는 잘못된 오류라든지 하는 것이 전혀 없습니다.
    • 위에 제가 참고한 포팅문서는 u-boot-1.1.2를 기반으로 하고 문서에 보시면 ELDK 3.1.1을 사용하고 있습니다. 그러나 저는 ELDK 4.0 최신버전을 사용하여 포팅을 하고자 했습니다.
    • cpu/cpuname/config.mk 파일안의 각 cpu의 타입에 맞게 cc flas를 설정하는데 이러한 옵션들이 버전업이 되면서 변경이 되었다. 문서상의 옵션을 보자면





2. 게시판


captcha
Username:

아직도 start.S 로 부팅이 불가능하신지요? -- jachin 2006-03-13

일단 성공은 하긴했는데요. 좀 이상한점이 있군요. 지금은 일단 리눅스 디바이스 드라이버 공부에 집중입니다. -- bluster 2006-04-08 04:01:13



sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2006-04-08 04:01:13
Processing time 0.0121 sec