MTK USB软件框架
MTKUSB软件框架及其MassStorage Class规范学习总结
目录
一 MTKUSB支持功能设备
二 USB软件体系结构介绍
2.1代码目录
2.2软件架构
2.3主要数据结构,函数,宏,变量
三MS功能设备分析
3.1 MS概述
3.2 MS功能模块组成
3.3 MS时序图以及消息流程
3.4MS数据传输流程图以及状态机
四小结
摘要
本文主要描述MT6236平台之USB的软件框架,重点介绍MS规范流程,且着重针对驱动源代码做分析,包括代码架构,时序图,状态机进行分析总结。
一MTKUSB支持功能设备协议:
1)massstorage类:
norflash做存储设备;
nandflash做存储设备;
RAMdisk,内存做存储设备;
T卡;
cmrom;
2)通信设备:
虚拟串口;
3).多媒体类
图像MTP;
图像采集;
4).视频设备
USB复合视频接口
5).网络设备
RNDIS //RemoteNetwork Driver Interface SpecificationRNDIS是指RemoteNDIS,基于USB实现RNDIS实际上就是TCP/IPover USB,就是在USB设备上跑TCP/IP,让USB设备看上去像一块网卡。
6)特殊应用设备:
TC01----对应设备描述USB_COMPOSITE_MULTI_COM。作用就是热电偶测量设备(连至各类USB端口后,可将PC(或者手机)作为显示器并且实时监测数据。NIUSB-TC01与J、K、R、S、T、N和B热电偶兼容)
7)OTG_SUPPORT---------支持。
---------------------------------------软件设备描述:
支持的设备类型在usb_comm.h
{
USB_UNKOWN=0,
USB_CDC_ACM, //虚拟串口设备,
USB_MASS_STORAGE, //海量存储设备,就是手机当U盘那样用
USB_VIDEO, //USB摄像头功能
USB_COMPOSITE_VIDEO_COM,/*USB复合视频接口(手机作为视频输出源,USB作为复合视频接口,输出到显示设备,如LG液晶显示器“L206WU”,就支持USB视频接口*/
USB_STOP_MS, //没有什么用,为什么????
USB_CDC_ACM_LOGGING, //USB虚拟串口打印log
USB_IMAGE, //USB图像类,应该是图像采集的意思。手机作为一个USB图像采集卡功能。
USB_IMAGE_MTP, /*IMAGE_MTP:就是手机从设备,PC端的图片浏览器作为发起者,通过USB,手机端准从IMAGE_MTP规范,向该浏览器发送图片数据。反之,多媒体传输就是直接传输图片和音频视频,会直接放到手机的制定文件夹里,方便手机直接打开。*/
USB_STOP_MTP, //没有用,????
USB_COMPOSITE_MULTI_COM, //复用设备:COM+TC01 36不支持。代码是有的,估计是其他平台系列支持。
USB_RNDIS,
USB_COMPOSITE_RNDIS_COM, 复合设备:RNDIS+COM口
USB_MASS_STORAGE_CDROM_ONLY,
USB_MAX_DEVICE_TYPE
}
二软件框架
2.1代码目录:包括3个部分:
代码目录 |
文件列表 |
描述 |
\code\venusmmi\app\Cosmos\USBApp |
Vapp_usb_usbmode.cpp Vapp_usb_normalmode.cpp …... |
USB应用层 |
code\plutommi\Service\UsbSrv |
usbsrv.c |
USBservicelayer |
手机USB功能驱动: \code\hal\connectivity\usb_driver bootloader驱动: code\hal\system\bootloader\src |
手机USB功能驱动: usb_phy_drv.c bootloader驱动: usbdl_usbacm_adap.c usbdl_XXXX.c usbdl_XXX.h |
USB驱动层:HAL |
\code\usb |
usb_mode.c usb_task.c ……. |
USB task相关 |
code\hal\peripheral\src\ |
dcl_chr_det.c |
中断检测: CHR_USB_EINT_HISR() 有两种中断消息,OTG用的是A接口和接口B常规(MS,)请参考USB电气标准 A:MSG_ID_USB_A_PLUGIN_IND B: MSG_ID_USB_B_PLUGIN_IND //同理OUT消息 |
2.2整体软件架构:
软件框架(图1)
2.3主要数据结构,函数,宏,变量:
(1)宏
__CHARGER_USB_DETECT_WIHT_ONE_EINT__ //charger and usb share same EINT
PMIC_PMU_SERIES
PMIC_CHR_USB_DET_EINT_LEVEL_ACTIVE_LOW 低有效
PMIC_CHR_USB_DET_EINT_LEVEL_TRIGGER 电平触发
PMIC_CHR_USB_DETECT_THROUGH_USB //驱动USBand charger
DRV_USB_IP_V3 //usb 控制器芯片IP核版本
__COSMOS_MMI_PACKAGE__ 是关闭;原来pluto_mmi有用
(1)数据结构:
1.CHR_DET_TYPE_ENUM \\\\\\充电类型
2.chr_usb_detect_struct \\\\各种区分USB,charger方式
3.USB_DEVICE_STATE \\\为什么要设备状态?请参考USB设备架构。iddle下士缺省态
4.g_UsbMode /*在USB插拔时候到USB-task时候第一件事就是设置模式。比较重要的结构,
那用来做什么的?表明USB设备(手机)现在用来做什么功能。比如发送Atcmd;LOG;下载;massstorage;开机(就是开机,啥也不做);
主要参数包括:
cable_type电缆的类型(A,B接口);
mode_param参数;
usb_menu_en是否要弹出框(声明comport,下载,log就不需要弹出)*/
5.Usb_Command //USB命令格式
6.Usb_Dev_Dscr //USB设备描述符(还有其他描述符格式,自己找找看哦)
7.Usb_EpBIn_Status和Usb_EpBOut_Status定义的是MASSstorage Bulk-Only传输协议。
8.Usb_Device//这个结构比较牛逼,必须理解。描述一个设备功能,特性,还有还有一些协议上共性的参数。
设备驱动数据结构:
USB_DiskDriver_STRUCT USB_MSDC_drv;/// massstroage 功能函数接口;SD卡
USB_DiskDriver_STRUCTUSB_RAM_drv;//massstroage 功能函数接口;RAMdisk
(3)变量:pw_chr_type.
(4)函数:
1.中断部分函数:
CHR_USB_EINT_HISR()//充电器,USB插入先经过这里处理。
USB_IP_V3_check_charger_or_usb()//区分USB和charger
USB_EINT_HISR()//通过USBtask,有USB插拔动作(MSG_ID_USB_B_PLUGIN_IND,MSG_ID_USB_B_PLUGOUT_IND)
CHRDET_HISR()通知BMT有充电器插入
2.USB管理层函数:
USB_Mode_Selection()
usb_task_main()
三MS功能设备分析
3.1MS概述
USB组织定义了海量存储设备类(MassStorage Class)的规范,也称USB海量存储协议,这个类规范包括四个独立的子类规范,即:
1.USB Mass Storage Class Control/Bulk/Interrupt (CBI) Transport
2.USB Mass Storage Class Bulk-Only Transport
3.USB Mass Storage Class ATA Command Block
4.USB Mass Storage Class UFI Command Specification
前两个子规范定义了数据/命令/状态在USB上的传输方法。Bulk-Only传输规范仅仅使用Bulk端点传送数据/命令/状态,CBI传输规范则使用Control/Bulk/Interrupt三种类型的端点进行数据/命令/状态传送。后两个子规范则定义了存储介质的操作命令。ATA命令规范用于硬盘,UFI命令规范是针对USB移动存储。
3.2mass storage 功能模块组成:
宏:__USB_MASS_STORAGE_ENABLE__
FormMTK图2
消息流程:
注意:这里到了选择massstorage了。前面插入USB的时候,其实手机端(术语应该是设备端)还没有启动,设备端什么都还没有做,也就是说还没有开始做枚举,配置状态等等,PC端尚不知道手机端的USB功能设备的启动,主机也不会发送请求命令过来。
3.3时序图:
FormMTK图3
分析:
a.MMImass storageselect:--->VappUSBNormalModeContext::onCommandPopupClick(VfxIdid)configMSMTP(DEVUSB_CFG_ACTION_MASS_STORAGE);
b.Msg to l4c : MSG_ID_MMI_EQ_USBCONFIG_REQ;
c. MSG_ID_DRVUEM_USBCFG_REQ-------重要MSG------这个消息是上层经过L4C,发送到USBtask的消息。做什么用呢?就是根据USB_DEVICE_TYPE 通过USB_Config_Req_Hdlr函数------》USB_Config_Type()设置owner,初始化USB设备,USBstorage设备驱动(就是前面的USB_DiskDriver_STRUCT),FAT初始化;注册功能数。USB_Register_CreateFunc();USB_Register_Device_Code();
3.3.2对于USB设备端的存储器是T卡时候:直接调用SD驱动来操作读写数据。结构体:USB_MSDC_drv
kal_boolusbms_read_all(void*data, kal_uint32 LBA, kal_uint16 sec_len, kal_uint32 ID)
kal_boolusbms_write_all(void*data, kal_uint32 LBA, kal_uint16 sec_len, kal_uint32 ID)
3.3.3对于USB设备端的存储器是Norflash时候,驱动接口为:USB_NOR_drv;实际上是通过封装文件系统:USB_SYSTEM_drv
3.3.4对于USB设备端的存储器是Nandflash时候,驱动接口为:USB_NAND_drv
3.4USBMS数据传输流程图以及状态机
这里针对数据的R/T流程做了一个流程图分析,如下:
数据传送状态机
上述的状态机里面提到了读写过程的CMD,他们都是UFI命令。
参考UniversalSerial BusMass StorageClass UFICommandSpecification.pdf
UFI命令格式列表:
命令 |
值 |
描述 |
USBMS_FORMAT_UNIT |
04h |
格式化存储单元 |
USBMS_INQUIRY |
12h |
索取器件信息 |
USBMS_MODE_SENSE |
5aH |
向host传输参数 |
USBMS_MODE_SELECT |
55h |
允许Host对外部设备设置参数 |
USBMS_PREVALLOW_MEDIA_REMOVL |
1eh |
写保护 |
USBMS_READ10 |
28h |
Host读存储介质中的二进制数据 |
USBMS_READ12 |
a8h |
同上 |
USBMS_READ_FORMATCAPACITY |
23h |
查询当前容量及可用空间 |
USBMS_REQUESTSENSE |
03h |
请求设备向主机返回执行结果,及状态数据 |
USBMS_START_STOP_UNIT |
1bh |
主机请求去加载或者卸载介质设备 |
USBMS_TEST_UNIT_READY |
00h |
请求设备报告是否处于Ready状态 |
USBMS_VERIFY |
2fh |
在存储中验证数据 |
USBMS_WRITE10 |
2ah |
从主机向介质写二进制数据 |
USBMS_WRITE12 |
aah |
同上, |
USBMS_READ_CAPACITY |
25h |
获取设备容量 |
相关文件:
usbms_state.c |
MS的状态机处理 |
usbms_drv.c |
MS的中断以及驱动部分(断点,DMA驱动) |
usbms_adap.c |
MS的文件系统的读写或者存储器的直接读写 |
四小结:
本文介绍USB的大体框架,以及关键代码,重点介绍MS规范的知识,以及分析其中的流程。
MTK USB软件框架相关推荐
- DM8168 DVRRDK软件框架研究
Netra(DM8168)处理器是个多核处理器,每个核之间相互独立却又相互关联,如何高效简洁地利用每个核完成一套系统功能是非常关键的,RDK这套软件平台就是针对这种多核平台设计的一套多通道视频应用方案 ...
- C语言蓝牙协议栈讲解,通俗易懂讲解蓝牙协议栈软件框架
BLE 协议架构总体上分成3块,从下到上分别是:控制器(Controller),主机(Host)和应用端(Apps):3者可以在同一芯片类实现,也可以分不同芯片内实现,控制器(Controller)是 ...
- Netra基于Rdk平台的软件框架设计
==================================================================================================== ...
- Netra(DM8168)基于Rdk平台的软件框架设计
感谢原作者robin19890305的经验分享. =========================================================================== ...
- 使用USB Gadget框架让USB变成串口设备
1. 背景介绍 串口是一种经典且对软件工程师友好的通信方式,因为可以在直接使用echo进行通信,不需要驱动,非常的方便,但当使用串口时,往往需要用到杜邦线和usb2ttl设备,虽然软件上面方便了,但是 ...
- 基于ROS搭建简易软件框架实现ROV水下目标跟踪(三)--软件框架简述
项目链接:GitHub - cabinx/cabin_auv_ws: A simple demo for rov/auv underwater object tracking based on ros ...
- linux TTY子系统(2) -- 软件框架
了解tty 子系统 1.TTY的子系统 在Linux kernel中,TTY就是各类终端(Terminal)的简称.为了简化终端的使用,以及终端驱动程序的编写,Linux kernel抽象出了TT ...
- 软件框架设计的艺术----读书总结
总结 软件开发的艺术 理想主义,经验主义和无绪 文艺复兴时期,现代科学产生了两个重量级理论: 理性主义和经验主义. 理性主义认为理智是信息的首要来源.给出一个假设,只要通过思考就能理解和描述这个世界, ...
- linux内核中的GPIO系统之(1):软件框架
一.前言 作为一个工作多年的系统工程师,免不了做两件事情:培训新员工和给新员工分配任务.对于那些刚刚从学校出来的学生,一般在开始的时候总是分配一些非常简单的任务,例如GPIO driver.LED d ...
- 认识软件框架的设计原则-- 变与不变分离,创造简美之序
ee ee 欢迎访问 ==>高老师的博客网页 高焕堂 ...
最新文章
- 2013-3-10日记
- SAP用Function发布供外部调用的webservice
- MySQL 笔记7 -- 权限操作与视图
- P4211 [LNOI2014]LCA(离线 + 在线 做法)
- SpringBoot笔记整理(三)
- JQuery Show()的几种效果
- activemq控制发送频率_发送activemq
- SDEBECMSrv服务
- 你需要知道的基础算法知识——STL和基础数据结构(一)
- 基于struts2的web系统中的返回功能
- Hat’s Words HDU - 1247
- dhtmlx技术使用总结与介绍中文手册
- 惠普台式计算机系统系统修复,一键恢复系统,详细教您怎么一键恢复惠普笔记本系统...
- 如何给php安装上pecl,PHP PECL如何安装扩展?
- IAR+openSDA+s32k144 环境搭建
- aircrack-ng 添加Mac OS X 支持 airodump-ng和aireplay-ng都可以用了
- 文件、合并-如何将多个PPT文件合并到一个PPT中 -by小雨
- 神经网络中的网络优化和正则化(二)之参数初始化/数据预处理/逐层归一化
- 在PPT插入备注时,如何在放映时只让演讲者看到,其他人看不到
- 十字相乘法计算机,网络基础选择题1(带答案)(6页)-原创力文档
热门文章
- Educational Codeforces Round 61 (Rated for Div. 2) D. Stressful Training 详解
- 〇、什么是全栈工程师
- Python pywin32(一)
- 【scipy】scipy.linalg.slove 求解线性方程组 python
- git: Cannot communicate securely with peer: no common encryption algorithm(s)
- jenkins遇到Unlock Jenkins To ensure Jenkins is securely set up by the administrator, a password has be
- Android 仿支付宝9.0芝麻信用分效果
- Linux学习笔记——Linux基本命令篇
- HTML12张图片魔方,纯CSS3 实现3D魔方
- 微博营销技巧都有哪些?应该从哪些方面入手?