331 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			331 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| 
 | ||
| //#NT#2010/07/29#Lily Kao -begin
 | ||
| 
 | ||
| /**
 | ||
|     Copyright   Novatek Microelectronics Corp. 2005.  All rights reserved.
 | ||
| 
 | ||
|     @file       AppInitUSB.c
 | ||
|     @ingroup    mIPRJAPCfg
 | ||
| 
 | ||
|     @brief      Appication initialization for USB mode
 | ||
|                 Get memory and set parameters for USB mode
 | ||
| 
 | ||
|     @note       Nothing.
 | ||
| 
 | ||
|     @date       2010/07/29
 | ||
| */
 | ||
| 
 | ||
| /** \addtogroup mIPRJAPCfg */
 | ||
| //@{
 | ||
| 
 | ||
| #include "AppControl/AppControl.h"
 | ||
| #include "PrjCfg.h"
 | ||
| #include "PrjInc.h"
 | ||
| #include "UIApp/AppLib.h"
 | ||
| #include "DxType.h"
 | ||
| #include "GxStrg.h"
 | ||
| #include "FileSysTsk.h"
 | ||
| #include "DxApi.h"
 | ||
| #include "DxStorage.h"
 | ||
| #include "UIAppUsbDisk.h"
 | ||
| #include <kwrap/debug.h>
 | ||
| 
 | ||
| #if (SDHOTPLUG_FUNCTION == ENABLE)
 | ||
| #include "UIApp/Photo/UIStorageCheck.h"
 | ||
| static BOOL m_bIsMsdcOpened = FALSE;
 | ||
| #endif
 | ||
| 
 | ||
| static DX_HANDLE pLastStrgDev = 0;
 | ||
| static UINT32 msdcbuf_pa = 0, msdcbuf_va = 0, msdcbuf_size = 0;
 | ||
| 
 | ||
| #if (LINUX_MSDC == ENABLE)
 | ||
| static USBIPC_MSDC_INFO gmsdc_info = {
 | ||
| 		.luns             = 1,
 | ||
| 		.id_vendor        = USB_VID,
 | ||
| 		.id_product   	  = USB_PID_MSDC,
 | ||
| 		.manufacturer 	  = USB_VENDER_STRING, 0x00,
 | ||
| 		.product          = USB_PRODUCT_STRING, 0x00,
 | ||
| 		.serial           = USB_SERIAL_NUM_STRING, 0x00,
 | ||
| };
 | ||
| #endif
 | ||
| 
 | ||
| extern void USBMakerInit_SerialNumber(void);
 | ||
| 
 | ||
| extern BOOL DrvCARD_DetStrgCard(void);
 | ||
| extern BOOL DrvCARD_DetStrgCardWP(void);
 | ||
| 
 | ||
| _ALIGNED(4) const static UINT8 gMSDCManuStrDesc[] = {
 | ||
| 	USB_VENDER_DESC_STRING_LEN * 2 + 2, // size of String Descriptor = 6 bytes
 | ||
| 	0x03,                       // 03: String Descriptor type
 | ||
| 	USB_VENDER_DESC_STRING
 | ||
| };
 | ||
| 
 | ||
| _ALIGNED(4) const static UINT8 gMSDCProdStrDesc[] = {
 | ||
| 	USB_PRODUCT_DESC_STRING_LEN * 2 + 2, // size of String Descriptor = 6 bytes
 | ||
| 	0x03,                       // 03: String Descriptor type
 | ||
| 	USB_PRODUCT_DESC_STRING
 | ||
| };
 | ||
| _ALIGNED(16) UINT8 gMSDCInquiryData[36] = {
 | ||
| 	0x00, 0x80, 0x05, 0x02, 0x20, 0x00, 0x00, 0x00,
 | ||
| 	//Vendor identification,
 | ||
| 	USB_VENDER_STRING,/*'\0',*/
 | ||
| 	USB_PRODUCT_STRING, '\0',
 | ||
| 	USB_PRODUCT_REVISION
 | ||
| };
 | ||
| 
 | ||
