2016-02-08 17 views
5

Şu an DMA olmadan Linux için bir PCIe sürücüsü yazıyorum ve kullanıcı alanından etkinleştirildikten sonra PCIe aygıtının nasıl okunacağını ve yazılacağını bilmem gerekiyor.PCIe Sürücüsü - Kullanıcı alanı nasıl erişir?

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

Ama sonra okuma yazma kullanıcı uzaydan Bu belleğine erişim nasıl: Ben sonda() içinde temel yapmak sürücüsünde

? PCIe sürücüsüne dosya işlemleri ekledim mi?

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

Eğer öyleyse o zaman konumu nedir: pci_iomap bellek kullanıcı uzay kod çağırabilir bir yere görünür mü?

Not: PCIe aygıtı tür Sen register_chrdev ve device_create gibi işlevleri kullanarak cihazları kayıt olabilirsiniz

+0

Önerilen bir işlem yapmanın yolu olup olmadığından emin değilsiniz, ancak diğer çekirdek sürücüleri, komutları verebileceğinizi düşündüğüm, sanal aygıtları/dev/vboxnetctl gibi açığa çıkarır. Linux çekirdeğinin, herhangi bir kullanıcı-uzay programının bir PCIe aygıtını nemli-nilly okumasına/yazmasına izin vereceğinden emin değilim, bu tehlikeli olabileceğine benziyor. –

+0

Ben de ona bakıyordum. Cihazımın orada görünmesi için yapmam gereken bir şey var mı? Örneğin, sürücümde hangi API çağrılarını yapıyorum? – user2205930

+0

Belki de fikirler için VirtualBox sürücü kaynak koduna bakın. –

cevap

0

vb ses, Ethernet, gibi herhangi bir Linux alt parçalara takmayı olmayacaktır. Sadece kullanıcı uzaya çekirdek alanından hafızayı ihracat ve kesmeleri olsun, UIO driver düşünmek istiyorsanız

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

Evet, en sonunda PCIe aygıtım için bir karakter aygıtı sürücüsü oluşturdum. Daha fazla bilgi edinmek için başkaları Linux Aygıt Sürücüleri kitabını, bölüm 3'ü okumanızı tavsiye ederim. Modası geçmiş ama gitmen için bazı temel bilgileri seçebilirsin. – user2205930

2

: kernel source for /dev/null and /dev/mem düşünün.

Bununla birlikte, tüm girişler/dev/uioX dosyası üzerinden yapılacaktır. Belleği vermek için üzerine mmap() yapabilir ve kesmeyi "yakalamak" için (bir engelleme okumayla) okuyabilirsiniz.

UIO, PCIe için mükemmel şekilde uygundur, bunun için çekirdekte already is a driver vardır.

İlgili konular