Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как запустить драйвер для PCI под Линукс?
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы
Гвоздик
Здравствуйте. Имеется отладочная плата с адресом 0х200 на шине PCI. В ДОСе она данные хватает исправно, а как запмсать в нее в Линуксе? Исходник драйвера скачал с www.fpga4fun.com, однако там ничего не сказано, как этот драйвер использовать для записи данных. Помогите, пожалуйста, кто знает. Исходник драйвера привожу:

#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);
makc
В такой драйвер ничего записать не получится. Это даже не драйвер в общем смысле, а лишь его каркас, используя который можно попробовать найти устройство и подготовиться ядро ОС к работе с ним.

Но Вы можете из самого драйвера с помощью функций inb/inw/outb/outw и им подобных сделать запись/чтения данных в устройство.
Гвоздик
Спасибо за помощь. Однако как можно записывать с ПК на шину PCI? Просто необходимо, чтобы пользователь отправлял эти данные на шину. Возможно это сделать вообще?
makc
Цитата(Гвоздик @ Jun 28 2006, 15:09) *
Спасибо за помощь. Однако как можно записывать с ПК на шину PCI? Просто необходимо, чтобы пользователь отправлял эти данные на шину. Возможно это сделать вообще?


Сама по себе запить данных на шину PCI имеет мало смысла, т.к. шина - это лишь средство передачи данных в целевое устройство (и чтения из него). Целевое устройство у Вас есть, остается лишь обнаружить его и выполнить команды записи данных по адресам, в которых располагаются регистры/память Вашего устройства на шине PCI.

Если перейти к Linux, то тут есть два пути:
1. Писать драйвер, который возьмет на себя низкоуроневый протокол общения с устройством. В этом случае для пользователей драйвер должен предоставлять некий интерфейс (символ- или блок-ориентированных файл в /dev), через который пользовательское ПО сможет передать в драйвер данные для их последующей записи в устройство.
2. Имея привелегии root можно напрямую осущестлять чтение/запись данных в устройство, параметры которого можно определить через libpci. Для получения доступа к операциям записи в порты (пространство ввода/вывода) - man ioperm, если нужна запись в определенные физические адреса памяти - man memmap и /dev/mem.
K!V
Цитата(makc @ Jun 28 2006, 20:43) *
... драйвер должен предоставлять некий интерфейс (символ- или блок-ориентированных файл в /dev) ....


А возможно это будет сетевой интерфейс. Вообще раз уж задают такие вопросы надо отсылать к Linux Device Drivers, Third Edition как минимум Chapter 1: An Introduction to Device Drivers.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.