부트로더 제작 9편. startup (III) 클럭시스템과 sdram 초기화 - 2009/02/10 23:14
그림1. lowlevel_init.S 소스코드
이번 시간에는 부트 스타트업 기동시 행해지는 주요한 시스템 specific 한 동작들. 예컨대 클럭설정및 SDRAM 초기화 등의 주제를 다루어 본다.
섹션 BB, HH 에서는 링크레지스터(lr)의 값을 임시 보관하고 있는 scratch 레지스터의 사용이 눈에 띤다. EP9302 프로세서에는 위와같이 소용량의 메모리 혹은 레지스터가 별도로 존재하여 필요시 유용하게 사용 될 수 있다.
*[CC] : flash_cfg. strata FLASH 메모리를 사용키 위해서 static memory controller 의 초기화를 수행한다. 버스 인터페이스는 16비트, wait 클럭의 수는 single과 burst access 가 구별되어 각각 3HCLK, 6HCLK 로 설정된다. 이는 비교적 느린 속도의 FLASH 메모리의 버스 인터페이스 타이밍을 맞추어 주기 위함이다.
*[DD] : pll_cfg. 66MHz의 HCLK, 33MHz의 PCLK 주파수 선택을 위한 PLL1과 USB 클럭 주파수를 위한 PLL2의 초기화가 진행된다.
*[FF] : sdram_cfg.
SDRAM 초기화 는 ('그림2. sdram_cfg.S 소스코드' 참고) 60~62라인의 Dev config 중 특히 latency 값의 세팅에 주의 하여야 하며 마찬가지로 80~86라인의 refresh timer 값의 적절한 선택과 92~101라인의 MODE 레지스터 값의 적정성이 주요한 것이된다.
| 1 /* 2 * SDRAM setup for Olimex CS-E9301 board 3 * 4 * Copyright (C) 2006 Dominic Rath <Dominic.Rath@gmx.de> 5 * 6 * See file CREDITS for list of people who contributed to this 7 * project. 8 * 9 * This program is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU General Public License as 11 * published by the Free Software Foundation; either version 2 of 12 * the License, or (at your option) any later version. 13 * 14 * This program is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * GNU General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program; if not, write to the Free Software 21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 22 * MA 02111-1307 USA 23 */ 24 #include <ep93xx.h> 25 26 /* delay for 200us 27 * loop takes 4 cycles at 6.02ns per cycle = 24.1ns 28 * 0x3000 (12288) gives us 296us to be safe 29 */ 30 .macro delay200 31 ldr r0, =0x3000 32 200: 33 subs r0, r0, #1 34 bne 200b 35 .endm 36 37 .globl sdram_cfg 38 sdram_cfg: 39 /* 1x Samsung K4S561632C-TC/L75 4M x 16bit x 4 banks SDRAM 40 * 41 * CLK cycle time min: 42 * @ CAS latency = 3: 7.5ns 43 * @ CAS latency = 2: 10ns 44 * We're running at 66MHz (15ns cycle time) external bus speed (HCLK), 45 * so it's safe to use CAS latency = 2 46 * 47 * RAS-to-CAS delay min: 48 * 20ns 49 * At 15ns cycle time, we use RAS-to-CAS delay = 2 50 * 51 * SROMLL = 1: Swap BA[1:0] with A[13:12], making the SDRAM appear 52 * as four blocks of 8MB size, instead of eight blocks of 4MB size: 53 * 0x00000000 - 0x007fffff 54 * 0x01000000 - 0x017fffff 55 * 0x04000000 - 0x047fffff 56 * 0x05000000 - 0x057fffff 57 * 58 * BANKCOUNT = 1: This is a device with four banks 59 */ |
그림2. sdram_cfg.S 소스코드
pll 설정이나 sdram의 설정은 모두 시스템에 지대한 영향을 끼치는 요소들인 만큼 주의가 필요하며 한편, 이에 대한 부주의로 혹은 잘못된 이해로 설정값이 잘못되었을 경우 시스템이 정지(halt) 할 수도 있게 된다.
이에 마찬가지로 이와 관련된 코드의 디버깅에도 세심한 방법이 요구되어 '그림1. lowlevel_init.S 소스코드' 과 같이 'AA', 'EE', 'GG' 섹션처럼 led가 적극적으로 사용되어 만일에 코드가 실행중 정지되더라도 마지막 실행된 위치를 즉각적으로 파악 할 수가 있게 된다.
예를들어 위와 같은 코드의 실행시 그 결과 GREEN LED는 꺼져 있고 RED LED는 켜져 있게 된다면 sdram_cfg 코드의 실행중 프로그램은 'halt' 되었다는 것을 쉽게 알수 있게 된다.
NEXT. . . 다음 시간에는 blob의 mmu 설정과 main() 을 살펴 봅니다.
posted by 가일(GUILE)
♡ 포스팅이 유익 하셨다면 E-mail로 가일의 임베디드 스쿨을 구독하세요-> 




