USB HOST 与 OTG | 特性 / 原理 / 应用

注:本文为 “USB HOST / OTG ” 相关文章合辑。

略作重排,未整理去重。
如有内容异常,请看原文。
注意文章时效,规范变化。


USB HOST 与 USB OTG 的区别及工作原理

Mr Cui于 2018-08-01 14:06:06 发布

在 SmartQ 7 上,同时存在 USB HOST 与 USB OTG 两个接口,这两个接口有什么区别?

零、USB 背景知识

USB 是一种数据通信方式,也是一种数据总线,且是最复杂的总线之一。硬件上,它通过插头连接,一边是公头(plug),另一边是母头(receptacle)。例如,PC 上的插座是母头,USB 设备使用公头与 PC 连接。

目前 USB 硬件接口分为三种:普通 PC 上使用的 Type-A;诺基亚功能机时代使用的 Mini USB;以及目前 Android 手机使用的 Micro USB。

1. Host(主机)

USB 由 Host 端控制整个总线的数据传输。单个 USB 总线上只能有一个 Host。

2. OTG(On-The-Go)

OTG 是 USB 2.0 引入的一种模式,提出了主机协商协议(Host Negotiation Protocol),允许两个设备协商谁担任 Host 角色。

3. USB HOST/DEVICE/OTG 概念

USB HOST/DEVICE/OTG 概念

OTG 控制器既可以作为 Host,也可以作为 Device,控制器的角色通常由 USB ID 电平决定。完整的 USB 2.0 OTG 控制器硬件信号如下:

OTG 控制器硬件信号

USB_ID:输入信号,由 USB OTG 协议定义,用于识别 USB 口所接设备的默认角色(Host 或 Device)。USB_ID 默认上拉,处于 Device 状态;若要控制器进入 Host 状态,需外接 Mini-A 口或 Micro-A 口将 USB_ID 短接到地。

也可以通过软件强制切换,控制 /sys/bus/platform/drivers/usb20_otg/force_usb_mode,可设置为以下三种值:

  • 0:由硬件(USB ID)决定
  • 1:强制 Host 模式
  • 2:强制 Device 模式

4. HOST 模式与 OTG 模式区别

OTG 和 HOST 的区别在于:

  • HOST:支持的设备更多,但需要对应的从设备接口才能实现数据传输。
  • OTG:传输更方便,不需要其他机器上有从设备接口即可传输。

5. USB OTG 工作原理

OTG 补充规范对 USB 2.0 的最重要扩展是其更具节能性的电源管理和允许设备以主机和外设两种形式工作。OTG 有两种设备类型:

  • Dual-role device(两用 OTG 设备):完全符合 USB 2.0 规范,同时提供有限的主机能力和一个 Mini-AB 插座,支持主机协商协议(HNP)和事务请求协议(SRP)。当作为主机工作时,两用 OTG 设备可在总线上提供 8 mA 的电流,而以往标准主机需要提供 100~500 mA 的电流。
  • Peripheral-only OTG device(外设式 OTG 设备):是普通的 USB 外设,支持 SRP,有一个 Mini-B 插座(不能使用 Mini-AB)。

两个两用 OTG 设备连接在一起时,可交替以主机和从机的方式工作,这个特点兼容了现有 USB 规范的主机/外设结构模型。OTG 主机负责初始化数据通信的任务,例如:总线复位、获取 USB 各种描述符和配置设备。这些配置完成后,两个 OTG 设备便可以分别以主机和从机方式传输信息,两个设备主从角色交换的过程由主机协商协议(HNP)定义。

1.1 主机(A-device)和从机(B-device)的初始功能

设备的初始功能是通过定义连接器来实现的。OTG 定义了一个叫做 Mini-AB 的袖珍插孔,它可以同时接入 Mini-A 或 Mini-B 插头。Mini-AB 有一个 ID 引脚上拉至电源端,Mini-A 插头有一个与地连接的 ID(R < 10 Ω),Mini-B 插头有一个与地连接的开路 ID 引脚(R > 100 kΩ)。当两个 OTG 设备连接在一起时,Mini-A 插头边的 ID 引脚会注入一个“0”状态,Mini-B 插头边的 ID 引脚为“1”,ID 为 0 的 OTG 设备默认为主机(A-device),ID 为 1 的 OTG 设备默认为从机(B-device)。

