Explorar o código

自动注册字符设备。(非设备树版本)

xuxinyi hai 1 ano
pai
achega
750db65676
Modificáronse 4 ficheiros con 182 adicións e 1 borrados
  1. BIN=BIN
      开发笔记/img_4.png
  2. 5 1
      开发笔记/开发笔记.md
  3. 95 0
      驱动文件/2/Makefile
  4. 82 0
      驱动文件/2/newchrled.c

BIN=BIN
开发笔记/img_4.png


+ 5 - 1
开发笔记/开发笔记.md

@@ -112,4 +112,8 @@
     长按复位按钮,同事点按boot按钮,会进入loard模式。
     ![img_3.png](img_3.png)
     这样就可以烧录了。
-    由于我们的驱动目前还没有绑定设备树,也没编写自动注册驱动程序。所以,目前需要手动注册。但是手动注册不是我们目的,后续直接用设备树进行注册。
+    由于我们的驱动目前还没有绑定设备树,也没编写自动注册驱动程序。所以,目前需要手动注册。但是手动注册不是我们目的,后续直接用设备树进行注册。
+19. 注册字符设备驱动 ./驱动文件/2 
+    查看驱动是否注册成功
+    ![img_4.png](img_4.png)
+    成功打印,字符自动注册成功了。不过,没有使用设备树进行注册。

+ 95 - 0
驱动文件/2/Makefile