| void USBMakerInit_UMSD(USB_MSDC_INFO *pUSBMSDCInfo)
 | ||
| {
 | ||
| 	pUSBMSDCInfo->pManuStringDesc = (USB_STRING_DESC *)gMSDCManuStrDesc;
 | ||
| 	pUSBMSDCInfo->pProdStringDesc = (USB_STRING_DESC *)gMSDCProdStrDesc;
 | ||
| 
 | ||
| 	//USBMakerInit_SerialNumber();
 | ||
| 	pUSBMSDCInfo->pSerialStringDesc = NULL;
 | ||
| 
 | ||
| 	pUSBMSDCInfo->VID = USB_VID;
 | ||
| 	pUSBMSDCInfo->PID = USB_PID_MSDC;
 | ||
| 
 | ||
| 	pUSBMSDCInfo->pInquiryData = (UINT8 *)&gMSDCInquiryData[0];
 | ||
| }
 | ||
| 
 | ||
| /**
 | ||
|   Initialize application for USB MSDC mode
 | ||
| 
 | ||
|   Initialize application for USB MSDC mode.
 | ||
| 
 | ||
|   @param void
 | ||
|   @return void
 | ||
| */
 | ||
| #if (LINUX_MSDC == ENABLE)
 | ||
| ER AppInit_ModeUSBMSDC(void)
 | ||
| {
 | ||
| 	ER retV = E_OK;
 | ||
| 	UINT32 lun = 0;
 | ||
| 	USBIPC_MSDC_INFO *msdc_info = &gmsdc_info;
 | ||
| 
 | ||
| #if (SDHOTPLUG_FUNCTION == ENABLE)
 | ||
| 	if (TRUE == m_bIsMsdcOpened || UIStorageCheck(STORAGE_CHECK_ERROR, NULL) == TRUE) {
 | ||
| 		return NVTEVT_CONSUME;
 | ||
| 	}
 | ||
| 	m_bIsMsdcOpened = TRUE;
 | ||
| #endif
 | ||
| 
 | ||
| #if (FS_MULTI_STRG_FUNC == ENABLE)
 | ||
| 	lun = 2;
 | ||
| #else
 | ||
| 	lun = 1;
 | ||
| #endif
 | ||
| 
 | ||
| 	int_setConfig(INT_CONFIG_ID_USB3_GIC_DESTINATION, CC_CORE_CA53_CORE2);
 | ||
| 
 | ||
| 	//send ipc to trigger Linux open MSDC here
 | ||
| 	msdc_info->luns = lun;
 | ||
| 	usbipc_setconfig(USBIPC_CONFIG_MSDC_INFO, (UINT32)msdc_info, 0);
 | ||
| 	usbipc_send_cmd(USBIPC_CMDID_MSDC, 1, 0);
 | ||
| 
 | ||
| 	return retV;
 | ||
| }
 | ||
| #else
 | ||
| ER AppInit_ModeUSBMSDC(void)
 | ||
