芯片解决方案--SL8541e-OpenHarmony适配方案
摘要
本文描述8541E芯片适配OpenHarmony的整体方案。
本文描述的整体方案,不止适用于8541e,也适用于该芯片厂家的其他芯片,如7863、7885,少部分子系统会略有差异。
整体方案架构
整体方案架构如下图,遵循OpenHarmony系统架构,在内核及HAL层与8541E芯片原厂SDK对接。
下文基于该方案架构,进一步阐述各子系统的对接方案。
内核子系统
首先需要确定使用哪个内核,这个问题影响大,影响各模块的适配方案,需要优先确定。一般,内核适配有两种策略:
策略1、使用原厂内核版本,打上OpenHarmony内核补丁;
策略2、使用OpenHarmony内核,移植原厂内核SDK中的修改代码,主要包括各种驱动。
因为原厂8541e内核是4.14版本,比较老,原厂没有基于该内核的闭源GPU方案可用于OpenHarmony系统,需要我们选用开源GPU来支撑芯片商用,而开源GPU的驱动Panfrost依赖5.x内核版本。
因此,我们选择策略2:使用OpenHarmony 5.10内核,然后从原厂4.14内核中移植各个模块的驱动到OpenHarmony 5.10内核上。
对于原厂其他芯片,根据原厂SDK的内核版本不同,这里可以采用不同的策略。
系统启动
如何使OpenHarmony正确启动,涉及的子系统有启动子系统、编译子系统、内核子系统等。
首先,内核要能正常启动,这部分涉及编译添加芯片和产品,编译出boot、ramdisk等相关image,还涉及BootLoader、bootargs、dts等修改;另外,内核要集成编译HDF框架,确保后续其他模块能正常启动。
然后,让内核能够正常启动ramdisk,启动后,在分区配置文件fstab中,要配置OpenHarmony的各个系统分区system、vendor、data的正确mount参数。
然后,init cfg中各个配置要正确。
然后,启动samgr、appswapn、softbus、foundation等后台程序,以及启动launcher、systemui等应用程序,这过程依赖内核要开启Access token、Binder、HDF等关键配置,这些关键配置可提前识别并打开。
最后,确保能正常启动到Launcher。
启动这部分与所有L2标准产品一致,不详细展开。
图形子系统
图形的适配,分为3大部分:图形基础、渲染、合成,因为这3部分的底层驱动和适配路径都不一样,因此分开阐述。
图形基础部分
OpenHarmony的图形子系统,支持对接DRM和FB两种模型的图形驱动。
各大厂商的富设备,大都已支持DRM驱动模型,8541E芯片也是如此,支持DRM图形驱动模型。
因此,我们在OpenHarmony Display HDI层采用DRM模型对接8541e图形驱动,准确的讲,是Display HDI通过DRM用户态接口库LibDRM对接8541e的DRM驱动。
主要工作有:
1、移植8541e DRM及相关的显示屏驱动,从4.14内核从5.10内核。
2、Display HDI接口适配。OpenHarmony社区代码已有RK3568的DRM适配示例,参考示例,结合8541e DRM驱动,调整各适配接口和参数。
为确保各部分工作是高质量完成的,从下到上可分步调试:
步骤1、使用ModeTest调试出图。当内核移植完之后,确保ModeTest正常可以获取DRM参数,可以显示界面。
步骤2、使用hello_composer调试出图。hello_composer是基于Display HDI接口的调试程序,在ModeTest出图正常之后,完成Display HDI接口适配,然后使用该程序调试Display HDI接口,确保HDI接口适配正确。
步骤3、显示OpenHarmony桌面。当hello_composer调试出图正常后,如果Launcher应用程序也正常启动,一般就可以显示OpenHarmony桌面;如果没有显示,一般是系统或者Launcher启动的问题。
渲染部分
各种不同方案的GPU库,都会提供Open GL和EGL接口,供上层渲染框架使用。OpenHarmony的渲染框架上也是使用Open GL和EGL接口。
因为不能使用闭源库,我们需要使用开源GPU mesa3D编译提供的OpenGL库。
开源GPU驱动为Mesa3D,Mesa3D是用户态库,在内核态需要配套使用Panfrost驱动。
OpenHarmony 3.2版本,已经提供了快速集成编译开源GPU的方法,相比3.1Release版本,适配过程已有很大简化,具体方法也不在此赘述。
更需要注意的是,8541e使用的是GPU是Mail T820,GPU架构比较老,不仅开源GPU Mesa3D的适配会有问题,而且OpenHarmony XTS认证也会有问题。因为,Mail T820与Mesa3D的组合,并没有通过OpenGL CTS测试;而OpenHarmony3.2版本的XTS会测试OpenGL CTS的满足度;当出现相关XTS问题的时候,需要去分析澄清。
合成部分
默认没有适配的情况下,采用CPU合成,合成效率很低,一帧需要80~100ms,帧率才10几。好在8541e芯片提供了专门的硬件GSP和DPU来提高合成效率,同时GPU也可以承担一部分合成工作,因此需要把硬件合成用起来,提高流畅度等使用体验。
主要方案是:使用GSP+DPU+GPU组合起来进行硬件合成。GSP、DPU、GPU的适用场景不同,比如当图层数目大于4的时候,或者在旋转的时候,需要使用GSP。在8541e上,dpu也不够强大,部分场景还需要GPU来合成。
主要工作:
1、移植GSP、DPU驱动
2、适配合成HDI接口,根据情况合理使用GSP、DPU、GPU进行合成。
需要注意的是:使用GSP或者DPU合成时,可以调用GSP、DPU的用户态程序接口,而使用GPU合成时,不能直接调用接口,而是设置GPU合成标志,让流程重新走回渲染,在渲染阶段调用GPU完成合成工作。
多模输入子系统
OpenHarmony采用udev管理输入设备节点,确保udev的输入规则集/etc/udev/rules.d/touchscreen.rules中,有规则与内核驱动的输入设备属性能匹配上,一般默认都有,不需要适配什么。
移植4.14的8541e输入驱动,确保内核驱动能将输入事件正确记录到dev设备节点。
WiFi
主要移植内核驱动,系统已对接好wpa,没有多少适配工作 。
Bluetooth
芯片厂家在hal层有提供vendor lib,将Bluetooth HDI接口对接到vendor lib即可。
由于芯片厂家vendor lib提供的接口,与OpenHarmony Bluetooth HDI需要的接口,不完全一致,需要修改。
社区提供的rk3568示例,是直接修改了芯片厂家的vendor lib库,让能够直接对接OpenHarmony Bluetooth HDI,但这样不利于各自独立演进,当后续芯片厂家的vendor lib库需要升级时,会产生较大的维护工作量。
我们采用的是增加vendor lib的adapter层,在adapter层去做接口转换,保障OpenHarmony Bluetooth和厂家的vendor lib能各自独立演进。
电话子系统
8541内置了Modem芯片,支持4G能力。
OpenHarmony的电话子系统,在HAL层的RIL适配部件采用的是hril_hdf、hril、vendorlib三层架构(如下图),适配不同的芯片或者外接模组主要在vendorlib层进行对接。
OpenHarmony社区示例产品rk3568,在vendorlib层对接了外接模组的at指令,但这种适配方案不适合8541等ZR芯片。
芯片厂家的8541e Modem方案中,有自己的rild程序,已经完整的实现了ril层功能,我们不需要再从最底层AT去适配重新去造一个ril,使用厂家的ril程序质量上也更有保障。
因此,整体方案为:rild改造为ril lib闭源库,OpenHarmony RIL适配部件在vendorlib对接厂家ril lib,摒弃原来的AT实现方式。
具体方案如下图:
关键工作有:
1、内核驱动移植
2、集成原厂闭源二进制程序和闭源库
2.1 保留原厂modem control、cp disk、ref notify等原生二进制程序。
2.2 改造rild程序为ril lib闭源库
3、OH适配
3.1 OH启动时拉起原厂二进制程序,使能和配置好Modem。
3.2 实现Vendor Lib,适配对接sprd ril lib
在Vendor Lib中需要逐个适配各指令接口,包括下发和主动上报接口;仅数据功能,就有60+接口。
接口传递的数据结构差异较大,需要在适配层转换,部分缺失的信息需要sprd ril lib中补充;
部分逻辑需要修改,指令异步机制,指令时序不一样,等等。
4、HCS根据设备能力和业务需求进行配置
Camera
OpenHarmony的Camera驱动框架也是多层架构,对上提供HDI接口,对下兼容不同平台实现。
在Platform Adatper层,提供了MPP和V4L2两种架构的对接方案,社区上Hisi产品采用MPP架构,其他大部分产品采用Linux标准的V4L2架构。
8541e原厂的Camera驱动,并没有使用标准的V4L2,主要是由用户态的Unisoc Camera OEM子系统实现,里面包括大量的闭源部分和大量的有源码部分。
但基于Unisoc Camera OEM,可以封装提供“仿冒的”V4L2接口(原厂有类似样例),这让双方在不破坏各自架构的前提下,有了快速对接的可能性。
最终对接方案如下:
关键点有:
1、内核Kernel移植。包括DCAM驱动和Sensor驱动。
2、集成原厂闭源库。包括3a算法在类的10+个闭源库。
3、开源库移植。包括Unisoc Camera OEM接口、sensor接口等15+个开源库,涉及源码75万行以上。
4、OH适配。在Platform Adapter选用V4L2模型,对接厂家适配库V4L2 Adapter,但需要改造V4L2模型的适配源码。
4.1 修改使用原厂API接口来实现,不再使用Linux V4L2设备节点;
4.2 同时,修改适配原厂闭源库逻辑,比如取buffer的方式、设备匹配的方式,等等。
4.3 Sensor修改 Codec转码使用厂家硬件转码库,如libjpeg,来提升性能。
4.4 HCS根据设备能力和业务需求进行配置
Audio
原厂SDK支持ALSA框架,OpenHarmony也支持对接ALSA框架,因此基于libalsa三方库来进行对接。
位置子系统GNSS
与OpenHarmony部分子系统类似,GNSS驱动框架也是多层分离的架构,对上提供统一的HDI接口,对下预留了vendorlib做不用芯片的适配。
GNSS驱动框架按功能可以分为三部分:gnss(基础定位)、agnss(辅助定位)、geofence(地理围栏),每部分可以单独与vendorlib对接。
8541e采用vendorlib来适配对接芯片厂家的vendorlib,主要完成了gnss基础定位功能的适配对接,agnss辅助定位和地理围栏的适配对接方法类似。
主要工作有:
1、移植gnss驱动
2、集成原厂gnss闭源库
3、实现vendorlib,对接原厂闭源库
相关文章:

