Selaa lähdekoodia

probe平台加载驱动方式。替换传统的注册函数

xuxinyi 1 vuosi sitten
vanhempi
commit
f94f5a346e

BIN
固件/leds-user-defind.ko


BIN
开发笔记/img_11.png


BIN
开发笔记/img_12.png


BIN
开发笔记/img_13.png


BIN
开发笔记/img_14.png


+ 14 - 4
开发笔记/开发笔记.md

@@ -35,10 +35,10 @@
     sudo apt install gawk wget git diffstat unzip 
     sudo apt install texinfo gcc-multilib build-essential chrpath socat 
     sudo apt install libsdl1.2-dev xterm ncurses-dev lzop libelf-dev make
-    sudo apt-get install git ssh make gcc g++ libssl-dev liblz4-tool
-    sudo apt-get install expect patchelf chrpath gawk texinfo diffstat binfmt-support
+    sudo apt-get install ssh gcc g++ libssl-dev liblz4-tool
+    sudo apt-get install expect patchelf binfmt-support
     sudo apt-get install qemu-user-static live-build bison flex fakeroot cmake
-    sudo apt-get install gcc-multilib g++-multilib unzip device-tree-compiler ncurses-dev libncurses5-dev
+    sudo apt-get install g++-multilib device-tree-compiler libncurses5-dev
 
 6.泰山派sdk
     解压出来的.repo包执行下面命令
@@ -166,4 +166,14 @@
         ![alt text](image-7.png)
     5.卸载模块
         rmmod xx
-        ![alt text](image-8.png)
+        ![alt text](image-8.png)
+
+24.probe 函数进行驱动加载
+    平台驱动注册函数
+        module_platform_driver(gpio_led_driver);
+    核心驱动注册函数
+        ![img_11.png](img_11.png)
+        ![img_12.png](img_12.png)
+        ![img_13.png](img_13.png)
+    测试结果
+        ![img_14.png](img_14.png)

+ 11 - 7
设备树/tspi-rk3566-user-v10-linux.dts

@@ -5,11 +5,11 @@
  */
 
  /*********************************************************************
- *           立创开发板不靠卖板赚钱,以培养中国工程师为己任  
+ *           立创开发板不靠卖板赚钱,以培养中国工程师为己任
  *         泰山派软硬件资料与相关扩展板软硬件资料官网全部开源
- *                      开发板官网:www.lckfb.com            
- *                     立创论坛:oshwhub.com/forum           
- *            关注B站:【立创开发板】,掌握我们的最新动态!  
+ *                      开发板官网:www.lckfb.com
+ *                     立创论坛:oshwhub.com/forum
+ *            关注B站:【立创开发板】,掌握我们的最新动态!
  *********************************************************************
  * 文件名:tspi-rk3566-user-v10.dtsi
  * 描述:用户自定义层
@@ -62,7 +62,11 @@
         brightness-levels = <0 102 204 306 408 510 612 714 816 918 1020>;
         default-brightness = <6>;
         status = "okay";
-    }
+    };
+
+	my_new_node{
+		compatible = "MYNEWNODE";
+	};
 
 	leds: leds {
 		compatible = "gpio-leds";
@@ -77,14 +81,14 @@
 			gpios = <&gpio1 RK_PB1 GPIO_ACTIVE_LOW>;
 			linux,default-trigger = "timer";
 			linux,delay-reg = <100>;   		// 延时注册
-			linux,blink-delay-on = <1000>; 
+			linux,blink-delay-on = <1000>;
 			linux,blink-delay-off = <1000>;
 		};
 		rgb_led_b: rgb-led-b {
 			gpios = <&gpio1 RK_PB0 GPIO_ACTIVE_LOW>;
 			linux,default-trigger = "timer";
 			linux,delay-reg = <100>;  		// 延时注册
-			linux,blink-delay-on = <1500>; 
+			linux,blink-delay-on = <1500>;
 			linux,blink-delay-off = <1500>;
 		};
 	};

+ 39 - 0
驱动文件/2024-11-4/platform.c

@@ -0,0 +1,39 @@
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/of.h>
+
+const char *TAG = "MYNEWNODE";
+static int gpio_led_probe(struct platform_device *pdev)
+{
+    // 这里可以添加初始化代码
+    printk("%s:probe!\n",TAG);
+    return 0; // 返回 0 表示成功
+}
+
+static void gpio_led_shutdown(struct platform_device *pdev)
+{
+    // 这里可以添加关机处理代码
+    printk("%s:shutdown!\n",TAG);
+}
+
+static const struct of_device_id of_gpio_leds_match[] = {
+    { .compatible = "my_backlight", },
+    {}
+};
+
+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   = "my_backlight",
+        .of_match_table = of_gpio_leds_match,
+    },
+};
+
+module_platform_driver(gpio_led_driver);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Your Name");
+MODULE_DESCRIPTION("Simple GPIO LEDs driver");

+ 93 - 0
驱动文件/2024-11-4/platform1.c

@@ -0,0 +1,93 @@
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/of.h>
+#include <linux/slab.h>
+#include <linux/platform_device.h>
+#include <linux/leds.h>
+
+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 <john.madieu@gmail.com>");
+MODULE_DESCRIPTION("Linux kernel module skeleton for GPIO LEDs");

+ 2 - 1
驱动文件/Makefile

@@ -94,4 +94,5 @@ obj-$(CONFIG_LEDS_TRIGGERS)		+= trigger/
 #新增
 obj-y+= newchrled.o
 obj-m+= leds-user-defind.o
-obj-m+= charDevice.o
+obj-m+= charDevice.o
+obj-m+= platform.o