Linux узнать vendor id

Programmatically obtaining the vendor ID, product ID of a USB device on a Linux platform

I have been trying to write a simple device driver, in which I am suppossed to get the Vendor ID and Product ID programmatically. Having gone through almost all the necessary header files, I have come to a conclusion that I can access the vendor ID, product ID, and manufacturer details of the USB device through a structure: struct usb_device<> which has a member struct usb_device_descriptor<> . This nested structure has idVendor, idProduct and iManufacturer and some other members. But somehow, for some reason I am unable to access these members, so when I do a dmesg after inserting my module, it prints some garbage values. I would be glad to receive help or hints or any response. Following is the code that I have written so far: P.S.: Necessary inclusions have been made. Having gone through almost all the necessary header files, I know that I can access the vendor ID, product ID, and manufacturer details of the USB device through a structure: struct usb_device<> which has a member struct usb_device_descriptor<> . This nested structure has idVendor, idProduct and iManufacturer and some other members.

//******************************************* struct usb_device udev; struct usb_bus *bus; ssize_t ret; static int __init usb_fun_init(void) < int result; __le16 idVendor = 0; __le16 idProduct = 0; __u8 iManufacturer = 0; printk(KERN_INFO "\n************************************ in init\n"); list_for_each_entry(bus, &usb_bus_list, bus_list)< printk(KERN_INFO "***************** Begins ****************"); printk(KERN_INFO "\nVendor udev.descriptor.idVendor); printk(KERN_INFO "\nProduct udev.descriptor.idProduct); printk(KERN_INFO "\nManufacturer = %s", udev.descriptor.iManufacturer); return 0; >static int __exit usb_fun_exit(void) < printk(KERN_INFO "\n************************************ in exit\n"); >module_init(usb_fun_init); module_exit(usb_fun_exit); MODULE_LICENSE("GPL"); 

Are you sure you need kernel module? Maybe this would be simpler to work with that device in userspace?

@peterSmith : Thank you for kind reply. But Sir, I have to implement this in kernel-space only. I have tried doing it in user-space using libusb. And, It works absolutely fine over there. Where I am getting issues is in kernel-space.

Источник

How to get USB vendor and product info programmatically on Linux?

Now I want to get the full strings that are associated with the vendor and product ids. I found that the file /usr/share/misc/usb.ids contains the information that I’m looking for:

13b1 Linksys 000b WUSB11 v4.0 802.11b Adapter 000d WUSB54G Wireless Adapter 0011 WUSB54GP v4.0 802.11g Adapter 0018 USB200M 10/100 Ethernet Adapter 001a HU200TS Wireless Adapter 001e WUSBF54G 802.11bg 0020 WUSB54GC 802.11g Adapter [ralink rt73] 0023 WUSB54GR 0024 WUSBF54G v1.1 802.11bg 

However, it’s not clear to me how I should retrieve this data in my application. Is there an API available or should I just parse the file? If I choose to parse it, then is /usr/share/misc/usb.ids always going to be the correct location?

Читайте также:  Кали linux на флешку

Here’s the most recent version: linux-usb.org/usb.ids and the interface for submitting them: linux-usb.org/usb-ids.html

On Android, my C program uses libusbhost which provides callbacks for device insertion/removal. All device descriptors are made available by the lib.

5 Answers 5

lsusb command queries information about currently plugged USB devices. You can use its -d option to query a certain vendor/product (but it seems to work only for currently plugged devices):

$ lsusb -d 0e21:0750 Bus 001 Device 005: ID 0e21:0750 Cowon Systems, Inc. 

You can show information for all devices:

$ lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 004: ID 0421:01c7 Nokia Mobile Phones Bus 001 Device 003: ID 0bda:8187 Realtek Semiconductor Corp. RTL8187 Wireless Adapter Bus 001 Device 005: ID 0e21:0750 Cowon Systems, Inc. Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 006 Device 002: ID 046d:c01b Logitech, Inc. MX310 Optical Mouse Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub 

You can also make it be verbose ( lsusb -v ) and printing a lot of stuff.

Note that when accessing information about the system in Linux OS, it’s much preferred to do it via shell commands (such as lsusb ) than to directly parse the system files these commands access.

@Stacked, yes (for C), but that depends on a language you develop in. But either way you’ll be reading something from a stream, and calling lsusb -d . via popen seems to require less keystrokes than parsing the whole file with descriptions.

