點擊上方“嵌入式Linux充電站”,選擇“置頂/星標公眾號”
上篇介紹了procfs接口的創建,今天再介紹一種debugfs接口的創建。
實現效果
在/sys/kernel/debug/
目錄下創建一個ion/test
文件,通過cat
、echo
的方式進行讀寫操作:
前期準備
內核配置打開debugfs:
CONFIG_DEBUG_FS=y
登錄后復制
掛載debugfs文件系統:
mount -t debugfs none /sys/kernel/debug
登錄后復制
代碼實現
讀寫變量:
#include <linux/debugfs.h> #include <linux/module.h> #include <linux/types.h> 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 null\n"); return -1; } /* 創建/sys/kernel/debug/ion/test_u64文件 */ debugfs_create_u64("test_u64", 0644, ion_dir, &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");
登錄后復制
運行結果:
讀寫字符串:
#include <linux/debugfs.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/errno.h> #include <linux/dcache.h> #include <linux/types.h> static char ion_buf[512] = "hello\n"; static struct dentry *ion_dir; static int ion_open(struct inode *inode, struct file *filp) { //printk("ion open\n"); return 0; } ssize_t ion_read(struct file *filp, char __user *buf, size_t count, loff_t *offp) { int retval = 0; if ((*offp + count) > 512) count = 512 - *offp; if (copy_to_user(buf, ion_buf+*offp, count)) { printk("copy to user failed, count:%ld\n", 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 > 512) return 0; if (*offp + count > 512) count = 512 - *offp; if (copy_from_user(ion_buf+*offp, buff, count)) { printk("copy from user failed, count:%ld\n", 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 MODULE\n"); //創建一個/sys/kernel/debug/ion目錄 ion_dir = debugfs_create_dir("ion", NULL); if (!ion_dir) { printk("ion_dir is null\n"); return -1; } /* 創建/sys/kernel/debug/ion/test文件 */ struct dentry *filent = debugfs_create_file("test", 0644, ion_dir, NULL, &my_fops); if (!filent) { printk("test file is null\n"); 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");
登錄后復制
運行結果:
函數接口說明
創建目錄、文件函數:
/* 創建目錄 */ 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
以上就是Linux驅動 | debugfs接口創建的詳細內容,更多請關注www.92cms.cn其它相關文章!