昨天提到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 的。
我們明天見