Linux get pci devices

Linux get pci devices

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux

Цилюрик О.И. Модули ядра Linux
Назад Обслуживание периферийных устройств Вперед

Устройства на шине PCI

Архитектура PCI была разработана в качестве замены стандарту ISA с тремя основными целями: получить лучшую производительность при передаче данных между компьютером и его периферией, быть независимой от платформы, насколько это возможно, и упростить добавление и удаление периферийных устройств в системе. В настоящее время PCI широко используется в разных архитектурах: IA-32 / IA-64, Alpha, PowerPC, SPARC64 . Самой актуальной для автора драйвера является поддержка PCI автоопределения интерфейса плат: PCI устройства настраивается автоматически во время загрузки. Затем драйвер устройства получает доступ к информации о конфигурации устройства, и производит инициализацию. Это происходит без необходимости совершать какое-либо тестирование.

Каждое периферийное устройство PCI идентифицируется по подключению такими физическими параметрами, как: номер шины, номер устройства и номер функции. Linux дополнительно вводит и поддерживает такое логическое понятие как домен PCI. Каждый домен PCI может содержать до 256 шин. Каждая шина содержит до 32 устройств, каждое устройство может быть многофункциональным и поддерживать до 8 функций. В конечном итоге, каждая функция может быть однозначно идентифицирована на аппаратном уровне 16-ти разрядным ключом. Однако, драйверам устройств в Linux, не требуется иметь дело с этими двоичными ключами, потому что они используют для работы с устройствами специальную структуру данных pci_dev .

Примечание: Часто то, что мы житейски и физически (плата PCI) понимаем как устройство, в этой системе терминологически правильно называется: функция, устройство же может содержать до 8-ми эквивалентных (по своим возможностям) функций.

Адресацию PCI устройств в своей Linux системе смотрим:

Другое представление той же информации (тот же хост) можем получить так:

Здесь отчётливо видно (слева) поля, например для контроллера VGA: 0000:00:02.0 — выделены домен (16 бит), шина (8 бит), устройство (5 бит) и функция (3 бита). Поэтому, когда мы говорим об устройстве (далее), мы имеем в виду набор: номера домена + номер шины + номер устройства + номер функции.

С другой стороны, каждое устройство по типу идентифицируется двумя индексами: индекс производителя (Vendor ID) и индекс типа устройства (Device ID). Эта пара однозначно идентифицирует тип устройства. Использование 2-х основных идентификаторов устройств PCI (Vendor ID + Device ID) глобально регламентировано, и их актуальный перечень поддерживается в файле pci.ids , последнюю по времени копию которого можно найти в нескольких местах интернет, например по URL: http://pciids.sourceforge.net/ . Эти два параметра являются уникальным (среди всех устройств в мире) ключом поиска устройств, установленных на шине PCI. Для поиска (перебора устройств, установленных на шине PCI) в программном коде модуля в цикле используется итератор:

— где from — это NULL при начале поиска (или возобновлении поиска с начала), или указатель устройства, найденного на предыдущем шаге поиска. Если в качестве Vendor ID и/или Device ID указана константа PCI_ANY_ID=-1 , то предполагается выбор всех доступных устройств с таким идентификатором. Если искомое устройство не найдено (или больше таких устройств не находится в цикле), то очередной вызов возвратит NULL . Если возвращаемое значение не NULL , то возвращается указатель структуры описывающей устройство, и счётчик использования для устройства инкрементируется. Когда устройство удаляется (модуль выгружается) для декремента этого счётчика использования необходимо вызвать:

Читайте также:  Realtek rtl8822be драйвер windows 10

После нахождения устройства, но прежде начала его использования необходимо разрешить использование устройства вызовом: pci_enable_device( struct pci_dev *dev) , часто это выполняется в функции инициализации устройства: поле probe структуры struct pci_driver (см. далее), но может выполняться и автономно в коде драйвера.

Каждое найденное устройство имеет своё пространство конфигурации, значения которого заполнены программами BIOS (или PnP OS, или BSP) — важно, что на момент загрузки модуля эта конфигурационное пространство всегда заполнено, и может только читаться (не записываться). Пространство конфигурации PCI устройства состоит из 256 байт для каждой функции устройства (для устройств PCI Express расширено до 4 Кб конфигурационного пространства для каждой функции) и стандартизированную схему регистров конфигурации. Четыре начальных байта конфигурационного пространства должны содержать уникальный ID функции (байты 0-1 — Vendor ID, байты 2-3 — Device ID), по которому драйвер идентифицирует своё устройство. Вот для сравнения начальные строки вывода команды для того же хоста (видно, через двоеточие, пары: Vendor ID — Device ID):

