3588 pwm android12 的操作,包含 NDK native C++

问题: 客户需要在android12 的界面上操作板卡上的 PWM 蜂鸣器设备。

过程:

1 了解一下 3588 android12 源码的 关于PWM 的驱动。

设备树找不到 pwm

但是,

还不知道,android12 最终包含的 设备树是哪个,但是经过我的测试, 在android12 的 shell 里可以通过 sysfs 操作 pwm15.

2 了解一下PWM 子系统。

主要参考的是 正点原子的手册。

linux 有pwm 子系统。 芯片厂商需要完成的函数。

官方的pwm 驱动 只是在 /sys/ 目录下生成节点。

3 能否在 /dev/ 下生成设备节点。

感觉是可以的。

可以按照裸机的方式+字符设备的方式,自己写驱动。

能不能 改官方的 pwm子系统呢? 估计不行,太复杂。

4 怎么在andorid界面上 操作 PWM

要么是 写一个 操作 /sys/ 节点的C应用程序,然后,android app 去调用这个应用程序。

要么就是通过 NDK的方式 去操作 PWM , 但是最后还是会走到 操作 /sys/ 的设备节点。

5 测试一下直接在shell 中操作 /sys/ 看看有没有权限的限制。

发现没有。

6 接下俩写一个 C程序,在shell 中执行,看看,有没有权限。

后来我发现,在andoid12 的shell 中,无法使用 gcc 编译器,难道是没有 gcc 编译器吗?

所以只能是, 先编译好, 应用程序,然后拷贝到 android12 的命令行,测试。

但是没有找到 android12 的编译器路径。

使用这种方法也不行。

干脆使用 linux 源码中的编译器。
 

直接在 build.sh 中便找到了。

用这个编译一遍测试一下。

将程序 通过U盘拷贝到 android12 的shell 测试一下。

执行时有这个报错。

这个错误的解决方法 :

但是我还有另一种方式的测试,就是使用 android 的 NDK 。

1 首先是安装 android studio

发现网址 https://developer.android.com/studio?hl=zh-cn

无法下载 android studio 所以使用 网盘上之前的 android studio 进行安装。

这里需要等一段时间才可以 点击下一步,可能是在下载什么东西。

        

接下俩测试第一个程序。

出现这个界面

然后是 下载一个虚拟机。

从新下载一下 android11 的 SDK。

依然报相同的错误。

增加几个SDK看看。

还是不行。

还是这个报错。

继续解决:  原因是, 我自定义 了 SDK 的安装目录

这样做依然是 不可以。

干脆就要 卸载重装了。

        

卸载完。

重新安装。

剩下的步骤跟上面是一样的,只是我还是自定义了studio 的安装 的目录。

但是还是报错。

哈哈哈。彻底崩了。

接下来我就 安装一个 win10 的虚拟机。系统崩了大不了重新安装。

网页链接  下载 Windows 10

然后无脑下一步。

大概有4G

接下来就是 ,使用虚拟机安装 iso 了。

使用net 是可以上网的。

通过远程桌面的方式, 在win10 虚拟机 与 宿主机之间来 传输文件。

结果是不支持。

那么我就使用 共享的方式来传文件。

在虚拟机中直接使用这种方式。

虽然 我的 主机是 192.168.1.113,  虚拟机的ip 是: 192.168.128.132, 这样也是可以的。

然后安装的话,就是,一路next , 不设置任何的个人路径,看看怎么样。

但是在虚拟机中 win10 的安装报错。

然后重新 启动一下。

但是依然是这个报错。

重新sync 的方式。

在测试一遍 看看行不行。

还是不行。

我最终的解决方法: 去掉这个斜杠。

然后就是 安装虚拟机,按照上面的步骤进行安装。

结果又有报错。

在虚拟机中开启bios ,这是uefi.

结果跳到了, 重新安装的界面。

那么接下来就重新安装就好了。

这次对上了。

但是TMD ,bios 里面没有 虚拟化选项。

但是bios 里面依然是没有这个选项。

直接启动在系统里查看一下。

但是查不到。

最终还是使用的这个方法。

接下来 测试, android studio 的 虚拟机。

问题: 

下载SDK

但是在虚拟机中的 android studio 仍然是报一样的错误。

我开始怀疑这个 android studio 的安装包了。

尝试在虚拟机中下载 android studio , 居然是可以的。

依然是这个错误:

有点无奈了。

重新在PC机上 安装上了最新的 androdi studio 但是还是之前的 错误。

然后我尝试 在我自己使用的PC机上再安装一次,没想到安装个 android studio,要这么费事。

但是没有 java 选项。

选择 groovy DSL 测试一下。

重新建立一个 java 的project

然后再按照上面那一套 ,就可以了。

这次居然可以了。基本就是 电脑的问题,具体的原因不去管了。

运行一个 改界面的app

2 然后是安装 NDK

首先是安装 cmake

先编译一遍。

不对,是实现了的,这是默认的模板。

接下来我去改一下 , 打印的信息。

