我是靠谱客的博主 内向吐司,这篇文章主要介绍MTK sensor SCP与AP共享内存通信验证,现在分享给大家,希望可以做个参考。

学习scp和ap的共享内存:

kernel-4.14/drivers/misc/mediatek/scp/v01/scp_helper.c 中

scp_init() -> scp_reserve_memory_ioremap() 会打印一些预留的sensor 共享内存信息。
以x6810为例:
行 1329: <5>[ 1.918889] .(7)[1:swapper/0][SCP][rsrv_mem-0] phy:0x8b000000 - 0x8b0fffff, len:0x100000
行 1330: <5>[ 1.919953] .(7)[1:swapper/0][SCP][rsrv_mem-0] vir:0xffffff800d000000 - 0xffffff800d0fffff, len:0x100000
行 1331: <5>[ 1.921167] .(7)[1:swapper/0][SCP][rsrv_mem-1] phy:0x8b100000 - 0x8b100fff, len:0x1000
行 1332: <5>[ 1.922187] .(7)[1:swapper/0][SCP][rsrv_mem-1] vir:0xffffff800d100000 - 0xffffff800d100fff, len:0x1000
行 1333: <5>[ 1.923379] .(7)[1:swapper/0][SCP][rsrv_mem-2] phy:0x8b101000 - 0x8b280fff, len:0x180000
行 1334: <5>[ 1.924430] .(7)[1:swapper/0][SCP][rsrv_mem-2] vir:0xffffff800d101000 - 0xffffff800d280fff, len:0x180000

这些预留的共享内存在 kernel-4.14/drivers/misc/mediatek/scp/mt6785/scp_reservedmem_define.h 中定义

static struct scp_reserve_mblock scp_reserve_mblock[] = {
#ifdef CONFIG_MTK_VOW_SUPPORT
#if defined(CONFIG_MTK_VOW_AMAZON_SUPPORT) ||
defined(CONFIG_MTK_VOW_GVA_SUPPORT)
{
.num = VOW_MEM_ID,
.start_phys = 0x0,
.start_virt = 0x0,
.size = 0x49200, /* 292KB (2 model size)/
},
#else
{
.num = VOW_MEM_ID,
.start_phys = 0x0,
.start_virt = 0x0,
.size = 0x38200, /
224KB (1 model size)/
},
#endif
#endif
{
.num = SENS_MEM_ID,
.start_phys = 0x0,
.start_virt = 0x0,
.size = 0x100000, /
1 MB /
},
{
.num = FLP_MEM_ID,
.start_phys = 0x0,
.start_virt = 0x0,
.size = 0x1000, /
4 KB /
},
{
.num = SCP_A_LOGGER_MEM_ID,
.start_phys = 0x0,
.start_virt = 0x0,
.size = 0x180000, /
1.5 MB /
},
#if defined(CONFIG_SND_SOC_MTK_SCP_SMARTPA) ||
defined(CONFIG_MTK_VOW_SUPPORT)
{
.num = AUDIO_IPI_MEM_ID,
.start_phys = 0x0,
.start_virt = 0x0,
.size = 0x19000, /
100 KB /
},
#endif
#ifdef CONFIG_SND_SOC_MTK_SCP_SMARTPA
{
.num = SPK_PROTECT_MEM_ID,
.start_phys = 0x0,
.start_virt = 0x0,
.size = 0x18000, /
96KB /
},
{
.num = SPK_PROTECT_DUMP_MEM_ID,
.start_phys = 0x0,
.start_virt = 0x0,
.size = 0x18000, /
96KB /
},
#endif
#ifdef CONFIG_MTK_VOW_BARGE_IN_SUPPORT
{
.num = VOW_BARGEIN_MEM_ID,
.start_phys = 0x0,
.start_virt = 0x0,
.size = 0x4600, /
17KB /
},
#endif
#ifdef SCP_PARAMS_TO_SCP_SUPPORT
{
.num = SCP_DRV_PARAMS_MEM_ID,
.start_phys = 0x0,
.start_virt = 0x0,
.size = 0x100, /
256 bytes */
},
#endif
};

可以从log看出XM 只使用了 SENS_MEM_ID、FLP_MEM_ID、SCP_A_LOGGER_MEM_ID 。
SENS_MEM_ID 1M的空间用于Sensor的数据FIFO。 FLP_MEM_ID 没搜到使用。

所以使用FLP_MEM_ID的内存空间,实验AP到SCP的一个共享数据的测试。

思路是利用kerenl光感的enable节点,在als_enable_store函数中 往共享内存写入一个字符。在SCP侧收到enable的命令后读该共享内存。看是否能够正常获得该字符。
-----AP
char buf3;
uint64_t *p;
char buf2 = 99;
p=(uint64_t *)0xffffff800d100000ULL; //必须是虚拟地址
printk(“pengbin p = %pn”,p);
memcpy((void *)p,(void *)&buf2, 1);
memcpy((void *)&buf3,(void *)p, 1);
printk(“pengbin end ==== buf3 = %dn”,buf3);

-----SCP
char buf3;
uint64_t *p;
p=(uint64_t *)0x8b100000ULL; //必须是物理地址
memcpy((void *)&buf3,(void *)p, 1);
printf(“pengbin ==== p =%p buf3 = %dn”,p,buf3);

=============
开机通过adb echo节点后。抓SCP log
[163.885]sensorPowerAls on:1, nowOn:0
[163.885]pengbin ==== buf3 = 99

测试pass

-----AP 优化代码
+#include <linux/string.h>
+#include “scp_helper.h”

char buf2 = 99;
p=(uint8_t *)scp_get_reserve_mem_virt(FLP_MEM_ID);
printk(“pengbin p = %pn”,p);
memcpy((void *)p,(void *)&buf2, 1);
printk(“pengbin end ==== *p = %dn”,*p);

测试同pass

问题SCP现地址直接写死的。需要通过AP传过来比较合理。

最后

以上就是内向吐司最近收集整理的关于MTK sensor SCP与AP共享内存通信验证的全部内容,更多相关MTK内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部