Linux驱动 | debugfs接口创建

点击上方“嵌入式linux充电站”,选择“置顶/星标公众号”

福利干货,第一时间送达
Linux驱动 | debugfs接口创建

上篇介绍了procfs接口的创建,今天再介绍一种debugfs接口的创建。

实现效果

在/sys/kernel/debug/目录下创建一个ion/test文件,通过cat、echo的方式进行读写操作:

Linux驱动 | debugfs接口创建
Linux驱动 | debugfs接口创建

前期准备

内核配置打开debugfs:

CONFIG_DEBUG_FS=y

挂载debugfs文件系统:

mount -t debugfs none /sys/kernel/debug

代码实现

读写变量:

#include <linux> #include <linux> #include <linux>  static struct dentry *ion_dir; static u64 test_u64 = 0;  static int __init debugfs_init(void) {      //创建一个/sys/kernel/debug/ion目录     ion_dir = debugfs_create_dir("ion", NULL);     if (!ion_dir) {         printk("ion_dir is nulln");         return -1;     }      /* 创建/sys/kernel/debug/ion/test_u64文件 */     debugfs_create_u64("test_u64", 0644,                         ion_dir, &amp;test_u64);      return 0; }  static void __exit debugfs_exit(void) {     debugfs_remove_recursive(ion_dir); }  module_init(debugfs_init); module_exit(debugfs_exit); MODULE_LICENSE("GPL");</linux></linux></linux>

运行结果:

Linux驱动 | debugfs接口创建

读写字符串:

#include <linux> #include <linux> #include <linux> #include <linux> #include <linux> #include <linux> #include <linux>  static char ion_buf[512] = "hellon"; static struct dentry *ion_dir;  static int ion_open(struct inode *inode, struct file *filp) {     //printk("ion openn");     return 0; }  ssize_t ion_read(struct file *filp, char __user *buf, size_t count, loff_t *offp) {     int retval = 0;     if ((*offp + count) &gt; 512)         count = 512 - *offp;      if (copy_to_user(buf, ion_buf+*offp, count)) {         printk("copy to user failed, count:%ldn", count);         retval = -EFAULT;         goto out;     }     *offp += count;     retval = count; out:     return retval; }  ssize_t ion_write(struct file *filp, const char __user *buff, size_t count, loff_t *offp) {     int retval;      if (*offp &gt; 512)         return 0;      if (*offp + count &gt; 512)         count = 512 - *offp;      if (copy_from_user(ion_buf+*offp, buff, count)) {         printk("copy from user failed, count:%ldn", count);         retval = -EFAULT;         goto out;     }     *offp += count;     retval = count; out:     return retval; }  struct file_operations my_fops = {     .owner = THIS_MODULE,     .read = ion_read,     .write = ion_write,     .open = ion_open, };  static int __init debugfs_init(void) {     printk("INIT MODULEn");      //创建一个/sys/kernel/debug/ion目录     ion_dir = debugfs_create_dir("ion", NULL);     if (!ion_dir) {         printk("ion_dir is nulln");         return -1;     }      /* 创建/sys/kernel/debug/ion/test文件 */     struct dentry *filent = debugfs_create_file("test", 0644, ion_dir, NULL, &amp;my_fops);     if (!filent) {         printk("test file is nulln");         return -1;     }      return 0; }  static void __exit debugfs_exit(void) {     debugfs_remove_recursive(ion_dir); }  module_init(debugfs_init); module_exit(debugfs_exit); MODULE_LICENSE("GPL");</linux></linux></linux></linux></linux></linux></linux>

运行结果:

Linux驱动 | debugfs接口创建

函数接口说明

创建目录、文件函数:

/* 创建目录 */ struct dentry *debugfs_create_dir(const char *name, struct dentry *parent);  /*创建节点 */ struct dentry *debugfs_create_file(const char *name, umode_t mode,                                    struct dentry *parent, void *data,                                    const struct file_operations *fops);

name:要创建的/sys/kernel/debug下的目录名

parent:父目录,用struct dentry结构体表示。如果直接在/sys/kernel/debug/下创建文件,则为NULL

创建不同大小的文件:

//创建十进制的无符号文件 void debugfs_create_u8(const char *name, umode_t mode,                        struct dentry *parent, u8 *value); void debugfs_create_u16(const char *name, umode_t mode,                         struct dentry *parent, u16 *value); void debugfs_create_u32(const char *name, umode_t mode,                         struct dentry *parent, u32 *value); void debugfs_create_u64(const char *name, umode_t mode,                         struct dentry *parent, u64 *value); //创建十六进制的无符号文件 void debugfs_create_x8(const char *name, umode_t mode,                        struct dentry *parent, u8 *value); void debugfs_create_x16(const char *name, umode_t mode,                         struct dentry *parent, u16 *value); void debugfs_create_x32(const char *name, umode_t mode,                         struct dentry *parent, u32 *value); void debugfs_create_x64(const char *name, umode_t mode,                         struct dentry *parent, u64 *value);

更详细的debugfs用法请参考官方文档:Documentation/filesystems/debugfs.txt

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享