ioctl()方法可以实现上面所有的情况(两种数据格式、以及I2C算法和smbus算法)。 针对i2c的算法,需要熟悉struct i2c_rdwr_ioctl_data 、struct i2c_msg。使用的命令是I2C_RDWR。 struct i2c_rdwr_ioctl_data { struct i2c_msg __user *msgs; /* pointers to i2c_msgs */ __u32 nmsgs; /* number of i2c_...
i2c_adapter_xxx_start();/*产生起始位*/if(msgs[i]->flags & I2C_M_RD) {/*读取*/i2c_adapter_xxx_setaddr((msg->addr <<1) |1);/*发送从设备地址*/i2c_adapter_xxx_wait_ack();/*获得从设备的ACK*/i2c_adapter_xxx_readbytes(msgs[i]->buf,msgs[i]->len);/*读取len长度的数据到buf中...
ioctl()方法可以实现上面所有的情况(两种数据格式、以及I2C算法和 smbus算法)。 针对i2c的算法,需要熟悉struct i2c_rdwr_ioctl_data 、struct i2c_msg。使用的命令是I2C_RDWR。 struct i2c_rdwr_ioctl_data { struct i2c_msg __user *msgs; /* pointers to i2c_msgs */ __u32 nmsgs; /* number of i2c...
static int i2cdev_attach_adapter(struct device *dev, void *dummy) { struct i2c_adapter *adap; struct i2c_dev *i2c_dev; int res; if (dev->type != &i2c_adapter_type) return 0; adap = to_i2c_adapter(dev); i2c_dev = get_free_i2c_dev(adap); if (IS_ERR(i2c_dev)) return PTR_...
static int iic_write(int i2c_fd, unsigned int reg_address ,unsigned int reg_val) { struct i2c_rdwr_ioctl_data work_queue; int ret; work_queue.nmsgs = 2; work_queue.msgs = (struct i2c_msg *)malloc(work_queue.nmsgs * sizeof(struct i2c_msg)); ...
if ((file = open(filename, O_RDWR)) < 0) { printf("Failed to open the bus."); return 1; } // 设置设备地址 if (ioctl(file, I2C_SLAVE, addr) < 0) { printf("Failed to acquire bus access and/or talk to slave.\n"); return 1; } // 写入数据 if (write(file, buf, 2) ...
首先弄清楚参数的含义,file是使用open打开的文件。read_write表示是读操作还是写操作,这里是写,所以它的值为I2C_SMBUS_WRITE。command是要写的地址。size的值为I2C_SMBUS_BYTE_DATA。最后一个参数data.byte=要写的字节数据。 下面开始进入ioctl系统调用,最后会到达i2c-dev.c中的i2cdev_ioctl函数,看它的定义: ...
用户态是通过ioctl(handle-fd, I2C_RDWR, &data)i数与i2c从设备进行数据交互。主要有2个步骤:首先是写入需要读取的寄存器的地址,然后从寄存器中读取数据。需要 2个数据包。如下: 7、int i2c_readtint fdd unsigned char addrt unsigned char eg, unsigned char *val) -int ret;struct I2c_rdwr_tcctl._data...
在应用层,可以使用标准的文件操作函数(如open、read、write、close等)以及特定的ioctl命令来与I2C设备进行通信。 常用的ioctl命令包括I2C_SLAVE(设置从设备地址)、I2C_RDWR(读写操作)等。 掌握Linux中I2C设备文件的访问方式: 打开I2C设备文件:使用open函数打开对应的/dev/i2c-X设备文件。 设置从设备地址:通过ioctl...
一个i2c控制器就对应一个i2c_board_info, 它驱动就是s3c2410_i2c_driver, 他们通过platform_bus_type协调工作。 一个i2c总线上的设备就对应内核中的一个i2c_client类型的对象, 它的驱动就是的i2c_driver, 二者通过i2c_bus_type协调工作。 同样是抽象的思路, 对于i2c总线本身, 内核也使用i2c_bus_type来描述。