rk3568-OTG模式切换(二)

参考博客:rk3568-OTG模式切换_rk3568 打开usb共享网络功能-优快云博客

原来的设计有缺陷,没有保存效果,每次开机重新恢复

1.添加环境变量persist.sys.usb=1

diff --git a/device/rockchip/rk356x/rk3568_r/rk3568_r.mk b/device/rockchip/rk356x/rk3568_r/rk3568_r.mk
index 0fad1e23d8..4edb005f87 100644
--- a/device/rockchip/rk356x/rk3568_r/rk3568_r.mk
+++ b/device/rockchip/rk356x/rk3568_r/rk3568_r.mk
@@ -45,3 +45,4 @@ PRODUCT_PROPERTY_OVERRIDES += persist.wifi.sleep.delay.ms=0
 PRODUCT_PROPERTY_OVERRIDES += persist.bt.power.down=true
 PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.primary=DSI
 PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.extend=eDP,LVDS
+PRODUCT_PROPERTY_OVERRIDES += persist.sys.usb=1

可以进系统后通过getprop看到值

2.修改

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <CheckBoxPreference
        android:key="usb_mode"
		android:defaultValue="false"
        android:title="@string/usb_host_device_manager"/>
</PreferenceScreen>
diff --git a/packages/apps/Settings/res/xml/usb_host_device.xml b/packages/apps/Settings/res/xml/usb_host_device.xml
index 23e78005f9..11fbaddcd9 100755
--- a/packages/apps/Settings/res/xml/usb_host_device.xml
+++ b/packages/apps/Settings/res/xml/usb_host_device.xml
@@ -1,9 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
-    <ListPreference
-        android:entries="@array/usb_function_location"
-        android:entryValues="@array/usb_function_location_values"
+    <CheckBoxPreference
         android:key="usb_mode"
-        android:persistent="true"
+               android:defaultValue="false"
         android:title="@string/usb_host_device_manager"/>

3.修改

package com.android.settings;

import android.app.Dialog;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import androidx.preference.SwitchPreference;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import androidx.preference.Preference.OnPreferenceChangeListener;
import android.provider.Settings;
import android.content.res.Resources;
import android.os.SystemProperties;
import androidx.preference.CheckBoxPreference;
import java.io.FileNotFoundException;
import java.io.IOException;


import android.util.Log;

import com.android.internal.logging.nano.MetricsProto.MetricsEvent;

import java.io.File;
import java.io.FileOutputStream;

public class UsbHostDeviceSetting extends SettingsPreferenceFragment implements OnPreferenceChangeListener {
    /**
     * Called when the activity is first created.
     */
    private static final String KEY_USB_MODE_LOCATION = "usb_mode";
    private static final String UsbDeviceHostCtlPatch = "/sys/devices/platform/fe8a0000.usb2-phy/otg_mode";
   
    private static final String TAG = "UsbHostDeviceDebug";

    public boolean dbg = true;

    private int UsbHostState = 1;
    private int UsbDeviceState = 2;

    private CheckBoxPreference mUsbMode;

    private SharedPreferences mSharedPreference;
    private SharedPreferences.Editor mEdit;
    private SettingsApplication mScreenshot;

