📄 usb_mode.c
字号:
/*****************************************************************************
* Copyright Statement:
* --------------------
* This software is protected by Copyright and the information contained
* herein is confidential. The software may not be copied and the information
* contained herein may not be used or disclosed except with the written
* permission of MediaTek Inc. (C) 2005
*
* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
*
* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/
/*****************************************************************************
*
* Filename:
* ---------
* usb_mode.c
*
* Project:
* --------
* Maui_Software
*
* Description:
* ------------
* This file implements usb mode selection
*
* Author:
* -------
* -------
*
*============================================================================
* HISTORY
* Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*------------------------------------------------------------------------------
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
*------------------------------------------------------------------------------
* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*============================================================================
****************************************************************************/
#include "drv_comm.h"
#include "stack_common.h"
#include "stack_msgs.h"
#include "app_ltlcom.h" /* Task message communiction */
#include "syscomp_config.h"
#include "task_config.h"
#include "stacklib.h"
#include "reg_base.h"
#include "drvsignals.h"
#include "eint.h"
#include "kal_release.h"
#include "usb_comm.h"
#include "usb_drv.h"
#include "usb.h"
#include "usb_resource.h"
#include "usbms_utils.h"
#include "usbms_drv.h"
#include "usbms_state.h"
#include "usbms_adap.h"
#include "usb_msdisk.h"
#include "usbacm_drv.h"
#include "usbacm_ft.h"
#ifdef __DSPIRDBG__
#include "usbacm_dsp.h"
#include "irdbg_drv.h"
#endif
#ifdef WEBCAM_SUPPORT
#include "usbvideo_if.h"
#include "usbvideo_drv.h"
#include "usbvideo_state.h"
#endif
#ifdef PICTBRIDGE_SUPPORT
#include "usbimage_drv.h"
#include "ptp_state.h"
#endif
#ifdef __OTG_ENABLE__
#include "otg_drv.h"
#include "otg.h"
#include "usbd.h"
#include "usb_host_default_drv.h"
#include "usb_host_ms_state.h"
#include "gpio_sw.h"
#endif
#include "usb_task.h"
#include "usb_mode.h"
#include "usb_custom.h"
#include "app_buff_alloc.h"
#include "nvram.h"
#include "nvram_interface.h"
#include "nvram_user_defs.h"
#ifdef MT6318
#include "pmic6318_sw.h"
#endif
#include "fat_fs.h"
#include "rtfiles.h"
#ifdef __MULTI_BOOT__
#include "multiboot_config.h"
#endif /* __MULTI_BOOT__ */
//#define __USB_IN_NORMAL_MODE__
#ifdef __OTG_ENABLE__
static void OTG_Host_Stop_Hdlr(void);
#ifdef OTG_NORMAL_APP_FIXED
/* for compliance test */
kal_uint32 g_USB_Mass_Buffer[32*1024/4];
#endif
#endif
#ifdef __USB_IN_NORMAL_MODE__
static FS_DEVICE_TYPE_ENUM USB_Ms_Dev_To_Fs_Type(USB_STORAGE_DEV_TYPE type);
#endif
Usb_Mode_Struct g_UsbMode;
/* extern functions */
extern kal_uint16 INT_BootMode(void);
extern kal_bool INT_USBBoot(void);
/* static functions */
static FS_DEVICE_TYPE_ENUM USB_Ms_Dev_To_Fs_Type(USB_STORAGE_DEV_TYPE type);
static void USB_Init_Normal_Mode_Ms(kal_uint32* mem_addr, kal_bool b_enable);
static void USB_End_Normal_Mode_Ms(void);
static void USB_End_Ms(void);
/************************************************************
mode selection functions
*************************************************************/
void USB_Init_Mode(void)
{
#ifndef __OTG_ENABLE__
EXT_ASSERT(0, 0, 0, 0);
#endif
g_UsbMode.mode_param = 0;
g_UsbMode.cable_type = USB_MODE_CABLE_PLUGOUT;
g_UsbMode.previous_cable_type = USB_MODE_CABLE_PLUGOUT;
g_UsbMode.b_start_srp = KAL_FALSE;
g_UsbMode.b_start_hnp = KAL_FALSE;
g_UsbMode.b_usb_pdnmode = KAL_TRUE;
}
void USB_Mode_Selection(void)
{
#ifdef __OTG_ENABLE__
EXT_ASSERT(0, 0, 0, 0);
#endif
#ifndef __OTG_ENABLE__
if(g_UsbMode.cable_type==USB_MODE_CABLE_A_PLUGIN)
EXT_ASSERT(0, 0, 0, 0);
if (INT_BootMode() == MTK_FACTORY_MODE)
{
if(((g_UsbMode.mode_param&USB_MODE_NVRAM_READ_DONE)!=0)
&&((g_UsbMode.mode_param&USB_MODE_FT_START_DONE)!=0))
USB_Init_ACM_In_Meta();
return;
}
/* Normal mode */
if ((INT_USBBoot() == KAL_FALSE) && (g_UsbMode.cable_type!=USB_MODE_CABLE_PLUGOUT)
&&((g_UsbMode.mode_param&USB_MODE_NVRAM_READ_DONE)!=0)
&&(gUsbDevice.usb_comport_boot == KAL_FALSE))
{
#ifdef OTG_NORMAL_APP_FIXED
USB_Config_Type(USB_MASS_STORAGE, KAL_TRUE, g_USB_Mass_Buffer);
#else
/* Notify UEM*/
USB_Send_Msg(USB_SEND_MSG_PLUG_IN, 0, KAL_TRUE);
#endif
}
/* MS mode */
if ((INT_USBBoot() == KAL_TRUE) && (g_UsbMode.cable_type!=USB_MODE_CABLE_PLUGOUT)
&&((g_UsbMode.mode_param&USB_MODE_BMT_READ_DONE)!=0)
&&(gUsbDevice.usb_comport_boot == KAL_FALSE))
{
/* init in mass storage mode */
USB_Init_Ms(g_UsbMS.b_ms_first_plugin);/* initial as true */
g_UsbMS.b_ms_first_plugin = KAL_FALSE;
}
if((g_UsbMode.cable_type==USB_MODE_CABLE_PLUGOUT) && (g_UsbMode.previous_cable_type != USB_MODE_CABLE_PLUGOUT))
{
USB_Release_Type(KAL_TRUE, KAL_TRUE);
}
#endif
}
void OTG_Mode_Selection(void)
{
#ifndef __OTG_ENABLE__
EXT_ASSERT(0, 0, 0, 0);
#endif
#ifdef __OTG_ENABLE__
if (INT_BootMode() == MTK_FACTORY_MODE)
{
if(((g_UsbMode.mode_param&USB_MODE_NVRAM_READ_DONE)!=0)
&&((g_UsbMode.mode_param&USB_MODE_FT_START_DONE)!=0))
{
/* enable USB power */
if(g_UsbMode.b_usb_pdnmode==KAL_TRUE)
{
g_UsbMode.b_usb_pdnmode = KAL_FALSE;
USB_PDNmode(KAL_FALSE);
OTG_Init(OTG_Host_Stop_Hdlr);
}
if(OTG_Get_Plug_Type()==OTG_PLUG_B)
{
OTG_B_Set_Session_Valid(KAL_TRUE);
}
}
return;
}
if ((INT_USBBoot() == KAL_FALSE) && (g_UsbMode.cable_type!=USB_MODE_CABLE_PLUGOUT)
&&((g_UsbMode.mode_param&USB_MODE_NVRAM_READ_DONE)!=0) && (g_UsbMode.b_start_srp==KAL_FALSE))
{
/* enable USB power */
if(g_UsbMode.b_usb_pdnmode==KAL_TRUE)
{
g_UsbMode.b_usb_pdnmode = KAL_FALSE;
USB_PDNmode(KAL_FALSE);
OTG_Init(OTG_Host_Stop_Hdlr);
}
if(OTG_Get_Plug_Type()==OTG_PLUG_B)
{
OTG_B_Set_Session_Valid(KAL_TRUE);
}
}
if ((INT_USBBoot() == KAL_TRUE) && (g_UsbMode.cable_type!=USB_MODE_CABLE_PLUGOUT)
&&((g_UsbMode.mode_param&USB_MODE_BMT_READ_DONE)!=0) )
{
/* enable USB power */
if(g_UsbMode.b_usb_pdnmode==KAL_TRUE)
{
g_UsbMode.b_usb_pdnmode = KAL_FALSE;
USB_PDNmode(KAL_FALSE);
OTG_Init(OTG_Host_Stop_Hdlr);
}
if(OTG_Get_Plug_Type()==OTG_PLUG_B)
OTG_B_Set_Session_Valid(KAL_TRUE);
else
EXT_ASSERT(0, 0, 0, 0);
}
//if((INT_USBBoot() == KAL_FALSE))
if(1)
{
if((g_UsbMode.cable_type==USB_MODE_CABLE_PLUGOUT) && (g_UsbMode.previous_cable_type != USB_MODE_CABLE_PLUGOUT))
{
g_UsbMode.b_start_hnp = KAL_FALSE;
g_UsbMode.b_start_srp = KAL_FALSE;
OTG_Process_Exceptions();
/* power down USB */
if(g_UsbMode.b_usb_pdnmode==KAL_FALSE)
{
g_UsbMode.b_usb_pdnmode = KAL_TRUE;
USB_PDNmode(KAL_TRUE);
}
}
if((g_UsbMode.b_start_srp==KAL_TRUE) && (INT_USBBoot() == KAL_FALSE))
{
if(g_UsbMode.cable_type==USB_MODE_CABLE_B_PLUGIN)
{
g_UsbMode.b_start_srp = KAL_FALSE;
}
else if(g_UsbMode.cable_type==USB_MODE_CABLE_A_PLUGIN)
{
g_UsbMode.b_start_srp = KAL_FALSE;
/* In case original B plug is plug in and during SRP procedure
then A plug is inserted at this time */
OTG_Process_Exceptions();
}
}
}
#endif
}
/************************************************************
configure mode functions
*************************************************************/
/* The enable parameter decides whether to turn on D+ at this time */
void USB_Config_Type(USB_DEVICE_TYPE type, kal_bool b_enable, kal_uint32 *parameter)
{
gUsbDevice.usb_config_result = KAL_TRUE;
/* avoid UEM send to request, the second one will be no use*/
if (((type == USB_CDC_ACM)||(type == USB_CDC_ACM_IRDBG)) && (gUsbDevice.device_type != USB_CDC_ACM))
{
#ifdef __DSPIRDBG__
if(type == USB_CDC_ACM_IRDBG)
{
g_UsbACM.acm_owner = USB_ACM_OWNER_DSP;
USB_DSPIRDBG_Init();
#if defined(MT6225)
IRDBG_Drv_Activate_ISR();
#endif
}
else
{
g_UsbACM.acm_owner = USB_ACM_OWNER_UART;
}
#endif /* __DSPIRDBG__ */
/* Add for USB in MS mode but user still choose USB as com port at Engineering mode */
if((gUsbDevice.usb_comport_boot == KAL_TRUE)&&(INT_USBBoot() == KAL_TRUE)&&(g_UsbMS.b_ms_first_plugin == KAL_TRUE))
{
USB_Get_Serial_Value();
g_UsbMS.b_ms_first_plugin = KAL_FALSE;
}
/* initailize CDC_ACM */
USB_Register_CreateFunc("ACM DATA", USB_Acm_DataIf_Create,USB_Acm_DataIf_Reset);
USB_Register_CreateFunc("ACM COMMU.", USB_Acm_CommIf_Create,USB_Acm_CommIf_Reset);
USB_Register_Device_Code(USB_ACM_DEVICE_CODE, USB_ACM_SUBCLASS_CODE,
USB_ACM_PROTOCOL_CODE, g_UsbACM.acm_param->desc_product);
USB_Init(USB_CDC_ACM, b_enable);
}
else if (type == USB_MASS_STORAGE)
{
#ifdef __USB_IN_NORMAL_MODE__
if(kal_if_hisr()==KAL_FALSE)
{
USB_Init_Normal_Mode_Ms(parameter, b_enable);
/* initailize IMAGE class */
// USB_Register_CreateFunc("IMAGE", USB_Image_If_Create, USB_Image_If_Reset);
// USB_Register_Device_Code(USB_IMAGE_DEVICE_CODE, USB_IMAGE_SUBCLASS_CODE,
// USB_IMAGE_PROTOCOL_CODE, g_USBImage.image_param->desc_product);
/* get 4-byte alignment image buffer and xml buffer */
// g_USBImage.image_buffer = (USB_IMAGE_BUFFER *)parameter;
// g_USBImage.dps_request_tx_data = (kal_uint8 *)g_USBImage.image_buffer + USB_IMAGE_MAX_BUFFERSIZE;
// g_USBImage.dps_response_tx_data = (kal_uint8 *)g_USBImage.dps_request_tx_data + USB_IMAGE_MAX_XMLBUFFERSIZE;
// g_USBImage.dps_request_rx_data = (kal_uint8 *)g_USBImage.dps_response_tx_data + USB_IMAGE_MAX_XMLBUFFERSIZE;
// g_USBImage.dps_response_rx_data = (kal_uint8 *)g_USBImage.dps_request_rx_data + USB_IMAGE_MAX_XMLBUFFERSIZE;
// USB_Init(USB_IMAGE, b_enable);
}
else
{
#ifdef __OTG_ENABLE__
OTG_Hdlr_Send_Msg(OTG_HDLR_TASK_INIT_NOMAL_MS, parameter, b_enable);
#else
EXT_ASSERT(0, 0, 0, 0);
#endif
}
#endif
}
#ifdef WEBCAM_SUPPORT
else if ((type == USB_VIDEO) && (gUsbDevice.device_type != USB_VIDEO))
{
USB_Register_CreateFunc("USBVIDEO VC", USBVideo_VC_If_Create,USBVideo_VC_If_Reset);
USB_Register_CreateFunc("USBVIDEO VS", USBVideo_VS_If_Create,USBVideo_VS_If_Reset);
USB_Register_Device_Code(USBVIDEO_DEVICE_CODE, USBVIDEO_SUBCLASS_CODE,
USBVIDEO_PROTOCOL_CODE, g_USBVideo.custom_param->desc_product);
USB_Init(USB_VIDEO, b_enable);
}
#endif /* WEBCAM_SUPPORT */
else if (type == USB_STOP_MS)
{
#ifdef __NVRAM_IN_USB_MS__
/* This can not be executed in HISR*/
if(kal_if_hisr()== KAL_TRUE)
EXT_ASSERT(0, 0, 0, 0);
if(gUsbDevice.usb_comport_boot == KAL_FALSE)
{
/* Prevent MS mode still communicate with PC before handset power down */
gUsbDevice.device_type = USB_UNKOWN;
USB_PDNmode(KAL_TRUE); /* power down USB, disable D+ pull high */
USB_Free_DMA_Channel(g_UsbMS.txpipe->byEP);
USB_Release_Ms_Status();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -