android上层与linux内核驱动数据交互(控制驱动里的变量)
创建一个proc虚拟文件,应用层通过读写该文件,即可实现与内核的交互。
调用以下函数,即可实现proc文件夹的创建:
/*name:就是要创建的文件夹名称*/
/*parent:是要创建节点的父节点。也就是要在哪个文件夹之下创建新文件夹,需要将那个文件夹的proc_dir_entry传入。*/
/*如果是在/proc目录下创建文件夹,parent为NULL。*/
struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *parent);
例如:
struct proc_dir_entry *mytest_dir = proc_mkdir("mytest", NULL);
proc文件的创建
/*name:就是要创建的文件名。*/
/*mode:是文件的访问权限,以UGO的模式表示*/
/*parent与proc_mkdir中的parent类似。也是父文件夹的proc_dir_entry对象*/
/*proc_fops:就是该文件的操作函数了*/
static inline struct proc_dir_entry *proc_create(const char *name, mode_t mode, struct proc_dir_entry *parent, const struct file_operations *proc_fops);
例如:
struct proc_dir_entry *mytest_file = proc_create("mytest", 0x0644, NULL, mytest_proc_fops);
接下来看看mytest_proc_fops的定义。
static const struct file_operations mytest_proc_fops = {
.open = mytest_proc_open,
.read = seq_read,
.write = mytest_proc_write,
.llseek = seq_lseek,
.release = single_release,
};
实例
#include <linux/uaccess.h>
#include <linux/proc_fs.h>
int tp_side = 0;
static ssize_t proc_tp_switch_write(struct file *flip,const char __user *buf, size_t count, loff_t *data)
{
char buffer = 0;
if (copy_from_user(&buffer, buf, 1)) //这个地方注意count为1,否则应用层echo两个字符会导致内存溢出,系统dump
return -EFAULT;
printk(" --%s--%d\n",__func__,buffer);
switch(buffer)
{
case '0':
tp_side = 0;
break;
default:
tp_side = 1;
break;
}
return count;
}
static ssize_t proc_tp_switch_read(struct file *flip, char __user *user_buf, size_t count, loff_t *ppos)
{
int len = 0;
char buffer;
buffer = tp_side + '0';
printk(" --%s--%d\n",__func__,tp_side);
len = simple_read_from_buffer(user_buf, count, ppos, &buffer, 1);
return len;
}
static const struct file_operations proc_tp_swtich_fops = {
.write = proc_tp_switch_write,
.read = proc_tp_switch_read,
};
static int cst3xx_proc_tp_swtich_init(void)
{
int rc = 0;
tp_swtich_file = proc_create("cst3xx_swtich", 0777, NULL,&proc_tp_swtich_fops);
if (tp_swtich_file == NULL)
{
rc = -ENOMEM;
}
return rc;
}