1.2 会话请求协议(SRP,Session Request Protocol)

该协议允许 A-device(可以是电池供电)在总线未使用时通过切断 Vbus 来节省电源消耗,同时也为 B-device 启动总线活动提供了一种方法。任何一个 A-device(包括 PC 或便携式电脑)都可以响应 SRP;任何一个 B-device(包括一个标准 USB 外设)都可以启动 SRP;要求一个双重功能设备既能启动 SRP,又能响应 SRP。

1.3 主机协商协议(HNP,Host Negotiation Protocol)

HNP 是一种用来实现 A-device 和 B-device 主机/从机转换的协议(实际上是电缆的反转)。主/从机功能交换的结果表现在以下过程中:

  1. 利用上拉电阻发送信号给从机。
  2. A-device 可在 B-device 上设置“HNP Enable”特性。
  3. B-device 断开上拉。
  4. A-device 与上拉电阻相连,表明 A-device 从属于从机。
  5. A-device 给 Vbus 供电。
  6. B-device 检测 A-device 的上拉。
  7. 复位/列举/使用 A-device。
1.4 驱动程序

与 PC 主机不同,便携式设备没有便捷的方式和足够的空间装载新的驱动程序。因此,OTG 规范要求每个两用 OTG 设备有一个支持的外设式 OTG 目标设备的列表,列表中包括设备的类型和制造商等信息。

与 PC 机不同,OTG 两用设备的驱动程序栈由 USB 主机栈和 USB 设备栈构成,以满足两种工作方式的需要。OTG 驱动程序通过连接器的不同或者是否有 HNP 交换设备的工作方式来决定使用 USB 主机栈还是 USB 设备栈。

  • 当 OTG 两用设备以主机方式工作时,USB 主机栈工作。其中的主机控制器驱动程序负责 USB 主机栈与硬件端点的数据交换,USB 驱动程序枚举并保存设备的信息,目标外设主机类驱动程序支持目标设备列表里的设备。主机类驱动程序由芯片制造商提供,同时,OTG 提供通用的主机类驱动程序(可以修改以用于非通用设备)。
  • 当 OTG 两用设备以从机方式工作时,USB 设备栈工作。其中的设备控制器驱动程序负责 USB 设备栈与硬件端点的数据交换,USB 协议层负责处理 USB 协议规范,设备类驱动程序的功能取决于该两用设备的功能(如数码照相机、存储设备、打印机等)。

OTG 驱动程序负责处理两用 OTG 设备的工作方式转换,同时还可以返回其结果(如设备是否支持 HNP)并处理总线错误。应用层程序通过 OTG 驱动程序开始或者结束一个传输事务,通过 USB 主机栈或设备栈与硬件层交换数据。

1.5 数据流模型

OTG 主机和设备被划分为功能层、USB 设备层和 USB 接口层三个不同层次,如下图所示:

  • USB 接口层:为 OTG 主机和 OTG 设备提供物理连接,USB 系统软件使用主机控制器来管理主机与 USB 设备的数据传输。USB 系统软件相对于主机控制器而言,处理的是以客户角度观察的数据传输及客户与设备的交互。
  • USB 设备层:为 USB 主机系统软件提供一个可用的逻辑设备。主机通过与之功能匹配的客户软件实现其各种功能。
  • OTG 设备:与以往的 USB 设备一样有两种通道:数据流通道和消息通道。数据流通道没有定义好的结果,而消息通道则有固定的结构。但是,每个通道都有一定的带宽、传输类型、传输方向和缓冲区大小。自供电设备配置一个默认的控制通道,由它提供该设备的配置和状态等信息。

一问一答

  1. 什么是 USB OTG?

    • USB OTG 是 USB 2.0 的补充规范。
  2. USB OTG 针对 USB 2.0 的最重要扩展是什么?

    • 更具节能性的电源管理和允许设备以主机和外设两种形式工作。
  3. USB 2.0 中定义了三种类型:HOST(主机),Device(设备),HUB

    • OTG 新增两种设备:
      • Dual-role device(两用设备)
      • Peripheral-only OTG device(OTG 外设)
  4. USB 2.0 中定义了三种连接器对(插头和插座):Standard-A(主机),Standard-B(外设),Mini-B(较小的外设)

    • OTG 新增插头:Mini-A
    • OTG 新增插座:Mini-A 和 Mini-AB(同时支持 Mini-A 或 Mini-B 的插头)
    • 其中插头和插座内部的塑料颜色:
      • Mini-A 为白色
      • Mini-B 为黑色
      • Mini-AB 为灰色
  5. USB 2.0 中定义了两种电缆:Standard-A 至 Standard-B,Standard-A 至 Mini-B

    • OTG 增加的两种电缆:
      • Mini-A 至 Standard-B
      • Mini-A 至 Mini-B
  6. OTG 的 Dual-role device(两用设备)必须具备:

    • 有限的主机能力
    • 可作为全速的外设(可选的高速方式)
    • 可作为全速的主机(可选的低速或高速方式)
    • OTG 目标设备的列表及驱动程序
    • 支持 SRP,HNP
    • 一个 Mini-AB 插座
    • Vbus 上不小于 8 mA 的电流输出
    • 与用户通讯的方式
  7. Peripheral-only OTG device(OTG 外设):

    • 是普通的 USB 外设
    • 支持 SRP
    • 一个 Mini-B 插座(不能使用 Mini-AB)
  8. Android USB 如何实现既可以发现 accessory 设备,同时也可以发现 host 设备?

    • 做 USB 通信,首先要弄清楚哪边是 HOST,哪边是 SLAVE。
      • 如果 Android 手机作为 HOST,要获取 SLAVE,用 UsbDevice 表示 SLAVE。
      • 如果 Android 手机作为 SLAVE,要获取 HOST,用 UsbAccessory 表示 HOST。

USB OTG 原理

VirtuousLiu于 2019-08-14 14:00:08 发布

OTG 是 On-The-Go 的缩写,是 2001 年 12 月 18 日由 USB Implementers Forum 公布的技术,主要应用于各种不同的设备或移动设备之间的连接,进行数据交换。它改变了数码照相机、摄像机、打印机等设备之间多种不同制式连接器以及多达 7 种制式的存储卡间数据交换的不便。

实现原理

安卓手机端 OTG 常见为 Micro-B 接口与 Type-C 接口。OTG 接口构造与手机数据接口没有区别,只需一条 OTG 数据线,即可让手机具备读取 U 盘等 USB 外设的 OTG 功能。

OTG 接口示意图

  • 手机端接口是 Micro-B 接口,五线制。
  • 电脑端是 Type-A 接口,四线制。
ID 引脚接地 - 主模式

连接电脑端 USB Type-A 与手机端 Micro-B 头。4 条线分别为 2 条数据线(一般为绿色与白色,对应连接 D+ 与 D-)、1 条电源线(Vbus,一般为红线)以及 1 条地线(GND 接地,一般为黑色线)。

在 Micro-B 接头上,多了一个 ID 针,通过一条导线将 ID 针与地线连接,即成 OTG 数据线。手机等移动设备通过 OTG 数据线的这种接线方式,识别 U 盘等外设。此时的手机工作于主机(HOST)模式,具备了 OTG 功能,可读取 U 盘内容,连接键盘、鼠标进行操作。

ID 引脚悬空 - 从模式

Micro-B 数据线接头 ID 针悬空。当手机通过 Micro-B 数据线连接电脑、USB 充电器时,因 ID 针悬空,此时手机工作于外设(DEVICE)模式。


USB OTG 与 ID 信号

1. 背景:USB OTG 的引入

  • 标准 USB 2.0 规范定义了严格的主机(Host, 如 PC)和外设(Peripheral/Slave, 如 U 盘、相机)关系,不允许外设之间直接连接。
  • 为了实现便携式设备(如 PDA、数码相机、手机)之间无需 PC 即可直接通信,USB 协会发布了 USB On-The-Go (OTG) 协议,作为 USB 2.0 的补充规范。
  • OTG 允许设备具备双重角色:既可以作为主机(Host),也可以作为外设(Slave)。

2. 核心机制:ID 引脚

  • OTG 规范在标准的 USB 四线(Vbus, D+, D-, GND)基础上,增加了一个关键引脚:ID (Identification) 引脚
  • USB OTG 接口共有五条线:
    • Vbus: 电源线
    • D+: 数据线+
    • D-: 数据线-
    • GND: 地线
    • ID: 身份识别线

3. 通过 ID 引脚确定初始角色

  • ID 引脚的状态用于在连接时决定设备的初始角色(主机或外设):
    • ID 引脚接地 (Grounded):连接的设备被识别为 A 设备 (A-device),承担主机 (Host) 角色。这通常通过 Mini-A 插头实现,其内部将 ID 引脚连接到 GND。
    • ID 引脚悬空 (Floating):连接的设备被识别为 B 设备 (B-device),承担外设 (Slave) 角色。这通常通过 Mini-B 插头实现,其 ID 引脚保持悬空状态(设备内部通常会上拉)。
  • 简而言之:
    • 检测到 ID 信号为低电平(接地) -> 设备作为 Host
    • 检测到 ID 信号为高电平(悬空/上拉)-> 设备作为 Slave

4. 实现方式与适用范围

  • ID 信号仅对支持 USB OTG 功能的设备有意义,这类设备必须能够同时扮演主机和外设两种角色。
  • 实际的 USB 连接线(线缆部分)通常不包含单独的 ID 线。ID 引脚的状态是由接口(插头)内部的连接方式决定的:
    • 用于连接主机的插头(如 Mini-A 或 Micro-A)内部将 ID 引脚短接到 GND。
    • 用于连接外设的插头(如 Mini-B 或 Micro-B)内部让 ID 引脚保持悬空。
  • OTG 技术使得设备间直接数据传输成为可能,例如数码相机直接连接打印机打印照片,或手机之间互传文件。

总结:

USB OTG 解决了设备间直接通信的需求,其核心是通过增加一个 ID 引脚。通过检测 ID 引脚是接地还是悬空,支持 OTG 的设备可以自动确定其初始角色是主机 (A-device) 还是外设 (B-device)。这种状态通常由连接线插头内部的接线方式决定,而非线缆本身。


Android:Usb 通信之 USB Host

程序员Linc于 2016-02-25 17:27:55 发布

零 USB 背景知识

USB 是一种数据通信方式,也是一种数据总线,且是最复杂的总线之一。硬件上,它通过插头连接,一边是公头(plug),另一边是母头(receptacle)。例如,PC 上的插座是母头,USB 设备使用公头与 PC 连接。

目前 USB 硬件接口分为三种:普通 PC 上使用的 Type-A;诺基亚功能机时代使用的 Mini USB;以及目前 Android 手机使用的 Micro USB。

一、USB 主机与 OTG 模式

  • Host(主机):USB 由 Host 端控制整个总线的数据传输。单个 USB 总线上只能有一个 Host。
  • OTG(On-The-Go):这是 USB 2.0 引入的一种模式,提出了主机协商协议(Host Negotiation Protocol),允许两个设备协商谁担任 Host 角色。

二、Android 中的 USB

Android 对 USB 的支持始于 3.1 版本,主要用于增强 Android 平板的外设扩展能力。在工业应用中,Android 工业板通常会提供多个 USB 接口和串口,用于连接外设。

1. Android USB 开发相关类

