linux 驱动调试时在线读写I2C寄存器的方法

调试I2C设备时经常需要修改寄存器的值,通常的方法是修改-》编译-》烧写-》重启,哪怕改一个寄存器也要这样折腾一下,很消耗时间,下面提供一种在线修改寄存器的方法,在终端中敲命令就可以写寄存器,不要上面那些步骤.

      这个方法的基础是读写/proc文件系统,不熟悉这个的可以自行学习,下面分步骤说明一下这种方法,注意这只是一个框架如果相拥在自己的系统上可能还有一些细要适配。

1.创建/proc文件节点

这个文件节点就是用户和设备寄存器交互的节点

[cpp] view plain copy print ?
  1. static int __init cam_create_procfs(void)  
  2. {  
  3.     struct proc_dir_entry *proc_cam_root = NULL;  
  4.     struct proc_dir_entry *ent;  
  5.   
  6.     proc_cam_root = proc_mkdir("cam", 0);  
  7.     if (!proc_cam_root) return -1;  
  8.   
  9.     ent = proc_create_data("device", 0777, proc_device_root,  
  10.                     &device_proc_fops, NULL);   
  11.         if (!ent) return -1;  
  12.   
  13.     return 0;  
  14. }  
static int __init cam_create_procfs(void)
{
	struct proc_dir_entry *proc_cam_root = NULL;
	struct proc_dir_entry *ent;

	proc_cam_root = proc_mkdir("cam", 0);
	if (!proc_cam_root) return -1;

	ent = proc_create_data("device", 0777, proc_device_root,
					&device_proc_fops, NULL); 
		if (!ent) return -1;

	return 0;
}

device_proc_fops这个要定义,

[html] view plain copy print ?
  1. static const struct file_operations cam_proc_fops = {  
  2.     .owner      = THIS_MODULE,  
  3.     .write      = device_proc_write,  
  4.     .read       = device_proc_read,  
  5.     /*.open     = led_proc_open,  
  6.     .read       = seq_read,  
  7.     .llseek     = seq_lseek,  
  8.     .release    = single_release,  
  9.     .write      = device_proc_write,*/  
  10. };  
static const struct file_operations cam_proc_fops = {
	.owner		= THIS_MODULE,
	.write		= device_proc_write,
	.read       = device_proc_read,
	/*.open		= led_proc_open,
	.read		= seq_read,
	.llseek		= seq_lseek,
	.release	= single_release,
	.write		= device_proc_write,*/
};

2.实现读写函数

[html] view plain copy print ?
  1. static char msg[255];  
  2. static int device_proc_write(struct file *file, const char *buf,  
  3.     size_t count, loff_t *pos)  
  4. {  
  5.     char *value;  
  6.     char *temp;  
  7.     char *ptr;  
  8.     unsigned int buff[3];  
  9.     int i = 0;  
  10.     u32 data = 0;  
  11.     if (copy_from_user((void*)msg, buf, count))  
  12.         return -EFAULT;  
  13.     value = msg;//simple_strtoul(msg,NULL,0);     
  14.     ptr = strrchr(value,'w');  
  15.   
  16.     while((temp = strsep(&value," "))!= NULL)  
  17.     {  
  18.     if(i == 0)  
  19.         {  
  20.         sscanf(temp,"%x",&buff[0]);  
  21.         i++;  
  22.         }  
  23.     else  
  24.         sscanf(temp,"%x",&buff[1]);  
  25.     }  
  26.       
  27.     if(ptr != NULL)  
  28.         {  
  29.         printk("writer cmd\n");  
  30.         xxx_i2c_write(client->addr, buff[0], buff[1], 10);  
  31.         }  
  32.     else{  
  33.         printk("read cmd\n");  
  34.         xxx_i2c_read_byte(client->addr, buff[0], &data);  
  35.         printk("data %x\n",data);  
  36.         }     
  37.     return 0;  
  38. }  
static char msg[255];
static int device_proc_write(struct file *file, const char *buf,
	size_t count, loff_t *pos)
{
	char *value;
	char *temp;
	char *ptr;
	unsigned int buff[3];
	int i = 0;
	u32 data = 0;
	if (copy_from_user((void*)msg, buf, count))
	    return -EFAULT;
	value = msg;//simple_strtoul(msg,NULL,0);	
	ptr = strrchr(value,'w');

	while((temp = strsep(&value," "))!= NULL)
	{
	if(i == 0)
		{
		sscanf(temp,"%x",&buff[0]);
		i++;
		}
	else
		sscanf(temp,"%x",&buff[1]);
	}
    
	if(ptr != NULL)
		{
		printk("writer cmd\n");
	    xxx_i2c_write(client->addr, buff[0], buff[1], 10);
        }
	else{
		printk("read cmd\n");
	    xxx_i2c_read_byte(client->addr, buff[0], &data);
		printk("data %x\n",data);
		}	
	return 0;
}

xxx_i2c_write是你的驱动代码使用的i2c写函数,这个要自己实现。

3.使用

上面步骤完成后就可以使用了

写寄存器

在adb shell下输入

echo "addr value w">/proc/dir_name
简单解释一下:
addr 要写的寄存器地址
value 要写入的值
w/r 读或写的标志位
注意addr value r之间是有一个空格
proc/dir_name 为设备创建的/proc文件节点

例:echo "3390 c0 w">/proc/cam/ov2655

向ov2655的0x3390寄存器写入0xc0

在线读的操作
感觉这个没有写有用
在adb shell下输入
echo "addr r">/proc/dir_name
简单解释一下:
addr 要读的寄存器地址
w/r 读或写的标志位
proc/dir_name 为设备创建的/proc文件节点例:echo "3390 r">/proc/cam/ov2655
读ov2655的0x3390寄存器,读取的结果在log中看(使用printk)

转子:http://blog.csdn.net/joard_yang/article/details/8156426

你可能感兴趣的:(linux,驱动)