0%

Android使用USB

1. USB2.0标准

USB2.0标准的子类。
USB2.0

2. USB 驱动

2.1 Linux 分为内核驱动,libusb无驱驱动。

内核驱动里面包含USB标准的一部分驱动,如HID。
无驱驱动意思是直接读取数据,处理数据,发送数据。
第三方驱动也是以模块的方式安装到模块(安装到内核)。

2.2 Windows 有内核驱动,第三方驱动。

第三方驱动需要安装驱动软件,应该是安装到内核。
Windows的无驱驱动,跟Linux的概念不太一样,它的驱动是Windows操作系统自带的,如键盘,无驱摄像头。

3. USB 转 COM

3.1 CDC - Communication Device Class

在USB标准协议中,有一类专用于通讯设备(主要包括电信通信设备和中速网络通信设备)的CDC协议,USB的CDC类是 USB通信设备类(Communication Device Class Specification )的简称。可以通过 USB CDC 协议来将 USB 接口虚拟为其他通讯接口如串口,以太网接口,ISDN 接口等等。根据 CDC 协议所针对通信设备的不同,CDC 协议又被分成以下不同的模型:

  • USB 传统电话业务(POTS )模型,
  • USB ISDN 模型
  • USB网络模型。

CDC类可以实现虚拟串口通讯协议,而且由于大部分的操作系统(Windows,Linux)都带有支持CDC类的设备驱动程序,可以自动识别CDC类的设备,这样不仅免去了写专用设备驱动的负担,同时简化了设备驱动的安装。

https://wenku.baidu.com/view/3e2b630002020740be1e9b0f.html
https://blog.csdn.net/king_jie0210/article/details/76713938
https://blog.csdn.net/weijory/article/details/75570597

3.2 相关USB转COM芯片

  • CP21XX
  • Ch34x
  • Ftdi
  • Prolific

4. Android usb通信

4.1 串口

Android与串口设备通信的方案有四种:

  • 第一种是直接用SDK的BluetoothSocket类来进行蓝牙通信,外部设备再用蓝牙转串口进行控制。这种方式有较高延时,蓝牙模块需要供电,低带宽。
  • 第二种是使用USB转RS232方式(使用内核驱动和使用Android驱动两种方式),这种方式不需要硬件改动,不需要另外的供电,延时很小且有较高带宽。但是Android设备需要硬件上支持USB Host接口(一般Android平板支持,Android手机一般是没有的),另外可能需要root以改变/dev/ttyUSB0文件权限来加载一个内核模块。开发需要使用android_serialport_api。
  • 第三种是最容易的方案,直接使用串口进行连接,但是这种方式兼容性不好,只有少数设备支持,而且串口不支持流控制(由Android提供的USB Host API决定的。TODO: 串口在/dev/tty下,并不能遍历到/dev/bus/usb或/dev/usb,这里存疑。)。使用时也用android_serialport_api。
  • 第四种是将Android作为USB从机,外部设备作为USB主机与之通信,这种方式几乎与所有Android设备兼容(一般都有USB从口),无需root,低延迟,高带宽。

https://blog.csdn.net/sunjing_/article/details/51889801

4.1 USB直连

  • HID,输入设备。
  • CDC直接通讯

https://blog.csdn.net/sunjing_/article/details/51889801

5. Device code

device.getInterface(iInterface).getInterfaceClass()可以获取class code,列表在下面:
https://developer.android.com/reference/kotlin/android/hardware/usb/UsbConstants#USB_CLASS_APP_SPEC%3Akotlin.Int

device.getInterface(iInterface).getInterfaceSubclass()这个sub class,Android官网没有说明说明值,可以从下面usb.org官网找到,比如07hprinter只有一个sub class 01h.
https://www.usb.org/defined-class-codes