接下来,去指定 arm 的so 库。

发现不会。

重新生成一个 project

已经够用了,不去管 armv7了。

然后是新建一个空的项目,然后利用自己生成的so库。

接着 将之前编译好的 so 库,拷贝到 新建的空项目当中去。

然后进入 新建的空项目的目录。

将之前的库拷贝进去。

开始调用 so 库。

发现之前的是 错了。应该是这个。

      

        

剩下的操作,跟之前是一样的。

然后是设置  android 的界面。

过程中我发现我的逻辑有问题,更简单的是, 我这个空工程有一个 text, 显示的内容,就是,so库函数传递过来的。参照 NDK C++ 的写法。

我先在默认的 空的项目中,修改一下。

所以接下来 ,就这个改, 显示的字符串, 是通过, jni传上来的。

依然是将 so,拷贝到,相应的目录。

我实际测试出现的问题。

我重新去编译一遍 NDK,更改的内容如下:

不知到这么加对不对。

然后再次验证,发现 可以输出任意字符串了。

我新建一个 虚拟机。我看看这个能不能使用  arm64 的 so .

arm64 的机器,PC机上跑不起来。

也就是说,如果我的 so 要运行在 板卡上的话,我是测试不了的。我只能测试 x86 的 so.

ou ,对了,我可以直接使用 USB 连接上 板卡这样来测试。

我这样试一下。

首先在 3588 板卡上烧写 上 android11 的镜像,然后什么也不用设置,就直接通过 android studio 连接上了。我这里使用的库 是 arm64 的。

并且也已经显示出来了。

这是我java 的设置内容, xml 只改了一个id .

总结一下:

1 我需要设置一下,gradle 才能生成 arm64 ,否则只有 x86_64

2 我使用的是, 直接设置 textview 的文本的内容。

3 我对与板卡上的镜像并没有设置 开发者选项。

目前的状况。

接下里我控制一下板卡的外设, 就是使用jni 去操作 sys 文件系统,进而操作beep

目前还是没有成功,有几个点:

1 对于文件的读写可能需要加权限。

2 目前c语言的答应 使用的peerror , 这个函数是不能够 在 logcat 中看到信息的。

会不会是这个原因,导致我 jni 不成功。

我先手动改一下。

这样之后果然就可以了。

但是又有问题了。

我发现是权限问题,我解决权限问题的方式是 chmod 777 .

然后就可以通过 jni 控制板卡上的蜂鸣器了。这是 jni 的 C 代码。

#include <jni.h>
#include <string>

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

#include <string.h>
#include <jni.h>
#include <android/log.h>
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdint.h>
#include <assert.h>


#define LOG_TAG "ApiTester"

#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO,  LOG_TAG, __VA_ARGS__))
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN,  LOG_TAG, __VA_ARGS__))
#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__))
#define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__))




extern "C" JNIEXPORT jstring JNICALL
Java_com_example_myapplication121212_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "派大星";


//导出pwm
    FILE *export_fp=fopen("/sys/devices/platform/febf0030.pwm/pwm/pwmchip2/export","w");
    if(!export_fp){
        LOGE("open file  failed");
        exit(-1);
    }
    fprintf(export_fp,"%d", 0);
    fclose(export_fp);

//设置pwm周期
    FILE *export_fp1=fopen("/sys/devices/platform/febf0030.pwm/pwm/pwmchip2/pwm0/period","w");
    if(!export_fp1){
        LOGE("open file  failed");
        exit(-1);
    }
    fprintf(export_fp,"366300");
    fclose(export_fp);


  //设置pwm占空比
   FILE *export_fp2=fopen("/sys/devices/platform/febf0030.pwm/pwm/pwmchip2/pwm0/duty_cycle","w");
    if(!export_fp2){
        LOGE("open file  failed");
        exit(-1);
    }
    fprintf(export_fp,"266300");
    fclose(export_fp);


    //使能pwm
    FILE *export_fp3=fopen("/sys/devices/platform/febf0030.pwm/pwm/pwmchip2/pwm0/enable","w");
    if(!export_fp3){
        LOGE("open file  failed");
        exit(-1);
    }
    fprintf(export_fp,"1");
    fclose(export_fp);










    return env->NewStringUTF(hello.c_str());
}

接下来我测试一下,如果在C代码中使用 open 系列的函数,不是标准C是不是也可以。

        

先不管了,直接使用 fwrite 就可以了。

   但是这里有一个问题,就是每次 我启动app 还要手动在 命令行, chmod 节点。

这显然是不可能的。

但是目前我也找不到好的办法。

网上找到的一些资料。

接下来 我测试一下 libsu 的使用方法:

视频参考B站。

官网网站:GitCode - 开发者的代码家园

首先新建立一个工程。 然后开始复制。

接着同步一下,

有一个报错。

接下来我测试一下。

在板卡的 屏幕上 显示 hello world 是正常的。

但是依然是 没有效果的。

不挣扎了,暂时放弃。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值