Здраствуйте!
Суть моего вопроса в следующем: как реализовать поддержку драйвером нескольких экземпляров (идентичных) устройства.
Вот примерная структура функции инициализации.
Обе платы обнаруживаются, ресурсы доступны но что делать дальше?(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 blockmajor = 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
Заранее благодарен.
отвечу так... www.lcard.ru там в библиотеке файлов есть lcomp_linux.tgz, это драйвера pci и usb устройств, там найдеться ответ на этот вопрос. Писал их я и если что непонятно то можно спросить ....
Огромное спасибо!!! Это то что нужно. Нормально структурированный и легко читаемый код! Тем более, что железки функционально похожи на мою.
Возник вопрос. Плата исп. DMA. Т.е. я должен зарезервировать 16Мб для каждого устройства и записать физ. адрес в плату. Я так понял что зарезервировать такой большой объем памяти, достаточно сложно. И воспользовался простым путем - передал ядру при загрузке ограничение по используемой памяти (mem=2000) и по этому адресу "в лоб" зарезервировал. Вопрос в том как это сделать более корректно. А еще лучший вариант - выделение памяти из user space, чтобы не использовать промежуточный буффер в драйвере.Еще раз спасибо. Очень выручили.
>Огромное спасибо!!! Это то что нужно. Нормально структурированный и легко читаемый код!
>Тем более, что железки функционально похожи на мою.
>Возник вопрос. Плата исп. DMA. Т.е. я должен зарезервировать 16Мб для каждого
>устройства и записать физ. адрес в плату. Я так понял что
>зарезервировать такой большой объем памяти, достаточно сложно. И воспользовался простым путем
>- передал ядру при загрузке ограничение по используемой памяти (mem=2000) и
>по этому адресу "в лоб" зарезервировал. Вопрос в том как это
>сделать более корректно.Мне кажется что вполне корректно было бы использовать
__get_free_pages() для выделения диапазона физических адресов, ну а потом при необходимости отмапить на user space (mmap() на ваше /dev/device)
А еще лучший вариант - выделение памяти из
>user space, чтобы не использовать промежуточный буффер в драйвере.Никакого промежуточного буфера не будет
Там это тоже есть, один из драйверов работает по BusMaster... выделяет память и строит список страниц.... Но если просто DMA, то смотрите LDD 3 и его примеры. А буфер из драйвера можно замапить прямо в userspace, что у меня там и делается....
Все! Разобрался со всеми вопросами. Все работает. Спасибо!