Linux cdev如何进行设备初始化

avatar
作者
猴君
阅读量:0

在Linux中,cdev(字符设备)是内核用于管理I/O设备的一种机制。设备初始化主要涉及创建一个cdev结构体,并将其注册到内核中。以下是一个简单的步骤指南,帮助你进行设备初始化:

  1. 定义设备号:首先,你需要为你的设备分配一个设备号。这通常通过register_chrdev_region函数完成。
#include <linux/cdev.h> #include <linux/kernel.h> #include <linux/module.h>  static int major; static struct class *my_class;  static int __init my_cdev_init(void) {     major = register_chrdev_region(MKDEV(major, 0), 1, "my_device", NULL);     if (major < 0) {         printk(KERN_ERR "register_chrdev_region failed with error %d\n", major);         return major;     }      my_class = class_create(THIS_MODULE, "my_device_class");     if (!my_class) {         unregister_chrdev_region(MKDEV(major, 0), 1);         printk(KERN_ERR "class_create failed\n");         return -1;     }      // 设备初始化代码将在这里添加      return 0; }  static void __exit my_cdev_exit(void) {     class_destroy(my_class);     unregister_chrdev_region(MKDEV(major, 0), 1); }  module_init(my_cdev_init); module_exit(my_cdev_exit); 
  1. 创建设备文件节点:接下来,你需要在内核中创建设备文件节点。这可以通过cdev_add函数完成。
#include <linux/cdev.h>  static struct cdev my_cdev;  static int __init my_cdev_init(void) {     // ...(省略了之前的代码)      if (cdev_add(&my_cdev, MKDEV(major, 0), 1) < 0) {         printk(KERN_ERR "cdev_add failed\n");         return -1;     }      // 设备初始化代码将在这里添加      return 0; } 

注意:cdev_add函数会自动为你的设备创建一个设备文件节点(例如/dev/my_device),你不需要手动创建它。

  1. 实现设备操作:为了与用户空间进行交互,你需要实现一些设备操作函数,如openclosereadwrite等。这些函数将被内核调用,以处理与设备的交互。
#include <linux/fs.h> #include <linux/dcache.h> #include <linux/path.h> #include <linux/namei.h>  static int my_open(struct inode *inode, struct file *file) {     // 设备打开时的处理代码     return 0; }  static int my_release(struct inode *inode, struct file *file) {     // 设备关闭时的处理代码     return 0; }  static ssize_t my_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) {     // 设备读取时的处理代码     return count; }  static ssize_t my_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) {     // 设备写入时的处理代码     return count; }  static const struct file_operations my_fops = {     .open = my_open,     .release = my_release,     .read = my_read,     .write = my_write, }; 
  1. 将设备操作与设备文件节点关联:最后,你需要将设备操作与设备文件节点关联起来。这可以通过cdev_set_fops函数完成。
static int __init my_cdev_init(void) {     // ...(省略了之前的代码)      cdev_set_fops(&my_cdev, &my_fops);      return 0; } 

现在,你已经完成了设备的初始化工作。当模块被加载到内核时,设备文件节点将自动创建,并且用户空间可以通过/dev/my_device访问你的设备。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!