linux设备驱动开发详解 通过O_RDWR IOCTL 读写i2c设备

来源:互联网 发布:openwrt修改wan口mac 编辑:程序博客网 时间:2024/06/08 03:48
#include <stdio.h>#include <linux/types.h>#include <fcntl.h>#include <unistd.h>#include <sys/types.h>#include <stdlib.h>#include <sys/ioctl.h>#include <errno.h>#include <assert.h>#include <string.h>#include <linux/i2c.h>#include <linux/i2c-dev.h>int main(int argc, char **argv){struct i2c_rdwr_ioctl_data work_queue;unsigned int idx;unsigned int fd;unsigned int slave_address, reg_address;unsigned char val;int i;int ret;unsigned int num;if(argc < 4){printf("Usage:\n%s /dev/i2c-x start_addr reg_addr\n", argv[0]);return 0;}fd = open(argv[1], O_RDWR);if(!fd){printf("Error on opening the device file \n");return 0;}sscanf(argv[2], "%x", &slave_address);sscanf(argv[3], "%x", &reg_address);if(argc == 4){num = 1;}else{sscanf(argv[4], "%d", &num);}work_queue.nmsgs = 2;// 消息数量work_queue.msgs = (struct i2c_msg *)malloc(work_queue.nmsgs *sizeof(struct i2c_msg));if(!work_queue.msgs){printf("Memery alloc error\n");close(fd);return 0;}ioctl(fd, I2C_TIMEOUT, 2);//设置超时ioctl(fd, I2C_RETRIES, 1);//设置重试次数for(i = reg_address; i < reg_address + num; i++){val = i;(work_queue.msgs[0]).len = 1;(work_queue.msgs[0]).addr = slave_address;(work_queue.msgs[0]).buf = &val;(work_queue.msgs[1]).len = 1;(work_queue.msgs[1]).flags = I2C_M_RD;(work_queue.msgs[1]).addr = slave_address;(work_queue.msgs[1]).buf = &val;ret = ioctl(fd, I2C_RDWR, (unsigned long) &work_queue);if(ret < 0)printf("Error during I2C_RDWR ioctl with error code: %d\n", ret);elseprintf("reg: %02x val: %c\n", i, val);}close(fd);return 0;}

在mini2440上读取EEPROM10个字节

/drv/i2c # ./i2ctest /dev/i2c-0 0x50 0 10

reg: 00 val: l
reg: 01 val: o
reg: 02 val: n
reg: 03 val: g
reg: 04 val: 


reg: 05 val:  
reg: 06 val: l
reg: 07 val: o
reg: 08 val: n
reg: 09 val: g





0 0
原创粉丝点击