当前位置: 首页 > news >正文

安卓11-设置HDMI分辨率流程

安卓11中从设置-显示设置hdmi分辨率流程:framework层通过jni控制底层驱动实现,标准驱动模型


packages\apps\Settings\src\com\android\settings\display\HdmiSettings.javaprivate void updateResolution(final ITEM_CONTROL control, final int index) {showWaitingDialog(R.string.dialog_update_resolution);mEnableDisplayListener = false;new Thread() {@Overridepublic void run() {if (ITEM_CONTROL.CHANGE_RESOLUTION == control) {synchronized (mLock) {int display = mSelectDisplayInfo.getDisplayNo();DrmDisplaySetting.updateDisplayInfos();DrmDisplaySetting.updateDisplayModesInfo(mSelectDisplayInfo);int status = DrmDisplaySetting.getCurrentDpyConnState(display);mSelectDisplayInfo.setStatus(status);String[] modes = mSelectDisplayInfo.getOrginModes();Log.v(TAG, "display " + display + ", status=" + status + ", modes=" + modes);if (DPY_STATUS_CONNECTED == status && null != modes && modes.length > 0) {DrmDisplaySetting.setDisplayModeTemp(mSelectDisplayInfo, index);
//                            String mode = Arrays.asList(modes).get(index);
//                            DrmDisplaySetting.setMode(display, mode);if (USED_OFFON_RESOLUTION) {sendSwitchDeviceOffOnMsg(control, SWITCH_STATUS_OFF_ON);} else {Message message = new Message();message.what = MSG_SHOW_CONFIRM_DIALOG;message.obj = control;mHandler.sendMessageDelayed(message, 300);}} else {Message message = new Message();message.what = MSG_UPDATE_STATUS_UI;message.obj = ITEM_CONTROL.REFRESH_DISPLAY_STATUS_INFO;mHandler.sendMessage(message);}}}}}.start();}packages/apps/Settings/src/com/android/settings/display/DrmDisplaySetting.javapublic static void setDisplayModeTemp(DisplayInfo di, int index) {String mode = Arrays.asList(di.getOrginModes()).get(index);setMode(di.getDisplayNo(), mode);tmpSetMode = mode;}public static void setDisplayModeTemp(DisplayInfo di, int index) {String mode = Arrays.asList(di.getOrginModes()).get(index);setMode(di.getDisplayNo(), mode);tmpSetMode = mode;}public static void setMode(int display, String mode) {RkDisplayOutputManager manager = new RkDisplayOutputManager();int result = manager.updateDisplayInfos();int type = manager.getCurrentInterface(display);logd("setMode display=" + display + ", type=" + type + ", mode=" + mode);manager.setMode(display, type, mode);}
frameworks$ vim ./base/core/java/android/os/RkDisplayOutputManager.java
public void setMode(int display, int type, String mode) {String iface = typetoface(type);try {mService.setMode(display, iface, mode);}catch (Exception e) {Log.e(TAG, "Error set mode :" + e);return;}}public RkDisplayOutputManager() {IBinder b = ServiceManager.getService("drm_device_management");if(b == null) {Log.e(TAG, "Unable to connect to display device management service! - is it running yet?");return;}mService = IRkDisplayDeviceManagementService.Stub.asInterface(b);int mMainState = getCurrentDpyConnState(MAIN_DISPLAY);try {// Get main display interfaceString[] display_iface = mService.listInterfaces(MAIN_DISPLAY);if(DBG) Log.d(TAG, "main display iface num is " + display_iface.length);if(display_iface != null && display_iface.length > 0 &&  mMainState==DRM_MODE_CONNECTED) {m_main_iface = new int[display_iface.length];for(int i = 0; i < m_main_iface.length; i++) {if(DBG) Log.d(TAG, display_iface[i]);m_main_iface[i] = ifacetotype(display_iface[i]);}}./base/services/core/java/com/android/server/RkDisplayDeviceManagementService.javapublic void setMode(int display, String iface, String mode) {boolean isSameProperty = false;String lastMode;mdrmModes.setMode(display, iface, mode);}public RkDisplayDeviceManagementService(Context context) {mContext = context;mdrmModes = new RkDisplayModes();mdrmModes.init();IntentFilter hdmiFilter = new IntentFilter();hdmiFilter.addAction(ACTION_PLUGGED);mHdmiReceiver = new HdmiReceiver(mdrmModes);mContext.registerReceiver(mHdmiReceiver,hdmiFilter);}./base/services/core/java/com/android/server/rkdisplay/RkDisplayModes.javapublic void setMode(int display, String iface, String mode){int ifaceType = ifacetotype(iface);String[] mode_str;int idx=0;RkDisplayModes.RkPhysicalDisplayInfo info;Log.w(TAG, "setMode " + mode + " display " + display);if (mode.contains("Auto")) {nativeSetMode(display, ifaceType, mode);//通过本地方法实现} else {mode_str = mode.split("-");for (String mval: mode_str){Log.e(TAG, "setMode split:  " + mval);}if (mode_str.length != 2){return;}idx = Integer.parseInt(mode_str[1]);if (mMainDisplayInfos!=null && idx >= mMainDisplayInfos.length && display==0)idx=0;else if (mAuxDisplayInfos!=null && idx >= mAuxDisplayInfos.length && display==1)idx=0;if (display == 0)info = mMainDisplayInfos[idx];elseinfo = mAuxDisplayInfos[idx];StringBuilder builder = new StringBuilder();builder.append(info.width).append("x").append(info.height);
/*if (info.interlaceFlag == true)builder.append("i");elsebuilder.append("p");
*/builder.append("@");builder.append(String.format(Locale.ENGLISH, "%.2f", info.refreshRate));builder.append("-");builder.append(info.hsync_start);builder.append("-");builder.append(info.hsync_end);builder.append("-");builder.append(info.htotal);builder.append("-");builder.append(info.vsync_start).append("-").append(info.vsync_end).append("-").append(info.vtotal).append("-").append(String.format(Locale.ENGLISH, "%x", info.flags)).append("-").append(info.clock);nativeSetMode(display, ifaceType, builder.toString());}}
base/services/core/jni/com_android_server_rkdisplay_RkDisplayModes.cpp 
#include <rockchip/hardware/outputmanager/1.0/IRkOutputManager.h>  
static void nativeSetMode(JNIEnv* env, jobject obj, jint dpy, jint iface_type, jstring mode)
{const char* mMode = env->GetStringUTFChars(mode, NULL);if (mComposer != nullptr)mComposer->setMode(dpy, mMode); //这里又调用了hal层的方法env->ReleaseStringUTFChars(mode, mMode);
}
static void nativeInit(JNIEnv* env, jobject obj) {mComposer = IRkOutputManager::getService();//通过IRkOutputManager实现hdmi分辨率写入的if (mComposer != nullptr) {mComposer->initial();} else {ALOGD("nativeInit failed to get IRkOutputManager");}
}
./vendor/rockchip/hardware/interfaces/outputmanager/1.0/default/RkOutputManager.cpp
Return<Result> RkOutputManager::setMode(Display display, const hidl_string& mode)
{std::string modeStd(mode.c_str());mHwOutput->setMode(mHwOutput, display, modeStd.c_str());  //找到设备写入的地方return Result::OK;
}
IRkOutputManager* HIDL_FETCH_IRkOutputManager(const char* /* name */) {struct hw_output_device*   mHwOutput;const hw_module_t* hw_module = nullptr;int ret = hw_get_module(HW_OUTPUT_HARDWARE_MODULE_ID, &hw_module);//找到这个设备,获取设备,设备的具体实现在hw_output.cppif (ret == 0) {ret = hw_output_open(hw_module, &mHwOutput);if (ret == 0) {return new RkOutputManager(mHwOutput);} else {LOG(ERROR) << "Passthrough failed to load legacy HAL.";return nullptr;}}else {LOG(ERROR) << "hw_get_module " << HWC_HARDWARE_MODULE_ID<< " failed: " << ret;return nullptr;}
}
hardware/libhardware/modules/hw_output/hw_output.cpp
static int hw_output_device_open(const struct hw_module_t* module,const char* name, struct hw_device_t** device)
{int status = -EINVAL;if (!strcmp(name, HW_OUTPUT_DEFAULT_DEVICE)) {hw_output_private_t* dev = (hw_output_private_t*)malloc(sizeof(*dev));/* initialize our state here *///memset(dev, 0, sizeof(*dev));/* initialize the procs */dev->device.common.tag = HARDWARE_DEVICE_TAG;dev->device.common.version = HW_OUTPUT_DEVICE_API_VERSION_0_1;dev->device.common.module = const_cast<hw_module_t*>(module);dev->device.common.close = hw_output_device_close;dev->device.initialize = hw_output_initialize;dev->device.setMode = hw_output_set_mode; //这里传递一个函数指针,具体设置分辨率的地方
..........
static int hw_output_set_mode(struct hw_output_device* dev, int dpy, const char* mode)
{hw_output_private_t* priv = (hw_output_private_t*)dev;DrmConnector* conn = getValidDrmConnector(priv, dpy);BaseParameter* mBaseParameter = priv->mBaseParmeter;char property[PROPERTY_VALUE_MAX];std::string propertyStr;propertyStr = getPropertySuffix(priv, "persist.vendor.resolution.", dpy);ALOGD("nativeSetMode %s display %d", mode, dpy);if (strcmp(mode, property) !=0) {property_set(propertyStr.c_str(), mode);updateTimeline();struct disp_info info;float vfresh=0.0f;int slot = 0;mBaseParameter->get_disp_info(conn->get_type(), conn->connector_id(), &info);slot = findSuitableInfoSlot(&info, conn->get_type(), conn->connector_id());info.screen_info[slot].type = conn->get_type();info.screen_info[slot].id = conn->connector_id();if (strncmp(mode, "Auto", 4) != 0 && strncmp(mode, "0x0p0-0", 7) !=0) {sscanf(mode,"%dx%d@%f-%d-%d-%d-%d-%d-%d-%x-%d",&info.screen_info[slot].resolution.hdisplay, &info.screen_info[slot].resolution.vdisplay,&vfresh, &info.screen_info[slot].resolution.hsync_start,&info.screen_info[slot].resolution.hsync_end,&info.screen_info[slot].resolution.htotal,&info.screen_info[slot].resolution.vsync_start,&info.screen_info[slot].resolution.vsync_end, &info.screen_info[slot].resolution.vtotal,&info.screen_info[slot].resolution.flags, &info.screen_info[slot].resolution.clock);info.screen_info[slot].resolution.vrefresh = (int)vfresh;} else {info.screen_info[slot].feature|= RESOLUTION_AUTO;memset(&info.screen_info[slot].resolution, 0, sizeof(info.screen_info[slot].resolution));}mBaseParameter->set_disp_info(conn->get_type(), conn->connector_id(), &info);}return 0;
}

相关文章:

安卓11-设置HDMI分辨率流程

安卓11中从设置-显示设置hdmi分辨率流程:framework层通过jni控制底层驱动实现&#xff0c;标准驱动模型 packages\apps\Settings\src\com\android\settings\display\HdmiSettings.javaprivate void updateResolution(final ITEM_CONTROL control, final int index) {showWaitin…...

Vue3+vite搭建基础架构(11)--- 菜单栏功能和Tab页功能实现

Vue3vite搭建基础架构&#xff08;11&#xff09;--- 菜单栏功能和Tab页功能实现 说明删除项目中不需要的文件userStore全局属性代码菜单栏代码Tab页代码解决浏览器输入地址时不会打开tab页问题和切换tab页时参数丢失问题 说明 这里记录下自己在Vue3vite的项目实现菜单栏功能和…...

餐饮神秘顾客公司:关于餐饮行业神秘顾客调查注意事项

在餐饮业&#xff0c;顾客体验往往决定品牌的成败。为深入了解顾客需求和感受&#xff0c;许多餐饮企业引入“神秘顾客”调查。然而&#xff0c;此调查并非简单走过场&#xff0c;其中细节和注意事项颇多。餐饮行业神秘顾客调查需注意以下几点&#xff1a; 1. 专业培训&#x…...

概率密度函数(PDF)与神经网络中的激活函数

原创:项道德(daode3056,daode1212) 在量子力学中&#xff0c;许多现象都是统计的结果&#xff0c;基本上用的是正态分布&#xff0c;然而&#xff0c;从本质上思考&#xff0c;应该还存在低阶的分布&#xff0c;标准的正态分布是它的极限&#xff0c;这样一来&#xff0c;或许在…...

.netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项

1、SqlSugarCore 相关 1.1 主项目添加数据&#xff0c;否则会报数据库连接错误&#xff1a; <InvariantGlobalization>false</InvariantGlobalization> <PropertyGroup><TargetFramework>net8.0</TargetFramework><Nullable>enable</…...

算法打卡day2|数组篇|Leetcode 977.有序数组的平方、 209.长度最小的子数组、59.螺旋矩阵II

算法题 Leetcode 977.有序数组的平方 题目链接: 977.有序数组的平方 大佬视频讲解&#xff1a;977.有序数组的平方 个人思路 第一时间就只想到暴力解法&#xff0c;双重循环一个循环比较一个循环赋值&#xff1b;但这样可能会超时&#xff0c;所以还能用双指针&#xff0…...

Hive【内部表、外部表、临时表、分区表、分桶表】【总结】

目录 Hive的物种表结构特性 一、内部表 建表 使用场景 二、外部表 建表:关键词【EXTERNAL】 场景&#xff1a; 外部表与内部表可互相转换 三、临时表 建表 临时表横向对比​编辑 四、分区表 建表&#xff1a;关键字【PARTITIONED BY】 场景&#xff1a; 五、分桶表 …...

随手写的小程序2 一个nc能控制的程序

小程序源代码 下载: https://download.csdn.net/download/nn_84/88846445?spm1001.2014.3001.5501 请下载 Qt 5.12.12 server.pro : QT gui networkCONFIG c11 console CONFIG - app_bundle# You can make your code fail to compile if it uses deprecated APIs. # In o…...

Android中通过属性动画实现文字轮播效果

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 一、创建一个自定义ProvinceView类,具体代码如下 /*** Author: ly* Date: 2024/2/22* D…...

最长的回文串

开始想的简单了&#xff0c;确实没想到奇数字母删去一个后也能用 解法&#xff1a; 桶排序 #include<iostream> #include<vector> #include<algorithm> using namespace std; #define endl \n #define int long long signed main() {int t;cin >> t…...

2023 H1 中国边缘公有云服务市场 Top2,百度智能云加速推动分布式云智能化升级

近期&#xff0c;IDC 发布了《中国边缘云市场跟踪研究 2023 H1》。报告显示&#xff0c;2023 上半年&#xff0c;中国边缘公有云服务市场规模 24.3 亿元&#xff0c;同比增速达到 41.8%。 其中&#xff0c;百度智能云以 15.7% 的市场份额位列中国边缘公有云服务市场第二&#…...

Emlog博客网站快速搭建并结合内网穿透实现远程访问本地站点

文章目录 前言1. 网站搭建1.1 Emolog网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试总结 前言 博客作为使…...

力扣经典题目解析--旋转图像(字节二面)

题目 原题地址: . - 力扣&#xff08;LeetCode&#xff09; 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1…...

【ARMv8M Cortex-M33 系列 8.1 -- RT-Thread 堆内存 检查命令 free 实现及介绍】

文章目录 RT-Thread 堆内存 检查命令 free 实现及介绍rt_memory_info 函数验证 RT-Thread 堆内存 检查命令 free 实现及介绍 在RT-Thread系统中&#xff0c;通常可以通过rt_memory_info函数获取当前的堆内存使用信息&#xff0c;然后你可以包装这个函数来显示剩余的堆空间。rt…...

milvus Delete API流程源码分析

Delete API执行流程源码解析 milvus版本:v2.3.2 整体架构: Delete 的数据流向: 1.客户端sdk发出Delete API请求。 from pymilvus import (connections,Collection, )print("start connecting to Milvus") connections.connect("default", host"192…...

CentOS使用Docker搭建Halo网站并实现无公网ip远程访问

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…...

【JVM】垃圾回收算法

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;JVM ⛺️稳中求进&#xff0c;晒太阳 垃圾回收算法 Java是如何实现垃圾回收的呢&#xff1f;简单来说&#xff0c;垃圾回收就做两件事 找到内存中存活的对象释放不在存活对象的内存&…...

如何和将原始request的Header中的值传递给openfeign请求的Header? 以及又如何获取openfeign请求中Header中的值

如何和将原始request的Header中的值传递给openfeign请求的Header&#xff1f; 以及又如何获取openfeign请求中Header中的值 如何和将原始request的Header中的值传递给openfeign请求的Header参考 [https://www.jb51.net/article/282522.htm](https://www.jb51.net/article/28252…...

Flink 侧输出流(SideOutput)

&#x1f338;在平时大部分的 DataStream API 的算子的输出是单一输出&#xff0c;也就是某一种或者说某一类数据流&#xff0c;流向相同的地方。 &#x1f338;在处理不同的流中&#xff0c;除了 split 算子&#xff0c;可以将一条流分成多条流&#xff0c;这些流的数据类型也…...

C语言中关于#include的一些小知识

写代码的过程中&#xff0c;因为手误&#xff0c;重复包含了头文件 可以看到没有报错 如果是你自己编写的头文件&#xff0c;那么如果没加唯一包含标识的话&#xff0c;那么编译器会编译报错的。如果是系统自带的头文件&#xff0c;由于其每个头文件都加了特殊标识&#xff0c…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...