/proc 文件系统——提供一种驱动调试的利器
2013-12-05 16:11
190 查看
做了几年的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);
}
经常调试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);
}
相关文章推荐
- Intel Flash的驱动实现及提供给文件系统Flash File System的一些接口
- [linux device driver] Chapter 04:使用/proc文件系统查询调试
- /proc文件系统用于内核调试
- 驱动调试之proc文件系统
- kobox: key_proc.c -v1 怎样使用proc文件系统调试驱动
- Linux 字符设备驱动开发基础(六)—— VFS 虚拟文件系统解析
- 使用 /proc 文件系统来访问 Linux 内核的内容
- 使用 /proc 文件系统来访问 Linux 内核的内容
- 实时管理 Linux - 使用 /proc 文件系统来控制系统
- 使用 /proc 文件系统来访问 Linux 内核的内容
- android系统平台显示驱动开发简要:LCD驱动调试篇『四』
- minifilter开发文件过滤驱动、以及syser调试的经验
- 使用/PROC文件系统来控制系统
- 驱动调试之打印到proc虚拟文件1
- Windows文件系统过滤驱动开发教程
- 一种新型FLASH文件系统UBI/UBIFS—-很不错的开源项目
- 文件系统Minifilter驱动(六)
- 文件系统驱动编程基础篇之五——注册表与Inf
- 文件系统驱动编程基础篇之4——Wmi管理规范 mof文件
- Android系统移植与调试之------->build.prop文件详细赏析