[RK3399][Android7.1] 加密芯片支持(二)JNI

平台 内核版本 安卓版本
RK3399 Linux4.4 Android7.1

文章目录

i2c_jni.cpp

JNIEXPORTJNICALL 是用于导出函数的、依赖于编译器的指示符。返回类型是映射到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;
}
发布了270 篇原创文章 · 获赞 95 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/qq_33487044/article/details/104368051