#include <linux/module.h> #include <linux/fs.h> #include <linux/cdev.h> #include <linux/uaccess.h>

#define DEV_COUNT 10 // 设备数量 #define DEV_NAME "my_char_dev" // 设备名称

static dev_t dev; // 设备号 static struct cdev cdev; // 字符设备对象

static int my_char_dev_open(struct inode *inode, struct file *file) { printk(KERN_INFO "my_char_dev: open\n"); return 0; }

static ssize_t my_char_dev_read(struct file *file, char __user *buf, size_t count, loff_t *pos) { printk(KERN_INFO "my_char_dev: read\n"); return 0; }

static ssize_t my_char_dev_write(struct file *file, const char __user *buf, size_t count, loff_t *pos) { printk(KERN_INFO "my_char_dev: write\n"); return count; }

static long my_char_dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { printk(KERN_INFO "my_char_dev: ioctl\n"); return 0; }

static int my_char_dev_probe(struct platform_device *pdev) { printk(KERN_INFO "my_char_dev: probe\n"); return 0; }

static int my_char_dev_remove(struct platform_device *pdev) { printk(KERN_INFO "my_char_dev: remove\n"); return 0; }

static struct file_operations my_char_dev_fops = { .owner = THIS_MODULE, .open = my_char_dev_open, .read = my_char_dev_read, .write = my_char_dev_write, .unlocked_ioctl = my_char_dev_ioctl, };

static struct platform_driver my_char_dev_driver = { .probe = my_char_dev_probe, .remove = my_char_dev_remove, .driver = { .name = DEV_NAME, }, };

static int __init my_char_dev_init(void) { int ret; int i;

// 分配设备号
ret = alloc_chrdev_region(&dev, 0, DEV_COUNT, DEV_NAME);
if (ret < 0) {
    printk(KERN_ERR "my_char_dev: alloc_chrdev_region failed\n");
    return ret;
}

// 注册字符设备对象
cdev_init(&cdev, &my_char_dev_fops);
cdev.owner = THIS_MODULE;
ret = cdev_add(&cdev, dev, DEV_COUNT);
if (ret < 0) {
    printk(KERN_ERR "my_char_dev: cdev_add failed\n");
    unregister_chrdev_region(dev, DEV_COUNT);
    return ret;
}

// 注册platform驱动
ret = platform_driver_register(&my_char_dev_driver);
if (ret < 0) {
    printk(KERN_ERR "my_char_dev: platform_driver_register failed\n");
    cdev_del(&cdev);
    unregister_chrdev_region(dev, DEV_COUNT);
    return ret;
}

// 输出设备号信息
for (i = 0; i < DEV_COUNT; i++) {
    printk(KERN_INFO "my_char_dev: device %d, major %d, minor %d\n", i, MAJOR(dev + i), MINOR(dev + i));
}

return 0;

}

static void __exit my_char_dev_exit(void) { platform_driver_unregister(&my_char_dev_driver); cdev_del(&cdev); unregister_chrdev_region(dev, DEV_COUNT); }

module_init(my_char_dev_init); module_exit(my_char_dev_exit);

MODULE_LICENSE("GPL"); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("My Char Device Driver")

写一个Linux标准的字符设备驱动总共有10个设备驱动包含openreadwriteprobe和ioctl方法

原文地址: http://www.cveoy.top/t/topic/hr6J 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录