创建proc节点之create_proc_entry

本文介绍如何通过create_proc_entry函数在Linux的proc虚拟文件系统中创建节点,实现用户空间与内核空间的数据交互,并提供了完整的代码示例。

proc虚拟文件系统也可以创建节点,实现用户空间与内核空间的交互。在驱动中创建节点,可以实现对硬件的控制。

1.创建proc节点

struct proc_dir_entry *create_proc_entry (const char *name, mode_t mode, struct proc_dir_entry *parent);
参数:
name:/proc/下节点的文件名,也可以是路径;例:“driver/demo”,在driver下创建demo节点
mode:访问权限,与普通文件相同;例:0666可读可写,0444只读,0222只写
parent:父目录,可以为 NULL(表示 /proc 根目录);

注意: parent的类型是proc_dir_entry的指针,不能直接填文件名字符串,最好是用路径初始化name参数,例:

create_proc_entry (“driver/demo”,0666,NULL);

create_proc_entry 的返回值是一个proc_dir_entry 指针(或者为 NULL,说明在 create 时发生了错误)。
可以使用这个返回的指针来配置这个虚拟文件的其他参数,例如在对该文件执行读操作时应该调用的函数。

2.删除proc节点

要从 /proc 中删除一个文件,可以使用 remove_proc_entry 函数

void remove_proc_entry( const char *name, struct proc_dir_entry *parent );

3.代码实例:

#include <linux/module.h>  
#include <linux/types.h>  
#include <linux/fs.h>  
#include <linux/errno.h>  
#include <linux/mm.h>  
#include <linux/init.h>  
#include <asm/uaccess.h>  
#include <linux/timer.h>  
#include <asm/atomic.h>  
#include <linux/slab.h>  
#include <linux/proc_fs.h>

static int temp = 0;    

static ssize_t demo_get(char *buffer, char **buffer_location,off_t offset, int buffer_length, int *eof, void *data)
{
    sprintf(buffer,"read ,demo temp is %d",temp);
    printk(KERN_NOTICE "read ,demo temp is %d\n",temp);
    return 0;
}

static ssize_t demo_set(struct file *file, const char *buffer, size_t count,loff_t *lof)
{
    sscanf(buffer, "%d", &temp);

    printk(KERN_NOTICE "write ,demo temp is %d\n",temp);
    return count;
}

int demo_init(void)  
{  
    printk(KERN_NOTICE "======== demo_init ");    
    int ret;  

    struct proc_dir_entry *entry;      

    entry= create_proc_entry("driver/demo",0666,NULL);
    if(entry)
    {
        entry->read_proc = demo_get;
        entry->write_proc = demo_set;
    }

    printk(KERN_NOTICE "======== demo_init end\n");  
    return 0;  

}  

void demo_exit(void)    /*模块卸载*/  
{  
    printk(KERN_NOTICE "End demo\n");   

    remove_proc_entry("driver/demo",NULL);

}  

MODULE_LICENSE("Dual BSD/GPL");  
module_param(temp, int, S_IRUGO);  
module_init(demo_init);  
module_exit(demo_exit); 
int ilitek_create_sysfsnode(void) { int ret = 0; struct i2c_client *client = ilitek_data->client; ilitek_data->ilitek_func_kobj = kobject_create_and_add("touchscreen", NULL); if (ilitek_data->ilitek_func_kobj == NULL) { tp_log_err("kobject_create_and_add failed\n"); } else { ret = sysfs_create_group(ilitek_data->ilitek_func_kobj, ilitek_attribute_group); if (ret < 0) { tp_log_err("sysfs_create_group failed\n"); kobject_put(ilitek_data->ilitek_func_kobj); } } ret = sysfs_create_group(&client->dev.kobj, ilitek_attribute_group); if (ret < 0) { tp_log_err("sysfs_create_group failed\n"); kobject_put(&client->dev.kobj); } return ret; } int32_t ilitek_create_tool_node(void) { int32_t ret = 0; // allocate character device driver buffer ret = alloc_chrdev_region(&ilitek_dev.devno, 0, 1, "ilitek_file"); if (ret) { tp_log_err("can't allocate chrdev\n"); //return ret; } else { tp_log_info("register chrdev(%d, %d)\n", MAJOR(ilitek_dev.devno), MINOR(ilitek_dev.devno)); // initialize character device driver cdev_init(&ilitek_dev.cdev, &ilitek_fops); ilitek_dev.cdev.owner = THIS_MODULE; ret = cdev_add(&ilitek_dev.cdev, ilitek_dev.devno, 1); if (ret < 0) { tp_log_err("add character device error, ret %d\n", ret); //return ret; } else { ilitek_dev.class = class_create(THIS_MODULE, "ilitek_file"); if (IS_ERR(ilitek_dev.class)) { tp_log_err("create class, error\n"); //return ret; } device_create(ilitek_dev.class, NULL, ilitek_dev.devno, NULL, "ilitek_ctrl"); } } ilitek_proc = proc_create("ilitek_ctrl", ILITEK_DEVICE_NODE_PERMISSON, NULL, &ilitek_fops); if (ilitek_proc == NULL) { tp_log_err("proc_create(ilitek_ctrl, ILITEK_DEVICE_NODE_PERMISSON, NULL, &ilitek_fops) fail\n"); } ilitek_proc_irq_enable = proc_create("ilitek_irq_enable", ILITEK_DEVICE_NODE_PERMISSON, NULL, &ilitek_irq_enable_fops); if (ilitek_proc_irq_enable == NULL) { tp_log_err("proc_create(ilitek_irq_enable, ILITEK_DEVICE_NODE_PERMISSON, NULL, &ilitek_irq_enable_fops) fail\n"); } #ifdef ILITEK_TUNING_NODE ilitek_proc_debug = proc_create("ilitek_debug", ILITEK_DEVICE_NODE_PERMISSON, NULL, &ilitek_debug_fops); if (ilitek_proc_debug == NULL) { tp_log_err("proc_create(ilitek_debug, ILITEK_DEVICE_NODE_PERMISSON, NULL, &ilitek_debug_fops) fail\n"); } ilitek_proc_debug_switch = proc_create("ilitek_debug_switch", ILITEK_DEVICE_NODE_PERMISSON, NULL, &ilitek_debug_fops_switch); if (ilitek_proc_debug_switch == NULL) { tp_log_err("proc_create(ilitek_debug, ILITEK_DEVICE_NODE_PERMISSON, NULL, &ilitek_debug_fops) fail\n"); } init_waitqueue_head(&(ilitek_data->inq)); ilitek_data->debug_data_frame = 0; #endif ilitek_sensortest_init(); ilitek_proc_entry = proc_mkdir("ilitek", NULL); if (!ilitek_proc_entry) { tp_log_err("Error, failed to creat procfs.\n"); } else { if (!proc_create("firmware_version", ILITEK_DEVICE_NODE_PERMISSON, ilitek_proc_entry, &ilitek_proc_fops_fwversion)) { tp_log_err("Error, failed to creat procfs firmware_version.\n"); remove_proc_entry("firmware_version", ilitek_proc_entry); } if (!proc_create("update_firmware", ILITEK_DEVICE_NODE_PERMISSON, ilitek_proc_entry, &ilitek_proc_fops_fwupdate)) { tp_log_err("Error, failed to creat procfs update_firmware.\n"); remove_proc_entry("update_firmware", ilitek_proc_entry); } if (!proc_create("sensor_test_data", ILITEK_DEVICE_NODE_PERMISSON, ilitek_proc_entry, &ilitek_proc_fops_sensortest)) { tp_log_err("Error, failed to creat procfs sensor_test.\n"); remove_proc_entry("sensor_test_data", ilitek_proc_entry); } if (!proc_create("noisefre_data", ILITEK_DEVICE_NODE_PERMISSON, ilitek_proc_entry, &ilitek_proc_fops_noisefre)) { tp_log_err("Error, failed to creat procfs noisefre_data.\n"); remove_proc_entry("noisefre_data", ilitek_proc_entry); } if (!proc_create("setmode_0", ILITEK_DEVICE_NODE_PERMISSON, ilitek_proc_entry, &ilitek_proc_fops_setmode_0)) { tp_log_err("Error, failed to creat procfs setmode_0.\n"); remove_proc_entry("setmode_0", ilitek_proc_entry); } if (!proc_create("setmode_1", ILITEK_DEVICE_NODE_PERMISSON, ilitek_proc_entry, &ilitek_proc_fops_setmode_1)) { tp_log_err("Error, failed to creat procfs setmode_1.\n"); remove_proc_entry("setmode_1", ilitek_proc_entry); } if (!proc_create("setmode_2", ILITEK_DEVICE_NODE_PERMISSON, ilitek_proc_entry, &ilitek_proc_fops_setmode_2)) { tp_log_err("Error, failed to creat procfs setmode_1.\n"); remove_proc_entry("setmode_2", ilitek_proc_entry); } } return 0; } 請問create node 的path?
最新发布
07-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值