android的USB MTP && USB CDC/USBnet(ECM, NCM, ACM) && USB gardget

MTP的全称是Media Transfer Protocol(媒体传输协议),它是微软公司提出的一套媒体文件传输协议。早在智能手机普及前,数码相机和MP3播放器等都使用了MTP的前身PTP(Picture Transfer Protocol)进行媒体文件传输,Android从3.0开始支持MTP。

(1)既然可以通过MTP把智能设备当作U盘使用,那么它和我们常用的USB大容量存储(USB Mass Storage,简称UMS)有何不同呢?

UMS模式下,PC操作存储设备的粒度是设备块(FAT block),而非文件系统。什么意思?此处举一个简单例子。当Android手机通过UMS将sdcard挂载到PC后,PC就拥有对sdcard的绝对控制权。这样,手机就无法同时访问sdcard了。这种做法带来的后果就是Camera或Music程序将因没有外部存储空间而提示无法进行操作。这也是Android早期版本中一个很明显的特点。另外,由于PC在操作sdcard时可能弄坏其文件系统,这将导致sdcard重新挂载到手机后不能被识别。

如果Android手机的sdcard以MTP模式挂载到PC机上,sdcard的控制权其实还是属于手机。只不过智能手机通过MTP协议向PC机构建了一个虚拟文件系统。PC机操作其中的文件时,都会通过标准MTP协议向智能手机发起请求。另外,Android把MTP功能集成在MediaProvider中,其好处是PC机操作(例如拷贝或删除等)媒体文件时,媒体数据都会及时更新到媒体数据库中。而UMS模式下,当sdcard挂载回手机后,Android还得花较长时间重新扫描媒体文件以更新媒体数据库。

(2)MTP的好处还有很多,例如它可判断PC机拷贝的媒体文件是否受目标手机支持,甚至可以触发对应的转码程序将其转换成手机支持的格式。不过和UMS相比,MTP也有不足之处:传输大文件的速度较慢;MTP不能直接修改文件本身,只能先拷贝到本地修改,完毕后再拷贝回去;除了Windows外,Linux和MacOS对MTP支持还不是很完善。

(3)MTP协议介绍,MTP的使用者包括两个部分,分别是Initiator和Responder

android的USB MTP && USB CDC/USBnet(ECM, NCM, ACM) && USB gardget

Initiator:主要是指USB Host,例如PC机,笔记本等。协议规定所有MTP操作只能由Initator发起。
Responder:一般是诸如数码相机、智能手机等存储媒体文件的设备。Responder在MTP中的作用就是处理Initator发起的请求。同时,它还会根据自身状态的变化发送Event以通知Initiator。

android的USB MTP && USB CDC/USBnet(ECM, NCM, ACM) && USB gardget

MTP协议栈由下到上分别是:
Pyshical Layer(物理层):物理层在MTP协议中用来传输数据。目前有三种物理层可供MTP使用。它们分别是USB:其主要特点是传输文件,同步媒体文件时速度快,而且可以边工作边充电,这是目前用的最多的一种方式;IP:基于IP的MTP(简称MTP/IP)将通过UPnP来匹配和发现设备。它是家庭网络中是最理想的传输方式;Bluetooth:MTP/BT是最省电,同时也是速度最慢的一种传输方式,用处较少。
传输层:MTP中,数据传输格式遵循PTP协议
命令层:实现了MTP协议中的各种命令。

(4)android3.1多了三个大包:android.hardware.usb  、android.mtp   、android.net.rtp。

A,android.mtp:让连接的camera和其他设备,可以直接使用PTP(图像传输协议)或MTP(媒体传输协议)保持连接,上层app可以接收到通知,从而管理这些设备的文件和存储传输等。它为我们提供了定义PTP和MTP的MtpConstants,描述USB host总线上连接的PTP或MTP设备的MtpDevice,封装MTP设备信息的MtpDeviceInfo,和该对象的信息的MtpObjectInfo,还有MTP设备上存储单元信息的封装MtpStorageInfo 。

B,android.hardware.usb:支持通过USB连接到Android供电设备的外设数据通信。*类是UsbManager,它提供了识别和使用USB设备和USB配件的通讯方法。应用程序可以获取一个UsbManager实例,然后用于连接的设备或配件的清单查询、管理、通信。

C,android.net.rtp:内置RTP(实时传输协议)协议栈,应用程序可以使用它来管理交互数据流。应用程序提供VOIP,一键通,会议和音频流,在网络可用的前提下,可以使用这些API来启动会话和传输,或接收数据。最简单的用法即单个远程终端和本地。

(5)WIndows 7系统自带MTP驱动程序,可以直接使用;Windows XP系统则需要安装驱动程序。首先将XP系统的Windows Media Player版本升级至wmp11,最新的版本自带了MTP驱动。如果升级完后还无法识别,则需要手动修改inf文件,位置在c:\windows\inf\wpdmtp.inf。查看你的MTP设备的VID和PID,添加下面的对应内容:

[Generic.NTx86]

%GenericMTP.DeviceDesc%=MTP, USB\MS_COMP_MTP

%GenericMTP.DeviceDesc%=MTP, USB\VID_XXXX&PID_XXXX&MI_00

