在/proc目录创建文件

如何在用户层创建一个文件,并可以进行读写数据操作呢?

博主使用的是天嵌的板子335x_B

#include <linux/module.h>  
#include <linux/kernel.h>  
#include <linux/fs.h>  
#include <linux/init.h>  
#include <linux/delay.h>  
#include <asm/uaccess.h>  
#include <asm/irq.h>  
#include <asm/io.h>  
#include <mach/gpio.h>  
#include <mach/hardware.h>  
#include <linux/device.h>  
#include <linux/proc_fs.h>                  
      
#define PROC_DIR_NAME         "embedsky"         //文件夹名称
#define PROC_FILE_NAME     "boardinfo"           //文件名称
#define KBUFSIZE 20
#ifdef CONFIG_TQ3358_CoreBV1                  //这个地方的kbuf可以自己填充, 这里是为了读天嵌的板子型号做了条件编译
char kbuf[KBUFSIZE] = "TQ3358_CoreBV1";  //表示内核下的buf数组,供用户层读取
#elif CONFIG_TQ3358_CoreBV2
char kbuf[KBUFSIZE] = "TQ3358_CoreBV2";  //表示内核下的buf数组,供用户层读取
#elif CONFIG_TQ3358_CoreC
char kbuf[KBUFSIZE] = "TQ3358_CoreC";  //表示内核下的buf数组,供用户层读取
#endif

char wbuf[20];                                                //保存用户层传进来的数据
      
struct proc_dir_entry *proc_wrbuff_dir;  
      
static int proc_wrbuff_open(struct inode *inode,struct file *file);  
static ssize_t proc_wrbuff_read(struct file *file, char __user *ubuf, size_t count, loff_t *offset);  
static ssize_t proc_wrbuff_write(struct file *file, const char __user *ubuf, size_t count, loff_t *offset);  
      
      
static struct file_operations fops_proc_wrbuffer = {  
       .owner = THIS_MODULE,  
       .open = proc_wrbuff_open,                        
       .read = proc_wrbuff_read,  
       .write = proc_wrbuff_write,  
 };  
      
static int proc_wrbuff_open(struct inode *inode,struct file *file)  {  
        printk("open embedsky board device!\n");  
        return 0;  
}  
      
static ssize_t proc_wrbuff_read(struct file *file, char __user *ubuf, size_t count, loff_t *offset)  {  
       printk("read embedsky board device!-----%s !!!\n",kbuf);  
        if (count > strlen(kbuf))
        count = strlen(kbuf);
        if (count < 0 )
        return -3;
        if (copy_to_user(ubuf, kbuf, count)) {
        printk(KERN_ERR "copy_to_user failed! \n");
        return -4;
        }
        return count;  
}  
      
static ssize_t proc_wrbuff_write(struct file *file, const char __user *ubuf, size_t count, loff_t *offset)  {  
        if (count > 20)
        count = 20;
        if (count < 0 )
        return -3;
        if(copy_from_user(wbuf,ubuf,count)){
        printk(KERN_ERR "copy_to_user failed! \n");
        return -4;
        }
       printk("write embedsky board device!\n");  
        return 0;  
}  
      
static int __init proc_wrbuff_init(void)  {   
        int ret = 0;  
        struct proc_dir_entry *proc_file;  
      
        /*1  create parent dir in /porc */
        proc_wrbuff_dir = proc_mkdir(PROC_DIR_NAME, NULL);  //在、/proc目录下创建embedsky目录
        if(!proc_wrbuff_dir){  
            printk("create proc dir error!");  
            return -1;  
        }   
        /*2  creata device file in /proc/parent dir*/  
        proc_file = create_proc_entry(PROC_FILE_NAME, 0666, tq_proc_dir);   //在embedsky下创建boardinfo文件
        if (!proc_file) {  
            printk("create proc file error!");  
            ret =  -2;  
            goto no_proc_file;  
        }  
        /*3  set file operation point*/  
        proc_file->proc_fops = &fops_proc_wrbuffer;  
        return 0;  
      
no_proc_file:  
        remove_proc_entry(PROC_FILE_NAME,proc_wrbuff_dir);  
        return ret;  
}  
      
static void __exit proc_wrbuff_exit(void)  {  
        remove_proc_entry(PROC_FILE_NAME,proc_wrbuff_dir);  
}  
late_initcall(proc_wrbuff_init);  
module_exit(proc_wrbuff_exit);       
MODULE_AUTHOR("[email protected]");  
MODULE_DESCRIPTION("allwinner buffer read and write test driver,you can control this device use the interface in /proc dir.");  
MODULE_LICENSE("GPL");  

将驱动编译进去就可以在  /proc/embedsky/boardinfo 进行打开并读写操作了

猜你喜欢

转载自blog.csdn.net/a617996505/article/details/83343447