개구리 wrote..
: CS8900을 두개 다실때 다음을 점검해 보세요
:
: nCS3 ,nCS4 타이밍 설정 관련된 메모리 컨트롤러 설정 사항
: CS8900 의 초기화를 위한 LHE 핀 처리 문제
: CS8900의 주소는 0x0300을 더한 위치에서 시작하는 문제
:
: 이 부분을 모두 검토하시기 바랍니다

1. nCS3, nCS4등의 타이밍설정은 이지부트2.2의 기본설정을 그대로 사용하였습
니다. nCS4에 달린 칩은 제대로 인식을 하고있고요, nCS2와 nCS3가 타이밍이
같기때문에 nCS2에는 이지보드 기존의 CS8900이 달려있는데 잘 동작하고 있습
니다. 그런데 제가 추가한 것중의 하나인 nCS3는 제대로 인식이 안됩니다. ㅜ.

2. 제가 첨부한 소스코드에서도 0x0300을 더한 위치에서 CS8900의 주소가 시작
되게 수정되어 있습니다. 즉 nCS3,nCS4에 달린 칩모두 동작코드등은 동일하
고, 주소부분등만 수정되었는데, nCS3에 붙은것만 동작이 제대로 안됩니다.

3. CS8900의 칩 처리는 이지보드의 책자에 첨부된 CS8900의 책잘를 보고 nCS
와 GPIO만을 수정한것이라서 제대로 동작할것이라 생각되는데 nCS3만 동작이
안됩니다. (nCS4는 동작이 잘됩니다.)


4. 제가 수정한 사항들입니다.

1. ezboot/include/config.h

struct SConfig에서 다음 두줄을 추가한다.
Byte Local_MacAddress1[8]; // 보드 MAC Address
[xx:xx:xx:xx:xx:xx] default { 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF }
Byte Local_MacAddress2[8]; // 보드 MAC Address
[xx:xx:xx:xx:xx:xx] default { 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF }


2. ezboot/main/config.c

TConfig Cfg 에 다음 두줄을 추가한다.

Local_MacAddress1 : {0x01, 0xD2, 0xCA,
0xF1, 0x26, 0x25 }, // 보드 MAC Address1
[xx:xx:xx:xx:xx:xx]
Local_MacAddress2 : {0x03, 0xD4, 0xCA,
0xF1, 0x26, 0x25 }, // 보드 MAC Address2
[xx:xx:xx:xx:xx:xx]


char *CfgItemStr[] =
{
" 1. MAC Address [%02x:%02x:%02x:%02x:%02x:%02x]

",
" 2. LOCAL IP [%d.%d.%d.%d]

" ,
" 3. HOST IP [%d.%d.%d.%d]

" ,
" 4. Host tftp directory [%s]

" ,
" 5. zImage file name [%s]

" ,
" 6. ram disk file name [%s]

" ,
" 7. boot loader file name [%s]

" ,
" 8. zImage address on flash [0x%08x]

" ,
" 9. ramdisk address on flash [0x%08x]

" ,
" A. zImage address on memory [0x%08x]

" ,
" B. ramdisk address on memory [0x%08x]

" ,
" C. Autoboot wait time [%d]

" ,
" D. Boot Menu Key [%c]

" ,
" E. Kernel Command Line [%s]

" ,
" F. Architecture Number [%d]

" ,
" G. RAM Disk Size MBytes [%d]

" ,
" H. MAC Address1 [%02x:%02x:%02x:%02x:%
02x:%02x]
",
" I. MAC Address2 [%02x:%02x:%02x:%02x:%
02x:%02x]
",
" P.
Apply
" ,
" S.
Save
" ,
" 0.
Exit
" ,
};



