在Android源码树中添加userspace I2C读写工具(i2c-util)
在Android源码树中添加userspace I2C读写工具(i2c-util)
http://blog.csdn.net/21cnbao/article/details/7919055
by @宋宝华Barry
通过/dev/i2c-n节点,用户可以在userspace直接访问板上的i2c外设寄存器,主要是透过I2C_RDWR这个IO控制命令将i2c_msg数组传递给kernel去执行。下面的代码可以完成这个功能:
- #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:
- 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目录。在电路板上使用它:
- / # 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
在Android源码树中添加userspace I2C读写工具(i2c-util)的更多相关文章
- 【转】--在Android源码树中添加userspace I2C读写工具(i2c-util)
通过/dev/i2c-n节点,用户可以在userspace直接访问板上的i2c外设寄存器,主要是透过I2C_RDWR这个IO控制命令将i2c_msg数组传递给kernel去执行.下面的代码可以完成这个 ...
- Android源码中添加C可执行程序
在Android源码中添加C/CPP可执行程序一般保存在external目录中 下面是每个文件的内容 ①add.c #include "add.h" int add (int a, ...
- Android源码中添加APP
参考罗升阳<Android系统源代码情景分析> 在Android源码中,我们通常把实验性质的Android APP放在packages/experimental目录下.对于一个简单的应用程 ...
- 在Android 源码中添加系统服务
Android系统本身提供了很多系统服务,如WindowManagerService,PowerManagerService等.下面描述一下添加一个系统服务的具体步骤. 1.定义自定义系统服务接口 撰 ...
- Eclipse与Android源码中ProGuard工具的使用
由于工作需要,这两天和同事在研究android下面的ProGuard工具的使用,通过查看android官网对该工具的介绍以及网络上其它相关资料,再加上自己的亲手实践,算是有了一个基本了解.下面将自己的 ...
- Eclipse与Android源码中ProGuard工具的使用(代码混淆)
由于工作需要,这两天和同事在研究android下面的ProGuard工具的使用,通过查看android官网对该工具的介绍以及网络上其它相关资料,再加上自己的亲手实践,算是有了一个基本了解.下面将自己的 ...
- Android源码中编译出指定jar包
今天想把android源码/vendor/letv/frameworks/base/java下的源码编译成 framework-letv.jar供乐乐语音客户端使用,编译完后,发现jar包文件虽然生成 ...
- Android源码中的FLAG为何使用16进制
1.在阅读源码的时候经常发现有一些标志属性使用一些位操作来判断是否具有该标志,增加标志或者去除标志. 比如View.java中的 /** * This view does not want keyst ...
- 关于android源码中的APP编译时引用隐藏的API出现的问题
今天在编译android源码中的计算器APP时发现,竟然无法使用系统隐藏的API,比如android.os.ServiceManager中的API,引用这个类时提示错误,记忆中在android源码中的 ...
随机推荐
- Oracle varchar与varchar2的区别
varchar -- 存放定長的字符数据,最长2000個字符:varchar2 -- 存放可变长字符数据,最大长度为4000字符. varchar2是oracle提供的独特的数据类型oracle保证在 ...
- delphi Tdxribbon 设置背景和skin 皮肤
https://blog.csdn.net/maxwoods/article/details/8592389 http://www.cnblogs.com/baoluo/archive/2011/04 ...
- 用ndk-stack分析应用native程序异常crash掉
adb logcat | "/home/hxl/bin/android-ndk-r10d/ndk-stack" -sym "/home/hxl/plu/BadGame/p ...
- Gson全解析(中)-TypeAdapter的使用
TypeAdapter介绍 前面的Gson全解析(上)中我们理解并分别运用了JsonSerializer和JsonDeserializer进行JSON和java实体类之间的相互转化.这里利用TypeA ...
- inet_ntoa内存问题
最近写的一个程序,大致用到以下代码: WSADATA wsaData; WSAStartup (MAKEWORD( 2, 2 ),&wsaData); struct addrinfo *aiL ...
- 使用SpringBoot入门案例
一.创建项目 二.给根项目UnicomCmp的pom.xml,加入parent节点(spring-boot-starter-parent) <!--Add Spring boot Parent- ...
- oracle 11g 安装及netca,dbca乱码之解决
在中文Linux下安装Oracle 11g,运行runInstaller后默认会出现乱码,解决办法如下: 1.准备字体zysong.ttf,点击下载,解压下载到的fallback 2.使用归档管理器打 ...
- CoffeeScript简介 <二>
集合与迭代 .. 与 ... 先看例子: arr = ["a1", "a2", "a3", "a4", "a5 ...
- springboot 项目中获取默认注入的序列化对象 ObjectMapper
在 springboot 项目中使用 @SpringBootApplication 会自动标记 @EnableAutoConfiguration 在接口中经常需要使用时间类型,Date ,如果想要格式 ...
- 浏览器对HTML5特性检測工具Modernizr
近期在做公司移动端运营的项目,需求中多处地方都会涉及动画. 相信非常多前端开发都会有这样的感触,对CSS3中的动画属性非常熟悉,可是因为对动画运动过程的理解不深入,经常仅仅能望而止步.CSS3中动画这 ...