1.XML解析问题
增加XML布局文件时候出现
mergeDebugResources 错误
解决方案
由于XML默认文件带有BOM,remove bom即可
2.开机启动界面添加
3.开机隐藏系统桌面
4.添加敲击传感器GPIO
1. 测试板子的GPIO引脚情况
echo in > /sys/class/gpio/gpio<gpio_number>/direction
cat /sys/class/gpio/gpio<gpio_number>/value
所以:
GPIO7_A5=7*32+0*8+5+base=1229
GPIO8_A1=257+base=1257
2.由于系统自带的GPIO-KEY驱动,可以不用写代码,直接修改内核DTS即可
在pinctrl和gpio-key增加节点
2. 在Android中,可以通过sysfs文件系统访问GPIO。您可以使用sysfs接口来设置GPIO引脚的方向(输入或输出),读取GPIO状态和注册GPIO事件。
vi arch/arm/boot/dts/
a. 首先,查找GPIO引脚的编号。您可以查看设备的文档或者运行`cat /sys/kernel/debug/pinctrl/rockchip/pins`命令来获取GPIO引脚的详细信息。
b. 设置GPIO引脚为输入模式。在终端中运行以下命令:
```bash
echo in > /sys/class/gpio/gpio<gpio_number>/direction
```其中,`<gpio_number>`是GPIO引脚的编号。
c. 读取GPIO状态。在终端中运行以下命令:
```bash
cat /sys/class/gpio/gpio<gpio_number>/value
```您可以使用这个命令来检测GPIO的电平变化。
d. 注册GPIO事件。您可以使用`sysfs`接口在Android中注册GPIO事件,以便在GPIO状态变化时接收通知。您需要编写一段C/C++代码,将其编译为共享库,并在Android应用程序中调用该库。
下面是一个简单的示例代码,展示如何在C/C++中使用`sysfs`接口注册GPIO事件:
```c
#include <fcntl.h>
#include <unistd.h>// GPIO事件回调函数
void gpio_event_callback(int gpio_fd) {
// 读取GPIO的状态
char value;
read(gpio_fd, &value, sizeof(value));// TODO: 处理GPIO状态变化
}// 注册GPIO事件
void register_gpio_event(int gpio_number) {
// 打开GPIO设备文件
char gpio_device[50];
sprintf(gpio_device, "/sys/class/gpio/gpio%d/value", gpio_number);
int gpio_fd = open(gpio_device, O_RDONLY);// 创建一个线程来监听GPIO的状态变化
pthread_t thread;
pthread_create(&thread, NULL, gpio_event_thread, &gpio_fd);
}
```在`gpio_event_thread`线程中,您可以使用`gpio_event_callback`函数来处理GPIO状态变化。在这个回调函数中,您可以将变化的GPIO状态通知给Android应用程序。
3. 在Android应用程序中接收GPIO事件。为了接收和处理GPIO事件,您需要在Android应用程序中编写代码,监听GPIO事件。
您可以使用JNI(Java Native Interface)将C/C++代码与Java代码进行交互。
a. 首先,编写一个JNI接口类,将C/C++代码与Java代码进行绑定。在JNI接口类中,声明一个本地方法,以便从C/C++代码中调用它。
```java
public class GpioEventManager {
static {
System.loadLibrary("gpio-event-lib");
}public native void registerGpioEvent(int gpioNumber);
public native void unregisterGpioEvent();
public native void gpioStateChanged(int gpioValue);
}
```b. 然后,在C/C++代码中,您可以使用JNI接口来调用Java的回调函数。
```c
#include <jni.h>// Java VM实例
JavaVM* gJvm;
jobject gObj;
jmethodID gCallbackMethod;// 设置Java回调函数
void set_java_callback(JNIEnv* env, jobject obj, jmethodID callbackMethod) {
gJvm = jvm;
gObj = env->NewGlobalRef(obj);
gCallbackMethod = callbackMethod;
}// GPIO事件回调函数
void gpio_event_callback(int gpio_fd) {
// 读取GPIO的状态
char value;
read(gpio_fd, &value, sizeof(value));// 将GPIO状态通知给Java回调函数
JNIEnv* env;
gJvm->AttachCurrentThread(&env, NULL);
env->CallVoidMethod(gObj, gCallbackMethod, value);
gJvm->DetachCurrentThread();
}
```在`gpio_event_thread`线程中,您可以调用`set_java_callback`函数,以便与Java代码进行通信。
4. 在Android应用程序中使用`GpioEventManager`类。您可以在Android应用程序中使用`GpioEventManager`类,来监听GPIO事件并处理GPIO状态变化。
a. 首先,实例化`GpioEventManager`类,并调用`registerGpioEvent`方法,以便开始监听GPIO事件。
```java
GpioEventManager gpioEventManager = new GpioEventManager();
gpioEventManager.registerGpioEvent(gpioNumber);
```b. 在`gpioStateChanged`方法中,您可以处理GPIO状态变化。您可以在这个方法中发送通知,更新UI或执行其他操作。
```java
public void gpioStateChanged(int gpioValue) {
// 处理GPIO状态变化
}
```c. 您还需要在Android应用程序的`onDestroy`或相应的生命周期方法中调用`unregisterGpioEvent`方法,以停止接收GPIO事件。
```java
@Override
protected void onDestroy() {
super.onDestroy();
gpioEventManager.unregisterGpioEvent();
}
参考资料:
RK系列(RK3568) GPIO按键驱动 和Android key新值添加_hmbbPdx_的博客-CSDN博客
GPIO-KEY 驱动分析_gpio_keys_bobuddy的博客-CSDN博客
rk3288 Pinctrl子系统的概念学习_习惯就好zz的博客-CSDN博客
RK3288_Android7.1添加两个gpio的按键_安卓主板 adc接口_平仄散人的博客-CSDN博客
基于RK3568的Linux驱动开发——GPIO知识点(一)_daisy.skye的博客-CSDN博客
5.android studio配置系统签名的APP
参考:
Android 系统签名打包方法_android 打包签名_ssuqin001的博客-CSDN博客
6.linux下烧录工具
下载地址:
https://github.com/aloksinha2001/rk_linux_upgrade.git
参考:
Rockchip | Rockchip固件升级工具_upgrade_tool_嵌入式purple的博客-CSDN博客
rockchip-linux/rkdeveloptool (github.com)