#include #include #include #include #include #include struct gpio_led_data { struct led_classdev cdev; // LED 的类设备结构 int gpio; // GPIO 引脚 }; struct gpio_leds_priv { struct gpio_led_data *leds; // 存储 LED 数据 int num_leds; // LED 数量 }; static int gpio_led_probe(struct platform_device *pdev) { struct gpio_leds_priv *priv; int ret; // 为 priv 分配内存 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); if (!priv) return -ENOMEM; priv->num_leds = /* 从设备树或其他来源获取 LED 数量 */; priv->leds = devm_kcalloc(&pdev->dev, priv->num_leds, sizeof(*priv->leds), GFP_KERNEL); if (!priv->leds) return -ENOMEM; // 初始化每个 LED for (int i = 0; i < priv->num_leds; i++) { priv->leds[i].gpio = /* 获取 GPIO 引脚 */; priv->leds[i].cdev.name = /* LED 名称 */; priv->leds[i].cdev.brightness = LED_OFF; priv->leds[i].cdev.max_brightness = LED_FULL; // 注册 LED ret = led_classdev_register(&pdev->dev, &priv->leds[i].cdev); if (ret) { dev_err(&pdev->dev, "Failed to register LED %s\n", priv->leds[i].cdev.name); goto error; } } platform_set_drvdata(pdev, priv); // 存储私有数据 return 0; error: // 清理已注册的 LED for (int j = 0; j < i; j++) { led_classdev_unregister(&priv->leds[j].cdev); } return ret; } static void gpio_led_shutdown(struct platform_device *pdev) { struct gpio_leds_priv *priv = platform_get_drvdata(pdev); int i; for (i = 0; i < priv->num_leds; i++) { struct gpio_led_data *led = &priv->leds[i]; if (!(led->cdev.flags & LED_RETAIN_AT_SHUTDOWN)) gpio_led_set(&led->cdev, LED_OFF); } } static const struct of_device_id of_gpio_leds_match[] = { { .compatible = "gpio-leds", }, {} }; MODULE_DEVICE_TABLE(of, of_gpio_leds_match); static struct platform_driver gpio_led_driver = { .probe = gpio_led_probe, .shutdown = gpio_led_shutdown, .driver = { .name = "leds-gpio", .of_match_table = of_gpio_leds_match, }, }; module_platform_driver(gpio_led_driver); MODULE_LICENSE("GPL"); MODULE_AUTHOR("John Madieu "); MODULE_DESCRIPTION("Linux kernel module skeleton for GPIO LEDs");