| {
 | ||
| 	char *pDxName = NULL;
 | ||
| 	USB_MSDC_INFO       MSDCInfo = {0};
 | ||
| 	DX_HANDLE pStrgDev = 0;
 | ||
| 	MSDC_OBJ *p_msdc = Msdc_getObject(MSDC_ID_USB20);
 | ||
| 	ER retV = E_OK;
 | ||
| #if (SDHOTPLUG_FUNCTION == ENABLE)
 | ||
| 	if (TRUE == m_bIsMsdcOpened || UIStorageCheck(STORAGE_CHECK_ERROR, NULL) == TRUE) {
 | ||
| 		return NVTEVT_CONSUME;
 | ||
| 	}
 | ||
| 	m_bIsMsdcOpened = TRUE;
 | ||
| #endif
 | ||
| 
 | ||
| 	// Get buffer memory for MSDC task, MSDC share the same buffer memory with SIDC,
 | ||
| 	// make sure the buffer memory size is enough for both
 | ||
| 
 | ||
| 	MSDCInfo.uiMsdcBufAddr_va = msdcbuf_va;
 | ||
| 	MSDCInfo.uiMsdcBufAddr_pa = msdcbuf_pa;
 | ||
| 	MSDCInfo.uiMsdcBufSize = MSDC_MIN_BUFFER_SIZE;
 | ||
| 	USBMakerInit_UMSD(&MSDCInfo);
 | ||
| 	//The callback functions for the MSDC Vendor command.
 | ||
| 	//If project doesn't need the MSDC Vendor command, set this callback function as NULL.
 | ||
| 	MSDCInfo.msdc_check_cb = NULL;
 | ||
| 	MSDCInfo.msdc_vendor_cb = NULL;
 | ||
| 	//#NT#2016/12/20#Niven Cho -begin
 | ||
| 	//#NT#MULTI_DRIVE
 | ||
| #if (FS_MULTI_STRG_FUNC == ENABLE)
 | ||
| 	char *pDxName2 = NULL;
 | ||
| 	DX_HANDLE pStrgDev2 = 0;
 | ||
| #endif
 | ||
| 
 | ||
| 	pStrgDev = Dx_GetObject(DX_CLASS_STORAGE_EXT | FS_DX_TYPE_DRIVE_A);
 | ||
| 
 | ||
| #if (FS_SWITCH_STRG_FUNC == ENABLE)
 | ||
| 	UINT32 uiDxState=0;
 | ||
| 	if (Dx_GetState((DX_HANDLE)pStrgDev, STORAGE_STATE_INSERT,&uiDxState)!=DX_OK || uiDxState==FALSE) {
 | ||
| 		pStrgDev = Dx_GetObject(DX_CLASS_STORAGE_EXT|FS_DX_TYPE_DRIVE_B);
 | ||
| 	}
 | ||
| #endif
 | ||
| 
 | ||
| #if (FS_MULTI_STRG_FUNC == ENABLE)
 | ||
| 	pStrgDev = Dx_GetObject(DX_CLASS_STORAGE_EXT | FS_DX_TYPE_DRIVE_B);
 | ||
| #endif
 | ||
| 
 | ||
| 	MSDCInfo.pStrgHandle[0] = (PSTRG_TAB)Dx_Getcaps(pStrgDev, STORAGE_CAPS_HANDLE, 0);
 | ||
| 
 | ||
| 	if (Dx_GetInfo(pStrgDev, DX_INFO_NAME, &pDxName) != DX_OK) {
 | ||
| 		pDxName = NULL;
 | ||
| 	}
 | ||
| 	DBG_DUMP("===>%s\r\n", pDxName);
 | ||
| 
 | ||
| #if (FS_MULTI_STRG_FUNC == ENABLE)
 | ||
| 	MSDCInfo.pStrgHandle[1] = pStrgDev2;
 | ||
| 
 | ||
| 	if (Dx_GetInfo(pStrgDev2, DX_INFO_NAME, &pDxName2) != DX_OK) {
 | ||
| 		pDxName2 = NULL;
 | ||
| 	}
 | ||
| #endif
 | ||
| 
 | ||
| #if (FS_MULTI_STRG_FUNC == ENABLE)
 | ||
| 	MSDCInfo.pStrgHandle[1] = pStrgDev2;
 | ||
| 
 | ||
| 	if (Dx_GetInfo(pStrgDev2, DX_INFO_NAME, &pDxName2) != DX_OK) {
 | ||
| 		pDxName2 = NULL;
 | ||
| 	}
 | ||
| #endif
 | ||
| 
 | ||
| #if (FS_MULTI_STRG_FUNC == ENABLE)
 | ||
| 	MSDCInfo.msdc_storage_detCB[0] = (MSDC_StorageDet_CB)DrvCARD_DetStrgCard;
 | ||
| 	MSDCInfo.msdc_strgLock_detCB[0] = (MSDC_StrgLockDet_CB)DrvCARD_DetStrgCardWP;
 | ||
| 	MSDCInfo.msdc_storage_detCB[1] = NULL;
 | ||
| 	MSDCInfo.msdc_strgLock_detCB[1] = NULL;
 | ||
| 	MSDCInfo.msdc_type[0] = MSDC_STRG;
 | ||
| 	MSDCInfo.msdc_type[1] = MSDC_STRG;
 | ||
| 	MSDCInfo.LUNs = 2;
 | ||
| #else
 | ||
| 	if (pDxName == NULL || strcmp(pDxName, "Storage_EmbMem5") == 0) {
 | ||
| 		MSDCInfo.msdc_storage_detCB[0] = NULL;
 | ||
| 		MSDCInfo.msdc_strgLock_detCB[0] = NULL;
 | ||
| 	} else if (strcmp(pDxName, "Storage_Card1") == 0) {
 | ||
| 		MSDCInfo.msdc_storage_detCB[0] = (MSDC_StorageDet_CB)DrvCARD_DetStrgCard;
 | ||
| 		MSDCInfo.msdc_strgLock_detCB[0] = (MSDC_StrgLockDet_CB)DrvCARD_DetStrgCardWP;
 | ||
| 	}
 | ||
| 	MSDCInfo.msdc_type[0] = MSDC_STRG;
 | ||
| 	MSDCInfo.LUNs = 1;
 | ||
| #endif
 | ||
| 
 | ||
| 	//#NT#2009/08/29#Ben Wang -Begin
 | ||
| 	// Close File System task before running USB MSDC
 | ||
| 	//GxFile_Exit();
 | ||
| 	FileSys_CloseEx('A', FST_TIME_INFINITE);
 | ||
| 	//#NT#2009/08/29#Ben Wang -end
 | ||
| #if (FS_MULTI_STRG_FUNC == ENABLE)
 | ||
| 	FileSys_CloseEx('B', FST_TIME_INFINITE);
 | ||
| #endif
 | ||
| 	//#NT#2016/12/20#Niven Cho -end
 | ||
| #if defined(_CPU2_LINUX_)
 | ||
| 	//#NT#2016/06/07#Niven Cho[102874] -begin
 | ||
| 	//#NT# linux must be closed after filesys closing
 | ||
| 	System_CPU2_Stop();
 | ||
| 	//#NT#2016/06/07#Niven Cho[102874] -end
 | ||
| #endif
 | ||
| #if (defined(_BSP_NA51023_) && _TODO)
 | ||
| 	//set SDIO interrupt direction to CPU1
 | ||
| 	int_setConfig(INT_CONFIG_ID_SDIO_GIC_DESTINATION, CC_CORE_CA53_CORE1);
 | ||
| #endif
 | ||
| 
 | ||
| 	p_msdc->SetConfig(USBMSDC_CONFIG_ID_SELECT_POWER, USBMSDC_POW_BUSPOWER);
 | ||
| 	p_msdc->SetConfig(USBMSDC_CONFIG_ID_RC_DISABLESTALL, FALSE);
 | ||
| 	// auto detect spped
 | ||
| 	//Msdc_SetConfig(USBMSDC_CONFIG_ID_SPEED, U3DEV_SPEED_HS);
 | ||
| 
 | ||
| #if (defined(_BSP_NA51023_) && _TODO)
 | ||
| 	int_setConfig(INT_CONFIG_ID_USB3_GIC_DESTINATION, CC_CORE_CA53_CORE1);
 | ||
| #endif
 | ||
| #if(MSDCVENDOR_NVT==ENABLE)
 | ||
| 	msdcnct_attach(&MSDCInfo);
 | ||
| #endif
 | ||
| 
 | ||
| 	retV = p_msdc->Open(&MSDCInfo);
 | ||
| 	if (retV != E_OK) {
 | ||
| 		DBG_ERR("Error open USB MSDC task:%d\r\n", retV);
 | ||
| 	}
 | ||
| 	return retV;
 | ||
| }
 | ||
