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规范的知识,以及分析其中的流程。