RK3588 EVB1蓝牙休眠唤醒调试

RK3588 EVB1蓝牙休眠唤醒调试

rk平台支持二级休眠,即SOC大部分电都关了,只留下唤醒源需要的电.

rk3588 evb1因为蓝牙相关的部分大部分IO没有接到PMU电源域,所以调试起来需要另外配置,以方便快速验证.

下面,我们以博通AP6275p芯片为例, 分析下快速验证蓝牙休眠唤醒需要的设定(前提是蓝牙已经正常bringup能工作的情况下).

一. DTS全部配置

为了方便只要答案的同学, 这里直接给出配置:

Subject: [PATCH] dts:arm64:rk3588:config for bt wake up from deep sleep

Change-Id: Ia382dbf9860a76d2558f6f6f5f330cd46f58689d
---
 .../boot/dts/rockchip/rk3588-evb1-bt-wakeup.dtsi   | 52 ++++++++++++++++++++++
 .../boot/dts/rockchip/rk3588-evb1-lp4-v10.dts      |  1 +
 2 files changed, 53 insertions(+)
 create mode 100755 arch/arm64/boot/dts/rockchip/rk3588-evb1-bt-wakeup.dtsi

diff --git a/arch/arm64/boot/dts/rockchip/rk3588-evb1-bt-wakeup.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-evb1-bt-wakeup.dtsi
new file mode 100755
index 0000000..75f79b8
--- /dev/null
+++ b/arch/arm64/boot/dts/rockchip/rk3588-evb1-bt-wakeup.dtsi
@@ -0,0 +1,52 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ *
+ */
+
+&rockchip_suspend {
+	rockchip,sleep-mode-config = <
+		(0
+		| RKPM_SLP_ARMOFF_DDRPD
+		)
+	>;
+	rockchip,wakeup-config = <
+		(0
+		| RKPM_CPU0_WKUP_EN
+		| RKPM_GPIO_WKUP_EN
+		)
+	>;
+
+	status = "okay";
+};
+
+&vdd_log_s0 {
+	regulator-state-mem {
+	regulator-on-in-suspend;
+	regulator-suspend-microvolt = <750000>;
+	};
+};
+
+&vcc_3v3_s0 {
+	regulator-state-mem {
+		regulator-on-in-suspend;
+	};
+};
+
+&vcc_1v8_s0 {
+	regulator-state-mem {
+		regulator-on-in-suspend;
+	};
+};
+
+&vdd_1v8_pll_s0 {
+	regulator-state-mem {
+		regulator-on-in-suspend;
+	};
+};
+
+&wireless_bluetooth {
+	interrupt-parent = <&gpio3>;
+	interrupts = <RK_PA0 IRQ_TYPE_LEVEL_LOW>;
+	wakeup-source;
+};
diff --git a/arch/arm64/boot/dts/rockchip/rk3588-evb1-lp4-v10.dts b/arch/arm64/boot/dts/rockchip/rk3588-evb1-lp4-v10.dts
index d1a264f..ecfbad8 100644
--- a/arch/arm64/boot/dts/rockchip/rk3588-evb1-lp4-v10.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3588-evb1-lp4-v10.dts
@@ -8,6 +8,7 @@
 
 #include "rk3588-evb1-lp4.dtsi"
 #include "rk3588-evb1-imx415.dtsi"
+#include "rk3588-evb1-bt-wakeup.dtsi"
 #include "rk3588-android.dtsi"

二 分析.

2.1 rockchip_suspend节点

+&rockchip_suspend {
+	rockchip,sleep-mode-config = <
+		(0
+		| RKPM_SLP_ARMOFF_DDRPD
+		)
+	>;
+	rockchip,wakeup-config = <
+		(0
+		| RKPM_CPU0_WKUP_EN
+		| RKPM_GPIO_WKUP_EN
+		)
+	>;
+
+	status = "okay";
+};

这里解释下RKPM_GPIO_WKUP_EN节点, 这里是因为唤醒源是BT_WAKE_HOST_H,即GPIO3_A0. 所以RKPM_GPIO_WKUP_EN唤醒源需要开启.

其他修改部分不是很清晰, 比如sleep-mode-config少休眠了很多模块, 待以后进一步澄清.

2.2 电源域

2.2.1 芯片内部电源域

为了支持休眠唤醒, IC部分,至少BT_WAKE_HOST, UART_RTS, BT_REG_ON(图中1,2,3)几个引脚所在的IC模块要有电.

BT_WAKE_HOST因为是中断源.

UART_RTS是为了保持高电平, 不让外部蓝牙模块发信号(这里存疑, 可能是错的. 因为IC没电也可能可以钳住这个电平).

