도와주세요!!
글 수 15,339
2009.04.29 13:57:03 (*.130.115.211)
13915
안녕하세요~
그동안 했던 내용들을 정리하여 적어놓고 이곳에 올립니다.
EZ-S2410 을 참고하여 만든 새로운 보드에서 EZboot 를 사용하여 부트로더를 수정하여 동작시키려는데
몇가지 문제점들이 있었습니다.
그중 하나가 SDRAM 을 살리는 문제였지만- 지금은 동작하고 있구요. (좀 더 검증은 필요합니다)
또 하나가 UART를 살려 터미널창에 메세지를 나타내는 것도..
이제는 잘 나타나 주고 있습니다.
다만 ZMODEM 으로 커널이나 램디스크 이미지를 올릴때 전송 끝에가서 멈추는 현상이 나타납니다.
일단 실행 환경을 먼저 나타내고 궁금한 점을 그 밑에 넣겠습니다.
//실행 환경 ----------------------------------------------------------------
New 보드가 EZ-S2410 회로를 참고로 했지만 스펙은 변경하였구요.
중요 스펙을 정리하면 이렇습니다.
EZ-S2410 NEW-보드
CPU 266Mhz(AL26) 200Mhz(AL20)
SDRAM (SIZE) 64MB(32*2) 32MB(32*1) <- 같은 모델 사용
SDRAM (BUS) 32bit 16bit
SDRAM (벤더) 삼성 삼성
NAND (SIZE) 64MB 64MB
NAND (벤더) 삼성 삼성 <- 같은 모델 사용
이더넷 O X
삼성의 데이터 시트를 참고하여 EZboot 에서 설정값을 바꿔 주고 SDRAM동작 확인할때
동적 Sync 상태를 모르고 한참 애먹었던 적이 있었습니다만..
지금은 잘 동작하는 것 같습니다.
//궁금한 것----------------------------------------------------------------
궁금증1) "ezboot에서 메인클럭 변경시 192Mhz 이하 설정에만 터미널에 제대로 나타남"
266Mhz : 시리얼출력 글자깨짐.
202Mhz : 시리얼출력 글자깨짐.
192Mhz : 글자 제대로 나타남.
180Mhz : 글자 제대로 나타남.
위 상태로 보아 S3C2410 AL20 CPU는 200Mhz 이하의 클럭에서 안정적으로 동작하는 것으로 보입니다.
테스트는 EZ-S2410과 같은 uart2 에 연결하였고 속도는 115200 bps 입니다. 다른 설정은 하지 않았고
터미널에서 설정은 맞춰두었습니다. data 8, 패리티 n, stop 1, 흐름제어 없음
궁금증2) "zmodem 으로 kernel 등 image upload 시에 전송 마지막부분에서 멈춤"
192Mhz 나 180Mhz 에서 시리얼통신 상태로 커널이나 램디스크를 업로드 할때 전송 끝부분에 가서는 멈추거나
에러를 발생합니다.
mimicom 상태에서 전송하면 전송 끝부분에서 약 1K 정도의 데이터를 남기고 멈추게 됩니다.
중간에 CTRL+C 키를 눌러 전송을 종료하고 나면 터미널 상에 'S' 가 일정간격으로 찍히고 있습니다.
기다리고 있으면 Time out 이 발생됩니다. 아래는 멈춰있는 상태를 그대로 써놓았습니다.
// ###### 상태 start
---------------[ zmodem upload - Press CTRL-C to qutit]---------------
Sending: zImage
Bytes Sent: 978944 / 979860 BPS:9331 ETA 00:00 Retry 0:
Got TIMEOUT
Transfer incomplete
READY : press any key to continue...
// ##### 상태 end
//EZboot의 시리얼 셋팅 -------------------------------------------------------
아래는 ez_2410.h 에서 시리얼통신의 셋팅을 기존에 있던것과 임의로 고친것을 모두 옮겨놨습니다.
임의대로 설정하여 테스트 한것은 모두 주석처리 해두었습니다.
테스트1) EZ-BOOT 의 기본설정
테스트2) 레지스터값 변경.
최소한의 통신환경 (임의 설정 - 현재 주석처리)
//================================================================================
// 설 명 : 디버기용으로 UART-2를 사용한다.
// 만약 다른 UART 포트를 사용하고 한다면 여기를 수정해 주어야 한다.
// 여기서 설정한 내용은 단지 UART-2로 디버깅용으로 아주 단순하게 설정되어 있다.
// 따라서 이후 C 루틴에서 시리얼을 다시 초기화해 주어야 한다.
//
// BAUD RATE : 115200bps 로 설정한다.
//================================================================================
// UART Line Control Register [Normal mode, No parity, 1-stop bit, 8-bits
#define S3C2410_REG_ULCON 0x50008000
//----------------------------------------------
#define ULCON_INFRA_RED_MODE ( 0x0 >> 6 ) // 0=Normal Mode 1= Infra-Red Tx/Rx Mode
#define ULCON_PARIYT_MODE ( 0x0 >> 3 ) // 0xx=No Parity 100=Odd Parity 101=Even Parity 110=Parity forced/checked as 1 111=Parity forced/checked as 0
#define ULCON_STOP_BIT ( 0x0 >> 2 ) // 0=One Stop bit pre frame 1=Two Stop bit pre frame
#define ULCON_DATA_BIT ( 0x3 >> 0 ) // 00=5-bits 01=6-bits 10=7-bits 11=8-bits
#define ULCON_VALUE ( ULCON_INFRA_RED_MODE | ULCON_PARIYT_MODE | ULCON_STOP_BIT | ULCON_DATA_BIT )
//----------------------------------------------
// UART Control Register
#define S3C2410_REG_UCON 0x50008004
//----------------------------------------------
#define UCON_CLK_SELECT ( 0x0 << 10 )
#define UCON_TX_INT_TYPE ( 0x1 << 9 )
#define UCON_RX_INT_TYPE ( 0x0 << 8 )
#define UCON_RX_TIME_OUT_EN ( 0x0 << 7 )
#define UCON_RX_ERR_STAT_INT_EN ( 0x1 << 6 )
#define UCON_LOOPBACK_MODE ( 0x0 << 5 )
#define UCON_SEND_BRK_SGN ( 0x0 << 4 )
#define UCON_TX_MODE ( 0x1 << 2 )
#define UCON_RX_MODE ( 0x1 << 0 )
/* // ----- 아래는 임의 셋팅 ------
#define UCON_CLK_SELECT ( 0x0 << 10 )
#define UCON_TX_INT_TYPE ( 0x0 << 9 )
#define UCON_RX_INT_TYPE ( 0x0 << 8 )
#define UCON_RX_TIME_OUT_EN ( 0x0 << 7 )
#define UCON_RX_ERR_STAT_INT_EN ( 0x1 << 6 )
#define UCON_LOOPBACK_MODE ( 0x0 << 5 )
#define UCON_SEND_BRK_SGN ( 0x0 << 4 )
#define UCON_TX_MODE ( 0x1 << 2 )
#define UCON_RX_MODE ( 0x1 << 0 )
*/
#define UCON_VALUE ( UCON_CLK_SELECT | UCON_TX_INT_TYPE | UCON_RX_INT_TYPE \
| UCON_RX_TIME_OUT_EN | UCON_RX_ERR_STAT_INT_EN | UCON_LOOPBACK_MODE \
| UCON_SEND_BRK_SGN | UCON_TX_MODE | UCON_RX_MODE ) // 0x245
//----------------------------------------------
// UART FIFO Control Register
#define S3C2410_REG_UFCON 0x50008008
//----------------------------------------------
#define UFCON_TX_FIFO_TRG_LEVEL ( 0x0 << 6 )
#define UFCON_RX_FIFO_TRG_LEVEL ( 0x0 << 4 )
#define UFCON_TX_FIFO_RESET ( 0x1 << 2 )
#define UFCON_RX_FIFO_RESET ( 0x1 << 1 )
#define UFCON_FIFO_EN ( 0x1 << 0 )
/* // ----- 아래는 임의 셋팅 ------
#define UFCON_TX_FIFO_TRG_LEVEL ( 0x0 << 6 )
#define UFCON_RX_FIFO_TRG_LEVEL ( 0x0 << 4 )
#define UFCON_TX_FIFO_RESET ( 0x0 << 2 )
#define UFCON_RX_FIFO_RESET ( 0x0 << 1 )
#define UFCON_FIFO_EN ( 0x0 << 0 )
*/
#define UFCON_RESET ( UFCON_TX_FIFO_TRG_LEVEL | UFCON_RX_FIFO_TRG_LEVEL \
| UFCON_TX_FIFO_RESET | UFCON_RX_FIFO_RESET \
| UFCON_FIFO_EN )
#define UFCON_VALUE ( UFCON_FIFO_EN )
//----------------------------------------------
// UART TX/RX Status Register
#define S3C2410_REG_UTRSTAT 0x50008010
//----------------------------------------------
#define UTRSTAT_TX_EMPTY ( 0x1 << 2 )
#define UTRSTAT_TX_BUFF_EMPTY ( 0x0 << 1 )
#define UTRSTAT_RX_BUFF_REAYD ( 0x0 << 0 )
/* // ----- 아래는 임의 셋팅 ------
#define UTRSTAT_TX_EMPTY ( 0x1 << 2 ) // UART 전송단상태 (0:전송되지 않은데이터있음, 1:비어있음)
#define UTRSTAT_TX_BUFF_EMPTY ( 0x1 << 1 ) // 전송버퍼상태 (0:전송되지 않은데이터 버퍼있음, 1:비어있음)
#define UTRSTAT_RX_BUFF_REAYD ( 0x0 << 0 ) // 수신버퍼상태 (0:Empty, 1:수신데이터있음)
*/
#define UTRSTAT_VALUE ( UTRSTAT_TX_EMPTY | UTRSTAT_TX_BUFF_EMPTY | UTRSTAT_RX_BUFF_REAYD )
//----------------------------------------------
// UART Transmit Buffer Register [ Little Endian ]
#define S3C2410_REG_UTXH 0x50008020
//----------------------------------------------
//----------------------------------------------
// UART BAUD RATE DIVISOR Register
#define S3C2410_REG_UBRDIV 0x50008028
//----------------------------------------------
// ( PCLK/(16*baudrate)) -1 )
#if CPU_SPEED == S3C2410_CPU_266M
#define UBRDIV 0x24
#elif CPU_SPEED == S3C2410_CPU_202M
#define UBRDIV 0x1A
#elif CPU_SPEED == S3C2410_CPU_192M
#define UBRDIV 0x19
//#define UBRDIV 0x137 // 9600 BPS 임의 셋팅
#elif CPU_SPEED == S3C2410_CPU_180M
#define UBRDIV 0x17
//#define UBRDIV 0x125 // 9600 BPS 임의 셋팅
#elif CPU_SPEED == S3C2410_CPU_147M
#define UBRDIV 0x13
#elif CPU_SPEED == S3C2410_CPU_101M
#define UBRDIV 0x0D
#else
#error "S3C2410의 속도를 설정하세요"
#endif
이상입니다.
2009.04.30 08:58:54 (*.130.115.227)
항상 친절하신 답변에 감사드립니다. ^^
궁금증1) 은 클럭값을 계산하여 115200 bps 와 9600 bps 모두 적용해보고 판단된 것입니다.
계산식은
( PCLK / (보레이트 * 16) ) - 1 이었으며 PCLK = FCLK / 4 로 적용되어 있습니다.
계산결과는 10진수가 나와 EZBOOT 에 맞게 16진수로 바꾸어 적용하였습니다 약간의 손실은 있더군요.
궁금증2) 이건 잘 모르겠습니다. 16 bit 램버스에 의하여 생기는 버벅임일까도 고민했습니다만..
고속동작하는 SDRAM 에서 이런 문제는 없겠지요.
궁금증3) 이 생겼습니다. ^^;
New 보드에서 부트로더를 띄운상태로 가만히 5분이상 두게 되면.. 다시 동작하려고 입력이 되는 순간
재부팅 됩니다. -;;;; 부트로더만 띄운상태인데 재부팅이라니.. 좀 이상하네요.
이건 SDRAM 설정 변경에 영향이 있는 걸까요.
궁금증1) 은 클럭값을 계산하여 115200 bps 와 9600 bps 모두 적용해보고 판단된 것입니다.
계산식은
( PCLK / (보레이트 * 16) ) - 1 이었으며 PCLK = FCLK / 4 로 적용되어 있습니다.
계산결과는 10진수가 나와 EZBOOT 에 맞게 16진수로 바꾸어 적용하였습니다 약간의 손실은 있더군요.
궁금증2) 이건 잘 모르겠습니다. 16 bit 램버스에 의하여 생기는 버벅임일까도 고민했습니다만..
고속동작하는 SDRAM 에서 이런 문제는 없겠지요.
궁금증3) 이 생겼습니다. ^^;
New 보드에서 부트로더를 띄운상태로 가만히 5분이상 두게 되면.. 다시 동작하려고 입력이 되는 순간
재부팅 됩니다. -;;;; 부트로더만 띄운상태인데 재부팅이라니.. 좀 이상하네요.
이건 SDRAM 설정 변경에 영향이 있는 걸까요.
2009.04.30 13:10:13 (*.138.143.83)
궁금증1) 은 클럭값을 계산
공급되는 클럭을 나누어 UART 클럭을 사용하기때문에 정확한 UART 클럭 3.6864MHz 기준의 2곱하기 클럭이나 2나누기
클럭이 나오지 않으면 에러가 발생합니다.
궁금증2) DRAM 을 16비트로 쓴다고 해서 이런문제가 나지 않습니다.
I-cache 가 활성화 되있지 않다면 속도가 느려 발생할수도 있겠네요
궁금증3) 재부팅되는것이 아니라 exception 이 발생했을때 reset 벡터로 진입하는거라는 생각이 듭니다.
SDRAM 메모리 문제가 있다는 생각이 듭니다. 일정시간이후에 리셋되는 것이니 refresh 시간쪽이라는 생각이 듭니다.
정확한 이유는 판단이 잘 안서네요
공급되는 클럭을 나누어 UART 클럭을 사용하기때문에 정확한 UART 클럭 3.6864MHz 기준의 2곱하기 클럭이나 2나누기
클럭이 나오지 않으면 에러가 발생합니다.
궁금증2) DRAM 을 16비트로 쓴다고 해서 이런문제가 나지 않습니다.
I-cache 가 활성화 되있지 않다면 속도가 느려 발생할수도 있겠네요
궁금증3) 재부팅되는것이 아니라 exception 이 발생했을때 reset 벡터로 진입하는거라는 생각이 듭니다.
SDRAM 메모리 문제가 있다는 생각이 듭니다. 일정시간이후에 리셋되는 것이니 refresh 시간쪽이라는 생각이 듭니다.
정확한 이유는 판단이 잘 안서네요
2009.04.30 15:21:35 (*.130.115.227)
매번 답변해주셔서 무한히 감사드립니다 !! ^^;
UART 의 클럭값 계산을 아주 세밀하게 해주어야 하는군요.
그런데.. S3C2410 에서 UBRDIV 레지스터에 적어야 하는 값이 16진수로 간단하게 적기때문에 제가 한 계산식의 경우
계산할경우 잃는값이 있었습니다.
예를들어 제가 FALinux 코드상에서 보고 한 계산에 따르면 이런 것입니다.
메인클럭(FCLK) 이 192000000hz => 192Mhz 의 경우
PCLK가 4를 나눈값인 48000000hz => 48Mhz 가 됩니다.
(48000000 / (115200 * 16) ) -1 은 약 25.041 이 나오고 이것을 16진수로 하면 19가 됩니다.
( PCLK / ( 보레이트 * 16) ) -1 은 S3C2410 데이터 시트에서 나타난 계산식이었습니다.
그래서 UBRDIV 값은 0x19 가 들어가게 됩니다.
3.6864 의 배수로 맞추어야 하는지요? 그럼 위에 경우엔 어떻게 맞추어야 하나요..
UART 의 클럭값 계산을 아주 세밀하게 해주어야 하는군요.
그런데.. S3C2410 에서 UBRDIV 레지스터에 적어야 하는 값이 16진수로 간단하게 적기때문에 제가 한 계산식의 경우
계산할경우 잃는값이 있었습니다.
예를들어 제가 FALinux 코드상에서 보고 한 계산에 따르면 이런 것입니다.
메인클럭(FCLK) 이 192000000hz => 192Mhz 의 경우
PCLK가 4를 나눈값인 48000000hz => 48Mhz 가 됩니다.
(48000000 / (115200 * 16) ) -1 은 약 25.041 이 나오고 이것을 16진수로 하면 19가 됩니다.
( PCLK / ( 보레이트 * 16) ) -1 은 S3C2410 데이터 시트에서 나타난 계산식이었습니다.
그래서 UBRDIV 값은 0x19 가 들어가게 됩니다.
3.6864 의 배수로 맞추어야 하는지요? 그럼 위에 경우엔 어떻게 맞추어야 하나요..
클럭설정이 변경되는 UART 에 공급되는 클럭도 변경되어 원하시는 baudrate 가 나오지 않습니다.
클럭을 변경하실때 UART 클럭값을 계산하여 넣으셔야 합니다.
궁금증2) "zmodem 으로 kernel 등 image upload 시에 전송 마지막부분에서 멈춤"
ZModem 전송시 에러가 날 경우 위와 같은 현상이 나타납니다. baudrate 문제이거나 baudrate 문제가 없다면
UART 에 사용되는 FIFO 가 disable 되있을 경우 발생합니다.
baudrate 설정과 FIFO 활성화가 되어있는지 확인하세요
첨부하신 소스는 시간이 허락치 않아 보지 못했습니다. ^^