androidi2c上层接口_android访问I2C接口

Java部分的代码:

package xxxxxxx.xx;

import android.app.Activity;

import android.os.Bundle;

import android.util.Log;

public class I2cRadioTest extends Activity {

private static final String TAG = "I2cRadioTest";

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

int[] buf = new int[4];

int slaveAddr = 0xXX;

int fileHander;

int mode = 0xXX | 0xXX;

int i;

I2c i2c = new I2c();

fileHander = i2c.open("/dev/i2c-1");

i2c.read(fileHander, slaveAddr, buf, 4);

Log.w(TAG,

"buf0= " + Integer.toHexString(buf[0]) + " buf1= "

+ Integer.toHexString(buf[1]) + " buf2= "

+ Integer.toHexString(buf[2]) + " buf=3 "

+ Integer.toHexString(buf[3]));

buf[0] = 0x01;

i = 0;// i2c.write(fileHander, slaveAddr, mode, buf, 1);

Log.w(TAG, "write length " + i);

for (int j = 0; j < 4; j++) {

buf[i] = 0;

}

i2c.read(fileHander, slaveAddr, buf, 4);

Log.w(TAG,

"buf0= " + Integer.toHexString(buf[0]) + " buf1= "

+ Integer.toHexString(buf[1]) + " buf2= "

+ Integer.toHexString(buf[2]) + " buf=3 "

+ Integer.toHexString(buf[3]));

i2c.close(fileHander);

if ((buf[0] & 0x10) == 0x01) {

Log.w(TAG, "------success-----");

} else {

Log.w(TAG, "----fail-------");

}

setContentView(R.layout.main);

}

}

package xxxxxx.xxx;

/**

* This is a I2C operation class

*/

public class I2c {

/**

* @param nodeName

*            node path name

* @return return file hander else return <0 on fail

*/

public native int open(String nodeName);

/**

* @param fileHander

* @param i2c_adr

*            slave addr

* @param buf

* @param Lenth

*            of buf

* @return read length

*/

public native int read(int fileHander, int i2c_adr, int buf[], int Length);

/**

* @param fileHander

* @param i2c_adr

*            slave addr

* @param sub_adr

*            sub addr

* @param buf

* @param Lenth

*            of buf

* @return write length

*/

public native int write(int fileHander, int i2c_adr, int sub_adr,

int buf[], int Length);

public native void close(int fileHander);

static {

System.loadLibrary("test-i2c");

}

}

JNI部分的代码:

/* DO NOT EDIT THIS FILE - it is machine generated */

#include

/* Header for class xxxxxx_xxx_I2c */

#include

#include

#include

#include

#include

#include

#ifndef _Included_xxxxxx_xxx_I2c

#define _Included_xxxxxx_xxx_I2c

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class:     xxxxxx_xxx_I2c

* Method:    open

* Signature: (Ljava/lang/String;)I

*/

JNIEXPORT jint JNICALL Java_xxxxxx_xxx_I2c_open

(JNIEnv *, jobject, jstring);

/*

* Class:     xxxxxx_xxx_I2c

* Method:    read

* Signature: (II[II)I

*/

JNIEXPORT jint JNICALL Java_xxxxxx_xxx_I2c_read

(JNIEnv *, jobject, jint, jint, jintArray, jint);

/*

* Class:     xxxxxx_xxx_I2c

* Method:    write

* Signature: (III[II)I

*/

JNIEXPORT jint JNICALL Java_xxxxxx_xxx_I2c_write

(JNIEnv *, jobject, jint, jint, jint, jintArray, jint);

/*

* Class:     xxxxxx_xxx_I2c

* Method:    close

* Signature: (I)V

*/

JNIEXPORT void JNICALL Java_xxxxxx_xxx_I2c_close

(JNIEnv *, jobject, jint);

#ifdef __cplusplus

}

#endif

#endif

#include "test-i2c.h"

#define  LOG_TAG    "i2c"

#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)

#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)

JNIEXPORT jint JNICALL Java_xxxxxx_xxx_I2c_open

(JNIEnv *env, jobject obj, jstring file)

{

char fileName[64];

const jbyte *str;

str = (*env)->GetStringUTFChars(env, file, NULL);

if (str == NULL) {

LOGI("Can't get file name!");

return -1;

}

sprintf(fileName, "%s", str);

LOGI("will open i2c device node %s", fileName);

(*env)->ReleaseStringUTFChars(env, file, str);

return open(fileName, O_RDWR);

}

JNIEXPORT jint JNICALL Java_xxxxxx_xxx_I2c_read

(JNIEnv * env, jobject obj, jint fileHander, jint slaveAddr, jintArray bufArr, jint len)

{

jint *bufInt;

char *bufByte;

int res = 0, i = 0, j = 0;

if (len <= 0) {

LOGE("I2C: buf len <=0");

goto err0;

}

bufInt = (jint *) malloc(len * sizeof(int));

if (bufInt == 0) {

LOGE("I2C: nomem");

goto err0;

}

bufByte = (char*) malloc(len);

if (bufByte == 0) {

LOGE("I2C: nomem");

goto err1;

}

(*env)->GetIntArrayRegion(env, bufArr, 0, len, bufInt);

res = ioctl(fileHander, I2C_SLAVE, slaveAddr);

if (res != 0) {

LOGE("I2C: Can't set slave address");

goto err2;

}

memset(bufByte, '\0', len);

if ((j = read(fileHander, bufByte, len)) != len) {

LOGE("read fail in i2c read jni i = %d buf 4", i);

goto err2;

} else {

for (i = 0; i < j ; i++)

bufInt[i] = bufByte[i];

LOGI("return %d %d %d %d in i2c read jni", bufByte[0], bufByte[1], bufByte[2], bufByte[3]);

(*env)->SetIntArrayRegion(env, bufArr, 0, len, bufInt);

}

free(bufByte);

free(bufInt);

return j;

err2:

free(bufByte);

err1:

free(bufInt);

err0:

return -1;

}

JNIEXPORT jint JNICALL Java_xxxxxx_xxx_I2c_write

(JNIEnv *env, jobject obj, jint fileHander, jint slaveAddr, jint mode,

jintArray bufArr, jint len)

{

jint *bufInt;

char *bufByte;

int res = 0, i = 0, j = 0;

if (len <= 0) {

LOGE("I2C: buf len <=0");

goto err0;

}

bufInt = (jint *) malloc(len * sizeof(int));

if (bufInt == 0) {

LOGE("I2C: nomem");

goto err0;

}

bufByte = (char*) malloc(len + 1);

if (bufByte == 0) {

LOGE("I2C: nomem");

goto err1;

}

(*env)->GetIntArrayRegion(env, bufArr, 0, len, bufInt);

bufByte[0] = mode;

for (i = 0; i < len; i++)

bufByte[i + 1] = bufInt[i];

res = ioctl(fileHander, I2C_SLAVE, slaveAddr);

if (res != 0) {

LOGE("I2C: Can't set slave address");

goto err2;

}

if ((j = write(fileHander, bufByte, len + 1)) != len + 1) {

LOGE("write fail in i2c");

goto err2;

}

LOGI("I2C: write %d byte", j);

free(bufByte);

free(bufInt);

return j - 1;

err2:

free(bufByte);

err1:

free(bufInt);

err0:

return -1;

}

JNIEXPORT void JNICALL Java_xxxxxx_xxx_I2c_close

(JNIEnv *env, jobject obj, jint fileHander)

{

close(fileHander);

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值