| #endif
 | ||
| 
 | ||
| INT32 MSDCExe_OnOpen(VControl *pCtrl, UINT32 paramNum, UINT32 *paramArray)
 | ||
| {
 | ||
| 	UINT32 pa;
 | ||
| 	void *va;
 | ||
| 	HD_RESULT hd_ret;
 | ||
| 	HD_COMMON_MEM_DDR_ID ddr_id = DDR_ID0;
 | ||
| 
 | ||
| 	msdcbuf_size = MSDC_MIN_BUFFER_SIZE;
 | ||
| 	if ((hd_ret = hd_common_mem_alloc("msdcbuf", &pa, (void **)&va, msdcbuf_size, ddr_id)) != HD_OK) {
 | ||
| 		DBG_ERR("hd_common_mem_alloc failed(%d)\r\n", hd_ret);
 | ||
| 		msdcbuf_va = 0;
 | ||
| 		msdcbuf_pa = 0;
 | ||
| 		msdcbuf_size = 0;
 | ||
| 	} else {
 | ||
| 		msdcbuf_va = (UINT32)va;
 | ||
| 		msdcbuf_pa = (UINT32)pa;
 | ||
| 	}
 | ||
| 
 | ||
| 	Ux_DefaultEvent(pCtrl, NVTEVT_EXE_OPEN, paramNum, paramArray);
 | ||
| 
 | ||
| 	pLastStrgDev = GxStrg_GetDevice(0);
 | ||
| 
 | ||
| 	if (pLastStrgDev == 0) {
 | ||
| 		//PowerOn_CB() POWERON_CB_SXOPEN <20>S<EFBFBD><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ұ<EFBFBD>File System
 | ||
| 		DBG_ERR("MSDC: Wait for FS start...\r\n");
 | ||
| 		FileSys_WaitFinish();
 | ||
| 
 | ||
| 		//update
 | ||
| 		pLastStrgDev = GxStrg_GetDevice(0);
 | ||
| 	}
 | ||
| 
 | ||
| 	System_SetState(SYS_STATE_FS, FS_NOT_INIT);
 | ||
| 
 | ||
| 	return (AppInit_ModeUSBMSDC());
 | ||
| }
 | ||
