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

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

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

1.创建/proc文件节点

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

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这个要定义,

static const struct file_operations cam_proc_fops = {
	.owner		= THIS_MODULE,
	.write		= device_proc_write,
	.read       = device_proc_read,
	/*.open		&
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要使用Linux i2c驱动读写芯片的16位寄存器,可以按照以下步骤操作: 1. 定义一个i2c_msg结构体数组,用于存储i2c数据传输的信息,包括要读写的芯片地址、寄存器地址、数据等。 2. 使用ioctl函数设置i2c设备地址(I2C_SLAVE)。 3. 使用read和write函数读写i2c设备。 下面是一个简单的例子,展示了如何使用i2c驱动读取芯片的16位寄存器值: ``` #include <linux/i2c-dev.h> #include <sys/ioctl.h> #include <fcntl.h> #include <unistd.h> int main() { int file; char *filename = "/dev/i2c-1"; int addr = 0x50; // 芯片地址 int reg = 0x00; // 要读取的寄存器地址 char buf[2]; struct i2c_msg msgs[2] = { { .addr = addr, .flags = 0, .len = 1, .buf = &reg, }, { .addr = addr, .flags = I2C_M_RD, .len = 2, .buf = buf, }, }; struct i2c_rdwr_ioctl_data msgset = { .msgs = msgs, .nmsgs = 2, }; // 打开i2c设备文件 if ((file = open(filename, O_RDWR)) < 0) { printf("Failed to open i2c device\n"); return -1; } // 设置要访问的芯片地址 if (ioctl(file, I2C_SLAVE, addr) < 0) { printf("Failed to set i2c address\n"); return -1; } // 读取寄存器值 if (ioctl(file, I2C_RDWR, &msgset) < 0) { printf("Failed to read register\n"); return -1; } int data = (buf[0] << 8) | buf[1]; printf("Register value: 0x%x\n", data); close(file); return 0; } ``` 在上面的例子中,我们定义了一个i2c_msg结构体数组,包括了要写入的寄存器地址和要读取的数据。然后,我们使用ioctl函数设置了芯片的地址,并使用ioctl函数执行了读取操作。最后,我们从buf中读取了读取到的16位寄存器值。 如果要向芯片的16位寄存器写入数据,可以在msgs数组中添加一条写入数据的消息,例如: ``` char buf[3] = {reg, data >> 8, data & 0xff}; struct i2c_msg msgs[1] = { { .addr = addr, .flags = 0, .len = 3, .buf = buf, }, }; ``` 其中,data是要写入的16位数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值