while (1)
{
printf( "

" );
printf( CfgItemStr[ 0], SvCfg.Local_MacAddress[0],
SvCfg.Local_MacAddress[1], SvCfg.Local_MacAddress[2],
SvCfg.Local_MacAddress[3], SvCfg.Local_MacAddress[4],
SvCfg.Local_MacAddress[5] );
printf( CfgItemStr[ 1], (SvCfg.Local_IP>>0)&0xff,
(SvCfg.Local_IP>>8)&0xff, (SvCfg.Local_IP>>16)&0xff, (SvCfg.Local_IP>>24)
&0xff );
printf( CfgItemStr[ 2], (SvCfg.Host_IP >>0)&0xff,
(SvCfg.Host_IP >>8)&0xff, (SvCfg.Host_IP >>16)&0xff, (SvCfg.Host_IP >>24)
&0xff );
printf( CfgItemStr[ 3], SvCfg.TFTP_Directory );
printf( CfgItemStr[ 4], SvCfg.TFTP_zImageFileName );
printf( CfgItemStr[ 5], SvCfg.TFTP_RamDiskFileName );
printf( CfgItemStr[ 6], SvCfg.TFTP_LoaderFileName );
printf( CfgItemStr[ 7], SvCfg.FlashStart_Kernel );
printf( CfgItemStr[ 8], SvCfg.FlashStart_RamDisk );
printf( CfgItemStr[ 9], SvCfg.RamStart_Kernel );
printf( CfgItemStr[10], SvCfg.RamStart_RamDisk );
printf( CfgItemStr[11], SvCfg.AutoBootWaitTime );
printf( CfgItemStr[12], SvCfg.EntryBootLoaderKey );
printf( CfgItemStr[13], SvCfg.Kernel_CmdLine );
printf( CfgItemStr[14], SvCfg.Kernel_ArchNumber );
printf( CfgItemStr[15], SvCfg.Kernel_RamDiskSize >> 20 );
printf( CfgItemStr[16],
SvCfg.Local_MacAddress1[0], SvCfg.Local_MacAddress1[1],
SvCfg.Local_MacAddress1[2], SvCfg.Local_MacAddress1[3],
SvCfg.Local_MacAddress1[4], SvCfg.Local_MacAddress1[5] );
printf( CfgItemStr[17], SvCfg.Local_MacAddress2[0],
SvCfg.Local_MacAddress2[1], SvCfg.Local_MacAddress2[2],
SvCfg.Local_MacAddress2[3], SvCfg.Local_MacAddress2[4],
SvCfg.Local_MacAddress2[5] );
printf( "
" );
printf( CfgItemStr[18] );
printf( CfgItemStr[19] );
printf( CfgItemStr[20] );




switch ( rbuff[0] )
{
case '1' : GetMacAddress( CfgItemStr[0], (Byte *)&
(SvCfg.Local_MacAddress) ); break;
case '2' : GetIPAddress ( CfgItemStr[1], &
(SvCfg.Local_IP) ); break;
case '3' : GetIPAddress ( CfgItemStr[2], &
(SvCfg.Host_IP ) ); break;
case '4' : GetFileName ( CfgItemStr[3],
SvCfg.TFTP_Directory ); break;
case '5' : GetFileName ( CfgItemStr[4],
SvCfg.TFTP_zImageFileName ); break;
case '6' : GetFileName ( CfgItemStr[5],
SvCfg.TFTP_RamDiskFileName ); break;
case '7' : GetFileName ( CfgItemStr[6],
SvCfg.TFTP_LoaderFileName ); break;
case '8' : GetAddress ( CfgItemStr[ 7], &
(SvCfg.FlashStart_Kernel ) ); break;
case '9' : GetAddress ( CfgItemStr[ 8], &
(SvCfg.FlashStart_RamDisk) ); break;
case 'A' : case 'a' : GetAddress ( CfgItemStr[ 9], &
(SvCfg.RamStart_Kernel ) ); break;
case 'B' : case 'b' : GetAddress ( CfgItemStr[10], &
(SvCfg.RamStart_RamDisk ) ); break;
case 'C' : case 'c' : GetWaitTime( CfgItemStr[11], &
(SvCfg.AutoBootWaitTime ) ); break;
case 'D' : case 'd' : GetMenuKey ( CfgItemStr[12], &
(SvCfg.EntryBootLoaderKey) ); break;

case 'H' : case 'h' : GetMacAddress
( CfgItemStr[16], (Byte *)&(SvCfg.Local_MacAddress1) ); break;
case 'I' : case 'i' : GetMacAddress
( CfgItemStr[17], (Byte *)&(SvCfg.Local_MacAddress2) ); break;

case 'P' : case 'p' : // 적용한다.
memcpy( &Cfg, &SvCfg, sizeof(TConfig) );
printf( "
...Applyed" );
break;

case 'S' : case 's' : // 저장한다.
memcpy( &Cfg, &SvCfg, sizeof(TConfig) );
printf( "
" );
SaveConfig();
printf( "
...Saved" );
break;

case '0' : printf( "
" );
return 0; // exit
}


3. /ezboot/include/cs8900.h


//확장된 cs8900칩을 위해서 eth1
#define CS8900_BASE1 0x18000300 // 0x08000300
#define CS8900_RTX_DATA1 *((volatile short *)(CS8900_BASE1 +
0x00000000)) // RTx data.
#define CS8900_TXCMD1 *((volatile short *)(CS8900_BASE1 +
0x00000004)) // RTx command.
#define CS8900_TXLEN1 *((volatile short *)(CS8900_BASE1 +
0x00000006)) // transmit length.
#define CS8900_ISQ1 *((volatile short *)(CS8900_BASE1 +
0x00000008)) // interrupt.
#define CS8900_PPPTR1 *((volatile short *)(CS8900_BASE1 +
0x0000000a)) // packet page point.
#define CS8900_PPDATA1 *((volatile short *)(CS8900_BASE1 +
0x0000000c)) // packet page data.

//확장된 cs8900칩을 위해서 eth2
#define CS8900_BASE2 0x40000300 // 0x08000300
#define CS8900_RTX_DATA2 *((volatile short *)(CS8900_BASE2 +
0x00000000)) // RTx data.
#define CS8900_TXCMD2 *((volatile short *)(CS8900_BASE2 +
0x00000004)) // RTx command.
#define CS8900_TXLEN2 *((volatile short *)(CS8900_BASE2 +
0x00000006)) // transmit length.
#define CS8900_ISQ2 *((volatile short *)(CS8900_BASE2 +
0x00000008)) // interrupt.
#define CS8900_PPPTR2 *((volatile short *)(CS8900_BASE2 +
0x0000000a)) // packet page point.
#define CS8900_PPDATA2 *((volatile short *)(CS8900_BASE2 +
0x0000000c)) // packet page data.


4. /ezboot/main/cs8900.c

코드 길이가 많아서 위에서 제가 첨부한 코드를 봐주세요.


5. /ezboot/main/main.c

추가 코드
// CS8900을 초기화 한다.
CS8900_Init();

// CS8900 extend1를 초기화 한다.
CS8900_Init1();

// CS8900 extend2를 초기화 한다.
CS8900_Init2();

이렇게 수정하였습니다.

제가 써준 코드들은 메모리 주소부분 말고는 nCS3와 nCS4가 모두 동일한데
nCS3만 동작을 안하니 정말 답답합니다. 고수님들 제가 하면서 뭐가 틀린것같
은지 혹은 의심가시는 부분있으시면 가차없이 적어주세요... 정말 부탁 드립니
다.