2016-02-08 22 views
5

Sto scrivendo un driver PCIe per Linux, attualmente senza DMA, e ho bisogno di sapere come leggere e scrivere sul dispositivo PCIe una volta abilitato dallo spazio utente.Driver PCIe - In che modo lo spazio utente lo accede?

Nel driver che faccio le basi in sonda():

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

Ma allora come faccio ad accedere a questa memoria da user space a leggere e scrivere? Aggiungo le operazioni sui file al mio driver PCIe? Ha la memoria da pci_iomap mostrare un po 'di posto in cui il codice di spazio utente può chiamare:

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

Se è così allora che cosa è la posizione?

Nota: il dispositivo PCIe non collegandolo ad una qualsiasi sottosistemi Linux come audio, Ethernet, ecc

+0

Non sono sicuro che sia il modo consigliato di fare le cose, ma altri driver del kernel espongono dispositivi virtuali come '/ dev/vboxnetctl', che presumo tu possa impartire comandi a. Non sono sicuro che il kernel di Linux consentirebbe a qualsiasi programma userspace di leggere/scrivere su un dispositivo PCIe, volente o nolente, che potrebbe sembrare pericoloso. –

+0

Anche io lo stavo guardando. C'è qualcosa che devo fare per far visualizzare il mio dispositivo lì? Ad esempio, quali chiamate API faccio nel mio driver? – user2205930

+0

Forse date un'occhiata al codice sorgente del driver VirtualBox per le idee. –

risposta

0

È possibile registrare i dispositivi usando le funzioni come register_chrdev e device_create. Si consideri il 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

Sì, alla fine ho creato un driver di dispositivo di carattere per il mio dispositivo PCIe. Consiglierei ad altri di leggere il libro Linux Device Drivers, capitolo 3, per saperne di più. È obsoleto ma puoi scegliere alcune nozioni di base per iniziare. – user2205930

2

Se si desidera solo per esportare memoria dal kernel space allo spazio utente e ottenere gli interrupt, pensare al UIO driver.

Con esso, tutti gli accessi verranno eseguiti tramite il file/dev/uioX. Puoi scrivere mmap() su di esso per esportare memoria e puoi leggere (con una lettura bloccante) per "catturare" l'interrupt.

UIO è perfettamente adatto per PCIe, ci already is a driver nel kernel per esso.