Имеется 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 0x0000static 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-плата с адресом 0х200. Требуется записывать туда данные (16 бит). Как
>это можно сделать в Линукс?man pcitweak
Утилита имеет режим записи, сам не пробовал, но может поможет.
Спасибо за помощь, только эта утилита записывает в конфигурационное пространство PCI-платы, а необходимо сами данные засылать на плату.
Вобщето, надо писать просто в порт, а какая плата( PCI, ISA, etc ) не имеет значения(если она сконфигурирована как PnPdev или при POS-тесте, что вероятнее всего произошло...)
>Вобщето, надо писать просто в порт, а какая плата( 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, 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)