/proc 文件系统——提供一种驱动调试的利器

原创 2013年12月05日 16:11:47

     做了几年的Android驱动开发,最经常碰到的是出问题时,需要实时获取设备的状态,寄存器值,GPIO状态等。或者在开发一个新的设备驱动,由于前期HAL层的代码还没完成,那么通过proc文件系统提供一个调试接口,可以说即简单又便捷。这也一种和内核通信的方式。

    经常调试codec,就以提供一个调试codec的接口为例,来说明吧,既然是一种和内核的通信方式,计算机里面涉及到通信的时候,往往需要一个通信协议来协调通信双方,那么实现这个调试接口,首先也设计一个简单的协议吧。codec调试最多的是就是读写寄存器了,以下这个示例就提供一个读写寄存器的方法。

首先会在/proc 目录下创建一个子目录 codec,并在之目录下创建两个节点,结构如下:

/proc

   |-----codec

             |------reg_read

             |------reg_write

reg_read:用于读取寄存器的节点,例如:echo 0x05 > reg_read 往该节点写入一个数值,表示要读取寄存器,示例表示显示0x5寄存器的值

reg_write:用于写入寄存器的节点,例如:echo 0x05  0xff > reg_write 往该节点写入两个数值,表示往某个寄存器写入某个值,示例表示往0x5寄存器写入0xff

以下是代码实现:

#include <linux/proc_fs.h>

static struct proc_dir_entry *codec_dir;
#define BUFF_SIZE 64

static ssize_t proc_write_reg(struct file *file, const char *buffer,
								unsigned long length, void *data)
{
	char reg_str[BUFF_SIZE] = {0};
	unsigned int reg;
	unsigned int value;
	char *str_end;

	if (length > BUFF_SIZE - 1)
		length = BUFF_SIZE - 1;
	if (copy_from_user(reg_str, buffer, length))
		return -EINVAL;
	printk("%s\n", reg_str);
	reg_str[length] = '\0';

	reg = simple_strtoul(reg_str, &str_end, 16);
	printk("reg: %#x\n", reg);

	value = simple_strtoul(str_end + 1, NULL, 16);
	printk("value: %#x\n", value);
	WRITE_REG(reg, value);

	return length;
}

static ssize_t proc_read_reg(struct file *file, const char *buffer,
					unsigned long length, void * data)
{
	char reg_str[BUFF_SIZE] = {'0'};
	unsigned int reg;

	if (length > BUFF_SIZE - 1)
		length = BUFF_SIZE - 1;
	if (copy_from_user(reg_str, buffer, length))
		return -EINVAL;

	printk("%s\n", reg_str);
	reg_str[length] = '\0';
	reg = simple_strtoul(reg_str, NULL, 16);
	printk("reg(%#x):%#x", reg, READ_REG(reg));

	return length;
}

static void init_proc(void)
{
	struct proc_dir_entry *reg_read, *reg_write;

	codec_dir = proc_mkdir("codec", NULL);
	reg_read = create_proc_entry("reg_read", 0644, codec_dir);
	if (reg_read)
		reg_read->write_proc = proc_read_reg;

	reg_write = create_proc_entry("reg_write", 0644, codec_dir);
	if (reg_write)
		reg_write->write_proc = proc_write_reg;

}

static void remove_proc(void)
{
	remove_proc_entry("reg_read", codec_dir);
	remove_proc_entry("reg_write", codec_dir);
}


linux proc接口

linux proc接口的建立与使用 /proc 文件系统是一个虚拟文件系统,通过它可以使用一种新的方法在 Linux® 内核空间和用户空间之间进行通信。在 /proc 文件系统中,我们可以将对虚拟文...
  • zhenwenxian
  • zhenwenxian
  • 2010年12月15日 00:22
  • 6042

驱动调试之proc文件系统

一、思维导读     我们知道在/proc目录下存在一些文件,我们可以使用cat、echo命令来查询和设置一些系统的信息(比如查看内存的信息和cpu的信息等),可见/proc目录下的文件提供给我们和内...
  • silent123go
  • silent123go
  • 2016年09月20日 19:18
  • 553

使用proc接口例子

在上一篇的使用sys接口来调试驱动的写完后,这里也将proc接口的例子贴出来。 proc.c的文件内容为 #include #include #include static int hel...
  • mike8825
  • mike8825
  • 2016年09月04日 21:02
  • 785

CLR 调试接口的架构与应用 [2] 调试框架

http://www.blogcn.com/user8/flier_lu/index.html?id=1894812     如 Don Box 在《.NET本质论 第1卷:公共语言运行库》一书的第1...
  • flier_lu
  • flier_lu
  • 2004年07月07日 20:00
  • 797

linux设备驱动学习笔记--内核调试方法之proc

/proc 文件系统是 GNU/Linux 特有的。它是一个虚拟的文件系统,因此在该目录中的所有文件都不会消耗磁盘空间。通过它能够非常简便地了解系统信息,尤其是其中的大部分文件是人类可阅读的(不过还是...
  • ITsenlin
  • ITsenlin
  • 2015年02月01日 22:04
  • 3476

【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】揭开Linux Proc文件系统的神秘面纱

声明:此文转载以下链接:嵌入式Linux学习之/proc伪文件系统(内核和内核模块向process发送信息机制的文件系统)                  揭开Linux Proc文件系统的神秘...
  • clam_zxf
  • clam_zxf
  • 2017年03月09日 10:58
  • 321

PROC 文件系统调节参数介绍

/proc/net/* snmp文件 Ip: ip项 Forwarding        : 是否开启ip_forward,1开启,2关闭 DefaultTTL       : IP默认ttl...
  • eydwyz
  • eydwyz
  • 2016年09月06日 13:59
  • 584

LDD之调试

linux内核调试方法
  • posado
  • posado
  • 2016年03月21日 16:35
  • 193

proc文件系统接口

内核提供的proc接口函数头文件linux/proc_fs.h struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir...
  • luckywang1103
  • luckywang1103
  • 2016年02月03日 14:13
  • 1224

驱动程序调试方法之printk——自制proc文件(一)

首先我们需要弄清楚proc机制,来看看fs/proc/proc_misc.c这个文件,从入口函数开始看: proc_misc_init(void)         #ifdef CONFI...
  • bytxl
  • bytxl
  • 2014年07月30日 08:49
  • 757
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:/proc 文件系统——提供一种驱动调试的利器
举报原因:
原因补充:

(最多只允许输入30个字)