USB之:MTKUSB軟件框架及其MassStorage Class規範學習

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規範的知識,以及分析其中的流程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章