BT_REG_ON是为了保持高电平让外部蓝牙模块不掉电(同上, 可能是错的).

image-20220514163919983

图1

查3588 TRM, 以上电源域都在VD_LOGIC, 所以以下配置打开:

+&vdd_log_s0 {
+	regulator-state-mem {
+	regulator-on-in-suspend;
+	regulator-suspend-microvolt = <750000>;
+	};
+};

image-20220514165159523

图2
2.2.1 芯片外部电源域.

查图1 BT_WAKE_HOST, UART_RTS, BT_REG_ON外部电源域, 就是图1中的4部分, 即VCC_1V8_S0. 所以这个电源域打开.

+&vcc_1v8_s0 {
+	regulator-state-mem {
+		regulator-on-in-suspend;
+	};
+};
2.2.3 蓝牙模块电源域

image-20220514170425699

如上, VCC_3V3_S0(1)和VCC_1V8_S0(2)要有电, 所以对应节点要打开.VCC_1V8_S0已经打开, 所以还需要打开VCC_3V3_S0.

+&vcc_3v3_s0 {
+	regulator-state-mem {
+		regulator-on-in-suspend;
+	};
+};
2.2.4 32K电源域

image-20220514174426166

这里需要说明的是, 假设蓝牙模块外部32K晶振是3588供电, 那对应的3588模块内部外部电源域都要打开, 但我们是8563供32K.

但是如下配置现在已经无法解释了, 不知道当初为啥要配置. (也许是当初看错, 也许是忘了, 这怪开始没总结. 要验证只能重新搭环境看看这个配置是否必要, 等验证了再回来更新)

+&vdd_1v8_pll_s0 {
+	regulator-state-mem {
+		regulator-on-in-suspend;
+	};
+};
2.4.5 中断源配置

如下, 意思是打开中断源. 当然, 即使不需要中断唤醒, "BT,wake_host_irq"节点还是需要配置.

+&wireless_bluetooth {
+	interrupt-parent = <&gpio3>;
+	interrupts = <RK_PA0 IRQ_TYPE_LEVEL_LOW>;
+	wakeup-source;
+};

3 4 rtk蓝牙特殊处理

在调试rtk 8852be芯片蓝牙唤醒过程中,发现Host系统唤醒后,收不到正确的按键值,从而导致系统重新进休眠.
其原因是芯片驱动不完善,醒来后没法通过蓝牙H5协议和Host蓝牙协议栈握手(博通芯片使用H4协议,并用RTS引脚控制蓝牙芯片的数据发送,所以无此问题).

目前解决办法是,在蓝牙唤醒过程中, rfkill-bt.c的驱动中,发送power up按键,这样,系统就能亮屏.不过, 这里有一个side-effect: 唤醒后因为无法握手会重启蓝牙协议栈,导致蓝牙遥控器连上时间会延迟.

diff --git a/net/rfkill/rfkill-bt.c b/net/rfkill/rfkill-bt.c
index 719a23d..e5209e98 100644
--- a/net/rfkill/rfkill-bt.c
+++ b/net/rfkill/rfkill-bt.c
@@ -39,7 +39,7 @@
 #include <linux/of_device.h>
 #include <linux/of_gpio.h>
 #endif
-
+#include <linux/input.h>
 #if 0
 #define DBG(x...) pr_info("[BT_RFKILL]: " x)
 #else
@@ -72,6 +72,7 @@ struct rfkill_rk_data {
 };

 static struct rfkill_rk_data *g_rfkill = NULL;
+static struct input_dev *power_key_dev;

 static const char bt_name[] =
 #if defined(CONFIG_BCM4330)
@@ -721,6 +722,26 @@ static int rfkill_rk_probe(struct platform_device *pdev)

        LOG("%s device registered.\n", pdata->name);

+       /* register input device */
+       power_key_dev = input_allocate_device();
+       if (!power_key_dev) {
+               LOG("ir_dev: not enough memory for input device\n");
+               return -ENOMEM;
+       }
+
+       power_key_dev->name = "bt-powerkey";
+       power_key_dev->id.bustype = BUS_HOST;
+
+       power_key_dev->evbit[0] = BIT_MASK(EV_KEY);
+       set_bit(KEY_POWER, power_key_dev->keybit);
+
+       ret = input_register_device(power_key_dev);
+       if (ret) {
+               input_free_device(power_key_dev);
+               LOG("ir_rx_init: register input device exception, exit\n");
+               return -EBUSY;
+       }
+
        return 0;

 fail_rfkill:
@@ -776,9 +797,32 @@ static int rfkill_rk_remove(struct platform_device *pdev)
        return 0;
 }

