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 分享