android.hardware.usb 包提供了 USB 开发的相关类,包括:

  • UsbManager:用于获取 USB 状态并与连接的 USB 设备通信。
  • UsbDevice:USB 设备的抽象,包含一个或多个 UsbInterface,每个 UsbInterface 包含多个 UsbEndpoint。Host 通过打开 UsbDeviceConnection,在端点(endpoint)上发送和接收数据。
  • UsbInterface:定义了设备的功能集,一个 UsbDevice 包含多个 UsbInterface,每个 Interface 是独立的。
  • UsbEndpoint:Interface 的通信通道。
  • UsbDeviceConnection:Host 与 Device 建立的连接,并在 Endpoint 上传输数据。
  • UsbRequest:USB 请求包,用于在 UsbDeviceConnection 上异步传输数据。
  • UsbConstants:USB 常量的定义,对应 Linux 的 usb/ch9.h 文件。

2. USB 插入事件

USB 设备的插入和拔出会以系统广播的形式发送,只需注册相应的广播即可。

@Override
protected void onResume() {
    super.onResume();
    IntentFilter usbFilter = new IntentFilter();
    usbFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
    usbFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
    registerReceiver(mUsbReceiver, usbFilter);
}

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(mUsbReceiver);
}

private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        tvInfo.append("BroadcastReceiver in\n");

        if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
            tvInfo.append("ACTION_USB_DEVICE_ATTACHED\n");
        } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
            tvInfo.append("ACTION_USB_DEVICE_DETACHED\n");
        }
    }
};

3. USB 插入时启动程序

某些应用场景需要在 USB 插入后启动特定程序。可以通过在 Manifest 文件中为某个 Activity 添加 USB 插入的 Action 来实现。

<intent-filter>
    <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"/>
</intent-filter>
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
           android:resource="@xml/usbfilter" />

usbfilter 文件中添加厂商 ID 和产品 ID 的过滤:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <usb-device vendor-id="1234" product-id="5678" />
</resources>

当此型号设备通过 USB 连接到系统时,对应的 Activity 将会启动。

4. UsbManager 的初始化

mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);

5. 列出 USB 设备

HashMap<String, UsbDevice> deviceHashMap = mUsbManager.getDeviceList();
Iterator<UsbDevice> iterator = deviceHashMap.values().iterator();
while (iterator.hasNext()) {
    UsbDevice device = iterator.next();
    tvInfo.append("\ndevice name: " + device.getDeviceName() + "\ndevice product name: "
                  + device.getProductName() + "\nvendor id: " + device.getVendorId() +
                  "\ndevice serial: " + device.getSerialNumber());
}

6. USB 使用权限

安卓系统对 USB 接口的使用需要用户授予相应权限。首先确认设备是否已获得权限,若未获得,则需主动申请:

if (device.getProductId() == 1234 && device.getVendorId() == 5678) {
    if (mUsbManager.hasPermission(device)) {
        // do your work
    } else {
        mUsbManager.requestPermission(device, mPermissionIntent);
    }
}

通过广播接收器获取权限授予情况:

public static final String ACTION_DEVICE_PERMISSION = "com.linc.USB_PERMISSION";

mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_DEVICE_PERMISSION), 0);
IntentFilter permissionFilter = new IntentFilter(ACTION_DEVICE_PERMISSION);
registerReceiver(mUsbReceiver, permissionFilter);

private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        tvInfo.append("BroadcastReceiver in\n");
        if (ACTION_DEVICE_PERMISSION.equals(action)) {
            synchronized (this) {
                UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
                if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                    if (device != null) {
                        tvInfo.append("usb EXTRA_PERMISSION_GRANTED");
                    }
                } else {
                    tvInfo.append("usb EXTRA_PERMISSION_GRANTED null!!!");
                }
            }
        }
    }
};

7. 通信

获得权限后,即可进行通信。需要使用 UsbInterfaceUsbEndpoint(一进一出两个 Endpoint,实现双向通信)以及 UsbDeviceConnection。注意通信过程不能在 UI 线程中进行。

