Enviar vendor id e poduct id para linux kernel

1. Enviar vendor id e poduct id para linux kernel

Guilherme Giacomo Simoes
simoes_png

(usa elementary OS)

Enviado em 22/09/2023 - 15:06h

Eu estou fazendo um dispositivo usb experimental e criei um simples modulo de driver para o kernel linux.
meu usb_driver.h:
#ifndef __USB_DRIVER_H__
#define __USB_DRIVER_H__

#define USB_SKEL_VENDOR_ID "7SEG_DRIVER"
#define USB_SKEL_PRODUCT_ID 0x0001

static int skel_probe(struct usb_interface *intf, const struct usb_device_id *id);
static void skel_disconnect(struct usb_interface *intf);

static struct usb_device_id skel_table[] = {
{ USB_DEVICE(USB_SKEL_VENDOR_ID, USB_SKEL_PRODUCT_ID) },
{ }
};


static struct usb_driver skel_driver = {
.name = "skeleton",
.probe = skel_probe,
.disconnect = skel_disconnect,
.id_table = skel_table,
};

#endif



meu usb_driver.c:
#include "usb_driver.h"

MODULE_AUTHOR("SEU NOME <seu_email@email.com>");
MODULE_DESCRIPTION("Introducao a criacao de driver pra linux");
MODULE_LICENSE("GPL");
MODULE_VERSION("1.0");
MODULE_DEVICE_TABLE(usb, skel_table);

static int skel_probe(struct usb_interface *intf,
const struct usb_device_id *id)
{
pr_info("o usb 7segmento foi conectado");
return 0;
}

static void skel_disconnect(struct usb_interface *intf)
{
pr_info("o usb 7segmento foi desconectado");
}

static int __init usb_skel_init(void)
{
//registrando este driver com subsistema USB
int result = usb_register(&skel_driver);
if(result < 0) {
pr_err("usb_register falhou para o driver %s. Erro numero %s"
, skel_driver.name, result);
return -1;
}

return 0;
}

static void __exit usb_skel_exit(void)
{
usb_deregister(&skel_driver);
pr_info("Modulo removido\n");
}

module_init(usb_skel_init);
module_exit(usb_skel_exit);


Meu "dispositivo usb" e muito simples. Eu somentei conectei o Vcc e o GND do USB em um LED para ser um indicador de funcionamento. E eu conectei o G+ e G- em um arduino para enviar qualquer dado. Eu nao iniciei nenhum codigo ainda no arduino.

Minha duvisa e: COMO EU ENVIO MEU VENDOR_ID E O MEU PRODUCT_ID para o kernel chamar a funcao probe do meu driver?? Como meu dispositivo USB enviar para o kernel o seu vendor_id e o product_id ??


Eu acho que o dispositivo deve enviar seu product_id e vendor_id para o kernel, e o kernel encontrará a função de teste correta. Se não for assim, quero saber como o kernel encontra a função de teste correta do driver do meu dispositivo. Se eu enviei meu vendor_id e product_id para struct usb_device_id, agora, quando eu conectar meu dispositivo USB, o kernel deve identificar que o dispositivo conectado está atribuído a vendor_id XXX e product_id YYYY e chamar a função vendor_XXX_product_yyy_probe();



  


2. Re: Enviar vendor id e poduct id para linux kernel

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 22/09/2023 - 15:06h

Olá! Percebo que você está fazendo um trabalho de alto nível criando seu próprio dispositivo USB e driver para o Linux. Excelente!

Sobre a sua dúvida, o Vendor ID (VID) e o Product ID (PID) são atributos definidos na época da fabricação do dispositivo USB. Eles são gravados diretamente no hardware do dispositivo e, portanto, não podem ser enviados do código do driver para o dispositivo USB.

Quando um dispositivo USB é conectado em um sistema Linux (ou qualquer sistema operacional, na verdade), o sistema operacional lê o VID e PID diretamente do hardware do dispositivo e, em seguida, busca no seu banco de drivers algum que corresponda a esses IDs.

No seu código, ao definir a struct usb_device_id (no seu caso, skel_table), você está dizendo para o sistema: "Ei, existe um driver aqui que deve ser usado para todos os dispositivos USB que se identificarem com o VID e PID especificados".

Sendo assim, o que você precisa fazer é configurar o VID e PID no hardware do seu dispositivo USB para eles coincidam com os valores definidos no seu código. Infelizmente, para dispositivos USB caseiros, isso pode ser um pouco complexo, já que normalmente requer a compra de um VID da USB Implementers Forum, que é uma operação cara.

No ent


3. Re: Enviar vendor id e poduct id para linux kernel

Domingos Paraiso
DomingosParaiso

(usa Debian)

Enviado em 22/09/2023 - 15:36h


Pelo que entendi você precisa saber como enviar pelo Arduino o vendor ID e product ID, bom, isso depende da forma como a USB será conectada, se você conectar diretamente na porta USB que vem na placa do Arduino, então o computador vai identificar o chip que faz a conversão de USB para serial (pode ser o CH430 ou o PL2303, etc). Em Arduinos com microcontroladores como o Atmega16U2 é possível usar uma biblioteca de software que usa os pinos de GPIO do Arduino para criar as funcionalidades da comunicação USB, essas bibliotecas costumam vir com exemplos que simulam teclados, mouses, etc. Nesse caso é possível modificar os valores de vendor ID e product ID na biblioteca.
Qual é o seu caso?


4. Re: Enviar vendor id e poduct id para linux kernel

Guilherme Giacomo Simoes
simoes_png

(usa elementary OS)

Enviado em 23/09/2023 - 10:14h

DomingosParaiso escreveu:


Pelo que entendi você precisa saber como enviar pelo Arduino o vendor ID e product ID, bom, isso depende da forma como a USB será conectada, se você conectar diretamente na porta USB que vem na placa do Arduino, então o computador vai identificar o chip que faz a conversão de USB para serial (pode ser o CH430 ou o PL2303, etc). Em Arduinos com microcontroladores como o Atmega16U2 é possível usar uma biblioteca de software que usa os pinos de GPIO do Arduino para criar as funcionalidades da comunicação USB, essas bibliotecas costumam vir com exemplos que simulam teclados, mouses, etc. Nesse caso é possível modificar os valores de vendor ID e product ID na biblioteca.
Qual é o seu caso?


O meu caso e exatamente esse sobre usar as GPIOs do Arduino para criar as funcionalidades de comunicacao USB. Nao sabia da existencia dessas libs para simular teclados, mouses usb ... Entretanto estou com arduino uno com Atmega328p.








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts