도와주세요!!
글 수 15,339
2004.02.02 11:38:18 (*.190.23.29)
6719
약간 싸늘한 날씨군요..^^
PCI 제어에 관한 질문입니다.
메모리 영역으로 해서 시중에서 판매되구 있는 Target Board를 제어 할려 합니
다.
DOS에서 볼렌드 C로 컴파일하여 점검은 끝난 보드 입니다.
설정한 주소에 0을 넣어주면 LED가 꺼지구, 1을 넣으면 LED 가 들어오도록 되
어있습니다.
target board의 외부 32Bit출력 포트에 LED를 설치하였지요.
여쭙고 싶은것은 저도 아래와 같이 원래 있던 PCI.c 소스에 약간만 수정하여
제어할려 했으나,
원하는 데로 동작하지는 않았습니다.. 완전무반응.
32개 LED가 반쯤(약하게) 켜졌있을뿐 전원 들어온 상태부터 꺼질때 까지..
정상적으로 얻은것은 벤더아이디와 디바이스아이디, 그리구 sfr의 10번지에 주
소를 기록하구,
다시 주소같은 읽는것은 문제가 없었습니다.
질문 1:
PCI 메모리 영역으로 제어 해보신분,,, 알려주세요.... ^^
무슨 설정을 더 해야 하는지, 어떻게 설정해야하는지를....
질문 2:
pci_scan_init ()함수에 아래와 같이 I/O 영역 설정이 있는데.
pcisfr_writel(PCIBATAPI, 0x20000000);
이것또한 0x20000000이 맞습니까?
그렇다면 Mem과 i/o가 같은 주소인데..
소스의 수정된 내용
1. _lpAddr 변수에 어드레서 얻기 (_lpAddr = alloc_addr)
2. _lpAddr 를 이용하여 LED 끄고 켜기
수정된 소스
unsigned long * _lpAddr = 0;
static int pci_scan_fn(int dev_num, int fn_num)
{
.... 생략 ...
if(bar & 0x00000001) /* I/O addr */
{
.... 생략 ...
}
else /* Memory addr */
{
size = region_size(bar & 0xfffffff0);
alloc_addr = alloc_mem_addr(size);
pci_write_config_dword(0, dev_num, fn_num,
PCI_BASE_ADDRESS_0+i*4, alloc_addr);
PCI_DBG2("
MEM Region(size of 0x%08x) @ 0x%08x ",
(unsigned int)size, (unsigned int)alloc_addr);
_lpAddr = alloc_addr; <<<<========= Mem 어드레서 보관
}
.... 생략 ...
}
static void pci_scan_init(void)
{
.... 생략 ...
/* address allocation for ahb & pci */
alloc_mem_addr_start = 0x20000000;
alloc_mem_addr_end = 0x27ffffff;
pcisfr_writel(PCIBATAPM, 0x20000000); /* PCI mem bus
use same address with AHB */
alloc_io_addr_start = 0x2E000000;
alloc_io_addr_end = 0x2fffffff;
pcisfr_writel(PCIBATAPI, 0x20000000); /* PCI i/o bus
use same address with AHB */
/* TODO: pci slave mode setting : PCIBAR#, PCIBAM#, PCIBATPA#
*/
}
int pci_scan_bus(int argc, char *argv[])
{
int slot_num, i;
PCI_DBG1("Scanning PCI slots");
pci_scan_init();
for(slot_num = IDSEL_START; slot_num < IDSEL_END; slot_num++)
pci_scan_slot(slot_num);
*(_lpAddr+1) = 0xffffffff; <<<<========= PCI Taerget Board에 출
력모드 설정
for (i=0; i<10; i++)
{
PCI_DBG1("ON ");
*(_lpAddr+0) = 0x00000000; <<<<========= 32개 LED 끄기
PCI_DBG1("OFF ");
*(_lpAddr+0) = 0xffffffff; <<<<========= 32개 LED 켜
기
}
PCI_DBG1("
Done
");
return 0;
}