⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usb_mode.c

📁 mtk 6225平台的usb程序! 对想了解mtk平台usb的朋友会有帮助!
💻 C
📖 第 1 页 / 共 2 页
字号:
/*****************************************************************************
*  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 + -