KELP의 holelee님이 알려 주신데로

어드레스로 쓰기 이전에

PCISCR 을 셋팅하여...

출력 동작이 되었습니다. ^^

오늘 잠 잘올것입니다.....



지재선 wrote..
:
: 약간 싸늘한 날씨군요..^^
:
: 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;
: }