Довольно простой тест (на наличие PCI)

Модератор: Модераторы разделов

asuprok
Сообщения: 15

Довольно простой тест

Сообщение asuprok »

Написал вот довольно постую программку, да откомпилить не получается. Помогите советом, пожалуйста, где что-то не то.

Код: Выделить всё

#include <linux/config.h>
#include <linux/pci.h>

int main (void)
 {
        if (! pci_present ())
     {
                printf ("No pci device present\n");
                return -1;
         }

        else  printf ("Pci device were found\n");

        return 0;
}

Пробую компилировать.

Код: Выделить всё

# gcc -O2 -Wall test.c -o test

Получаю сообщение.

Код: Выделить всё

test_pci.c: In function `main':
test.c:6: warning: implicit declaration of function `pci_present'
test.c:8: warning: implicit declaration of function `printf'
/tmp/cc6sNhvX.o(.text+0xa): In function `main':
: undefined reference to `pci_present'
collect2: ld returned 1 exit status
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Довольно простой тест

Сообщение elide »

а где ты вообще откопал эту pci_present ?? :g:
слава роботам!
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Довольно простой тест

Сообщение serzh-z »

Функция pci_present была удалена из ядра пару лет назад.
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: Довольно простой тест

Сообщение d_Sun »

Ну и printf без stdio врядли заработает :)
Моя подпись сильно длинная :)
Спасибо сказали:
asuprok
Сообщения: 15

Re: Довольно простой тест

Сообщение asuprok »

serzh-z писал(а):
04.04.2006 12:21
Функция pci_present была удалена из ядра пару лет назад.

Но такое сообщение выводится и на остальные вызовы pci_*. Пробовал pci_find_device(), pci_get_device(), PCI_ANY_ID вообще не определен. Может какой файл не подключил или опцию компилятора?
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Довольно простой тест

Сообщение serzh-z »

asuprok
Попадалась инфа о том (в какой-то рассылке - сообщение от имени Кроа-Хартмана), что данные вызовы были помечены как устаревшие и были перемещены куда-то в pci/что-то.c.
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: Довольно простой тест

Сообщение d_Sun »

Как вариант курите сырцы pciutils.
Моя подпись сильно длинная :)
Спасибо сказали:
asuprok
Сообщения: 15

Re: Довольно простой тест

Сообщение asuprok »

serzh-z писал(а):
04.04.2006 17:13
asuprok
Попадалась инфа о том (в какой-то рассылке - сообщение от имени Кроа-Хартмана), что данные вызовы были помечены как устаревшие и были перемещены куда-то в pci/что-то.c.

А как быть, если нужно сделать драйвер PCI-устройства. Есть замена этим вызовам? В документации по ядру есть файл pci.txt, в котором данные вызовы описаны и нет упоминания о том, что они устарели.
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Довольно простой тест

Сообщение serzh-z »

asuprok писал(а):
04.04.2006 17:41
А как быть, если нужно сделать драйвер PCI-устройства. Есть замена этим вызовам? В документации по ядру есть файл pci.txt, в котором данные вызовы описаны и нет упоминания о том, что они устарели.


Нэ знаю. См. http://www.google.com/search?hl=en&lr=&q=l...ent&btnG=Search
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Довольно простой тест

Сообщение elide »

В документации по ядру есть файл pci.txt, в котором данные вызовы описаны и нет упоминания о том, что они устарели.
хм.....

Код: Выделить всё

elide@rebirth| /usr/src/linux/Documentation >> tail  -n25 pci.txt


8. Obsolete functions
~~~~~~~~~~~~~~~~~~~~~
There are several functions which you might come across when trying to
port an old driver to the new PCI interface.  They are no longer present
in the kernel as they aren't compatible with hotplug or PCI domains or
having sane locking.

pcibios_present() and           Since ages, you don't need to test presence
pci_present()                   of PCI subsystem when trying to talk to it.
                                If it's not there, the list of PCI devices
                                is empty and all functions for searching for
                                devices just return NULL.
pcibios_(read|write)_*          Superseded by their pci_(read|write)_*
                                counterparts.
pcibios_find_*                  Superseded by their pci_get_* counterparts.
pci_for_each_dev()              Superseded by pci_get_device()
pci_for_each_dev_reverse()      Superseded by pci_find_device_reverse()
pci_for_each_bus()              Superseded by pci_find_next_bus()
pci_find_device()               Superseded by pci_get_device()
pci_find_subsys()               Superseded by pci_get_subsys()
pcibios_find_class()            Superseded by pci_get_class()
pci_find_class()                Superseded by pci_get_class()
pci_(read|write)_*_nodev()      Superseded by pci_bus_(read|write)_*()
elide@rebirth| /usr/src/linux/Documentation >>
если это называется "нет упоминания о том, что они устарели", то за отдельную плату я могу показать, где находится Та Самая Стена.
слава роботам!
Спасибо сказали:
asuprok
Сообщения: 15

Re: Довольно простой тест

Сообщение asuprok »

Elide!
Я пробовал и pci_get_device(). Результат такой же.
Если это называется "нет упоминания о том, что они устарели", то за отдельную плату я могу показать, где находится Та Самая Стена.

Объяви эту самую плату и я подумаю.
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: Довольно простой тест

Сообщение oav »

asuprok писал(а):
06.04.2006 12:12
Elide!
Я пробовал и pci_get_device(). Результат такой же.
Если это называется "нет упоминания о том, что они устарели", то за отдельную плату я могу показать, где находится Та Самая Стена.

Объяви эту самую плату и я подумаю.

+1
5 баллов!! :)))

а то крутые все такие, жуть прям :ph34r:
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Довольно простой тест

Сообщение elide »

крутые все такие, жуть прям
да не. мы не крутые. мы - нормальные. это вот отдельные персонажи немного не догоняют....
Я пробовал и pci_get_device(). Результат такой же.
о боги!
такой же результат, это, как я понимаю, undefined reference to `pci_****' ???
А как быть, если нужно сделать драйвер PCI-устройства
а-а-а-а!!!! вот оно!!! ключевое слово! драйвер!
а-то как же... undefined reference, ага....
ты бы еще попробовал printk вызывать из юзерспейса!

