从usb 实际应用分析源码之usb遍历

1.HashMap<String, UsbDevice> deviceList = this.mUsbManager .getDeviceList(); 从中得到系统已经为你遍历好的usb设备,

IUsbManager 真正调用的是UsbService ,直接去看UsbService.

2.看注释 usb 查找,添加,删除是调用HostManager 类方法的.usb 设备 状态监听是调用UsbDeviceManager类方法.要想使用UsbHostManager必须有PackageManager.FEATURE_USB_HOST功能

3.在看看UsbService中的几个关键方法:

 public void systemReady() {
        if (mDeviceManager != null) {
            mDeviceManager.systemReady();
        }
        if (mHostManager != null) {
            mHostManager.systemReady(); //启动 usb 查找 
        }
    }

    /* Returns a list of all currently attached USB devices (host mdoe) */
    @Override
    public void getDeviceList(Bundle devices) {
        if (mHostManager != null) {
            mHostManager.getDeviceList(devices); //查找到的usb 设备都会被存在HostManager中 所以HostManager可以对usb 删除和添加操作
        }
    }

    /* Opens the specified USB device (host mode) */
    @Override
    public ParcelFileDescriptor openDevice(String deviceName) {
        if (mHostManager != null) {
            return mHostManager.openDevice(deviceName); //打开u口
        } else {
            return null;
        }
    }

4.这是重点已经指向HostManager 首先分析systemReady(找不到usbService systemReady 什么时候调用的,可能Serivce 管理类调用的)有两个关键的属性 mDevices :这个是用来存放已经遍历和初始化好的Device 类实例,getDeviceList方法就是直接返回这个属性的.mHostBlacklist 黑名单,如果查好的设备名在黑名单有将不会被mDevices集合中

public void systemReady() {
        synchronized (mLock) {
            // Create a thread to call into native code to wait for USB host events.
            // This thread will call us back on usbDeviceAdded and usbDeviceRemoved.
            //这里已经说的很清楚了,会调用本地方法去接收u口 事件(插拔事件) ,找到并成功初始化u口信息就调用usbDeviceAdded ,usb拔除就会调用usbDeviceRemoved 进行移除
            Runnable runnable = new Runnable() {
                public void run() {
                    monitorUsbHostBus(); //本地方法
                }
            };
            new Thread(null, runnable, "UsbService host thread").start();
        }
    }

5.本地方法在com_android_server_UsbHostManager.cpp 里面:

static void android_server_UsbHostManager_monitorUsbHostBus(JNIEnv *env, jobject thiz)
{
    struct usb_host_context* context = usb_host_init();//初始化host 上下文
    if (!context) {
        ALOGE("usb_host_init failed");
        return;
    }
    // this will never return so it is safe to pass thiz directly
    //开始轮训查找usb,usb_device_added 是指向HostManager usbDeviceAdded方法 指针,usb_device_removed是指向HostManager usbDeviceRemoved方法 指针
    usb_host_run(context, usb_device_added, usb_device_removed, NULL, (void *)thiz);
}
在usbHost.c usb_host_run 方法:
    void usb_host_run(struct usb_host_context *context,
                  usb_device_added_cb added_cb,
                  usb_device_removed_cb removed_cb,
                  usb_discovery_done_cb discovery_done_cb,
                  void *client_data)
{
    int done;

    done = usb_host_load(context, added_cb, removed_cb, discovery_done_cb, client_data);

    while (!done) {

        done = usb_host_read_event(context);//先查下有没有/dev 再查下有没有/dev/bus 再查下有没有/dev/bus/usb/
接着循环/dev/bus/usb/00x 再到/dev/bus/usb/00x/00x;层层遍历下来. 如果不发生什么错误就是死循环
    }
} /* usb_host_run() */

6.讲一个能应用中的问题:打印机和android 设备同时上电,用测试工具连接发现不能用报 当前通信节点为零个.原因是usb没有正确的初始化.解决方法1.驱动入手,每当检测到一个usb设备重新初始化前面的设备(客户已经测试过能用),2.换个u口插试一试(两个客户是这样测试的)3.如果直接删除你所用的usb设备路径会不会好.(没测过).

ps:顺着方法看下来就是这样,不对望指教

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值