完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
准备工作:1.csdn使用环境/
adbwireless 准备工作 :https://blog.net/Chjnavy/articletails/963584 https ://blog.csdn.4.88.2/article/details/98Chhjnavy/article/details/98Chhjnavy jni将C与java互通 参考:https ://blog.csdn.net/Chhjnavy/article/details/94721080目标板:rk3288 android 系统:android7.1.2 1.源码根目录:/kernel/arch/arm/boot/dts在rk3288-miniarm.dts文件中添加spi节点设备 &spi2 { 状态=“好的”; 最大频率=《50000000》; spidev@0 { 探险=“rockchip,spi_tinker”; 注册 = 《0》; spi-max-频率=《50000000》; spi-cpha = 《 }; spidev@1 { 兼容 = “rockchip,spi_tinker”; 注册 = 《1》; spi-max-频率=《50000000》; spi-cpha = 《1》; }; }; 2.make menuconfig 添加驱动模块 3.kernel重新编译编译后,将最终的两个镜像记录在SD卡上,通过终端可以/dev查看下设备spidev2.0 spidev2.1 spidev2.0 spidev2.1 中连接点的端口号和1个SPI接口的数字表示,cs10的端口将数字表示 为:使用杜邦线_将接口的数字表示为: 杜邦线_ 3 的 SPI 信号与接口的 SPI 接口 =D DI 接口与 GP8 的 SPI 接口表示 GP2 的 SPI 接口 3 和 SPI 接口 28 、 GP8B0_SPI2RX GP8A6_SPI2CLK = CLK 、 GP8A7_SPI2CSN0 = CS 、 GND = GND 4.通过打开spidev2.0设备(CS连接即GP8A7_SPI2CSN0)获取设备号 /* * unsigned char u8BusIndex硬件使用表示是从UI中获取的spidev2.x 0 还是1 *这里cs连接是0 * */ int SPI_open(unsigned char u8BusIndex) { 字符 szDev[16] = {0}; int fd,ret; sprintf(szDev,“/dev/spidev2.%d”,u8BusIndex); fd = 打开(szDev,O_RDWR); 登录(“**************************************************** ***** **fd = %d”,fd); 如果(fd《0){ perror(“无法打开 SPI 设备n”); } ret = ioctl(fd, SPI_IOC_WR_MODE,&mode); 如果(ret == -1) LOGD(“无法设置spi模式”); ret = ioctl(fd, SPI_IOC_RD_MODE,&mode); 如果(ret == -1) LOGD(“可以” ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits); 如果(ret == -1) LOGD(“不能设置每个字的位数”); ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits); 如果(ret == -1) LOGD(“不能得到每个字的位数”); ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed); 如果(ret == -1) LOGD(“无法设置最大速度hz”); ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed); 如果(ret == -1) LOGD(“无法获得最大速度hz”); LOGD(“spi模式:%dn”,模式); LOGD(”每个字的曝光:%dn“,位); LOGD(“最大速度:%d Hz(%d MHz)n”,速度,速度/1000000); 返回 fd; 5.通过spi 提供的结构体结构 spi_ioc_transfer xfer[7];来配置spi_id_1 Q_Den /* 命令类型MX5L25 内存类型 RDID 9Fh 密 C2 2 2 RES ABh 电子身份证 18 REMS 90h 制造商ID 设备ID C2 11 AFh 制造商ID类型 C2 20 19 * /unsigned int u8BusIndex) { 诠释; 烟草 fd; uint8_t 读取IDCmd[1]; uint8_t readDummy[1]; uint8_t readDummy2[1]; uint8_t readADD[1]; uint8_t 数据 ID[3] = {0}; fd = SPI_open(u8BusIndex); 如果(fd《0){ LOGD(“打开设备失败===================fd = %d”,fd); 返回-1; } 结构 spi_ioc_transfer xfer[7]; memset(xfer, 0, sizeof(xfer)); 读取IDCmd[0]=0x9F; xfer[0].tx_buf =(unsigned long)readIDCmd; xfer[0].len = 1; readDummy[0]=0x00; xfer[1].tx_buf =(unsigned long)readDummy; xfer[1].len = 1; readDummy2[0]=0x00; xfer[2].tx_buf =(unsigned long)readDummy2; xfer[2].len = 1; 读加[0]=0x00; xfer[3].tx_buf =(unsigned long)readADD; xfer[3].len = 1; xfer[4].rx_buf = (unsigned long)dataID; xfer[4].len = 1; xfer[5].rx_buf = (unsigned long)(dataID+1); xfer[5].len = 1; xfer[6].rx_buf = (unsigned long)(dataID+2); xfer[6].len = 1; ret = ioctl(fd, SPI_IOC_MESSAGE(7), xfer); 如果(ret《0) { LOGD(“********************错误:SPI_IOC_MESSAGEn”); 返回-1; } LOGD(”dataID[0]****************************************** * ****** = %x“,数据ID[0]); LOGD(”dataID[1]************************************************ ***** ****** = %x“,数据ID[1]); LOGD(”dataID[2]************************************************ ***** ****** = %x“,数据ID[2]); 返回 ret; 6.在jni中直接 调用 函数 int SPI_readFlashID(unsigned int u8BusIndex) 自动打印查看spi ID,完整代码如下: #include 《stdio.h》 #include《stdlib.h》 #include 《数学.h》 #include 《linux/types.h》 #include 《fcntl.h》 #include 《unistd.h》 #include 《stdlib.h》 #include 《sys/types.h》 #include 《sys/ioctl.h》 #include 《字符串.h》 #include 《linux /i2c.h》 #include 《linux/i2c-dev.h》 #include 《jni.h》 #include《android/log.h》 #include 《unistd.h》 #include 《getopt.h》 #include 《fcntl.h》 #include 《sys/ioctl.h》 #include 《linux/types.h》 #include 《linux/spi/spidev.h》 #include 《linux/gpio.h》 #define TAG ”myDemo-jni“ //这是自定义LOG的标识 #define LOGD(..) __android_log_print(ANDROID_LOG_DEBUG,TAG ,__VA_ARGS__) // 定义LOGD类型 #define LOGI(..) __android_log_print(ANDROID_LOG_INFO,TAG ,__VA_ARGS__) // 定义LOGI类型 #define LOGW(..) __android_log_print(ANDROID_LOG_WARN,TAG ,__VA_ARGS__) // 定义LOGW类型 #define LOGE(..) __android_log_print(ANDROID_LOG_ERROR,TAG ,__VA_ARGS__) // 定义LOGE类型 #define LOGF(..) __android_log_print(ANDROID_LOG_FATAL,TAG ,__VA_ARGS__) // 定义LOGF类型 #define TAG ”myDemo-jni“ //这是自定义LOG的标识 #define LOGD(..) __android_log_print(ANDROID_LOG_DEBUG,TAG ,__VA_ARGS__) // 定义LOGD类型 #定义逻辑(.. 。) __android_log_print(ANDROID_LOG_INFO,TAG ,__VA_ARGS__) // 定义LOGI类型 #define LOGW(..) __android_log_print(ANDROID_LOG_WARN,TAG ,__VA_ARGS__) // 定义LOGW类型 #define LOGE(..) __android_log_print(ANDROID_LOG_ERROR,TAG ,__VA_ARGS__) // 定义LOGE类型 #define LOGF(..) __android_log_print(ANDROID_LOG_FATAL,TAG ,__VA_ARGS__) // 定义LOGF类型 #define _Included_com_example_t613_spi_Java_Interface 静态无符号字符模式= SPI_MODE_0; 抽象无符号位 = 8; 抽象无符号延迟 = 10; 无运动频率00 = 220; #define ARRAY_SIZE(a)(sizeof(a)/sizeof((a)[0])) /* * unsigned char u8BusIndex 是从UI中获取的使用spidev2.x 表示使用0 还是1 *这里cs硬件连接0 * */ int SPI_open(unsigned char u8BusIndex) { 字符 szDev[16] = {0}; int fd,ret; sprintf(szDev,“/dev/spidev2.%d”,u8BusIndex); fd = 打开(szDev,O_RDWR); 日志(”****************************************************** ***** **fd = %d“,fd); 如果(fd《0){ perror(“无法打开 SPI 设备n”); } ret = ioctl(fd, SPI_IOC_WR_MODE,&mode); 如果(ret == -1) LOGD(“无法设置spi模式”); ret = ioctl(fd, SPI_IOC_RD_MODE,&mode); 如果(ret == -1) LOGD(“无法获取spi模式”); ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits); 如果(ret == -1) LOGD(“不能设置每个字的位数”); ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits); 如果(ret == -1) LOGD(“可以” ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed); 如果(ret == -1) LOGD(“无法设置最大速度hz”); ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed); 如果(ret == -1) LOGD(“无法获得最大速度 hz”); LOGD(“spi模式:%dn”,模式); LOGD(“每个字”的曝光:%d,位); LOGD(“最大速度:%d Hz(%d MHz)n”,速度,速度/1000000); 返回 fd; } int SPI_close(int dev_fh) { 返回关闭(dev_fh); REMS 90h 制造商ID 设备ID C2 18 QPIID AFh 制造商ID 内存类型 内存密度 C2 20 19 */ int SPI_readFlashID(unsigned int u8BusIndex) { 诠释; 烟草 fd; uint8_t 读取IDCmd[1]; uint8_t readDummy[1]; uint8_t readDummy2[1]; uint8_t readADD[1]; uint8_t 数据 ID[3] = {0}; fd = SPI_open(u8BusIndex); 如果(fd《0){ LOGD(“打开设备失败===================fd = %d”,fd); 返回-1; } 结构 spi_ioc_transfer xfer[7]; memset(xfer, 0, sizeof(xfer)); 读取IDCmd[0]=0x9F; xfer[0].tx_buf =(unsigned long)readIDCmd; xfer[0].len = 1; readDummy[0]=0x00; xfer[1].tx_buf =(unsigned long)readDummy; xfer[1].len = 1; readDummy2[0]=0x00; xfer[2].tx_buf =(unsigned long)readDummy2; xfer[2].len = 1; 读加[0]=0x00; xfer[3].tx_buf =(unsigned long)readADD; xfer[3].len = 1; xfer[4].rx_buf = (unsigned long)dataID; xfer[4].len = 1; xfer[5].rx_buf = (unsigned long)(dataID+1); xfer[5].len = 1; xfer[6].rx_buf = (unsigned long)(dataID+2); xfer[6].len = 1; ret = ioctl(fd, SPI_IOC_MESSAGE(7), xfer); 如果(ret《0) { LOGD(“************************错误:SPI_IOC_MESSAGEn”); 返回-1; } LOGD(“dataID[0]****************************************** * ****** = %x”,数据ID[0]); LOGD(“dataID[1]************************************************ ***** ****** = %x”,数据ID[1]); LOGD(“dataID[2]************************************************ ***** ****** = %x”,数据ID[2]); 返回 ret; } 外部“C” { JNIEXPORT ***yteArray JNICALL Java_com_example_t613_1spi_Java_1Interface_SPI_1read(JNIEnv *env, jobject instance, ***yte u8BusIndex, jint u32RegStart, jint nLen) { 诠释nRet; 无符号字符 u8Read[2] = {0}; ***yteArray jResult = env-》NewByteArray(nLen + 1); 无符号字符 *pTmp = (无符号字符 *)malloc(nLen + 1); 如果(!pTmp) { env-》SetByteArrayRegion(jResult, 0, 1, (***yte*)szTmp); }别的 { nRet = SPI_readFlashID((无符号字符)u8BusIndex); for(int i = 0; 我《nLen; i++) { pTmp[i + 1] = u8Read ; } pTmp[0] = nRet; 如果(nRet) { env-》SetByteArrayRegion(jResult, 0, 1, (***yte*)pTmp); } 别的 { env-》SetByteArrayRegion(jResult, 0, nLen + 1, (***yte*)pTmp); } 免费(pTmp); } LOGD(“================================================ ==================”); 返回 jResult; } JNIEXPORT jint JNICALL Java_com_example_t613_1spi_Java_1Interface_SPI_1write(JNIEnv *env, jobject instance, ***yte u8BusIndex, jint u32RegStart, ***yteArray _szBufWrite) { jint nRet; jint nLen = env-》GetArrayLength(_szBufWrite); ***yte *pszWrite = env-》GetByteArrayElements(_szBufWrite, NULL); for(int i = 0; 我《nLen; i++) { if(nRet)中断; } env-》ReleaseByteArrayElements(_szBufWrite, pszWrite, 0); 返回nRet; } } 注意: 1)通过终端给/dev/spidev2.0 授权 chmod 777 /dev/spidev2.0 2)jni代码中只是调用一下,UI中并没有显示出ID,ID通过logcat显示。 完整的app代码链接查看(点击阅读可以打印在android studio logcat下查看的flash ID): root@rk3288:/dev/block/platform/ff0f0000.rksdmmc/by-name #ls -l lrwxrwxrwx root root 2017-01-01 13:41 备份-》/dev/block/mmcblk0p7 lrwxrwxrwx root root 2017-01-01 13:41 开机-》/dev/block/mmcblk0p5 lrwxrwxrwx root root 2017-01-01 13:41 缓存-》/dev/block/mmcblk0p8 lrwxrwxrwx root root 2017-01-01 13:41 内核-》/dev/block/mmcblk0p4 lrwxrwxrwx root root 2017-01-01 13:41 kpanic -》/dev/block/mmcblk0p9 lrwxrwxrwx root root 2017-01-01 13:41 元数据-》/dev/block/mmcblk0p11 lrwxrwxrwx root root 2017-01-01 13:41 misc -》/dev/block/mmcblk0p2 lrwxrwxrwx root root 2017-01-01 13:41 激进更新-》/dev/block/mmcblk0p12 lrwxrwxrwx root root 2017-01-01 13:41 恢复-》/dev/block/mmcblk0p6 lrwxrwxrwx root root 2017-01-01 13:41 资源-》/dev/block/mmcblk0p3 lrwxrwxrwx root root 2017-01-01 13:41 系统-》/dev/block/mmcblk0p10 lrwxrwxrwx root root 2017-01-01 13:41 uboot-》/dev/block/mmcblk0p1 lrwxrwxrwx root root 2017-01-01 13:41 用户数据-》/dev/block/mmcblk0p13 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
基于米尔瑞芯微RK3576核心板/开发板的人脸疲劳检测应用方案
569 浏览 0 评论
839 浏览 1 评论
737 浏览 1 评论
1957 浏览 1 评论
3204 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 11:57 , Processed in 0.565295 second(s), Total 71, Slave 54 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号