Haven’t tried this myself, but libudev’s udev_device_get_property_value should be it; it is used in pulseaudio’s udev-util.c as udev_device_get_property_value(card, «ID_VENDOR_FROM_DATABASE»)) .

Here is a small example I just put together, based on udev-util.c — note that I’ve used an Arduino Duemillanove with FTDI FT232 chip, whose udev path I find using udevadm (see comments in code below), and then I hardcoded it in the below program, udevl.c :

// sudo apt-get install libudev-dev // build with: gcc -o udevl -ludev -Wall -g udevl.c #include #include int main( int argc, char **argv ) < const char *v; char t[256]; struct udev *udev; struct udev_device *card = NULL; if (!(udev = udev_new())) < fprintf(stderr, "Failed to allocate udev context.\n"); return -1; >// $ lsusb | grep FT232 // Bus 002 Device 002: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC // $ udevadm info --name=/dev/ttyUSB0 --attribute-walk | grep "looking at device" // looking at device '/devices/pci0000:00/0000:00:1d.0/usb2/2-2/2-2:1.0/ttyUSB0/tty/ttyUSB0' // (that one is under /sys) // hardcode that path below: // udev_get_sys_path(udev) for me: '/sys' sprintf(t, "%s/devices/pci0000:00/0000:00:1d.0/usb2/2-2/2-2:1.0/ttyUSB0/tty/ttyUSB0", udev_get_sys_path(udev)); fprintf(stdout, " path: %s\n", t); card = udev_device_new_from_syspath(udev, t); fprintf(stdout, " udev_device: 0x%08X\n", (unsigned int)card); if ((v = udev_device_get_property_value(card, "ID_MODEL_FROM_DATABASE")) ) fprintf(stdout, "got ID_MODEL_FROM_DATABASE: %s\n", v); else fprintf(stdout, "failed getting ID_MODEL_FROM_DATABASE: %s\n", v); fprintf(stdout, "Done.\n"); if (card) udev_device_unref(card); if (udev) udev_unref(udev); return 0; > 

This program (with the Arduino attached) outputs:

$ ./udevl path: /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-2/2-2:1.0/ttyUSB0/tty/ttyUSB0 udev_device: 0x09FBF080 got ID_MODEL_FROM_DATABASE: FT232 USB-Serial (UART) IC Done. 

. and «FT232 USB-Serial (UART) IC» is the right entry for VID:PID 0403:6001 in usb.ids.

Читайте также:  Linux export env variable

Источник

Как проверить производителя аппаратного оборудования, модель и серийный номер в Linux

Получение информации о системном оборудовании не является проблемой для пользователей Linux GUI и Windows, но пользователи CLI сталкиваются с проблемами, чтобы получить эту информацию.

Даже большинство из нас не знают, что является лучшей командой, чтобы получить это. В Linux есть много утилит для получения информации о системном оборудовании, например

Производитель аппаратного оборудования, модель и серийный номер.

Мы пытаемся написать возможные способы получения этих данных, но вы можете выбрать лучший метод для вас.

Обязательно знать всю эту информацию, потому что она понадобится, когда вы поднимете дело с поставщиком аппаратного обеспечения для любых проблем с оборудованием.

Это может быть достигнуто с помощью шести методов, позвольте мне показать вам, как это сделать.

Метод-1: Использование команды Dmidecode

Dmidecode – это инструмент, который считывает DMI компьютера (означает интерфейс управления рабочим столом) (некоторые говорят, что содержимое таблиц SMBIOS – System Management BIOS) и аппаратная информация для системы отображения в формате, удобном для человека.

В этой таблице содержится описание аппаратных компонентов системы, а также другая полезная информация, такая как серийный номер, информация о производителе, дата выпуска и ревизия BIOS и т.д..

В таблице DMI описывается не только то, что в настоящее время используется системой, но также можно сообщить о возможной эволюции (например, самый быстрый поддерживаемый процессор или максимальный объем поддерживаемой памяти).

Это поможет вам проанализировать возможности вашего оборудования, будь то поддержка последней версии приложения или нет?

~# dmidecode -t system # dmidecode 3.0 Getting SMBIOS data from sysfs. SMBIOS 2.7 present. Handle 0x0001, DMI type 1, 27 bytes System Information Manufacturer: Aquarius Product Name: Aquarius Std W60 S10 Version: To be filled by O.E.M. Serial Number: To be filled by O.E.M. UUID: 03AA02FC-0414-055D-E006-2F0700080009 Wake-up Type: Power Switch SKU Number: To be filled by O.E.M. Family: To be filled by O.E.M. Handle 0x0022, DMI type 12, 5 bytes System Configuration Options Option 1: To Be Filled By O.E.M. Handle 0x002D, DMI type 32, 20 bytes System Boot Information Status: No errors detected