| 
 | ||
| INT32 MSDCExe_OnClose(VControl *pCtrl, UINT32 paramNum, UINT32 *paramArray)
 | ||
| {
 | ||
| 	HD_RESULT hd_ret;
 | ||
| 	MSDC_OBJ *p_msdc = Msdc_getObject(MSDC_ID_USB20);
 | ||
| 
 | ||
| 	if ((hd_ret = hd_common_mem_free(msdcbuf_pa, (void *)msdcbuf_va)) != HD_OK) {
 | ||
| 		DBG_ERR("hd_common_mem_free failed(%d)\r\n", hd_ret);
 | ||
| 	}
 | ||
| 	msdcbuf_pa = 0;
 | ||
| 	msdcbuf_va = 0;
 | ||
| 	msdcbuf_size = 0;
 | ||
| 
 | ||
| #if (SDHOTPLUG_FUNCTION == ENABLE)
 | ||
| 	if (FALSE == m_bIsMsdcOpened) {
 | ||
| 		return NVTEVT_CONSUME;
 | ||
| 	}
 | ||
| 	m_bIsMsdcOpened = FALSE;
 | ||
| #endif
 | ||
| 
 | ||
| #if (LINUX_MSDC == ENABLE)
 | ||
| 	usbipc_send_cmd(USBIPC_CMDID_MSDC, 0, 0);
 | ||
| #else
 | ||
| 	p_msdc->Close();
 | ||
| #endif
 | ||
| 
 | ||
| 
 | ||
| 	Ux_DefaultEvent(pCtrl, NVTEVT_EXE_CLOSE, paramNum, paramArray);
 | ||
| 
 | ||
| 	return NVTEVT_CONSUME;
 | ||
| }
 | ||
| 
 | ||
| EVENT_ENTRY CustomMSDCObjCmdMap[] = {
 | ||
| 	{NVTEVT_EXE_OPEN,               MSDCExe_OnOpen},
 | ||
| 	{NVTEVT_EXE_CLOSE,              MSDCExe_OnClose},
 | ||
| 	{NVTEVT_NULL,                   0},  //End of Command Map
 | ||
| };
 | ||
| 
 | ||
| CREATE_APP(CustomMSDCObj, APP_SETUP)
 | ||
| 
 | 