Первые 64 байт конфигурационной области стандартизованы, остальные зависят от устройства. Самыми актуальными для нас являются (кроме ID описанного выше) поля по смещению:

Вся регистрация устройства PCI и связывание его параметров с кодом модуля происходит исключительно через значения, считанные из конфигурационного пространства устройства. Обработку конфигурационной информации (уже сформированной при установке PCI устройства) показывает модуль (архив pci.tgz ) lab2_pci.ko (заимствовано из [6]):

Небольшой фрагмент результата выполнения этого модуля:

$ sudo insmod lab2_pci.ko

$ lsmod | grep lab

$ dmesg | tail -n221 | head -n30

$ sudo rmmod lab2_pci

$ lsmod | grep lab2

Для использования некоторой группы устройства PCI, код модуля определяет массив описания устройств, обслуживаемых этим модулем. Каждому новому устройству в этом списке соответствует новый элемент. Последний элемент массива всегда нулевой, это и есть признак завершения списка устройств. Строки такого массива заполняются макросом PCI_DEVICE :

Созданная структура pci_device_id должна быть экспортирована в пользовательское пространство, чтобы позволить системам горячего подключения и загрузки модулей знать, с какими устройствами работает данный модуль. Эту задачу решает макрос MODULE_DEVICE_TABLE :

Кроме доступа к области конфигурационных параметров, программный код может получить доступ к областям ввода-вывода и регионов памяти, ассоциированных с PCI устройством. Таких областей ввода-вывода может быть до 6-ти (см. формат области конфигурационных параметров выше), они индексируются значением от 0 до 5. Параметры этих регионов получаются функциями:

— где bar во всех вызовах — это индекс региона: 0 . 5. Первые 2 вызова возвращают начальный и конечный адрес региона ввода-вывода ( pci_resource_end() возвращает последний используемый регионом адрес, а не первый адрес, следующий после этого региона.), следующий вызов — его размер, и последний — флаги. Полученные таким образом адреса областей ввода/вывода от устройства — это адреса на шине обмена (адреса шины, для некоторых архитектур — x86 из числа таких — они совпадают с физическими адресами памяти). Для использования в коде модуля они должны быть отображены в виртуальные адреса (логические), в которые отображаются страницы RAM посредством устройства управления памятью (MMU). Кроме того, в отличие от обычной памяти, часто эти области ввода/вывода не должны кэшироваться процессором и доступ не может быть оптимизирован. Доступ к памяти таких областей должен быть отмечен как «без упреждающей выборки». Всё, что относится к отображению памяти будет рассмотрено отдельно далее, в следующем разделе. Флаги PCI региона ( pci_resource_flags() ) определены в
; некоторые из них:

Читайте также:  При попытке установить windows выключается

IORESOURCE_IO, IORESOURCE_MEM — только один из этих флагов может быть установлен.

IORESOURCE_PREFETCH — определяет, допустима ли для региона упреждающая выборка.

IORESOURCE_READONLY — определяет, является ли регион памяти защищённым от записи.

Основной структурой, которую должны создать все драйверы PCI для того, чтобы быть правильно зарегистрированными в ядре, является структура (
):

  • name — имя драйвера, оно должно быть уникальным среди всех PCI драйверов в ядре, обычно устанавливается таким же, как и имя модуля драйвера, когда драйвер загружен в ядре, это имя появляется в /sys/bus/pci/drivers/ ;
  • id_table — только что описанный массив записей pci_device_id ;
  • probe — функция обратного вызова инициализации устройства; в функции probe драйвера PCI, прежде чем драйвер сможет получить доступ к любому ресурсу устройства (область ввода/вывода или прерывание) данного PCI устройства, драйвер должен, как минимум, вызвать функцию :
  • remove — функция обратного вызова удаления устройства;
  • . и другие функции обратного вызова.

Обычно для создания правильную структуру struct pci_driver достаточно бывает определить, как минимум, поля :

Теперь устройство может быть зарегистрировано в ядре:

— вызов возвращает 0 если регистрация устройства прошла успешно.

При завершении (выгрузке) модуля выполняется обратная операция:

Источник

  • ru
  • HowToIdentifyADevice
  • PCI

?Discussion

Определения подключённых к компьютеру PCI-подобных устройств (AGP, PCI-Express, CardBus, Express Card, и т.д).

Большинство людей, для вывода списка устройств на компьютере используют lspci, которая доступна на каждой системы Debian. Пользователи Gnome могут установить и использовать hardinfo. Пользователи KDE могут использовать kinfocenter.

PCI-id

В основном устройства определяются с помощью пары шестнадцатеричных чисел, наподобие 1014:003E.

  • Первые четыре шестнадцатеричные цифры это Vendor ID (1014 = IBM)
  • Четыре последние шестнадцатеричные цифры это Device ID (003e = 16/4 Token ring)

