10_lightning_node_pro_led: First working binded module

This commit is contained in:
Florian RICHER 2025-03-02 18:19:26 +01:00
parent a407e656b6
commit 96c00a0dcc
Signed by: florian.richer
GPG key ID: C73D37CBED7BFC77
5 changed files with 62 additions and 89 deletions

View file

@ -1,4 +1,6 @@
obj-m += test_module.o
MODULE_NAME = lightning_node_pro_led
obj-m += $(MODULE_NAME).o
all:
make -C $(LINUX_MODULES_FOLDER)/build M=$(PWD) modules

View file

@ -0,0 +1,19 @@
## Tips
1. Get info about device
```console
$ lsusb -v -d <vendor_id>:<product_id>
```
2. Check if device is attached to driver
```console
$ ls /sys/bus/<bus_type>/drivers/<driver_name>
```
If is attached to driver, it appear here.
## Usefull links
- https://github.com/torvalds/linux/blob/master/drivers/hid/hid-led.c

View file

@ -0,0 +1,40 @@
#include <linux/init.h>
#include <linux/hid.h>
#include <linux/module.h>
#define USB_VENDOR_ID_CORSAIR 0x1b1c
#define USB_DEVICE_ID_LIGHTNING_NODE_PRO 0x0c0b
static int lightning_node_pro_led_probe(struct hid_device *hdev,
const struct hid_device_id *id)
{
pr_info("Détection USB pour Lightning Node Pro\n");
return 0;
}
static void lightning_node_pro_led_remove(struct hid_device *dev)
{
pr_info("Retrait USB pour Lightning Node Pro\n");
}
static struct hid_device_id lightning_node_pro_led_table[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR,
USB_DEVICE_ID_LIGHTNING_NODE_PRO) },
{} /* Entrée de terminaison */
};
MODULE_DEVICE_TABLE(hid, lightning_node_pro_led_table);
static struct hid_driver lightning_node_pro_led_driver = {
.name = "lightning-node-pro",
.id_table = lightning_node_pro_led_table,
.probe = lightning_node_pro_led_probe,
.remove = lightning_node_pro_led_remove,
};
module_hid_driver(lightning_node_pro_led_driver);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Florian RICHER <florian.richer@protonmail.com>");
MODULE_DESCRIPTION("Un module noyau pour utiliser le Lightning Node Pro LED");
MODULE_VERSION("1.0");

View file

@ -1,35 +0,0 @@
#!/usr/bin/env bash
# Définir les détails du périphérique USB et des pilotes
VENDOR_ID="1b1c"
DEVICE_ID="0c0b"
NEW_DRIVER="lightning-node-pro"
# Vérifier les identifiants avec lsusb
echo "Vérifiez que le périphérique est listé avec les identifiants corrects :"
lsusb | grep "${VENDOR_ID}:${DEVICE_ID}"
# Trouver le chemin du périphérique USB
USB_DEVICE_PATH=$(find /sys/bus/usb/devices/*/ -type f -name 'idVendor' -execdir sh -c 'grep -q '"$VENDOR_ID"' idVendor && grep -q '"$DEVICE_ID"' idProduct && pwd' \; | head -n 1)
if [ -z "$USB_DEVICE_PATH" ]; then
echo "Périphérique USB non trouvé"
exit 1
fi
echo "Chemin du périphérique USB : $USB_DEVICE_PATH"
# Extraire l'identifiant du périphérique (par exemple, 1-10)
DEVICE_IDENTIFIER=$(basename "$USB_DEVICE_PATH")
echo "Identifiant du périphérique : $DEVICE_IDENTIFIER"
# Délier le périphérique USB du pilote actuel
echo "Délier le périphérique USB du pilote actuel..."
echo -n "$DEVICE_IDENTIFIER" | sudo tee "/sys/bus/usb/devices/$DEVICE_IDENTIFIER/driver/unbind" > /dev/null
# Lier le périphérique USB au nouveau pilote
echo "Lier le périphérique USB au nouveau pilote..."
echo -n "$DEVICE_IDENTIFIER" | sudo tee "/sys/bus/usb/drivers/${NEW_DRIVER}/bind" > /dev/null
echo "Périphérique USB lié avec succès au nouveau pilote"

View file

@ -1,53 +0,0 @@
#include <linux/init.h>
#include <linux/usb.h>
#include <linux/module.h>
#define USB_VENDOR_ID_CORSAIR 0x1b1c
#define USB_DEVICE_ID_LIGHTNING_NODE_PRO 0x0c0b
static int lnp_driver_probe(struct usb_interface *interface,
const struct usb_device_id *id)
{
pr_info("Détection USB pour Lightning Node Pro\n");
return 0;
}
static struct usb_device_id lnp_driver_table[] = {
{ USB_DEVICE(USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_LIGHTNING_NODE_PRO) },
{} /* Entrée de terminaison */
};
MODULE_DEVICE_TABLE(usb, lnp_driver_table);
static struct usb_driver lnp_driver = {
.name = "lightning-node-pro",
.id_table = lnp_driver_table,
.probe = lnp_driver_probe,
};
static int __init lnp_usb_driver_init(void)
{
int ret;
ret = usb_register(&lnp_driver);
if (ret < 0) {
pr_err("lnp_usb_driver: Impossible d'enregistrer le pilote pour %s. Code d'erreur: %d\n",
lnp_driver.name, ret);
return -1;
}
return 0;
}
static void __exit lnp_usb_driver_exit(void)
{
usb_deregister(&lnp_driver);
}
module_init(lnp_usb_driver_init);
module_exit(lnp_usb_driver_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Florian RICHER <florian.richer@protonmail.com>");
MODULE_DESCRIPTION("Un module noyau pour utiliser le Lightning Node Pro LED");
MODULE_VERSION("1.0");