在Android源码树中添加userspace I2C读写工具(i2c-util)
来源:互联网 发布:数据总线宽度 编辑:程序博客网 时间:2024/04/30 10:44
by @宋宝华Barry
原文地址,请尊重作者的版权等信息!
http://blog.csdn.net/21cnbao/article/details/7919055
[cpp] view plaincopy
#include <stdio.h>
#include <linux/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <assert.h>
#include <string.h>
#include <linux/i2c.h>
/* This is the structure as used in the I2C_RDWR ioctl call */
struct i2c_rdwr_ioctl_data {
struct i2c_msg __user *msgs; /* pointers to i2c_msgs */
__u32 nmsgs; /* number of i2c_msgs */
};
int i2c_read_reg(char *dev, unsigned char *buf, unsigned slave_address, unsigned reg_address, int len)
{
struct i2c_rdwr_ioctl_data work_queue;
unsigned char w_val = reg_address;
int ret;
int fd = open(dev, O_RDWR);
if (!fd) {
printf("Error on opening the device file\n");
return 0;
}
work_queue.nmsgs = 2;
work_queue.msgs = (struct i2c_msg*)malloc(work_queue.nmsgs *sizeof(struct
i2c_msg));
if (!work_queue.msgs) {
printf("Memory alloc error\n");
close(fd);
return 0;
}
ioctl(fd, I2C_TIMEOUT, 2);
ioctl(fd, I2C_RETRIES, 1);
(work_queue.msgs[0]).len = 1;
(work_queue.msgs[0]).addr = slave_address;
(work_queue.msgs[0]).buf = &w_val;
(work_queue.msgs[1]).len = len;
(work_queue.msgs[1]).flags = I2C_M_RD;
(work_queue.msgs[1]).addr = slave_address;
(work_queue.msgs[1]).buf = buf;
ret = ioctl(fd, I2C_RDWR, (unsigned long) &work_queue);
if (ret < 0) {
printf("Error during I2C_RDWR ioctl with error code: %d\n", ret);
close(fd);
free(work_queue.msgs);
return 0;
} else {
printf("read salve:%02x reg:%02x\n", slave_address, reg_address);
close(fd);
free(work_queue.msgs);
return len;
}
}
int i2c_write_reg(char *dev, unsigned char *buf, unsigned slave_address, unsigned reg_address, int len)
{
struct i2c_rdwr_ioctl_data work_queue;
unsigned char w_val = reg_address;
unsigned char w_buf[len+1];
int ret;
w_buf[0] = reg_address;
int fd = open(dev, O_RDWR);
if (!fd) {
printf("Error on opening the device file\n");
return 0;
}
work_queue.nmsgs = 1;
work_queue.msgs = (struct i2c_msg*)malloc(work_queue.nmsgs *sizeof(struct
i2c_msg));
if (!work_queue.msgs) {
printf("Memory alloc error\n");
close(fd);
return 0;
}
ioctl(fd, I2C_TIMEOUT, 2);
ioctl(fd, I2C_RETRIES, 1);
(work_queue.msgs[0]).len = 1 + len;
(work_queue.msgs[0]).addr = slave_address;
(work_queue.msgs[0]).buf = w_buf;
memcpy(w_buf + 1, buf, len);
ret = ioctl(fd, I2C_RDWR, (unsigned long) &work_queue);
if (ret < 0) {
printf("Error during I2C_RDWR ioctl with error code: %d\n", ret);
close(fd);
free(work_queue.msgs);
return 0;
} else {
printf("write salve:%02x reg:%02x\n", slave_address, reg_address);
close(fd);
free(work_queue.msgs);
return len;
}
}
int main(int argc, char **argv)
{
unsigned int fd;
unsigned int slave_address, reg_address;
unsigned r_w;
unsigned w_val;
unsigned char rw_val;
if (argc < 5) {
printf("Usage:\n%s /dev/i2c-x start_addr reg_addr rw[0|1] [write_val]\n", argv[0]);
return 0;
}
fd = open(argv[1], O_RDWR);
if (!fd) {
printf("Error on opening the device file %s\n", argv[1]);
return 0;
}
sscanf(argv[2], "%x", &slave_address);
sscanf(argv[3], "%x", ®_address);
sscanf(argv[4], "%d", &r_w);
if (r_w == 0) {
i2c_read_reg(argv[1], &rw_val, slave_address, reg_address, 1);
printf("Read %s-%x reg %x, read value:%x\n", argv[1], slave_address, reg_address, rw_val);
} else {
if (argc < 6) {
printf("Usage:\n%s /dev/i2c-x start_addr reg_addr r|w[0|1] [write_val]\n", argv[0]);
return 0;
}
sscanf(argv[5], "%d", &w_val);
if ((w_val & ~0xff) != 0)
printf("Error on written value %s\n", argv[5]);
rw_val = (unsigned char)w_val;
i2c_write_reg(argv[1], &rw_val, slave_address, reg_address, 1);
}
return 0;
}
在android/external/新建i2c-util目录,上述源代码存入android/external/i2c-util/i2c-util.c,编写对应的Android.mk:
[plain] view plaincopy
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := i2c-util
LOCAL_SRC_FILES += \
i2c-util.c \
include $(BUILD_EXECUTABLE)
编译Android后,上述工具会位于/system/bin目录。在电路板上使用它:
[plain] view plaincopy
/ # i2c-rw /dev/i2c-2 0x38 0x1 0
read salve:38 reg:01 value:12
/ #
/ # i2c-rw /dev/i2c-2 0x38 0x2 0
read salve:38 reg:02 value:81
0 0
- 在Android源码树中添加userspace I2C读写工具(i2c-util)
- 在Android源码树中添加userspace I2C读写工具(i2c-util)
- 在Android源码树中添加userspace I2C读写工具(i2c-util)
- 在Android源码树中添加userspace I2C读写工具(i2c-util)
- 在Android源码树中添加userspace I2C读写工具(i2c-util)
- Android源码树中添加userspace I2C读写工具(i2c-util)
- 在Android源码树中添加userspace I2C读写工具
- MTK android平台添加读写i2c设备工具
- MTK android平台添加读写i2c设备工具
- amlogic平台android uboot中添加i2c设备实现i2c的读写
- amlogic平台android 系统linux内核中添加i2c设备实现i2c的读写
- android/linux读写I2C调试工具
- 在Android手机中通过i2c读取芯片寄存器(含i2c-tools)
- 在boot中添加i2c使用得方法
- 在Aboot中添加i2c使用得方法二
- I2c在应用层读写有两种方式
- i2c驱动(二)---读写芯片i2c寄存器
- Android平台读写i2c设备开发笔记
- 重复3次的蒙特卡罗算法
- Makefile自动生成(autotools工具的使用)
- json数据处理技巧(字段带空格、增加字段)
- 10-0. 说反话 (20)
- 再看TCP/IP第一卷>关于链路层的知识细节及相关协议
- 在Android源码树中添加userspace I2C读写工具(i2c-util)
- 数据泄露防护- BadUSB 制作 模拟
- XCode快捷键
- LXC(Linux Container)
- ECMASCRIPT——Js中的数据类型、运算符、流程控制、函数作用域链、预解析、匿名函数自执行、怪异的几个地方
- 2.字符排序
- vc中调用Com组件的方法详解
- 《挑战程序设计》第一章第一题
- OSG场景保存