Это делается в ядре: я предполагаю, что у вас есть драйвер USB-гаджета, который вы разработали или используете, чтобы ваше устройство Embedded Linux можно было использовать в качестве устройства USB.
Этот драйвербезусловно, имеет struct usb_device_descriptor
, который объявлен где-то.Как видите, эта структура имеет несколько полей idVendor
, idProduct
.Удобные для чтения строки: iManufacturer
, iProduct
и iSerialNum
.Вот полная структура:
/* USB_DT_DEVICE: Device descriptor */
struct usb_device_descriptor {
__u8 bLength;
__u8 bDescriptorType;
__le16 bcdUSB;
__u8 bDeviceClass;
__u8 bDeviceSubClass;
__u8 bDeviceProtocol;
__u8 bMaxPacketSize0;
__le16 idVendor;
__le16 idProduct;
__le16 bcdDevice;
__u8 iManufacturer;
__u8 iProduct;
__u8 iSerialNumber;
__u8 bNumConfigurations;
} __attribute__ ((packed));
Если вы используете уже разработанный драйвер, некоторые дают вам возможность установить эти поля с некоторыми значениями, которые вы передаете в качестве параметра модуля, см. drivers/usb/gadget/printer.c
хороший пример.Таким образом, вы можете передать значения в ядро из пространства пользователя.