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:
meu usb_driver.c:
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();
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();