Qualcomm技术论坛
直播中

郭学娟

7年用户 218经验值
私信 关注
[经验]

在qualcomm平台移植MTP驱动程序的方法

前言:

本文章主要介绍了mtp的基本知识,mtp在android中的实现框架,具体的工作流程需要读者阅读具体的代码实现。然后介绍了mtp驱动的移植方法,首先需要把PID、VID标识加入到USB中,然后将mtp加入到gadget中,这些是在u***驱动中做的工作。在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/u***/f_mtp.h


2,USB和ueventd
(1)把Pid改为903A
添加文件u***/compositions/903A,将构成号转化为0x903A。
(2)将转换的Pid添加到u***中
在USB中包括PID(Product ID)和VID(Vendor ID),需要将产品的产品ID和供应商ID添加进USB。
将u***/start_u***中的:
ln -fs /***in/u***/compositions/901D
/***in/u***/boot_hsu***_composition
修改为:
ln -fs /***in/u***/compositions/903A
/***in/u***/boot_hsu***_composition
(3)添加uevent上报u***的插入事件
在USB的functions中将mtp添加到gadget中的u***驱动中,这样做之后,当我们插入u***设备之后就会生成设备节点/dev/mtp_u***。当插入u***设备之后,会上报ueventd,之后u***驱动才能生成该节点。添加的主要的文件如下:
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-u***/android0/目录下,将functions打开,如果有mtp说明mtpserver是打开的。

更多回帖

发帖
×
20
完善资料,
赚取积分