您的位置:首页 > 其它

USB之:MTKUSB软件框架及其MassStorage Class规范学习

2015-03-30 09:50 127 查看
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规范的知识,以及分析其中的流程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: