iT邦幫忙

DAY 25
0

x86 android 設備與外部硬體溝通研究系列 第 25

x86 android 設備與外部硬體溝通研究 - USB Driver selector (25/30)

  • 分享至 

  • xImage
  •  

昨天提到USB 的 interface 跟 endpoint 下面幾張圖,讓我們看看實際上 USB host 端偵測到的 USB 裝置的屬性描述是長怎麼樣的?

下面這是一條 USB - Serial Port 轉接線,我們可以看到他在 Vendor ID 那欄可以明確顯示 IC供應商的廠牌, Product ID 可以辨識出產品的型號,這些訊息間接的暗示我們這個 APP 可以看懂這個裝置,並能控制他。

下面這張圖,是 Arduino Device 的 USB 驅動程式描述,我們可以看到他僅能顯示 VIP 跟 PID ,無法辨識這個裝置的功能。僅顯示 communication and cdc control ...

事實上我們也確實無法在這個 app 上連接arduino .

回到 android serial port driver 上面,我們來看看他是如何篩選裝置及驅動程式的:

    public UsbSerialDriver probeDevice(final UsbDevice usbDevice) {
        final int vendorId = usbDevice.getVendorId(); // 取得 VID
        final int productId = usbDevice.getProductId(); // 取得 PID

        final Class<? extends UsbSerialDriver> driverClass =
                mProbeTable.findDriver(vendorId, productId); //丟到已經建立好的 ProbeTable 中搜尋對應 VID-PID 的裝置
        if (driverClass != null) {
            final UsbSerialDriver driver;
            try {
                final Constructor<? extends UsbSerialDriver> ctor =
                        driverClass.getConstructor(UsbDevice.class);
                driver = ctor.newInstance(usbDevice); //產生新的 Instance 並送出指定的 throw 訊息 & 執行
            } catch (NoSuchMethodException e) {
                throw new RuntimeException(e);
            } catch (IllegalArgumentException e) {
                throw new RuntimeException(e);
            } catch (InstantiationException e) {
                throw new RuntimeException(e);
            } catch (IllegalAccessException e) {
                throw new RuntimeException(e);
            } catch (InvocationTargetException e) {
                throw new RuntimeException(e);
            }
            return driver;
        }
        return null;
    }

從上述的 code 我們可以簡單理解到 一個USB device driver 是如何搜尋裝置,並試著啟動USB device 的。

我們明天見


上一篇
x86 android 設備與外部硬體溝通研究 - Arduino Serial Port - endpoint (24/30)
下一篇
x86 android 設備與外部硬體溝通研究 - (26/30)
系列文
x86 android 設備與外部硬體溝通研究30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言