前言:

本文章主要介绍了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是打开的。

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

  1. qualcomm平台移植MTP驱动程序

    前言: http://blog.csdn.net/weijory/article/details/52870030 本文章主要介绍了mtp的基本知识,mtp在android中的实现框架,具体的工作流程 ...

  2. 如何在arm平台移植ubuntu系统(转)

    linux查看内核版本和发行版本号: https://www.cnblogs.com/guiyishanren/articles/8638921.html 华为开源镜像网站:含有不同平台架构的系统资源 ...

  3. [lcm] Qualcomm平台的显示屏lcd驱动移植步骤

    1lk部分 1-1 target_displayc 1-2 oem_panelc 1-3 panel_innont51021b_1200p_videoh 2Kernel 2-1 dsi-panel-b ...

  4. 转载】将32位代码向64位平台移植的注意事项

    转载]将32位代码向64位平台移植的注意事项 新近的64位平台在二进制上与32位应用程序兼容,这意味着可以非常简单地移植现有的程序.许多目前在32位平台上运行良好的程序也许不必移植,除非程序有以下要求 ...

  5. 教你如何在Mac上搭建自己的服务器——Nginx

    教你如何在Mac上搭建自己的服务器--Nginx WHAT 本篇主要是基于Nginx在Mac上搭建自己的服务器. 我相信很多朋友肯定是第一次听到Nginx,关于它具有怎样的传奇,这儿肯定说不完也说不透 ...

  6. Qualcomm平台android开发总结

    1.高通平台android开发总结 1.1 搭建高通平台环境开发环境 在高通开发板上烧录文件系统 建立高通平台开发环境 高通平台,android和 modem 编译流程分析 高通平台 7620 启动流 ...

  7. 如何在Linux平台下重定向running进程

    如何在Linux平台下重定向running进程 一.简介   本文通过一个具体的示例,介绍在Linux平台下重定向running(运行中)进程的几种方法.借助此方法,用户能够将进行打印重定向到需要的位 ...

  8. 手把手教你如何在Ubuntu22.04下驱动 EPSON系列打印机---以爱普生 EPSON L380为例

    手把手教你如何在Ubuntu22.04下驱动 EPSON系列打印机-以爱普生 EPSON L380为例 系统:Ubuntu22.04 目标打印机:L380 一.检查你的数据线是否插好 这一步,非常最要 ...

  9. 计算机上mac怎么用,教你如何在Mac苹果电脑上用Office办公软件

    原标题:教你如何在Mac苹果电脑上用Office办公软件 [名称]:Office2019_v16.30 [大小]:1.47 GB [语言]:简体中文 [安装环境]: Mac OS10.12 或更高( ...

最新文章

  1. 关于Windows Firewall的一些资料
  2. 计算机软件和硬件比较,软件与硬件RAID优劣之比较
  3. 【视频】SQL Server 2008 R2 StreamInsight - 多源复杂事件处理
  4. Semantic-UI的React实现(二):CSS类构造模块 1
  5. java逸出_Java并发编程 - 对象的共享
  6. c语言指针试题嵌入式,嵌入式面试C语言试题「」(2)
  7. 2017全国计算机二级office题库,2017全国计算机二级office选择题题库
  8. 三星530换固态硬盘_小米笔记本Air13.3加装固态硬盘(三星860EVO)
  9. arm linux logrotate,交叉编译zlog日志工具:zlog+cronolog+crontab+logrotate
  10. c语言令牌桶原理,令牌桶算法的使用
  11. 破解指纹打卡机 考勤机
  12. 一张图让你掌握测试人员能力模型及研发测试流程规范
  13. ARM嵌入式核心板介绍
  14. Golang hijack 劫持
  15. 2022java:eclipse编译器下载与配置详细
  16. office2016激活後显示是激活的状态,打开后还是提示激活:“让我们开始”
  17. 世界杯---人生就是一届又一届世界杯
  18. ClickHouse学习教程
  19. 周鸿祎力荐|纽约客16000字重磅刊文:区块链是回归互联网本质的唯一希望
  20. PHP来客在线客服系统源码 带安装教程

热门文章

  1. 矿大计算机学院辅导员,与你一起乘风破浪!矿大2020级辅导员天团来了!
  2. SQL数据库的一些基本操作
  3. 光学效应类有哪些最新发表的毕业论文呢?
  4. 《C语言基础学习笔记》—— 黑马程序员 <Part1-4>
  5. hello,bili
  6. python怎么处理中英文符号网名_英文带符号的网名_英文网名带符号加中文
  7. Dell技术支持年度笑话总结
  8. MATLAB基础编程(005-01)之Resize an Image with imresize Function 使用imresize函数 调整图像大小
  9. 导数用于判断函数的单调性,凹凸性,极值
  10. android 自动加微信,Android实现微信自动向附近的人打招呼(AccessibilityService)