MTK USB软件框架

来源:互联网 发布:openwrt手机网络共享 编辑:程序博客网 时间:2024/06/05 15:22

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支持功能设备协议:

1massstorage类:

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-TC01JKRSTNB热电偶兼容) 

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电气标准

AMSG_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 \\\\各种区分USBcharger方式

3.USB_DEVICE_STATE \\\为什么要设备状态请参考USB设备架构。iddle下士缺省态

4.g_UsbMode /*USB插拔时候到USB-task时候第一件事就是设置模式。比较重要的结构,

那用来做什么的?表明USB设备(手机)现在用来做什么功能。比如发送AtcmdLOG;下载;massstorage;开机(就是开机,啥也不做);

主要参数包括:

cable_type电缆的类型(A,B接口);

mode_param参数;

usb_menu_en是否要弹出框(声明comport,下载,log就不需要弹出)*/

5.Usb_Command //USB命令格式

6.Usb_Dev_Dscr //USB设备描述符(还有其他描述符格式,自己找找看哦)

7.Usb_EpBIn_StatusUsb_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()//区分USBcharger

USB_EINT_HISR()//////通过USBtask,USB插拔动作(MSG_ID_USB_B_PLUGIN_INDMSG_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__


  FormMTK2

消息流程:

注意:这里到了选择massstorage了。前面插入USB的时候,其实手机端(术语应该是设备端)还没有启动,设备端什么都还没有做,也就是说还没有开始做枚举,配置状态等等,PC端尚不知道手机端的USB功能设备的启动,主机也不会发送请求命令过来。

3.3时序图:


FormMTK3

分析:

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

原创粉丝点击