    private Context mContext;
    private Dialog dialog;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.usb_host_device);

        mContext = getActivity();

        mUsbMode = (CheckBoxPreference ) findPreference(KEY_USB_MODE_LOCATION);
        mUsbMode.setOnPreferenceChangeListener(this);
		
		init_sys_usb();
    }

	private void init_sys_usb() {
		if(SystemProperties.get("persist.sys.usb","1").equals("2")) {
			mUsbMode.setChecked(true) ;	 
			Log.d("longmin","1111\n");
			}
		else{
			mUsbMode.setChecked(false) ;
			Log.d("longmin","2222\n");
			}
	}


       private static void delayMs(int ms){
 
		exe_normal_cmd("sync");
					 try
			{
				Thread.sleep(ms);
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
 
 
      	}

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        return true;
    }
 
    @Override
    public boolean onPreferenceTreeClick(Preference preference) {
        // TODO Auto-generated method stub
             // TODO Auto-generated method stub
        if(preference==mUsbMode){
 
		 boolean show = mUsbMode.isChecked();
 
		 Log.d("liz","show====="+show);
		 if(!show) { // host
			SystemProperties.set("persist.sys.usb","1");	
			set_usb( UsbDeviceHostCtlPatch,"1");	
		 	}
		 else{
		 	//device
			SystemProperties.set("persist.sys.usb","2");	
			set_usb( UsbDeviceHostCtlPatch,"2");
		 	}
		 exe_normal_cmd("sync");
		 try
				{
					Thread.sleep(250);
				}
				catch (InterruptedException e)
				{
					e.printStackTrace();
				}
		}
        return super.onPreferenceTreeClick(preference);
    }


    public  void set_usb(String proc,String val){
									
				try {	
				FileOutputStream fops = new FileOutputStream(proc);   
				fops.write(val.getBytes()); 
				fops.flush();	
				fops.close();  
			  
				} catch (FileNotFoundException e) {  
					Log.d("err", "found error");  
				} catch (IOException e) {  
						Log.d("err", "IO error");  
			}  
				
			}
			
			
	private static  void exe_normal_cmd(String cmd){
 
			try {
					Runtime rt = Runtime.getRuntime();
					Process proc = rt.exec(cmd);
					   }
					catch (Exception e) { 
					
							   e.printStackTrace(); 
					}
			}

    @Override
    public int getMetricsCategory() {
        // TODO Auto-generated method stub
        return 5;
    }
}

4.修改/packages/apps/Settings/AndroidManifest.xml

index 479d4bb17f..9f0c939b58 100644
--- a/packages/apps/Settings/AndroidManifest.xml
+++ b/packages/apps/Settings/AndroidManifest.xml
@@ -3442,7 +3442,14 @@
             android:icon="@drawable/ic_settings_usb"
             android:parentActivityName="Settings">

-            <intent-filter android:priority="-2">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                               <action android:name="android.intent.action.BOOT_COMPLETED"/>
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.VOICE_LAUNCH" />
+                <category android:name="com.android.settings.SHORTCUT" />
+            </intent-filter>
+            <intent-filter android:priority="6">
                 <action android:name="com.android.settings.action.SETTINGS" />
             </intent-filter>

最后效果如图

=================================================================

由于重启不会切换模式,所以加入了一个开机广播

修改AndroidManifest.xml

index 479d4bb17f..9f0c939b58 100644
--- a/packages/apps/Settings/AndroidManifest.xml
+++ b/packages/apps/Settings/AndroidManifest.xml
d.settings.category"
@@ -3508,6 +3515,15 @@
             </intent-filter>/>
         </receiver>

+        <receiver
+            android:name="com.android.settings.display.BootReceiver"
+            android:enabled="true"
+            android:exported="true">
+            <intent-filter>
+                <action android:name="android.intent.action.BOOT_COMPLETED"/>
+            </intent-filter>/>
+        </receiver>
+

添加BootReceiver.java

/*
 * Copyright (C) 2024 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.display;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.SystemProperties;
import android.util.Log;
import android.os.Build;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

/**
 * RK3568 Android 11 开机广播接收器
 */


public class BootReceiver extends BroadcastReceiver {

    // 声明需要监听的广播 Action
    private static final String ACTION_BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";
	private static final String UsbDeviceHostCtlPatch = "/sys/devices/platform/fe8a0000.usb2-phy/otg_mode";

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent == null) return;

        String action = intent.getAction();
        // 校验是否是目标广播(适配 RK 平台可能发送的多种开机相关广播)
        if (ACTION_BOOT_COMPLETED.equals(action)) {
			//todo
			Log.i("BootReceiver","接收到开机广播");
			init_sys_usb();
        }
    }
	
	private void init_sys_usb() {
		if(SystemProperties.get("persist.sys.usb","1").equals("2")) {
			Log.d("longmin","2222111\n");
			set_usb( UsbDeviceHostCtlPatch,"2");
			}
		else{
			Log.d("longmin","1111222\n");
			set_usb( UsbDeviceHostCtlPatch,"1");
			}
	}

    public  void set_usb(String proc,String val){
								
			try {	
			FileOutputStream fops = new FileOutputStream(proc);   
			fops.write(val.getBytes()); 
			fops.flush();	
			fops.close();  
		  
			} catch (FileNotFoundException e) {  
				Log.d("err", "found error");  
			} catch (IOException e) {  
					Log.d("err", "IO error");  
		}  
			
	}
}