初始化通信:

private void initCommunication(UsbDevice device) {
    tvInfo.append("initCommunication in\n");
    if (1234 == device.getVendorId() && 5678 == device.getProductId()) {
        tvInfo.append("initCommunication in right device\n");
        int interfaceCount = device.getInterfaceCount();
        for (int interfaceIndex = 0; interfaceIndex < interfaceCount; interfaceIndex++) {
            UsbInterface usbInterface = device.getInterface(interfaceIndex);
            if ((UsbConstants.USB_CLASS_CDC_DATA != usbInterface.getInterfaceClass())
                    && (UsbConstants.USB_CLASS_COMM != usbInterface.getInterfaceClass())) {
                continue;
            }

            for (int i = 0; i < usbInterface.getEndpointCount(); i++) {
                UsbEndpoint ep = usbInterface.getEndpoint(i);
                if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
                    if (ep.getDirection() == UsbConstants.USB_DIR_OUT) {
                        mUsbEndpointIn = ep;
                    } else {
                        mUsbEndpointOut = ep;
                    }
                }
            }

            if ((null == mUsbEndpointIn) || (null == mUsbEndpointOut)) {
                tvInfo.append("endpoint is null\n");
                mUsbEndpointIn = null;
                mUsbEndpointOut = null;
                mUsbInterface = null;
            } else {
                tvInfo.append("\nendpoint out: " + mUsbEndpointOut + ",endpoint in: " +
                              mUsbEndpointIn.getAddress() + "\n");
                mUsbInterface = usbInterface;
                mUsbDeviceConnection = mUsbManager.openDevice(device);
                break;
            }
        }
    }
}

发送数据:

result = mUsbDeviceConnection.bulkTransfer(mUsbEndpointOut, mData, (int) buffSize, 1500);
// 需要在另一个线程中进行

8. 其他

如果没有 USB 设备,调试程序会比较困难。可以使用 AdbTest 程序通过 OTG 线连接两个手机或平板进行测试。有 USB 设备的开发者需要根据设备的通信协议规则进行编码,涉及字节与其他类型转换以及十六进制问题。


Android开启OTG功能/USB Host API功能

PC技术小能手 于 2021-09-17 16:50:16 发布

Android USB 模式简介

设备模式

当计算机或其他USB主机需要连接安卓设备时,此时安卓设备是作为“USB设备”角色的,在计算机上显示为 USB 外设。现在的安卓设备已经被赋予了愈加丰富的功能,如MTP相机模式、文件传输模式(类似于U盘)、RNDIS网卡模式等。当使用普通手机数据线连接安卓手机和电脑就可以使用这些功能。

主机模式

Android 设备充当USB主机,安卓此时充当类似于计算机PC的角色,可以连接键盘、鼠标、U盘以及嵌入式应用USB转串口、转I2C等设备。注意,此时不能再使用普通数据线,而应该使用OTG(On-The-Go)转接线。原理是Android设备通过USB接口中的ID信号线状态决定其接口是工作在主机还是设备模式。如下为OTG转接头:

配件模式

设备模式与配件模式之间的区别在于,在配件模式下,除了 adb 之外,主机还可以看到其他 USB 功能。Android 设备从设备模式开始运行,然后通过重新协商过程转换到配件模式。除了提供AOA功能外,还额外提供了音频功能。如:安卓Host AOA接口转换芯片CH9343。

Android主机模式的开启

如上文主机模式的介绍,开启Android OTG主机功能,务必使用OTG转换线,确认是否成功可以通过连接的外设是否可以从Android设备USB口是否有电来确认,若仍没有电,其一可以查看设备厂商规格书,其二可以点击系统的“设置”,查看有无主动开启OTG功能的菜单项。

