도와주세요!!
글 수 15,339
2005.01.22 11:06:00 (*.232.40.30)
6663
수고많으십니다.
이번에 ez-m28 보드에 부트로더만 올리고 OS 없이
SCSI Sym53c875 카드를 장착해서 프로젝트를 진행중입니다.
PCI 부분을 수정해서 일단 카드 잡히고, memory mapped 방식을 사용해서
진행중입니다.
일단 카드는 제대로 동작하는것 같긴한데 ....
다음이 진행이 안됩니다.
pci 쪽에서 scsi command register에
Bus master , I/O , Memory-mapped 로 동작하게 값을 설정하고,,,
pci_write_config_byte( 0 , s_dev_num , s_fn_num , 0x04 , 0x07);
칩의 초기화 및 각 배열에 값을 넣어주고
각각의 register를 access 해보면 제대로 동작을 하는데요..
53c875 register 중에 DSP (DMA SCRIPTS POINTER) register에 SCSI의
스크립트들이 들어있는 배열의 주소를 넣어주면 바로 SCSI 칩이 동작하여
스크립트를 가져와야 되는데 이것이 안되네요.. PC (x86) 에서는 제대로
작동을 하고 , 스크립트가 들어있는 배열의 주소를 다른것으로 바꿔줘도
Illegal instruction 에러만 나오는데 ez-m28 보드에서는 BUS FAULT (PCI
bus fault condition) 에러가 생기더군요..
현재 스크립트가 있는 배열의 경우 번지주소가 0x08f0xxxx 로 나오는데
여기서 다른 임의의 번지로 복사를 해도 잘되고 이상이 없는데..
벌써 한달넘게 안되어서 ..... 이거 끝나면 여기에 Silicon image IDE 카드
도 붙여야 되는데 에휴....
scsi 소스중의 일부를 올려봅니다.
scripts_address = (dword ) &SCRIPTB[0]; // 스크립트가 들어있는
배열의 주소를 구하고
copy_data = scripts_address + Ent_copy_data; <-- 스크립트를 SCSI
카드의 램으로 복사를 하기 위
한 스크립트 시작번지
/* patch the SCRIPTS with the byte count and addresses */
SCRIPTB[E_count_Used[0]] &= 0xff000000L;
SCRIPTB[E_count_Used[0]] |= (sizeof(SCRIPTB) & 0xffffffL);
//실제 스크립트 배열의 배열의 크기를 설
정
SCRIPTB[E_source_address_Used[0]] = scripts_address;
// 스크립트 배열의 주소
SCRIPTB[E_destination_address_Used[0]] = scsi_script_ram;
// SCSI 의 스크립트 램의 주소
/* clear all pending interrupts */
printf( "Clear all pending interrupts
");
do
{
istat = mrb( ISTAT);
if (istat)
{
dstat = mrb( DSTAT);
sist0 = mrb( SIST0);
sist1 = mrb( SIST1);
}
} while (istat);
printf("
Copying SCRIPTS Into Onboard SCRIPTS RAM
");
/* start the SCRIPT */
mwd(DSP, copy_data ); <= 바로 이부분에서 위의 copy_data(시작주
소)를 넣어주면 스크립트 배열에서 해당 스크립트를 가져와서
실행됩니다.
/* wait for the interrupt to come */
while(1)
{
istat = mrb( ISTAT ); // 원래는 인터럽트를 사용하지만 여기서
는 폴링방식을 사용합니다.
if ( istat & 1)
{
dstat = mrb( DSTAT) & 0x7F;
if (dstat == 0x04)
{
vector = mrd( DSPS );
}
else if (dstat == 0x20) // BUS FAULT
if (vector==0x11 || vector==0x12) break;
}
}
memory-mapped base address는 0x20000000 이고
scsi 카드의 ram address 는 0x20001000 입니다. (PCI의 Base Address 2)
별에별 방법을 다쓰도 안되네요..
도움을 주시와요... 혹시 아신다면
이번에 ez-m28 보드에 부트로더만 올리고 OS 없이
SCSI Sym53c875 카드를 장착해서 프로젝트를 진행중입니다.
PCI 부분을 수정해서 일단 카드 잡히고, memory mapped 방식을 사용해서
진행중입니다.
일단 카드는 제대로 동작하는것 같긴한데 ....
다음이 진행이 안됩니다.
pci 쪽에서 scsi command register에
Bus master , I/O , Memory-mapped 로 동작하게 값을 설정하고,,,
pci_write_config_byte( 0 , s_dev_num , s_fn_num , 0x04 , 0x07);
칩의 초기화 및 각 배열에 값을 넣어주고
각각의 register를 access 해보면 제대로 동작을 하는데요..
53c875 register 중에 DSP (DMA SCRIPTS POINTER) register에 SCSI의
스크립트들이 들어있는 배열의 주소를 넣어주면 바로 SCSI 칩이 동작하여
스크립트를 가져와야 되는데 이것이 안되네요.. PC (x86) 에서는 제대로
작동을 하고 , 스크립트가 들어있는 배열의 주소를 다른것으로 바꿔줘도
Illegal instruction 에러만 나오는데 ez-m28 보드에서는 BUS FAULT (PCI
bus fault condition) 에러가 생기더군요..
현재 스크립트가 있는 배열의 경우 번지주소가 0x08f0xxxx 로 나오는데
여기서 다른 임의의 번지로 복사를 해도 잘되고 이상이 없는데..
벌써 한달넘게 안되어서 ..... 이거 끝나면 여기에 Silicon image IDE 카드
도 붙여야 되는데 에휴....
scsi 소스중의 일부를 올려봅니다.
scripts_address = (dword ) &SCRIPTB[0]; // 스크립트가 들어있는
배열의 주소를 구하고
copy_data = scripts_address + Ent_copy_data; <-- 스크립트를 SCSI
카드의 램으로 복사를 하기 위
한 스크립트 시작번지
/* patch the SCRIPTS with the byte count and addresses */
SCRIPTB[E_count_Used[0]] &= 0xff000000L;
SCRIPTB[E_count_Used[0]] |= (sizeof(SCRIPTB) & 0xffffffL);
//실제 스크립트 배열의 배열의 크기를 설
정
SCRIPTB[E_source_address_Used[0]] = scripts_address;
// 스크립트 배열의 주소
SCRIPTB[E_destination_address_Used[0]] = scsi_script_ram;
// SCSI 의 스크립트 램의 주소
/* clear all pending interrupts */
printf( "Clear all pending interrupts
");
do
{
istat = mrb( ISTAT);
if (istat)
{
dstat = mrb( DSTAT);
sist0 = mrb( SIST0);
sist1 = mrb( SIST1);
}
} while (istat);
printf("
Copying SCRIPTS Into Onboard SCRIPTS RAM
");
/* start the SCRIPT */
mwd(DSP, copy_data ); <= 바로 이부분에서 위의 copy_data(시작주
소)를 넣어주면 스크립트 배열에서 해당 스크립트를 가져와서
실행됩니다.
/* wait for the interrupt to come */
while(1)
{
istat = mrb( ISTAT ); // 원래는 인터럽트를 사용하지만 여기서
는 폴링방식을 사용합니다.
if ( istat & 1)
{
dstat = mrb( DSTAT) & 0x7F;
if (dstat == 0x04)
{
vector = mrd( DSPS );
}
else if (dstat == 0x20) // BUS FAULT
if (vector==0x11 || vector==0x12) break;
}
}
memory-mapped base address는 0x20000000 이고
scsi 카드의 ram address 는 0x20001000 입니다. (PCI의 Base Address 2)
별에별 방법을 다쓰도 안되네요..
도움을 주시와요... 혹시 아신다면