天天看點

Android設定USB預設OTG模式

目錄

  • 問題現象
  • 解決方法
    • 1、查找SDK中系統預設配置檔案
    • 2、查找包含關鍵字的檔案
    • 3、修改

問題現象

RK3399Pro闆子USB接口預設為

Host

模式,在開發調試時需要用到ADB,即

Peripheral

模式。在修改前,系統預設配置如下:

Android設定USB預設OTG模式

解決方法

1、查找SDK中系統預設配置檔案

通常Android系統的預設配置檔案在

U:\Code\RK3399PRO_HDMI_ANDROID8\frameworks\base\packages\SettingsProvider\res\values\defaults.xml

檔案内,裡面包含了WIFI,BT等的預設開關配置。但此檔案下并沒有我們所需要的

Connect to PC

關鍵字。

2、查找包含關鍵字的檔案

U:\Code\RK3399PRO_HDMI_ANDROID8\packages\apps\Settings\src\com\android\settings\connecteddevice

下包含了

Connect to PC

的源碼檔案,在其中的

ConnectToPcPreferenceController.java

檔案内有如下代碼:

public class ConnectToPcPreferenceController extends AbstractPreferenceController implements
        PreferenceControllerMixin, Preference.OnPreferenceChangeListener {
    private static final String TAG = "ConnectToPcPreferenceController";
    private final String mConnectToPcKey;

    private static final String SYS_FILE = "/sys/devices/platform/usb0/dwc3_mode";
    //private static final String SYS_FILE = "/sys/kernel/debug/usb0/rk_usb_force_mode";
    private File mFile = null;
    private String mMode = null;

    private static final String OTG_MODE = "0";
    private static final String HOST_MODE = new String("1");
    private static final String SLAVE_MODE = new String("2");

    private static final String OTG_MODE_STR = "otg";
    private static final String HOST_MODE_STR = "host";
    private static final String SLAVE_MODE_STR = "peripheral";

    public static final String PERSIST_PRO = "persist.usb.mode";

    private Handler mHandler;
    private SwitchPreference mConnectToPc;
    
    public ConnectToPcPreferenceController(Context context, String key) {
        super(context);
        mConnectToPcKey = key;
        mFile =new File(SYS_FILE);
        mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                 super.handleMessage(msg);
 
                 if (msg.what == sysFileOperation.SWITCH_FINISH) {
                     String mode = (String) msg.obj;
 
                     if(HOST_MODE.equals(mode)) {
                         mConnectToPc.setChecked(false);
                     } else if(SLAVE_MODE.equals(mode)) {
                         mConnectToPc.setChecked(true);
                     }
                     SystemProperties.set(PERSIST_PRO, mode);
                 } else {
                     Log.e(TAG, "unexpect msg:"+ msg.what);
                 }
                 mConnectToPc.setEnabled(true);
             }
        };
    }
    //剩下的代碼省略
}
           

從此處代碼可知,配置檔案是從

/sys/devices/platform/usb0/dwc3_mode

檔案中讀取,繼續查找該檔案在哪裡生成

最終在

U:\Code\RK3399PRO_HDMI_ANDROID8\vendor\firefly\usb_mode_switch

檔案夾下發現了一個名為

usb_mode_switch.sh

的腳本,其内容如下:

FILE_USB_MODE="/sys/devices/platform/usb0/dwc3_mode"
MODE=$(getprop persist.usb.mode)

if [ -z "$MODE" ];then
    MODE="host"
fi

if [ -e "$FILE_USB_MODE" ];then
    echo  "$MODE" > "$FILE_USB_MODE"
fi 
           

3、修改

哦,從上面腳本可以看出,USB的預設配置由此處而來,是以隻需根據那個

ConnectToPcPreferenceController.java

,修改為:

MODE="peripheral"
           

MODE="otg"
           

即可實作連接配接電腦後識别為

Peripheral

裝置

最終結果如下圖所示:

Android設定USB預設OTG模式
Android設定USB預設OTG模式

注:因闆子電路原因即使設定為OTG模式,也無法在

Host

Peripheral

間切換,因為電路中少了USB-ID管腳,使用的為USB-A接口

Android設定USB預設OTG模式