URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7315
[ Назад ]

Исходное сообщение
"Поддержку драйвером нескольких экземпляров устройства."

Отправлено alexB , 14-Апр-08 19:37 
Здраствуйте!
Суть моего вопроса в следующем: как реализовать поддержку драйвером нескольких экземпляров (идентичных) устройства.
Вот примерная структура функции инициализации.
Обе платы обнаруживаются, ресурсы доступны но что делать дальше?

(Debian Etch, 2.6.20)

static int __devinit probe_xdsp(struct pci_dev *pcidev, const struct pci_device_id *pci_id)
{

  if(!(pcard = kmalloc(sizeof(struct xdsp_dev), GFP_KERNEL)))
    {
    ....
    }

  ....
  if ((ret=pci_enable_device(pcidev)))
  {
    ....
  }
  ....
  if((pci_request_regions(pcidev, "xdsp")) == 0)
  {
    ....
  }
  ....
  if (request_irq(pcidev->irq, &xdsp_interrupt, SA_INTERRUPT, "xdsp", pcard))
  {
    ....
    }
  ....
  pcard->irq = pcidev->irq;
  pcard->io = pci_resource_start(pcidev, 0);
    ....
  
  // DMA block
  memBlock = ioremap(0x7d800000, 0x2800000);
  memset(memBlock, 0x0, 0x2800000);
  //end of DMA block

  major = register_chrdev(251, "/dev/xdsp1", &xdsp_fops);
  if(major < 0) {pcard->devNumber = 1; ....}
  major = register_chrdev(251, "/dev/xdsp2", &xdsp_fops);
  if(major < 0) {pcard->devNumber = 2; ....}

  
  pci_set_drvdata(pcidev, pcard);
  return 0;
}

modprobe xdsp

Заранее благодарен.


Содержание

Сообщения в этом обсуждении
"Поддержку драйвером нескольких экземпляров устройства."
Отправлено poulch , 16-Апр-08 13:39 
отвечу так... www.lcard.ru там в библиотеке файлов есть lcomp_linux.tgz, это драйвера pci и usb устройств, там найдеться ответ на этот вопрос. Писал их я и если что непонятно то можно спросить ....

"Поддержку драйвером нескольких экземпляров устройства."
Отправлено alexB , 16-Апр-08 21:30 
Огромное спасибо!!! Это то что нужно. Нормально структурированный и легко читаемый код! Тем более, что железки функционально похожи на мою.
Возник вопрос. Плата исп. DMA. Т.е. я должен зарезервировать 16Мб для каждого устройства и записать физ. адрес в плату. Я так понял что зарезервировать такой большой объем памяти, достаточно сложно. И воспользовался простым путем - передал ядру при загрузке ограничение по используемой памяти (mem=2000) и по этому адресу "в лоб" зарезервировал. Вопрос в том как это сделать более корректно. А еще лучший вариант - выделение памяти из user space, чтобы не использовать промежуточный буффер в драйвере.

Еще раз спасибо. Очень выручили.


"Поддержку драйвером нескольких экземпляров устройства."
Отправлено int_0dh , 16-Апр-08 22:37 
>Огромное спасибо!!! Это то что нужно. Нормально структурированный и легко читаемый код!
>Тем более, что железки функционально похожи на мою.
>Возник вопрос. Плата исп. DMA. Т.е. я должен зарезервировать 16Мб для каждого
>устройства и записать физ. адрес в плату. Я так понял что
>зарезервировать такой большой объем памяти, достаточно сложно. И воспользовался простым путем
>- передал ядру при загрузке ограничение по используемой памяти (mem=2000) и
>по этому адресу "в лоб" зарезервировал. Вопрос в том как это
>сделать более корректно.

Мне кажется что вполне корректно было бы использовать
__get_free_pages() для выделения диапазона физических адресов, ну а потом при необходимости отмапить на user space (mmap() на ваше /dev/device)
А еще лучший вариант - выделение памяти из
>user space, чтобы не использовать промежуточный буффер в драйвере.

Никакого промежуточного буфера не будет



"Поддержку драйвером нескольких экземпляров устройства."
Отправлено poulch , 17-Апр-08 14:06 
Там это тоже есть, один из драйверов работает по BusMaster... выделяет память и строит список страниц.... Но если просто DMA, то смотрите LDD 3 и его примеры. А буфер из драйвера можно замапить прямо в userspace, что у меня там и делается....

"Поддержку драйвером нескольких экземпляров устройства."
Отправлено alexB , 24-Апр-08 20:20 
Все! Разобрался со всеми вопросами. Все работает. Спасибо!