芯片解决方案--SL8541e-OpenHarmony适配方案
摘要 本文描述8541E芯片适配OpenHarmony的整体方案。 本文描述的整体方案,不止适用于8541e,也适用于该芯片厂家的其他芯片,如7863、7885,少部分子系统会略有差异。 整体方案架构 整体方案架构如下图,遵循OpenHarmo…...

Spring Boot之数据访问集成入门
Spring Boot中的数据访问和集成支持功能是其核心功能之一,通过提供大量的自动配置和依赖管理,极大地简化了数据访问层的开发。Spring Boot支持多种数据库,包括关系型数据库(如MySQL、Oracle等)和非关系型数据库&#x…...

Learn ComputeShader 09 Night version lenses
这次将要制作一个类似夜视仪的效果 第一步就是要降低图像的分辨率, 这只需要将id.xy除上一个数字然后再乘上这个数字 可以根据下图理解,很明显通过这个操作在多个像素显示了相同的颜色,并且很多像素颜色被丢失了,自然就会有降低分…...

Java学习第七天
成员方法分类: 静态成员方法(有static修饰 属于类)建议用类名访问,也可以用对象访问 实例成员方法(无static修饰 属于对象)只能用对象出发访问 使用static来定义一些工具类 工具类直接使用类名.方法调用即…...

