linux 驱动调试时在线读写I2C寄存器的方法
2015-03-27 10:27
411 查看
调试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;
}
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,*/
};
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;
}
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
这个方法的基础是读写/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
相关文章推荐
- linux 驱动调试时在线读写I2C寄存器的方法
- linux驱动调试方法
- 调试LINUX驱动的方法
- linux 驱动调试添加调试宏方法
- linux驱动--调试方法总结
- linux驱动调试方法
- x4412开发板&ibox卡片电脑项目实战11-linux驱动的调试方法
- linux设备驱动学习笔记--内核调试方法之printk
- linux设备驱动第四篇:驱动调试方法 - 东辉在线的
- Linux驱动开发常用调试工具---之内存读写工具devmem和devkmem
- Linux下驱动调试方法
- Linux驱动开发常用调试工具---之内存读写工具devmem
- Linux驱动中保存读写文件方法
- Linux驱动开发常用调试工具---之内存读写工具devmem和devkmem
- x4412开发板&ibox卡片电脑项目实战11-linux驱动的调试方法
- Linux驱动开发常用调试工具---之内存读写工具devmem和devkmem
- Linux下段错误以及调试方法
- 在Zynq 7000平台上使用Linux spidev.c驱动,调试spi设备
- Linux环境下段错误的产生原因及调试方法小结
- linux+arm 网卡故障调试:ethtool&phy寄存器读写