Метод-2: Использование команды inxi

Inxi – отличный инструмент для проверки информации об оборудовании в Linux и предлагает широкий спектр возможностей для получения всей информации об оборудовании в системе Linux, которую я никогда не нашел в любой другой утилите, доступной в Linux.

Читайте также:  Apcupsd калибровка батареи linux

Он был раздвоен из древнего и разумно извращенного

Inxi – это скрипт, который быстро показывает аппаратное обеспечение системы, процессор, драйверы, Xorg, Desktop, Kernel, GCC версии, процессы, использование ОЗУ и множество других полезных сведений, также используемых для технической поддержки и отладки

# inxi -M Machine: Device: server System: IBM product: N/A v: 0B serial: MK2RL11 Mobo: IBM model: 00Y8494 serial: 37M17D UEFI: IBM v: -[VVE134MUS-1.50]- date: 08/30/2013

Метод-3: Использование команды lshw

lshw (означает Hardware Lister) – это небольшой отличный инструмент, который генерирует подробные отчеты о различных аппаратных компонентах на машине, таких как конфигурация памяти, версия прошивки, конфигурация материнской платы, версия и скорость процессора, конфигурация кеша, USB, сетевая карта, мультимедиа, принтеры, скорость шины и т. д.

Он генерирует информацию об оборудовании, читая различные файлы в каталоге / proc и таблице DMI.

lshw должен быть запущен от суперпользователя, чтобы определить максимальный объем информации или он будет сообщать только частичную информацию.

Специальная опция доступна в классе lshw, который будет подробно описывать конкретную информацию об оборудовании.

# lshw -C system описание: Настольный компьютер продукт: Aquarius Std W60 S10 (To be filled by O.E.M.) производитель: Aquarius версия: To be filled by O.E.M. серийный №: To be filled by O.E.M. разрядность: 64 bits возможности: smbios-2.7 dmi-2.7 vsyscall32 конфигурация: boot=normal chassis=desktop family=To be filled by O.E.M. sku=To be filled by O.E.M. uuid=FC02AA03-1404-5D05-E006-2F0700080009

Способ-4: Использование / sys файловой системы

Ядро выставляет некоторую информацию DMI в виртуальной файловой системе / sys.

Таким образом, мы можем легко получить тип машины, выполнив команду grep со следующим форматом.

В качестве альтернативы мы можем вывести только определенные детали, используя команду cat.

# cat /sys/class/dmi/id/board_vendor IBM # cat /sys/class/dmi/id/product_name System x2530 M4: -[1214AC1]- # cat /sys/class/dmi/id/product_serial MK2RL11 # cat /sys/class/dmi/id/bios_version -[VVE134MUS-1.50]-

Метод-5: Использование команды dmesg

Команда dmesg используется для записи сообщений ядра (загрузочных сообщений) в Linux до запуска syslogd или klogd.

Он получает свои данные, читая кольцевой буфер ядра. dmesg может быть очень полезен при устранении неполадок или просто пытается получить информацию об оборудовании в системе.

# dmesg | grep -i DMI DMI: System x2530 M4: -[1214AC1]-/00Y8494, BIOS -[VVE134MUS-1.50]- 08/30/2013

Метод-6: Использование команды hwinfo

hwinfo означает аппаратный информационный инструмент – еще одна полезная утилита, которая используется для проверки оборудования, присутствующего в системе, и отображения подробной информации о различных аппаратных компонентах в человекообразном формате.

Он сообщает информацию о процессоре, ОЗУ, клавиатуре, мыши, графической карте, звуке, памяти, сетевом интерфейсе, диске, разделе, биографии и мосту и т.д. Этот инструмент может отображать более подробную информацию среди других, таких как lshw, dmidecode, inxi , так далее,.

hwinfo использует библиотеку libhd libhd.so для сбора информации об оборудовании в системе. Этот инструмент, специально разработанный для системы openSUSE, позже других дистрибутивов, включил инструмент в свой официальный репозиторий.

# hwinfo | egrep "system.hardware.vendor|system.hardware.product" system.hardware.vendor = 'IBM' system.hardware.product = 'System x2530 M4: -[1214AC1]-'

Источник

Оцените статью
Adblock
detector