深入剖析 Redis 基础及其在 Java 应用中的实战演练
引言 在现代分布式系统和高并发应用中,缓存系统是不可或缺的一环,而 Redis 作为一种高性能的内存数据存储以其丰富的数据结构和快速的读写性能,成为了众多开发者的首选。本篇博客将详细介绍 Redis 的基础知识,并通过 Java 代码演…...

Why I‘m getting 404 Resource Not Found to my newly Azure OpenAI deployment?
题意:为什么我新部署的Azure OpenAI服务会出现404资源未找到的错误? 问题背景: Ive gone through this quickstart and I created my Azure OpenAI resource created a model deployment which is in state succeedded. I also playaround …...

【word导出带图片】使用docxtemplater导出word,通知书形式的word
一、demo-导出的的 二、代码操作 1、页面呈现 项目要求,所以页面和导出来的word模版一致 2、js代码【直接展示点击导出的js代码】 使用插件【先下载这五个插件,然后页面引入插件】 import docxtemplater from docxtemplater import PizZip from pizzip …...

微信小程序路由跳转之间的区别
navigateTo: 功能描述: navigateTo用于保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。 页面栈变化: 当使用navigateTo进行页面跳转时,当前页面会被推入页面栈中,但不会被销毁࿰…...

centos安装docker并配置加速器
docker安装与卸载: 1、检查当前是否安装docker yum list installed | grep docker2、卸载docker 根据yum list installed | grep docker查询出来的内容,逐个进行删除 yum remove docker.x86 64 -y3、启动与关闭docker 4、删除/etc/docker文件夹 如果…...