........................................

[Generic.NTamd64]

%GenericMTP.DeviceDesc%=MTP, USB\MS_COMP_MTP

%GenericMTP.DeviceDesc%=MTP, USB\VID_XXXX&PID_XXXX&MI_00

之而就可以安装上这个驱动程序了

==========================================USB CDC/USBnet(ECM, NCM, ACM) ===============================

USB CDC-ACM (Abstract Control Model), CDC-ECM (Ethernet Networking Control Model), CDC-NCM (Network Control Model), OBEX (Object Exchange) and WCM-Device Management USB class and function drivers
(1)CDC-ACM (Abstract Control Model) allows any communication device to provide a serial communication interface (e.g modem devices that send and receive AT commands).

The CDC ACM driver exposes the USB device as a virtual modem or a virtual COM port to the operating system.The driver enables sending both data and AT commands, either through ACM (separating data and AT commands over different
channels) or through Serial Emulation (passing the AT commands as is and as part of the data stream).
/lib/modules/$(uname -r)/kernel/drivers/usb/class目录下看到cdc-acm.ko文件。
(2)CDC-ECM (Ethernet Networking Control Model) offers device manufacturers to interface as a standard NIC (Network Interface Card) device. This interface is usually adopted by high speed LAN networking devices allowing high speed Ethernet data transfer over USB.

The ECM (Ethernet Networking Control Model) protocol is used for exchanging Ethernet-framed data between the device and host. A CDC ECM compliant device exposes itself as a virtual NIC to the host operating system. The NIC is
assigned with a MAC and an IP address.
A general use case of a CDC ECM device is a point-to-point Ethernet adapter to a LAN/WLAN.
(3)CDC-NCM (Network Control Model).The NCM (Network Control Model) protocol is used for exchanging High Speed Ethernet-framed data between the device and host. A CDC NCM compliant device exposes itself as a virtual NIC to the host operating system. The NIC is assigned with a MAC and an IP address.
A general use case of a CDC NCM device is a Wireless Network Adapter which supports 3.5G/4G networks such as: HSPA+ and LTE. 
(4)OBEX (Object Exchange) is compliant with the Wireless Mobile Communication OBEX function model, supporting OBEX applications over USB.
(5)WMC-Device Management is compliant with the Device Management function model, supporting a minimal AT command based control model.
(6)RNDIS - provides CDC like communication capabilities on Windows PCs supporting the Microsoft RNDIS protocol. Please refer to the RNDIS webpage for more info. 
==========================================USB gardget ===============================

(1)背景知识
      Linux kernel2.6以上的版本中,USB设备驱动的接口改为了gadget,包括做主和做从的驱动内容。Linux支持连接各种USB从设备,同时也支持自己作为设备插入到其他主机当中。最典型的例子就是AndroidOS的手机,插入电脑可以被识别为U盘之类的设备。
为了避免与作为主机时支持的"设备驱动(USB Device Driver)"一词混淆,Linux给这部分的实现取名为"Gadget"。内核源码的目录为\drivers\usb\gadget,里面包含了内核所支持的不同类型的USBDevice Controller (UDC)驱动的实现,以及框架和不同gadget的实现。

(2) USB Gadget的三层架构
层次关系从上到下:
一层:USB Gadget功能层。BSP/Driver开发者通常是要实现这一层,从而实现一个具体的设备驱动,如Anddroid在此层实现了adb,mtp,mass_storage等。浏览参考关注此层代码时,会发现“composite”是此层的关键字,此层中关键的数据结构是:struct usb_composite_driver。这一层的驱动文件一般为:driver/usb/gadget/android.c(android实现的)或driver/usb/gadget/serial.c(传统Linux实现的USB转串口)。
二层:USB设备层。这一层是Linux内核开发维护者实现的,与我们没太大关系,不用我们操心,我们只关心其的一些接口就行。浏览参考关注此层时,会发现“gadget”是此层的关键字,此层的关键数据结构是:usb_gadget_driver,usb_composite_dev。这层主要的一个驱动文件为:driver/usb/gadget/composite.c
三层:USB设备控制器驱动层。这一层主要是与CPU、CPU USB控制器有关,与硬件紧密相关,这一层也比较头痛,主要它和USB控制器牵扯在一起,涉及有寄存器、时钟、DMA等等。但是这一层往往是由芯片厂商去实现。我们一般仅需在板级文件中处理好所需要的USB接口即可。这层的关键字就是“UDC”,主要驱动文件命名含“udc”关键字,一般与CPU或芯片厂商有关,如driver/usb/gadget/xxx_udc.c。
可以用一句简单的话去概括三层的关系:USB Gadget功能层调用USB设备层的接口,USB设备层调用USB设备控制器驱动层的接口,然后USB设备控制器驱动层回调USB设备层,USB设备层回调USB Gadget功能层。

参考原文:http://blog.csdn.net/yiyaaixuexi/article/details/6542702#

参考原文:http://hi.baidu.com/aokikyon/blog/item/e77161e7ae190d31b83820e1.html

参考原文:http://bbs.meizu.cn/thread-4933555-1-1.html

上一篇:配置phpstorm自动上传代码


下一篇:docker 独立搭建linux + php 随笔