@@ -0,0 +1,95 @@
+# SPDX-License-Identifier: GPL-2.0
+
+# LED Core
+obj-$(CONFIG_NEW_LEDS)			+= led-core.o
+obj-$(CONFIG_LEDS_CLASS)		+= led-class.o
+obj-$(CONFIG_LEDS_CLASS_FLASH)		+= led-class-flash.o
+obj-$(CONFIG_LEDS_TRIGGERS)		+= led-triggers.o
+
+# LED Platform Drivers
+obj-$(CONFIG_LEDS_88PM860X)		+= leds-88pm860x.o
+obj-$(CONFIG_LEDS_AAT1290)		+= leds-aat1290.o
+obj-$(CONFIG_LEDS_APU)			+= leds-apu.o
+obj-$(CONFIG_LEDS_AS3645A)		+= leds-as3645a.o
+obj-$(CONFIG_LEDS_BCM6328)		+= leds-bcm6328.o
+obj-$(CONFIG_LEDS_BCM6358)		+= leds-bcm6358.o
+obj-$(CONFIG_LEDS_BD2802)		+= leds-bd2802.o
+obj-$(CONFIG_LEDS_CPCAP)		+= leds-cpcap.o
+obj-$(CONFIG_LEDS_LOCOMO)		+= leds-locomo.o
+obj-$(CONFIG_LEDS_LM3530)		+= leds-lm3530.o
+obj-$(CONFIG_LEDS_LM3533)		+= leds-lm3533.o
+obj-$(CONFIG_LEDS_LM3642)		+= leds-lm3642.o
+obj-$(CONFIG_LEDS_MIKROTIK_RB532)	+= leds-rb532.o
+obj-$(CONFIG_LEDS_S3C24XX)		+= leds-s3c24xx.o
+obj-$(CONFIG_LEDS_NET48XX)		+= leds-net48xx.o
+obj-$(CONFIG_LEDS_WRAP)			+= leds-wrap.o
+obj-$(CONFIG_LEDS_COBALT_QUBE)		+= leds-cobalt-qube.o
+obj-$(CONFIG_LEDS_COBALT_RAQ)		+= leds-cobalt-raq.o
+obj-$(CONFIG_LEDS_SUNFIRE)		+= leds-sunfire.o
+obj-$(CONFIG_LEDS_PCA9532)		+= leds-pca9532.o
+obj-$(CONFIG_LEDS_GPIO_REGISTER)	+= leds-gpio-register.o
+obj-$(CONFIG_LEDS_GPIO)			+= leds-gpio.o
+obj-y		+= leds-user-defind.o
+obj-$(CONFIG_LEDS_LP3944)		+= leds-lp3944.o
+obj-$(CONFIG_LEDS_LP3952)		+= leds-lp3952.o
+obj-$(CONFIG_LEDS_LP55XX_COMMON)	+= leds-lp55xx-common.o
+obj-$(CONFIG_LEDS_LP5521)		+= leds-lp5521.o
+obj-$(CONFIG_LEDS_LP5523)		+= leds-lp5523.o
+obj-$(CONFIG_LEDS_LP5562)		+= leds-lp5562.o
+obj-$(CONFIG_LEDS_LP8501)		+= leds-lp8501.o
+obj-$(CONFIG_LEDS_LP8788)		+= leds-lp8788.o
+obj-$(CONFIG_LEDS_LP8860)		+= leds-lp8860.o
+obj-$(CONFIG_LEDS_TCA6507)		+= leds-tca6507.o
+obj-$(CONFIG_LEDS_TLC591XX)		+= leds-tlc591xx.o
+obj-$(CONFIG_LEDS_CLEVO_MAIL)		+= leds-clevo-mail.o
+obj-$(CONFIG_LEDS_IPAQ_MICRO)		+= leds-ipaq-micro.o
+obj-$(CONFIG_LEDS_HP6XX)		+= leds-hp6xx.o
+obj-$(CONFIG_LEDS_OT200)		+= leds-ot200.o
+obj-$(CONFIG_LEDS_FSG)			+= leds-fsg.o
+obj-$(CONFIG_LEDS_PCA955X)		+= leds-pca955x.o
+obj-$(CONFIG_LEDS_PCA963X)		+= leds-pca963x.o
+obj-$(CONFIG_LEDS_DA903X)		+= leds-da903x.o
+obj-$(CONFIG_LEDS_DA9052)		+= leds-da9052.o
+obj-$(CONFIG_LEDS_WM831X_STATUS)	+= leds-wm831x-status.o
+obj-$(CONFIG_LEDS_WM8350)		+= leds-wm8350.o
+obj-$(CONFIG_LEDS_PWM)			+= leds-pwm.o
+obj-$(CONFIG_LEDS_REGULATOR)		+= leds-regulator.o
+obj-$(CONFIG_LEDS_INTEL_SS4200)		+= leds-ss4200.o
+obj-$(CONFIG_LEDS_LT3593)		+= leds-lt3593.o
+obj-$(CONFIG_LEDS_ADP5520)		+= leds-adp5520.o
+obj-$(CONFIG_LEDS_MC13783)		+= leds-mc13783.o
+obj-$(CONFIG_LEDS_NS2)			+= leds-ns2.o
+obj-$(CONFIG_LEDS_NETXBIG)		+= leds-netxbig.o
+obj-$(CONFIG_LEDS_ASIC3)		+= leds-asic3.o
+obj-$(CONFIG_LEDS_MAX77693)		+= leds-max77693.o
+obj-$(CONFIG_LEDS_MAX8997)		+= leds-max8997.o
+obj-$(CONFIG_LEDS_LM355x)		+= leds-lm355x.o
+obj-$(CONFIG_LEDS_BLINKM)		+= leds-blinkm.o
+obj-$(CONFIG_LEDS_SYSCON)		+= leds-syscon.o
+obj-$(CONFIG_LEDS_MENF21BMC)		+= leds-menf21bmc.o
+obj-$(CONFIG_LEDS_KTD2692)		+= leds-ktd2692.o
+obj-$(CONFIG_LEDS_POWERNV)		+= leds-powernv.o
+obj-$(CONFIG_LEDS_IS31FL319X)		+= leds-is31fl319x.o
+obj-$(CONFIG_LEDS_IS31FL32XX)		+= leds-is31fl32xx.o
+obj-$(CONFIG_LEDS_RGB13H)		+= leds-rgb13h.o
+obj-$(CONFIG_LEDS_PM8058)		+= leds-pm8058.o
+obj-$(CONFIG_LEDS_MLXCPLD)		+= leds-mlxcpld.o
+obj-$(CONFIG_LEDS_MLXREG)		+= leds-mlxreg.o
+obj-$(CONFIG_LEDS_NIC78BX)		+= leds-nic78bx.o
+obj-$(CONFIG_LEDS_MT6323)		+= leds-mt6323.o
+obj-$(CONFIG_LEDS_LM3692X)		+= leds-lm3692x.o
+obj-$(CONFIG_LEDS_SC27XX_BLTC)		+= leds-sc27xx-bltc.o
+obj-$(CONFIG_LEDS_LM3601X)		+= leds-lm3601x.o
+
+# LED SPI Drivers
+obj-$(CONFIG_LEDS_CR0014114)		+= leds-cr0014114.o
+obj-$(CONFIG_LEDS_DAC124S085)		+= leds-dac124s085.o
+
+# LED Userspace Drivers
+obj-$(CONFIG_LEDS_USER)			+= uleds.o
+
+# LED Triggers
+obj-$(CONFIG_LEDS_TRIGGERS)		+= trigger/
+
+#新增
+obj-y+= newchrled.o

+ 82 - 0
驱动文件/2/newchrled.c

@@ -0,0 +1,82 @@
+#include <linux/module.h>
+#include <linux/fs.h>
+#include <linux/cdev.h>
+#include <linux/uaccess.h>
+
+#define DEVICE_NAME "my_char_device"
+#define CLASS_NAME "my_char_class"
+
+static int majorNumber;                  // 设备号
+static struct class* myCharClass = NULL; // 设备类
+// 打开设备
+static int dev_open(struct inode *inodep, struct file *filep) {
+    printk(KERN_INFO "my_char_device: Device opened\n");
+    return 0;
+}
+
+// 读取设备
+static ssize_t dev_read(struct file *filep, char *buffer, size_t len, loff_t *offset) {
+    printk(KERN_INFO "my_char_device: Read from device\n");
+    return 0; // 返回0表示没有读取任何数据
+}
+
+// 写入设备
+static ssize_t dev_write(struct file *filep, const char *buffer, size_t len, loff_t *offset) {
+    printk(KERN_INFO "my_char_device: Write to device\n");
+    return len; // 返回写入的字节数
+}
+
+// 释放设备
+static int dev_release(struct inode *inodep, struct file *filep) {
+    printk(KERN_INFO "my_char_device: Device closed\n");
+    return 0;
+}
+
+// 文件操作结构体
+static struct file_operations fops = {
+    .owner = THIS_MODULE,
+    .open = dev_open,
+    .read = dev_read,
+    .write = dev_write,
+    .release = dev_release,
+};
+
+// 模块初始化
+static int __init my_char_init(void) {
+    // 自动申请设备号
+    majorNumber = register_chrdev(0, DEVICE_NAME, &fops);
+    if (majorNumber < 0) {
+        printk(KERN_ALERT "my_char_device failed to register a major number\n");
+        return majorNumber;
+    }
+    printk(KERN_INFO "my_char_device: registered correctly with major number %d\n", majorNumber);
+
+    // 创建设备类
+    myCharClass = class_create(THIS_MODULE, CLASS_NAME);
+    if (IS_ERR(myCharClass)) {
+        unregister_chrdev(majorNumber, DEVICE_NAME);
+        printk(KERN_ALERT "Failed to register device class\n");
+        return PTR_ERR(myCharClass);
+    }
+
+    // 创建设备
+    device_create(myCharClass, NULL, MKDEV(majorNumber, 0), NULL, DEVICE_NAME);
+    printk(KERN_INFO "my_char_device: device class created correctly\n");
+    return 0;
+}
+
+// 模块退出
+static void __exit my_char_exit(void) {
+    device_destroy(myCharClass, MKDEV(majorNumber, 0)); // 删除设备
+    class_unregister(myCharClass);                       // 取消设备类注册
+    class_destroy(myCharClass);                          // 销毁设备类
+    unregister_chrdev(majorNumber, DEVICE_NAME);        // 注销设备号
+    printk(KERN_INFO "my_char_device: Goodbye from the LKM!\n");
+}
+
+module_init(my_char_init);
+module_exit(my_char_exit);
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Your Name");
+MODULE_DESCRIPTION("A simple Linux char driver");
+MODULE_VERSION("0.1");