linux 用户空间与内核空间数据交互

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值