Код: Выделить всё

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/pci.h>

int init_module (void) {
    printk (KERN_INFO "PCI enumeration test\n\n");

    int count = 0;
    struct pci_dev *dev = NULL;

    while ((dev = pci_get_device (PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL){
        count++;
        #ifdef CONFIG_PCI_NAMES
        printk(KERN_INFO "device #%.2d %.4X:%.4X:%X '%s'\n", count, dev->vendor, dev->device, dev->class, dev->pretty_name);
        #else
        printk(KERN_INFO "device #%.2d %.4X:%.4X:%X\n", count, dev->vendor, dev->device, dev->class);
        #endif
    }

    return -ECANCELED;
}
вот вам код.
кто желает - может медитировать над ним до просветления.
но лучше собрать его модулем, загрузить в ядро, перечитать /var/log/messages и возвращаться ко мне.
так уж и быть, как жертвам Великой Мировой Несправедливости, дорогу до Той Самой Стены расскажу бесплатно.
слава роботам!
Спасибо сказали:
asuprok
Сообщения: 15

Re: Довольно простой тест

Сообщение asuprok »

да не. мы не крутые. мы - нормальные. это вот отдельные персонажи немного не догоняют....

Никто и не сомневался в вашей нормальности. И я писал это сообщение потому, что действительно есть проблема и нужно ее решить. Думал для этого форум и существует. А он, оказывается, только для нормальных. Спасибо, учту. Только, думаю, начинали Вы так же как и я: с ошибок и в чем-то глупых вопросов.
вот вам код.
кто желает - может медитировать над ним до просветления.

За код огромное спасибо. Но вполне хватило бы одной фразы о драйвере и стало бы все в порядке. А как быть, если необходимо все это сделать обычным приложением? Просветите, если не надоел еще.
Спасибо сказали:
Аватара пользователя
edoc_modnar
Бывший модератор
Сообщения: 1638
Статус: Форум больше не посещаю

Re: Довольно простой тест

Сообщение edoc_modnar »

asuprok
Для опознавания pci-устройств из юзерспейса есть sysfs, откуда данные выдираются обычным fread() :)
См. /sys/bus/pci/devices/ и sysfs.txt в Documentation к ядру.
So long, and thanks for all the fish.
Douglas Adams, The Hitchhiker's Guide to the Galaxy
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Довольно простой тест

Сообщение elide »

думаю, начинали Вы так же как и я: с ошибок и в чем-то глупых вопросов
возможно и начал бы именно так, будь у меня такая возможность... но когда я начинал, инета у меня не было, а с единственным знакомым, который был "в теме", мы очень редко пересекались. поэтому я с самого начала учился добывать информацию самостоятельно. ну это так... к слову...
но даже когда появился инет и я начал задавать вопросы, я никогда не игнорировал ответы на свой же вопрос.
ведь d_Sun еще в самом начале темы дал крайне правильный и исчерпывающий совет
курите сырцы pciutils.
если бы Вы последовали этому несомненно разумному совету, то все остальные вопросы исчезли бы сами собой.
это даже не говоря о том, что про вывод инфы в юзерспейс через /proc можно узнать даже при беглом просмотре сырцов ядра.

random_code
ну sysfs довольно недавно появилась, а вот через procfs информация выдавливалась сколько я помню линукс.
pciutils, кстати, именно через /proc и работают. хотя sysfs должна быть, наверное, удобнее - не пробовал.
слава роботам!
Спасибо сказали:
asuprok
Сообщения: 15

Re: Довольно простой тест

Сообщение asuprok »

Спасибо всем!!! Все заработало так как нужно. Буду упражняться далее.
Спасибо сказали: