2016-02-08 15 views
5

Piszę sterownik PCIe dla systemu Linux, obecnie bez DMA, i muszę wiedzieć, jak czytać i zapisywać dane na urządzeniu PCIe po włączeniu go z przestrzeni użytkownika.Sterownik PCIe - Jak ma do niego dostęp użytkownik?

W sterowniku robię podstawy w sondzie():

pci_enable_device(); 
pci_request_regions(); 
pci_iomap(); 

Ale to w jaki sposób mogę uzyskać dostęp do tej pamięci z przestrzeni użytkownika do odczytu i zapisu? Czy dodaję operacje na plik do mojego sterownika PCIe? Czy pamięć z pci_iomap pokazuje miejsce, w którym kod przestrzeni użytkownika może wywoływać:

open('mapped memory location'); 
mmap(...); 

Jeśli tak, to jaka jest lokalizacja?

Uwaga: urządzenie PCIe nie podłączając do jakichkolwiek podsystemów systemu Linux, takich jak audio, Ethernet, itp

+0

Nie jestem pewien, czy jest to zalecany sposób robienia rzeczy, ale inne sterowniki jądra udostępniają urządzenia wirtualne, takie jak '/ dev/vboxnetctl', które zakładam, że możesz wydać polecenia. Nie jestem pewien, czy jądro Linuksa pozwoliłoby programowi przestrzeni użytkownika na odczytywanie/zapisywanie na urządzeniu PCIe, ale to brzmi groźnie. –

+0

Patrzyłem też na to. Czy jest coś, co muszę zrobić, aby moje urządzenie się tam pojawiło? Na przykład, jakie wywołania interfejsu API wprowadzam w moim sterowniku? – user2205930

+0

Być może spójrz na kod źródłowy sterownika VirtualBox dla pomysłów. –

Odpowiedz

0

można zarejestrować urządzenia przy użyciu funkcji takich jak register_chrdev i device_create. Rozważmy kernel source for /dev/null and /dev/mem:

static int __init chr_dev_init(void) 
{ 
    int minor; 

    if (register_chrdev(MEM_MAJOR, "mem", &memory_fops)) 
     printk("unable to get major %d for memory devs\n", MEM_MAJOR); 

    mem_class = class_create(THIS_MODULE, "mem"); 
    if (IS_ERR(mem_class)) 
     return PTR_ERR(mem_class); 

    mem_class->devnode = mem_devnode; 
    for (minor = 1; minor < ARRAY_SIZE(devlist); minor++) { 
     if (!devlist[minor].name) 
      continue; 

     /* 
     * Create /dev/port? 
     */ 
     if ((minor == DEVPORT_MINOR) && !arch_has_dev_port()) 
      continue; 

     device_create(mem_class, NULL, MKDEV(MEM_MAJOR, minor), 
        NULL, devlist[minor].name); 
    } 

    return tty_init(); 
} 

fs_initcall(chr_dev_init); 
+0

Tak, ostatecznie utworzyłem sterownik urządzenia znaków dla mojego urządzenia PCIe. Poleciłbym innym przeczytać książkę Linux Device Drivers, rozdział 3, aby dowiedzieć się więcej. Jest przestarzały, ale możesz wybrać podstawy, które pozwolą Ci jechać. – user2205930

2

Jeśli chcesz po prostu wyeksportować pamięci z przestrzeni jądra w przestrzeni użytkownika i uzyskać przerwań, pomyśl o UIO driver.

Dzięki temu wszystkie dostępy będą wykonywane przez plik/dev/uioX. Możesz zrobić na nim mmap(), aby wyeksportować pamięć i możesz odczytać (z odczytem blokującym), aby "złapać" przerwanie.

UIO jest idealnie przystosowany do PCIe, tam jest already is a driver w jądrze.

Powiązane problemy