若如上主机功能可以顺利开启,那么我们的安卓设备就可以连接键盘、鼠标、U盘这些常用外设了。除此类设备之外,安卓系统还提供了一套USB Host API可以支持直接通过应用程序和USB设备通讯,而无需预置设备的USB驱动。该功能极大的提高了安卓设备使用USB产品的灵活性,用户端仅安装APK安卓软件即可。如客户使用安卓连接USB转串口设备CH340、USB转多串口设备CH342或者用户使用USB MCU开发的自定义厂商类设备、HID设备等使用场景。

当然因为该特性并非所有安卓厂商都会强制支持和开放,所以我们需要通过以下方式来确认或者进行必要的配置来开启该功能。

Android USB Host API功能的确认和开启

步骤一:确定 Android 设备是否支持 USB Host 功能,具体可以通过以下步骤进行确认:

1. 查看手机或平板设备参数,或者直接联系厂家咨询;

2. 使用 UsbHostDiagnostics.APK 安卓应用软件直接进行检测,汉化版软件名称为:USB 主机诊断;

**Note:**若步骤1提示支持,则无需进行如下步骤。

步骤二:确认系统是否包含 USB Host API 相关的库文件,习惯也称驱动文件。存放路径为:/system/lib。

通过手机助手工具或者直接使用“adb shell”连接手机,进入该目录进行查看,以我的手机为例,通过 adb 查看结果如下图所示:

如果没有该文件,可以咨询厂家或者拷贝相同处理器的安卓系统下的该文件至此目录下。

步骤三:确认 Android 系统是否已经开放了 USB Host 权限,这一步也是最重要的一步。

由于需要修改系统文件,所以要保证 Android 设备已经具有 Root 权限,否则会遇到各种未知的问题。Root 之后,可以通过手机助手或者“ES文件浏览器”等软件等操作系统文件。

进入目录“/system/etc/permissons”,查看该目录下,是否有文件“android.hardware.usb.host.xml”,如果没有,则需要自己创建一个或者直接从其他系统中拷贝过来。之后打开该文件,添加如下内容:

<permissons>
    <feature name="android.hardware.usb.host"/>
</permissons>

在该文件下查找是否存在名称为“handheld_core_hardware.xml”或者“tablet_core_hardware.xml”的文件。同理,未找到需要新建或者拷贝过来。打开文件,在 section 中添加如下内容:

<feature name="android.hardware.usb.host">

添加完成后文件内容如下所示:


步骤四:非常重要,就是重启 Android 设备

注:查看安卓系统的 CPU 信息,可以进入“adb shell”之后,通过 “cat /proc/cpuinfo” 查看。


via:

内容概要:本文《2025年全球AI Coding市场洞察研究报告》由亿欧智库发布,深入分析了AI编程工具的市场现状和发展趋势。报告指出,AI编程工具在2024年进入爆发式增长阶段,成为软件开发领域的重要趋势。AI编程工具不仅简化了代码生成、调试到项目构建等环节,还推动编程方式从人工编码向“人机协同”模式转变。报告详细评估了主流AI编程工具的表现,探讨了其商业模式、市场潜力及未来发展方向。特别提到AI Agent技术的发展,使得AI编程工具从辅助型向自主型跃迁,提升了任务执行的智能化和全面性。报告还分析了AI编程工具在不同行业和用户群体中的应用,强调了其在提高开发效率、减少重复工作和错误修复方面的显著效果。最后,报告预测2025年AI编程工具将在精准化和垂直化上进一步深化,推动软件开发行业进入“人机共融”的新阶段。 适合人群:具备一定编程基础,尤其是对AI编程工具有兴趣的研发人员、企业开发团队及非技术人员。 使用场景及目标:①了解AI编程工具的市场现状和发展趋势;②评估主流AI编程工具的性能和应用场景;③探索AI编程工具在不同行业中的具体应用,如互联网、金融、游戏等;④掌握AI编程工具的商业模式和盈利空间,为企业决策提供参考。 其他说明:报告基于亿欧智库的专业研究和市场调研,提供了详尽的数据支持和前瞻性洞察。报告不仅适用于技术从业者,也适合企业管理者和政策制定者,帮助他们在技术和商业决策中更好地理解AI编程工具的价值和潜力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值