平台 | 内核版本 | 安卓版本 |
---|---|---|
RK3399 | Linux4.4 | Android7.1 |
文章目录
i2c_jni.cpp
JNIEXPORT
和 JNICALL
是用于导出函数的、依赖于编译器的指示符。返回类型是映射到Java
类型的 C/C++
类型。
#include "IICDev.h"
#include <android/log.h>
#include <jni.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_iic_1as_init(JNIEnv *env, jobject instance)
{
if(IIC_DevSetCallbackFunc(&g_funs) < 0)
{
LOGD("init failed\n");
return false;
}
g_init = 1;
return true;
}
JNIEXPORT jlong JNICALL
Java_com_iic_1as_get_open_addr(JNIEnv *env, jobject instance)
{
if(g_init)
{
return (long)g_funs.open;
}
return -1;
}
JNIEXPORT jlong JNICALL
Java_com_iic_1as_get_close_addr(JNIEnv *env, jobject instance)
{
if(g_init)
{
return (long)g_funs.close;
}
return -1;
}
JNIEXPORT jlong JNICALL
Java_com_iic_1as_get_read_addr(JNIEnv *env, jobject instance)
{
if(g_init)
{
return (long)g_funs.read;
}
return -1;
}
JNIEXPORT jlong JNICALL
Java_com_iic_1as_get_write_addr(JNIEnv *env, jobject instance)
{
if(g_init)
{
return (long)g_funs.write;
}
return -1;
}
}
Callback
typedef int (*IICDev_Open)(void);
typedef unsigned char (*IICDev_Read)(unsigned char device_addr, unsigned char sub_addr, unsigned char *buff, int ByteNo);
typedef unsigned char (*IICDev_Write)(unsigned char device_addr, unsigned char sub_addr, unsigned char *buff, int ByteNo);
typedef void (*IICDev_Close)(void);
typedef struct _IICDev_Callback_func
{
IICDev_Open open;
IICDev_Read read;
IICDev_Write write;
IICDev_Close close;
}IICDev_Callback_func;
实现
typedef struct _SE_DATA
{
char reg;
int size;
char buff[256];
}SE_DATA;
int i2c_write(int fd, SE_DATA* data)
{
int ret = ioctl(fd, SE_IOC_SET_DATA, data);
if(ret < 0)
{
printf("SE_IOC_GET_DATA fail\n");
return -1;
}
return 0;
}
int i2c_read(int fd, SE_DATA* data)
{
int ret = ioctl(fd, SE_IOC_GET_DATA, data);
if(ret < 0)
{
printf("SE_IOC_GET_DATA fail, %s\n", strerror(errno));
return -1;
}
return 0;
}
/////////////////////////////////////////////////////////////
int iicdev_open(void)
{
fd = open("/dev/i2c-se0", O_RDWR);
if(fd < 0)
{
printf("open /dev/hq_adasplus failed\n");
return -1;
}
return 0;
}
void iicdev_close(void)
{
if(fd >= 0)
close(fd);
}
unsigned char iicdev_read(unsigned char device_addr, unsigned char sub_addr, unsigned char *buff, int ByteNo)
{
if(buff == NULL)
{
printf("buff null\n");
return 1;
}
SE_DATA data;
memset(data.buff, 0, sizeof(data.buff));
data.reg = sub_addr;
data.size = ByteNo;
int ret = i2c_read(fd, &data);
if(ret == 0)
memcpy(buff, data.buff, data.size);
return ret;
}
unsigned char iicdev_write(unsigned char device_addr, unsigned char sub_addr, unsigned char *buff, int ByteNo)
{
if(buff == NULL)
{
printf("buff null\n");
return 1;
}
SE_DATA data;
memcpy(data.buff, buff, ByteNo);
data.reg = sub_addr;
data.size = ByteNo;
return i2c_write(fd, &data);
}
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->read = iicdev_read;
pstIICDevCallbackfunc->write = iicdev_write;
return 0;
}