【软件测试】设计测试用例
目录 📕引言 🍀测试用例 🚩概念 🚩设计测试用例的万能公式 🏀常规思考逆向思维发散性思维 🏀万能公式 🎄设计测试用例的方法 🚩基于需求的设计方法 🏀明确需求中…...

Kafka【十三】消费者消费消息的偏移量
偏移量offset是消费者消费数据的一个非常重要的属性。默认情况下,消费者如果不指定消费主题数据的偏移量,那么消费者启动消费时,无论当前主题之前存储了多少历史数据,消费者只能从连接成功后当前主题最新的数据偏移位置读取&#…...

Python 的语法元素(容易忘记的)
文章目录 同步赋值同步赋值的相关操作同步赋值的原理 同步赋值 同步赋值是 Python 语言的一个强大功能,它让代码更加紧凑和高效,尤其是在处理多个变量时。 同步赋值的相关操作 简单同步赋值: 如果你想同时初始化多个变量到不同的值&#x…...

找到字符串中所有字母异位词问题
欢迎跳转我的主页:羑悻的小杀马特-CSDN博客 目录: 一题目简述: 二思路汇总: 三解答代码: 一题目简述: leetcode题目链接:. - 力扣(LeetCode) 二思路汇总: …...

QEMU用户模式测试AARCH64程序
QEMU的两种模式 QEMU(快速模拟器)是一个开源的机器模拟器和虚拟化器,它能够模拟多种处理器架构,并且可以在不同平台上运行。QEMU 支持两种模式:用户模式和系统模式。 用户模式(User Mode)&…...

机器学习(五) -- 监督学习(8) --神经网络2
机器学习系列文章目录及序言深度学习系列文章目录及序言 上篇:机器学习(五) -- 监督学习(8) --神经网络1 下篇: 前言 tips:标题前有“***”的内容为补充内容,是给好奇心重的宝宝看…...

物联网之PWM呼吸灯、脉冲、LEDC
MENU 前言原理硬件电路设计软件程序设计analogWrite()函数实现呼吸灯效果LEDC输出PWM信号 前言 学习制作呼吸灯,通过LED灯的亮度变化来验证PWM不同电压的输出。呼吸灯是指灯光在单片机的控制之下完成由亮到暗的逐渐变化,感觉好像是人在呼吸。 原理 脉冲宽…...

Python利用pyecharts实现数据可视化
小编会持续更新知识笔记,如果感兴趣可以三连支持。闲来无事,水文一篇,不过上手实践一下倒还是挺好玩的,这一块知识说不定以后真可以尝试拿来做数据库的报表显示。 有梦别怕苦,想赢别喊累。 目录 前言 JSON数据格式的…...

网恋照妖镜源码搭建教程
文章目录 前言创建网站1.打开网站设置 配置ssl2.要打开强制HTTPS,用宝塔免费的ssl证书即可,也可以使用其他证书,必须是与域名匹配的3.上传文件至根目录进行解压4.解压后,修改文件 sc.php 里面的内容5.其余探索 前言 前俩年很火的…...

STM32
(以下操作环境为Keil5和proteus8.9) 八种输入输出模式及他们的工作模式 分析如下 总线:总线提供了数据在不同组件(如处理器、内存、输入输出设备等)之间传输的路径,使数据能够快速、准确地在系统内流动。 …...

用手机做抢答器 低预算知识竞赛活动的选择
使用手机作为抢答器是低预算竞赛活动的一个理想选择。随着智能手机的普及,传统抢答器已经被手机抢答器所替代,这种转变不仅降低了成本,而且提供了更大的灵活性和便利性。通过手机扫码登录竞赛软件,参赛者可以直接在手机上进行抢答…...

ELK学习笔记(二)——使用K8S部署Kibana8.15.0
上篇文章我们完成了,ES的集群部署,如果还没有看过上篇文章的兄弟,可以去看看。 ELK学习笔记(一)——使用K8S部署ElasticSearch8.15.0集群 话不多说,接下来直接进入kibana的搭建 一、下载镜像 #1、下载官方…...

报错:CPU指令集的问题
bug描述 我在运行CMAQ中的icon时,遇到bug: Please verify that both the operating system and the processor support Intel(R) X87, CMOV, MMX, FXSAVE, SSE, SSE2, SSE3, SSSE3, SSE4_1, SSE4_2, POPCNT and AVX instructions.解决办法 经过查询&a…...

Type-C接口诱骗取电快充方案
Type-C XSP08Q 快充协议芯片是一种新型电源管理芯片,主要负责控制充电电流和电压等相关参数,从而实现快速充电功能。Type-C XSP08Q快充协议是在Type-C接口基础上,加入了XSP08Q协议芯片的支持,很大程度上提升了充电速度。 正常情况…...

图像白平衡
目录 效果 背景 什么是白平衡? 实现原理 将指定图色调调整为参考图色调主要流程 示例代码 效果 将图一效果转换为图二效果色调: 调整后,可实现色调对换 背景 现有两张图像,色调不一致,对于模型重建会有影响。因…...

SAP Business One 与无锡哲讯:携手共创企业数字化未来
在当今快速发展的商业世界中,企业的数字化转型已成为提升竞争力的关键。在众多的数字化解决方案中,SAP Business One 以其强大的功能和灵活性脱颖而出。与此同时,无锡哲讯智能科技有限公司作为专业的 SAP 系统服务提供商,为企业带…...

Unity Adressables 使用说明(五)在运行时使用 Addressables(Use Addressables at Runtime)
一旦你将 Addressable assets 组织到 groups 并构建到 AssetBundles 中,就需要在运行时加载、实例化和释放它们。 Addressables 使用引用计数系统来确保 assets 只在需要时保留在内存中。 Addressables 初始化 Addressables 系统在运行时第一次加载 Addressable …...

什么是死锁,如何解决?
什么是死锁? 在并发编程中,死锁是指两个或多个进程在竞争资源时,互相等待无法继续执行的状态。这种情况发生时,每个进程都在等待其他进程释放它们所需要的资源,但同时又不释放自己占有的资源,导致所有进程…...

借助ChatGPT三步,完成课题申报书中研究价值部分写作全攻略指南
大家好,感谢关注。我是七哥,一个在高校里不务正业,折腾学术科研AI实操的学术人。关于使用ChatGPT等AI学术科研的相关问题可以和作者七哥(yida985)交流,多多交流,相互成就,共同进步,为大家带来最酷最有效的智能AI学术科研写作攻略。 撰写申请书中的“本课题的学术价值…...

IDEA取消自动选择光标所在行
今天出现了一个怪事: 当我使用IDEA编写代码的时候,单击下一行或者上一行的时候,莫名其妙它会自己选中一行,导致我要么是回车代码直接没了,要么是代码直接给我搞错位了,还得按ctrlz返回,十分的恶…...

VUE2.0 elementUI el-input-number 数据更新,视图不更新——基础积累
今天遇到一个问题,是关于el-input-number组件的,发现数据明明已经更改了,但是页面上组件输入框中还是之前的值。 比如上方输入框中,我输入120.5,就会出现下面的诡异现象 回显此值是120.779,但是页面上输入…...