2011-03-03 13 views
4

PCIe 카드의 FPGA 메모리에 액세스하는 장치 드라이버를 작성하고 있습니다.
카드 부츠와 발견/프로브입니다 : -PCIe Linux 장치 드라이버 구현 (커널 드라이버에서 카드 레지스터에 액세스하려는 경우)

/proc 디렉토리/iomem

80000000-840fffff : PCI Bus #03 
    80000000-83ffffff : 0000:03:00.0 
    84000000-840fffff : 0000:03:00.0 

그래서 읽기 LDD/I는 80000000request_mem_region에 전화를 코딩하고,를 통해 포인터를 요청 등 ioremap_nocache

1) request_mem_regionioremap_nocache이 필요합니까? 후자 만 사용할 수 있습니까?

/proc 디렉토리/iomem insmod 후 장치 드라이버 : -

80000000-840fffff : PCI Bus #03 
    80000000-83ffffff : 0000:03:00.0 
    80000000-8003ffff : fp2 
    84000000-840fffff : 0000:03:00.0 

2)이 오지 않아요 나에게 매우 잘 보면 ...?

#define BAR_ADDR 0x80000000 
void *base = ioremap_nocache(BAR_ADDR, 0x40000); 
void *address = base + KNOWN_REG_LOCATION; 
int data = ioread32(address); 
printk("fp2: address:0x%08x, data:0x%08x\n", address, data); 

출력 : - - :

address:0xfd500000, data:0xffffffff 

내가 x80000000+KNOWN_REG_LOCATION에서 읽을 수 있습니다

어쨌든, (이 검사 등을 가지고, 그 아래처럼 코딩되지 않음) 가 작동하지 않습니다 읽고 mmap 사용자 공간.

3) 나는 행운도없이 __raw_readl/readl을 시도했습니다.

4) 현재 매핑 된 주소 x80000000에서 읽을 수 있습니까?

+0

.tar 파일에는 암호가 필요합니다. 코드를 검토하는 것이 도움이 될 것입니다. – PatrickM

+0

귀하의 의견은 @willtake에게 전달되어야한다고 생각합니다. –

답변

6

이안,

나는 장치 ( full source)에 대한 PCI 드라이버를 썼다. 레지스터 공간의 매핑은 동일해야합니다. 여기 내가 어떻게하는지.

dm7820_device->pci[region].virt_addr = ioremap_nocache(address, length); 
if (dm7820_device->pci[region].virt_addr == NULL) { 
    printk(KERN_ERR "%s: ERROR: BAR%u remapping FAILED\n", 
     &((dm7820_device->device_name)[0]), region); 
    dm7820_release_resources(); 
    return -ENOMEM; 
} 

if (request_mem_region(address, length, &((dm7820_device->device_name)[0])) == NULL) { 
    printk(KERN_ERR "%s: ERROR: I/O memory range %#lx-%#lx allocation FAILED\n", 
     &((dm7820_device->device_name)[0]), address, (address + length - 1)); 
    dm7820_release_resources(); 
    return -EBUSY; 
} 

주소 및 길이 값은 pci_resource_start()pci_resource_length() 호출에서 반환됩니다.

그럼 당신은 dm7820_device->pci[region].virt_addr + <register offset>

당신은 어떤 질문이 있으면 알려주세요 사용 ioread32()를 사용하여 액세스 할 수 있습니다.