然后开机后可以看到logcat打印接收到开机广播

======================================================================

由于不喜欢那个控件,换了一个控件

commit f86986dac69c026c4fc2d48ea9fc6f29f942c519 (HEAD -> master)
Author: longmin <longmin@xxxxx.cn>
Date:   Mon Nov 24 15:15:44 2025 +0800

    update adb mode for SwitchPreference

diff --git a/packages/apps/Settings/res/values-zh-rCN/strings.xml b/packages/apps/Settings/res/values-zh-rCN/strings.xml
index ad9f061234..d3f6750857 100644
--- a/packages/apps/Settings/res/values-zh-rCN/strings.xml
+++ b/packages/apps/Settings/res/values-zh-rCN/strings.xml
@@ -4967,6 +4967,10 @@

 <!-- add by longmin for config usb host or device mode -->
     <string name="usb_host_device_manager">USB 模式</string>
+    <string name="usb_otg_mode_switch_summary">打开:Host模式;关闭:Device模式</string>
+ <!-- end, add by haha -->
+
+ </resources>
 <!-- end -->

     <!--screen shot-->
diff --git a/packages/apps/Settings/res/values/strings.xml b/packages/apps/Settings/res/values/strings.xml
index 954857f2be..1f23422fde 100644
--- a/packages/apps/Settings/res/values/strings.xml
+++ b/packages/apps/Settings/res/values/strings.xml
@@ -12244,6 +12244,7 @@
     <string name="later">s later capture</string>
 <!-- add by longmin for config usb host or device mode -->
     <string name="usb_host_device_manager">Usb Mode</string>
+    <string name="usb_otg_mode_switch_summary">Open:Host mode;Close:Device mode</string>
 <!-- end -->

     <!--hdmi settings-->
diff --git a/packages/apps/Settings/res/xml/usb_host_device.xml b/packages/apps/Settings/res/xml/usb_host_device.xml
index 11fbaddcd9..f99a05ab60 100755
--- a/packages/apps/Settings/res/xml/usb_host_device.xml
+++ b/packages/apps/Settings/res/xml/usb_host_device.xml
@@ -1,7 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
-    <CheckBoxPreference
+    <SwitchPreference
         android:key="usb_mode"
-               android:defaultValue="false"
+        android:defaultValue="false"
+        android:summary="@string/usb_otg_mode_switch_summary"
         android:title="@string/usb_host_device_manager"/>
 </PreferenceScreen>
diff --git a/packages/apps/Settings/src/com/android/settings/UsbHostDeviceSetting.java b/packages/apps/Settings/src/com/android/settings/UsbHostDeviceSetting.java
index 4a03c0abae..da992bf45e 100755
--- a/packages/apps/Settings/src/com/android/settings/UsbHostDeviceSetting.java
+++ b/packages/apps/Settings/src/com/android/settings/UsbHostDeviceSetting.java
@@ -38,7 +38,7 @@ public class UsbHostDeviceSetting extends SettingsPreferenceFragment implements
     private int UsbHostState = 1;
     private int UsbDeviceState = 2;

-    private CheckBoxPreference mUsbMode;
+    private SwitchPreference mUsbMode;

     private SharedPreferences mSharedPreference;
     private SharedPreferences.Editor mEdit;
@@ -54,7 +54,7 @@ public class UsbHostDeviceSetting extends SettingsPreferenceFragment implements

         mContext = getActivity();

-        mUsbMode = (CheckBoxPreference ) findPreference(KEY_USB_MODE_LOCATION);
+        mUsbMode = (SwitchPreference ) findPreference(KEY_USB_MODE_LOCATION);
         mUsbMode.setOnPreferenceChangeListener(this);

                init_sys_usb();

