您的位置:首页 > 运维架构 > Linux

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

2015-03-27 10:27 363 查看
调试I2C设备时经常需要修改寄存器的值,通常的方法是修改-》编译-》烧写-》重启,哪怕改一个寄存器也要这样折腾一下,很消耗时间,下面提供一种在线修改寄存器的方法,在终端中敲命令就可以写寄存器,不要上面那些步骤.
      这个方法的基础是读写/proc文件系统,不熟悉这个的可以自行学习,下面分步骤说明一下这种方法,注意这只是一个框架如果相拥在自己的系统上可能还有一些细要适配。

1.创建/proc文件节点

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

[cpp]
view plaincopyprint?

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;  
}  

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 plaincopyprint?

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,*/  
};  

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 plaincopyprint?

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;  
}  

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: