redroid11 集成 nvidia gpu hals
前言
此篇文章中使用 nvidia 相关aosp 库、510.155_Android_R_aarch64_release文件来于原厂提供基础资料,可供 aosp 移植库基本思路。
本文记录 redroid11(aosp11) 集成 nvidia gpu 驱动库、 nvidia_omx 驱动库实践记录,以作备忘。
1>. Apply the patch to Android R code then trigger the build.
2>. Change ro.board.platform=nv-streaming for build.prop in build output, or rename the gralloc.nv-streaming.so in step #3,
corresponding to your platform name. eg: TARGET_BOARD_PLATFORM:=nv-streaming or rename gralloc.nv-streaming.so gralloc.redroid.so
在文件 @build/make/tools/buildinfo.sh 增加如下内容。
if [ -z "$TARGET_BOARD_PLATFORM" ];thenecho "##"echo "## Add ro.board.platform"echo "##"echo "ro.board.platform=nv-streaming"#echo "ro.board.platform=AMD"#echo "ro.hardware.gralloc=dri"#echo "ro.hardware.vulkan=amd"#echo "ro.hardware.egl=AMD"echo ""
fi
3>. Copy the graphics lib files in Android_aarch64_release.tar to the corresponding directory
under system/vendor/ . Remove other files under vendor/lib(64)/egl/ of your build output.
4>. Ensure hwcomposer process in the container has permission for /tmp/display_pipe.
For example, change the binderinit.sh file:
cpp chown system system /tmp chmod 777 /tmp
4.1> del umount /etc/* in binderinit.sh
cpp # umount /etc/* # rm -rf /etc # ln -s /system/etc /etc
5>. Add related property in redroid.common.rc By default the graphics will use 720p 30fps,
setprop persist.sys.display.resolution 720x1080setprop persist.sys.display.refresh 30
6>. If you want to run container in different GPU,set below property
setprop persist.vendor.nvidia.gpu.index $index
docker run input parament: ‘persist.vendor.nvidia.gpu.index=0/1/2…’
7>.hwcomposer2.1 which use HIDL interface
7.1> Add below part in your product manifest.xml which define hidl interface:
<hal format="hidl"><name>android.hardware.graphics.composer</name><transport>hwbinder</transport><version>2.1</version><interface><name>IComposer</name><instance>default</instance></interface></hal>
<!--nvidia begin--><hal format="hidl"><name>vendor.nvidia.hardware.graphics.composer</name><transport>hwbinder</transport><version>1.0</version><interface><name>INvComposer</name><instance>default</instance></interface></hal><hal format="hidl"><name>vendor.nvidia.hardware.graphics.display</name><transport>hwbinder</transport><version>1.0</version><interface><name>INvDisplay</name><instance>default</instance></interface></hal>
<!--nvidia end-->
7.2> rewrite compatibility_matrices
${TOP}/hardware/interfaces/compatibility_matrices/compatibility_matrix.5.xml
<!--nvidia begin--><hal format="hidl" optional="false"><name>vendor.nvidia.hardware.graphics.composer</name><version>1.0</version><interface><name>INvComposer</name><instance>default</instance></interface></hal><hal format="hidl" optional="false"><name>vendor.nvidia.hardware.graphics.display</name><version>1.0</version><interface><name>INvDisplay</name><instance>default</instance></interface></hal>
<!--nvidia end-->
7.3> 移除 android.hardware.graphics.composer@2.1-service 服务
## gpu render
PRODUCT_PACKAGES += \android.hardware.drm@1.3-service-lazy.clearkey \android.hardware.graphics.allocator@2.0-service \android.hardware.graphics.allocator@2.0-impl \android.hardware.graphics.mapper@2.0-impl-2.1 \#android.hardware.graphics.composer@2.1-service \#android.hardware.graphics.composer@2.1-impl \
8> graphics composer
8.1> Add vendor.nvidia.hardware.graphics.composer@1.0-service which under system\vendor\bin\hw to your image.
8.2> ensure it’s init rc vendor.nvidia.hardware.graphics.composer@1.0-service.rc and lib dependency
are included.
8.3> For internal build related reason, NVIDIA graphics lib will depend on libc++_nv_build.so
instead of libc++.so, so need copy /system/lib(64)/libc++.so to /system/lib(64)/libc++_nv_build.so for graphics lib to use.
因 510.155_Android_R_aarch64_release.tar 文件中没有 libc++_nv_build.so 库文件,从 android-arm-r.tar.gz 文件提取出 libc++_nv_build.so 并
拷贝至 redroid11 编译镜像中。
8.4> Need ensure libhidltransport/libhwbinder are included in container build
redroid11 手工编译 libhidl
mmm system/libhidl/
##mmm external/selinux
mmm external/libdrm
mmm system/libhwbinder
8.5>. Diff in system/linkerconfig to allow hwcomposer service load required library:
diff --git a/contents/namespace/systemdefault.cc b/contents/namespace/systemdefault.cc
index a9bfdb1..7b7c647 100644
--- a/contents/namespace/systemdefault.cc
+++ b/contents/namespace/systemdefault.cc
@@ -14,6 +14,19 @@
* limitations under the License.
*/
+// Not a contribution
+// Changes made by NVIDIA CORPORATION
+// NVIDIA-proprietary are not a contribution and subject to the following terms and conditions:
+//
+// Copyright (C) 2022 NVIDIA CORPORATION. All Rights Reserved.
+//
+// NVIDIA CORPORATION and its licensors retain all intellectual property
+// and proprietary rights in and to this software, related documentation
+// and any modifications thereto. Any use, reproduction, disclosure or
+// distribution of this software and related documentation is governed by
+// the NVIDIA Pre-Release License Agreement between NVIDIA CORPORATION and
+// the licensee. All other uses are strictly forbidden.
+
// Framework-side code runs in this namespace. Libs from /vendor partition can't
// be loaded in this namespace.
@@ -81,6 +94,8 @@ Namespace BuildSystemDefaultNamespace([[maybe_unused]] const
Context& ctx) {
"/system/vendor/framework",
"/system/vendor/app",
"/system/vendor/priv-app",
+ "/system/vendor/${LIB}/egl",
+ "/system/vendor/${LIB}/hw",
"/odm/framework",
"/odm/app",
"/odm/priv-app",
@@ -101,6 +116,10 @@ Namespace BuildSystemDefaultNamespace([[maybe_unused]] const
Context& ctx) {
ns.AddPermittedPath(product + "/${LIB}", AsanPath::SAME_PATH);
}
}
+ ns.AddPermittedPath("/system/vendor/${LIB}/egl", AsanPath::NONE);
+ ns.AddPermittedPath("/system/vendor/${LIB}/hw", AsanPath::NONE);
+ ns.AddSearchPath("/system/vendor/${LIB}/egl", AsanPath::NONE);
+ ns.AddSearchPath("/system/vendor/${LIB}/hw", AsanPath::NONE);
ns.AddRequires(std::vector{
// Keep in sync with the "platform" namespace in art/build/apex/ld.config.txt.
8.6> linkerconfig 增加 libc++_nv_build.so 和 libui.so
文件中 @system/linkerconfig/contents/common/system_links.cc 增加
void AddStandardSystemLinks(const Context& ctx, Section* section) {const bool debuggable = android::base::GetBoolProperty("ro.debuggable", false);const std::string system_ns_name = ctx.GetSystemNamespaceName();const bool is_section_vndk_enabled = ctx.IsSectionVndkEnabled();section->ForEachNamespaces([&](Namespace& ns) {if (ns.GetName() != system_ns_name) {ns.GetLink(system_ns_name).AddSharedLib(kBionicLibs);if (!is_section_vndk_enabled || ns.GetName() != "default") {ns.GetLink(system_ns_name).AddSharedLib(Var("SANITIZER_RUNTIME_LIBRARIES"));}if (debuggable) {// Library on the system image that can be dlopened for debugging purposes.ns.GetLink(system_ns_name).AddSharedLib("libfdtrack.so");}//>for nvidia ns.GetLink(system_ns_name).AddSharedLib("libc++_nv_build.so");ns.GetLink(system_ns_name).AddSharedLib("libui.so");ns.GetLink(system_ns_name).AddSharedLib("libstagefright.so");//>nvidia end}});
}
8.7> 修改 vendor.nvidia.hardware.graphics.composer@1.0-service.rc
封闭 composer@2.1::IComposer default 内容,解决 reference 错误。
service hwcomposer-1-0 /vendor/bin/hw/vendor.nvidia.hardware.graphics.composer@1.0-serviceclass hal animationuser systemgroup graphics drmrpccapabilities SYS_NICEonrestart restart surfaceflinger#interface android.hardware.graphics.composer@2.1::IComposer defaultinterface android.hardware.graphics.composer@2.2::IComposer defaultinterface vendor.nvidia.hardware.graphics.composer@1.0::INvComposer defaultinterface vendor.nvidia.hardware.graphics.display@1.0::INvDisplay default
8.8> Add media_codecs_nvidia
nvidia_omx的移植基础打打补丁文件:omx.patch.
@hardware/redroid/omx/media_codecs.xml 增加 nvidia 配置内容.
<MediaCodecs><Encoders><MediaCodec name="OMX.redroid.h264.encoder" type="video/avc" /></Encoders><Include href="media_codecs_nvidia.xml" /><Include href="media_codecs_google_audio.xml" /><Include href="media_codecs_google_telephony.xml" /><Include href="media_codecs_google_video.xml" />
</MediaCodecs>
把文件拷贝至 vendor 路径下
PRODUCT_COPY_FILES +=
vendor/nvidia/Android_R/nvidia_omx/media_codecs_nvidia.xml: ( T A R G E T C O P Y O U T V E N D O R ) / e t c / m e d i a c o d e c s n v i d i a . x m l v e n d o r / n v i d i a / A n d r o i d R / n v i d i a o m x / l i b / l i b n v i d i a o m x . s o : (TARGET_COPY_OUT_VENDOR)/etc/media_codecs_nvidia.xml \ vendor/nvidia/Android_R/nvidia_omx/lib/libnvidia_omx.so: (TARGETCOPYOUTVENDOR)/etc/mediacodecsnvidia.xml vendor/nvidia/AndroidR/nvidiaomx/lib/libnvidiaomx.so:(TARGET_COPY_OUT_VENDOR)/lib/libnvidia_omx.so
vendor/nvidia/Android_R/nvidia_omx/lib64/libnvidia_omx.so:$(TARGET_COPY_OUT_VENDOR)/lib64/libnvidia_omx.so \
8.9> Add libnvidia_omx.so
@framework/av/media/libstragefright/omx/OMXMaster.cpp 增加库
void OMXMaster::addVendorPlugin() {addPlugin("libstagefrighthw.so");addPlugin("libstagefrighthw_inno.so");addPlugin("libnvidia_omx.so");
}
8.10> 解决 cpuset cgroup controller is not mounted! 错误
10-20 05:24:35.935 0 0 E init : cpuset cgroup controller is not mounted!
10-20 05:24:35.936 0 0 I init : processing action (init.svc.audioserver=running) from (/system/etc/init/audioserver.rc:35)
10-20 05:24:35.941 0 0 I init : starting service 'vendor.audio-hal'...
10-20 05:24:35.944 0 0 E init : cpuset cgroup controller is not mounted!
修改源码:@system/core/libprocessgroup/setup/cgroup_map_write.cpp文件内容如下:
bool CgroupSetup() {using namespace android::cgrouprc;std::map<std::string, CgroupDescriptor> descriptors;if (getpid() != 1) {LOG(ERROR) << "Cgroup setup can be done only by init process";//return false; 关闭 pid != 1 错误退出}// Make sure we do this only one time. No need for std::call_once because// init is a single-threaded processif (access(CGROUPS_RC_PATH, F_OK) == 0) {LOG(WARNING) << "Attempt to call SetupCgroups more than once";return true;}......
}
9>. Package your container image from the modified output.
测试系统集成结果
scrcpy客户端启动参数配置:
C:\NV-GPU\istream-v1.24>
start “R3” /b scrcpy.exe --tcpip=192.168.31.25:21002
–window-title=3 --window-x=640 --window-y=30 --window-width=320 --window-height=180 --always-on-top
–encoder=OMX.nvidia.h264.encoder --stay-awake -V debug
–rotation=1 --lock-video-orientation=0
–max-fps=30 --bit-rate=3000000
–codec-options=minQP:int=8,maxQP:int=35,frameCount:int=-1,isUseVBR:int=1,isSaveFile:int=0,
verbose:int=0,isSaveYuv:int=0,qp:int=25,gopSize=600,gopPreset=0,
keyPeriod=600,keyRefreshMode:int=0,keyRefreshArg:int=10,keyFrameIndex:int=-1,
isScale:int=0,scaleWith:int=1280,scaleHeight:int=720,isUseCrop:int=0,cropTopOffset:int=0,cropBottomOffset:int=0,cropLeftOffset:int=0,cropRightOffset:int=0,isUseROI=0,
roiFrameIndex=0,isUseSEI=0,seiFrameIndex=0,byPassFlages:int=255,
interval:int=60,pushStreamTimeout:int=10,bufferType:int=0,captureMode:int=5,
encoderName:string=OMX.nvidia.h264.encoder --stay-awake -V debug
相关文章:
redroid11 集成 nvidia gpu hals
前言 此篇文章中使用 nvidia 相关aosp 库、510.155_Android_R_aarch64_release文件来于原厂提供基础资料,可供 aosp 移植库基本思路。 本文记录 redroid11(aosp11) 集成 nvidia gpu 驱动库、 nvidia_omx 驱动库实践记录,以作备忘。 1>. Apply the p…...
在 Visual Studio 中远程调试 C++ 项目
目录 一、说明二、下载远程工具1. 官网下载2. 自己电脑上拷贝 三、 运行远程工具四、本机Visual Studio配置五、自动部署 一、说明 参考官方文档:https://learn.microsoft.com/zh-cn/visualstudio/debugger/remote-debugging-cpp?viewvs-2022 二、下载远程工具 …...
AAOS CarMediaService 问题分析
文章目录 问题描述车载蓝牙音乐流程Music 监听焦点变化流程BT请求焦点的流程MediaSession 服务端的流程BT和music 之间的相互影响 问题描述 问题 AAOS界面连接蓝牙的情况下,Music应用播放音乐会暂停。 分析 暂停是应用的行为,Music应用会监听focus的变化…...
06-Flask-蓝图的使用
蓝图的使用 前言蓝图使用方式 前言 本篇来学习下Flask中蓝图的使用 蓝图 在Flask中使用蓝图(Blurprint)来分模块组织管理蓝图可以理解为存储一组视图方法的容器对象,特点如下: 一个应用可以具有多个Blueprint可以将一个Blueprint注册到任何一个未使用…...
【LeetCode力扣】189 53 轮转数组 | 最大子数组和
目录 1、189. 轮转数组 1.1、题目介绍 1.2、解题思路 2、53. 最大子数组和 2.1、题目介绍 2.2、解题思路 1、189. 轮转数组 1.1、题目介绍 原题链接:189. 轮转数组 - 力扣(LeetCode) 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3输…...
Go学习第十七章——Gin中间件与路由
Go web框架——Gin中间件与路由 1 单独注册中间件1.1 入门案例1.2 多个中间件1.3 中间件拦截响应1.4 中间件放行 2 全局注册中间件3 自定义参数传递4 路由分组4.1 入门案例4.2 路由分组注册中间件4.3 综合使用 5 使用内置的中间件6 中间件案例权限验证耗时统计 1 单独注册中间件…...
真实感渲染的非正式调研与近期热门研究分享
真实感渲染的非正式调研与近期热门研究分享 1 期刊1 Top2 Venues 2 Rendering Reserach1 Material2 BRDF3 Appearance Modeling4 Capture5 Light Transport光线传播6 Differetiable Rendring-可微渲染7 Ray Tracing8 Denoising降噪9 NeRF 3 VR/AR4 Non-Photorealistic Renderin…...
matlab中字符串转换为数字(str2double函数)
str2double函数 将 str 中的文本转换为双精度值。str 包含表示实数或复数值的文本。str 可以是字符向量、字符向量元胞数组或字符串数组。如果 str 是字符向量或字符串标量,则 X 是数值标量。如果 str 是字符向量元胞数组或字符串数组,则 X 是与 str 具…...
基于java的ssm框架农夫果园管理系统设计与实现
项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…...
ctf md5爆破
1.知道组成的字符为数字,然后知道加密后的MD5,求组成的字符 import hashlibimport stringdef crackMd5(dst):dst dst.lower()for a in range(0,10):for b in range(0,10):for c in range(0,10):for d in range(0,10):word str(a) str(b) str(c) str(d) "_heetian&q…...
不同碳化硅晶体面带来的可能性
对于非立方晶体,它们天生具有各向异性,即不同方向具有不同的性质。以碳化硅晶体面为例: 4H-SIC和6H-SIC的空间群是P63mc,点群是6mm。两者都属于六方晶系,具有各向异性。3C-SIC的空间群是F-43m,点群是-43m。…...
Kafka集群
Kafka集群 1、Kafka 概述1.1消息队列背景1.2类型1.3Kafka 定义1.4Kafka 简介 2、消息队列好处3、消息队列的模式4、Kafka 的特性5、Kafka 系统架构4、部署 kafka 集群4.1下载安装包4.2 安装 Kafka4.2.1 修改配置文件4.2.2 修改环境变量4.2.3 配置 zookeeper启动脚本4.2.4 设置…...
国腾GM8775C完全替代CS5518 MIPIDSI转2 PORT LVDS
集睿致远CS5518描述: CS5518是一款MIPI DSI输入、LVDS输出转换芯片。MIPI DSI 支持多达4个局域网,每条通道以最 大 1Gbps 的速度运行。LVDS支持18位或24位像素,25Mhz至154Mhz,采用VESA或JEIDA格 式。它只能使用单个1.8v电源&am…...
搜索与图论:匈牙利算法
将所有点分成两个集合,使得所有边只出现在集合之间,就是二分图 二分图:一定不含有奇数个点数的环;可能包含长度为偶数的环, 不一定是连通图 二分图的最大匹配: #include<iostream> #include<cs…...
明星艺人类的百度百科怎么创建 ?
明星艺人们的知名度对于其事业的成功至关重要,而作为国内最大的中文百科全书网站,百度百科成为了人们获取信息的重要来源。一线明星当然百科不用自己操心,平台和网友就给维护了,但是刚刚走红的明星艺人应提早布局百科词条…...
类EMD的“信号分解方法”及MATLAB实现(第八篇)——离散小波变换DWT(小波分解)
在之前的系列文章里,我们介绍了EEMD、CEEMD、CEEMDAN、VMD、ICEEMDAN、LMD、EWT,我们继续补完该系列。 今天要讲到的是小波分解,通常也就是指离散小波变换(Discrete Wavelet Transform, DWT)。在网上有一些介绍该方法…...
python随手小练10(南农作业题)
题目1: 编写程序,输出1~1000之间所有能被4整除,但是不能被5整除的数 具体操作: for i in range(1,1000): #循环遍历1~999,因为range是左闭右开if (i % 4 0) and (i % 5 ! 0) :print(i) 结果展示: 题目2&…...
How to install mongodb-7.0 as systemd service with podman
How to install mongodb-7.0 as systemd service with podman 1、安装1.1、创建卷1.2、配置文件1.3、创建容器1.4、服务管理1.5、容器管理 2、客户端管理 1、安装 1.1、创建卷 配置卷 podman volume create --label typemongo-7.0 --label envdev mongo-7.0-conf数据卷 pod…...
一文彻底理解python浅拷贝和深拷贝
目录 一、必备知识二、基本概念三、列表,元组,集合,字符串,字典浅拷贝3.1 列表3.2 元组3.3 集合3.4 字符串3.5 字典3.6 特别注意浅拷贝总结 四、列表,元组,集合,字符串,字典深拷贝 一…...
什么是软件的生命周期?全方位解释软件的生命周期
软件的生命周期 软件生命周期是指从软件产品的设想开始到软件不再使用而结束的时间。 如果把软件看成是有生命的事 物,那么软件的生命周期可以分成6个阶段,即需求分析、计划、设计、编码、测试、运行维护 需求分析阶段: 分析需求的可行性&…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...
