精华内容
下载资源
问答
  • MCU USB主机

    千次阅读 2020-03-21 09:41:12
    MCU USB主机

    1 车机USB播放解码IC
    2006年,MCU+解码IC是主流的车机系统解决方案,解码IC是指CD/DVD/USB/SD的音乐和视频解码芯片,当时的ESS、Sunplus、MTK和Zoran是解码IC的四大巨头。

    2 Abbreviations
    ESS ES8380: Electronic Speech Systems
    USB BH reset:Bigger Hammer or Brad Hosler,表示warm reset;you may be confused why the USB 3.0 spec calls the same type of reset "warm reset" in some places and "BH reset" in other places. "BH" reset is supposed to stand for "Big Hammer" reset, but it also stands for "Brad Hosler". Brad died shortly after the USB 3.0 bus specification was started, and they decided to name the reset after him. The suggestion was made shortly before the spec was finalized, so the wording is a bit inconsistent

    展开全文
  • USB主机枚举USB设备步骤: 1.USB主机对USB设备进行复位,复位后USB设备用端点0来传输数据;USB主机向USB设备发送获取设备描述符指令,USB设备收到指令后,通过端点0将设备描述符信息返回给USB主机,且若端点0中包含...

    USB主机枚举USB设备步骤:
    1.USB主机对USB设备进行复位,复位后USB设备用端点0来传输数据;USB主机向USB设备发送获取设备描述符指令,USB设备收到指令后,通过端点0将设备描述符信息返回给USB主机,且若端点0中包含完整的18字节设备描述符信息,则将完整的设备描述符信息返回给USB主机;而若端点0中包含的设备描述符信息小于18字节,则将已包含的设备描述符信息返回给USB主机;其中,完整的设备描述符信息包括USB协议版本信息、厂家VID信息、数据包大小信息以及PID信息;

    2.USB主机对USB设备进行再复位,并分配一唯一地址给USB设备作为新地址;USB主机再次向USB设备发送获取设备描述符指令,USB设备收到指令后,若端点0中包含完整的18字节设备描述符信息,则通过新地址将完整的18字节设备描述符信息返回给USB主机;若端点0中包含的设备描述符信息小于18字节,则通过新地址将已包含的设备描述符信息返回给USB主机,并继续向USB设备发送获取设备描述符指令,直至将完整的18字节设备描述符信息均返回给USB主机;
    3.获取完设备描述符信息后,USB主机向USB设备发送获取配置描述符指令,USB设备收到指令后,通过新地址将配置描述符信息返回给USB主机;其中,配置描述符信息包括设备类型信息、总线供电方式信息、数据包大小信息、端点传输及接收数据的信息;
    4.获取完配置描述符信息后,USB主机向USB设备发送获取报告描述符指令,USB设备收到指令后,通过新地址将报告描述符返回给USB主机,获取的报告描述符的数据信息包括设备类型信息、报告ID信息、数据位数信息、数据长度信息、逻辑最大值信息以及逻辑最小值信息。
     

    展开全文
  • USB 主机概览

    2019-12-28 17:00:41
    当您的 Android 设备处于 USB 主机模式时,它会充当 USB 主机,为总线供电并枚举连接的 USB 设备。Android 3.1 及更高版本支持 USB 主机模式。 API 概览 在开始前,请务必了解您需要使用的类。下表介绍了...

    原文:https://developer.android.com/guide/topics/connectivity/usb/host

    USB 主机概览

    当您的 Android 设备处于 USB 主机模式时,它会充当 USB 主机,为总线供电并枚举连接的 USB 设备。Android 3.1 及更高版本支持 USB 主机模式。

    API 概览

    在开始前,请务必了解您需要使用的类。下表介绍了 android.hardware.usb 软件包中的 USB 主机 API。

    表 1. USB 主机 API

    说明
    UsbManager 您可以枚举连接的 USB 设备并与之通信。
    UsbDevice 表示连接的 USB 设备,并包含用于访问其标识信息、接口和端点的方法。
    UsbInterface 表示 USB 设备的接口,它定义设备的一组功能。设备可以具有一个或多个用于通信的接口。
    UsbEndpoint 表示接口端点,是此接口的通信通道。一个接口可以具有一个或多个端点,并且通常具有用于与设备进行双向通信的输入和输出端点。
    UsbDeviceConnection 表示与设备的连接,可在端点上传输数据。借助此类,您能够以同步或异步方式反复发送数据。
    UsbRequest 表示通过 UsbDeviceConnection 与设备通信的异步请求。
    UsbConstants 定义与 Linux 内核的 linux/usb/ch9.h 中的定义相对应的 USB 常量。

    在大多数情况下,您需要在与 USB 设备通信时使用所有这些类(只有在进行异步通信时才需要 UsbRequest)。一般来说,您需要获取 UsbManager 才能检索所需的 UsbDevice。当您有了设备后,需要找到相应的 UsbInterface 和该接口的 UsbEndpoint 以进行通信。获得正确的端点后,打开 UsbDeviceConnection 以与 USB 设备通信。

    Android 清单要求

    下表介绍了您需要向应用的清单文件中添加哪些内容,才能使用 USB 主机 API:

    • 由于并非所有 Android 设备都保证支持 USB 主机 API,因此请添加 <uses-feature> 元素来声明您的应用使用 android.hardware.usb.host 功能。
    • 将应用的最低 SDK 设置为 API 级别 12 或更高级别。USB 主机 API 在更早的 API 级别中不存在。
    • 如果您希望应用接收有关连接的 USB 设备的通知,请为主 Activity 中的 android.hardware.usb.action.USB_DEVICE_ATTACHED Intent 指定 <intent-filter> 和 <meta-data> 元素对。<meta-data> 元素指向外部 XML 资源文件,用于声明有关要检测的设备的标识信息。

      在 XML 资源文件中,为要过滤的 USB 设备声明 <usb-device> 元素。下表介绍了 <usb-device> 的属性。一般来说,如果您想过滤某个特定设备,请使用供应商 ID 和产品 ID;如果您想过滤一组 USB 设备(例如大容量存储设备或数码相机),请使用类、子类和协议。您可以指定所有这些属性,也可以不指定任何属性。如果不指定任何属性,则会与每个 USB 设备进行匹配,因此只在应用需要时才这样做:

      • vendor-id
      • product-id
      • class
      • subclass
      • protocol(设备或接口)

      将资源文件保存在 res/xml/ 目录中。资源文件名称(不含 .xml 扩展名)必须与您在 <meta-data> 元素中指定的名称相同。下面的示例展示了 XML 资源文件的格式。

    清单和资源文件示例

    以下示例展示了示例清单及其相应的资源文件:

        <manifest ...>
            <uses-feature android:name="android.hardware.usb.host" />
            <uses-sdk android:minSdkVersion="12" />
            ...
            <application>
                <activity ...>
                    ...
                    <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/device_filter" />
                </activity>
            </application>
        </manifest>
        

     

    在这种情况下,以下资源文件应保存在 res/xml/device_filter.xml 中,并指定应过滤具有指定属性的所有 USB 设备:

        <?xml version="1.0" encoding="utf-8"?>
    
        <resources>
            <usb-device vendor-id="1234" product-id="5678" class="255" subclass="66" protocol="1" />
        </resources>
        

     

    使用设备

    当用户将 USB 设备连接到 Android 设备时,Android 系统可以确定您的应用是否对连接的设备感兴趣。如果是,您可以根据需要设置与该设备的通信。为此,您的应用必须执行以下操作:

    1. 发现连接的 USB 设备,具体方法是使用 Intent 过滤器在用户连接 USB 设备时接收通知,或者枚举已连接的 USB 设备。
    2. 请求用户授予连接到 USB 设备的权限(如果尚未获得权限)。
    3. 通过在适当的接口端点读取和写入数据来与 USB 设备通信。

    发现设备

    您的应用可以通过使用 Intent 过滤器在用户连接 USB 设备时接收通知,或者枚举已连接的 USB 设备来发现设备。如果您希望应用自动检测所需的设备,那么使用 Intent 过滤器就非常有用。如果您想获取所有连接的设备的列表,或者您的应用没有 Intent 过滤器,那么枚举连接的 USB 设备就非常有用。

    使用 Intent 过滤器

    要让您的应用发现特定的 USB 设备,您可以指定一个 Intent 过滤器,用于过滤 android.hardware.usb.action.USB_DEVICE_ATTACHED Intent。除了此 Intent 过滤器外,您还需要指定一个资源文件来指定 USB 设备的属性,例如产品 ID 和供应商 ID。当用户连接与您的设备过滤器匹配的设备时,系统会向其显示一个对话框,询问他们是否要启动您的应用。如果用户接受,您的应用会自动获得访问设备的权限,直到设备断开连接。

    以下示例展示了如何声明 Intent 过滤器:

        <activity ...>
        ...
            <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/device_filter" />
        </activity>
        

     

    以下示例展示了如何声明指定您感兴趣的 USB 设备的相应资源文件:

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

     

    在您的 Activity 中,您可以通过以下方式从 Intent 获取代表所连接设备的 UsbDevice

    KOTLINJAVA

        UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
        

     

    枚举设备

    如果应用有兴趣在运行时检查当前连接的所有 USB 设备,则可以枚举总线上的设备。使用 getDeviceList() 方法获取连接的所有 USB 设备的哈希映射。如果要通过映射获取设备,哈希映射会由 USB 设备的名称进行键控。

    KOTLINJAVA

        UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
        ...
        HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
        UsbDevice device = deviceList.get("deviceName");
        

     

    如果需要,您还可以从哈希映射中获取迭代器,并逐个处理每个设备:

    KOTLINJAVA

        UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
        ...
        HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
        Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
        while(deviceIterator.hasNext()){
            UsbDevice device = deviceIterator.next();
            //your code
        }
        

     

    获取与设备通信的权限

    您的应用必须获得用户的许可,才能与 USB 设备通信。

    注意:如果您的应用使用 Intent 过滤器来发现已连接的 USB 设备,则它会在用户允许应用处理 Intent 时自动获得权限。否则,您必须在应用中明确请求权限,然后才能连接到设备。

    某些情况下可能需要明确请求权限,例如应用枚举已连接的 USB 设备,然后要与其中一个设备通信时。在尝试与设备通信之前,您必须先检查是否具有访问设备的权限。否则,如果用户拒绝授予访问设备的权限,您会收到运行时错误消息。

    要明确获取权限,请先创建广播接收器。此接收器监听在您调用 requestPermission() 时接收广播的 Intent。调用 requestPermission() 会向用户显示一个对话框,请求连接到设备的权限。以下示例代码展示了如何创建广播接收器:

    KOTLINJAVA

        private static final String ACTION_USB_PERMISSION =
            "com.android.example.USB_PERMISSION";
        private final BroadcastReceiver usbReceiver = new BroadcastReceiver() {
    
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                if (ACTION_USB_PERMISSION.equals(action)) {
                    synchronized (this) {
                        UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
    
                        if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                            if(device != null){
                              //call method to set up device communication
                           }
                        }
                        else {
                            Log.d(TAG, "permission denied for device " + device);
                        }
                    }
                }
            }
        };
        

     

    要注册广播接收器,请在您的 Activity 的 onCreate() 方法中添加以下命令:

    KOTLINJAVA

        UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
        private static final String ACTION_USB_PERMISSION =
            "com.android.example.USB_PERMISSION";
        ...
        permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
        IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
        registerReceiver(usbReceiver, filter);
        

     

    要显示对话框以向用户请求连接到设备的权限,请调用 requestPermission() 方法:

    KOTLINJAVA

        UsbDevice device;
        ...
        usbManager.requestPermission(device, permissionIntent);
        

     

    当用户在该对话框中作出回复时,您的广播接收器会收到包含 EXTRA_PERMISSION_GRANTED extra 的 Intent,即表示回答的布尔值。在连接到设备之前,请检查此 extra 的值是否为 true。

    与设备通信

    与 USB 设备的通信可以是同步的,也可以是异步的。在这两种情况下,您都应该创建一个新线程来执行所有数据传输,这样就不会锁定界面线程。要正确设置与设备的通信,您需要获取要与之通信的设备的相应 UsbInterface 和 UsbEndpoint,并使用 UsbDeviceConnection 在此端点发送请求。通常,您的代码应该执行以下操作:

    • 检查 UsbDevice 对象的属性(例如产品 ID、供应商 ID 或设备类别),判断您是否要与设备通信。
    • 在您确定要与设备通信时,找到您要用于通信的适当 UsbInterface 以及该接口的适当 UsbEndpoint。接口可以具有一个或多个端点,并且通常具有用于双向通信的输入和输出端点。
    • 找到正确的端点后,在该端点上打开 UsbDeviceConnection
    • 使用 bulkTransfer() 或 controlTransfer() 方法提供要在端点上传输的数据。您应该在另一个线程中执行此步骤,以防止主界面线程被锁定。如需详细了解如何在 Android 中使用线程,请参阅进程和线程

    以下代码段是执行同步数据传输的一种简单方式。您的代码应具有更多逻辑,以便正确地找到要进行通信的接口和端点,并且还应在与主界面线程不同的另一个线程中进行数据传输:

    KOTLINJAVA

        private Byte[] bytes;
        private static int TIMEOUT = 0;
        private boolean forceClaim = true;
    
        ...
    
        UsbInterface intf = device.getInterface(0);
        UsbEndpoint endpoint = intf.getEndpoint(0);
        UsbDeviceConnection connection = usbManager.openDevice(device);
        connection.claimInterface(intf, forceClaim);
        connection.bulkTransfer(endpoint, bytes, bytes.length, TIMEOUT); //do in another thread
        

     

    要异步发送数据,请使用 UsbRequest 类以 initialize 和 queue 异步请求,然后使用 requestWait() 等待结果。

    如需了解详情,请参阅 AdbTest 示例(展示了如何执行异步批量传输)和 MissileLauncher 示例(展示了如何异步监听中断端点)。

    终止与设备的通信

    当完成与设备的通信或者设备断开连接后,请调用 releaseInterface() 和 close() 来关闭 UsbInterface 和 UsbDeviceConnection。要监听断开连接事件,请创建如下所示的广播接收器:

    KOTLINJAVA

        BroadcastReceiver usbReceiver = new BroadcastReceiver() {
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
    
              if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
                    UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
                    if (device != null) {
                        // call your method that cleans up and closes communication with the device
                    }
                }
            }
        };
        

     

    在应用内(而不是清单中)创建广播接收器后,您的应用可以仅在运行时处理断开连接的事件。这样,断开连接事件只会发送到当前正在运行的应用,而不会广播到所有应用。

    展开全文
  • 嵌入式USB主机接口的设计 嵌入式USB主机接口的设计
  • USB主机控制器的设计

    2021-04-16 18:07:45
    讨论在SoPC(System on a Programmable Chip)系统中设计USB主机接口设备的一般方法,着重阐述主机控制器的驱动程序开发。利用Xilinx公司的EDK软件在ML405开发板上搭建一个基于PowerPC的片上系统,设计EZ-Host的USB...
  • USB 主机概述

    2018-07-16 01:17:44
    当您的Android设备处于USB主机模式时,它充当USB主机,为总线供电,并枚举连接的USB设备。 Android 3.1及更高版本支持USB主机模式。 API概述 开始之前,了解你需要使用的类非常重要,下列表格描述USB主机接口文档...

    当您的Android设备处于USB主机模式时,它充当USB主机,为总线供电,并枚举连接的USB设备。 Android 3.1及更高版本支持USB主机模式。

    API概述

    开始之前,了解你需要使用的类非常重要,下列表格描述USB主机接口文档,它在android.hardware.usb 包下。

    Table 1. USB Host APIs

    class Description
    UsbManager 枚举设备或和设备通信
    UsbDevice 表示连接的USB设备,包含访问其标识信息,接口和端点的方法。
    UsbInterface 表示USB设备的接口,它定义了设备的一组功能。 设备可以具有一个或多个要在其上进行通信的接口。
    UsbEndpoint 表示usb接口端点,它是接口的通信通道。 接口可以具有一个或多个端点,并且通常具有用于与设备进行双向通信的输入和输出端点。
    UsbDeviceConnection 表示与设备的连接,该设备在端点上传输数据。 此类允许您以异步方式或异步方式来回发送数据。
    UsbRequest 表示一个通过UsbDeviceConnection与设备通信的异步请求。
    UsbConstants 定义与Linux内核的linux / usb / ch9.h中的定义相对应的USB常量。
    在大多数情况下,您需要在与USB设备通信时使用所有这些类(仅在进行异步通信时才需要UsbRequest)。 通常,您获取UsbManager以检索所需的UsbDevice。 拥有设备时,需要找到相应的UsbInterface和该接口的UsbEndpoint进行通信。 获得正确的端点后,打开UsbDeviceConnection以与USB设备通信。

    usb设备通信流程

    当用户将USB设备连接到Android设备时,Android系统可以确定您的应用程序是否对连接的设备感兴趣。 如果是这样,您可以和目标设备建立通信,为此,您的应用程序必须:

    1、发现已连接的USB设备,可通过使用意图过滤器自动收到usb设备连接的通知,或者通过枚举当前所有已连接的usb设备。

    2、如果尚未获得,请询问用户是否允许连接USB设备。

    3、通过在适当的接口端点上读取和写入数据来与USB设备通信。

    发现设备

    应用程序可以通过使用意图过滤器来发现USB设备,以便在用户连接设备时收到通知,或通过枚举已连接的USB设备获取。 如果希望应用程序能够自动检测所需设备,则使用意图过滤器非常有用。 如果要获取所有已连接设备的列表,或者您的应用程序未针对意图进行过滤,则枚举连接的USB设备非常有用。

    • 使用意图过滤器

    可以简单快捷地发现特定的USB设备。

    通过指定一个响应USB设备插入的intent-filter,和声明具体USB设备特征的meta-data(指定一个xml文件,声明要检测的目标usb设备的相关属性,包括vendor-id、product-id、class、subclass、protocol (device or interface) )

    
    // AndroidManifest
    
    <manifest ...>
    
        //声明需要的硬件功能, Because not all Android-powered devices are guaranteed to support the USB host APIs,
    
        <uses-feature android:name="android.hardware.usb.host" />
    
        //设定最低API Level 12 (基本不需要了),The USB host APIs are not present on earlier API levels.
    
        <uses-sdk android:minSdkVersion="12" />
    
       ...
    
    <application>
    
    <activity ...>
    
        <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/device_filter" />
    
    </activity>
    
    </application>
    
    </manifest>
    
    
    // res/xml/device_filter.xml
    
    <?xml version="1.0" encoding="utf-8"?>
    
    <resources>
    
    //使用供应商编号、产品编号过来特定设备,使用类class, 子类subclass, 和协议protocol 过滤一组设备
    
    <usb-device vendor-id="1234" product-id="5678" class="255" subclass="66" protocol="1" />
    
    </resources>
    
    
    //In your activity, you can obtain the UsbDevice that represents the attached device from the intent like this:
    
    UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
    
    • 使用枚举

    在应用程序运行时检查当前连接的所有USB设备,它可以枚举总线上的设备。

    
    UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
    ...
    HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
    UsbDevice device = deviceList.get("deviceName");
    
    
    
    // If desired, you can also just obtain an iterator from the hash map and process each device one by one:
    
    UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
    ...
    HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
    Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
    while(deviceIterator.hasNext()){
        UsbDevice device = deviceIterator.next();
        //your code
    }
    
    获取通信权限

    如果您的应用程序使用意图过滤器来发现连接时的USB设备,则插入相关USB设备时,系统会出现一个弹框,在用户允许您的应用程序处理意图时,它会自动获得通信权限。 如果没有,您必须在与设备通信连接之前在应用程序中明确请求权限,否则会抛出运行时异常。

    
    //首先创建一个广播接收者,用于监听用户对通信权限的审批情况,UsbManager.EXTRA_PERMISSION_GRANTED字段值代表审批结果。当你调用requestPermission()后,系统会弹出一个权限审批对话框给用户。
    
    private static final String ACTION_USB_PERMISSION =
        "com.android.example.USB_PERMISSION";
    private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (ACTION_USB_PERMISSION.equals(action)) {
                synchronized (this) {
                    UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
                    if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                        if(device != null){
                             //进行通信相关的操作
    
                            UsbDeviceConnection connection = mUsbManager.openDevice(device);//打开设备
    
                             ....
                       }
                    }
                    else {
                        Log.d(TAG, "permission denied for device " + device);
                    }
                }
            }
        }
    };
    
    //在Activity的onCreate()中注册广播,
    
    private static final String ACTION_USB_PERMISSION =
        "com.android.example.USB_PERMISSION";
    
    IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
    registerReceiver(mUsbReceiver, filter);
    
    mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
    
    mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
    
    //在通信前,检查通信权限
    
    UsbDevice device;
    ...
    
    if (mUsbManager.hasPermission(device)) {
        //进行通信相关的操作
    
       UsbDeviceConnection connection = mUsbManager.openDevice(device);//打开设备
        ...
    
    } else {
        mUsbManager.requestPermission(device, mPermissionIntent);
    }
    
    与设备通信

    与USB设备的通信可以是同步的也可以是异步的。 在任何一种情况下,都应该创建一个新线程来执行所有数据传输,不去阻塞UI线程。 要正确建立与设备的通信,您需要获取要与之通信的设备的相应UsbInterface和UsbEndpoint,并使用UsbDeviceConnection在此端点上发送请求。 通常,您的代码应该:

    1、检查UsbDevice对象的属性,例如产品ID,供应商ID或设备类,以确定是否要与设备通信。

    2、如果您确定要与设备通信,请找到要用于与该接口的相应UsbEndpoint进行通信的相应UsbInterface。 接口可以有一个或多个端点,通常具有用于双向通信的输入和输出端点。

    3、找到正确的端点后,在该端点上打开UsbDeviceConnection。

    4、使用bulkTransfer()或controlTransfer()方法提交要在端点上传输的数据。 应该在另一个线程中执行此步骤以防止阻止主UI线程。

    以下代码段是以同步的方式执行数据传输的一种简单方法(如果要异步地发送数据,请使用UsbRequest类初始化并排队异步请求,然后使用requestWait()等待结果。)。 您的代码应该有更多的逻辑来正确地找到正确的接口和端点进行通信,并且还应该在与主UI线程不同的线程中进行任何数据传输:

    
    private Byte[] bytes;
    private static int TIMEOUT = 0;
    private boolean forceClaim = true;
    ...
    UsbInterface intf = device.getInterface(0);
    UsbEndpoint endpoint = intf.getEndpoint(0);
    UsbDeviceConnection connection = mUsbManager.openDevice(device);
    connection.claimInterface(intf, forceClaim);
    connection.bulkTransfer(endpoint, bytes, bytes.length, TIMEOUT); //do in another thread
    
    断开与设备的通信

    完成与设备的通信或设备已分离后,通过调用releaseInterface()和close()关闭UsbInterface和UsbDeviceConnection。 要收听分离的事件,请创建如下的广播接收器:

    
    BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
          if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
                UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
                if (device != null) {
                    // call your method that cleans up and closes communication with the device
                }
            }
        }
    };
    

    在应用程序中创建广播接收器而不是清单,允许您的应用程序仅在其运行时处理分离的事件。 这样,分离事件仅发送到当前正在运行的应用程序,而不是广播到所有应用程序。

    展开全文
  • 基于Linux下USB主机接口设计,在Linux系统下,基于嵌入式处理器扩展USB主机端口的工作原理,提出了USB主机接口的软硬件设计方案,该系统可增加在某些称重设备的USB主机端口,抛开了PC机,既可作为主机,也可作为外设...
  • 嵌入式USB主机的设计及其应用 嵌入式USB主机的设计及其应用
  • stm32f429作为USB主机读取U盘
  • 摘要:在简单介绍嵌入式title="USB">USB芯片SL811HS的基础上,给出了DSP的嵌入式USB主机接口软、硬件设计的思路和方法,用以实现DSP和USB设备间的数据传输。  众所周知,在一个USB拓扑结构中USB主机居于核心地位,...
  • USB主机编程方法

    2019-12-24 19:19:37
    USB主机中断 与USB设备类似,在USB主机中同时用到了多个中断,最重要的是ATTACH中断,当有新的USB设备接入主机时,该类型中断发生,主机检测到中断后就能进行设备枚举等操作。 USB主机驱动要素分析 将KL25作为USB...
  • 16.2 USB主机控制器驱动16.2.1 USB主机控制器驱动的整体结构USB主机控制器规格:OHCI(Open Host Controller Interface)、UHCI(Universal Host Controller Interface)、EHCI(Enhanced Host Controller ...
  • 在嵌入式系统中USB技术主要有两种应用方式,一种是USB总线设备的USB设备方式,一种是USB主控制器的嵌入式USB主机。USB 设备已经得到了广泛的使用,但是USB 主机实现其复杂性却没有很多应用实例。文章主要研究了USB...
  • USB主机协处理器将USB设备(如USB键盘)连接到开发板上,而无需USB主机端口或USB主机软件。 通过UART建立连接。 通过拖放固件文件,将特定于设备的固件编程到USB Host协处理器中。 USB主机协处理器处理USB主机协议...
  • 在简单介绍嵌入式USB芯片SL811HS的基础上,给出了DSP的嵌入式USB主机接口软、硬件设计的思路和方法,用以实现DSP和USB设备间的数据传输。
  • 本文介绍了一种基于TTL串口的USB主机系统,通过TTL串口(或并口)转接出USB接口,系统原理图如图1所示。嵌入式设备需要通过TTL串口,按照USB主机系统的串口通信协议与USB主机系统进行数据传输和通信,主机系统负责优盘...
  • uC / USB主机 μC/ USB Host是实时USB Host软件堆栈,专为配备USB Host或OTG控制器的嵌入式系统而设计。 它包括许多类驱动程序(MSC,HID,FTDI和CDC ACM)。 堆栈需要一个内核。 有关完整的文档,请访问
  • 论文以Compaq、Microsoft 等公开的 USB 主机控制器接口规范为基础,遵循USB 主机的协议规范,开发了独立于操作系统的USB 主机底层驱动程序,并在S3C2410 平台上得到了验证。下面详细论述主机控制器接口规范及 驱动程序...
  • USB 主机和配件概览

    2019-12-28 17:16:24
    USB 主机和配件概览 Android 通过 USB 配件和 USB 主机两种模式支持各种 USB 外围设备和 Android USB 配件(实现 Android 配件协议的硬件)。在 USB 配件模式下,外部 USB 硬件充当 USB 主机。配件示例可能包括...
  • 在android中演示USB主机访问 设置 您可以使用 U 盘运行演示。 找出 USB-Stick 的供应商和产品 ID,即:在 Linux 中,如果连接了 USB-Stick,/var/log/syslog 会提供此信息。 调整 app/src/main/res/xml/device_...
  • USB主机和USB设备

    2013-04-03 21:51:00
    USB主机在USB系统中处于中心地位,并且对USB及其连接的设备有着特殊的责任,主机控制着所有对USB的访问,一个外设只有主机允许才有权力访问总线,主机同时也监测着USB的结构。USB主机包括三层:设备驱动程序、USB...
  • USB主机协议OHCI

    2011-09-16 16:26:06
    USB主机协议OHCI加中文注解和标签,学习USB必备!
  • 1、STM32F USB主机 本文介绍STM32F USB OTG FS主机的中断过程及时序,关于USB通信的原理与报文不在本文的介绍,请参考其他文档。本文根据实际的使用USB主机详细的描述的USB主机中断发生的过程及顺序,是全网少有的...
  • 嵌入式系统中USB主机控制器的设计, 过去USB仅应用于个人计算机,而在嵌入式系统领域的巨大潜力还没有开发出来,USB在嵌入式系统中的应用包括KVM开关、数码相机、PDA、打印机、机顶盒以及移动电话等。本文将介绍在...
  • 我正在尝试学习Android USB主机/附件连接.我读Android设备可以行为usb主机或USB配件.因此我创建了两个项目,其中一个是usb主机项目,另一个是usb附件项目.我将这些项目安装到两个不同的Android设备上.其中一个有usb...
  • 本文主要介绍了Zigbee协议与USB主机无线音箱电路设计方法。
  • 论文以Compaq、Microsoft等公开的USB主机控制器接口规范为基础,遵循USB主机的协议规范,开发了独立于操作系统的USB主机底层驱动程序,并在S3C2410平台上得到了验证。下面详细论述主机控制器接口规范及驱动程序实现。
  • 基于OHCI的USB主机

    2013-06-23 22:17:42
    基于OHCI的USB主机 - 该文档是一名开发人员,开发基于OHCI的USB主机的历程。详细解释了开发过程!对于初始开发人员很有作用!!!...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,185
精华内容 2,474
关键字:

usb主机