The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Поддержку драйвером нескольких экземпляров устройства."
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"Поддержку драйвером нескольких экземпляров устройства."  
Сообщение от alexB (ok) on 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

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

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


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

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

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


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

5. "Поддержку драйвером нескольких экземпляров устройства."  
Сообщение от alexB (ok) on 24-Апр-08, 20:20 
Все! Разобрался со всеми вопросами. Все работает. Спасибо!
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру