平台 | 内核版本 | 安卓版本 |
---|---|---|
RK3399 | Linux4.4 | Android7.1 |
[RK3399][Android7.1] 调试笔记 热成像传感器MLX90640(一)驱动
JNI
文件:native-lib.cpp
#include "IICDev.h"
#include <android/log.h>
#include <jni.h>
#include <stdio.h>
#include<stdlib.h>
using namespace std;
#define TAG "i2c_dev"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__)
extern "C" {
IICDev_Callback_func g_funs;
int g_init = 0;
JNIEXPORT jboolean JNICALL
Java_com_hopechart_myapplication_MainActivity_initFun(JNIEnv *env, jobject instance) {
if (IIC_DevSetCallbackFunc(&g_funs) < 0) {
return false;
}
g_init = 1;
return true;
}
JNIEXPORT jlong JNICALL
Java_com_hopechart_myapplication_MainActivity_open(JNIEnv *env, jobject instance) {
if (g_init) {
return g_funs.open();
}
return -1;
}
JNIEXPORT jint JNICALL
Java_com_hopechart_myapplication_MainActivity_close(JNIEnv *env, jobject instance) {
if (g_init) {
g_funs.close();
return 0;
}
return -1;
}
JNIEXPORT jint JNICALL
Java_com_hopechart_myapplication_MainActivity_init(JNIEnv *env, jobject instance) {
if (g_init) {
return g_funs.init();
}
return -1;
}
JNIEXPORT jintArray JNICALL
Java_com_hopechart_myapplication_MainActivity_getData(JNIEnv *env, jobject instance) {
jint n = 768;
jintArray rarr;
jint *oarr;
/*malloc*/
oarr = (jint *) malloc(sizeof(n) * n);
if (oarr == NULL) {
return 0;
}
/* create jintArray*/
rarr = env->NewIntArray(n);
if (rarr == NULL) {
return 0;
}
if (g_init) {
(jintArray) g_funs.gettemperature(oarr);
}
env->SetIntArrayRegion(rarr, 0, n, oarr);
return rarr;
}
}
回调函数
typedef int (*IICDev_Open)(void);
typedef void (*IICDev_Close)(void);
typedef int (*INIT)(void);
typedef int (*MLX_GetLatticeTe)(int *frameData);
typedef struct _IICDev_Callback_func {
IICDev_Open open;
IICDev_Close close;
INIT init;
MLX_GetLatticeTe gettemperature;
} IICDev_Callback_func;
回调函数的实现
int IIC_DevSetCallbackFunc(IICDev_Callback_func *pstIICDevCallbackfunc) {
if (pstIICDevCallbackfunc == NULL) {
printf("pstIICDevCallbackfunc null\n");
return -1;
}
pstIICDevCallbackfunc->open = iicdev_open;
pstIICDevCallbackfunc->close = iicdev_close;
pstIICDevCallbackfunc->init = MLX90640_INIT;
pstIICDevCallbackfunc->gettemperature = MLX90640_GetLatticeTe;
return 0;
}
open
int iicdev_open(void) {
LOGD("iicdev_open");
fd = open("/dev/i2c-se0", O_RDWR);
if (fd < 0) {
printf("open /dev/hq_adasplus failed\n");
return -1;
}
return 0;
}
close
void iicdev_close(void) {
if (fd >= 0)
close(fd);
}
初始化
//初始化
int MLX90640_INIT(void) {
LOGD("MLX90640_INIT");
int flesh;
int mybit;
int mymode;
int ret;
float Ta, tr, vdd;
//0
MLX90640_SetControlRegister(0b0001101000000001);
//1、刷新率
MLX90640_SetRefreshRate(0x03);
flesh = MLX90640_GetRefreshRate();
LOGD("xue this flesh %x \n", flesh);
//2、bit
MLX90640_SetResolution(0x01);
mybit = MLX90640_GetCurResolution();
LOGD("xue this mybit %x \n", mybit);
//3、模式
MLX90640_SetInterleavedMode();
mymode = MLX90640_GetCurMode();
LOGD("xue this mymode %x \n", mymode);
//4、
MLX90640_DumpEE(eeMLX90640);
ret = MLX90640_ExtractParameters(eeMLX90640, &mlx90640);
ret = MLX90640_GetFrameData(frame);
LOGD("xue ret = %d\n", ret);
//电压:3.3
vdd = MLX90640_GetVdd(frame, &mlx90640);
LOGD("xue vdd = %f\n", vdd);
Ta = MLX90640_GetTa(frame, &mlx90640);
LOGD("xue ta F= %f\n", Ta);
LOGD("xue ta D= %d\n", Ta);
return vdd;
}