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个部分:
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命令格式列表:
相关文件:
四小结:
本文介绍USB的大体框架,以及关键代码,重点介绍MS规范的知识,以及分析其中的流程。
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消息 |
软件框架(图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规范的知识,以及分析其中的流程。
相关文章推荐
- B/S软件开发测试规范_试行1.1.0604 (收录于网络,供学习用,如果侵犯了你们版权请与本人联系)
- 软件框架以及编码规范说明文档
- 华为软件编程规范学习(一)--排版
- 华为软件编程规范学习(七)--可测性
- 华为软件编程规范学习(五)--变量、结构
- 一起学习ACE及其服务器端网络软件设计
- 华为软件编程规范学习(十)--代码编辑、编译、审查
- B/S软件开发测试规范_试行1.1.0604 (收录于网络,供学习用,如果侵犯了你们版权请与本人联系)
- 黑马程序员_JAVA学习日记_JAVA中API:集合框架1(Collection,List,Set及其子类和迭代器的应用)
- 华为软件编程规范学习(八)--可测性
- nio socket 及其开源框架MINA学习总结(一)
- [转]软件创造价值,驱动提供力量----USB驱动学习笔记
- nio socket 及其开源框架MINA学习总结(一)
- 基于J2EE规范的TeaFramework框架(毕业设计用于学习J2EE写的一个框架)
- USB Video Class及其实现
- 学习_孙亚民的"构建面向对象的应用软件系统框架"
- nio socket 及其开源框架MINA学习总结(二)
- nio socket 及其开源框架MINA学习总结(二)
- 华为软件编程规范学习(三)--标识符命名
- 华为软件编程规范学习(九)--质量保证