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