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

Исходное сообщение
"Как записывать данные, используя драйвер PCI?"

Отправлено Гвоздик , 28-Июн-06 13:25 
Имеется PCI-плата с адресом 0х200. Требуется записывать туда данные (16 бит). Как это можно сделать в Линукс? Скачал драйвер с www.fpga4fun.com, однако там ничего не сказано, как этот драйвер использовать (писать через него данные в порт 0х200). Драйвер загружается insmod'ом. Исходник привожу ниже. Помогите, пожалуйста, кто знает.
#include <linux/init.h>
#include <linux/pci.h>
MODULE_LICENSE("GPL");

#define VENDOR_ID 0x1000
#define DEVICE_ID 0x0000

static struct pci_device_id  pci_device_id_DevicePCI[] =
{
  {VENDOR_ID, DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
  {}  // end of list
};

int device_probe(struct pci_dev *dev, const struct pci_device_id *id)
{
  int ret;
  ret = pci_enable_device(dev);
  if (ret < 0)
  {
    printk(KERN_WARNING "DevicePCI: unable to initialize PCI device\n");
    return ret;
  }

  ret = pci_request_regions(dev, "MyPCIDevice");
  if (ret < 0)
  {
    printk(KERN_WARNING "DevicePCI: unable to reserve PCI resources\n");
    pci_disable_device(dev);
    return ret;
  }

  printk(KERN_INFO "DevicePCI: device_probe successful\n");
  return ret;
}

void device_remove(struct pci_dev *dev)
{
  pci_release_regions(dev);
  pci_disable_device(dev);
  printk(KERN_INFO "DevicePCI: device removed\n");
}

struct pci_driver  pci_driver_DevicePCI =
{
  name: "MyPCIDevice",
  id_table: pci_device_id_DevicePCI,
  probe: device_probe,
  remove: device_remove
};

static int init_module_DevicePCI(void)
{
  printk(KERN_INFO "DevicePCI: init\n");
  return pci_module_init(&pci_driver_DevicePCI);
}

void cleanup_module_DevicePCI(void)
{
  printk(KERN_INFO "DevicePCI: cleanup\n");
  pci_unregister_driver(&pci_driver_DevicePCI);
}

module_init(init_module_DevicePCI);
module_exit(cleanup_module_DevicePCI);


Содержание

Сообщения в этом обсуждении
"Как записывать данные, используя драйвер PCI?"
Отправлено vic , 28-Июн-06 13:48 
>Имеется PCI-плата с адресом 0х200. Требуется записывать туда данные (16 бит). Как
>это можно сделать в Линукс?

man pcitweak
Утилита имеет режим записи, сам не пробовал, но может поможет.


"Как записывать данные, используя драйвер PCI?"
Отправлено Гвоздик , 28-Июн-06 15:51 
Спасибо за помощь, только эта утилита записывает в конфигурационное пространство PCI-платы, а необходимо сами данные засылать на плату.



"Как записывать данные, используя драйвер PCI?"
Отправлено komodo , 29-Июн-06 10:41 

Вобщето, надо писать просто в порт, а какая плата( PCI, ISA, etc ) не имеет значения(если она сконфигурирована как PnPdev или  при POS-тесте, что вероятнее всего произошло...)



"Как записывать данные, используя драйвер PCI?"
Отправлено sighted , 31-Июл-06 13:15 
>Вобщето, надо писать просто в порт, а какая плата( PCI, ISA, etc
>) не имеет значения(если она сконфигурирована как PnPdev или  при
>POS-тесте, что вероятнее всего произошло...)
Если я всё правильно понял, то вам надо получить доступ к портам ввода\вывода.
В структуре struct pci_dev есть структуры под названиями:
        struct resource resource[DEVICE_COUNT_RESOURCE]; /* I/O and memory regions + expansion ROMs */
        struct resource dma_resource[DEVICE_COUNT_DMA];
        struct resource irq_resource[DEVICE_COUNT_IRQ];
В данной структурах хранятся все найденные порты ввода\вывода, поддерживаемые прерывания и т.п.
если вы работаете на архитектуре x86, то, если не ошибаюсь, можно работать прямо по портам, указанным в структуре resources. Иначе надо их смапировать с помощью функции ioremap.
Работать по портам надо так же, как с указателями на память. Значения - не более чем адреса в пространстве ввода\вывода



"Как записывать данные, используя драйвер PCI?"
Отправлено sighted , 31-Июл-06 13:18 
>>Вобщето, надо писать просто в порт, а какая плата( PCI, ISA, etc
>>) не имеет значения(если она сконфигурирована как PnPdev или  при
>>POS-тесте, что вероятнее всего произошло...)
>Если я всё правильно понял, то вам надо получить доступ к портам
>ввода\вывода.
>В структуре struct pci_dev есть структуры под названиями:
>        struct resource resource[DEVICE_COUNT_RESOURCE]; /*
>I/O and memory regions + expansion ROMs */
>        struct resource dma_resource[DEVICE_COUNT_DMA];
>        struct resource irq_resource[DEVICE_COUNT_IRQ];
>В данной структурах хранятся все найденные порты ввода\вывода, поддерживаемые прерывания и т.п.
>
>если вы работаете на архитектуре x86, то, если не ошибаюсь, можно работать
>прямо по портам, указанным в структуре resources. Иначе надо их смапировать
>с помощью функции ioremap.
>Работать по портам надо так же, как с указателями на память. Значения
>- не более чем адреса в пространстве ввода\вывода
А вообще для записи по портам существуют функции типа:
#define outb(val, addr)
#define outw(val, addr)
#define outl(val, addr)

#define outb_p(val, addr)
#define outw_p(val, addr)
#define outl_p(val, addr)


#define inb(addr)
#define inw(addr)
#define inl(addr)

#define inb_p(addr)
#define inw_p(addr)
#define inl_p(addr)