2016-03-17 2 views
1

На самом деле работает над драйвером PCI. У меня две карты PCIe с одинаковым идентификатором устройства и идентификатором поставщика. Чтобы изменить ситуацию, я назначаю эти две карты двумя разными номерами MINOR.Как работает cdev и связанная с ним операция с файлом?

//request for device numbers 
error = alloc_chrdev_region(&devt, 0, cards_found, DEVICE_NAME); 
if (error == 0) 
{ 
    major = MAJOR(devt); 
    printk(KERN_INFO "(drv_init): MAJOR number is %d\n", major); 
    printk(KERN_INFO "(drv_init): MINOR number range from 0 to %d\n", cards_found-1); 

    cdevs = cdev_alloc(); 
    cdevs->owner = THIS_MODULE; 
    cdev_init(cdevs, fops); 

    for(i=0;i<cards_found,i++) 
    { 
     devt = MKDEV(major, i); 
     error = cdev_add(cdevs, devt, 1); 
     if (error == 0) 
     { 
      printk(KERN_INFO "(drv_init): cdev_add success for minor number: %d", i); 
     } 
     else 
     { 
      printk(KERN_ALERT "(drv_init): cdev_add failed for minor number: %d,error code: %d, exit driver\n", i, error); 
      devt = MKDEV(major, 0); 
      unregister_chrdev_region(devt, cards_found); 
      pci_unregister_driver(&my_pci_driver); 
      return(error); 
     } 
    } 
} ` 

Я делаю это, потому что все документы, которые я нашел в Интернете, показывают, что один номер MINOR для одного устройства.

Но я не могу понять, как OS могла узнать, какая карта нацелена, когда я делаю fops_open, поскольку fops привязан ко всем устройствам.

Нужна ваша помощь, всем.

PS: пижоны = файловые операции

ответ

2

Подпись .open операции

int open(struct inode* inode, struct file* file) 

Незначительное количество устройства открыто может быть получено с помощью

iminor(inode) 

Других файловых операций также может получить номер устройства используя file->f_inode как inode.

В качестве альтернативы .open может хранить данные определенного устройства в file->f_private, а другие операции могут обращаться к ним таким образом.

+0

если устройство имеет несколько второстепенных номеров, какой из них используется при открытии? – ransh

+0

@ransh: Любой * специальный файл * привязан к ** одиночной ** паре ''. Таким образом, при открытии файла используется младший номер, к которому привязан файл. – Tsyvarev

Смежные вопросы