Bootstrap

教大家如何在qualcomm平台移植MTP驱动程序

前言:

本文章主要介绍了mtp的基本知识,mtp在android中的实现框架,具体的工作流程需要读者阅读具体的代码实现。然后介绍了mtp驱动的移植方法,首先需要把PID、VID标识加入到USB中,然后将mtp加入到gadget中,这些是在usb驱动中做的工作。在mtp驱动中关键是加入了MtpMain.cpp文件以开启MtpServer。

一、MTP简介

  媒体传输协议,是基于PTP(Picture Transfer Protocol)协议的扩展,主要用于传输媒体文件,其中有价值的应用就是同步DRM文件的license。目前支持MTP协议的只有WMP10(Windows Media Player 10)和WMP11(Windows Media Player 11)两个版本,WMP11加入了对Playlist和Album art的支持,在获取媒体文件信息的时候GetObjectPropList代替了WMP10的GetObjectInfo命令。
MTP既可以实现在USB协议上,也可以实现在TCP/IP协议上,它属于上层的应用协议,而不关心底层传输协议。目前大部分设备的应用都是基于USB协议。市场上支持MTP的设备有Motorola的 Z6, U9, E8等,还有索尼NWZ-A81X系列。总之有越来越多的设备开始支持MTP。微软官方有一个PlaysForSure的认证,如果你的设备通过了微软的这个测试,就会授权给你一个PlaysForSure的标志。
    MTP的应用分两种角色,一个是作为Initiator,另一个作为Responder,Responder都是被动的回复Initiator的命令,不会主动发命令。以"Android平板电脑"连接"PC"为例,如下所示:

二、MTP框架

Android中的MTP框架如下图所示:


图2-1 Android中MTP的框架

解释说明:
(1)在kernel层,USB负责数据交换,当PC和Android手机连接之后,实际的数据交换是经过USB数据线发送给USB驱动的。对于MTP请求,MTP驱动会从USB驱动中解析出来请求数据,然后传递给上层。对于MTP反馈,MTP驱动会将上层传过来的数据打包,然后传递给USB驱动。
(2)在JNI层,在JNI层,MtpServer会不断地监听Kernel的消息"MTP请求",并对相应的消息进行相关处理。同时,MTP的Event事件也是通过MtpServer发送给MTP驱动的。 MtpStorage对应一个"存储单元";例如,SD卡就对应一个MtpStorage。 MtpPacket和MtpEventPacket负责对MTP消息进行打包。
(3)在Framework层,MtpServer相当于一个服务器,它通过和底层进行通信从而提供了MTP的相关服务。MtpDatabase充当着数据库的功能,但它本身并没有数据库对数据进行保存,本质上是通过MediaProvider数据库获取所需要的数据。MtpStorage对应一个"存储单元",它和"JNI层的MtpStorage"相对应。
(4)在Application层,MtpReceiver负责接收广播,接收到广播后会启动/关闭MtpService。MtpService的作用是提供管理MTP的服务,它会启动MtpServer,以及将本地存储内容和MTP的内容同步。MediaProvider在MTP中的角色,是本地存储内容查找和本地内容同步。


三、MTP驱动的移植步骤
1,添加头文件
为了使用mtpserver功能首先需要修改相关的头文件,在相关头文件中加入内核定义标志__KERNEL__,这样做可以使我们更好的使用内核代码。
include/linux/stddef.h
include/linux/types.h
include/linux/usb/f_mtp.h


2,USB和ueventd
(1)把Pid改为903A
添加文件usb/compositions/903A,将构成号转化为0x903A。
(2)将转换的Pid添加到usb中
在USB中包括PID(Product ID)和VID(Vendor ID),需要将产品的产品ID和供应商ID添加进USB。
将usb/start_usb中的:
ln -fs /sbin/usb/compositions/901D \
/sbin/usb/boot_hsusb_composition
修改为:
ln -fs /sbin/usb/compositions/903A \
/sbin/usb/boot_hsusb_composition
(3)添加uevent上报usb的插入事件
在USB的functions中将mtp添加到gadget中的usb驱动中,这样做之后,当我们插入usb设备之后就会生成设备节点/dev/mtp_usb。当插入usb设备之后,会上报ueventd,之后usb驱动才能生成该节点。添加的主要的文件如下:
ueventd/ueventd.c
ueventd/devices.c
ueventd/start_ueventd


3,添加MtpServer
当插入MTP设备的时候需要开启mtpserver,MtpServer相当于一个服务器,它通过和底层进行通信从而提供了MTP的相关服务。
主要添加的文件如下:
media/mtp/MtpEventPacket.cpp
media/mtp/MtpMain.cpp
media/mtp/MtpServer.cpp
media/mtp/MtpUtils.cpp
在/sys/class/android-usb/android0/目录下,将functions打开,如果有mtp说明mtpserver是打开的。


;