如何在用户层创建一个文件,并可以进行读写数据操作呢?
博主使用的是天嵌的板子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 进行打开并读写操作了