基于TROPOMI高光谱遥感仪器获取的大气成分观测资料,本研究聚焦于大气污染物一氧化氮(NO₂)的空间分布与浓度定量反演问题。NO₂作为影响空气质量的关键指标,其精确监测对环境保护与大气科学研究具有显著价值。当前,利用卫星遥感数据结合先进算法实现NO₂浓度的高精度反演已成为该领域的重要研究方向。 本研究构建了一套以深度学习为核心的技术框架,整合了来自TROPOMI仪器的光谱辐射信息、观测几何参数以及辅助气象数据,形成多维度特征数据集。该数据集充分融合了不同来源的观测信息,为深入解析大气中NO₂的时空变化规律提供了数据基础,有助于提升反演模型的准确性与环境预测的可靠性。 在模型架构方面,项目设计了一种多分支神经网络,用于分别处理光谱特征与气象特征等多模态数据。各分支通过独立学习提取代表性特征,并在深层网络中进行特征融合,从而综合利用不同数据的互补信息,显著提高了NO₂浓度反演的整体精度。这种多源信息融合策略有效增强了模型对复杂大气环境的表征能力。 研究过程涵盖了系统的数据处理流程。前期预处理包括辐射定标、噪声抑制及数据标准化等步骤,以保障输入特征的质量与一致性;后期处理则涉及模型输出的物理量转换与结果验证,确保反演结果符合实际大气浓度范围,提升数据的实用价值。 此外,本研究进一步对不同功能区域(如城市建成区、工业带、郊区及自然背景区)的NO₂浓度分布进行了对比分析,揭示了人类活动与污染物空间格局的关联性。相关结论可为区域环境规划、污染管控政策的制定提供科学依据,助力大气环境治理与公共健康保护。 综上所述,本研究通过融合TROPOMI高光谱数据与多模态特征深度学习技术,发展了一套高效、准确的大气NO₂浓度遥感反演方法,不仅提升了卫星大气监测的技术水平,也为环境管理与决策支持提供了重要的技术工具。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
在机器人技术领域,机器人操作系统(ROS)的演进为各类应用提供了关键支撑。计算机视觉与增强现实的结合,进一步拓展了机器人的感知与交互能力。OpenCV作为广泛使用的视觉处理库,集成了多种图像分析与模式识别算法。其中,Aruco标记系统作为一种基于维码的视觉标识,因其识别稳定、计算高效的特点,被广泛应用于空间定位、姿态估计及增强现实场景的虚实融合。 Aruco标记通过预定义的编码图案,可在复杂环境中实现快速检测与高精度位姿解算。这一特性使其在自主导航、三维重建、目标跟踪等任务中具有重要价值。例如,在移动机器人定位中,可通过布设标记点辅助实现厘米级的位置修正;在增强现实应用中,则能依据标记的空间姿态准确叠加虚拟信息。 针对ROS2框架,现已开发出集成OpenCV的Aruco标记检测与位姿估计工具包。该工具能够实时处理图像流,识别标记的独特编码,并解算其相对于相机坐标系的三维位置与旋转姿态。结果可通过ROS2的话题或服务接口发布,为其他功能模块提供实时视觉反馈。工具包兼容多种标准标记字典,用户可根据实际场景的复杂度与识别范围需求,灵活选择不同尺寸与编码数量的标记集合。 将Aruco检测模块嵌入ROS2系统,可充分利用其分布式通信机制与模块化架构。开发者能够便捷地将视觉定位数据与运动规划、控制决策等模块相融合,进而构建更为综合的机器人应用系统。例如,结合点云处理技术可实现动态环境的三维建模,或与机械臂控制器联动完成基于视觉引导的精准抓取操作。 该开源工具的推出,降低了在ROS2中部署视觉定位功能的技术门槛。通过提供稳定、可配置的标记识别与姿态解算方案,它不仅促进了机器人视觉应用的快速原型开发,也为后续在工业自动化、服务机器人、混合现实等领域的深入应用奠定了技术基础。随着感知算法与硬件性能的持续提升,此类融合视觉、增强现实与机器人中间件的工具包,将在智能化系统的构建中发挥日益重要的作用。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旋风旋风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值