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个阶段,即需求分析、计划、设计、编码、测试、运行维护 需求分析阶段: 分析需求的可行性&…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