На самом деле также есть несколько sub-vendor-id, sub-vendor-id (для определения реализации компьютера/поставщика), функций и классов pci. Для получения дополнительной информации см. дополнительную информацию.

Некоторые из поддерживаемых Debian устройств (device-id) перечислены на странице : DeviceDatabase/PCI.

lspci

lspci [пакет:pciutils] — стандартный инструмент для запроса устройств подключённых к любым pci-совместимым шинам.

Пример вывода (опция «-nn» работает только с новыми версиями Linux):

Заметки по поводу приведенного выше примера :

  • 104c:ac56 — мост («контроллер») cardbus
  • 1317:1985 — интернет-адаптер PCCard (32-bit Cardbus).

если вывод описания устройства: «Unknown device», вы можете обновить локальное определение pci-id, запустив от root update-pciids.

man (8)lspci (8)update-pciids
/usr/share/misc/pci.ids — Файл отображающий vendor ID и device ID в текстовом виде.

Чтобы сократить список можно использовать grep:

В Gnome : hardinfo

Информационная система Gnome (в меню /Приложения/Системные/System Profiler and Benchmark, из пакета:hardinfo) на странице «PCI Devices».

В KDE : KInfocenter

KDE KInfo Center (в K Menu / System / KInfo Center Info Center, из пакета:kcontrol) имеет информационную страницу на «PCI».


Примечание: KInfo Center выводит названия устройств PCI, а не PCI ID.

discover

В пакете discover есть удобная команда:

man discover(1)
Файлы по использованию: /lib/discover/pci-busclass.xml, /lib/discover/pci-device.xml, /lib/discover/pci-vendor.xml

Подробнее

/proc/bus/pci/devices

Если lspci не доступен (!), вы можно посмотреть содержимое /proc/bus/pci/devices для получения vendor и device ID.

/sys/bus/pci

Если lspci не доступен (!), вы можете посмотреть /sys/bus/pci (предполагается что sysfs смонтирован в /sys).

Источник

How to Use Linux to Find the Names of the Devices on Your Computer

Try these commands to show devices on your computer

Listing the devices, drives, PCI devices, and USB devices on your computer involves a series of commands easily invoked from a shell prompt in Linux.

Use the ‘mount’ Command

The most simple syntax you can use is as follows:

The output from the above command is fairly verbose and will be something like this:

Hard drives generally start with /dev/sda or /dev/sdb, so use the grep command to reduce the output as follows:

The results show something like this:

This doesn’t list your drives but it does list your mounted partitions. It doesn’t list partitions that aren’t yet mounted.

The device /dev/sda usually stands for the first hard drive on your system, and if you have a second hard drive, then it will be mounted to /dev/sdb. If you have an SSD, then this will likely be mapped to /dev/sda and the hard drive mapped to /dev/sdb.

Use ‘lsblk’ to List Block Devices

Mount is fine for listing mounted devices, but it doesn’t show every device you have, and the output is verbose, making it difficult to read.

The best way to list the drives in Linux is to use lsblk as follows:

The information displays in a tree format with the following information:

  • Name
  • Major Minor device number
  • Is it removable
  • Size
  • Is it read-only
  • Is it a disk or a partition
  • Where is the partition mounted

The display looks something like this:

The information is easier to read. It displays one drive called sda, which offers 50 G of storage. It splits into one partition, called sda1.

The drives fd0 (floppy) and sr0 (CD-ROM) appear in this listing. The particular machine this listing drew from, called mint-vm, is a Linux Mint virtual machine running in the Hyper-V system on a Windows 10 computer. Hyper-V provisions a virtual floppy and CD-ROM drive by default.

How to List PCI Devices

To list the PCI devices use the lspci command as follows:

The output from the above command is verbose, meaning you probably get more information than you need.

Here’s a short snapshot as an example:

The listing lists devices, including VGA controllers, USB controllers, sound, Bluetooth, wireless, and Ethernet controllers.

The standard lspci listing is considered basic, and if you want more detailed information about each device, run the following command:

The information for each device looks something like this:

The output from the lspci -v command is more readable.

You can get even more verbose output by using the following command:

If that isn’t enough information, try the following:

The most useful aspect of lspci, other than listing devices, is the kernel driver used for that device. If the device isn’t working, it is worth researching whether there is a better driver available for the device.

List the USB Devices Attached to the Computer

To list the USB devices available for your computer, use the following command:

The output will be something like this:

If you insert a USB device into the computer, such as an external hard drive, and then run the lsusb command, the device appears on the list.

Summary

The best way to list anything in Linux is to remember the following ls commands:

Источник

Читайте также:  Где находится интерпретатор python windows
Оцените статью