+static int rfkill_rk_pm_resume(struct device *pdev)
+{
+       LOG("%s, wake up now send power key.....", __func__);
+
+       input_report_key(power_key_dev, KEY_POWER, 1);
+       input_sync(power_key_dev);
+       msleep(1);
+       input_report_key(power_key_dev, KEY_POWER, 0);
+       input_sync(power_key_dev);
+
+       return 0;
+}
+
+static int rfkill_rk_pm_suspend(struct device *pdev)
+{
+       LOG("%s", __func__);
+
+       return 0;
+}
+
+
 static const struct dev_pm_ops rfkill_rk_pm_ops = {
        .prepare = rfkill_rk_pm_prepare,
        .complete = rfkill_rk_pm_complete,
+       .suspend = rfkill_rk_pm_suspend,
+       .resume = rfkill_rk_pm_resume,
 };

 #ifdef CONFIG_OF

4 结束

完.

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【资源介绍】 基于RK3588上部署yolov5s模型源码(实时摄像头检测)+部署说明文档.zip 该项目是个人毕设项目,答辩评审分达到95分,代码都经过调试测试,确保可以运行!欢迎下载使用,可用于小白学习、进阶。 该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。 项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。 yolov5模型(.pt)在RK3588(S)上的部署(实时摄像头检测) - 所需: - 安装了Ubuntu20系统的RK3588 - 安装了Ubuntu18的电脑或者虚拟机 <details> <summary>一、yolov5 PT模型获取</summary> [Anaconda教程](https://blog.csdn.net/qq_25033587/article/details/89377259)\ [YOLOv5教程](https://zhuanlan.zhihu.com/p/501798155)\ 经过上面两个教程之后,你应该获取了自己的`best.pt`文件 </details> <details> <summary>二、PT模型转onnx模型</summary> - 将`models/yolo.py`文件中的`class`类下的`forward`函数由: ```python def forward(self, x): z = [] # inference output for i in range(self.nl): x[i] = self.m[i](x[i]) # conv bs, _, ny, nx = x[i].shape # x(bs,255,20,20) to x(bs,3,20,20,85) x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous() if not self.training: # inference if self.dynamic or self.grid[i].shape[2:4] != x[i].shape[2:4]: self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i) if isinstance(self, Segment): # (boxes + masks) xy, wh, conf, mask = x[i].split((2, 2, self.nc + 1, self.no - self.nc - 5), 4) xy = (xy.sigmoid() * 2 + self.grid[i]) * self.stride[i] # xy wh = (wh.sigmoid() * 2) ** 2 * self.anchor_grid[i] # wh y = torch.cat((xy, wh, conf.sigmoid(), mask), 4) else: # Detect (boxes only) xy, wh, conf = x[i].sigmoid().split((2, 2, self.nc + 1), 4) xy = (xy * 2 + self.grid[i]) * self.stride[i] # xy wh = (wh * 2) ** 2 * self.anchor_grid[i] # wh y = torch.cat((xy, wh, conf), 4) z.append(y.view(bs, self.na * nx * ny, self.no)) return x if self.training else (torch.cat(z, 1),) if self.export else (torch.cat(z, 1), x) ``` 改为: ```python def forward(self, x): z = [] # inference
rk3588evb是一款基于Rockchip RK3588芯片的开发板,用于人工智能应用领域。模型部署是指将训练好的模型应用到实际场景中,以实现特定的任务。而视频检测则是指通过对视频中的内容进行分析和识别,从而实现人、物体、动作等的检测和识别功能。 将模型部署到rk3588evb上进行视频检测,首先需要将训练好的模型导入到rk3588evb的开发环境中。开发环境可以是使用开发板的SDK或者工具包。通过将模型与开发环境进行适配,可以确保模型可以在rk3588evb上正常运行。 接下来,在rk3588evb上编写运行代码,使用模型对视频进行检测。视频检测涉及到识别和追踪视频中的人和物体。可以通过处理视频的每一帧图像,并将其输入到模型中进行预测和判别。模型会根据训练时的分类标准,识别出视频中的不同物体和动作。 为了提高视频检测的效果,可以采用一些优化方法和技术。例如,可以使用图像处理算法对视频图像进行预处理,以提高模型的输入质量。同时,可以将模型与物体跟踪算法相结合,以实现对运动物体的跟踪和检测。 最后,将视频检测的结果进行输出和展示。可以将检测到的物体和动作标注在视频中,或者生成报告和统计数据。这样可以方便用户对视频内容进行分析和理解。 通过在rk3588evb上进行模型部署,可以实现视频检测的任务,为用户提供智能化的视频分析。同时,rk3588evb作为高性能的开发板,能够提供足够的计算能力,以满足视频检测的需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值